ソースを参照

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

zouxuan 2 年 前
コミット
c24cb027c1
42 ファイル変更701 行追加162 行削除
  1. 2 2
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  2. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponIssueRecordDao.java
  3. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  4. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java
  5. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponQueryInfo.java
  7. 8 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  8. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponIssueRecordService.java
  9. 107 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  10. 3 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponIssueRecordServiceImpl.java
  11. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java
  12. 16 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  13. 6 0
      mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml
  14. 3 0
      mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml
  15. 9 2
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  16. 10 1
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  17. 13 1
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  18. 11 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java
  19. 6 5
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  20. 0 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  21. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java
  22. 1 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml
  23. 6 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  24. 10 4
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  25. 12 12
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  26. 2 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  27. 17 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java
  28. 12 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java
  29. 46 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/StockOperateModel.java
  30. 1 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  31. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  32. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  33. 136 50
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  34. 66 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  35. 5 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  36. 4 1
      mec-mall/mall-portal/src/main/resources/bootstrap-pre.yml
  37. 4 1
      mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml
  38. 1 1
      mec-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  39. 56 0
      mec-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml
  40. 6 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java
  41. 45 57
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  42. 1 0
      pom.xml

+ 2 - 2
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -245,10 +245,10 @@
         <where>
             su.del_flag_ = 0
             <if test="createStartDate != null and createStartDate != ''">
-                and #{createStartDate} &lt;= e.create_time_
+                and #{createStartDate} &lt;= e.update_time_
             </if>
             <if test="createEndDate != null and createEndDate != ''">
-                and #{createEndDate} &gt; e.create_time_
+                and #{createEndDate} &gt; e.update_time_
             </if>
         </where>
     </select>

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponIssueRecordDao.java

@@ -37,6 +37,7 @@ public interface SysCouponIssueRecordDao extends BaseMapper<SysCouponIssueRecord
      */
     void opsConsume(@Param("id") Integer id, @Param("consumeNum") Integer consumeNum);
 
-    List<SysCoupon> queryUserCanGetCoupon(@Param("userId") Integer userId,@Param("tenantId") Integer tenantId);
+    List<SysCoupon> queryUserCanGetCoupon(@Param("userId") Integer userId, @Param("tenantId") Integer tenantId, @Param(
+            "useSystem") String useSystem);
 }
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -91,6 +91,17 @@ public class SysCoupon extends BaseEntity implements Serializable{
 	@ApiModelProperty("领取优惠券条件JSON: {organId:分部id(逗号隔开)}")
 	private String useCondition;
 
+	@ApiModelProperty("使用系统 MALL:商城  MEC:管乐迷")
+	private String useSystem;
+
+	public String getUseSystem() {
+		return useSystem;
+	}
+
+	public void setUseSystem(String useSystem) {
+		this.useSystem = useSystem;
+	}
+
 	public String getUseCondition() {
 		return useCondition;
 	}

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java

@@ -37,7 +37,9 @@ public enum CouponDetailTypeEnum {
     //会员开通,团练宝   CLOUD_TEACHER  CLOUD_TEACHER_PLUS
     MEMBER("MEMBER", "云教练"),
     //全类都可以使用
-    FULLCOUPON("FULLCOUPON", "全类券");
+    FULLCOUPON("FULLCOUPON", "全类券"),
+    // 商城券
+    MALLCOUPON("MALLCOUPON", "商城券");
 
     private String code;
 

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author Joburgess
@@ -23,6 +24,29 @@ public class SysCouponCodeQueryInfo extends QueryInfo {
      */
     private Integer issueType;
 
+    // 使用系统 MALL:商城  MEC:管乐迷
+    private String useSystem;
+
+    // 优惠券类型 详情-CouponDetailTypeEnum-枚举类 多个逗号隔开
+    @ApiModelProperty("优惠券类型:OTHER:其他,MUSICAL:乐器 MAINTENANCE 乐保 ACCESSORIES 辅件 TEACHING 教材 PRACTICE 网管课 SINGLE 声部课 MIX 合奏课 VIP:VIP MEMBER:会员开通 FULLCOUPON:全类 MALLCOUPON:商城券")
+    private String typeDetail;
+
+    public String getTypeDetail() {
+        return typeDetail;
+    }
+
+    public void setTypeDetail(String typeDetail) {
+        this.typeDetail = typeDetail;
+    }
+
+    public String getUseSystem() {
+        return useSystem;
+    }
+
+    public void setUseSystem(String useSystem) {
+        this.useSystem = useSystem;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponQueryInfo.java

@@ -16,6 +16,17 @@ public class SysCouponQueryInfo extends QueryInfo {
     @ApiModelProperty("状态:0停用,1启用")
     private Integer status;
 
+    @ApiModelProperty("优惠券类型")
+    private String typeDetail;
+
+    public String getTypeDetail() {
+        return typeDetail;
+    }
+
+    public void setTypeDetail(String typeDetail) {
+        this.typeDetail = typeDetail;
+    }
+
     public CouponTypeEnum getType() {
         return type;
     }

+ 8 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -22,6 +22,7 @@ import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -248,11 +249,17 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     void mallSaveOrderInfo(MallCreateOrderModel model);
 
-    OrderCancelModel cancelOrder(StudentPaymentOrder orderByOrderNo);
+    OrderCancelModel cancelOrder(StudentPaymentOrder orderByOrderNo, String reason);
 
     // 撤销支付
     BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo);
 
     // 查询优惠券优惠券金额
     Map couponAmount(MallCreateOrderModel model);
+
+    // 订单收货状态更新
+    void receive(String orderNo, boolean autoReceive);
+
+    // 查询余额
+    BigDecimal balance(Long userId);
 }

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

@@ -29,6 +29,6 @@ public interface SysCouponIssueRecordService extends IService<SysCouponIssueReco
 
     PageInfo<CouponIssueRecordVo> queryIssueRecord(Map<String, Object> param);
 
-    List<SysCoupon> queryCanBeGetCoupon(Integer userId);
+    List<SysCoupon> queryCanBeGetCoupon(Integer userId, String useSystem);
 }
 

+ 107 - 12
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
@@ -49,6 +48,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
 
 @Service
 public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, StudentPaymentOrder> implements StudentPaymentOrderService {
@@ -1043,6 +1043,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentGoodsSellDao studentGoodsSellDao;
 
     @Override
+    @Transactional
     public Map createOrder(MallCreateOrderModel model) throws Exception {
 
         if(model == null ||model.getUserId() == null) {
@@ -1084,24 +1085,29 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             }
         }
 
+
+        // 余额支付
+        BigDecimal amount =  BigDecimal.ZERO;
+        BigDecimal balance = BigDecimal.ZERO;
+
         if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
             StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(model.getOldOrderNo());
             if (orderByOrderNo == null) {
                 throw new BizException("未找到原订单");
             }
+            amount = orderByOrderNo.getActualAmount();
+            balance = orderByOrderNo.getBalancePaymentAmount();
             // 已有订单,先关单
             orderByOrderNo.setStatus(CLOSE);
+            orderByOrderNo.setMemo("关闭订单");
             studentPaymentOrderService.update(orderByOrderNo);
-            if (orderByOrderNo.getBalancePaymentAmount() != null && orderByOrderNo.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
-                sysUserCashAccountService.updateBalance(orderByOrderNo.getUserId(), orderByOrderNo.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "关闭订单");
-            }
             //退优惠券
             sysCouponCodeService.quit(orderByOrderNo.getCouponCodeId());
         }
 
 
         Date date = new Date();
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),true);
 
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         if (studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -1113,13 +1119,42 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentPaymentOrder.setOrderNo(model.getOrderNo());
         studentPaymentOrder.setCreateTime(date);
         studentPaymentOrder.setUpdateTime(date);
-        studentPaymentOrder.setPaymentChannel("ADAPAY");
+        if (model.isUseBalance()) {
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+        } else {
+            studentPaymentOrder.setPaymentChannel("ADAPAY");
+        }
+        studentPaymentOrder.setVersion(0);
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrder.setTenantId(student.getTenantId());
         studentPaymentOrderService.insert(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion());
+
+        // 余额支付
+        if (model.isUseBalance() && studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) > 0 ) {
+            if (!StringUtils.isEmpty(model.getOldOrderNo())) {
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+            } else {
+                SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(model.getUserId());
+                if (userCashAccount == null) {
+                    throw new BizException("用户账户不存在");
+                }
+                amount = studentPaymentOrder.getActualAmount();
+                if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                    balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                    amount = amount.subtract(balance);
+                    studentPaymentOrder.setActualAmount(amount);
+                    studentPaymentOrder.setBalancePaymentAmount(balance);
+                    sysUserCashAccountService.updateBalance(model.getUserId(), balance.negate(),
+                                                            PlatformCashAccountDetailTypeEnum.PAY_FEE, "商品销售");
+                }
+            }
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
-        studentPaymentOrder.setVersion(0);
         studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
         studentGoodsSell.setOrganId(student.getOrganId());
         studentGoodsSell.setTotalAmount(studentPaymentOrder.getActualAmount());
@@ -1133,12 +1168,24 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentGoodsSell.setTenantId(student.getTenantId());
         studentGoodsSellDao.insert(studentGoodsSell);
 
+
+        if (studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentRouteOrderService.addRouteOrder(model.getOrderNo(), student.getOrganId(), studentPaymentOrder.getBalancePaymentAmount());
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?"0":studentPaymentOrder.getBalancePaymentAmount().toString());
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", model.getOrderNo());
+            return notifyMap;
+        }
+
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
         //  receiver类型
         payMap = payService.getPayMap(
-                studentPaymentOrder.getExpectAmount(),
                 studentPaymentOrder.getActualAmount(),
+                studentPaymentOrder.getBalancePaymentAmount(),
                 model.getOrderNo(),
                 baseApiUrl + "/api-mall-portal/payment/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + model.getOrderNo(),
@@ -1147,6 +1194,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 student.getOrganId(),
                 "mall_buy"
         );
+        payMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?BigDecimal.ZERO:studentPaymentOrder.getBalancePaymentAmount());
         studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
         studentPaymentOrderService.update(studentPaymentOrder);
@@ -1156,6 +1204,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public void mallBuyOrderCallback(StudentPaymentOrder studentPaymentOrder) {
         Date nowDate = new Date();
         //更新订单信息
@@ -1176,6 +1225,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             } catch (Exception e) {
                 logger.error("产品协议生成失败", e);
             }
+            // 完全余额支付 不生成下面的记录
+            if (BigDecimal.ZERO.compareTo(studentPaymentOrder.getActualAmount()) == 0) return;
+
             //插入交易明细
             BigDecimal amount = studentPaymentOrder.getActualAmount();
             SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
@@ -1214,6 +1266,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public void mallSaveOrderInfo(MallCreateOrderModel model) {
 
         StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOrderNo());
@@ -1226,16 +1279,31 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
-    public OrderCancelModel cancelOrder(StudentPaymentOrder order) {
+    @Transactional
+    public OrderCancelModel cancelOrder(StudentPaymentOrder order, String reason) {
         OrderCancelModel model = new OrderCancelModel();
         try {
+            HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(order.getTenantId());
+            if(hfMerchantConfig == null){
+                throw new BizException("机构[{}]汇付商户信息找不到", order.getTenantId());
+            }
+            Map<String, Object> payment = Payment.queryPayment(order.getTransNo(), hfMerchantConfig.getMerKey());
+            LOGGER.info("订单[{}]交易主动查询接口返回:{}", order.getTransNo(), payment);
+
+            model.setPayChannel((String) payment.get("pay_channel"));
+            String status = (String) payment.get("status");
+            if (status.equals("succeeded")) {
+                model.setStatus(true);
+                order.setStatus(SUCCESS);
+            } else if (status.equals("failed") ) {
+                model.setStatus(false);
+                order.setStatus(CLOSE);
+                order.setMemo(reason);
+            }
             TenantContextHolder.setTenantId(order.getTenantId());
-            order.setStatus(CLOSE);
-            order.setMemo("超时未支付关闭");
             callOrderCallBack(order);
             TenantContextHolder.clearTenantId();
             model.setSuccess(true);
-            model.setStatus(false);
         } catch (Exception e) {
             model.setSuccess(false);
             e.printStackTrace();
@@ -1244,6 +1312,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo) {
 
         StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
@@ -1270,4 +1339,30 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         payMap.put("mallStatus",1);
         return payMap;
     }
+
+    @Override
+    @Transactional
+    public void receive(String orderNo, boolean autoReceive) {
+
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (orderByOrderNo == null) {
+            return;
+        }
+        // MANUAL_RECEIVE 手动确认,AUTO_RECEIVE 自动确认
+        if (autoReceive) {
+            orderByOrderNo.setReceiveStatus("AUTO_RECEIVE");
+        } else {
+            orderByOrderNo.setReceiveStatus("MANUAL_RECEIVE");
+        }
+        studentPaymentOrderDao.update(orderByOrderNo);
+    }
+
+    @Override
+    public BigDecimal balance(Long userId) {
+        SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId.intValue());
+        if (userCashAccount == null) {
+            throw new BizException("用户账户不存在");
+        }
+        return userCashAccount.getBalance() == null?BigDecimal.ZERO:userCashAccount.getBalance();
+    }
 }

+ 3 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponIssueRecordServiceImpl.java

@@ -151,10 +151,11 @@ public class SysCouponIssueRecordServiceImpl extends ServiceImpl<SysCouponIssueR
      * 查询可以领取的优惠券
      *
      * @param userId 用户id
+     * @param useSystem
      */
     @Override
-    public List<SysCoupon> queryCanBeGetCoupon(Integer userId) {
-        return baseMapper.queryUserCanGetCoupon(userId,TenantContextHolder.getTenantId());
+    public List<SysCoupon> queryCanBeGetCoupon(Integer userId, String useSystem) {
+        return baseMapper.queryUserCanGetCoupon(userId,TenantContextHolder.getTenantId(),useSystem);
     }
 
     /**

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

@@ -13,6 +13,7 @@ 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.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -141,6 +142,9 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon> im
         if (Objects.isNull(sysCoupon.getType())) {
             throw new BizException("请指定优惠券类型");
         }
+        if (StringUtils.isEmpty(sysCoupon.getUseSystem())) {
+            throw new BizException("请置顶使用系统");
+        }
 
         switch (sysCoupon.getType()) {
             case DISCOUNT:

+ 16 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -1395,6 +1395,14 @@
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(su.organ_id_,#{organId})
             </if>
+            <if test="null != hasMember">
+                <if test="1 == hasMember">
+                    and s.membership_end_time_ &gt; now()
+                </if>
+                <if test="0 == hasMember">
+                    and (s.membership_end_time_ is null or s.membership_end_time_ &lt;= now())
+                </if>
+            </if>
         </where>
         ORDER BY user_id_
         <include refid="global.limit"></include>
@@ -1419,6 +1427,14 @@
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(su.organ_id_,#{organId})
             </if>
+            <if test="null != hasMember">
+                <if test="1 == hasMember">
+                    and s.membership_end_time_ &gt; now()
+                </if>
+                <if test="0 == hasMember">
+                    and (s.membership_end_time_ is null or s.membership_end_time_ &lt;= now())
+                </if>
+            </if>
         </where>
     </select>
     <select id="getUserByPhone" resultType="com.ym.mec.auth.api.entity.SysUser">

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml

@@ -185,6 +185,12 @@
 			<if test="issueType !=null">
                 AND scc.type_ = #{issueType}
             </if>
+			<if test="useSystem != null and useSystem != ''">
+				and sc.use_system_ = #{useSystem}
+			</if>
+			<if test="typeDetail != null and typeDetail != ''">
+				and  find_in_set(sc.type_detail_ , #{typeDetail})
+			</if>
 		</where>
 	</sql>
 

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponIssueRecordMapper.xml

@@ -170,6 +170,9 @@
           AND status_ = 1
           AND tenant_id_ = #{tenantId}
           AND a.`limit_exchange_num_` > IFNULL(b.couponNum, 0)
+        <if test="useSystem != null and useSystem != ''">
+            and a.use_system_ = #{useSystem}
+        </if>
           AND NOW() >= start_date_ AND end_date_ >= NOW()
           AND (
                     stock_count_ > consume_num_

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

@@ -10,6 +10,7 @@
 		<result column="id_" property="id" />
 		<result column="name_" property="name" />
 		<result column="description_" property="description" />
+		<result column="use_system_" property="useSystem" />
 		<result column="status_" property="status" />
         <result column="issuance_type_" jdbcType="INTEGER" property="issuanceType"/>
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -47,13 +48,13 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCoupon" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_coupon (id_,name_,description_,status_,issuance_type_,type_,type_detail_,face_value_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
 		                        effective_start_time_, effective_expire_time_,end_date_,start_date_,stock_count_,consume_num_,warning_stock_num_,
-		                        create_time_,update_time_,tenant_id_,use_condition_)
+		                        create_time_,update_time_,tenant_id_,use_condition_,use_system_)
 		                        VALUES(#{id},#{name},#{description},#{status},#{issuanceType},
 		                               #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		                               #{typeDetail},#{faceValue},#{fullAmount},#{limitExchangeNum},
 		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
-		                               NOW(), NOW(),#{tenantId},#{useCondition})
+		                               NOW(), NOW(),#{tenantId},#{useCondition},#{useSystem})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -109,6 +110,9 @@
 			<if test="issuanceType != null">
 				issuance_type_ = #{issuanceType},
 			</if>
+			<if test="useSystem != null">
+				use_system_ = #{useSystem},
+			</if>
 				update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}
@@ -148,6 +152,9 @@
 			<if test="search != null and search != ''">
 				AND (id_=#{search} OR name_ LIKE CONCAT('%', #{search}, '%'))
 			</if>
+			<if test="typeDetail != null and typeDetail != ''">
+				and #{typeDetail} = type_detail_
+			</if>
 		</where>
 	</sql>
 

+ 10 - 1
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -12,6 +12,7 @@ import com.ym.mec.web.fallback.WebFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -52,7 +53,7 @@ public interface WebFeignService {
 	HttpResponseResult updateOrder(@RequestBody Map map);
 
 	@PostMapping("/api/cancelOrder")
-	HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam("orderNo") String orderNo);
+	HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam("orderNo") String orderNo,@RequestParam("reason") String reason);
 
 
 
@@ -70,4 +71,12 @@ public interface WebFeignService {
 	// 商城订单优惠券金额
 	@PostMapping("/api/couponAmount")
 	HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model);
+
+	// 商城获取 退款数据  只能全额退款
+	@PostMapping("/api/receive")
+	HttpResponseResult receive(@RequestParam("orderNo") String orderNo,@RequestParam("autoReceive") boolean autoReceive);
+
+	// 商城获取 收货状态
+	@PostMapping("/api/balance")
+	HttpResponseResult<BigDecimal> balance(@RequestParam("userId") Long userId);
 }

+ 13 - 1
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Component;
 import com.ym.mec.web.WebFeignService;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
@@ -74,10 +75,11 @@ public class WebFeignServiceFallback implements WebFeignService {
 	}
 
 	@Override
-	public HttpResponseResult<OrderCancelModel> cancelOrder(String orderNo) {
+	public HttpResponseResult<OrderCancelModel> cancelOrder(String orderNo, String reason) {
 		return null;
 	}
 
+
 	@Override
 	public HttpResponseResult<Map> mallSaveOrderInfo(MallCreateOrderModel model) {
 		return null;
@@ -97,4 +99,14 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<Map> couponAmount(MallCreateOrderModel model) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult receive(String orderNo, boolean autoReceive) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<BigDecimal> balance(Long userId) {
+		return null;
+	}
 }

+ 11 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java

@@ -27,6 +27,17 @@ public class MallCreateOrderModel {
 
     private String orderInfo;
 
+    // 使用余额
+    private boolean useBalance;
+
+    public boolean isUseBalance() {
+        return useBalance;
+    }
+
+    public void setUseBalance(boolean useBalance) {
+        this.useBalance = useBalance;
+    }
+
     public String getOrderInfo() {
         return orderInfo;
     }

+ 6 - 5
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -52,11 +52,12 @@ public class OmsOrderController {
     @RequestMapping(value = "/update/close", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult close(@RequestParam("ids") List<Long> ids, @RequestParam String note) {
-        int count = orderService.close(ids, note);
-        if (count > 0) {
-            return CommonResult.success(count);
-        }
-        return CommonResult.failed();
+
+        // int count = orderService.close(ids, note);
+        // if (count > 0) {
+        //     return CommonResult.success(count);
+        // }
+        return CommonResult.failed("当前状态不可关闭");
     }
 
     @ApiOperation("批量删除订单")

+ 0 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java

@@ -52,10 +52,8 @@ public class OpenController {
         try {
             boolean b = lock.tryLock(60, 60, TimeUnit.SECONDS);
             if (b) {
-
                 returnApplyService.setTestReturnApply(id);
                 return CommonResult.success(true);
-
             }
         } catch (InterruptedException e) {
             e.printStackTrace();

+ 2 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java

@@ -32,4 +32,6 @@ public interface UserOrderPaymentMapper {
      * @return
      */
     UserOrderPayment selectByAdapayNo(String paymentNo);
+
+    UserOrderPayment selectByOrderNoAndStatusSuccess(@Param("orderSn") String orderSn);
 }

+ 1 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml

@@ -307,4 +307,5 @@
   <update id="lockStock">
     update pms_sku_stock set lock_stock = lock_stock + #{quantity} where  id = #{productSkuId} and stock &gt;= ( lock_stock + #{quantity})
     </update>
+
 </mapper>

+ 6 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -279,4 +279,10 @@
         <include refid="Base_Column_List" />
         from user_order_payment where adapay_no_ = #{paymentNo} order by id_ desc  limit 1
     </select>
+
+    <select id="selectByOrderNoAndStatusSuccess" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'succeeded' order by id_ desc  limit 1
+    </select>
 </mapper>

+ 10 - 4
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.exception.BizException;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
@@ -45,7 +47,8 @@ public class OmsPortalOrderController {
 
     @Autowired
     private UserOrderPaymentService userOrderPaymentService;
-
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
     @Value("${message.debugMode}")
     private boolean debugMode;
 
@@ -96,8 +99,11 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/teacher/generateOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
-        UmsMember currentMember = memberService.getCurrentMember();
-        orderParam.setTeacherId(currentMember.getId());
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        orderParam.setTeacherId(sysUser.getId().longValue());
         final Map<String, Object>[] result = new Map[]{new HashMap<>()};
         if (StringUtil.isEmpty(orderParam.getOrderNo())) {
             result[0] = portalOrderService.generateOrder(orderParam);
@@ -192,7 +198,7 @@ public class OmsPortalOrderController {
 
         DistributedLock.of(redissonClient)
                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-                               , () -> portalOrderService.confirmReceiveOrder(orderId), 60L, TimeUnit.SECONDS);
+                               , () -> portalOrderService.confirmReceiveOrder(orderId,false), 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 

+ 12 - 12
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -1,13 +1,8 @@
 package com.yonge.cooleshow.portal.controller.open;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
-import com.yonge.cooleshow.mall.common.util.StringUtil;
-import com.yonge.cooleshow.portal.dto.ShareProductVo;
-import com.yonge.cooleshow.portal.dto.ShareProfitParam;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,21 +11,17 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
+import java.util.List;
 
 @RestController
 @RequestMapping("/open")
-@Api(tags = "开放权限接口-分享")
+@Api(tags = "开放权限接口")
 public class OpenShareController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
 
     @Autowired
-    private SysUserFeignService sysUserFeignService;
-
-    @Autowired
     private PmsPortalProductService portalProductService;
 
-
     // @ApiOperation(value = "老师商品分享分润")
     // @PostMapping(value="/productProfit")
     // @ResponseBody
@@ -49,4 +40,13 @@ public class OpenShareController extends BaseController {
     //     }
     //     return CommonResult.failed("分享功能暂未开放");
     // }
+
+    @ApiOperation(value = "同步库存")
+    @PostMapping(value="/updateStock/{stockType}")
+    @ResponseBody
+    public CommonResult<String> updateStock(@RequestBody List<StockOperateModel> model, @PathVariable String stockType) {
+        // 库存操作 stockType  add:添加   reduce:减少  lock:锁定  unlock:解锁
+        portalProductService.reduceStock(model,stockType);
+        return CommonResult.success("");
+    }
 }

+ 2 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.portal.dao;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderItem;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
+import com.yonge.cooleshow.portal.domain.ProductStock;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -38,7 +39,7 @@ public interface PortalOrderDao {
      */
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
-    int releaseProductStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
+    int releaseProductStockLock(@Param("itemList") List<ProductStock> orderItemList);
 
     List<OmsOrder> listByAdapayNo(@Param("alapayNoList") List<String> alapayNoList, @Param("adapayNos") String adapayNos);
 }

+ 17 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.mbg.model.SmsCoupon;
 import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.ProductStock;
 import com.yonge.cooleshow.portal.domain.PromotionProduct;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -32,4 +33,20 @@ public interface PortalProductDao {
      * 改库存
      */
     void updateProductStock(@Param("itemList") List<ProductStock> productStockList);
+
+    /**
+     * 释放sku锁定库存
+     */
+    void unlockSku(@Param("itemList") List<StockOperateModel> model);
+
+    /**
+     * 释放商品锁定库存
+     */
+    void unlockProduct(@Param("itemList") List<ProductStock> productList);
+
+    /**
+     * 扣减sku库存
+     */
+    void reduceSku(@Param("itemList") List<StockOperateModel> model);
+
 }

+ 12 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java

@@ -36,6 +36,18 @@ public class OrderParam {
     @ApiModelProperty("订单号 重复支付传订单号")
     private String orderNo;
 
+
+    @ApiModelProperty("使用余额")
+    private boolean useBalance;
+
+    public boolean isUseBalance() {
+        return useBalance;
+    }
+
+    public void setUseBalance(boolean useBalance) {
+        this.useBalance = useBalance;
+    }
+
     public Long getTeacherId() {
         return teacherId;
     }

+ 46 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/StockOperateModel.java

@@ -0,0 +1,46 @@
+package com.yonge.cooleshow.portal.dto;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-26
+ */
+public class StockOperateModel {
+
+    // 商品id
+    private Long productId;
+
+    // 商品sku id
+    private Long productSkuId;
+
+    // 数量
+    private Integer count;
+
+
+
+    public Long getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public Long getProductSkuId() {
+        return productSkuId;
+    }
+
+    public void setProductSkuId(Long productSkuId) {
+        this.productSkuId = productSkuId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+}

+ 1 - 2
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.portal.service;
 
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
@@ -57,7 +56,7 @@ public interface OmsPortalOrderService {
      * 确认收货
      */
     @Transactional
-    void confirmReceiveOrder(Long orderId);
+    void confirmReceiveOrder(Long orderId, boolean auto);
 
     /**
      * 分页获取用户订单

+ 9 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 
 import java.util.List;
 
@@ -43,4 +44,12 @@ public interface PmsPortalProductService {
      * @param productId 商品id
      */
     ShareProductVo shareProductProfit(SysUser sysUser, Long productId);
+
+    /**
+     * 同步修改商品库存
+     *
+     * @param model
+     * @param stockType
+     */
+    void reduceStock(List<StockOperateModel> model, String stockType);
 }

+ 9 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -40,6 +40,15 @@ public interface UserOrderPaymentService {
      */
     UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
 
+
+    /**
+     * 查询支付成功的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusSuccess(String orderSn);
+
     /**
      * 查询回调支付信息
      */

+ 136 - 50
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -26,6 +26,7 @@ import com.yonge.cooleshow.portal.dao.PortalOrderDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.*;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import com.yonge.cooleshow.portal.service.*;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -131,6 +132,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Override
     public Map<String, Object> generateOrder(OrderParam orderParam) {
+
+        LOG.info("订单生成请求参数:{}",orderParam);
         OmsOrder order = new OmsOrder();
         String orderSn = generateOrderSn();
         if (!StringUtil.isEmpty(orderParam.getOrderNo())) {
@@ -149,10 +152,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
                 userOrderPayment.setAdapayNo(orderSn);
                 userOrderPayment.setId(null);
+                userOrderPayment.setCreateTime(new Date());
                 userOrderPaymentService.saveOrUpdate(userOrderPayment);
 
-                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount(),
-                                           JSON.toJSONString(detail));
+                return feignMecCreateOrder(detail.getCouponId(), oldOrderNo, orderSn, orderParam.getTeacherId() == null?null:orderParam.getTeacherId().intValue()
+                        , detail.getMemberId().intValue(), detail.getTotalAmount(),
+                       JSON.toJSONString(detail),detail.getPayType()!= null && detail.getPayType() == 3);
             } else {
                 throw new BizException("订单信息获取失败");
             }
@@ -196,17 +201,19 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             orderItem.setGiftGrowth(cartPromotionItem.getGrowth());
             orderItem.setPromoterId(cartPromotionItem.getPromoterId());
             orderItem.setPrecisionAmount(BigDecimal.ZERO);
+            orderItem.setIntegrationAmount(new BigDecimal(0));
             orderItemList.add(orderItem);
         }
         //判断购物车中商品是否都有库存
         if (!hasStock(cartPromotionItemList)) {
             Asserts.fail("库存不足,无法下单");
         }
-
+        BigDecimal couponAmount = BigDecimal.ZERO;
         BigDecimal amount = calcTotalAmount(orderItemList);
-        Map data = feignMecCouponAmount(orderParam.getCouponId(), orderParam.getOrderAmount());
-
-        BigDecimal couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
+        if (!StringUtil.isEmpty(orderParam.getCouponId())) {
+            Map data = feignMecCouponAmount(orderParam.getCouponId(), amount);
+            couponAmount = new BigDecimal(MapUtil.get(data, "mallCouponAmount", String.class));
+        }
         if (couponAmount == null) {
             couponAmount = BigDecimal.ZERO;
         }
@@ -230,34 +237,50 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             // if(data != null) {
             //     couponAmount = data.getDiscountedPrices();
             // }
-            if (couponAmount.compareTo(orderParam.getOrderAmount()) > 0) {
-                couponAmount = orderParam.getOrderAmount();
+            if (couponAmount.compareTo(amount) > 0) {
+                couponAmount = amount;
             }
             handleCouponAmount(orderItemList, couponAmount);
         }
+        BigDecimal balanceAmount = BigDecimal.ZERO;
         //判断是否使用积分
-        if (orderParam.getUseIntegration() == null || orderParam.getUseIntegration().equals(0)) {
-            //不使用积分
-            for (OmsOrderItem orderItem : orderItemList) {
-                orderItem.setIntegrationAmount(new BigDecimal(0));
-            }
-        } else {
-            //使用积分
-            BigDecimal totalAmount = calcTotalAmount(orderItemList);
-            BigDecimal integrationAmount = getUseIntegrationAmount(orderParam.getUseIntegration(), totalAmount,
-                                                                   currentMember, orderParam.getCouponId() != null);
-            if (integrationAmount.compareTo(new BigDecimal(0)) == 0) {
-                Asserts.fail("积分不可用");
-            } else {
-                //可用情况下分摊到可用商品中
-                for (OmsOrderItem orderItem : orderItemList) {
-                    BigDecimal perAmount = orderItem.getProductPrice()
-                                                    .divide(totalAmount, 3, RoundingMode.HALF_EVEN)
-                                                    .multiply(integrationAmount);
-                    orderItem.setIntegrationAmount(perAmount);
-                }
-            }
-        }
+        // if (orderParam.isUseBalance()) {
+        //
+        //     // 查询余额
+        //     HttpResponseResult<BigDecimal> balance = webFeignService.balance(orderParam.getUserId());
+        //     if(balance.getStatus()) {
+        //         balanceAmount = balance.getData();
+        //     } else {
+        //         LOG.error("余额查询失败:{}",balance.getMsg());
+        //     }
+        //     if(balanceAmount.compareTo(orderParam.getOrderAmount()) >0) {
+        //         balanceAmount = orderParam.getOrderAmount();
+        //     }
+        //
+        //     //不使用积分
+        //     for (OmsOrderItem orderItem : orderItemList) {
+        //         orderItem.setIntegrationAmount(new BigDecimal(0));
+        //     }
+        // } else {
+        //     for (OmsOrderItem orderItem : orderItemList) {
+        //         orderItem.setIntegrationAmount(new BigDecimal(0));
+        //     }
+        //     //使用积分
+        //     // BigDecimal totalAmount = calcTotalAmount(orderItemList);
+        //     // BigDecimal integrationAmount = getUseIntegrationAmount(orderParam.getUseIntegration(), totalAmount,
+        //     //                                                        currentMember, orderParam.getCouponId() != null);
+        //     // if (integrationAmount.compareTo(new BigDecimal(0)) == 0) {
+        //     //     Asserts.fail("积分不可用");
+        //     // } else {
+        //     //     //可用情况下分摊到可用商品中
+        //     //     for (OmsOrderItem orderItem : orderItemList) {
+        //     //         BigDecimal perAmount = orderItem.getProductPrice()
+        //     //                                         .divide(totalAmount, 3, RoundingMode.HALF_EVEN)
+        //     //                                         .multiply(integrationAmount);
+        //     //         orderItem.setIntegrationAmount(perAmount);
+        //     //     }
+        //     // }
+        // }
         //计算order_item的实付金额
         handleRealAmount(orderItemList);
         //进行sku库存锁定
@@ -267,38 +290,42 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         lockProductStock(cartPromotionItemList);
 
         //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
-        String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining());
+        String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining(","));
         order.setCartIds(cartIds);
         order.setDiscountAmount(new BigDecimal(0));
         order.setTotalAmount(amount);
         order.setFreightAmount(new BigDecimal(0));
         order.setPromotionAmount(calcPromotionAmount(orderItemList));
         order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
-        order.setPlatformType(orderParam.getPlatformType() == null?"STUDENT":orderParam.getPlatformType());
+        order.setPlatformType(StringUtil.isEmpty(orderParam.getPlatformType())?"STUDENT":orderParam.getPlatformType());
         if (StringUtil.isEmpty(orderParam.getCouponId())) {
             order.setCouponAmount(new BigDecimal(0));
         } else {
             order.setCouponId(orderParam.getCouponId());
             order.setCouponAmount(couponAmount);
         }
-        if (orderParam.getUseIntegration() == null) {
+        if (!orderParam.isUseBalance()) {
             order.setIntegration(0);
             order.setIntegrationAmount(new BigDecimal(0));
         } else {
-            order.setIntegration(orderParam.getUseIntegration());
-            order.setIntegrationAmount(calcIntegrationAmount(orderItemList));
+            order.setIntegration(0);
+            order.setIntegrationAmount(balanceAmount);
         }
         LOG.info("payAmount:{},totalAmount:{},couponAmount:{}",order.getTotalAmount().subtract(couponAmount),order.getTotalAmount(),couponAmount);
         if (orderParam.getOrderAmount().compareTo(order.getTotalAmount().subtract(couponAmount)) != 0) {
             throw new BizException("订单金额校验不通过");
         }
-        order.setPayAmount(orderParam.getOrderAmount());
+        order.setPayAmount(orderParam.getOrderAmount().subtract(balanceAmount));
         //转化为订单信息并插入数据库
         order.setMemberId(currentMember.getId());
         order.setCreateTime(new Date());
         order.setMemberUsername(currentMember.getUsername());
-        //支付方式:0->未支付;1->支付宝;2->微信
-        order.setPayType(orderParam.getPayType());
+        //支付方式:0->未支付;1->支付宝;2->微信 3:余额
+        if (orderParam.isUseBalance()) {
+            order.setPayType(3);
+        } else {
+            order.setPayType(orderParam.getPayType());
+        }
         //订单来源:0->PC订单;1->app订单
         order.setSourceType(1);
         //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 -> 未支付
@@ -363,6 +390,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         userOrderPayment.setOrderNo(order.getOrderSn());
         userOrderPayment.setAdapayNo(order.getOrderSn());
         userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+        userOrderPayment.setCreateTime(new Date());
 
         if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
             paySuccess(order.getId(),order.getPayType());
@@ -370,19 +398,44 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             result.put("orderType","success");
             userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
         }
-        userOrderPaymentService.save(userOrderPayment);
+        userOrderPaymentService.saveOrUpdate(userOrderPayment);
 
         // 生成订单
         // 保存商品信息到管乐迷
         OmsOrderDetail detail = detail(order.getOrderSn());
-        data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
+        Map data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
                                        orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(),
-                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail));
+                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail),orderParam.isUseBalance());
+        if ("1".equals(MapUtil.getStr(data, "tradeState"))) {
+            paySuccess(order.getId(),order.getPayType());
+            order.setStatus(1);
+            result.put("orderType","success");
+            userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
+            userOrderPaymentService.saveOrUpdate(userOrderPayment);
+        }
+        // 记录余额支付金额
+        String balanceAmount1 = MapUtil.get(data, "balanceAmount", String.class);
+        BigDecimal bigDecimal = new BigDecimal(balanceAmount1);
+        if (BigDecimal.ZERO.compareTo(bigDecimal) !=0 ) {
+            order.setIntegrationAmount(bigDecimal);
+            order.setPayAmount(order.getPayAmount().subtract(bigDecimal));
+            orderMapper.updateByPrimaryKeySelective(order);
+
+            updateOrderDetail(order, userOrderPayment);
+        }
         result.put("pay",data);
 
         return result;
     }
 
+    private void updateOrderDetail(OmsOrder order, UserOrderPayment userOrderPayment) {
+        OmsOrderDetail detail = detail(order.getOrderSn());
+        MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setOrderNo(userOrderPayment.getAdapayNo());
+        model.setOrderInfo(JSON.toJSONString(detail));
+        webFeignService.mallSaveOrderInfo(model);
+    }
+
     private Map feignMecCouponAmount(String couponId,BigDecimal amount) {
 
         MallCreateOrderModel model = new MallCreateOrderModel();
@@ -390,25 +443,27 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         model.setAmount(amount);
         HttpResponseResult<Map> mapHttpResponseResult = webFeignService.couponAmount(model);
         if (!mapHttpResponseResult.getStatus()) {
-            throw new BizException("管乐迷获取优惠券优惠失败");
+            LOG.error("管乐迷获取优惠券优惠失败:{}",mapHttpResponseResult.getMsg());
+            throw new BizException(mapHttpResponseResult.getMsg());
         }
         return mapHttpResponseResult.getData();
     }
 
-    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount, String orderDetail) {
+    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId,
+                                    BigDecimal amount, String orderDetail,boolean useBalance) {
         // 远程调用管乐迷订单记录
         MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setTeacherId(teacherId);
         model.setAmount(amount);
         model.setOrderNo(orderSn);
-        if (!userId.equals(teacherId)) {
-            model.setTeacherId(teacherId);
-        }
+        model.setUseBalance(useBalance);
         model.setUserId(userId);
         model.setCouponIdList(StringUtil.toIntegerList(couponId));
         model.setOldOrderNo(oldOrderNo);
         model.setOrderInfo(orderDetail);
         HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallCreateOrder(model);
         if (!mapHttpResponseResult.getStatus()) {
+            LOG.error("管乐迷下单错误信息:{}",mapHttpResponseResult.getMsg());
             throw new BizException("管乐迷订单生成失败");
         }
         Map data = mapHttpResponseResult.getData();
@@ -513,7 +568,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
                     cancelOrder.getOrderSn());
             if (userOrderPayment != null) {
-                HttpResponseResult<OrderCancelModel> responseResult = webFeignService.cancelOrder(userOrderPayment.getAdapayNo());
+                HttpResponseResult<OrderCancelModel> responseResult = webFeignService.cancelOrder(userOrderPayment.getAdapayNo(),message);
                 if (!responseResult.getStatus()) {
                     throw new BizException("远程取消失败");
                 }
@@ -534,10 +589,27 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
             orderItemExample.createCriteria().andOrderIdEqualTo(orderId);
             List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
+
             //解除订单商品库存锁定
             if (!CollectionUtils.isEmpty(orderItemList)) {
                 portalOrderDao.releaseSkuStockLock(orderItemList);
-                portalOrderDao.releaseProductStockLock(orderItemList);
+                Map<Long, List<OmsOrderItem>> collect = orderItemList
+                                                                   .stream()
+                                                                   .collect(Collectors.groupingBy(OmsOrderItem::getProductId));
+                List<ProductStock> productStockList = new ArrayList<>();
+                for (Map.Entry<Long, List<OmsOrderItem>> entry : collect.entrySet()) {
+                    ProductStock stock = new ProductStock();
+                    stock.setProductId(entry.getKey());
+                    List<OmsOrderItem> value = entry.getValue();
+                    if (CollectionUtils.isEmpty(value)) {
+                        continue;
+                    }
+                    int sum = value.stream().mapToInt(OmsOrderItem::getProductQuantity).sum();
+                    stock.setStock(sum);
+                    productStockList.add(stock);
+                }
+
+                portalOrderDao.releaseProductStockLock(productStockList);
             }
             //修改优惠券使用状态
             // updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);
@@ -569,7 +641,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
     @Override
-    public void confirmReceiveOrder(Long orderId) {
+    public void confirmReceiveOrder(Long orderId, boolean auto) {
         // UmsMember member = memberService.getCurrentMember();
         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
         // if (!member.getId().equals(order.getMemberId())) {
@@ -585,6 +657,20 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setReceiveTime(new Date());
         orderMapper.updateByPrimaryKey(order);
 
+
+        // 管乐迷状态同步更新为手动确认收货
+        mecReceive(order.getOrderSn(),auto);
+
+    }
+
+    // 管乐迷状态同步更新为手、自动确认收货
+    private void mecReceive(String orderSn, boolean auto) {
+        UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusSuccess(orderSn);
+        HttpResponseResult receive = webFeignService.receive(userOrderPayment.getAdapayNo(), auto);
+        if (!receive.getStatus()) {
+            LOG.error("管乐迷状态同步更新为手、自动确认收货失败:{}",receive.getMsg());
+        }
+
     }
 
     @Override
@@ -709,7 +795,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                    , () -> {
                                         try {
-                                            this.confirmReceiveOrder(omsOrder.getId());
+                                            this.confirmReceiveOrder(omsOrder.getId(), true);
 
                                         }catch (Exception e) {
                                             LOG.warn("订单收货,{}",e.fillInStackTrace());

+ 66 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -4,21 +4,26 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageHelper;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
+import com.yonge.cooleshow.portal.domain.ProductStock;
 import com.yonge.cooleshow.portal.dto.ProductCategorySmallVo;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -48,6 +53,8 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
     @Autowired
     private PortalProductDao portalProductDao;
 
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
 
     @Autowired
     private PmsProductAttributeCategoryMapper productAttributeCategoryMapper;
@@ -209,6 +216,65 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         return shareProductVo;
     }
 
+    @Override
+    @Transactional
+    public void reduceStock(List<StockOperateModel> model, String stockType) {
+
+        // 商品库存变动
+        List<ProductStock> productList = new ArrayList<>();
+        Map<Long, List<StockOperateModel>> collect = model.stream().collect(Collectors.groupingBy(
+                StockOperateModel::getProductId));
+        for (Map.Entry<Long, List<StockOperateModel>> entry : collect.entrySet()) {
+            ProductStock productStock = new ProductStock();
+            List<StockOperateModel> value = entry.getValue();
+            if (CollectionUtils.isEmpty(value)) {
+                continue;
+            }
+            int sum = value.stream().mapToInt(StockOperateModel::getCount).sum();
+            productStock.setProductId(entry.getKey());
+            productStock.setStock(sum);
+            productList.add(productStock);
+        }
+        switch (stockType) {
+            case "lock" :
+                // sku库存锁定
+                for (StockOperateModel stockOperateModel : model) {
+                    int i = skuStockMapper.lockStock(stockOperateModel.getProductSkuId(), stockOperateModel.getCount());
+                    if (i ==0) {
+                        Asserts.fail("库存不足");
+                    }
+                }
+                // 商品扣减锁定
+                for (ProductStock product : productList) {
+                    if (product.getStock() > 0) {
+                        int i = pmsProductMapper.lockStock(product.getProductId(), product.getStock());
+                        if (i == 0) {
+                            Asserts.fail("库存不足");
+                        }
+                    }
+                }
+                break;
+            case "unlock" :
+                // 解锁sku库存
+                portalProductDao.unlockSku(model);
+
+                // 解锁商品库存
+                portalProductDao.unlockProduct(productList);
+                break;
+            case "reduce" :
+                // 扣减sku库存
+                portalProductDao.reduceSku(model);
+
+                // 扣减商品库存
+                portalProductDao.updateProductStock(productList);
+                break;
+            default: break;
+
+        }
+
+
+    }
+
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();

+ 5 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -50,6 +50,11 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     }
 
     @Override
+    public UserOrderPayment getByOrderNoAndStatusSuccess(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusSuccess(orderSn);
+    }
+
+    @Override
     public UserOrderPayment getByAdapayNo(String paymentNo) {
         return userOrderPaymentMapper.selectByAdapayNo(paymentNo);
     }

+ 4 - 1
mec-mall/mall-portal/src/main/resources/bootstrap-pre.yml

@@ -9,4 +9,7 @@ spring:
         file-extension: yaml
         refresh:
           enabled: true
-        enabled: true
+        enabled: true
+    alibaba:
+      seata:
+        tx-service-group: default_tx_group

+ 4 - 1
mec-mall/mall-portal/src/main/resources/bootstrap-prod.yml

@@ -9,4 +9,7 @@ spring:
         file-extension: yaml
         refresh:
           enabled: true
-        enabled: true
+        enabled: true
+    alibaba:
+      seata:
+        tx-service-group: default_tx_group

+ 1 - 1
mec-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -97,7 +97,7 @@
         SET
         lock_stock = CASE id
         <foreach collection="itemList" item="item">
-            WHEN #{item.productId} THEN lock_stock - #{item.productQuantity}
+            WHEN #{item.productId} THEN lock_stock - #{item.stock}
         </foreach>
         END
         WHERE

+ 56 - 0
mec-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml

@@ -120,4 +120,60 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <update id="unlockSku">
+        UPDATE pms_sku_stock
+        SET
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN lock_stock - #{item.count}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
+
+    <update id="unlockProduct">
+        UPDATE pms_product
+        SET
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN lock_stock - #{item.stock}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productId}
+        </foreach>
+    </update>
+
+    <update id="reduceSku">
+        UPDATE pms_sku_stock
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN stock - #{item.count}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN pms_sku_stock.sale + #{item.count}
+        </foreach>
+        END,
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN lock_stock - #{item.count}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
+
 </mapper>

+ 6 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysCouponCodeController.java

@@ -12,6 +12,7 @@ import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.page.WrapperUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -76,8 +77,11 @@ public class SysCouponCodeController extends BaseController {
 
     @ApiOperation("查询优惠券发放记录")
     @GetMapping(value = "/queryCanBeGet")
-    public HttpResponseResult queryCanBeGetCoupon() {
-        return succeed(couponIssueRecordService.queryCanBeGetCoupon(getUserId()));
+    public HttpResponseResult queryCanBeGetCoupon(String useSystem) {
+        if (StringUtils.isEmpty(useSystem)) {
+            useSystem = "MEC";
+        }
+        return succeed(couponIssueRecordService.queryCanBeGetCoupon(getUserId(),useSystem));
     }
 
     private Integer getUserId() {

+ 45 - 57
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -25,6 +25,7 @@ import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.common.controller.BaseController;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -136,48 +137,28 @@ public class APIController extends BaseController {
 
 	// 商城创建订单
 	@PostMapping("/mallCreateOrder")
-	public HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model) {
-		try {
-			return succeed(studentPaymentOrderService.createOrder(model));
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
+	public HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model) throws Exception {
+		return succeed(studentPaymentOrderService.createOrder(model));
 	}
 
 	// 商城订单优惠券金额
 	@PostMapping("/couponAmount")
 	public HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model) {
-		try {
 			return succeed(studentPaymentOrderService.couponAmount(model));
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
 	}
 
 	// 商城保存订单详情数据
 	@PostMapping("/mallSaveOrderInfo")
 	public HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model) {
-		try {
 			studentPaymentOrderService.mallSaveOrderInfo(model);
 			return succeed();
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
 	}
 
 	// 商城支付成功/失败修改订单状态
 	@PostMapping("/updateOrder")
-	public HttpResponseResult updateOrder(@RequestBody Map map) {
+	public HttpResponseResult updateOrder(@RequestBody Map map) throws Exception {
 
-		try {
-			studentPaymentOrderService.updateOrder(map);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
+		studentPaymentOrderService.updateOrder(map);
 		return succeed();
 	}
 
@@ -187,22 +168,17 @@ public class APIController extends BaseController {
 	 *
 	 */
 	@PostMapping("/cancelOrder")
-	public HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam String orderNo) {
-
-		try {
-			OrderCancelModel cancelModel = new OrderCancelModel();
-			StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
-			if (orderByOrderNo == null) {
-				cancelModel.setSuccess(true);
-				cancelModel.setStatus(false);
-				return succeed(cancelModel);
-			}
-			cancelModel = studentPaymentOrderService.cancelOrder(orderByOrderNo);
+	public HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam String orderNo,@RequestParam String reason) {
+
+		OrderCancelModel cancelModel = new OrderCancelModel();
+		StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+		if (orderByOrderNo == null) {
+			cancelModel.setSuccess(true);
+			cancelModel.setStatus(false);
 			return succeed(cancelModel);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
 		}
+		cancelModel = studentPaymentOrderService.cancelOrder(orderByOrderNo,reason);
+		return succeed(cancelModel);
 	}
 
 
@@ -210,18 +186,13 @@ public class APIController extends BaseController {
 	@GetMapping("/getRefundInfo")
 	public HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam String orderNo) {
 
-		try {
-			SysConfig baseApiUrl = sysConfigService.findByParamName("base_api_url");
-			StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
-			Map<String,String> result = new HashMap<>();
-			result.put("transNo",orderByOrderNo.getTransNo());
-			result.put("baseUrl",baseApiUrl.getParanValue());
-			;
-			return succeed(result);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
+		SysConfig baseApiUrl = sysConfigService.findByParamName("base_api_url");
+		StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+		Map<String,String> result = new HashMap<>();
+		result.put("transNo",orderByOrderNo.getTransNo());
+		result.put("baseUrl",baseApiUrl.getParanValue());
+		;
+		return succeed(result);
 	}
 
 
@@ -230,13 +201,30 @@ public class APIController extends BaseController {
 	@PostMapping("/refund")
 	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestBody RefundModel refundModel) {
 
-		try {
-			BaseResult<Map<String, Object>> mapBaseResult = studentPaymentOrderService.refund(refundModel.getOrderNo(),refundModel.getNotifyUrl(),refundModel.getRefundNo());
+		BaseResult<Map<String, Object>> mapBaseResult = studentPaymentOrderService.refund(refundModel.getOrderNo(),refundModel.getNotifyUrl(),refundModel.getRefundNo());
 
-			return succeed(mapBaseResult);
-		} catch (Exception e) {
-			e.printStackTrace();
-			return failed();
-		}
+		return succeed(mapBaseResult);
+	}
+
+
+
+	// 商城获取 收货状态
+	@PostMapping("/receive")
+	public HttpResponseResult receive(@RequestParam String orderNo,@RequestParam boolean autoReceive) {
+
+		studentPaymentOrderService.receive(orderNo,autoReceive);
+
+		return succeed();
+	}
+
+
+
+	// 商城获取 收货状态
+	@PostMapping("/balance")
+	public HttpResponseResult<BigDecimal> balance(@RequestParam Long userId) {
+
+		BigDecimal balance = studentPaymentOrderService.balance(userId);
+
+		return succeed(balance);
 	}
 }

+ 1 - 0
pom.xml

@@ -130,6 +130,7 @@
 				<version>0.9.0.RELEASE</version>
 			</dependency>
 
+
 			<dependency>
 				<groupId>io.zipkin.java</groupId>
 				<artifactId>zipkin-server</artifactId>