Przeglądaj źródła

Merge remote-tracking branch 'origin/saas' into saas

zouxuan 3 lat temu
rodzic
commit
86dbca2a7b

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantAssetsInfoDao.java

@@ -22,4 +22,6 @@ public interface TenantAssetsInfoDao extends BaseMapper<TenantAssetsInfo> {
     int checkDeductAmount(@Param("deductAmount") BigDecimal deductAmount, @Param("tenantId") Integer tenantId);
 
     Integer queryPeopleNum(@Param("courseId") Integer courseId);
+
+    int updateAmount(@Param("tenantId") Integer tenantId, @Param("amount") BigDecimal amount);
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -197,6 +197,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     COUPON_STOCK_WARNING("COUPON_STOCK_WARNING", "优惠券库存预警"),
 
     APP_REDEMPTION_CODE("APP_REDEMPTION_CODE", "兑换码分配量预警"),
+    CLOUD_TEACHER_ORDER_SUCCESS("CLOUD_TEACHER_ORDER_SUCCESS", "云教练激活成功"),
     ;
 
     MessageTypeEnum(String code, String msg) {

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/TenantOrderRecordEnum.java

@@ -3,7 +3,8 @@ package com.ym.mec.biz.dal.enums;
 public enum TenantOrderRecordEnum {
     TENANT_OPEN("TENANT_OPEN","机构开通缴费"),
     TENANT_RENEW("TENANT_RENEW","机构续费"),
-    CLOUD_TEACHER("CLOUD_TEACHER","激活团练宝");
+    CLOUD_TEACHER("CLOUD_TEACHER","激活团练宝"),
+    TENANT_RECHARGE("TENANT_RECHARGE","机构充值");
 
     private String code;
 

+ 3 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
-import com.ym.mec.biz.dal.entity.CloudTeacher;
-import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
-import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
 import com.ym.mec.biz.dal.page.CloudTeacherOrderQueryInfo;
 import com.ym.mec.common.page.PageInfo;
@@ -109,6 +106,8 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
 
     Msg payNotify(Msg msg) throws Exception;
 
+    void payCheck(TenantOrderRecord record);
+
     Boolean payCheck(String orderNo) throws Exception;
 
     PageInfo<CloudTeacherStudent> queryRecord(CloudTeacherOrderQueryInfo cloudTeacherOrderQueryInfo);

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantAssetsInfoService.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.TenantAssetsInfo;
 import com.ym.mec.biz.dal.entity.VipGroup;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -19,5 +20,6 @@ public interface TenantAssetsInfoService extends IService<TenantAssetsInfo> {
 
     void deductAmount(List<CourseSchedule> dto);
 
+    int updateAmount(int tenantId, BigDecimal amount);
 }
 

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantInfoService.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.vo.TenantInfoInfoPageVo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.thirdparty.yqpay.Msg;
 
+import java.math.BigDecimal;
 import java.util.Map;
 
 public interface TenantInfoService extends IService<TenantInfo> {
@@ -29,4 +30,7 @@ public interface TenantInfoService extends IService<TenantInfo> {
 
     Msg orderNotify(Msg msg);
 
+    Map<String, Object> recharge(Integer tenantId, BigDecimal amount) throws Exception;
+
+    Boolean rechargeCheck(String orderNo) throws Exception;
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantOrderRecordService.java

@@ -23,5 +23,6 @@ public interface TenantOrderRecordService extends IService<TenantOrderRecord> {
 
     void checkTenantOrder();
 
+    void rechargeCheck(TenantOrderRecord record);
 }
 

+ 73 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -3,11 +3,13 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.mysql.cj.protocol.MessageSender;
 import com.ym.mec.biz.dal.dao.CloudTeacherDao;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.entity.*;
+import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.enums.TenantOrderRecordEnum;
@@ -17,14 +19,20 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import jodd.util.StringUtil;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.joda.time.LocalDateTime;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,12 +41,16 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.PeriodEnum.*;
 
 @Service
 public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTeacherOrder> implements CloudTeacherOrderService {
+    //订单不存在
+    public static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
+
     private static final Logger log = LoggerFactory.getLogger(CloudTeacherOrderServiceImpl.class);
     @Autowired
     private CloudTeacherOrderDao cloudTeacherOrderDao;
@@ -60,6 +72,10 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     public BaseDAO<Long, CloudTeacherOrder> getDAO() {
         return cloudTeacherOrderDao;
     }
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private SysMessageService sysMessageService;
 
     @Override
     public boolean addStudents(CloudTeacherAddQueryInfo cloudTeacherAddQueryInfo) {
@@ -251,6 +267,63 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
         return msg;
     }
 
+    @Override
+    public void payCheck(TenantOrderRecord record) {
+        RBucket<Object> bucket = redissonClient.getBucket("tenant_check_order");
+        if (!bucket.trySet(1, 3L, TimeUnit.SECONDS)) {
+            return;
+        }
+        log.info("checkCloudTeacherOrder  checkTenantOrder>>>>>");
+        checkTransOrderState(record);
+        if (record.getOrderState() == 1) {
+            tenantOrderRecordService.updateById(record);
+            try {
+                this.paySuccess(record); // 充值成功
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            //TODO 发送短信
+            // Map<Integer, String> userPhone = new HashMap<>();
+            // sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.CLOUD_TEACHER_ORDER_SUCCESS, userPhone, null, 0, null, null);
+        }
+        bucket.delete();
+
+    }
+
+    //主动去第三方查询订单状态
+    private void checkTransOrderState(TenantOrderRecord orderRecord) {
+        if (StringUtils.equals(orderRecord.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
+            Map<String, Object> payment;
+            try {
+                payment = Payment.queryPayment(orderRecord.getTransNo());
+                log.info("checkCloudTeacherOrder  payment >>>>> {}", payment);
+                String status = (String) payment.get("status");
+                //判断状态是成功还是失败
+                if (status.equals("succeeded")) {
+                    orderRecord.setOrderState(1);
+                } else if (Objects.nonNull(payment.get("error_code"))) {
+                    //若状态是失败则判断code
+                    if (!PAYMENT_ID_NOT_EXISTS.equals(payment.get("error_code"))) {
+                        //不等于这个异常都是失败
+                        orderRecord.setOrderState(2);
+                    } else {
+                        long orderTime = orderRecord.getCreatedTime().getTime();//订单创建时间
+                        long nowTime = new Date().getTime();
+                        //丢弃5分钟之前的订单 300000 = 5 * 60秒 * 1000
+                        long exTime = 300000L;
+                        if (nowTime - orderTime > exTime) {
+                            orderRecord.setOrderState(2);
+                        }
+                    }
+                }
+                log.info("checkCloudTeacherOrder  payment >>>>> {}", payment);
+                log.info("checkCloudTeacherOrder  orderRecord >>>>> {}", JSON.toJSONString(orderRecord));
+            } catch (Exception e) {
+                log.error("checkCloudTeacherOrder  payment error>>>>> {}", JSON.toJSONString(orderRecord));
+            }
+        }
+    }
+
     private void paySuccess(TenantOrderRecord record) throws Exception {
         log.info("tenant orderNotify update order status start" + record.getId().toString());
         if (record.getId() == null) {
@@ -296,11 +369,6 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 
     public Boolean payCheck(String orderNo) throws Exception {
         TenantOrderRecord record = tenantOrderRecordService.getOne(new QueryWrapper<TenantOrderRecord>().eq("order_no_", orderNo));
-        Map<String, Object> payment = Payment.queryPayment(record.getTransNo());
-        if ("succeeded".equals(payment.get("status")) ) {
-            this.paySuccess(record);
-            return true;
-        }
         return record.getOrderState() == 1;
     }
 

+ 78 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -6,10 +6,7 @@ import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.TenantOrderRecord;
 import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
-import com.ym.mec.biz.service.OrderPayOpsService;
-import com.ym.mec.biz.service.StudentPaymentOrderService;
-import com.ym.mec.biz.service.TenantOrderRecordService;
-import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
@@ -50,6 +47,8 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
     private TenantOrderRecordService tenantOrderRecordService;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private CloudTeacherOrderService cloudTeacherOrderService;
 
     @Override
     public Map<String, Object> executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
@@ -74,6 +73,38 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
                 );
                 //主动延迟检查订单
                 delayCheckTenant();
+            } else if (platform.equals("cloudTeacherOrder")) {
+                // 云教练支付
+                TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
+                                                                                              .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
+                if (tenantOrderRecord.getOrderState() == 1) {
+                    return null;
+                }
+                payment = checkOrderAndGetParam(payParam,
+                                                tenantOrderRecord,
+                                                TenantOrderRecord::getEnumOrderState,
+                                                TenantOrderRecord::getCreatedTime,
+                                                tenantOrderRecord::setTransNo,
+                                                tenantOrderRecordService::updateById
+                );
+                //主动延迟检查订单
+                delayCheckCloudTeacherOrder(tenantOrderRecord);
+            } else if (platform.equals("tenantRecharge")) {
+                // 机构充值
+                TenantOrderRecord tenantOrderRecord = tenantOrderRecordService.getOne(new WrapperUtil<TenantOrderRecord>()
+                                                                                              .hasEq("order_no_", payParam.getOrderNo()).queryWrapper());
+                if (tenantOrderRecord.getOrderState() == 1) {
+                    return null;
+                }
+                payment = checkOrderAndGetParam(payParam,
+                                                tenantOrderRecord,
+                                                TenantOrderRecord::getEnumOrderState,
+                                                TenantOrderRecord::getCreatedTime,
+                                                tenantOrderRecord::setTransNo,
+                                                tenantOrderRecordService::updateById
+                );
+                //主动延迟检查订单
+                delayCheckTenantRecharge(tenantOrderRecord);
             } else if (platform.equals("teacher")) {
                 TenantPaymentOrder tenantPaymentOrder = tenantPaymentOrderService.queryByOrderNo(payParam.getOrderNo());
                 payment = checkOrderAndGetParam(payParam,
@@ -231,6 +262,49 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
         });
     }
 
+    private void delayCheckCloudTeacherOrder(TenantOrderRecord record) {
+        RBucket<Object> bucket = redissonClient.getBucket("delay_check_tenant");
+        if (!bucket.trySet(1, 15L, TimeUnit.SECONDS)) {
+            return;
+        }
+        //异步
+        CompletableFuture.runAsync(() -> {
+            //检查5次
+            for (int i = 0; i <= 5; i++) {
+                try {
+                    Thread.sleep(3000);//每3秒触发一次
+                    cloudTeacherOrderService.payCheck(record);
+                    log.info("delayCheckCloudTeacherOrder >>>>>  start {}", i);
+                } catch (Exception e) {
+                    log.info("delayCheckCloudTeacherOrder exception  ", e);
+                    e.printStackTrace();
+                }
+            }
+            bucket.delete();
+        });
+    }
+
+    private void delayCheckTenantRecharge(TenantOrderRecord record) {
+        RBucket<Object> bucket = redissonClient.getBucket("delay_check_tenant");
+        if (!bucket.trySet(1, 15L, TimeUnit.SECONDS)) {
+            return;
+        }
+        //异步
+        CompletableFuture.runAsync(() -> {
+            //检查5次
+            for (int i = 0; i <= 5; i++) {
+                try {
+                    Thread.sleep(3000);//每3秒触发一次
+                    tenantOrderRecordService.rechargeCheck(record);
+                    log.info("delayCheckTenant >>>>>  start {}", i);
+                } catch (InterruptedException e) {
+                    return;
+                }
+            }
+            bucket.delete();
+        });
+    }
+
     static class PaymentParam {
         private BigDecimal amount;
         private String orderNo;

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -169,6 +169,11 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
             sysCouponService.stockWarning(sysCoupon.getId(), sysCoupon.getName());
             updateParam.put("warningStatus", 1);
         }
+
+        //有的优惠券是无限库存模式,所以不需要校验库存 checkStock有值则需要校验
+        if (sysCoupon.getStockCount() > 0) {
+            updateParam.put("checkStock", 1);
+        }
         //扣减库存操作
         if (sysCouponDao.updateExchange(updateParam) != 1) {
             throw new BizException("优惠券库存不足!");

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -110,6 +111,7 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon> im
             if (sysCoupon.getStockCount() == -1) {
                 sysCoupon.setWarningStockNum(-1);
             }
+            sysCoupon.setTenantId(TenantContextHolder.getTenantId());
             sysCouponDao.update(sysCoupon);
         }
     }
@@ -133,6 +135,7 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon> im
         sysCoupon.setStatus(0);
         sysCoupon.setConsumeNum(0);
         sysCoupon.setWarningStatus(0);
+        sysCoupon.setTenantId(TenantContextHolder.getTenantId());
         if (Objects.isNull(sysCoupon.getType())) {
             throw new BizException("请指定优惠券类型");
         }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantAssetsInfoServiceImpl.java

@@ -219,5 +219,9 @@ public class TenantAssetsInfoServiceImpl extends ServiceImpl<TenantAssetsInfoDao
         return DateUtils.parseDate(s, DateUtils.DATE_WEB_FORMAT);
     }
 
+    @Override
+    public int updateAmount(int tenantId, BigDecimal amount) {
+        return baseMapper.updateAmount(tenantId, amount);
+    }
 }
 

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantInfoServiceImpl.java

@@ -24,6 +24,7 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
 import com.ym.mec.common.page.WrapperUtil;
 import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.yqpay.DateUtils;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import org.apache.commons.collections.CollectionUtils;
@@ -596,4 +597,52 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoDao, TenantInfo
         tenantProductInfoService.updateById(productInfo);
     }
 
+    @Override
+    public Map<String, Object> recharge(Integer tenantId, BigDecimal amount) throws Exception {
+        log.error("机构 " + tenantId.toString() + "充值");
+        TenantInfo tenantInfo = Optional.ofNullable(tenantId)
+                                        .map(baseMapper::selectById)
+                                        .orElseThrow(() -> new BizException("充值时,未查询到机构信息!"));
+        String key = "Tenant_Pay:" + tenantId;
+        RBucket<Object> bucket = redissonClient.getBucket(key);
+        //原子操作 抢锁成功为true
+        if (!bucket.trySet(tenantId, 10, TimeUnit.SECONDS)) {
+            throw new BizException("正在缴费中请稍后!");
+        }
+        //生成订单编号
+        String orderNo = idGenerator.generatorId("payment") + "";
+        TenantOrderRecordEnum tenantEnum = TenantOrderRecordEnum.TENANT_RECHARGE;
+        Map<String, Object> result;
+        int orderState = 0;
+        //消费大于0元则拉起支付
+        if (amount.compareTo(BigDecimal.ZERO) > 0) {
+            result = payService.getPayMap(
+                    amount,
+                    BigDecimal.ZERO,
+                    orderNo,
+                    null,
+                    null,
+                    tenantEnum.getMsg(),
+                    tenantEnum.getMsg(),
+                    1,//临时写死
+                    tenantEnum.getCode()
+            );
+        } else {
+            return null;
+        }
+        createOrderRecord(tenantId, amount, orderNo, tenantEnum, orderState);
+        log.info("tenant pay >>>>> {} ", result);
+        return result;
+    }
+
+    @Override
+    public Boolean rechargeCheck(String orderNo) throws Exception {
+        TenantOrderRecord record = tenantOrderRecordService.getOne(new QueryWrapper<TenantOrderRecord>().eq("order_no_", orderNo));
+        if (record.getId() == null) {
+            throw new Exception("订单未找到");
+        }
+        return record.getOrderState() == 1;
+    }
+
+
 }

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantOrderRecordServiceImpl.java

@@ -47,6 +47,8 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
     private TenantInfoService tenantInfoService;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private TenantAssetsInfoService assetsInfoService;
 
     //订单不存在
     public static final String PAYMENT_ID_NOT_EXISTS = "payment_id_not_exists";
@@ -231,5 +233,33 @@ public class TenantOrderRecordServiceImpl extends ServiceImpl<TenantOrderRecordD
         tenantProductInfoService.updateById(productInfo);
     }
 
+    private void rechargeSuccess(TenantOrderRecord record) throws Exception {
+        // 更新 tenantAssetsInfo
+        int ret = assetsInfoService.updateAmount(record.getTenantId(), record.getExpectAmount());
+        if (ret != 1) {
+            throw new Exception("更新支付失败");
+        }
+    }
+
+    @Override
+    public void rechargeCheck(TenantOrderRecord record) {
+        RBucket<Object> bucket = redissonClient.getBucket("tenant_check_order");
+        if (!bucket.trySet(1, 3L, TimeUnit.SECONDS)) {
+            return;
+        }
+        log.info("checkCloudTeacherOrder  checkTenantOrder>>>>>");
+        checkTransOrderState(record);
+        if (record.getOrderState() == 1) {
+            baseMapper.updateById(record);
+            try {
+                this.rechargeSuccess(record); // 充值成功
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            // 发送短信
+
+        }
+        bucket.delete();
+    }
 }
 

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -111,8 +111,10 @@
     <update id="updateExchange" parameterType="map">
         UPDATE sys_coupon
         <set>
-            stock_count_ = stock_count_ - #{param.exchangeNum},
             consume_num_ =consume_num_ + #{param.exchangeNum},
+            <if test="param.checkStock != null">
+                stock_count_ = stock_count_ - #{param.exchangeNum},
+            </if>
             <if test="param.warningStatus != null">
                 warning_status_ = #{param.warningStatus},
             </if>
@@ -120,7 +122,9 @@
         </set>
         WHERE id_ = #{param.id}
         and tenant_id_ = #{param.tenantId}
-        and stock_count_ >= #{param.exchangeNum}
+        <if test="param.checkStock != null">
+           and stock_count_ >= #{param.exchangeNum}
+        </if>
     </update>
 
 	<!-- 根据主键删除一条记录 -->

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/TenantAssetsInfoMapper.xml

@@ -37,6 +37,10 @@
         where tenant_id_ = #{tenantId}
           and balance_  <![CDATA[ >= ]]> #{deductAmount}
     </update>
+    
+    <update id="updateAmount">
+        update tenant_assets_info set balance_ = balance_ + #{amount} where tenant_id_ = #{tenantId}
+    </update>
 
     <select id="queryPeopleNum" parameterType="integer" resultType="integer">
         select c.student_num_ +1

+ 29 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TenantInfoController.java

@@ -1,8 +1,14 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.TenantInfoDto;
+import com.ym.mec.biz.dal.entity.CloudTeacherStudent;
 import com.ym.mec.biz.service.TenantInfoService;
 import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.yqpay.Msg;
 import com.ym.mec.util.validator.ValidationKit;
 import io.swagger.annotations.*;
@@ -12,6 +18,8 @@ import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -26,6 +34,9 @@ public class TenantInfoController extends BaseController {
     @Autowired
     private TenantInfoService tenantInfoService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
     @ApiOperation("添加机构信息")
     @PostMapping(value = "/add")
     @PreAuthorize("@pcs.hasPermissions('tenantInfo/add')")
@@ -96,4 +107,22 @@ public class TenantInfoController extends BaseController {
         return tenantInfoService.orderNotify(msg);
     }
 
+    @ApiOperation(value = "机构充值")
+    @GetMapping("/recharge/{amount}")
+    // @PreAuthorize("@pcs.hasPermissions('tenantInfo/recharge')")
+    public HttpResponseResult<Map<String, Object>> recharge(
+            @ApiParam(value = "充值金额", required = true) @PathVariable("amount") Double amount
+    ) throws Exception {
+        Integer tenantId = TenantContextHolder.getTenantId();
+        return succeed(tenantInfoService.recharge(tenantId, new BigDecimal(amount)));
+    }
+
+    @ApiOperation(value = "轮询查询订单状态")
+    @GetMapping("/rechargeCheck/{orderNo}")
+    // @PreAuthorize("@pcs.hasPermissions('tenantInfo/payCheck')")
+    public HttpResponseResult<Boolean> rechargeCheck(
+            @ApiParam(value = "订单号", required = true) @PathVariable("orderNo") String orderNo
+    ) throws Exception {
+        return succeed(tenantInfoService.rechargeCheck(orderNo));
+    }
 }