liujunchi 2 years ago
parent
commit
81a652eabf
60 changed files with 3344 additions and 2393 deletions
  1. 1 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java
  2. 15 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java
  3. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java
  5. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  6. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsSellQueryInfo.java
  8. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  9. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ContractServiceImpl.java
  10. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  11. 305 39
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  12. 16 3
      mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml
  13. 3 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  14. 24 0
      mec-client-api/src/main/java/com/ym/mec/task/MallPortalFeignService.java
  15. 22 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/MallPortalFeignServiceFallback.java
  16. 39 4
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  17. 51 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  18. 85 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java
  19. 43 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/OrderCancelModel.java
  20. 40 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/RefundModel.java
  21. 2 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java
  22. 3 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/UmsRoleController.java
  23. 0 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/PmsBrandParam.java
  24. 18 0
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  25. 3 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java
  26. 3 1
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsRoleServiceImpl.java
  27. 52 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/TradeStatusEnum.java
  28. 5 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/util/StringUtil.java
  29. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java
  30. 11 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UmsAdmin.java
  31. 22 7
      mec-mall/mall-mbg/src/main/resources/config/mybatis/UmsAdminMapper.xml
  32. 7 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  33. 4 0
      mec-mall/mall-portal/pom.xml
  34. 1 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/MallPortalApplication.java
  35. 2 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java
  36. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java
  37. 260 216
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  38. 135 182
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  39. 14 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/UmsMemberReceiveAddressController.java
  40. 3 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  41. 32 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java
  42. 0 93
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderPayReq.java
  43. 6 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java
  44. 119 128
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  45. 2 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberReceiveAddressService.java
  46. 47 78
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  47. 19 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  48. 1341 1444
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  49. 9 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberReceiveAddressServiceImpl.java
  50. 14 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java
  51. 56 113
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  52. 56 56
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java
  53. 14 3
      mec-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  54. 1 1
      mec-mall/pom.xml
  55. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  56. 24 0
      mec-task/src/main/java/com/ym/mec/task/jobs/CancelTimeOutOrderTask.java
  57. 22 0
      mec-task/src/main/java/com/ym/mec/task/jobs/MallAutoReceiveTask.java
  58. 57 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java
  59. 131 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/entity/BaseResult.java
  60. 124 8
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

+ 1 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -46,7 +46,7 @@ public interface SysUserFeignService {
 									@RequestParam("clientId")String clientId,
 									@RequestParam("clientSecret")String clientSecret);
 
-	@GetMapping(value = "exit")
+	@PostMapping(value = "exit")
 	@ApiOperation(value = "退出登录")
 	HttpResponseResult<String> logout();
 

+ 15 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java

@@ -156,6 +156,21 @@ public class TokenController extends BaseController {
 		return succeed("退出成功");
 	}
 
+	@GetMapping(value = "exit")
+	@ApiOperation(value = "退出登录")
+	public HttpResponseResult<String> logoutGet(HttpServletRequest request) {
+		String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
+		if (StringUtils.isBlank(authHeader)) {
+			return failed("退出失败,token 为空");
+		}
+
+		String tokenValue = authHeader.toLowerCase().replace(OAuth2AccessToken.BEARER_TYPE.toLowerCase(), StringUtils.EMPTY).trim();
+
+		tokenService.revokeToken(tokenValue);
+
+		return succeed("退出成功");
+	}
+
 	@PostMapping(value = "exit/{clientId}/{phone}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 	@ApiOperation(value = "指定用户退出登录")
 	public HttpResponseResult<String> exitByPhone(@PathVariable("clientId") String clientId, @PathVariable("phone") String phone) {

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java

@@ -12,12 +12,22 @@ public class StudentGoodsSellDto extends StudentPaymentOrder {
 
     private Integer authorUser;
 
+    private String goodsType;
+
     private BigDecimal totalAmount = BigDecimal.ZERO;
 
     private BigDecimal marketAmount = BigDecimal.ZERO;
 
     private Integer autoAffirmReceiveTime;
 
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    public void setGoodsType(String goodsType) {
+        this.goodsType = goodsType;
+    }
+
     public Integer getAutoAffirmReceiveTime() {
         return autoAffirmReceiveTime;
     }

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

@@ -76,6 +76,17 @@ public class StudentGoodsSell extends BaseEntity {
 	@ApiModelProperty(value = "优惠券详情列表", required = false)
 	private List<SysCouponCodeDto> couponCodeDtoList;
 
+	// 商品来源类型 MALL商城
+	private String goodsType;
+
+	public String getGoodsType() {
+		return goodsType;
+	}
+
+	public void setGoodsType(String goodsType) {
+		this.goodsType = goodsType;
+	}
+
 	public String getCouponIds() {
 		return couponIds;
 	}

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

@@ -18,7 +18,9 @@ public enum GroupType implements BaseEnum<String, GroupType> {
 	DEGREE("6.1考级活动"),
 	ACTIVITY("活动购买"),
 	MEMBER("购买会员"),
-	LIVE_BUY("直播购物");
+	LIVE_BUY("直播购物"),
+
+	MALL_SELL("商城购物"),;
 
 	private String desc;
 

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

@@ -34,7 +34,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     DEGREE("DEGREE", "6.1考级活动"),
     ACTIVITY("ACTIVITY", "活动购买"),
     MEMBER("MEMBER", "会员购买"),
-    LIVE_BUY("LIVE_BUY", "直播购物");
+    LIVE_BUY("LIVE_BUY", "直播购物"),
+    MALL_BUY("MALL_BUY", "商城购物");
 
 
     private String code;

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

@@ -14,6 +14,17 @@ public class GoodsSellQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "交易状态",required = true)
 	private String status;
 
+	@ApiModelProperty("商品来源类型 MALL:商城")
+	private String goodsType;
+
+	public String getGoodsType() {
+		return goodsType;
+	}
+
+	public void setGoodsType(String goodsType) {
+		this.goodsType = goodsType;
+	}
+
 	public Integer getTeacherId() {
 		return teacherId;
 	}

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

@@ -14,8 +14,12 @@ import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.dal.vo.StudentPaymentOrderVo;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -85,6 +89,18 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     void queryOrderStatus() throws Exception;
 
+
+    /**
+     *  检查并修改订单状态
+     *
+     * @param date
+     * @param payConfigMap
+     * @param payingOrder
+     * @param checkTime
+     * @return
+     */
+    OrderCancelModel updateOrderStatus(Date date, Map<Integer, HfMerchantConfig> payConfigMap, StudentPaymentOrder payingOrder, Boolean checkTime) throws Exception;
+
     //退优惠券和余额
     void quitCouponAndBalance(StudentPaymentOrder order);
 
@@ -225,4 +241,18 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     //获取云教练订单
     StudentPaymentOrder getMemberIngOrder(OrderTypeEnum member, DealStatusEnum status);
+
+    Map createOrder(MallCreateOrderModel model) throws Exception;
+
+    void mallBuyOrderCallback(StudentPaymentOrder order);
+
+    void mallSaveOrderInfo(MallCreateOrderModel model);
+
+    OrderCancelModel cancelOrder(StudentPaymentOrder orderByOrderNo);
+
+    // 撤销支付
+    BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo);
+
+    // 查询优惠券优惠券金额
+    Map couponAmount(MallCreateOrderModel model);
 }

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

@@ -1011,7 +1011,7 @@ public class ContractServiceImpl implements ContractService, InitializingBean {
             return;
         }
 
-        String organCode = organizationDto.getCorporateCode() == null ? tenantInfo.getTsignCode() : organizationDto.getCorporateCode();
+        String organCode = StringUtils.isEmpty(organizationDto.getCorporateCode()) ? tenantInfo.getTsignCode() : organizationDto.getCorporateCode();
         
 		if (user.getTenantId() == 1) {
 			if (!OwnershipType.OWN.name().equals(params.get("ownershipType"))) {

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

@@ -3472,7 +3472,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceBuyResult.setType(order.getType().getCode());
         practiceBuyResult.setFinanceChops(financeChops);
 
-        if (order.getGroupType().equals(GroupType.GOODS_SELL)) {
+        if (order.getGroupType().equals(GroupType.GOODS_SELL) || order.getGroupType().equals(GroupType.MALL_SELL)) {
             practiceBuyResult.setDetail(studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
         }
 

+ 305 - 39
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1,14 +1,12 @@
 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;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.PageInfoOrder;
-import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.SporadicOrderQueryInfo;
@@ -18,6 +16,8 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
@@ -27,11 +27,11 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.adapay.ConfigInit;
 import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.yqpay.*;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
-
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -48,6 +48,8 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
+
 @Service
 public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, StudentPaymentOrder> implements StudentPaymentOrderService {
 
@@ -116,10 +118,19 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private TenantConfigService tenantConfigService;
     @Autowired
     private GoodsProcurementDao goodsProcurementDao;
-    
+    @Autowired
+    private ContractService contractService;
     @Autowired
     private HfMerchantConfigService hfMerchantConfigService;
+    @Autowired
+    private StudentDao studentDao;
+    @Autowired
+    private StudentPaymentOrderService studentPaymentOrderService;
+
 
+    @Autowired
+    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
         return studentPaymentOrderDao;
@@ -300,44 +311,62 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             if (DateUtil.minutesBetween(payingOrder.getCreateTime(), date) < 10) {
                 continue;
             }
-            
-            hfMerchantConfig = payConfigMap.get(payingOrder.getTenantId());
-            if(hfMerchantConfig == null){
-            	hfMerchantConfig = hfMerchantConfigService.queryByTenantId(payingOrder.getTenantId());
-                if(hfMerchantConfig == null){
-                	throw new BizException("机构[{}]汇付商户信息找不到", payingOrder.getTenantId());
-                }
-            	payConfigMap.put(payingOrder.getTenantId(), hfMerchantConfig);
-            }
-            
-            Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo(), hfMerchantConfig.getMerKey());
-            LOGGER.warn("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
 
-            Map<String, String> rpMap = new HashMap<>();
-            rpMap.put("merOrderNo", payingOrder.getOrderNo());
-            rpMap.put("orderNo", payingOrder.getTransNo());
-            rpMap.put("channelType", (String) payment.get("pay_channel"));
-            String status = (String) payment.get("status");
-            if (payment.containsKey("error_msg")) {
-                rpMap.put("remarks", (String) payment.get("error_msg"));
-            }
-            if (status.equals("succeeded")) {
-                rpMap.put("tradeState", "1");
-            } else if (status.equals("failed") || (DateUtil.minutesBetween(DateUtil.addHours(payingOrder.getUpdateTime(), 2), date) > 0)) {
-                rpMap.put("tradeState", "0");
+            updateOrderStatus(date, payConfigMap, payingOrder,true);
+        }
+        closeOrders(orderNoList);
+    }
+
+    @Override
+    @Transactional
+    public OrderCancelModel updateOrderStatus(Date date, Map<Integer, HfMerchantConfig> payConfigMap, StudentPaymentOrder payingOrder, Boolean checkTime) throws Exception {
+        if (payConfigMap == null) {
+            throw new BizException("payConfigMap 不能为空");
+        }
+        HfMerchantConfig hfMerchantConfig;
+        hfMerchantConfig = payConfigMap.get(payingOrder.getTenantId());
+        if(hfMerchantConfig == null){
+            hfMerchantConfig = hfMerchantConfigService.queryByTenantId(payingOrder.getTenantId());
+            if(hfMerchantConfig == null){
+                throw new BizException("机构[{}]汇付商户信息找不到", payingOrder.getTenantId());
             }
+            payConfigMap.put(payingOrder.getTenantId(), hfMerchantConfig);
+        }
+        OrderCancelModel  model = new OrderCancelModel();
+
+        Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo(), hfMerchantConfig.getMerKey());
+        LOGGER.info("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
+
+        Map<String, String> rpMap = new HashMap<>();
+        rpMap.put("merOrderNo", payingOrder.getOrderNo());
+        rpMap.put("orderNo", payingOrder.getTransNo());
+        rpMap.put("channelType", (String) payment.get("pay_channel"));
+        model.setPayChannel((String) payment.get("pay_channel"));
+        String status = (String) payment.get("status");
+        if (payment.containsKey("error_msg")) {
+            rpMap.put("remarks", (String) payment.get("error_msg"));
+        }
+        if (status.equals("succeeded")) {
+            rpMap.put("tradeState", "1");
+            model.setStatus(true);
+        } else if (status.equals("failed") || !checkTime
+                || (DateUtil.minutesBetween(DateUtil.addHours(payingOrder.getUpdateTime(), 2),date) > 0)) {
+            rpMap.put("tradeState", "0");
+            model.setStatus(false);
+        }
 
-            if (status.equals("succeeded") ||
-                    (status.equals("failed") || payingOrder.getCreateTime().before(DateUtil.addMinutes(new Date(), -35)))) {
-                try {
-                    updateOrder(rpMap); //更新订单
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    continue;
-                }
+        if (status.equals("succeeded") ||
+                (status.equals("failed") || !checkTime || payingOrder.getCreateTime().before(DateUtil.addMinutes(new Date(), -35)))) {
+            try {
+                updateOrder(rpMap); //更新订单
+                model.setSuccess(true);
+            } catch (Exception e) {
+                e.printStackTrace();
+                model.setSuccess(false);
+                return model;
             }
         }
-        closeOrders(orderNoList);
+        return model;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -529,6 +558,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         } else if (order.getType().equals(OrderTypeEnum.LIVE_BUY)) {
             //直播课购买回调
             memberRankSettingService.liveBuyOrderCallback(order);
+        } else if (order.getType().equals(OrderTypeEnum.MALL_BUY)) {
+            // 商城购买订单回调
+            studentPaymentOrderService.mallBuyOrderCallback(order);
         }
     }
 
@@ -999,5 +1031,239 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         return studentPaymentOrderDao.getMemberIngOrder(member, status);
     }
 
+    @Autowired
+    private StudentRepairDao studentRepairDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+    @Autowired
+    private StudentGoodsSellDao studentGoodsSellDao;
+
+    @Override
+    public Map createOrder(MallCreateOrderModel model) throws Exception {
+
+        if(model == null ||model.getUserId() == null) {
+            throw new BizException("参数错误");
+        }
+        StudentGoodsSell studentGoodsSell;
+        if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
+            studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOldOrderNo());
+        }  else {
+            studentGoodsSell = new StudentGoodsSell();
+        }
+        studentDao.lockUser(model.getUserId());
+        SysUser student = studentDao.getUser(model.getUserId());
+        Map payMap = new HashMap();
+        if (student == null) {
+            payMap.put("mallStatus",0);
+            return payMap;
+        }
+        studentGoodsSell.setUserId(model.getUserId());
+        studentGoodsSell.setTeacherId(model.getTeacherId() >0 ? model.getTeacherId():studentGoodsSell.getTeacherId());
+        studentGoodsSell.setAuthorUser(model.getTeacherId() >0 ? model.getTeacherId():studentGoodsSell.getAuthorUser());
+        //如果教务老师为空,代表学员自己创建的订单
+        if (model.getTeacherId() == null && studentGoodsSell.getTeacherId() == null) {
+            //获取学生关联的所有教务老师列表
+            List<Integer> stuEducation = studentRepairDao.countStuEducation(model.getUserId());
+            if (stuEducation != null && stuEducation.size() == 1) {
+                //获取学员乐团关联的教务
+                MusicGroup musicGroup = musicGroupDao.getStuMusic(model.getUserId());
+                studentGoodsSell.setTeacherId(stuEducation.get(0));
+                if (musicGroup != null) {
+                    studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                }
+            }
+        } else if (studentGoodsSell.getCooperationOrganId() == null) {
+            //获取教务老师,学员关联的乐团
+            MusicGroup musicGroup = musicGroupDao.getStuEduMusic(model.getUserId(), studentGoodsSell.getTeacherId());
+            if (musicGroup != null) {
+                studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+            }
+        }
+
+        if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
+            StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(model.getOldOrderNo());
+            if (orderByOrderNo == null) {
+                throw new BizException("未找到原订单");
+            }
+            // 已有订单,先关单
+            orderByOrderNo.setStatus(CLOSE);
+            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.setStatus(DealStatusEnum.ING);
+        if (studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+        }
+        studentPaymentOrder.setGroupType(GroupType.MALL_SELL);
+        studentPaymentOrder.setUserId(model.getUserId());
+        studentPaymentOrder.setType(OrderTypeEnum.MALL_BUY);
+        studentPaymentOrder.setOrderNo(model.getOrderNo());
+        studentPaymentOrder.setCreateTime(date);
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrder.setPaymentChannel("ADAPAY");
+        studentPaymentOrder.setOrganId(student.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(student.getOrganId());
+        studentPaymentOrder.setTenantId(student.getTenantId());
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
+        studentGoodsSell.setOrganId(student.getOrganId());
+        studentGoodsSell.setTotalAmount(studentPaymentOrder.getActualAmount());
+        studentGoodsSell.setGoodsType("MALL");
+        studentGoodsSell.setGoodsJson(model.getOrderInfo());
+        studentGoodsSell.setOrderNo(model.getOrderNo());
+        List<Integer> couponIdList = model.getCouponIdList();
+        if (couponIdList != null && couponIdList.size() > 0) {
+            studentGoodsSell.setCouponIds(StringUtils.join(couponIdList, ","));
+        }
+        studentGoodsSell.setTenantId(student.getTenantId());
+        studentGoodsSellDao.insert(studentGoodsSell);
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+        //  receiver类型
+        payMap = payService.getPayMap(
+                studentPaymentOrder.getExpectAmount(),
+                studentPaymentOrder.getActualAmount(),
+                model.getOrderNo(),
+                baseApiUrl + "/api-mall-portal/payment/callback",
+                baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + model.getOrderNo(),
+                "商品销售",
+                "商品销售",
+                student.getOrganId(),
+                "mall_buy"
+        );
+        studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+        studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+        studentPaymentOrderService.update(studentPaymentOrder);
+        payMap.put("mallCouponAmount",studentPaymentOrder.getCouponRemitFee() == null?BigDecimal.ZERO:studentPaymentOrder.getCouponRemitFee());
+        payMap.put("mallStatus",1);
+        return payMap;
+    }
+
+    @Override
+    public void mallBuyOrderCallback(StudentPaymentOrder studentPaymentOrder) {
+        Date nowDate = new Date();
+        //更新订单信息
+        studentPaymentOrder.setUpdateTime(nowDate);
+        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        if (updateCount <= 0) {
+            throw new BizException("订单更新失败");
+        }
+
+        Integer userId = studentPaymentOrder.getUserId();
+
+        Map<Integer, String> map = new HashMap<>();
+        map.put(userId, userId.toString());
+
+        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+            try {
+                contractService.transferProduceContract(userId, null, null);
+            } catch (Exception e) {
+                logger.error("产品协议生成失败", e);
+            }
+            //插入交易明细
+            BigDecimal amount = studentPaymentOrder.getActualAmount();
+            SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
+            //充值
+            SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
+            rechargeDetail.setAmount(amount);
+            rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
+            rechargeDetail.setComment("缴费前充值");
+            rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
+            rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
+            rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
+            rechargeDetail.setUserId(userId);
+            rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
+            if (studentPaymentOrder.getComAmount() != null) {
+                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount().negate());
+                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount().negate());
+            }
+            sysUserCashAccountDetailService.insert(rechargeDetail);
+            //缴费
+            SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
+            paymentDetail.setAmount(amount.negate());
+            paymentDetail.setBalance(cashAccount.getBalance());
+            paymentDetail.setComment("商品销售");
+            paymentDetail.setStatus(DealStatusEnum.SUCCESS);
+            paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
+            paymentDetail.setType(PlatformCashAccountDetailTypeEnum.GOODS_SELL);
+            paymentDetail.setUserId(userId);
+            sysUserCashAccountDetailService.insert(paymentDetail);
+        } else if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
+
+            if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
+                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "商城购买支付失败");
+            }
+            sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
+        }
+    }
+
+    @Override
+    public void mallSaveOrderInfo(MallCreateOrderModel model) {
+
+        StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOrderNo());
+        if (studentGoodsSell == null) {
+            throw new BizException("未找到订单信息");
+        }
+        studentGoodsSell.setGoodsJson(model.getOrderInfo());
+        studentGoodsSell.setGoodsType("MALL");
+        studentGoodsSellDao.update(studentGoodsSell);
+    }
+
+    @Override
+    public OrderCancelModel cancelOrder(StudentPaymentOrder order) {
+        OrderCancelModel model = new OrderCancelModel();
+        try {
+            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();
+        }
+        return model;
+    }
+
+    @Override
+    public BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo) {
+
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (orderByOrderNo == null) {
+            throw new BizException("为找到订单");
+        }
+        if (orderByOrderNo.getActualAmount().compareTo(BigDecimal.ZERO) ==0) {
+            throw new BizException("0元订单");
+        }
+
+        HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(orderByOrderNo.getTenantId());
+        if(hfMerchantConfig == null){
+            throw new BizException("请配置机构的汇付商户信息");
+        }
+        return Payment.reversePayment(orderByOrderNo.getTransNo(),hfMerchantConfig.getAppId(),refundNo,
+                               orderByOrderNo.getActualAmount().setScale(2,BigDecimal.ROUND_HALF_UP).toString(),notifyUrl);
+    }
+
+    @Override
+    public Map couponAmount(MallCreateOrderModel model) {
+        Map payMap = new HashMap();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
+        payMap.put("mallCouponAmount",studentPaymentOrder.getCouponRemitFee() == null?BigDecimal.ZERO:studentPaymentOrder.getCouponRemitFee());
+        payMap.put("mallStatus",1);
+        return payMap;
+    }
 }

+ 16 - 3
mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml

@@ -40,9 +40,9 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO student_goods_sell (user_id_,teacher_id_,goods_json_,total_amount_,market_amount_,
-		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_,coupon_market_amount_,coupon_ids_,tenant_id_)
+		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_,coupon_market_amount_,coupon_ids_,tenant_id_,goods_type_)
 		VALUES(#{userId},#{teacherId},#{goodsJson},#{totalAmount},#{marketAmount},
-		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId},#{couponMarketAmount},#{couponIds},#{tenantId})
+		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId},#{couponMarketAmount},#{couponIds},#{tenantId},#{goodsType})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -81,6 +81,9 @@
 		<if test="goodsJson != null">
 			goods_json_ = #{goodsJson},
 		</if>
+		<if test="goodsType != null">
+			goods_type_ = #{goodsType},
+		</if>
 		update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
@@ -110,6 +113,7 @@
 	</select>
 	<resultMap type="com.ym.mec.biz.dal.dto.StudentGoodsSellDto" id="StudentGoodsSellDto" extends="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.StudentPaymentOrder">
 		<result column="goods_json_" property="goodsJson" />
+		<result column="goods_type_" property="goodsType" />
 		<result column="total_amount_" property="totalAmount" />
 		<result column="market_amount_" property="marketAmount" />
 		<result column="username_" property="userName" />
@@ -118,6 +122,15 @@
 	<sql id="queryStudentGoodsOrdersSql">
 		<where>
 			sgs.tenant_id_ = #{tenantId}
+
+			<choose>
+				<when test="goodsType != null and goodsType =='MALL'">
+					and sgs.goods_type_ = 'MALL'
+				</when>
+				<otherwise>
+					and sgs.goods_type_ is null
+				</otherwise>
+			</choose>
 			<if test="teacherId != null">
 				AND sgs.teacher_id_ = #{teacherId}
 			</if>
@@ -136,7 +149,7 @@
 		</where>
 	</sql>
 	<select id="queryStudentGoodsOrders" resultMap="StudentGoodsSellDto">
-		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_,su.username_,sgs.author_user_
+		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_,su.username_,sgs.author_user_,sgs.goods_type_
 		FROM student_payment_order spo
 		LEFT JOIN student_goods_sell sgs ON spo.order_no_ = sgs.order_no_
 		LEFT JOIN sys_user su ON sgs.user_id_ = su.id_

+ 3 - 1
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -506,6 +506,8 @@
         FROM student_payment_order
         WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND payment_channel_ = #{paymentChannel}
+    <!--  商城订单由商城控制订单超时      -->
+        and group_type_ != 'MALL_SELL' and type_ != 'MALL_BUY'
     </select>
 
     <!-- 查询支付中超时订单 -->
@@ -1047,7 +1049,7 @@
         from student_payment_order as a
                  left join
              student_payment_order_detail as b on a.id_ = b.payment_order_id_
-        where order_no_ = #{orderNo}
+        where a.order_no_ = #{orderNo}
     </select>
     <select id="getStudentMusicOrderNum" resultType="int">
         SELECT COUNT(0) FROM student_payment_order spo

+ 24 - 0
mec-client-api/src/main/java/com/ym/mec/task/MallPortalFeignService.java

@@ -0,0 +1,24 @@
+package com.ym.mec.task;
+
+import com.ym.mec.common.config.FeignConfiguration;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.task.fallback.MallPortalFeignServiceFallback;
+import com.ym.mec.task.fallback.TaskRemoteServiceFallback;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@FeignClient(name = "mall-portal-server", contextId = "TaskMallRemoteService", configuration = {FeignConfiguration.class}, fallback = MallPortalFeignServiceFallback.class)
+public interface MallPortalFeignService {
+
+    /**
+     * 订单轮询
+     */
+    @GetMapping("/task/cancelTimeOutOrder")
+    Object cancelTimeOutOrder();
+
+    /**
+     * 自动收货
+     */
+    @GetMapping("/task/autoReceive")
+    HttpResponseResult autoReceive();
+}

+ 22 - 0
mec-client-api/src/main/java/com/ym/mec/task/fallback/MallPortalFeignServiceFallback.java

@@ -0,0 +1,22 @@
+package com.ym.mec.task.fallback;
+
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.task.MallPortalFeignService;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-19
+ */
+public class MallPortalFeignServiceFallback  implements MallPortalFeignService {
+    @Override
+    public Object cancelTimeOutOrder() {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult autoReceive() {
+        return null;
+    }
+}

+ 39 - 4
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -2,15 +2,18 @@ package com.ym.mec.web;
 
 import com.ym.mec.common.config.FeignConfiguration;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.common.entity.RefundModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.web.fallback.WebFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 @FeignClient(name = "web-server", contextId = "WebFeignService", configuration = FeignConfiguration.class, fallback = WebFeignServiceFallback.class)
 public interface WebFeignService {
@@ -35,4 +38,36 @@ public interface WebFeignService {
 
 	@PostMapping(value = "api/queryVipPracticeGroups")
     Boolean queryVipPracticeGroups();
+
+	@GetMapping(value = "/queryByTenantId/{id}")
+	HttpResponseResult<HfMerchantConfig> queryByTenantId(@PathVariable("id") Integer id);
+
+	@PostMapping("/api/mallCreateOrder")
+	HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model);
+
+	@PostMapping("/api/executePayment")
+	HttpResponseResult executePayment(@RequestBody Map paymentParam);
+
+	@PostMapping("/api/updateOrder")
+	HttpResponseResult updateOrder(@RequestBody Map map);
+
+	@PostMapping("/api/cancelOrder")
+	HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam("orderNo") String orderNo);
+
+
+
+	@PostMapping("/api/mallSaveOrderInfo")
+	HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model);
+
+	// 商城获取 退款数据
+	@GetMapping("/api/getRefundInfo")
+	HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam("orderNo") String orderNo);
+
+	// 商城获取 退款数据
+	@PostMapping("/api/refund")
+	HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestBody RefundModel refundModel);
+
+	// 商城订单优惠券金额
+	@PostMapping("/api/couponAmount")
+	HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model);
 }

+ 51 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -1,13 +1,19 @@
 package com.ym.mec.web.fallback;
 
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.common.entity.RefundModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
+import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import org.springframework.stereotype.Component;
 
 import com.ym.mec.web.WebFeignService;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
+import java.util.Map;
 
 @Component
 public class WebFeignServiceFallback implements WebFeignService {
@@ -46,4 +52,49 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public Boolean queryVipPracticeGroups() {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<HfMerchantConfig> queryByTenantId(Integer id) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Map> mallCreateOrder(MallCreateOrderModel model) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult executePayment(Map paymentParam) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult updateOrder(Map map) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<OrderCancelModel> cancelOrder(String orderNo) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Map> mallSaveOrderInfo(MallCreateOrderModel model) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Map<String, String>> getBaseUrl(String orderNo) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(RefundModel refundModel) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Map> couponAmount(MallCreateOrderModel model) {
+		return null;
+	}
 }

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

@@ -0,0 +1,85 @@
+package com.ym.mec.common.entity;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-16
+ */
+public class MallCreateOrderModel {
+
+    private String oldOrderNo;
+
+    private String orderNo;
+
+    private BigDecimal amount;
+
+    private List<Integer> couponIdList;
+
+    // 需要购买的人
+    private Integer userId;
+
+    // 代购人id
+    private Integer teacherId;
+
+    private String orderInfo;
+
+    public String getOrderInfo() {
+        return orderInfo;
+    }
+
+    public void setOrderInfo(String orderInfo) {
+        this.orderInfo = orderInfo;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getOldOrderNo() {
+        return oldOrderNo;
+    }
+
+    public void setOldOrderNo(String oldOrderNo) {
+        this.oldOrderNo = oldOrderNo;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public List<Integer> getCouponIdList() {
+        return couponIdList;
+    }
+
+    public void setCouponIdList(List<Integer> couponIdList) {
+        this.couponIdList = couponIdList;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+}

+ 43 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/OrderCancelModel.java

@@ -0,0 +1,43 @@
+package com.ym.mec.common.entity;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-19
+ */
+public class OrderCancelModel {
+
+    // 修改状态  true:支付成功,false 取消成功
+    private Boolean status;
+
+    // 支付方式
+    private String payChannel;
+
+    // 调用状态  true:成功  false 失败
+    private Boolean success;
+
+    public String getPayChannel() {
+        return payChannel;
+    }
+
+    public void setPayChannel(String payChannel) {
+        this.payChannel = payChannel;
+    }
+
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+
+    public Boolean getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Boolean success) {
+        this.success = success;
+    }
+}

+ 40 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/RefundModel.java

@@ -0,0 +1,40 @@
+package com.ym.mec.common.entity;
+
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-22
+ */
+public class RefundModel implements Serializable {
+
+    private String orderNo;
+    private String notifyUrl;
+    private String refundNo;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getNotifyUrl() {
+        return notifyUrl;
+    }
+
+    public void setNotifyUrl(String notifyUrl) {
+        this.notifyUrl = notifyUrl;
+    }
+
+    public String getRefundNo() {
+        return refundNo;
+    }
+
+    public void setRefundNo(String refundNo) {
+        this.refundNo = refundNo;
+    }
+}

+ 2 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/MallAdminApplication.java

@@ -5,6 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
 
 /**
@@ -16,6 +17,7 @@ import org.springframework.context.annotation.ComponentScan;
 @MapperScan({"com.yonge.cooleshow.admin.dao", "com.yonge.cooleshow.mbg.mapper", "com.yonge.toolset.payment.core.dao"})
 @ComponentScan(basePackages = {"com.yonge.cooleshow.admin", "com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common","com.ym.mec"})
 @EnableSwagger2Doc
+@EnableFeignClients("com.ym.mec")
 public class MallAdminApplication {
     public static void main(String[] args) {
         SpringApplication.run(MallAdminApplication.class, args);

+ 3 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/UmsRoleController.java

@@ -52,6 +52,9 @@ public class UmsRoleController {
         if (ids.stream().anyMatch(id -> id.equals(1L))) {
             return CommonResult.failed("默认角色不能删除");
         }
+        if (ids.stream().anyMatch(id -> id.equals(9L))) {
+            return CommonResult.failed("默认角色不能删除");
+        }
         int count = roleService.delete(ids);
         if (count > 0) {
             return CommonResult.success(count);

+ 0 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/PmsBrandParam.java

@@ -27,7 +27,6 @@ public class PmsBrandParam {
     @FlagValidator(value = {"0","1"}, message = "显示状态不正确")
     @ApiModelProperty(value = "是否进行显示")
     private Integer showStatus;
-    @NotEmpty
     @ApiModelProperty(value = "品牌logo",required = true)
     private String logo;
     @ApiModelProperty(value = "品牌大图")

+ 18 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.admin.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import com.github.pagehelper.PageHelper;
+import com.ym.mec.common.exception.BizException;
 import com.yonge.cooleshow.admin.dao.*;
 import com.yonge.cooleshow.admin.dao.*;
 import com.yonge.cooleshow.admin.dto.HomeStatistical;
@@ -19,6 +20,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -69,6 +71,14 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public int create(PmsProductParam productParam) {
+        if (productParam.getPrice().compareTo(BigDecimal.ZERO) <=0 ) {
+            throw new BizException("商品价格不能小于等于0");
+        }
+        for (PmsSkuStock pmsSkuStock : productParam.getSkuStockList()) {
+            if (pmsSkuStock.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BizException("商品价格不能小于等于0");
+            }
+        }
         int count;
         //创建商品
         productParam.setId(null);
@@ -122,6 +132,14 @@ public class PmsProductServiceImpl implements PmsProductService {
 
     @Override
     public int update(Long id, PmsProductParam productParam) {
+        if (productParam.getPrice().compareTo(BigDecimal.ZERO) <=0 ) {
+            throw new BizException("商品价格不能小于等于0");
+        }
+        for (PmsSkuStock pmsSkuStock : productParam.getSkuStockList()) {
+            if (pmsSkuStock.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
+                throw new BizException("商品价格不能小于等于0");
+            }
+        }
         int count;
         //更新商品信息
         PmsProduct product = productParam;

+ 3 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsAdminServiceImpl.java

@@ -240,10 +240,11 @@ public class UmsAdminServiceImpl implements UmsAdminService {
         UmsAdmin admin = new UmsAdmin();
         admin.setId(row.getId().longValue());
         admin.setCreateTime(row.getCreateTime());
-        admin.setUsername(row.getUsername());
+        admin.setUsername(row.getRealName());
         admin.setNickName(row.getUsername());
         admin.setPassword(row.getPassword());
         admin.setStatus(1);
+        admin.setPhone(row.getPhone());
         admin.setIcon(row.getAvatar());
         return admin;
     }
@@ -280,7 +281,7 @@ public class UmsAdminServiceImpl implements UmsAdminService {
         for (Long adminId : adminIdList) {
             UmsAdminRoleRelation roleRelation = new UmsAdminRoleRelation();
             roleRelation.setAdminId(adminId);
-            roleRelation.setRoleId(1L);
+            roleRelation.setRoleId(9L);
             list.add(roleRelation);
         }
         return adminRoleRelationDao.insertList(list) > 0;

+ 3 - 1
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/UmsRoleServiceImpl.java

@@ -56,7 +56,9 @@ public class UmsRoleServiceImpl implements UmsRoleService {
 
     @Override
     public List<UmsRole> list() {
-        return roleMapper.selectByExample(new UmsRoleExample());
+        UmsRoleExample umsRoleExample = new UmsRoleExample();
+        umsRoleExample.createCriteria().andStatusEqualTo(1);
+        return roleMapper.selectByExample(umsRoleExample);
     }
 
     @Override

+ 52 - 0
mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/TradeStatusEnum.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.mall.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败
+ *
+ * @Author: liweifan
+ * @Data: 2022/3/31 14:59
+ */
+public enum TradeStatusEnum implements BaseEnum<String, TradeStatusEnum> {
+    pending("交易处理中"),
+    succeeded("交易成功"),
+    failed("交易失败"),
+    close("交易关闭");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    TradeStatusEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public static TradeStatusEnum getByName(String name) {
+        for (TradeStatusEnum statusEnum : TradeStatusEnum.values()) {
+            if (statusEnum.getCode().equals(name)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 5 - 0
mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/util/StringUtil.java

@@ -5,6 +5,7 @@ import org.springframework.lang.Nullable;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.baomidou.mybatisplus.core.toolkit.StringUtils.firstCharToLower;
 
@@ -198,6 +199,10 @@ public class StringUtil {
     }
 
 
+
+    public static List<Integer> toIntegerList(String str) {
+        return Arrays.stream(toLongArray(str)).map(Long::intValue).collect(Collectors.toList());
+    }
     /**
      * 字符串转 long,为空则返回默认值
      *

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

@@ -42,4 +42,6 @@ public interface UserOrderRefundMapper {
     UserOrderRefund selectByRefundNo(@Param("refundOrderNo") String refundOrderNo);
 
     UserOrderRefund selectByPayOrderNo( @Param("payOrderNo") String payOrderNo);
+
+    UserOrderRefund selectByPayTansNo(@Param("payTransNo") String payTransNo);
 }

+ 11 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/UmsAdmin.java

@@ -32,8 +32,19 @@ public class UmsAdmin implements Serializable {
     @ApiModelProperty(value = "帐号启用状态:0->禁用;1->启用")
     private Integer status;
 
+    @ApiModelProperty("手机号")
+    private String phone;
+
     private static final long serialVersionUID = 1L;
 
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
     public Long getId() {
         return id;
     }

+ 22 - 7
mec-mall/mall-mbg/src/main/resources/config/mybatis/UmsAdminMapper.xml

@@ -8,6 +8,7 @@
     <result column="icon" jdbcType="VARCHAR" property="icon" />
     <result column="email" jdbcType="VARCHAR" property="email" />
     <result column="nick_name" jdbcType="VARCHAR" property="nickName" />
+    <result column="phone" jdbcType="VARCHAR" property="phone" />
     <result column="note" jdbcType="VARCHAR" property="note" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="login_time" jdbcType="TIMESTAMP" property="loginTime" />
@@ -72,7 +73,7 @@
     </where>
   </sql>
   <sql id="Base_Column_List">
-    id, username, password, icon, email, nick_name, note, create_time, login_time, status
+    id, username, password, icon, email, nick_name, note, create_time, login_time, status,phone
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.UmsAdminExample" resultMap="BaseResultMap">
     select
@@ -110,11 +111,11 @@
     </selectKey>
     insert into ums_admin (username, password, icon, 
       email, nick_name, note, 
-      create_time, login_time, status
+      create_time, login_time, status,phone
       )
     values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{icon,jdbcType=VARCHAR}, 
       #{email,jdbcType=VARCHAR}, #{nickName,jdbcType=VARCHAR}, #{note,jdbcType=VARCHAR}, 
-      #{createTime,jdbcType=TIMESTAMP}, #{loginTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}
+      #{createTime,jdbcType=TIMESTAMP}, #{loginTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER},#{phone}
       )
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.UmsAdmin">
@@ -150,6 +151,9 @@
       <if test="status != null">
         status,
       </if>
+      <if test="phone != null">
+        phone,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="username != null">
@@ -179,6 +183,9 @@
       <if test="status != null">
         #{status,jdbcType=INTEGER},
       </if>
+      <if test="phone != null">
+        #{phone},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.UmsAdminExample" resultType="java.lang.Long">
@@ -220,6 +227,9 @@
       <if test="record.status != null">
         status = #{record.status,jdbcType=INTEGER},
       </if>
+      <if test="record.phone != null">
+        phone = #{record.phone},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -236,6 +246,7 @@
       note = #{record.note,jdbcType=VARCHAR},
       create_time = #{record.createTime,jdbcType=TIMESTAMP},
       login_time = #{record.loginTime,jdbcType=TIMESTAMP},
+      phone = #{record.phone},
       status = #{record.status,jdbcType=INTEGER}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -271,6 +282,9 @@
       <if test="status != null">
         status = #{status,jdbcType=INTEGER},
       </if>
+      <if test="phone != null">
+        phone = #{phone},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -284,6 +298,7 @@
       note = #{note,jdbcType=VARCHAR},
       create_time = #{createTime,jdbcType=TIMESTAMP},
       login_time = #{loginTime,jdbcType=TIMESTAMP},
+      phone = #{phone},
       status = #{status,jdbcType=INTEGER}
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -291,24 +306,24 @@
   <insert id="addRootAdmin"  parameterType="com.yonge.cooleshow.mbg.model.UmsAdmin">
     insert into ums_admin (id,username, password, icon,
     email, nick_name, note,
-    create_time, login_time, status
+    create_time, login_time, status,phone
     )
     values (#{id,jdbcType=BIGINT},#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{icon,jdbcType=VARCHAR},
     #{email,jdbcType=VARCHAR}, #{nickName,jdbcType=VARCHAR}, #{note,jdbcType=VARCHAR},
-    #{createTime,jdbcType=TIMESTAMP}, #{loginTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER}
+    #{createTime,jdbcType=TIMESTAMP}, #{loginTime,jdbcType=TIMESTAMP}, #{status,jdbcType=INTEGER},#{phone}
     )
   </insert>
 
   <insert id="saveRootAdminList">
     replace into ums_admin (id,username, password, icon,
     email, nick_name, note,
-    create_time, login_time, status
+    create_time, login_time, status,phone
     )
     values
     <foreach collection="adminList" separator="," close="" open="" item="item">
       (#{item.id,jdbcType=BIGINT},#{item.username,jdbcType=VARCHAR}, #{item.password,jdbcType=VARCHAR}, #{item.icon,jdbcType=VARCHAR},
       #{item.email,jdbcType=VARCHAR}, #{item.nickName,jdbcType=VARCHAR}, #{item.note,jdbcType=VARCHAR},
-      #{item.createTime,jdbcType=TIMESTAMP}, #{item.loginTime,jdbcType=TIMESTAMP}, #{item.status,jdbcType=INTEGER}
+      #{item.createTime,jdbcType=TIMESTAMP}, #{item.loginTime,jdbcType=TIMESTAMP}, #{item.status,jdbcType=INTEGER},#{item.phone}
       )
     </foreach>
   </insert>

+ 7 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -364,4 +364,11 @@
     from user_order_refund
     where #{payOrderNo} = pay_order_no_   and status_ = 'succeeded'
   </select>
+
+  <select id="selectByPayTansNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{payTransNo} = pay_trans_no_ limit 1
+  </select>
 </mapper>

+ 4 - 0
mec-mall/mall-portal/pom.xml

@@ -86,6 +86,10 @@
             <groupId>com.ym</groupId>
             <artifactId>mec-thirdparty</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ym</groupId>
+            <artifactId>mec-client-api</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/MallPortalApplication.java

@@ -13,7 +13,7 @@ import org.springframework.context.annotation.ComponentScan;
 @ComponentScan(basePackages = {"com.yonge.cooleshow.portal", "com.yonge.cooleshow.mbg", "com.yonge.cooleshow.mall.common","com.ym.mec"})
 @EnableSwagger2Doc
 @EnableDiscoveryClient
-@EnableFeignClients("com.yonge.cooleshow")
+@EnableFeignClients("com.ym.mec")
 public class MallPortalApplication {
 
     public static void main(String[] args) {

+ 2 - 2
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java

@@ -26,8 +26,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
         http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
             .authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
                 .and()
-                .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback/**",
-                 "/order/paySuccess/test","/order/cancelUserOrder/test","/open/**","/task/**")
+                .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback","/order/adapayNo/list",
+                 "/order/paySuccess/test","/order/cancelUserOrder/test","/open/**","/task/**","/order/detail/sn/**","/cart/addAll","/order/generateOrder")
             .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 9 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java

@@ -64,9 +64,18 @@ public class OmsCartItemController {
                 lock.unlock();
             }
         }
+    }
+
+    @ApiOperation("批量添加商品到购物车")
+    @RequestMapping(value = "/addAll", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<List<OmsCartItem>> addAll(@RequestBody List<OmsCartItem> cartItemList) {
 
+        List<OmsCartItem> omsCartItem = cartItemService.addAll(cartItemList);
+        return CommonResult.success(omsCartItem);
     }
 
+
     @ApiOperation("获取当前会员的购物车列表")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody

+ 260 - 216
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -1,216 +1,260 @@
-// package com.yonge.cooleshow.portal.controller;
-//
-// import com.ym.mec.common.exception.BizException;
-// import com.yonge.cooleshow.mall.common.api.CommonPage;
-// import com.yonge.cooleshow.mall.common.api.CommonResult;
-// import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
-// import com.yonge.cooleshow.mall.common.util.DistributedLock;
-// import com.yonge.cooleshow.mall.common.util.StringUtil;
-// import com.yonge.cooleshow.mbg.model.OmsOrder;
-// import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
-// import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
-// import com.yonge.cooleshow.portal.domain.OrderParam;
-// import io.swagger.annotations.Api;
-// import io.swagger.annotations.ApiImplicitParam;
-// import io.swagger.annotations.ApiOperation;
-// import org.redisson.api.RedissonClient;
-// import org.springframework.beans.factory.annotation.Autowired;
-// import org.springframework.beans.factory.annotation.Value;
-// import org.springframework.stereotype.Controller;
-// import org.springframework.util.CollectionUtils;
-// import org.springframework.web.bind.annotation.*;
-//
-// import java.util.List;
-// import java.util.Map;
-// import java.util.concurrent.TimeUnit;
-//
-// /**
-//  * 订单管理Controller
-//  * Created by macro on 2018/8/30.
-//  */
-// @Controller
-// @Api(tags = "OmsPortalOrderController 订单管理")
-// @RequestMapping("/order")
-// public class OmsPortalOrderController {
-//     @Autowired
-//     private OmsPortalOrderService portalOrderService;
-//
-//
-//
-//     @Value("${message.debugMode}")
-//     private boolean debugMode;
-//
-//     @Autowired
-//     private RedissonClient redissonClient;
-//
-//     @ApiOperation("根据购物车信息生成确认单")
-//     @RequestMapping(value = "/generateConfirmOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult<ConfirmOrderResult> generateConfirmOrder(@RequestParam String cartIds) {
-//         List<Long> list = StringUtil.toLongList(cartIds);
-//         ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(list);
-//         return CommonResult.success(confirmOrderResult);
-//     }
-//
-//
-//     @ApiOperation("再来一单")
-//     @RequestMapping(value = "/oneOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult<ConfirmOrderResult> anotherList(@RequestParam Long orderId) {
-//         OmsOrder order = portalOrderService.getOrderById(orderId);
-//         List<Long> list = StringUtil.toLongList(order.getCartIds());
-//         if (CollectionUtils.isEmpty(list)) {
-//             return CommonResult.failed("库存不足");
-//         }
-//         ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(list);
-//         return CommonResult.success(confirmOrderResult);
-//     }
-//
-//     @ApiOperation("根据购物车信息生成订单")
-//     @RequestMapping(value = "/generateOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult generateOrder(@RequestBody OrderParam orderParam) {
-//         Map<String, Object> result = portalOrderService.generateOrder(orderParam);
-//         return CommonResult.success(result, "下单成功");
-//     }
-//
-//     @ApiOperation("用户支付成功的回调")
-//     @RequestMapping(value = "/paySuccess", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult paySuccess(@RequestParam Long orderId,@RequestParam Integer payType) {
-//         Integer count = portalOrderService.paySuccess(orderId,payType);
-//         return CommonResult.success(count, "支付成功");
-//     }
-//
-//     @ApiOperation("自动取消超时订单")
-//     @RequestMapping(value = "/cancelTimeOutOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult cancelTimeOutOrder() {
-//         portalOrderService.cancelTimeOutOrder();
-//         return CommonResult.success(null);
-//     }
-//
-//     @ApiOperation("取消单个超时订单")
-//     @RequestMapping(value = "/cancelOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult cancelOrder(Long orderId) {
-//         portalOrderService.sendDelayMessageCancelOrder(orderId);
-//         return CommonResult.success(null);
-//     }
-//
-//     @ApiOperation("按状态分页获取用户订单列表")
-//     @ApiImplicitParam(name = "status", value = "订单状态:-1->全部;0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭",
-//             defaultValue = "-1", allowableValues = "-1,0,1,2,3,4", paramType = "query", dataType = "string")
-//     @RequestMapping(value = "/list", method = RequestMethod.GET)
-//     @ResponseBody
-//     public CommonResult<CommonPage<OmsOrderDetail>> list(@RequestParam String status,
-//                                                    @RequestParam(required = false, defaultValue = "1") Integer pageNum,
-//                                                    @RequestParam(required = false, defaultValue = "5") Integer pageSize) {
-//         CommonPage<OmsOrderDetail> orderPage = portalOrderService.list(status,pageNum,pageSize);
-//         return CommonResult.success(orderPage);
-//     }
-//
-//     @ApiOperation("根据ID获取订单详情")
-//     @RequestMapping(value = "/detail/{orderId}", method = RequestMethod.GET)
-//     @ResponseBody
-//     public CommonResult<OmsOrderDetail> detail(@PathVariable Long orderId) {
-//         OmsOrderDetail orderDetail = portalOrderService.detail(orderId);
-//         return CommonResult.success(orderDetail);
-//     }
-//
-//
-//     @ApiOperation("根据订单号获取订单详情")
-//     @RequestMapping(value = "/detail/sn/{orderSn}", method = RequestMethod.GET)
-//     @ResponseBody
-//     public CommonResult<OmsOrderDetail> detail(@PathVariable String orderSn) {
-//         OmsOrderDetail orderDetail = portalOrderService.detail(orderSn);
-//         return CommonResult.success(orderDetail);
-//     }
-//
-//     @ApiOperation("用户取消订单")
-//     @RequestMapping(value = "/cancelUserOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult cancelUserOrder(Long orderId) {
-//         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
-//         if (omsOrder == null) {
-//             return CommonResult.failed("未找到订单");
-//         }
-//
-//         DistributedLock.of(redissonClient)
-//                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                , () -> {
-//                                    portalOrderService.cancelOrder(orderId, "用户取消订单", null);
-//                                }, 60L, TimeUnit.SECONDS);
-//         return CommonResult.success(null);
-//     }
-//
-//     @ApiOperation("用户确认收货")
-//     @RequestMapping(value = "/confirmReceiveOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult confirmReceiveOrder(Long orderId) {
-//         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
-//         if (omsOrder == null) {
-//             return CommonResult.failed("未找到订单");
-//         }
-//
-//         DistributedLock.of(redissonClient)
-//                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                , () -> portalOrderService.confirmReceiveOrder(orderId), 60L, TimeUnit.SECONDS);
-//         return CommonResult.success(null);
-//     }
-//
-//     @ApiOperation("用户删除订单")
-//     @RequestMapping(value = "/deleteOrder", method = RequestMethod.POST)
-//     @ResponseBody
-//     public CommonResult deleteOrder(Long orderId) {
-//         portalOrderService.deleteOrder(orderId);
-//         return CommonResult.success(null);
-//     }
-//
-//     @ApiOperation("用户支付成功的回调")
-//     @RequestMapping(value = "/paySuccess/test", method = RequestMethod.GET)
-//     @ResponseBody
-//     public CommonResult paySuccessTest(@RequestParam Long orderId,@RequestParam Integer payType) {
-//         if (!debugMode) {
-//             return CommonResult.failed("当前环境不可使用");
-//         }
-//         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
-//         if (omsOrder == null) {
-//             return CommonResult.failed("未找到订单");
-//         }
-//
-//         DistributedLock.of(redissonClient)
-//                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                , () -> {
-//                                        if (omsOrder.getStatus() == 0 || omsOrder.getStatus() == 6) {
-//                                            portalOrderService.paySuccess(orderId, payType);
-//
-//                                        } else {
-//                                            throw new BizException("订单已支付或已取消");
-//                                        }
-//                                }, 60L, TimeUnit.SECONDS);
-//         return CommonResult.success("支付成功");
-//     }
-//
-//     @ApiOperation("用户取消订单")
-//     @GetMapping(value = "/cancelUserOrder/test")
-//     @ResponseBody
-//     public CommonResult cancelUserOrderTest(@RequestParam Long orderId) {
-//
-//         if (!debugMode) {
-//             return CommonResult.failed("当前环境不可使用");
-//         }
-//
-//         OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
-//         if (omsOrder == null) {
-//             return CommonResult.failed("未找到订单");
-//         }
-//
-//         DistributedLock.of(redissonClient)
-//                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                , () -> {
-//                                    portalOrderService.cancelOrder(orderId, "用户取消订单", null);
-//                                }, 60L, TimeUnit.SECONDS);
-//         return CommonResult.success(null);
-//     }
-// }
+package com.yonge.cooleshow.portal.controller;
+
+import com.ym.mec.common.exception.BizException;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.api.CommonResult;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mall.common.util.DistributedLock;
+import com.yonge.cooleshow.mall.common.util.StringUtil;
+import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.UmsMember;
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
+import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
+import com.yonge.cooleshow.portal.domain.OrderParam;
+import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 订单管理Controller
+ * Created by macro on 2018/8/30.
+ */
+@Controller
+@Api(tags = "OmsPortalOrderController 订单管理")
+@RequestMapping("/order")
+public class OmsPortalOrderController {
+    @Autowired
+    private OmsPortalOrderService portalOrderService;
+    @Autowired
+    private UmsMemberService memberService;
+
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
+
+    @Value("${message.debugMode}")
+    private boolean debugMode;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @ApiOperation("根据购物车信息生成确认单")
+    @RequestMapping(value = "/generateConfirmOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<ConfirmOrderResult> generateConfirmOrder(@RequestParam String cartIds) {
+        List<Long> list = StringUtil.toLongList(cartIds);
+        ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(list);
+        return CommonResult.success(confirmOrderResult);
+    }
+
+
+    @ApiOperation("再来一单")
+    @RequestMapping(value = "/oneOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<ConfirmOrderResult> anotherList(@RequestParam Long orderId) {
+        OmsOrder order = portalOrderService.getOrderById(orderId);
+        List<Long> list = StringUtil.toLongList(order.getCartIds());
+        if (CollectionUtils.isEmpty(list)) {
+            return CommonResult.failed("库存不足");
+        }
+        ConfirmOrderResult confirmOrderResult = portalOrderService.generateConfirmOrder(list);
+        return CommonResult.success(confirmOrderResult);
+    }
+
+    @ApiOperation("根据购物车信息生成订单")
+    @RequestMapping(value = "/generateOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult generateOrder(@RequestBody OrderParam orderParam) {
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
+        return CommonResult.success(result[0], "下单成功");
+    }
+
+
+    @ApiOperation("根据购物车信息生成订单")
+    @RequestMapping(value = "/teacher/generateOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
+        UmsMember currentMember = memberService.getCurrentMember();
+        orderParam.setTeacherId(currentMember.getId());
+        final Map<String, Object>[] result = new Map[]{new HashMap<>()};
+        if (StringUtil.isEmpty(orderParam.getOrderNo())) {
+            result[0] = portalOrderService.generateOrder(orderParam);
+        }  else {
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderParam.getOrderNo()), () -> {
+                               result[0] = portalOrderService.generateOrder(orderParam);
+                           }, 60L, TimeUnit.SECONDS);
+        }
+        return CommonResult.success(result[0], "下单成功");
+    }
+
+    @ApiOperation("用户支付成功的回调")
+    @RequestMapping(value = "/paySuccess", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult paySuccess(@RequestParam Long orderId,@RequestParam Integer payType) {
+        Integer count = portalOrderService.paySuccess(orderId,payType);
+        return CommonResult.success(count, "支付成功");
+    }
+
+    @ApiOperation("自动取消超时订单")
+    @RequestMapping(value = "/cancelTimeOutOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult cancelTimeOutOrder() {
+        portalOrderService.cancelTimeOutOrder();
+        return CommonResult.success(null);
+    }
+
+
+    @ApiOperation("根据订单号查询订单信息")
+    @RequestMapping(value = "/adapayNo/list", method = RequestMethod.POST)
+    @ResponseBody
+    public List<OmsOrderDetail> cancelTimeOutOrder(@RequestBody List<String> adapayNoList) {
+        List<OmsOrderDetail> result =  portalOrderService.list(adapayNoList);
+        return result;
+    }
+
+    @ApiOperation("按状态分页获取用户订单列表")
+    @ApiImplicitParam(name = "status", value = "订单状态:-1->全部;0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭",
+            defaultValue = "-1", allowableValues = "-1,0,1,2,3,4", paramType = "query", dataType = "string")
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<CommonPage<OmsOrderDetail>> list(@RequestParam String status,
+                                                   @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                                                   @RequestParam(required = false, defaultValue = "5") Integer pageSize) {
+        CommonPage<OmsOrderDetail> orderPage = portalOrderService.list(status,pageNum,pageSize);
+        return CommonResult.success(orderPage);
+    }
+
+    @ApiOperation("根据ID获取订单详情")
+    @RequestMapping(value = "/detail/{orderId}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<OmsOrderDetail> detail(@PathVariable Long orderId) {
+        OmsOrderDetail orderDetail = portalOrderService.detail(orderId);
+        return CommonResult.success(orderDetail);
+    }
+
+
+    @ApiOperation("根据订单号获取订单详情")
+    @RequestMapping(value = "/detail/sn/{orderSn}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<OmsOrderDetail> detail(@PathVariable String orderSn) {
+        OmsOrderDetail orderDetail = portalOrderService.detail(orderSn);
+        return CommonResult.success(orderDetail);
+    }
+
+    @ApiOperation("用户取消订单")
+    @RequestMapping(value = "/cancelUserOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult cancelUserOrder(Long orderId) {
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                   portalOrderService.cancelOrder(orderId, "用户取消订单");
+                               }, 60L, TimeUnit.SECONDS);
+        return CommonResult.success(null);
+    }
+
+    @ApiOperation("用户确认收货")
+    @RequestMapping(value = "/confirmReceiveOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult confirmReceiveOrder(Long orderId) {
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> portalOrderService.confirmReceiveOrder(orderId), 60L, TimeUnit.SECONDS);
+        return CommonResult.success(null);
+    }
+
+    @ApiOperation("用户删除订单")
+    @RequestMapping(value = "/deleteOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult deleteOrder(Long orderId) {
+        portalOrderService.deleteOrder(orderId);
+        return CommonResult.success(null);
+    }
+
+    @ApiOperation("用户支付成功的回调")
+    @RequestMapping(value = "/paySuccess/test", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult paySuccessTest(@RequestParam Long orderId,@RequestParam Integer payType) {
+        if (!debugMode) {
+            return CommonResult.failed("当前环境不可使用");
+        }
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                       if (true) {
+
+                                           UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                                                   omsOrder.getOrderSn());
+                                           if (orderPayment == null) {
+                                               throw new BizException("未找到支付信息");
+                                           }
+
+                                           portalOrderService.paymentSucceededHandle(orderPayment.getAdapayNo(),omsOrder.getPayAmount(),"wx_pub");
+
+                                       } else {
+                                           throw new BizException("订单已支付或已取消");
+                                       }
+                               }, 60L, TimeUnit.SECONDS);
+        return CommonResult.success("支付成功");
+    }
+
+    @ApiOperation("用户取消订单")
+    @GetMapping(value = "/cancelUserOrder/test")
+    @ResponseBody
+    public CommonResult cancelUserOrderTest(@RequestParam Long orderId) {
+
+        if (!debugMode) {
+            return CommonResult.failed("当前环境不可使用");
+        }
+
+        OmsOrder omsOrder = portalOrderService.getOrderById(orderId);
+        if (omsOrder == null) {
+            return CommonResult.failed("未找到订单");
+        }
+
+        DistributedLock.of(redissonClient)
+                       .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                               , () -> {
+                                   portalOrderService.cancelOrder(orderId, "用户取消订单");
+                               }, 60L, TimeUnit.SECONDS);
+        return CommonResult.success(null);
+    }
+}

+ 135 - 182
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -1,182 +1,135 @@
-// package com.yonge.cooleshow.portal.controller;
-//
-// import com.alibaba.fastjson.JSON;
-// 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.ym.mec.common.exception.BizException;
-// import com.ym.mec.util.web.WebUtil;
-// import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
-// import com.yonge.cooleshow.mbg.model.UserOrderPayment;
-// import com.yonge.cooleshow.portal.dto.OrderPayReq;
-// import com.yonge.cooleshow.portal.dto.OrderPayRes;
-// import com.yonge.cooleshow.portal.service.OmsPortalOrderReturnApplyService;
-// import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
-// import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
-// import io.swagger.annotations.Api;
-// import io.swagger.annotations.ApiOperation;
-// import org.redisson.api.RLock;
-// import org.redisson.api.RedissonClient;
-// import org.slf4j.Logger;
-// import org.slf4j.LoggerFactory;
-// import org.springframework.beans.factory.annotation.Autowired;
-// import org.springframework.http.HttpStatus;
-// import org.springframework.web.bind.annotation.*;
-//
-// import javax.servlet.http.HttpServletRequest;
-// import javax.validation.Valid;
-// import java.util.Map;
-// import java.util.concurrent.TimeUnit;
-//
-// /**
-//  * @Author: liweifan
-//  * @Data: 2022/3/11 18:16
-//  */
-// @RestController
-// @RequestMapping("/payment")
-// @Api(value = "付款接口", tags = "付款接口")
-// public class PaymentController extends BaseController {
-//     private final static Logger log = LoggerFactory.getLogger(PaymentController.class);
-//
-//     @Autowired
-//     private SysUserFeignService sysUserFeignService;
-//     @Autowired
-//     private PaymentClient paymentClient;
-//     @Autowired
-//     private PaymentProperties paymentProperties;
-//
-//     @Autowired
-//     private OmsPortalOrderService orderService;
-//
-//     @Autowired
-//     private UserOrderPaymentService userOrderPaymentService;
-//
-//     @Autowired
-//     private OmsPortalOrderReturnApplyService portalOrderReturnApplyService;
-//
-//     @Autowired
-//     private RedissonClient redissonClient;
-//
-//     @ApiOperation(value = "订单付款")
-//     @PostMapping("/orderPay")
-//     public HttpResponseResult<OrderPayRes> orderPay(@Valid @RequestBody OrderPayReq payReq, HttpServletRequest request) {
-//         SysUser user = sysUserFeignService.queryUserInfo();
-//         if (user == null || null == user.getId()) {
-//             return failed(HttpStatus.FORBIDDEN, "请登录");
-//         }
-//         payReq.setUserId(user.getId().longValue());
-//         payReq.setIpAddress(WebUtil.getRemoteIp(request));
-//
-//         RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(payReq.getOrderNo()));
-//         try {
-//             boolean b = lock.tryLock(60, TimeUnit.SECONDS);
-//             if (b) {
-//                 OrderPayRes orderPayRes = orderService.orderPay(payReq);
-//                 if (orderPayRes.isStatus()) {
-//                     return succeed(orderPayRes);
-//                 } else {
-//                     return failed(orderPayRes.getMessage());
-//                 }
-//             }
-//             return failed("请求超时");
-//         } catch (BizException e) {
-//             return failed(e.getMessage());
-//         } catch (Exception e) {
-//             e.printStackTrace();
-//             return HttpResponseResult.failed("付款失败");
-//         } finally {
-//             if (lock.getHoldCount()>0) {
-//                 lock.unlock();
-//             }
-//         }
-//     }
-//
-//     @ApiOperation(value = "查询付款单")
-//     @GetMapping("/queryPayment")
-//     public HttpResponseResult<Payment> queryPayment(String paymentNo) {
-//         UserOrderPayment userOrderPayment = userOrderPaymentService.getByTranNo(paymentNo);
-//         if (null == userOrderPayment) {
-//             return HttpResponseResult.succeed();
-//         }
-//         Payment param = new Payment(OpenEnum.valueOf(userOrderPayment.getOpenType()),
-//                 PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
-//         param.setId(userOrderPayment.getTransNo());
-//         param.setPaymentNo(userOrderPayment.getAdapayNo());
-//         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
-//         return HttpResponseResult.status(paymentBaseResult);
-//     }
-//
-//     @ApiOperation(value = "通过用户给的授权码获取三方支付授权信息")
-//     @GetMapping("/getOpenId")
-//     public HttpResponseResult<Map<String, Object>> getOpenId(OpenAuth openAuth) {
-//         SysUser user = sysUserFeignService.queryUserInfo();
-//         if (user == null || null == user.getId()) {
-//             return failed(HttpStatus.FORBIDDEN, "请登录");
-//         }
-//         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-//         openAuth.setOpenType(openType);
-//         BaseResult<Map<String, Object>> res = paymentClient.getOpenAuthMsg(openAuth);
-//         return status(res);
-//     }
-//
-//     /***
-//      * 支付回调
-//      * @author liweifan
-//      * @param: request
-//      * @updateTime 2022/3/11 18:35
-//      */
-//     @RequestMapping("/callback/{openType}/{client}/{payChannel}/{payMethod}")
-//     public Object callback(
-//             @PathVariable("openType") String openType,
-//             @PathVariable("client") String client,
-//             @PathVariable("payChannel") String payChannel,
-//             @PathVariable("payMethod") String payMethod,
-//             HttpServletRequest request
-//     ) {
-//         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
-//                 OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
-//                 PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
-//         log.info("支付回调整理后的信息 : {}", JSON.toJSONString(res));
-//         if (res.getStatus()) {
-//             PaymentCallBack data = res.getData();
-//
-//             UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
-//             if (userOrderPayment != null) {
-//                 RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(userOrderPayment.getOrderNo()));
-//                 try {
-//                     boolean b = lock.tryLock(60, TimeUnit.SECONDS);
-//                     if (b) {
-//                         if (MethodNameEnum.executePayment.equals(data.getMethodName())) {
-//                             //支付交易
-//                             orderService.executePaymentCallBack(data);
-//                         } else if (MethodNameEnum.closePayment.equals(data.getMethodName())) {
-//                             //关闭订单
-//                             orderService.closePaymentCallBack(data);
-//                         }
-//                     } else {
-//                         return failed("请求超时");
-//                     }
-//                 }catch (Exception e) {
-//                     e.printStackTrace();
-//                     return failed("付款失败");
-//                 } finally {
-//                     if (lock.getHoldCount()>0) {
-//                         lock.unlock();
-//                     }
-//                 }
-//             }
-//             try {
-//                 if (MethodNameEnum.refundPayment.equals(data.getMethodName())) {
-//                     //退款
-//                     portalOrderReturnApplyService.refundPaymentCallBack(data);
-//                 }
-//             } catch (Exception e) {
-//                 e.printStackTrace();
-//             }
-//
-//         }
-//         return res.getData().getResMsg();
-//     }
-//
-// }
+package com.yonge.cooleshow.portal.controller;
+
+import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.AdapayCore;
+import com.huifu.adapay.core.util.AdapaySign;
+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.ym.mec.common.exception.BizException;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.portal.dto.OrderPayRes;
+import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/3/11 18:16
+ */
+@RestController
+@RequestMapping("/payment")
+@Api(value = "付款接口", tags = "付款接口")
+public class PaymentController extends BaseController {
+    private final static Logger log = LoggerFactory.getLogger(PaymentController.class);
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private OmsPortalOrderService orderService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+
+
+    /***
+     * 支付回调
+     * @author liweifan
+     * @param: request
+     * @updateTime 2022/3/11 18:35
+     */
+    @RequestMapping("/callback")
+    public Object callback( HttpServletRequest request) {
+        try {
+            // 验签请参data
+            String data = request.getParameter("data");
+            // 验签请参sign
+            String sign = request.getParameter("sign");
+
+            log.info("callback request param:{}", data);
+
+            // 验签
+            if (AdapaySign.verifySign(data, sign, AdapayCore.PUBLIC_KEY)) {
+
+                JSONObject dataObj = JSON.parseObject(data);
+
+                String transType = request.getParameter("type");
+
+
+                RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(dataObj.getString("order_no")));
+                try {
+                    boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+
+                    if (b) {
+
+                        switch (transType) {
+                            case "payment.succeeded":// 支付成功
+
+                                orderService.paymentSucceededHandle(dataObj.getString("order_no"),
+                                                   dataObj.getBigDecimal("pay_amt"),dataObj.getString("pay_channel"));
+
+                                break;
+
+                            case "payment.failed":// 支付失败
+
+                                Map<String,Object> notifyMap = new HashMap<>();
+
+                                notifyMap.put("channelType", dataObj.getString("pay_channel"));
+                                notifyMap.put("tradeState", "0");
+                                notifyMap.put("totalMoney", dataObj.getString("pay_amt"));
+                                notifyMap.put("merOrderNo", dataObj.getString("order_no"));
+                                orderService.paymentFailedHandle(dataObj.getString("order_no"),notifyMap);
+
+                                break;
+                            case "payment_reverse.succeeded" :
+
+                                orderService.paymentRefundSucceededHandle(dataObj.getString("payment_id")
+                                                , dataObj.getString("reverse_amt"), dataObj.getString("id"), BigDecimal.ZERO.toString());
+                                break;
+                            case "payment_reverse.failed" :
+
+                                orderService.paymentRefundFailedHandle(dataObj.getString("payment_id")
+                                        ,dataObj.getString("error_msg"),dataObj.getString("id"));
+                            default:
+                                break;
+                        }
+                    } else {
+                        return failed("请求超时");
+                    }
+                }catch (Exception e) {
+                    e.printStackTrace();
+                    return failed("请求超时");
+                }
+            } else {
+                return "验签失败";
+            }
+        } catch (Exception e) {
+            return e.getMessage();
+        }
+
+        return "succeeded";
+    }
+
+}

+ 14 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/UmsMemberReceiveAddressController.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.ym.mec.common.exception.BizException;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mbg.model.UmsMemberReceiveAddress;
 import com.yonge.cooleshow.portal.service.UmsMemberReceiveAddressService;
@@ -9,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -63,6 +65,18 @@ public class UmsMemberReceiveAddressController {
         return CommonResult.success(addressList);
     }
 
+
+    @ApiOperation("显示指定用户的收货地址")
+    @RequestMapping(value = "/list/{userId}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<List<UmsMemberReceiveAddress>> list(@PathVariable Long userId) {
+        if (userId == null) {
+            return CommonResult.success(new ArrayList<>());
+        }
+        List<UmsMemberReceiveAddress> addressList = memberReceiveAddressService.listByUserId(userId);
+        return CommonResult.success(addressList);
+    }
+
     @ApiOperation("获取收货地址详情")
     @RequestMapping(value = "/{id}", method = RequestMethod.GET)
     @ResponseBody

+ 3 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java

@@ -1,5 +1,6 @@
 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 org.apache.ibatis.annotations.Param;
@@ -38,4 +39,6 @@ public interface PortalOrderDao {
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     int releaseProductStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
+
+    List<OmsOrder> listByAdapayNo(@Param("alapayNoList") List<String> alapayNoList, @Param("adapayNos") String adapayNos);
 }

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

@@ -28,6 +28,38 @@ public class OrderParam {
     @ApiModelProperty("订单金额")
     private BigDecimal orderAmount;
 
+    @ApiModelProperty("代码用户id 需要代买时传购买用户id")
+    private Long  userId;
+
+    private Long teacherId;
+
+    @ApiModelProperty("订单号 重复支付传订单号")
+    private String orderNo;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
     public BigDecimal getOrderAmount() {
         return orderAmount;
     }

+ 0 - 93
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderPayReq.java

@@ -1,93 +0,0 @@
-package com.yonge.cooleshow.portal.dto;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-/**
- * 下单支付请求
- *
- * @Author: liweifan
- * @Data: 2022/3/31 14:55
- */
-@ApiModel(value = "OrderPayReq对象", description = "下单支付请求")
-public class OrderPayReq {
-    @NotBlank(message = "订单号不能为空")
-    @ApiModelProperty(value = "订单号 ", required = true)
-    private String orderNo;
-    @NotNull(message = "支付渠道不能为空")
-    @ApiModelProperty(value = "支付渠道:  alipay 支付宝扫码 ali_app 支付宝APP  wx_app 微信APP wx_lite 微信小程序支付", required = true)
-    private String payChannel;
-    @ApiModelProperty(value = "微信用户openId(微信支付必传)")
-    private String openId;
-    @ApiModelProperty(value = "买家的支付宝用户 id(支付宝小程序支付必传)")
-    private String buyerId;
-    @ApiModelProperty(value = "用户说明 ")
-    private String reason;
-
-    @ApiModelProperty(value = "付款应用 STUDENT 学生端 TEACHER 老师端 (对应微信,支付宝平台的应用)",required = true)
-    @NotBlank(message = "付款应用不能为空")
-    private String paymentClient;
-
-    private Long userId;
-    private String ipAddress;
-
-    public String getOrderNo() {
-        return orderNo;
-    }
-
-    public void setOrderNo(String orderNo) {
-        this.orderNo = orderNo;
-    }
-
-
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public String getIpAddress() {
-        return ipAddress;
-    }
-
-    public void setIpAddress(String ipAddress) {
-        this.ipAddress = ipAddress;
-    }
-
-    public String getOpenId() {
-        return openId;
-    }
-
-    public void setOpenId(String openId) {
-        this.openId = openId;
-    }
-
-    public String getReason() {
-        return reason;
-    }
-
-    public void setReason(String reason) {
-        this.reason = reason;
-    }
-
-    public String getBuyerId() {
-        return buyerId;
-    }
-
-    public void setBuyerId(String buyerId) {
-        this.buyerId = buyerId;
-    }
-
-    public String getPaymentClient() {
-        return paymentClient;
-    }
-
-    public void setPaymentClient(String paymentClient) {
-        this.paymentClient = paymentClient;
-    }
-}

+ 6 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java

@@ -59,4 +59,10 @@ public interface OmsCartItemService {
     int clear(Long memberId);
 
     OmsCartItem get(Long id);
+
+    /**
+     * 添加购物车
+     */
+    @Transactional
+    List<OmsCartItem> addAll(List<OmsCartItem> cartItemList);
 }

+ 119 - 128
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -1,128 +1,119 @@
-// package com.yonge.cooleshow.portal.service;
-//
-// import com.yonge.cooleshow.mall.common.api.CommonPage;
-// import com.yonge.cooleshow.mbg.model.OmsOrder;
-// import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
-// import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
-// import com.yonge.cooleshow.portal.domain.OrderParam;
-// import com.yonge.cooleshow.portal.dto.OrderPayReq;
-// import com.yonge.cooleshow.portal.dto.OrderPayRes;
-// import org.springframework.transaction.annotation.Transactional;
-//
-// import java.util.List;
-// import java.util.Map;
-//
-// /**
-//  * 前台订单管理Service
-//  * Created by macro on 2018/8/30.
-//  */
-// public interface OmsPortalOrderService {
-//     /**
-//      * 根据用户购物车信息生成确认单信息
-//      * @param cartIds
-//      */
-//     ConfirmOrderResult generateConfirmOrder(List<Long> cartIds);
-//
-//     /**
-//      * 根据提交信息生成订单
-//      */
-//     @Transactional
-//     Map<String, Object> generateOrder(OrderParam orderParam);
-//
-//     /**
-//      * 支付成功后的回调
-//      */
-//     @Transactional
-//     Integer paySuccess(Long orderId, Integer payType);
-//
-//     /**
-//      * 自动取消超时订单
-//      */
-//     @Transactional
-//     Integer cancelTimeOutOrder();
-//
-//     /**
-//      * 取消单个超时订单
-//      */
-//     @Transactional
-//     void cancelOrder(Long orderId, String message, PaymentCallBack data);
-//
-//     /**
-//      * 发送延迟消息取消订单
-//      */
-//     @Transactional
-//     void sendDelayMessageCancelOrder(Long orderId);
-//
-//     /**
-//      * 确认收货
-//      */
-//     @Transactional
-//     void confirmReceiveOrder(Long orderId);
-//
-//     /**
-//      * 分页获取用户订单
-//      */
-//     CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize);
-//
-//     /**
-//      * 根据订单ID获取订单详情
-//      */
-//     OmsOrderDetail detail(Long orderId);
-//
-//     OmsOrderDetail detail(String orderSn);
-//
-//     /**
-//      * 用户根据订单ID删除订单
-//      */
-//     @Transactional
-//     void deleteOrder(Long orderId);
-//
-//     /**
-//      * 订单拉起支付
-//      *
-//      * @param payReq 支付信息
-//      * @return
-//      */
-//     @Transactional
-//     OrderPayRes orderPay(OrderPayReq payReq);
-//     /**
-//      * 获取订单信息
-//      *
-//      * @param orderId 订单号
-//      * @return
-//      */
-//     OmsOrder getOrderById(Long orderId);
-//
-//     /**
-//      * 支付回调
-//      *
-//      * @param data
-//      */
-//     @Transactional
-//     void executePaymentCallBack(PaymentCallBack data);
-//
-//     /**
-//      * 关闭订单
-//      *
-//      * @param data
-//      */
-//     @Transactional
-//     void closePaymentCallBack(PaymentCallBack data);
-//
-//
-//     /**
-//      * 设置自动收货
-//      *
-//      * @return
-//      */
-//     @Transactional
-//     Integer autoReceive();
-//
-//     /**
-//      * 设置分润,不可申请售后
-//      *
-//      * @return
-//      */
-//     @Transactional
-//     Integer shareProfit();
-// }
+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;
+import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
+import com.yonge.cooleshow.portal.domain.OrderParam;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 前台订单管理Service
+ * Created by macro on 2018/8/30.
+ */
+public interface OmsPortalOrderService {
+    /**
+     * 根据用户购物车信息生成确认单信息
+     * @param cartIds
+     */
+    ConfirmOrderResult generateConfirmOrder(List<Long> cartIds);
+
+    /**
+     * 根据提交信息生成订单
+     */
+    @Transactional
+    Map<String, Object> generateOrder(OrderParam orderParam);
+
+    /**
+     * 支付成功后的回调
+     */
+    @Transactional
+    Integer paySuccess(Long orderId, Integer payType);
+
+    /**
+     * 自动取消超时订单
+     */
+    @Transactional
+    Integer cancelTimeOutOrder();
+
+    /**
+     * 取消单个超时订单
+     */
+    @Transactional
+    void cancelOrder(Long orderId, String message);
+
+    /**
+     * 发送延迟消息取消订单
+     */
+    @Transactional
+    void sendDelayMessageCancelOrder(Long orderId);
+
+    /**
+     * 确认收货
+     */
+    @Transactional
+    void confirmReceiveOrder(Long orderId);
+
+    /**
+     * 分页获取用户订单
+     */
+    CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize);
+
+    /**
+     * 根据订单ID获取订单详情
+     */
+    OmsOrderDetail detail(Long orderId);
+
+    OmsOrderDetail detail(String orderSn);
+
+    /**
+     * 用户根据订单ID删除订单
+     */
+    @Transactional
+    void deleteOrder(Long orderId);
+
+    /**
+     * 获取订单信息
+     *
+     * @param orderId 订单号
+     * @return
+     */
+    OmsOrder getOrderById(Long orderId);
+
+
+    /**
+     * 设置自动收货
+     *
+     * @return
+     */
+    @Transactional
+    Integer autoReceive();
+
+    /**
+     * 设置分润,不可申请售后
+     *
+     * @return
+     */
+    @Transactional
+    Integer shareProfit();
+
+    void paymentSucceededHandle(String orderNo, BigDecimal payAmount, String payChannel);
+
+    void paymentFailedHandle(String orderNo, Map<String, Object> notifyMap);
+
+    /**
+     * 根据支付订单号查询订单列表
+     */
+    List<OmsOrderDetail> list(List<String> adapayNoList);
+
+    @Transactional
+    void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo,String feeAmt);
+
+    @Transactional
+    void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo);
+}

+ 2 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberReceiveAddressService.java

@@ -41,4 +41,6 @@ public interface UmsMemberReceiveAddressService {
      * @param id 地址id
      */
     UmsMemberReceiveAddress getItem(Long id);
+
+    List<UmsMemberReceiveAddress> listByUserId(Long userId);
 }

+ 47 - 78
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -1,78 +1,47 @@
-// package com.yonge.cooleshow.portal.service;
-//
-// import com.yonge.cooleshow.mbg.model.UserOrderPayment;
-// import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-// import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-// import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
-// import org.springframework.transaction.annotation.Transactional;
-//
-// import java.util.List;
-//
-// /**
-//  * Description
-//  *
-//  * @author liujunchi
-//  * @date 2022-04-24
-//  */
-// public interface UserOrderPaymentService {
-//
-//     /**
-//      *  根据订单查询
-//      *
-//      * @param paymentId 交易流水号
-//      * @return
-//      */
-//     UserOrderPayment getByTranNo(String paymentId);
-//
-//     /**
-//      * 保存订单记录
-//      *
-//      * @param userOrderPayment
-//      */
-//     @Transactional
-//     void save(UserOrderPayment userOrderPayment);
-//
-//     @Transactional
-//     void saveOrUpdate(UserOrderPayment userOrderPayment);
-//
-//     UserOrderPayment getByOrderNo(String orderSn, PayChannelEnum payChannel, TradeStatusEnum pending);
-//
-//     /**
-//      * 根据订单查询 订单支付信息
-//      *
-//      * @param orderSn 订单号
-//      * @return
-//      */
-//     List<UserOrderPayment> getByOrderNo(String orderSn);
-//
-//     /**
-//      * 关单
-//      *  @param orderSn 订单号
-//      * @param message 信息
-//      * @param data
-//      */
-//     @Transactional
-//     void closePayment(String orderSn, String message, PaymentCallBack data);
-//
-//     /**
-//      * 查询支付中的订单, 最多只有一个
-//      *
-//      * @param orderSn
-//      * @return
-//      */
-//     UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
-//
-//
-//     /**
-//      * 查询支付成功的订单, 最多只有一个
-//      *
-//      * @param orderSn
-//      * @return
-//      */
-//     UserOrderPayment getByOrderNoAndStatusSucceeded(String orderSn);
-//
-//     /**
-//      * 查询回调支付信息
-//      */
-//     UserOrderPayment getByAdapayNo(String paymentNo);
-// }
+package com.yonge.cooleshow.portal.service;
+
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-24
+ */
+public interface UserOrderPaymentService {
+
+    /**
+     * 保存订单记录
+     *
+     * @param userOrderPayment
+     */
+    @Transactional
+    void save(UserOrderPayment userOrderPayment);
+
+    @Transactional
+    void saveOrUpdate(UserOrderPayment userOrderPayment);
+
+    /**
+     * 根据订单查询 订单支付信息
+     *
+     * @param orderSn 订单号
+     * @return
+     */
+    List<UserOrderPayment> getByOrderNo(String orderSn);
+
+    /**
+     * 查询支付中的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
+
+    /**
+     * 查询回调支付信息
+     */
+    UserOrderPayment getByAdapayNo(String paymentNo);
+}

+ 19 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -46,7 +46,15 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
 
     @Override
     public OmsCartItem add(OmsCartItem cartItem) {
-        UmsMember currentMember =memberService.getCurrentMember();
+        UmsMember currentMember;
+        if(cartItem.getMemberId() != null) {
+            currentMember = memberService.getById(cartItem.getMemberId());
+            if (currentMember == null) {
+                throw new BizException("未找到用户信息");
+            }
+        } else {
+            currentMember = memberService.getCurrentMember();
+        }
         cartItem.setMemberId(currentMember.getId());
         cartItem.setMemberNickname(currentMember.getNickname());
         cartItem.setDeleteStatus(0);
@@ -228,4 +236,14 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     public OmsCartItem get(Long id) {
         return cartItemMapper.selectByPrimaryKey(id);
     }
+
+    @Override
+    public List<OmsCartItem> addAll(List<OmsCartItem> cartItemList) {
+        List<OmsCartItem> result = new ArrayList<>();
+        for (OmsCartItem omsCartItem : cartItemList) {
+            OmsCartItem cartItem = add(omsCartItem);
+            result.add(cartItem);
+        }
+        return result;
+    }
 }

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

@@ -1,1444 +1,1341 @@
-// package com.yonge.cooleshow.portal.service.impl;
-//
-// import cn.hutool.core.bean.BeanUtil;
-// import cn.hutool.core.collection.CollUtil;
-// import com.alibaba.fastjson.JSON;
-// import com.github.pagehelper.PageHelper;
-// import com.ym.mec.common.service.IdGeneratorService;
-// import com.yonge.cooleshow.mall.common.api.CommonPage;
-// import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
-// import com.yonge.cooleshow.mall.common.exception.Asserts;
-// import com.yonge.cooleshow.mall.common.service.RedisService;
-// import com.yonge.cooleshow.mbg.mapper.*;
-// import com.yonge.cooleshow.mbg.model.*;
-// 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.OrderPayReq;
-// import com.yonge.cooleshow.portal.dto.OrderPayRes;
-// import com.yonge.cooleshow.portal.service.*;
-// import org.redisson.api.RedissonClient;
-// import org.slf4j.Logger;
-// import org.slf4j.LoggerFactory;
-// 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.math.BigDecimal;
-// import java.math.RoundingMode;
-// import java.time.LocalDateTime;
-// import java.time.ZoneId;
-// import java.util.*;
-// import java.util.concurrent.TimeUnit;
-// import java.util.stream.Collectors;
-//
-// /**
-//  * 前台订单管理Service
-//  * Created by macro on 2018/8/30.
-//  */
-// @Service
-// public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
-//
-//     private static final Logger LOG = LoggerFactory.getLogger(OmsPortalOrderServiceImpl.class);
-//     @Autowired
-//     private UmsMemberService memberService;
-//     @Autowired
-//     private OmsCartItemService cartItemService;
-//     @Autowired
-//     private UmsMemberReceiveAddressService memberReceiveAddressService;
-//     @Autowired
-//     private UmsMemberCouponService memberCouponService;
-//     @Autowired
-//     private UmsIntegrationConsumeSettingMapper integrationConsumeSettingMapper;
-//     @Autowired
-//     private PmsSkuStockMapper skuStockMapper;
-//
-//     @Autowired
-//     private OmsOrderMapper orderMapper;
-//     @Autowired
-//     private PortalOrderItemDao orderItemDao;
-//     @Autowired
-//     private SmsCouponHistoryMapper couponHistoryMapper;
-//     @Autowired
-//     private RedisService redisService;
-//     private String REDIS_KEY_ORDER_ID = "redis.key.orderId";
-//     private String REDIS_DATABASE = "redis.database";
-//     @Autowired
-//     private PortalOrderDao portalOrderDao;
-//
-//     @Autowired
-//     private IdGeneratorService idGeneratorService;
-//
-//     @Autowired
-//     private OmsOrderSettingMapper orderSettingMapper;
-//     @Autowired
-//     private OmsOrderItemMapper orderItemMapper;
-//     @Autowired
-//     private CancelOrderSender cancelOrderSender;
-//
-//     @Autowired
-//     private AdminFeignService adminFeignService;
-//     @Autowired
-//     private UserOrderPaymentService userOrderPaymentService;
-//
-//     @Autowired(required = true)
-//     private PaymentClient paymentClient;
-//
-//     @Autowired
-//     private PaymentProperties paymentProperties;
-//
-//     @Autowired
-//     private PmsProductMapper pmsProductMapper;
-//
-//     @Autowired
-//     private UserOrderRefundMapper userOrderRefundMapper;
-//
-//     @Autowired
-//     private RedissonClient redissonClient;
-//
-//
-//     @Autowired
-//     private PortalProductDao productDao;
-//
-//     @Override
-//     public ConfirmOrderResult generateConfirmOrder(List<Long> cartIds) {
-//         ConfirmOrderResult result = new ConfirmOrderResult();
-//         //获取购物车信息
-//         UmsMember currentMember = memberService.getCurrentMember();
-//         List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds,
-//                                                                                       true);
-//         result.setCartPromotionItemList(cartPromotionItemList);
-//         //获取用户收货地址列表
-//         List<UmsMemberReceiveAddress> memberReceiveAddressList = memberReceiveAddressService.list();
-//         result.setMemberReceiveAddressList(memberReceiveAddressList);
-//         //获取用户可用优惠券列表
-//         List<SmsCouponHistoryDetail> couponHistoryDetailList = memberCouponService.listCart(cartPromotionItemList, 1);
-//         result.setCouponHistoryDetailList(couponHistoryDetailList);
-//         //获取用户积分
-//         result.setMemberIntegration(currentMember.getIntegration());
-//         //获取积分使用规则
-//         UmsIntegrationConsumeSetting integrationConsumeSetting = integrationConsumeSettingMapper.selectByPrimaryKey(1L);
-//         result.setIntegrationConsumeSetting(integrationConsumeSetting);
-//         //计算总金额、活动优惠、应付金额
-//         ConfirmOrderResult.CalcAmount calcAmount = calcCartAmount(cartPromotionItemList);
-//         result.setCalcAmount(calcAmount);
-//         return result;
-//     }
-//
-//     @Override
-//     public Map<String, Object> generateOrder(OrderParam orderParam) {
-//         if (orderParam.getOrderAmount() == null) {
-//             throw new BizException("订单金额校验不通过");
-//         }
-//         List<OmsOrderItem> orderItemList = new ArrayList<>();
-//         //获取购物车及优惠信息
-//         UmsMember currentMember = memberService.getCurrentMember();
-//         List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(),
-//                                                                                       orderParam.getCartIds(), true);
-//         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-//             //生成下单商品信息
-//             OmsOrderItem orderItem = new OmsOrderItem();
-//             orderItem.setProductId(cartPromotionItem.getProductId());
-//             orderItem.setProductName(cartPromotionItem.getProductName());
-//             orderItem.setProductPic(cartPromotionItem.getProductPic());
-//             orderItem.setProductAttr(cartPromotionItem.getProductAttr());
-//             orderItem.setProductBrand(cartPromotionItem.getProductBrand());
-//             orderItem.setProductSn(cartPromotionItem.getProductSn());
-//             orderItem.setProductPrice(cartPromotionItem.getPrice());
-//             orderItem.setProductQuantity(cartPromotionItem.getQuantity());
-//             orderItem.setProductSkuId(cartPromotionItem.getProductSkuId());
-//             orderItem.setProductSkuCode(cartPromotionItem.getProductSkuCode());
-//             orderItem.setProductCategoryId(cartPromotionItem.getProductCategoryId());
-//             orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
-//             orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
-//             orderItem.setGiftIntegration(cartPromotionItem.getIntegration());
-//             orderItem.setGiftGrowth(cartPromotionItem.getGrowth());
-//             orderItem.setPromoterId(cartPromotionItem.getPromoterId());
-//             orderItemList.add(orderItem);
-//         }
-//         //判断购物车中商品是否都有库存
-//         if (!hasStock(cartPromotionItemList)) {
-//             Asserts.fail("库存不足,无法下单");
-//         }
-//         BigDecimal couponAmount = BigDecimal.ZERO;
-//         //判断使用使用了优惠券
-//         if (StringUtil.isEmpty(orderParam.getCouponId())) {
-//             //不用优惠券
-//             for (OmsOrderItem orderItem : orderItemList) {
-//                 orderItem.setCouponAmount(new BigDecimal(0));
-//             }
-//         } else {
-//             // todo 使用优惠券 远程调用获取优惠券金额
-//             // SmsCouponHistoryDetail couponHistoryDetail = getUseCoupon(cartPromotionItemList, orderParam.getCouponId());
-//             //     if (couponHistoryDetail == null) {
-//             //         Asserts.fail("该优惠券不可用");
-//             // }
-//             //对下单商品的优惠券进行处理
-//             HttpResponseResult<CouponInfoApi> couponInfoApiHttpResponseResult = adminFeignService.queryCouponOrderPageInfo(
-//                     currentMember.getId(), orderParam.getCouponId(), orderParam.getOrderAmount(),
-//                     orderParam.getPlatformType());
-//             CouponInfoApi data = couponInfoApiHttpResponseResult.getData();
-//             if(data != null) {
-//                 couponAmount = data.getDiscountedPrices();
-//             }
-//             if (couponAmount.compareTo(orderParam.getOrderAmount()) > 0) {
-//                 couponAmount = orderParam.getOrderAmount();
-//             }
-//             handleCouponAmount(orderItemList, couponAmount);
-//         }
-//         //判断是否使用积分
-//         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);
-//                 }
-//             }
-//         }
-//         //计算order_item的实付金额
-//         handleRealAmount(orderItemList);
-//         //进行sku库存锁定
-//         lockSkuStock(cartPromotionItemList);
-//
-//         // 进行商品库存锁定
-//         lockProductStock(cartPromotionItemList);
-//
-//         //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
-//         OmsOrder order = new OmsOrder();
-//         String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining());
-//         order.setCartIds(cartIds);
-//         order.setDiscountAmount(new BigDecimal(0));
-//         order.setTotalAmount(calcTotalAmount(orderItemList));
-//         order.setFreightAmount(new BigDecimal(0));
-//         order.setPromotionAmount(calcPromotionAmount(orderItemList));
-//         order.setPromotionInfo(getOrderPromotionInfo(orderItemList));
-//         order.setPlatformType(orderParam.getPlatformType());
-//         if (StringUtil.isEmpty(orderParam.getCouponId())) {
-//             order.setCouponAmount(new BigDecimal(0));
-//         } else {
-//             order.setCouponId(orderParam.getCouponId());
-//             order.setCouponAmount(couponAmount);
-//         }
-//         if (orderParam.getUseIntegration() == null) {
-//             order.setIntegration(0);
-//             order.setIntegrationAmount(new BigDecimal(0));
-//         } else {
-//             order.setIntegration(orderParam.getUseIntegration());
-//             order.setIntegrationAmount(calcIntegrationAmount(orderItemList));
-//         }
-//         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.setMemberId(currentMember.getId());
-//         order.setCreateTime(new Date());
-//         order.setMemberUsername(currentMember.getUsername());
-//         //支付方式:0->未支付;1->支付宝;2->微信
-//         order.setPayType(orderParam.getPayType());
-//         //订单来源:0->PC订单;1->app订单
-//         order.setSourceType(1);
-//         //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 -> 未支付
-//         order.setStatus(6);
-//         //订单类型:0->正常订单;1->秒杀订单
-//         order.setOrderType(0);
-//         //收货人信息:姓名、电话、邮编、地址
-//         UmsMemberReceiveAddress address = memberReceiveAddressService.getItem(orderParam.getMemberReceiveAddressId());
-//         order.setReceiverName(address.getName());
-//         order.setReceiverPhone(address.getPhoneNumber());
-//         order.setReceiverPostCode(address.getPostCode());
-//         order.setReceiverProvince(address.getProvince());
-//         order.setReceiverCity(address.getCity());
-//         order.setReceiverRegion(address.getRegion());
-//         order.setReceiverDetailAddress(address.getDetailAddress());
-//         //0->未确认;1->已确认
-//         order.setConfirmStatus(0);
-//         order.setDeleteStatus(0);
-//         //计算赠送积分
-//         order.setIntegration(calcGifIntegration(orderItemList));
-//         //计算赠送成长值
-//         order.setGrowth(calcGiftGrowth(orderItemList));
-//         //生成订单号
-//         order.setOrderSn(generateOrderSn(order));
-//         //设置自动收货天数
-//         List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
-//         if (CollUtil.isNotEmpty(orderSettings)) {
-//             order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
-//         }
-//         //插入order表和order_item表
-//         orderMapper.insert(order);
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             orderItem.setOrderId(order.getId());
-//             orderItem.setOrderSn(order.getOrderSn());
-//         }
-//         orderItemDao.insertList(orderItemList);
-//         //如使用优惠券更新优惠券使用状态
-//         if (orderParam.getCouponId() != null) {
-//             // updateCouponStatus(orderParam.getCouponId(), currentMember.getId(), 1);
-//             // todo 远程调用更新优惠券使用
-//             adminFeignService.updateCouponOrderInfo(orderParam.getCouponId(),false,order.getOrderSn());
-//         }
-//         //如使用积分需要扣除积分
-//         if (orderParam.getUseIntegration() != null) {
-//             order.setUseIntegration(orderParam.getUseIntegration());
-//             memberService.updateIntegration(currentMember.getId(),
-//                                             currentMember.getIntegration() - orderParam.getUseIntegration());
-//         }
-//         //删除购物车中的下单商品
-//         deleteCartItemList(cartPromotionItemList, currentMember);
-//         //发送延迟消息取消订单
-//         sendDelayMessageCancelOrder(order.getId());
-//         Map<String, Object> result = new HashMap<>();
-//         result.put("order", order);
-//         result.put("orderItemList", orderItemList);
-//         if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
-//             paySuccess(order.getId(),order.getPayType());
-//             order.setStatus(1);
-//         }
-//         return result;
-//     }
-//
-//     @Override
-//     public Integer paySuccess(Long orderId, Integer payType) {
-//         //修改订单支付状态
-//         OmsOrder order = new OmsOrder();
-//         order.setId(orderId);
-//         order.setStatus(1);
-//         order.setPaymentTime(new Date());
-//         order.setPayType(payType);
-//         orderMapper.updateByPrimaryKeySelective(order);
-//         //恢复所有下单商品的锁定库存,扣减真实库存
-//         OmsOrderDetail orderDetail = portalOrderDao.getDetail(orderId);
-//         // 减sku库存
-//         int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
-//
-//         // 减商品库存
-//         updateProductStock(orderDetail);
-//
-//         // 查询订单
-//         OmsOrderDetail detail = detail(orderId);
-//
-//         // 设置平台收入和分润
-//         setPromoterRecord(detail,PostStatusEnum.WAIT);
-//
-//         // 签协议
-//         adminFeignService.contractRecord(new ContractDto(orderDetail.getPlatformType(),orderDetail.getMemberId()));
-//
-//         return count;
-//     }
-//
-//     private void setPromoterRecord(OmsOrderDetail detail,PostStatusEnum status) {
-//
-//         List<OmsOrderItem> orderItemList = detail.getOrderItemList();
-//
-//         // orderItemList = orderItemList.stream().filter(omsOrderItem -> omsOrderItem.getPromoterId() != null).collect(Collectors.toList());
-//         if (CollectionUtils.isEmpty(orderItemList) ) {
-//             return;
-//         }
-//
-//         List<MallOrderItemDto> list = new ArrayList<>();
-//         for (OmsOrderItem omsOrderItem : orderItemList) {
-//             if (omsOrderItem.getReturnStatus() != -1) {
-//                 continue;
-//             }
-//             MallOrderItemDto teacherShareDto = new MallOrderItemDto();
-//             BeanUtils.copyProperties(omsOrderItem,teacherShareDto);
-//             teacherShareDto.setRealAmount(omsOrderItem.getRealAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity()))
-//                                                       .subtract(omsOrderItem.getPrecisionAmount()));
-//             teacherShareDto.setStatus(status);
-//             teacherShareDto.setUserId(detail.getMemberId());
-//             list.add(teacherShareDto);
-//         }
-//         if (CollectionUtils.isEmpty(list)) {
-//             return;
-//         }
-//         HttpResponseResult<Boolean> result;
-//         if (status.equals(PostStatusEnum.WAIT)) {
-//             result = adminFeignService.mallRecord(list);
-//         } else {
-//             result = adminFeignService.mallRecordState(list);
-//         }
-//         if (result.getStatus()) {
-//             LOG.debug("分润记录写入成功,json: {}",JSON.toJSONString(list));
-//         } else {
-//             LOG.error("分润记录写入失败,json: {}",JSON.toJSONString(list));
-//         }
-//     }
-//
-//     /**
-//      * 减商品库存
-//      */
-//     private void updateProductStock(OmsOrderDetail orderDetail) {
-//         Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
-//                                                            .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);
-//         }
-//         productDao.updateProductStock(productStockList);
-//     }
-//
-//     @Override
-//     public Integer cancelTimeOutOrder() {
-//         Integer count = 0;
-//         OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
-//         //查询超时、未支付的订单及订单详情
-//         List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime(),
-//                                                                              orderSetting.getPayOrderOvertime());
-//         if (CollectionUtils.isEmpty(timeOutOrders)) {
-//             return count;
-//         }
-//         for (OmsOrderDetail timeOutOrder : timeOutOrders) {
-//
-//             DistributedLock.of(redissonClient)
-//                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(timeOutOrder.getOrderSn())
-//                                    , () -> {
-//                                        if (timeOutOrder.getStatus() == 0) {
-//                                            payingOrderHandle(timeOutOrder);
-//                                        } else if (timeOutOrder.getStatus() == 6) {
-//                                            try {
-//                                                cancelOrder(timeOutOrder.getId(), "超时取消", null);
-//                                            } catch (Exception e) {
-//                                                LOG.warn("订单取消失败,{}",e.fillInStackTrace());
-//                                            }
-//                                        }
-//                                    }, 60L, TimeUnit.SECONDS);
-//
-//         }
-//         return timeOutOrders.size();
-//     }
-//
-//     @Override
-//     public void cancelOrder(Long orderId, String message, PaymentCallBack data) {
-//         //查询未付款的取消订单
-//         OmsOrderExample example = new OmsOrderExample();
-//         example.createCriteria().andIdEqualTo(orderId).andDeleteStatusEqualTo(0);
-//         List<OmsOrder> cancelOrderList = orderMapper.selectByExample(example);
-//         if (CollectionUtils.isEmpty(cancelOrderList)) {
-//             return;
-//         }
-//         OmsOrder cancelOrder = cancelOrderList.get(0);
-//         if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
-//
-//             // 查询订单是否为支付
-//             UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(cancelOrder.getOrderSn());
-//
-//             if (orderPayment != null) {
-//                 // 查询订单信息
-//                 BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
-//                 //支付成功
-//                 if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
-//                         && cancelOrder.getStatus() == 0) {
-//                     orderSuccess(cancelOrder,null, res.getData());
-//                     return;
-//                 }
-//
-//                 //查询订单下支付中的付款单,取消支付
-//                 userOrderPaymentService.closePayment(orderPayment.getOrderNo(),  "用户发起了新的付款请求", null);
-//             }
-//
-//             //修改订单状态为取消
-//             cancelOrder.setStatus(4);
-//             orderMapper.updateByPrimaryKeySelective(cancelOrder);
-//             OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
-//             orderItemExample.createCriteria().andOrderIdEqualTo(orderId);
-//             List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
-//             //解除订单商品库存锁定
-//             if (!CollectionUtils.isEmpty(orderItemList)) {
-//                 portalOrderDao.releaseSkuStockLock(orderItemList);
-//                 portalOrderDao.releaseProductStockLock(orderItemList);
-//             }
-//             //修改优惠券使用状态
-//             // updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);
-//             // todo 退回优惠券
-//
-//             adminFeignService.updateCouponOrderInfo(cancelOrder.getCouponId(),true,cancelOrder.getOrderSn());
-//             //返还使用积分
-//             if (cancelOrder.getUseIntegration() != null) {
-//                 UmsMember member = memberService.getById(cancelOrder.getMemberId());
-//                 memberService.updateIntegration(cancelOrder.getMemberId(),
-//                                                 member.getIntegration() + cancelOrder.getUseIntegration());
-//             }
-//             // 发起关单
-//             userOrderPaymentService.closePayment(cancelOrder.getOrderSn(), message, data);
-//
-//         } else {
-//             throw new BizException("订单状态非待支付和支付中,不能取消");
-//         }
-//     }
-//
-//     @Override
-//     public void sendDelayMessageCancelOrder(Long orderId) {
-//         //获取订单超时时间
-//         OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
-//         long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000L;
-//         //发送延迟消息
-//         cancelOrderSender.sendMessage(orderId, delayTimes);
-//     }
-//
-//     @Override
-//     public void confirmReceiveOrder(Long orderId) {
-//         // UmsMember member = memberService.getCurrentMember();
-//         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
-//         // if (!member.getId().equals(order.getMemberId())) {
-//         //     Asserts.fail("不能确认他人订单!");
-//         // }
-//         if (order.getStatus() != 2) {
-//             Asserts.fail("该订单还未发货!");
-//         }else if (order.getStatus() == 3) {
-//             Asserts.fail("已确认收货!");
-//         }
-//         order.setStatus(3);
-//         order.setConfirmStatus(1);
-//         order.setReceiveTime(new Date());
-//         orderMapper.updateByPrimaryKey(order);
-//
-//     }
-//
-//     @Override
-//     public CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize) {
-//         if (status.equals("-1")) {
-//             status = null;
-//         }
-//         UmsMember member = memberService.getCurrentMember();
-//         PageHelper.startPage(pageNum, pageSize);
-//         OmsOrderExample orderExample = new OmsOrderExample();
-//         OmsOrderExample.Criteria criteria = orderExample.createCriteria();
-//         criteria.andDeleteStatusEqualTo(0).andMemberIdEqualTo(member.getId());
-//         if (status != null && !StringUtil.isEmpty(status)) {
-//             List<Long> list = StringUtil.toLongList(status);
-//             List<Integer> collect = list.stream().map(Long::intValue).collect(Collectors.toList());
-//             criteria.andStatusIn(collect);
-//         }
-//         orderExample.setOrderByClause(" field(status,'0','6','1','2','3','4','5'),create_time desc");
-//         List<OmsOrder> orderList = orderMapper.selectByExample(orderExample);
-//         CommonPage<OmsOrder> orderPage = CommonPage.restPage(orderList);
-//         //设置分页信息
-//         CommonPage<OmsOrderDetail> resultPage = new CommonPage<>();
-//         resultPage.setPageNum(orderPage.getPageNum());
-//         resultPage.setPageSize(orderPage.getPageSize());
-//         resultPage.setTotal(orderPage.getTotal());
-//         resultPage.setTotalPage(orderPage.getTotalPage());
-//         if (CollUtil.isEmpty(orderList)) {
-//             return resultPage;
-//         }
-//         //设置数据信息
-//         List<Long> orderIds = orderList.stream().map(OmsOrder::getId).collect(Collectors.toList());
-//         OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
-//         orderItemExample.createCriteria().andOrderIdIn(orderIds);
-//         List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
-//         List<OmsOrderDetail> orderDetailList = new ArrayList<>();
-//         for (OmsOrder omsOrder : orderList) {
-//             OmsOrderDetail orderDetail = new OmsOrderDetail();
-//             BeanUtil.copyProperties(omsOrder, orderDetail);
-//             List<OmsOrderItem> relatedItemList = orderItemList.stream()
-//                                                               .filter(item -> item.getOrderId()
-//                                                                                   .equals(orderDetail.getId()))
-//                                                               .collect(Collectors.toList());
-//             orderDetail.setOrderItemList(relatedItemList);
-//             orderDetailList.add(orderDetail);
-//         }
-//         resultPage.setList(orderDetailList);
-//         return resultPage;
-//     }
-//
-//     @Override
-//     public OmsOrderDetail detail(Long orderId) {
-//         OmsOrder omsOrder = orderMapper.selectByPrimaryKey(orderId);
-//         OmsOrderItemExample example = new OmsOrderItemExample();
-//         example.createCriteria().andOrderIdEqualTo(orderId);
-//         List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
-//         OmsOrderDetail orderDetail = new OmsOrderDetail();
-//         BeanUtil.copyProperties(omsOrder, orderDetail);
-//         orderDetail.setOrderItemList(orderItemList);
-//         return orderDetail;
-//     }
-//
-//     @Override
-//     public OmsOrderDetail detail(String orderSn) {
-//         OmsOrderExample orderExample = new OmsOrderExample();
-//         orderExample.createCriteria().andOrderSnEqualTo(orderSn);
-//         List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
-//         if (CollUtil.isEmpty(omsOrders)) {
-//             throw new BizException("订单信息错误");
-//         } else if (omsOrders.size() != 1) {
-//             throw new BizException("订单号重复");
-//         }
-//         OmsOrder omsOrder = omsOrders.get(0);
-//         OmsOrderItemExample example = new OmsOrderItemExample();
-//         example.createCriteria().andOrderIdEqualTo(omsOrder.getId());
-//         List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
-//         OmsOrderDetail orderDetail = new OmsOrderDetail();
-//         BeanUtil.copyProperties(omsOrder, orderDetail);
-//         orderDetail.setOrderItemList(orderItemList);
-//         return orderDetail;
-//     }
-//
-//     @Override
-//     public void deleteOrder(Long orderId) {
-//         UmsMember member = memberService.getCurrentMember();
-//         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
-//         if (!member.getId().equals(order.getMemberId())) {
-//             Asserts.fail("不能删除他人订单!");
-//         }
-//         if (order.getStatus() == 3 || order.getStatus() == 4) {
-//             order.setDeleteStatus(1);
-//             orderMapper.updateByPrimaryKey(order);
-//         } else {
-//             Asserts.fail("只能删除已完成或已关闭的订单!");
-//         }
-//     }
-//
-//     @Override
-//     @Transactional
-//     public OrderPayRes orderPay(OrderPayReq payReq) {
-//         OrderPayRes orderPayRes = new OrderPayRes();
-//         OmsOrderDetail detail = detail(payReq.getOrderNo());
-//         if (detail == null) {
-//             orderPayRes.setStatus(false);
-//             orderPayRes.setMessage("订单不存在");
-//             return orderPayRes;
-//         }
-//         if (detail.getStatus() != 0 && detail.getStatus() != 6) {
-//             orderPayRes.setStatus(false);
-//             orderPayRes.setMessage("订单已付款或已关闭");
-//             return orderPayRes;
-//         }
-//         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
-//
-//         if (orderPayment != null) {
-//             // 查询订单信息
-//             BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
-//             //支付成功
-//             if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus().getCode())
-//                     && detail.getStatus() == 0) {
-//                 orderSuccess(detail,null, res.getData());
-//                 orderPayRes.setStatus(false);
-//                 orderPayRes.setMessage("订单已付款或已关闭");
-//                 return orderPayRes;
-//             }
-//
-//             //查询订单下支付中的付款单,取消支付
-//             userOrderPaymentService.closePayment(orderPayment.getOrderNo(),  "用户发起了新的付款请求", null);
-//         }
-//
-//         //构建汇付统一下单请求
-//         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-//         Payment payment = new Payment(openType, PaymentClientEnum.valueOf(payReq.getPaymentClient()),
-//                                       payReq.getPayChannel());
-//         payment.setPaymentNo(generateOrderSn(detail));
-//         payment.setOrderNo(payReq.getOrderNo());
-//         payment.setOrderTitle("酷乐秀商城订单编号-" + detail.getOrderSn());
-//         payment.setOrderDesc("酷乐秀商城订单编号-" + detail.getOrderSn());
-//
-//         //封装订单详情
-//         List<OrderDetil> orderDetails = new ArrayList<>();
-//         for (OmsOrderItem orderDetailVo : detail.getOrderItemList()) {
-//             orderDetails.add(new OrderDetil(orderDetailVo.getId().toString(), orderDetailVo.getProductName(),
-//                                             orderDetailVo.getProductQuantity(),
-//                                             orderDetailVo.getRealAmount().toString()));
-//         }
-//         payment.setOrderDetils(orderDetails);
-//         payment.setPayAmt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
-//         payment.setDescription(payReq.getReason());
-//
-//         if (OpenEnum.ADAPAY.equals(openType)) {
-//             //创建分账对象
-//             DivMember div_member = new DivMember();
-//             div_member.setMember_id("0");
-//             div_member.setAmount(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
-//             div_member.setFee_flag("Y");
-//             List<DivMember> div_members = Arrays.asList(div_member);
-//             payment.setDivMembers(div_members);
-//
-//             //前端设备信息
-//             DeviceInfo deviceInfo = new DeviceInfo();
-//             deviceInfo.setDevice_ip(payReq.getIpAddress());
-//             payment.setDeviceInfo(deviceInfo);
-//
-//             if (PayChannelEnum.wx_lite.equals(payReq.getPayChannel())) {
-//                 Map<String, Object> expend = new HashMap<>();
-//                 expend.put("open_id", payReq.getOpenId());
-//                 payment.setExpend(expend);
-//             }
-//         }
-//         // 支付中的返回拉起信息
-//         BaseResult<Payment> executePayment = paymentClient.executePayment(payment);
-//         if (!executePayment.getStatus()) {
-//             // 异常将取消订单
-//             // cancelOrder(detail.getId(), executePayment.getMsg(), null);
-//             throw new BizException(executePayment.getMsg());
-//         }
-//         if (!executePayment.getData()
-//                            .getPayAmt()
-//                            .equals(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString())) {
-//             // cancelOrder(detail.getId(), "订单金额和实际支付金额不符", null);
-//             throw new BizException("订单金额和实际支付金额不符");
-//         }
-//
-//
-//         saveOrderPayment(executePayment.getData(), detail, payReq.getPaymentClient());
-//
-//         if (executePayment.getStatus()) {
-//             orderPayRes.setPay_amt(detail.getPayAmount().setScale(2, RoundingMode.HALF_UP).toString());
-//             String pay_info = executePayment.getData().getPayInfo();
-//             orderPayRes.setPay_info(pay_info);
-//             orderPayRes.setPayChannel(payReq.getPayChannel().getCode());
-//             orderPayRes.setPaymentNo(payment.getPaymentNo());
-//             orderPayRes.setStatus(true);
-//
-//         } else {
-//             orderPayRes.setMessage(executePayment.getMsg());
-//             orderPayRes.setStatus(false);
-//         }
-//         return orderPayRes;
-//     }
-//
-//     private BaseResult<Payment> getPaymentBaseResult(UserOrderPayment orderPayment) {
-//         Payment param = new Payment(OpenEnum.valueOf(orderPayment.getOpenType()),
-//                                     PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
-//                                     PayChannelEnum.valueOf(orderPayment.getPayChannel()));
-//         param.setId(orderPayment.getTransNo());
-//         param.setPaymentNo(orderPayment.getAdapayNo());
-//         return paymentClient.queryPayment(param);
-//     }
-//
-//
-//     private void saveOrderPayment(Payment payment, OmsOrderDetail detail, String paymentClient) {
-//         UserOrderPayment userOrderPayment;
-//         OmsOrder omsOrder = new OmsOrder();
-//         omsOrder.setId(detail.getId());
-//
-//         omsOrder.setStatus(0);
-//         orderMapper.updateByPrimaryKeySelective(omsOrder);
-//         // 保存订单支付表
-//         userOrderPayment = new UserOrderPayment();
-//         userOrderPayment.setPaymentClient(paymentClient);
-//         userOrderPayment.setOpenType(paymentProperties.getOpenType());
-//         userOrderPayment.setOrderNo(detail.getOrderSn());
-//         userOrderPayment.setAdapayNo(payment.getPaymentNo());
-//         userOrderPayment.setPayChannel(payment.getPayChannel().getCode());
-//         userOrderPayment.setTransNo(payment.getId());
-//         userOrderPayment.setPayAmt(new BigDecimal(payment.getPayAmt()));
-//         userOrderPayment.setPayInfo(payment.getPayInfo());
-//         userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
-//         userOrderPayment.setPayFailMsg("");
-//         userOrderPayment.setCreateTime(new Date());
-//         userOrderPayment.setUpdateTime(new Date());
-//
-//         userOrderPaymentService.save(userOrderPayment);
-//     }
-//
-//     @Override
-//     public OmsOrder getOrderById(Long orderId) {
-//         return orderMapper.selectByPrimaryKey(orderId);
-//     }
-//
-//     @Override
-//     public void executePaymentCallBack(PaymentCallBack data) {
-//         LOG.info("支付回调信息: {}",JSON.toJSONString(data));
-//         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//支付成功
-//             paymentSucceededHandle(data);
-//         } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//支付失败
-//             paymentFailedHandle(data);
-//         }
-//     }
-//
-//     @Override
-//     public void closePaymentCallBack(PaymentCallBack data) {
-//
-//         LOG.info("关单回调信息: {}",JSON.toJSONString(data));
-//         if (TradeStatusEnum.succeeded.equals(data.getStatus())) {//关单成功
-//             paymentCloseSucceededHandle(data);
-//         } else if (TradeStatusEnum.failed.equals(data.getStatus())) {//关单失败
-//             paymentCloseFailedHandle(data);
-//         }
-//     }
-//
-//     @Override
-//     public Integer autoReceive() {
-//         OmsOrderSetting omsOrderSetting = orderSettingMapper.selectByPrimaryKey(1L);
-//         Integer confirmOvertime = omsOrderSetting.getConfirmOvertime();
-//         LocalDateTime localDateTime = LocalDateTime.now().plusDays(-confirmOvertime);
-//         OmsOrderExample orderExample = new OmsOrderExample();
-//         orderExample.createCriteria().andStatusEqualTo(2).andDeleteStatusEqualTo(0).andConfirmStatusEqualTo(0)
-//                 .andDeliveryTimeLessThanOrEqualTo(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
-//
-//         List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
-//         if (CollectionUtils.isEmpty(omsOrders)) {
-//             return 0;
-//         }
-//         for (OmsOrder omsOrder : omsOrders) {
-//
-//             DistributedLock.of(redissonClient)
-//                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                    , () -> {
-//                                         try {
-//                                             this.confirmReceiveOrder(omsOrder.getId());
-//
-//                                         }catch (Exception e) {
-//                                             LOG.warn("订单收货,{}",e.fillInStackTrace());
-//                                         }
-//                                    }, 60L, TimeUnit.SECONDS);
-//         }
-//         return omsOrders.size();
-//
-//     }
-//
-//     @Override
-//     public Integer shareProfit() {
-//         OmsOrderSetting omsOrderSetting = orderSettingMapper.selectByPrimaryKey(1L);
-//         Integer finishOvertime = omsOrderSetting.getFinishOvertime();
-//         LocalDateTime localDateTime = LocalDateTime.now().plusDays(-finishOvertime);
-//         OmsOrderExample orderExample = new OmsOrderExample();
-//         orderExample.createCriteria().andStatusEqualTo(3).andDeleteStatusEqualTo(0).andConfirmStatusEqualTo(1)
-//                 .andAfterSaleEqualTo(0)
-//                 .andReceiverCityIsNotNull()
-//                     .andReceiveTimeLessThan(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
-//
-//         List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
-//         if (CollectionUtils.isEmpty(omsOrders)) {
-//             return 0;
-//         }
-//         for (OmsOrder omsOrder : omsOrders) {
-//
-//             DistributedLock.of(redissonClient)
-//                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-//                                    , () -> {
-//                                try {
-//                                    this.FinishReceiveOrder(omsOrder.getId());
-//
-//                                } catch (Exception e) {
-//                                    LOG.warn("停止售后失败,{}",e.fillInStackTrace());
-//                                }
-//                                    }, 60L, TimeUnit.SECONDS);
-//         }
-//         return omsOrders.size();
-//     }
-//
-//     private void FinishReceiveOrder(Long orderId) {
-//
-//         // UmsMember member = memberService.getCurrentMember();
-//         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
-//         // if (!member.getId().equals(order.getMemberId())) {
-//         //     Asserts.fail("不能确认他人订单!");
-//         // }
-//          if (order.getStatus() != 3) {
-//             Asserts.fail("未确认收货!");
-//         }
-//         order.setAfterSale(1);
-//         orderMapper.updateByPrimaryKey(order);
-//
-//
-//         // 设置平台收入和分润 实际收款
-//         setPromoterRecord(detail(orderId), PostStatusEnum.RECORDED);
-//     }
-//
-//
-//     /***
-//      * 处理回调-支付成功
-//      * @author liweifan
-//      * @param: hfRes
-//      * @updateTime 2022/4/27 15:09
-//      */
-//     private void paymentSucceededHandle(PaymentCallBack data) {
-//         //订单完成
-//         UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
-//         if (null == userOrderPayment) {
-//             String string = JSON.toJSONString(data);
-//             LOG.error("汇付支付回调,订单未找到。 req is {}", string);
-//             return;
-//         }
-//         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
-//         if (detail.getStatus() == 0) {
-//             orderSuccess(detail, data, null);
-//         } else {
-//             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
-//             LOG.warn("支付金额原路退回 {}", detail.getOrderSn());
-//             orderRefund(userOrderPayment,data.getExecutePaymentCallBack().getPayAmt(),data.getId(),detail);
-//         }
-//     }
-//
-//     /**
-//      * 支付成功,业务退款
-//      */
-//     private void orderRefund(UserOrderPayment userOrderPayment,String refundAmount,String payTransNo,OmsOrder order) {
-//         UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getAdapayNo());
-//         if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
-//             LOG.warn("支付金额已退回");
-//             return;
-//         }
-//
-//         String orderSn = generateOrderSn(order);
-//
-//         RefundBill refundReq = new RefundBill(OpenEnum.valueOf(userOrderPayment.getOpenType()), PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), PayChannelEnum.valueOf(userOrderPayment.getPayChannel()));
-//         refundReq.setRefundNo(orderSn);
-//         refundReq.setRefundAmt(new BigDecimal(refundAmount));
-//
-//         refundReq.setReason("支付超时,全额退回");
-//         refundReq.setPaymentNo(userOrderPayment.getAdapayNo());
-//         refundReq.setTradeNo(payTransNo);
-//         refundReq.setOrderAmt(userOrderPayment.getPayAmt());
-//         BaseResult<RefundBill> refundBillBaseResult = paymentClient.refundPayment(refundReq);
-//         userOrderRefund = new UserOrderRefund();
-//         userOrderRefund.setOrderNo(orderSn);
-//         userOrderRefund.setPayTransNo(payTransNo);
-//         userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
-//         userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
-//         if (refundBillBaseResult.getStatus()) {
-//             RefundBill refundBill = refundBillBaseResult.getData();
-//             userOrderRefund.setRefundAmt(refundBill.getRefundAmt());
-//             userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
-//         } else {
-//             userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
-//             userOrderRefund.setPayFailMsg("退款失败:" + refundBillBaseResult.getMsg());
-//         }
-//         userOrderRefundMapper.insert(userOrderRefund);
-//     }
-//     /***
-//      * 处理回调-支付失败
-//      * @author liweifan
-//      * @param: hfRes
-//      * @updateTime 2022/4/27 15:09
-//      */
-//     private void paymentFailedHandle(PaymentCallBack data) {
-//         //订单完成
-//         UserOrderPayment userOrderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
-//         String dataString = JSON.toJSONString(data);
-//         if (null == userOrderPayment) {
-//             LOG.error("汇付支付回调,订单未找到。 req is {}", dataString);
-//             return;
-//         }
-//
-//         OmsOrderDetail detail = detail(userOrderPayment.getOrderNo());
-//         if (null == detail) {
-//             LOG.error("汇付支付回调,订单未找到。 req is {}", dataString);
-//             return;
-//         }
-//         if (detail.getStatus() == 0) {
-//
-//             cancelOrder(detail.getId(), data.getErrMsg(), data);
-//         } else {
-//             LOG.error("汇付支付回调,订单状态异常。 req is {}", dataString);
-//         }
-//     }
-//
-//     /***
-//      * 支付关单成功
-//      * @author liweifan
-//      * @param: hfRes
-//      * @updateTime 2022/4/27 15:33
-//      */
-//     private void paymentCloseSucceededHandle(PaymentCallBack data) {
-//         UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
-//         if (null == orderPayment) {
-//             return;
-//         }
-//         orderPayment.setStatus(TradeStatusEnum.failed.getCode());
-//         orderPayment.setTransNo(data.getId());
-//         orderPayment.setCloseStatus(TradeStatusEnum.succeeded.getCode());
-//         orderPayment.setCloseTime(data.getClosePaymentCallBack().getTradeTime());
-//         userOrderPaymentService.saveOrUpdate(orderPayment);
-//     }
-//
-//     /***
-//      * 支付关单失败
-//      * @author liweifan
-//      * @param: hfRes
-//      * @updateTime 2022/4/27 15:33
-//      */
-//     private void paymentCloseFailedHandle(PaymentCallBack data) {
-//         UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(data.getPaymentNo());
-//         if (null == orderPayment) {
-//             return;
-//         }
-//         orderPayment.setStatus(TradeStatusEnum.failed.getCode());
-//         orderPayment.setCloseStatus(TradeStatusEnum.failed.getCode());
-//         orderPayment.setCloseTime(data.getClosePaymentCallBack().getTradeTime());
-//         orderPayment.setPayFailMsg("支付关单回调失败-" + data.getErrMsg());
-//         orderPayment.setUpdateTime(new Date());
-//         userOrderPaymentService.saveOrUpdate(orderPayment);
-//     }
-//
-//     /***
-//      * 处理支付中订单
-//      */
-//     void payingOrderHandle(OmsOrder userOrder) {
-//         //判断汇付订单状态
-//         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(userOrder.getOrderSn());
-//         if (null == orderPayment) {
-//             cancelOrder(userOrder.getId(), "支付超时", null);
-//             return;
-//         }
-//         OmsOrderDetail detail = detail(orderPayment.getOrderNo());
-//         try {
-//             BaseResult<Payment> res = getPaymentBaseResult(orderPayment);
-//             //支付成功
-//             if (res.getStatus() && TradeStatusEnum.succeeded.getCode()
-//                                                             .equals(res.getData()
-//                                                                        .getStatus()
-//                                                                        .getCode()) && detail.getStatus() == 0) {
-//                 orderSuccess(detail,null, res.getData());
-//                 return;
-//             }
-//             //支付失败
-//             if (!res.getStatus()) {
-//                 cancelOrder(userOrder.getId(), res.getMsg(), null);
-//                 return;
-//             }
-//             cancelOrder(userOrder.getId(), "支付超时", null);
-//         } catch (Exception e) {
-//             e.printStackTrace();
-//             LOG.error("轮询处理支付中订单异常,异常参数: {}", JSON.toJSONString(userOrder));
-//         }
-//     }
-//
-//
-//     /**
-//      * 订单完成
-//      *
-//      * @param: detail
-//      * @updateTime 2022/4/13 17:17
-//      */
-//     @Transactional(rollbackFor = Exception.class)
-//     public void orderSuccess(OmsOrder detail, PaymentCallBack data,Payment payment) {
-//         //更新订单
-//         UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(detail.getOrderSn());
-//
-//         if (orderPayment == null) {
-//             LOG.error("支付回调,支付中订单未找到。 orderNo is {}", detail.getOrderSn());
-//             return;
-//         }
-//
-//         // 判断支付金额 是否正确
-//         BigDecimal pay_amt;
-//         if (data != null) {
-//             pay_amt = new BigDecimal(data.getExecutePaymentCallBack().getPayAmt());
-//
-//             orderPayment.setTransNo(data.getId());
-//         } else {
-//             pay_amt = new BigDecimal(payment.getPayAmt());
-//             orderPayment.setTransNo(payment.getId());
-//         }
-//         if (pay_amt.compareTo(detail.getPayAmount()) != 0) {
-//             orderPayment.setPayFailMsg("订单金额和实际支付金额不符");
-//             orderRefund(orderPayment,pay_amt.setScale(2, RoundingMode.HALF_UP).toString(),orderPayment.getTransNo(),detail);
-//         } else {
-//
-//             if (orderPayment.getPayChannel().equals("alipay") || orderPayment.getPayChannel().equals("ali_app")) {
-//                 paySuccess(detail.getId(), 1);
-//             } else if (orderPayment.getPayChannel().equals("wx_lite") || orderPayment.getPayChannel().equals("wx_app")) {
-//                 paySuccess(detail.getId(), 2);
-//             }
-//         }
-//
-//         orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
-//         orderPayment.setArrivalTime(new Date());
-//         orderPayment.setPayAmt(pay_amt);
-//         if (null != data) {
-//             try {
-//                 orderPayment.setArrivalTime(data.getExecutePaymentCallBack().getTradeTime());
-//                 orderPayment.setTransNo(data.getId());
-//                 orderPayment.setFeeAmt(new BigDecimal(data.getExecutePaymentCallBack().getFeeAmt()));
-//             } catch (Exception e) {
-//                 e.printStackTrace();
-//                 LOG.error("完成订单,付款单金额格式化失败,参数{}", JSON.toJSONString(data));
-//             }
-//         }
-//         userOrderPaymentService.saveOrUpdate(orderPayment);
-//
-//     }
-//
-//
-//     /**
-//      * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id
-//      */
-//     private String generateOrderSn(OmsOrder order) {
-//         return String.valueOf(idGeneratorService.generatorId("mall"));
-//     }
-//
-//     /**
-//      * 删除下单商品的购物车信息
-//      */
-//     private void deleteCartItemList(List<CartPromotionItem> cartPromotionItemList, UmsMember currentMember) {
-//         List<Long> ids = new ArrayList<>();
-//         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-//             ids.add(cartPromotionItem.getId());
-//         }
-//         cartItemService.delete(currentMember.getId(), ids);
-//     }
-//
-//     /**
-//      * 计算该订单赠送的成长值
-//      */
-//     private Integer calcGiftGrowth(List<OmsOrderItem> orderItemList) {
-//         int sum = 0;
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             sum = sum + orderItem.getGiftGrowth() * orderItem.getProductQuantity();
-//         }
-//         return sum;
-//     }
-//
-//     /**
-//      * 计算该订单赠送的积分
-//      */
-//     private Integer calcGifIntegration(List<OmsOrderItem> orderItemList) {
-//         int sum = 0;
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             sum += orderItem.getGiftIntegration() * orderItem.getProductQuantity();
-//         }
-//         return sum;
-//     }
-//
-//     /**
-//      * 将优惠券信息更改为指定状态
-//      *
-//      * @param couponId  优惠券id
-//      * @param memberId  会员id
-//      * @param useStatus 0->未使用;1->已使用
-//      */
-//     private void updateCouponStatus(Long couponId, Long memberId, Integer useStatus) {
-//         if (couponId == null) return;
-//         //查询第一张优惠券
-//         SmsCouponHistoryExample example = new SmsCouponHistoryExample();
-//         example.createCriteria()
-//                .andMemberIdEqualTo(memberId)
-//                .andCouponIdEqualTo(couponId)
-//                .andUseStatusEqualTo(useStatus == 0 ? 1 : 0);
-//         List<SmsCouponHistory> couponHistoryList = couponHistoryMapper.selectByExample(example);
-//         if (!CollectionUtils.isEmpty(couponHistoryList)) {
-//             SmsCouponHistory couponHistory = couponHistoryList.get(0);
-//             couponHistory.setUseTime(new Date());
-//             couponHistory.setUseStatus(useStatus);
-//             couponHistoryMapper.updateByPrimaryKeySelective(couponHistory);
-//         }
-//     }
-//
-//     private void handleRealAmount(List<OmsOrderItem> orderItemList) {
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             //原价-促销优惠-优惠券抵扣-积分抵扣
-//             BigDecimal realAmount = orderItem.getProductPrice()
-//                                              .subtract(orderItem.getPromotionAmount())
-//                                              .subtract(orderItem.getCouponAmount())
-//                                              .subtract(orderItem.getIntegrationAmount());
-//             orderItem.setRealAmount(realAmount);
-//         }
-//     }
-//
-//     /**
-//      * 获取订单促销信息
-//      */
-//     private String getOrderPromotionInfo(List<OmsOrderItem> orderItemList) {
-//         StringBuilder sb = new StringBuilder();
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             sb.append(orderItem.getPromotionName());
-//             sb.append(";");
-//         }
-//         String result = sb.toString();
-//         if (result.endsWith(";")) {
-//             result = result.substring(0, result.length() - 1);
-//         }
-//         return result;
-//     }
-//
-//     /**
-//      * 计算订单应付金额
-//      */
-//     private BigDecimal calcPayAmount(OmsOrder order) {
-//         //总金额+运费-促销优惠-优惠券优惠-积分抵扣
-//         return order.getTotalAmount()
-//                     .add(order.getFreightAmount())
-//                     .subtract(order.getPromotionAmount())
-//                     .subtract(order.getCouponAmount())
-//                     .subtract(order.getIntegrationAmount());
-//     }
-//
-//     /**
-//      * 计算订单优惠券金额
-//      */
-//     private BigDecimal calcIntegrationAmount(List<OmsOrderItem> orderItemList) {
-//         BigDecimal integrationAmount = new BigDecimal(0);
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             if (orderItem.getIntegrationAmount() != null) {
-//                 integrationAmount = integrationAmount.add(
-//                         orderItem.getIntegrationAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
-//             }
-//         }
-//         return integrationAmount;
-//     }
-//
-//     /**
-//      * 计算订单优惠券金额
-//      */
-//     private BigDecimal calcCouponAmount(List<OmsOrderItem> orderItemList) {
-//         BigDecimal couponAmount = new BigDecimal(0);
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             if (orderItem.getCouponAmount() != null) {
-//                 couponAmount = couponAmount.add(
-//                         orderItem.getCouponAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
-//             }
-//         }
-//         return couponAmount;
-//     }
-//
-//     /**
-//      * 计算订单活动优惠
-//      */
-//     private BigDecimal calcPromotionAmount(List<OmsOrderItem> orderItemList) {
-//         BigDecimal promotionAmount = new BigDecimal(0);
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             if (orderItem.getPromotionAmount() != null) {
-//                 promotionAmount = promotionAmount.add(
-//                         orderItem.getPromotionAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
-//             }
-//         }
-//         return promotionAmount;
-//     }
-//
-//     /**
-//      * 获取可用积分抵扣金额
-//      *
-//      * @param useIntegration 使用的积分数量
-//      * @param totalAmount    订单总金额
-//      * @param currentMember  使用的用户
-//      * @param hasCoupon      是否已经使用优惠券
-//      */
-//     private BigDecimal getUseIntegrationAmount(Integer useIntegration, BigDecimal totalAmount, UmsMember currentMember, boolean hasCoupon) {
-//         BigDecimal zeroAmount = new BigDecimal(0);
-//         //判断用户是否有这么多积分
-//         if (useIntegration.compareTo(currentMember.getIntegration()) > 0) {
-//             return zeroAmount;
-//         }
-//         //根据积分使用规则判断是否可用
-//         //是否可与优惠券共用
-//         UmsIntegrationConsumeSetting integrationConsumeSetting = integrationConsumeSettingMapper.selectByPrimaryKey(1L);
-//         if (hasCoupon && integrationConsumeSetting.getCouponStatus().equals(0)) {
-//             //不可与优惠券共用
-//             return zeroAmount;
-//         }
-//         //是否达到最低使用积分门槛
-//         if (useIntegration.compareTo(integrationConsumeSetting.getUseUnit()) < 0) {
-//             return zeroAmount;
-//         }
-//         //是否超过订单抵用最高百分比
-//         BigDecimal integrationAmount = new BigDecimal(useIntegration).divide(
-//                 new BigDecimal(integrationConsumeSetting.getUseUnit()), 2, RoundingMode.HALF_EVEN);
-//         BigDecimal maxPercent = new BigDecimal(integrationConsumeSetting.getMaxPercentPerOrder()).divide(
-//                 new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
-//         if (integrationAmount.compareTo(totalAmount.multiply(maxPercent)) > 0) {
-//             return zeroAmount;
-//         }
-//         return integrationAmount;
-//     }
-//
-//     /**
-//      * 对优惠券优惠进行处理
-//      *
-//      * @param orderItemList       order_item列表
-//      * @param couponAmount 可用优惠券详情
-//      */
-//     private void handleCouponAmount(List<OmsOrderItem> orderItemList, BigDecimal couponAmount) {
-//         // SmsCoupon coupon = couponHistoryDetail.getCoupon();
-//         // if (coupon.getUseType().equals(0)) {
-//             //全场通用
-//             calcPerCouponAmount(orderItemList, couponAmount);
-//         // } else if (coupon.getUseType().equals(1)) {
-//         //     //指定分类
-//         //     List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
-//         //                                                                           0);
-//         //     calcPerCouponAmount(couponOrderItemList, coupon);
-//         // } else if (coupon.getUseType().equals(2)) {
-//         //     //指定商品
-//         //     List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
-//         //                                                                           1);
-//         //     calcPerCouponAmount(couponOrderItemList, coupon);
-//         // }
-//     }
-//
-//     /**
-//      * 对每个下单商品进行优惠券金额分摊的计算
-//      *
-//      * @param orderItemList 可用优惠券的下单商品商品
-//      */
-//     private void calcPerCouponAmount(List<OmsOrderItem> orderItemList, BigDecimal coupon) {
-//         BigDecimal totalAmount = calcTotalAmount(orderItemList);
-//         for (OmsOrderItem orderItem : orderItemList) {
-//             //(商品价格/可用商品总价)*优惠券面额
-//             BigDecimal couponAmount = orderItem.getProductPrice()
-//                                                .divide(totalAmount, 2, BigDecimal.ROUND_DOWN)
-//                                                .multiply(coupon);
-//             orderItem.setCouponAmount(couponAmount);
-//
-//             orderItem.setPrecisionAmount(BigDecimal.ZERO);
-//
-//         }
-//         BigDecimal reduce = orderItemList.stream()
-//                                          .map(omsOrderItem -> omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())))
-//                                          .reduce(BigDecimal.ZERO, BigDecimal::add);
-//         OmsOrderItem omsOrderItem = orderItemList.get(0);
-//         omsOrderItem.setPrecisionAmount(coupon.subtract(reduce));
-//
-//     }
-//
-//     /**
-//      * 获取与优惠券有关系的下单商品
-//      *
-//      * @param couponHistoryDetail 优惠券详情
-//      * @param orderItemList       下单商品
-//      * @param type                使用关系类型:0->相关分类;1->指定商品
-//      */
-//     private List<OmsOrderItem> getCouponOrderItemByRelation(SmsCouponHistoryDetail couponHistoryDetail, List<OmsOrderItem> orderItemList, int type) {
-//         List<OmsOrderItem> result = new ArrayList<>();
-//         if (type == 0) {
-//             List<Long> categoryIdList = new ArrayList<>();
-//             for (SmsCouponProductCategoryRelation productCategoryRelation : couponHistoryDetail.getCategoryRelationList()) {
-//                 categoryIdList.add(productCategoryRelation.getProductCategoryId());
-//             }
-//             for (OmsOrderItem orderItem : orderItemList) {
-//                 if (categoryIdList.contains(orderItem.getProductCategoryId())) {
-//                     result.add(orderItem);
-//                 } else {
-//                     orderItem.setCouponAmount(new BigDecimal(0));
-//                 }
-//             }
-//         } else if (type == 1) {
-//             List<Long> productIdList = new ArrayList<>();
-//             for (SmsCouponProductRelation productRelation : couponHistoryDetail.getProductRelationList()) {
-//                 productIdList.add(productRelation.getProductId());
-//             }
-//             for (OmsOrderItem orderItem : orderItemList) {
-//                 if (productIdList.contains(orderItem.getProductId())) {
-//                     result.add(orderItem);
-//                 } else {
-//                     orderItem.setCouponAmount(new BigDecimal(0));
-//                 }
-//             }
-//         }
-//         return result;
-//     }
-//
-//     /**
-//      * 获取该用户可以使用的优惠券
-//      *
-//      * @param cartPromotionItemList 购物车优惠列表
-//      * @param couponId              使用优惠券id
-//      */
-//     private SmsCouponHistoryDetail getUseCoupon(List<CartPromotionItem> cartPromotionItemList, Long couponId) {
-//         List<SmsCouponHistoryDetail> couponHistoryDetailList = memberCouponService.listCart(cartPromotionItemList, 1);
-//         for (SmsCouponHistoryDetail couponHistoryDetail : couponHistoryDetailList) {
-//             if (couponHistoryDetail.getCoupon().getId().equals(couponId)) {
-//                 return couponHistoryDetail;
-//             }
-//         }
-//         return null;
-//     }
-//
-//     /**
-//      * 计算总金额
-//      */
-//     private BigDecimal calcTotalAmount(List<OmsOrderItem> orderItemList) {
-//         BigDecimal totalAmount = new BigDecimal("0");
-//         for (OmsOrderItem item : orderItemList) {
-//             totalAmount = totalAmount.add(item.getProductPrice().multiply(new BigDecimal(item.getProductQuantity())));
-//         }
-//         return totalAmount;
-//     }
-//
-//     /**
-//      * 锁定下单商品的所有库存
-//      */
-//     private void lockSkuStock(List<CartPromotionItem> cartPromotionItemList) {
-//         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-//             if (cartPromotionItem.getProductSkuId() == null) {
-//                 continue;
-//             }
-//             int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(), cartPromotionItem.getQuantity());
-//             if (i == 0) {
-//                 Asserts.fail("库存不足");
-//             }
-//         }
-//     }
-//
-//     /**
-//      * 锁定下单商品的所有库存
-//      */
-//     private void lockProductStock(List<CartPromotionItem> cartPromotionItemList) {
-//         Map<Long, List<CartPromotionItem>> collect = cartPromotionItemList.stream()
-//                                                                           .collect(Collectors.groupingBy(
-//                                                                                   CartPromotionItem::getProductId));
-//         for (Map.Entry<Long, List<CartPromotionItem>> entry : collect.entrySet()) {
-//             List<CartPromotionItem> value = entry.getValue();
-//             if (CollectionUtils.isEmpty(value)) {
-//                 continue;
-//             }
-//             int sum = value.stream().mapToInt(CartPromotionItem::getQuantity).sum();
-//             if (sum > 0) {
-//                 int i = pmsProductMapper.lockStock(entry.getKey(), sum);
-//                 if (i == 0) {
-//                     Asserts.fail("库存不足");
-//                 }
-//             }
-//         }
-//     }
-//
-//     /**
-//      * 判断下单商品是否都有库存
-//      */
-//     private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) {
-//         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-//             if (cartPromotionItem.getRealStock() == null || cartPromotionItem.getRealStock() <= 0) {
-//                 return false;
-//             }
-//         }
-//         return true;
-//     }
-//
-//     /**
-//      * 计算购物车中商品的价格
-//      */
-//     private ConfirmOrderResult.CalcAmount calcCartAmount(List<CartPromotionItem> cartPromotionItemList) {
-//         ConfirmOrderResult.CalcAmount calcAmount = new ConfirmOrderResult.CalcAmount();
-//         calcAmount.setFreightAmount(new BigDecimal(0));
-//         BigDecimal totalAmount = new BigDecimal("0");
-//         BigDecimal promotionAmount = new BigDecimal("0");
-//         for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
-//             totalAmount = totalAmount.add(
-//                     cartPromotionItem.getPrice().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
-//             promotionAmount = promotionAmount.add(
-//                     cartPromotionItem.getReduceAmount().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
-//         }
-//         calcAmount.setTotalAmount(totalAmount);
-//         calcAmount.setPromotionAmount(promotionAmount);
-//         calcAmount.setPayAmount(totalAmount.subtract(promotionAmount));
-//         return calcAmount;
-//     }
-//
-// }
+package com.yonge.cooleshow.portal.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSON;
+import com.github.pagehelper.PageHelper;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.common.entity.RefundModel;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
+import com.ym.mec.web.WebFeignService;
+import com.yonge.cooleshow.mall.common.api.CommonPage;
+import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mall.common.enums.TradeStatusEnum;
+import com.yonge.cooleshow.mall.common.exception.Asserts;
+import com.yonge.cooleshow.mall.common.service.RedisService;
+import com.yonge.cooleshow.mall.common.util.DistributedLock;
+import com.yonge.cooleshow.mall.common.util.StringUtil;
+import com.yonge.cooleshow.mbg.mapper.*;
+import com.yonge.cooleshow.mbg.model.*;
+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.service.*;
+import org.redisson.api.RedissonClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 前台订单管理Service
+ * Created by macro on 2018/8/30.
+ */
+@Service
+public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OmsPortalOrderServiceImpl.class);
+    @Autowired
+    private UmsMemberService memberService;
+    @Autowired
+    private OmsCartItemService cartItemService;
+    @Autowired
+    private UmsMemberReceiveAddressService memberReceiveAddressService;
+    @Autowired
+    private UmsMemberCouponService memberCouponService;
+    @Autowired
+    private UmsIntegrationConsumeSettingMapper integrationConsumeSettingMapper;
+    @Autowired
+    private PmsSkuStockMapper skuStockMapper;
+
+    @Autowired
+    private OmsOrderMapper orderMapper;
+    @Autowired
+    private PortalOrderItemDao orderItemDao;
+    @Autowired
+    private SmsCouponHistoryMapper couponHistoryMapper;
+    @Autowired
+    private RedisService redisService;
+    private String REDIS_KEY_ORDER_ID = "redis.key.orderId";
+    private String REDIS_DATABASE = "redis.database";
+    @Autowired
+    private PortalOrderDao portalOrderDao;
+
+    @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+
+    @Autowired
+    private WebFeignService webFeignService;
+
+    @Autowired
+    private OmsOrderSettingMapper orderSettingMapper;
+    @Autowired
+    private OmsOrderItemMapper orderItemMapper;
+
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
+
+
+    @Autowired
+    private PortalProductDao productDao;
+
+    @Override
+    public ConfirmOrderResult generateConfirmOrder(List<Long> cartIds) {
+        ConfirmOrderResult result = new ConfirmOrderResult();
+        //获取购物车信息
+        UmsMember currentMember = memberService.getCurrentMember();
+        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), cartIds,
+                                                                                      true);
+        result.setCartPromotionItemList(cartPromotionItemList);
+        //获取用户收货地址列表
+        List<UmsMemberReceiveAddress> memberReceiveAddressList = memberReceiveAddressService.list();
+        result.setMemberReceiveAddressList(memberReceiveAddressList);
+        //获取用户可用优惠券列表
+        List<SmsCouponHistoryDetail> couponHistoryDetailList = memberCouponService.listCart(cartPromotionItemList, 1);
+        result.setCouponHistoryDetailList(couponHistoryDetailList);
+        //获取用户积分
+        result.setMemberIntegration(currentMember.getIntegration());
+        //获取积分使用规则
+        UmsIntegrationConsumeSetting integrationConsumeSetting = integrationConsumeSettingMapper.selectByPrimaryKey(1L);
+        result.setIntegrationConsumeSetting(integrationConsumeSetting);
+        //计算总金额、活动优惠、应付金额
+        ConfirmOrderResult.CalcAmount calcAmount = calcCartAmount(cartPromotionItemList);
+        result.setCalcAmount(calcAmount);
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> generateOrder(OrderParam orderParam) {
+        OmsOrder order = new OmsOrder();
+        String orderSn = generateOrderSn();
+        if (!StringUtil.isEmpty(orderParam.getOrderNo())) {
+            // 订单号不为空
+            OmsOrderDetail detail = detail(orderParam.getOrderNo());
+            if (detail != null && detail.getStatus() == 0) {
+                // 取消原有的订单支付
+                UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                        orderParam.getOrderNo());
+                userOrderPayment.setStatus(TradeStatusEnum.close.getCode());
+
+                String oldOrderNo = userOrderPayment.getAdapayNo();
+                userOrderPaymentService.saveOrUpdate(userOrderPayment);
+
+                // 增加一个支付中的记录
+                userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+                userOrderPayment.setAdapayNo(orderSn);
+                userOrderPayment.setId(null);
+                userOrderPaymentService.saveOrUpdate(userOrderPayment);
+
+                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount(),
+                                           JSON.toJSONString(detail));
+            } else {
+                throw new BizException("订单信息获取失败");
+            }
+
+        } else {
+            if (orderParam.getMemberReceiveAddressId() == null) {
+                throw new BizException("请选择收货地址");
+            }
+            if (orderParam.getOrderAmount() == null) {
+                throw new BizException("订单金额校验不通过");
+            }
+        }
+        List<OmsOrderItem> orderItemList = new ArrayList<>();
+        //获取购物车及优惠信息
+        UmsMember currentMember;
+        if (orderParam.getUserId() != null && orderParam.getUserId() > 0) {
+            currentMember = memberService.getById(orderParam.getUserId());
+        } else {
+            currentMember =  memberService.getCurrentMember();
+        }
+
+        List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(),
+                                                                                      orderParam.getCartIds(), true);
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            //生成下单商品信息
+            OmsOrderItem orderItem = new OmsOrderItem();
+            orderItem.setProductId(cartPromotionItem.getProductId());
+            orderItem.setProductName(cartPromotionItem.getProductName());
+            orderItem.setProductPic(cartPromotionItem.getProductPic());
+            orderItem.setProductAttr(cartPromotionItem.getProductAttr());
+            orderItem.setProductBrand(cartPromotionItem.getProductBrand());
+            orderItem.setProductSn(cartPromotionItem.getProductSn());
+            orderItem.setProductPrice(cartPromotionItem.getPrice());
+            orderItem.setProductQuantity(cartPromotionItem.getQuantity());
+            orderItem.setProductSkuId(cartPromotionItem.getProductSkuId());
+            orderItem.setProductSkuCode(cartPromotionItem.getProductSkuCode());
+            orderItem.setProductCategoryId(cartPromotionItem.getProductCategoryId());
+            orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());
+            orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());
+            orderItem.setGiftIntegration(cartPromotionItem.getIntegration());
+            orderItem.setGiftGrowth(cartPromotionItem.getGrowth());
+            orderItem.setPromoterId(cartPromotionItem.getPromoterId());
+            orderItem.setPrecisionAmount(BigDecimal.ZERO);
+            orderItemList.add(orderItem);
+        }
+        //判断购物车中商品是否都有库存
+        if (!hasStock(cartPromotionItemList)) {
+            Asserts.fail("库存不足,无法下单");
+        }
+
+        BigDecimal amount = calcTotalAmount(orderItemList);
+        Map data = feignMecCouponAmount(orderParam.getCouponId(), orderParam.getOrderAmount());
+
+        BigDecimal couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
+        if (couponAmount == null) {
+            couponAmount = BigDecimal.ZERO;
+        }
+        //判断使用使用了优惠券
+        if (StringUtil.isEmpty(orderParam.getCouponId())) {
+            //不用优惠券
+            for (OmsOrderItem orderItem : orderItemList) {
+                orderItem.setCouponAmount(new BigDecimal(0));
+            }
+        } else {
+            // todo 使用优惠券 远程调用获取优惠券金额
+            // SmsCouponHistoryDetail couponHistoryDetail = getUseCoupon(cartPromotionItemList, orderParam.getCouponId());
+            //     if (couponHistoryDetail == null) {
+            //         Asserts.fail("该优惠券不可用");
+            // }
+            //对下单商品的优惠券进行处理
+            // HttpResponseResult<CouponInfoApi> couponInfoApiHttpResponseResult = adminFeignService.queryCouponOrderPageInfo(
+            //         currentMember.getId(), orderParam.getCouponId(), orderParam.getOrderAmount(),
+            //         orderParam.getPlatformType());
+            // CouponInfoApi data = couponInfoApiHttpResponseResult.getData();
+            // if(data != null) {
+            //     couponAmount = data.getDiscountedPrices();
+            // }
+            if (couponAmount.compareTo(orderParam.getOrderAmount()) > 0) {
+                couponAmount = orderParam.getOrderAmount();
+            }
+            handleCouponAmount(orderItemList, couponAmount);
+        }
+        //判断是否使用积分
+        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);
+                }
+            }
+        }
+        //计算order_item的实付金额
+        handleRealAmount(orderItemList);
+        //进行sku库存锁定
+        lockSkuStock(cartPromotionItemList);
+
+        // 进行商品库存锁定
+        lockProductStock(cartPromotionItemList);
+
+        //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
+        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());
+        if (StringUtil.isEmpty(orderParam.getCouponId())) {
+            order.setCouponAmount(new BigDecimal(0));
+        } else {
+            order.setCouponId(orderParam.getCouponId());
+            order.setCouponAmount(couponAmount);
+        }
+        if (orderParam.getUseIntegration() == null) {
+            order.setIntegration(0);
+            order.setIntegrationAmount(new BigDecimal(0));
+        } else {
+            order.setIntegration(orderParam.getUseIntegration());
+            order.setIntegrationAmount(calcIntegrationAmount(orderItemList));
+        }
+        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.setMemberId(currentMember.getId());
+        order.setCreateTime(new Date());
+        order.setMemberUsername(currentMember.getUsername());
+        //支付方式:0->未支付;1->支付宝;2->微信
+        order.setPayType(orderParam.getPayType());
+        //订单来源:0->PC订单;1->app订单
+        order.setSourceType(1);
+        //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 -> 未支付
+        order.setStatus(0);
+        //订单类型:0->正常订单;1->秒杀订单
+        order.setOrderType(0);
+        //收货人信息:姓名、电话、邮编、地址
+        UmsMemberReceiveAddress address = memberReceiveAddressService.getItem(orderParam.getMemberReceiveAddressId());
+        order.setReceiverName(address.getName());
+        order.setReceiverPhone(address.getPhoneNumber());
+        order.setReceiverPostCode(address.getPostCode());
+        order.setReceiverProvince(address.getProvince());
+        order.setReceiverCity(address.getCity());
+        order.setReceiverRegion(address.getRegion());
+        order.setReceiverDetailAddress(address.getDetailAddress());
+        //0->未确认;1->已确认
+        order.setConfirmStatus(0);
+        order.setDeleteStatus(0);
+        //计算赠送积分
+        order.setIntegration(calcGifIntegration(orderItemList));
+        //计算赠送成长值
+        order.setGrowth(calcGiftGrowth(orderItemList));
+        //生成订单号
+        order.setOrderSn(orderSn);
+        //设置自动收货天数
+        List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
+        if (CollUtil.isNotEmpty(orderSettings)) {
+            order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+        }
+        //插入order表和order_item表
+        orderMapper.insert(order);
+        for (OmsOrderItem orderItem : orderItemList) {
+            orderItem.setOrderId(order.getId());
+            orderItem.setOrderSn(order.getOrderSn());
+        }
+        orderItemDao.insertList(orderItemList);
+        //如使用优惠券更新优惠券使用状态
+        if (orderParam.getCouponId() != null) {
+            // updateCouponStatus(orderParam.getCouponId(), currentMember.getId(), 1);
+            // todo 远程调用更新优惠券使用
+            // adminFeignService.updateCouponOrderInfo(orderParam.getCouponId(),false,order.getOrderSn());
+        }
+        //如使用积分需要扣除积分
+        if (orderParam.getUseIntegration() != null) {
+            order.setUseIntegration(orderParam.getUseIntegration());
+            memberService.updateIntegration(currentMember.getId(),
+                                            currentMember.getIntegration() - orderParam.getUseIntegration());
+        }
+        //删除购物车中的下单商品
+        deleteCartItemList(cartPromotionItemList, currentMember);
+        //发送延迟消息取消订单
+        sendDelayMessageCancelOrder(order.getId());
+        Map<String, Object> result = new HashMap<>();
+        result.put("order", order);
+        result.put("orderItemList", orderItemList);
+        result.put("orderType","paying");
+
+        // 创建订单时,创建一条用户支付订单信息  金额信息不做处理
+        UserOrderPayment userOrderPayment = new UserOrderPayment();
+        userOrderPayment.setOpenType("ADAPAY");
+        userOrderPayment.setPaymentClient(orderParam.getPlatformType());
+        userOrderPayment.setOrderNo(order.getOrderSn());
+        userOrderPayment.setAdapayNo(order.getOrderSn());
+        userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+
+        if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
+            paySuccess(order.getId(),order.getPayType());
+            order.setStatus(1);
+            result.put("orderType","success");
+            userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
+        }
+        userOrderPaymentService.save(userOrderPayment);
+
+        // 生成订单
+        // 保存商品信息到管乐迷
+        OmsOrderDetail detail = detail(order.getOrderSn());
+        data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
+                                       orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(),
+                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail));
+        result.put("pay",data);
+
+        return result;
+    }
+
+    private Map feignMecCouponAmount(String couponId,BigDecimal amount) {
+
+        MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setCouponIdList(StringUtil.toIntegerList(couponId));
+        model.setAmount(amount);
+        HttpResponseResult<Map> mapHttpResponseResult = webFeignService.couponAmount(model);
+        if (!mapHttpResponseResult.getStatus()) {
+            throw new BizException("管乐迷获取优惠券优惠失败");
+        }
+        return mapHttpResponseResult.getData();
+    }
+
+    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount, String orderDetail) {
+        // 远程调用管乐迷订单记录
+        MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setAmount(amount);
+        model.setOrderNo(orderSn);
+        if (!userId.equals(teacherId)) {
+            model.setTeacherId(teacherId);
+        }
+        model.setUserId(userId);
+        model.setCouponIdList(StringUtil.toIntegerList(couponId));
+        model.setOldOrderNo(oldOrderNo);
+        model.setOrderInfo(orderDetail);
+        HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallCreateOrder(model);
+        if (!mapHttpResponseResult.getStatus()) {
+            throw new BizException("管乐迷订单生成失败");
+        }
+        Map data = mapHttpResponseResult.getData();
+        if (Integer.valueOf(0).equals(MapUtil.get(data,"mallStatus",Integer.class))) {
+            throw new BizException("管乐迷订单生成失败");
+        }
+        return data;
+    }
+
+    @Override
+    public Integer paySuccess(Long orderId, Integer payType) {
+        //修改订单支付状态
+        OmsOrder order = new OmsOrder();
+        order.setId(orderId);
+        order.setStatus(1);
+        order.setPaymentTime(new Date());
+        order.setPayType(payType);
+        orderMapper.updateByPrimaryKeySelective(order);
+        //恢复所有下单商品的锁定库存,扣减真实库存
+        OmsOrderDetail orderDetail = portalOrderDao.getDetail(orderId);
+        // 减sku库存
+        int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
+
+        // 减商品库存
+        updateProductStock(orderDetail);
+
+        // 查询订单
+        // OmsOrderDetail detail = detail(orderId);
+
+        // 设置平台收入和分润
+        // setPromoterRecord(detail,PostStatusEnum.WAIT);
+
+        // 签协议
+        // adminFeignService.contractRecord(new ContractDto(orderDetail.getPlatformType(),orderDetail.getMemberId()));
+
+        return count;
+    }
+
+
+    /**
+     * 减商品库存
+     */
+    private void updateProductStock(OmsOrderDetail orderDetail) {
+        Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
+                                                           .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);
+        }
+        productDao.updateProductStock(productStockList);
+    }
+
+    @Override
+    public Integer cancelTimeOutOrder() {
+        Integer count = 0;
+        OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
+        //查询超时、未支付的订单及订单详情
+        List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime(),
+                                                                             orderSetting.getPayOrderOvertime());
+        if (CollectionUtils.isEmpty(timeOutOrders)) {
+            return count;
+        }
+        for (OmsOrderDetail timeOutOrder : timeOutOrders) {
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(timeOutOrder.getOrderSn())
+                                   , () -> {
+                                       if (timeOutOrder.getStatus() == 0 || timeOutOrder.getStatus() == 6) {
+                                           try {
+                                               cancelOrder(timeOutOrder.getId(), "超时取消");
+                                           } catch (Exception e) {
+                                               LOG.warn("订单取消失败,{}",e.fillInStackTrace());
+                                           }
+                                       }
+                                   }, 60L, TimeUnit.SECONDS);
+
+        }
+        return timeOutOrders.size();
+    }
+
+    @Override
+    public void cancelOrder(Long orderId, String message) {
+        //查询未付款的取消订单
+        OmsOrderExample example = new OmsOrderExample();
+        example.createCriteria().andIdEqualTo(orderId).andDeleteStatusEqualTo(0);
+        List<OmsOrder> cancelOrderList = orderMapper.selectByExample(example);
+        if (CollectionUtils.isEmpty(cancelOrderList)) {
+            return;
+        }
+        OmsOrder cancelOrder = cancelOrderList.get(0);
+        if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
+            UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                    cancelOrder.getOrderSn());
+            if (userOrderPayment != null) {
+                HttpResponseResult<OrderCancelModel> responseResult = webFeignService.cancelOrder(userOrderPayment.getAdapayNo());
+                if (!responseResult.getStatus()) {
+                    throw new BizException("远程取消失败");
+                }
+                OrderCancelModel data = responseResult.getData();
+                if (!data.getSuccess()) {
+                    throw new BizException("远程取消失败");
+                }
+                if (data.getStatus()) {
+                    LOG.info("订单支付成功,修改订单状态");
+                    orderSuccess(cancelOrder, cancelOrder.getPayAmount(), data.getPayChannel());
+                    return;
+                }
+            }
+
+            //修改订单状态为取消
+            cancelOrder.setStatus(4);
+            orderMapper.updateByPrimaryKeySelective(cancelOrder);
+            OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
+            orderItemExample.createCriteria().andOrderIdEqualTo(orderId);
+            List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
+            //解除订单商品库存锁定
+            if (!CollectionUtils.isEmpty(orderItemList)) {
+                portalOrderDao.releaseSkuStockLock(orderItemList);
+                portalOrderDao.releaseProductStockLock(orderItemList);
+            }
+            //修改优惠券使用状态
+            // updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);
+            // todo 退回优惠券
+
+            // adminFeignService.updateCouponOrderInfo(cancelOrder.getCouponId(),true,cancelOrder.getOrderSn());
+            //返还使用积分
+            if (cancelOrder.getUseIntegration() != null) {
+                UmsMember member = memberService.getById(cancelOrder.getMemberId());
+                memberService.updateIntegration(cancelOrder.getMemberId(),
+                                                member.getIntegration() + cancelOrder.getUseIntegration());
+            }
+            // 发起关单
+            // userOrderPaymentService.closePayment(cancelOrder.getOrderSn(), message, data);
+
+
+            // todo 远程取消订单
+
+        } else {
+            throw new BizException("订单状态非待支付和支付中,不能取消");
+        }
+    }
+
+    @Override
+    public void sendDelayMessageCancelOrder(Long orderId) {
+        //获取订单超时时间
+        OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
+        long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000L;
+    }
+
+    @Override
+    public void confirmReceiveOrder(Long orderId) {
+        // UmsMember member = memberService.getCurrentMember();
+        OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
+        // if (!member.getId().equals(order.getMemberId())) {
+        //     Asserts.fail("不能确认他人订单!");
+        // }
+        if (order.getStatus() != 2) {
+            Asserts.fail("该订单还未发货!");
+        }else if (order.getStatus() == 3) {
+            Asserts.fail("已确认收货!");
+        }
+        order.setStatus(3);
+        order.setConfirmStatus(1);
+        order.setReceiveTime(new Date());
+        orderMapper.updateByPrimaryKey(order);
+
+    }
+
+    @Override
+    public CommonPage<OmsOrderDetail> list(String status, Integer pageNum, Integer pageSize) {
+        if (status.equals("-1")) {
+            status = null;
+        }
+        UmsMember member = memberService.getCurrentMember();
+        PageHelper.startPage(pageNum, pageSize);
+        OmsOrderExample orderExample = new OmsOrderExample();
+        OmsOrderExample.Criteria criteria = orderExample.createCriteria();
+        criteria.andDeleteStatusEqualTo(0).andMemberIdEqualTo(member.getId());
+        if (status != null && !StringUtil.isEmpty(status)) {
+            List<Long> list = StringUtil.toLongList(status);
+            List<Integer> collect = list.stream().map(Long::intValue).collect(Collectors.toList());
+            criteria.andStatusIn(collect);
+        }
+        orderExample.setOrderByClause(" field(status,'0','6','1','2','3','4','5'),create_time desc");
+        List<OmsOrder> orderList = orderMapper.selectByExample(orderExample);
+        CommonPage<OmsOrder> orderPage = CommonPage.restPage(orderList);
+        //设置分页信息
+        CommonPage<OmsOrderDetail> resultPage = new CommonPage<>();
+        resultPage.setPageNum(orderPage.getPageNum());
+        resultPage.setPageSize(orderPage.getPageSize());
+        resultPage.setTotal(orderPage.getTotal());
+        resultPage.setTotalPage(orderPage.getTotalPage());
+        if (CollUtil.isEmpty(orderList)) {
+            return resultPage;
+        }
+        //设置数据信息
+        List<Long> orderIds = orderList.stream().map(OmsOrder::getId).collect(Collectors.toList());
+        OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
+        orderItemExample.createCriteria().andOrderIdIn(orderIds);
+        List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
+        List<OmsOrderDetail> orderDetailList = new ArrayList<>();
+        for (OmsOrder omsOrder : orderList) {
+            OmsOrderDetail orderDetail = new OmsOrderDetail();
+            BeanUtil.copyProperties(omsOrder, orderDetail);
+            List<OmsOrderItem> relatedItemList = orderItemList.stream()
+                                                              .filter(item -> item.getOrderId()
+                                                                                  .equals(orderDetail.getId()))
+                                                              .collect(Collectors.toList());
+            orderDetail.setOrderItemList(relatedItemList);
+            orderDetailList.add(orderDetail);
+        }
+        resultPage.setList(orderDetailList);
+        return resultPage;
+    }
+
+    @Override
+    public OmsOrderDetail detail(Long orderId) {
+        OmsOrder omsOrder = orderMapper.selectByPrimaryKey(orderId);
+        OmsOrderItemExample example = new OmsOrderItemExample();
+        example.createCriteria().andOrderIdEqualTo(orderId);
+        List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
+        OmsOrderDetail orderDetail = new OmsOrderDetail();
+        BeanUtil.copyProperties(omsOrder, orderDetail);
+        orderDetail.setOrderItemList(orderItemList);
+        return orderDetail;
+    }
+
+    @Override
+    public OmsOrderDetail detail(String orderSn) {
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andOrderSnEqualTo(orderSn);
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        if (CollUtil.isEmpty(omsOrders)) {
+            throw new BizException("订单信息错误");
+        } else if (omsOrders.size() != 1) {
+            throw new BizException("订单号重复");
+        }
+        OmsOrder omsOrder = omsOrders.get(0);
+        OmsOrderItemExample example = new OmsOrderItemExample();
+        example.createCriteria().andOrderIdEqualTo(omsOrder.getId());
+        List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(example);
+        OmsOrderDetail orderDetail = new OmsOrderDetail();
+        BeanUtil.copyProperties(omsOrder, orderDetail);
+        orderDetail.setOrderItemList(orderItemList);
+        return orderDetail;
+    }
+
+    @Override
+    public void deleteOrder(Long orderId) {
+        UmsMember member = memberService.getCurrentMember();
+        OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
+        if (!member.getId().equals(order.getMemberId())) {
+            Asserts.fail("不能删除他人订单!");
+        }
+        if (order.getStatus() == 3 || order.getStatus() == 4) {
+            order.setDeleteStatus(1);
+            orderMapper.updateByPrimaryKey(order);
+        } else {
+            Asserts.fail("只能删除已完成或已关闭的订单!");
+        }
+    }
+
+
+
+
+    @Override
+    public OmsOrder getOrderById(Long orderId) {
+        return orderMapper.selectByPrimaryKey(orderId);
+    }
+
+
+    @Override
+    public Integer autoReceive() {
+        OmsOrderSetting omsOrderSetting = orderSettingMapper.selectByPrimaryKey(1L);
+        Integer confirmOvertime = omsOrderSetting.getConfirmOvertime();
+        LocalDateTime localDateTime = LocalDateTime.now().plusDays(-confirmOvertime);
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andStatusEqualTo(2).andDeleteStatusEqualTo(0).andConfirmStatusEqualTo(0)
+                .andDeliveryTimeLessThanOrEqualTo(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
+
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        if (CollectionUtils.isEmpty(omsOrders)) {
+            return 0;
+        }
+        for (OmsOrder omsOrder : omsOrders) {
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                                   , () -> {
+                                        try {
+                                            this.confirmReceiveOrder(omsOrder.getId());
+
+                                        }catch (Exception e) {
+                                            LOG.warn("订单收货,{}",e.fillInStackTrace());
+                                        }
+                                   }, 60L, TimeUnit.SECONDS);
+        }
+        return omsOrders.size();
+
+    }
+
+    @Override
+    public Integer shareProfit() {
+        OmsOrderSetting omsOrderSetting = orderSettingMapper.selectByPrimaryKey(1L);
+        Integer finishOvertime = omsOrderSetting.getFinishOvertime();
+        LocalDateTime localDateTime = LocalDateTime.now().plusDays(-finishOvertime);
+        OmsOrderExample orderExample = new OmsOrderExample();
+        orderExample.createCriteria().andStatusEqualTo(3).andDeleteStatusEqualTo(0).andConfirmStatusEqualTo(1)
+                .andAfterSaleEqualTo(0)
+                .andReceiverCityIsNotNull()
+                    .andReceiveTimeLessThan(Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
+
+        List<OmsOrder> omsOrders = orderMapper.selectByExample(orderExample);
+        if (CollectionUtils.isEmpty(omsOrders)) {
+            return 0;
+        }
+        for (OmsOrder omsOrder : omsOrders) {
+
+            DistributedLock.of(redissonClient)
+                           .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
+                                   , () -> {
+                               try {
+                                   this.FinishReceiveOrder(omsOrder.getId());
+
+                               } catch (Exception e) {
+                                   LOG.warn("停止售后失败,{}",e.fillInStackTrace());
+                               }
+                                   }, 60L, TimeUnit.SECONDS);
+        }
+        return omsOrders.size();
+    }
+
+    private void FinishReceiveOrder(Long orderId) {
+
+        // UmsMember member = memberService.getCurrentMember();
+        OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
+        // if (!member.getId().equals(order.getMemberId())) {
+        //     Asserts.fail("不能确认他人订单!");
+        // }
+         if (order.getStatus() != 3) {
+            Asserts.fail("未确认收货!");
+        }
+        order.setAfterSale(1);
+        orderMapper.updateByPrimaryKey(order);
+
+
+        // 设置平台收入和分润 实际收款
+        // setPromoterRecord(detail(orderId), PostStatusEnum.RECORDED);
+    }
+
+
+    /***
+     * 处理回调-支付成功
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    @Override
+    @Transactional
+    public void paymentSucceededHandle(String orderNo, BigDecimal payAmount, String payChannel) {
+        //订单完成
+        UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(orderNo);
+        if (orderPayment == null) {
+            throw new BizException("订单支付信息未找到");
+        }
+        OmsOrderDetail detail = detail(orderPayment.getOrderNo());
+        if (detail.getStatus() == 0) {
+            orderSuccess(detail, payAmount, payChannel);
+
+            orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
+            userOrderPaymentService.saveOrUpdate(orderPayment);
+            Map<String,Object> notifyMap = new HashMap<>();
+            notifyMap.put("channelType", payChannel);
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("totalMoney", payAmount);
+            notifyMap.put("merOrderNo",orderNo);
+            HttpResponseResult httpResponseResult = webFeignService.updateOrder(notifyMap);
+            if (!httpResponseResult.getStatus()) {
+                throw new BizException(httpResponseResult.getMsg());
+            }
+        } else {
+            LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
+
+
+            orderRefund(orderPayment,detail.getPayAmount().toString());
+        }
+
+    }
+
+    /**
+     * 支付成功,业务退款
+     */
+    private void orderRefund(UserOrderPayment userOrderPayment,String refundAmount) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getAdapayNo());
+        if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
+            LOG.warn("支付金额已退回");
+            return;
+        }
+
+        String orderSn = generateOrderSn();
+
+        HttpResponseResult<Map<String,String>> httpResponseResult = webFeignService.getBaseUrl(userOrderPayment.getAdapayNo());
+        if (!httpResponseResult.getStatus()) {
+            throw new BizException("获取回调路径失败");
+        }
+        Map<String, String> data = httpResponseResult.getData();
+        String baseUrl = MapUtil.getStr(data,"baseUrl");
+        String transNo = MapUtil.getStr(data,"transNo");
+        // 金额退回
+        RefundModel refundModel = new RefundModel();
+        refundModel.setRefundNo(orderSn);
+        refundModel.setOrderNo(userOrderPayment.getAdapayNo());
+        refundModel.setNotifyUrl(baseUrl + "/api-mall-portal/payment/callback");
+        HttpResponseResult<BaseResult<Map<String, Object>>> refund = webFeignService.refund(refundModel);
+        if (!refund.getStatus()) {
+            LOG.error("退款失败:{}",refund.getMsg());
+            throw new BizException("退款失败");
+        }
+        BaseResult<Map<String, Object>> mapBaseResult = refund.getData();
+        userOrderRefund = new UserOrderRefund();
+        userOrderRefund.setOrderNo(orderSn);
+        userOrderRefund.setPayTransNo(transNo);
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+        userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
+        if (mapBaseResult.getStatus()) {
+            Map<String,Object> refundBill = mapBaseResult.getData();
+            userOrderRefund.setRefundAmt(new BigDecimal(MapUtil.getStr(refundBill,"reversed_amt")));
+            userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
+        } else {
+            userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderRefund.setPayFailMsg("退款失败:" +mapBaseResult.getMsg());
+        }
+        userOrderRefundMapper.insert(userOrderRefund);
+    }
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    @Override
+    @Transactional
+    public void paymentFailedHandle(String orderNo, Map<String, Object> notifyMap) {
+        UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(orderNo);
+        if (orderPayment == null) {
+            throw new BizException("订单支付信息未找到");
+        }
+        OmsOrderDetail detail = detail(orderPayment.getOrderNo());
+        if (null == detail) {
+            LOG.error("汇付支付回调,订单未找到。 req is {}", orderNo);
+            throw new BizException("订单未找到");
+        }
+        if (detail.getStatus() == 0) {
+            cancelOrder(detail.getId(), "支付失败");
+
+            // 修改用户付款状态
+            orderPayment.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderPaymentService.saveOrUpdate(orderPayment);
+            HttpResponseResult httpResponseResult = webFeignService.updateOrder(notifyMap);
+            if (!httpResponseResult.getStatus()) {
+                throw new BizException(httpResponseResult.getMsg());
+            }
+        } else {
+            LOG.error("汇付支付回调,订单状态异常。 req is {}", orderNo);
+        }
+    }
+
+    @Override
+    public List<OmsOrderDetail> list(List<String> adapayNoList) {
+        String adapayNos = adapayNoList.stream().collect(Collectors.joining(","));
+
+        List<OmsOrder> orderList = portalOrderDao.listByAdapayNo(adapayNoList,adapayNos);
+        //设置数据信息
+        List<Long> orderIds = orderList.stream().map(OmsOrder::getId).collect(Collectors.toList());
+        OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
+        orderItemExample.createCriteria().andOrderIdIn(orderIds);
+        List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
+        List<OmsOrderDetail> orderDetailList = new ArrayList<>();
+        for (OmsOrder omsOrder : orderList) {
+            OmsOrderDetail orderDetail = new OmsOrderDetail();
+            BeanUtil.copyProperties(omsOrder, orderDetail);
+            List<OmsOrderItem> relatedItemList = orderItemList.stream()
+                                                              .filter(item -> item.getOrderId()
+                                                                                  .equals(orderDetail.getId()))
+                                                              .collect(Collectors.toList());
+            orderDetail.setOrderItemList(relatedItemList);
+            orderDetailList.add(orderDetail);
+        }
+        return orderDetailList;
+    }
+
+    /**
+     * 订单完成
+     *
+     * @param: detail
+     * @updateTime 2022/4/13 17:17
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void orderSuccess(OmsOrder detail,BigDecimal payAmount,String payChannel) {
+
+        if (payAmount.compareTo(detail.getPayAmount()) != 0) {
+            LOG.error("订单金额和实际支付金额不符");
+            throw new BizException("订单金额和实际支付金额不符");
+        } else {
+            if ("alipay_qr".equals(payChannel) || "alipay_wap".equals(payChannel)) {
+                paySuccess(detail.getId(), 1);
+            } else if ("wx_pub".equals(payChannel) || "wx_app".equals(payChannel)) {
+                paySuccess(detail.getId(), 2);
+            }
+        }
+    }
+
+    /**
+     * 退款成功
+     */
+    @Override
+    @Transactional
+    public void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo, String feeAmt) {
+
+        LOG.info("refund payTransNo is {}", payTransNo);
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        if (userOrderRefund == null) {
+            LOG.warn("未找到退款订单");
+            return;
+        }
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.succeeded.getCode());
+        userOrderRefund.setTransNo(refundTransNo);
+        userOrderRefund.setFeeAmt(new BigDecimal(feeAmt));
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
+
+    /**
+     * 退款失败
+     */
+    @Override
+    @Transactional
+    public void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo) {
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+        userOrderRefund.setPayFailMsg(msg);
+        userOrderRefund.setTransNo(refundTransNo);
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
+
+    /**
+     * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id
+     */
+    private String generateOrderSn() {
+        return String.valueOf(idGeneratorService.generatorId("mall"));
+    }
+
+    /**
+     * 删除下单商品的购物车信息
+     */
+    private void deleteCartItemList(List<CartPromotionItem> cartPromotionItemList, UmsMember currentMember) {
+        List<Long> ids = new ArrayList<>();
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            ids.add(cartPromotionItem.getId());
+        }
+        cartItemService.delete(currentMember.getId(), ids);
+    }
+
+    /**
+     * 计算该订单赠送的成长值
+     */
+    private Integer calcGiftGrowth(List<OmsOrderItem> orderItemList) {
+        int sum = 0;
+        for (OmsOrderItem orderItem : orderItemList) {
+            sum = sum + orderItem.getGiftGrowth() * orderItem.getProductQuantity();
+        }
+        return sum;
+    }
+
+    /**
+     * 计算该订单赠送的积分
+     */
+    private Integer calcGifIntegration(List<OmsOrderItem> orderItemList) {
+        int sum = 0;
+        for (OmsOrderItem orderItem : orderItemList) {
+            sum += orderItem.getGiftIntegration() * orderItem.getProductQuantity();
+        }
+        return sum;
+    }
+
+    /**
+     * 将优惠券信息更改为指定状态
+     *
+     * @param couponId  优惠券id
+     * @param memberId  会员id
+     * @param useStatus 0->未使用;1->已使用
+     */
+    private void updateCouponStatus(Long couponId, Long memberId, Integer useStatus) {
+        if (couponId == null) return;
+        //查询第一张优惠券
+        SmsCouponHistoryExample example = new SmsCouponHistoryExample();
+        example.createCriteria()
+               .andMemberIdEqualTo(memberId)
+               .andCouponIdEqualTo(couponId)
+               .andUseStatusEqualTo(useStatus == 0 ? 1 : 0);
+        List<SmsCouponHistory> couponHistoryList = couponHistoryMapper.selectByExample(example);
+        if (!CollectionUtils.isEmpty(couponHistoryList)) {
+            SmsCouponHistory couponHistory = couponHistoryList.get(0);
+            couponHistory.setUseTime(new Date());
+            couponHistory.setUseStatus(useStatus);
+            couponHistoryMapper.updateByPrimaryKeySelective(couponHistory);
+        }
+    }
+
+    private void handleRealAmount(List<OmsOrderItem> orderItemList) {
+        for (OmsOrderItem orderItem : orderItemList) {
+            //原价-促销优惠-优惠券抵扣-积分抵扣
+            BigDecimal realAmount = orderItem.getProductPrice()
+                                             .subtract(orderItem.getPromotionAmount())
+                                             .subtract(orderItem.getCouponAmount())
+                                             .subtract(orderItem.getIntegrationAmount());
+            orderItem.setRealAmount(realAmount);
+        }
+    }
+
+    /**
+     * 获取订单促销信息
+     */
+    private String getOrderPromotionInfo(List<OmsOrderItem> orderItemList) {
+        StringBuilder sb = new StringBuilder();
+        for (OmsOrderItem orderItem : orderItemList) {
+            sb.append(orderItem.getPromotionName());
+            sb.append(";");
+        }
+        String result = sb.toString();
+        if (result.endsWith(";")) {
+            result = result.substring(0, result.length() - 1);
+        }
+        return result;
+    }
+
+    /**
+     * 计算订单应付金额
+     */
+    private BigDecimal calcPayAmount(OmsOrder order) {
+        //总金额+运费-促销优惠-优惠券优惠-积分抵扣
+        return order.getTotalAmount()
+                    .add(order.getFreightAmount())
+                    .subtract(order.getPromotionAmount())
+                    .subtract(order.getCouponAmount())
+                    .subtract(order.getIntegrationAmount());
+    }
+
+    /**
+     * 计算订单优惠券金额
+     */
+    private BigDecimal calcIntegrationAmount(List<OmsOrderItem> orderItemList) {
+        BigDecimal integrationAmount = new BigDecimal(0);
+        for (OmsOrderItem orderItem : orderItemList) {
+            if (orderItem.getIntegrationAmount() != null) {
+                integrationAmount = integrationAmount.add(
+                        orderItem.getIntegrationAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+            }
+        }
+        return integrationAmount;
+    }
+
+    /**
+     * 计算订单优惠券金额
+     */
+    private BigDecimal calcCouponAmount(List<OmsOrderItem> orderItemList) {
+        BigDecimal couponAmount = new BigDecimal(0);
+        for (OmsOrderItem orderItem : orderItemList) {
+            if (orderItem.getCouponAmount() != null) {
+                couponAmount = couponAmount.add(
+                        orderItem.getCouponAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+            }
+        }
+        return couponAmount;
+    }
+
+    /**
+     * 计算订单活动优惠
+     */
+    private BigDecimal calcPromotionAmount(List<OmsOrderItem> orderItemList) {
+        BigDecimal promotionAmount = new BigDecimal(0);
+        for (OmsOrderItem orderItem : orderItemList) {
+            if (orderItem.getPromotionAmount() != null) {
+                promotionAmount = promotionAmount.add(
+                        orderItem.getPromotionAmount().multiply(new BigDecimal(orderItem.getProductQuantity())));
+            }
+        }
+        return promotionAmount;
+    }
+
+    /**
+     * 获取可用积分抵扣金额
+     *
+     * @param useIntegration 使用的积分数量
+     * @param totalAmount    订单总金额
+     * @param currentMember  使用的用户
+     * @param hasCoupon      是否已经使用优惠券
+     */
+    private BigDecimal getUseIntegrationAmount(Integer useIntegration, BigDecimal totalAmount, UmsMember currentMember, boolean hasCoupon) {
+        BigDecimal zeroAmount = new BigDecimal(0);
+        //判断用户是否有这么多积分
+        if (useIntegration.compareTo(currentMember.getIntegration()) > 0) {
+            return zeroAmount;
+        }
+        //根据积分使用规则判断是否可用
+        //是否可与优惠券共用
+        UmsIntegrationConsumeSetting integrationConsumeSetting = integrationConsumeSettingMapper.selectByPrimaryKey(1L);
+        if (hasCoupon && integrationConsumeSetting.getCouponStatus().equals(0)) {
+            //不可与优惠券共用
+            return zeroAmount;
+        }
+        //是否达到最低使用积分门槛
+        if (useIntegration.compareTo(integrationConsumeSetting.getUseUnit()) < 0) {
+            return zeroAmount;
+        }
+        //是否超过订单抵用最高百分比
+        BigDecimal integrationAmount = new BigDecimal(useIntegration).divide(
+                new BigDecimal(integrationConsumeSetting.getUseUnit()), 2, RoundingMode.HALF_EVEN);
+        BigDecimal maxPercent = new BigDecimal(integrationConsumeSetting.getMaxPercentPerOrder()).divide(
+                new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
+        if (integrationAmount.compareTo(totalAmount.multiply(maxPercent)) > 0) {
+            return zeroAmount;
+        }
+        return integrationAmount;
+    }
+
+    /**
+     * 对优惠券优惠进行处理
+     *
+     * @param orderItemList       order_item列表
+     * @param couponAmount 可用优惠券详情
+     */
+    private void handleCouponAmount(List<OmsOrderItem> orderItemList, BigDecimal couponAmount) {
+        // SmsCoupon coupon = couponHistoryDetail.getCoupon();
+        // if (coupon.getUseType().equals(0)) {
+            //全场通用
+            calcPerCouponAmount(orderItemList, couponAmount);
+        // } else if (coupon.getUseType().equals(1)) {
+        //     //指定分类
+        //     List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
+        //                                                                           0);
+        //     calcPerCouponAmount(couponOrderItemList, coupon);
+        // } else if (coupon.getUseType().equals(2)) {
+        //     //指定商品
+        //     List<OmsOrderItem> couponOrderItemList = getCouponOrderItemByRelation(couponHistoryDetail, orderItemList,
+        //                                                                           1);
+        //     calcPerCouponAmount(couponOrderItemList, coupon);
+        // }
+    }
+
+    /**
+     * 对每个下单商品进行优惠券金额分摊的计算
+     *
+     * @param orderItemList 可用优惠券的下单商品商品
+     */
+    private void calcPerCouponAmount(List<OmsOrderItem> orderItemList, BigDecimal coupon) {
+        BigDecimal totalAmount = calcTotalAmount(orderItemList);
+        for (OmsOrderItem orderItem : orderItemList) {
+            //(商品价格/可用商品总价)*优惠券面额
+            BigDecimal couponAmount = orderItem.getProductPrice()
+                                               .divide(totalAmount, 2, BigDecimal.ROUND_DOWN)
+                                               .multiply(coupon);
+            orderItem.setCouponAmount(couponAmount);
+
+            orderItem.setPrecisionAmount(BigDecimal.ZERO);
+
+        }
+        BigDecimal reduce = orderItemList.stream()
+                                         .map(omsOrderItem -> omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())))
+                                         .reduce(BigDecimal.ZERO, BigDecimal::add);
+        OmsOrderItem omsOrderItem = orderItemList.get(0);
+        omsOrderItem.setPrecisionAmount(coupon.subtract(reduce));
+
+    }
+
+    /**
+     * 获取与优惠券有关系的下单商品
+     *
+     * @param couponHistoryDetail 优惠券详情
+     * @param orderItemList       下单商品
+     * @param type                使用关系类型:0->相关分类;1->指定商品
+     */
+    private List<OmsOrderItem> getCouponOrderItemByRelation(SmsCouponHistoryDetail couponHistoryDetail, List<OmsOrderItem> orderItemList, int type) {
+        List<OmsOrderItem> result = new ArrayList<>();
+        if (type == 0) {
+            List<Long> categoryIdList = new ArrayList<>();
+            for (SmsCouponProductCategoryRelation productCategoryRelation : couponHistoryDetail.getCategoryRelationList()) {
+                categoryIdList.add(productCategoryRelation.getProductCategoryId());
+            }
+            for (OmsOrderItem orderItem : orderItemList) {
+                if (categoryIdList.contains(orderItem.getProductCategoryId())) {
+                    result.add(orderItem);
+                } else {
+                    orderItem.setCouponAmount(new BigDecimal(0));
+                }
+            }
+        } else if (type == 1) {
+            List<Long> productIdList = new ArrayList<>();
+            for (SmsCouponProductRelation productRelation : couponHistoryDetail.getProductRelationList()) {
+                productIdList.add(productRelation.getProductId());
+            }
+            for (OmsOrderItem orderItem : orderItemList) {
+                if (productIdList.contains(orderItem.getProductId())) {
+                    result.add(orderItem);
+                } else {
+                    orderItem.setCouponAmount(new BigDecimal(0));
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 获取该用户可以使用的优惠券
+     *
+     * @param cartPromotionItemList 购物车优惠列表
+     * @param couponId              使用优惠券id
+     */
+    private SmsCouponHistoryDetail getUseCoupon(List<CartPromotionItem> cartPromotionItemList, Long couponId) {
+        List<SmsCouponHistoryDetail> couponHistoryDetailList = memberCouponService.listCart(cartPromotionItemList, 1);
+        for (SmsCouponHistoryDetail couponHistoryDetail : couponHistoryDetailList) {
+            if (couponHistoryDetail.getCoupon().getId().equals(couponId)) {
+                return couponHistoryDetail;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 计算总金额
+     */
+    private BigDecimal calcTotalAmount(List<OmsOrderItem> orderItemList) {
+        BigDecimal totalAmount = new BigDecimal("0");
+        for (OmsOrderItem item : orderItemList) {
+            totalAmount = totalAmount.add(item.getProductPrice().multiply(new BigDecimal(item.getProductQuantity())));
+        }
+        return totalAmount;
+    }
+
+    /**
+     * 锁定下单商品的所有库存
+     */
+    private void lockSkuStock(List<CartPromotionItem> cartPromotionItemList) {
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            if (cartPromotionItem.getProductSkuId() == null) {
+                continue;
+            }
+            int i = skuStockMapper.lockStock(cartPromotionItem.getProductSkuId(), cartPromotionItem.getQuantity());
+            if (i == 0) {
+                Asserts.fail("库存不足");
+            }
+        }
+    }
+
+    /**
+     * 锁定下单商品的所有库存
+     */
+    private void lockProductStock(List<CartPromotionItem> cartPromotionItemList) {
+        Map<Long, List<CartPromotionItem>> collect = cartPromotionItemList.stream()
+                                                                          .collect(Collectors.groupingBy(
+                                                                                  CartPromotionItem::getProductId));
+        for (Map.Entry<Long, List<CartPromotionItem>> entry : collect.entrySet()) {
+            List<CartPromotionItem> value = entry.getValue();
+            if (CollectionUtils.isEmpty(value)) {
+                continue;
+            }
+            int sum = value.stream().mapToInt(CartPromotionItem::getQuantity).sum();
+            if (sum > 0) {
+                int i = pmsProductMapper.lockStock(entry.getKey(), sum);
+                if (i == 0) {
+                    Asserts.fail("库存不足");
+                }
+            }
+        }
+    }
+
+    /**
+     * 判断下单商品是否都有库存
+     */
+    private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) {
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            if (cartPromotionItem.getRealStock() == null || cartPromotionItem.getRealStock() <= 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 计算购物车中商品的价格
+     */
+    private ConfirmOrderResult.CalcAmount calcCartAmount(List<CartPromotionItem> cartPromotionItemList) {
+        ConfirmOrderResult.CalcAmount calcAmount = new ConfirmOrderResult.CalcAmount();
+        calcAmount.setFreightAmount(new BigDecimal(0));
+        BigDecimal totalAmount = new BigDecimal("0");
+        BigDecimal promotionAmount = new BigDecimal("0");
+        for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
+            totalAmount = totalAmount.add(
+                    cartPromotionItem.getPrice().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
+            promotionAmount = promotionAmount.add(
+                    cartPromotionItem.getReduceAmount().multiply(new BigDecimal(cartPromotionItem.getQuantity())));
+        }
+        calcAmount.setTotalAmount(totalAmount);
+        calcAmount.setPromotionAmount(promotionAmount);
+        calcAmount.setPayAmount(totalAmount.subtract(promotionAmount));
+        return calcAmount;
+    }
+
+}

+ 9 - 2
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberReceiveAddressServiceImpl.java

@@ -74,13 +74,20 @@ public class UmsMemberReceiveAddressServiceImpl implements UmsMemberReceiveAddre
 
     @Override
     public UmsMemberReceiveAddress getItem(Long id) {
-        UmsMember currentMember = memberService.getCurrentMember();
         UmsMemberReceiveAddressExample example = new UmsMemberReceiveAddressExample();
-        example.createCriteria().andMemberIdEqualTo(currentMember.getId()).andIdEqualTo(id);
+        example.createCriteria().andIdEqualTo(id);
         List<UmsMemberReceiveAddress> addressList = addressMapper.selectByExample(example);
         if(!CollectionUtils.isEmpty(addressList)){
             return addressList.get(0);
         }
         return null;
     }
+
+    @Override
+    public List<UmsMemberReceiveAddress> listByUserId(Long userId) {
+        UmsMemberReceiveAddressExample example = new UmsMemberReceiveAddressExample();
+        example.createCriteria().andMemberIdEqualTo(userId);
+        return addressMapper.selectByExample(example);
+
+    }
 }

+ 14 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java

@@ -56,7 +56,15 @@ public class UmsMemberServiceImpl implements UmsMemberService {
 
     @Override
     public UmsMember getById(Long id) {
-        return memberMapper.selectByPrimaryKey(id);
+        UmsMember umsMember = memberMapper.selectByPrimaryKey(id);
+        if (umsMember == null) {
+            SysUser sysUser = sysUserFeignService.queryUserById(id.intValue());
+            if (sysUser == null || sysUser.getId() == null) {
+                throw new BizException("用户信息获取失败");
+            }
+            umsMember = getUmsMember(sysUser, umsMember);
+        }
+        return umsMember;
     }
 
     @Override
@@ -66,6 +74,11 @@ public class UmsMemberServiceImpl implements UmsMemberService {
             throw new BizException("用户信息获取失败");
         }
         UmsMember umsMember = getById(sysUser.getId().longValue());
+        umsMember = getUmsMember(sysUser, umsMember);
+        return umsMember;
+    }
+
+    private UmsMember getUmsMember(SysUser sysUser, UmsMember umsMember) {
         // 商城库用户不存在-> 创建
         if (umsMember == null || umsMember.getId() == null) {
             umsMember = new UmsMember();

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

@@ -1,113 +1,56 @@
-// package com.yonge.cooleshow.portal.service.impl;
-//
-// import com.yonge.cooleshow.mbg.mapper.UserOrderPaymentMapper;
-// import com.yonge.cooleshow.mbg.model.UserOrderPayment;
-// import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
-// import com.yonge.toolset.base.result.BaseResult;
-// import com.yonge.toolset.base.util.StringUtil;
-// import com.yonge.toolset.payment.base.enums.OpenEnum;
-// import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-// import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
-// import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
-// import com.yonge.toolset.payment.base.model.ClosePayment;
-// import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
-// import com.yonge.toolset.payment.core.service.PaymentClient;
-// import org.springframework.beans.factory.annotation.Autowired;
-// import org.springframework.stereotype.Service;
-//
-// import java.util.Date;
-// import java.util.List;
-//
-// /**
-//  * Description
-//  *
-//  * @author liujunchi
-//  * @date 2022-04-24
-//  */
-// @Service
-// public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
-//
-//     @Autowired
-//     private UserOrderPaymentMapper userOrderPaymentMapper;
-//
-//     @Autowired(required = true)
-//     private PaymentClient paymentClient;
-//
-//     @Override
-//     public UserOrderPayment getByTranNo(String transNo) {
-//         return userOrderPaymentMapper.selectByTranNo(transNo);
-//     }
-//
-//     @Override
-//     public void save(UserOrderPayment userOrderPayment) {
-//         userOrderPaymentMapper.insert(userOrderPayment);
-//     }
-//
-//     @Override
-//     public void saveOrUpdate(UserOrderPayment userOrderPayment) {
-//         if (userOrderPayment.getId() == null) {
-//             userOrderPaymentMapper.insert(userOrderPayment);
-//         } else {
-//             userOrderPaymentMapper.updateByPrimaryKeySelective(userOrderPayment);
-//         }
-//     }
-//
-//     @Override
-//     public UserOrderPayment getByOrderNo(String orderSn, PayChannelEnum payChannel, TradeStatusEnum payStatus) {
-//
-//         return userOrderPaymentMapper.selectByOrderNoAndStatus(orderSn, payChannel.getCode(), payStatus.getCode());
-//     }
-//
-//     @Override
-//     public List<UserOrderPayment> getByOrderNo(String orderSn) {
-//         return userOrderPaymentMapper.selectByOrderNo(orderSn);
-//     }
-//
-//     @Override
-//     public void closePayment(String orderSn, String message, PaymentCallBack data) {
-//         UserOrderPayment orderPayment = userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
-//
-//         if (orderPayment != null) {
-//             //更新付款单
-//             orderPayment.setStatus(TradeStatusEnum.failed.getCode());
-//             orderPayment.setPayFailMsg(StringUtil.isEmpty(message) ? "交易取消" : message);
-//             orderPayment.setUpdateTime(new Date());
-//             if(data != null) {
-//                 orderPayment.setTransNo(data.getId());
-//             }
-//
-//             //发送支付关单请求
-//             if (!StringUtil.isEmpty(orderPayment.getTransNo()) || !StringUtil.isEmpty(orderPayment.getAdapayNo())) {
-//                 ClosePayment closePayment = new ClosePayment(OpenEnum.valueOf(orderPayment.getOpenType()),
-//                         PaymentClientEnum.valueOf(orderPayment.getPaymentClient()),
-//                         PayChannelEnum.valueOf(orderPayment.getPayChannel()));
-//                 closePayment.setId(orderPayment.getTransNo());
-//                 closePayment.setReason(message);
-//                 closePayment.setPaymentNo(orderPayment.getAdapayNo());
-//                 BaseResult<ClosePayment> closePaymentBaseResult = paymentClient.closePayment(closePayment);
-//                 if (!closePaymentBaseResult.getStatus()) {
-//                     orderPayment.setCloseStatus(TradeStatusEnum.failed.getCode());
-//                     orderPayment.setCloseFailMsg(closePaymentBaseResult.getMsg());
-//                 } else {
-//                     orderPayment.setCloseStatus(TradeStatusEnum.pending.getCode());
-//                 }
-//             }
-//             userOrderPaymentMapper.updateByPrimaryKeySelective(orderPayment);
-//         }
-//     }
-//
-//     @Override
-//     public UserOrderPayment getByOrderNoAndStatusPaying(String orderSn) {
-//         return userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
-//     }
-//
-//     @Override
-//     public UserOrderPayment getByOrderNoAndStatusSucceeded(String orderSn) {
-//         return userOrderPaymentMapper.selectByOrderNoAndStatusSucceeded(orderSn);
-//     }
-//
-//     @Override
-//     public UserOrderPayment getByAdapayNo(String paymentNo) {
-//         return userOrderPaymentMapper.selectByAdapayNo(paymentNo);
-//     }
-// }
+package com.yonge.cooleshow.portal.service.impl;
+
+import com.yonge.cooleshow.mbg.mapper.UserOrderPaymentMapper;
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-24
+ */
+@Service
+public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
+
+    @Autowired
+    private UserOrderPaymentMapper userOrderPaymentMapper;
+
+
+
+    @Override
+    public void save(UserOrderPayment userOrderPayment) {
+        userOrderPaymentMapper.insert(userOrderPayment);
+    }
+
+    @Override
+    public void saveOrUpdate(UserOrderPayment userOrderPayment) {
+        if (userOrderPayment.getId() == null) {
+            userOrderPaymentMapper.insert(userOrderPayment);
+        } else {
+            userOrderPaymentMapper.updateByPrimaryKeySelective(userOrderPayment);
+        }
+    }
+
+
+    @Override
+    public List<UserOrderPayment> getByOrderNo(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNo(orderSn);
+    }
+
+
+    @Override
+    public UserOrderPayment getByOrderNoAndStatusPaying(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
+    }
+
+    @Override
+    public UserOrderPayment getByAdapayNo(String paymentNo) {
+        return userOrderPaymentMapper.selectByAdapayNo(paymentNo);
+    }
+}

+ 56 - 56
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java

@@ -1,56 +1,56 @@
-// package com.yonge.cooleshow.portal.task;
-//
-// import com.ym.mec.common.controller.BaseController;
-// import com.ym.mec.common.entity.HttpResponseResult;
-// import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
-// import org.slf4j.Logger;
-// import org.slf4j.LoggerFactory;
-// import org.springframework.beans.factory.annotation.Autowired;
-// import org.springframework.web.bind.annotation.GetMapping;
-// import org.springframework.web.bind.annotation.RequestMapping;
-// import org.springframework.web.bind.annotation.RestController;
-// import springfox.documentation.annotations.ApiIgnore;
-//
-// /**
-//  * 取消超时订单并解锁库存的定时器
-//  * Created by macro on 2018/8/24.
-//  */
-// @RestController
-// @RequestMapping("/task")
-// @ApiIgnore
-// public class OrderTimeOutCancelTask extends BaseController {
-//     private Logger LOGGER =LoggerFactory.getLogger(OrderTimeOutCancelTask.class);
-//     @Autowired
-//     private OmsPortalOrderService portalOrderService;
-//
-//     /**
-//      * 订单轮询
-//      */
-//     @GetMapping("/cancelTimeOutOrder")
-//     public HttpResponseResult cancelTimeOutOrder(){
-//         Integer count = portalOrderService.cancelTimeOutOrder();
-//         LOGGER.info("取消订单,并根据sku编号释放锁定库存,取消订单数量:{}",count);
-//         return succeed();
-//     }
-//
-//     /**
-//      * 发货多少天后自动收货
-//      */
-//     @GetMapping("/autoReceive")
-//     public HttpResponseResult autoReceive(){
-//         Integer count = portalOrderService.autoReceive();
-//         LOGGER.info("自动收货:{}",count);
-//         return succeed();
-//     }
-//
-//
-//     /**
-//      * 收货多少天后分润
-//      */
-//     @GetMapping("/shareProfit")
-//     public HttpResponseResult shareProfit(){
-//         Integer count = portalOrderService.shareProfit();
-//         LOGGER.info("自动分润:{}",count);
-//         return succeed();
-//     }
-// }
+package com.yonge.cooleshow.portal.task;
+
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+/**
+ * 取消超时订单并解锁库存的定时器
+ * Created by macro on 2018/8/24.
+ */
+@RestController
+@RequestMapping("/task")
+@ApiIgnore
+public class OrderTimeOutCancelTask extends BaseController {
+    private Logger LOGGER =LoggerFactory.getLogger(OrderTimeOutCancelTask.class);
+    @Autowired
+    private OmsPortalOrderService portalOrderService;
+
+    /**
+     * 订单轮询
+     */
+    @GetMapping("/cancelTimeOutOrder")
+    public HttpResponseResult cancelTimeOutOrder(){
+        Integer count = portalOrderService.cancelTimeOutOrder();
+        LOGGER.info("取消订单,并根据sku编号释放锁定库存,取消订单数量:{}",count);
+        return succeed();
+    }
+
+    /**
+     * 发货多少天后自动收货
+     */
+    @GetMapping("/autoReceive")
+    public HttpResponseResult autoReceive(){
+        Integer count = portalOrderService.autoReceive();
+        LOGGER.info("自动收货:{}",count);
+        return succeed();
+    }
+
+
+    /**
+     * 收货多少天后分润
+     */
+    @GetMapping("/shareProfit")
+    public HttpResponseResult shareProfit(){
+        Integer count = portalOrderService.shareProfit();
+        LOGGER.info("自动分润:{}",count);
+        return succeed();
+    }
+}

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

@@ -41,10 +41,8 @@
         FROM
             oms_order o
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id
-        left join user_order_payment uop on uop.order_no_ = o.order_sn and uop.status_ = 'pending'
         WHERE
-            (o.status = 6 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{orderMinute} MINUTE))
-            or (o.status = 0 and uop.create_time_ &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE));
+            (o.status = 0 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE))
     </select>
 
     <update id="updateSkuStock">
@@ -108,4 +106,17 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <select id="listByAdapayNo" resultType="com.yonge.cooleshow.mbg.model.OmsOrder">
+        select oo.* from
+        user_order_payment uop
+        left join oms_order oo on oo.order_sn = uop.adapay_no_
+        <where>
+            uop.adapay_no_ in
+            <foreach collection="alapayNoList" separator="," item="item" close=")" open="(" >
+                #{item}
+            </foreach>
+        </where>
+        order by find_in_set(uop.adapay_no_,#{adapayNos})
+    </select>
 </mapper>

+ 1 - 1
mec-mall/pom.xml

@@ -89,6 +89,6 @@
         <module>mall-mbg</module>
         <module>mall-admin</module>
         <module>mall-common</module>
-<!--        <module>mall-portal</module>-->
+        <module>mall-portal</module>
     </modules>
 </project>

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -305,7 +305,7 @@ public class StudentOrderController extends BaseController {
                     orderDetail.put("additionCourseInfo", studentPaymentOrderDetails.get(0).getGoodsIdList());
                 }
             }
-        } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)) {
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)|| orderByOrderNo.getGroupType().equals(GroupType.MALL_SELL)) {
             orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
         } else if (orderByOrderNo.getGroupType().equals(GroupType.REPLACEMENT)) {
             orderDetail.put("detail", replacementInstrumentActivityDao.getInfo(Integer.parseInt(orderByOrderNo.getMusicGroupId())));

+ 24 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/CancelTimeOutOrderTask.java

@@ -0,0 +1,24 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.MallPortalFeignService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 订单轮询
+ * @Author: liweifan
+ * @Data: 2022/4/13 17:36
+ */
+@Service
+public class CancelTimeOutOrderTask extends BaseTask {
+
+    @Autowired
+    private MallPortalFeignService mallPortalFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = mallPortalFeignService.cancelTimeOutOrder();
+    }
+}

+ 22 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/MallAutoReceiveTask.java

@@ -0,0 +1,22 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.MallPortalFeignService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 自动收货
+ */
+@Service
+public class MallAutoReceiveTask extends BaseTask {
+
+    @Autowired
+    private MallPortalFeignService mallPortalFeignService;
+
+    @Override
+    public void execute() throws TaskException {
+        Object o = mallPortalFeignService.autoReceive();
+    }
+}

+ 57 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -5,11 +5,16 @@ import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.PaymentReverse;
+import com.huifu.adapay.model.Refund;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.DigestUtils;
 
 public class Payment {
@@ -139,4 +144,56 @@ public class Payment {
         paymentParams.remove("appId");
         return paymentParams;
     }
+
+    public static BaseResult<Map<String ,Object>> refundPayment(Map<String, Object> refundParams) {
+
+        LOGGER.info("退款对象信息:{}",refundParams);
+        String transNo = refundParams.get("transNo").toString();
+        refundParams.remove("transNo");
+        Map<String, Object> res;
+        try {
+            res = Refund.create(transNo, refundParams);
+        } catch (BaseAdaPayException e) {
+            return BaseResult.failed(e.getMessage());
+        }
+        if (CollectionUtils.isEmpty(res)) {
+            return BaseResult.failed("请求失败");
+        }
+        LOGGER.info("汇付[支付退款] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return BaseResult.failed(errorMsg);
+        }
+        return BaseResult.succeed(res);
+    }
+
+
+    // 撤销支付
+    public static BaseResult<Map<String ,Object>> reversePayment(String paymentId,String appId,String reverseOrderNo,String reverseAmt,String notifyUrl) {
+
+        LOGGER.info("撤销对象信息:paymentId:{},appId:{},reverseOrderNo:{},reverseAmt:{}",paymentId,appId,reverseOrderNo,reverseAmt);
+        Map<String, Object> res;
+        Map<String,Object> param = new HashMap<>();
+        param.put("app_id",appId);
+        param.put("payment_id",paymentId);
+        param.put("reverse_amt",reverseAmt);
+        param.put("order_no",reverseOrderNo);
+        param.put("notify_url",notifyUrl);
+        try {
+            res = PaymentReverse.create(param);
+        } catch (BaseAdaPayException e) {
+            return BaseResult.failed(e.getMessage());
+        }
+        if (CollectionUtils.isEmpty(res)) {
+            return BaseResult.failed("请求失败");
+        }
+        LOGGER.info("汇付[支付退款] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return BaseResult.failed(errorMsg);
+        }
+        return BaseResult.succeed(res);
+    }
 }

+ 131 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/entity/BaseResult.java

@@ -0,0 +1,131 @@
+package com.ym.mec.thirdparty.adapay.entity;
+
+import org.springframework.http.HttpStatus;
+
+import java.util.Date;
+
+/**
+ * HttpResponse 返回结果
+ */
+public class BaseResult<T> {
+
+	private boolean status = true;
+	private String msg;
+	private T data;
+	private int code;
+	private Date nowTime = new Date();
+
+	public BaseResult(boolean status, int code, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = code;
+	}
+
+	public BaseResult(boolean status, HttpStatus resultCode, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = resultCode.value();
+	}
+
+	public BaseResult() {
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(boolean status) {
+		this.status = status;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	public T getData() {
+		return data;
+	}
+
+	public void setData(T data) {
+		this.data = data;
+	}
+
+	public void success() {
+		this.status = true;
+	}
+
+	public void fail() {
+		this.status = false;
+	}
+
+	public Date getNowTime() {
+		return nowTime;
+	}
+
+	public void setNowTime(Date nowTime) {
+		this.nowTime = nowTime;
+	}
+
+
+	public static <T> BaseResult<T> succeed(T object) {
+		return getResponseData(true, HttpStatus.OK, object, "");
+	}
+
+	public static <T> BaseResult<T> succeed() {
+		return getResponseData(true, HttpStatus.OK, null, "");
+	}
+
+	public static <T> BaseResult<T> succeedData(T obj) {
+		return getResponseData(true, HttpStatus.OK, obj, "操作成功");
+	}
+
+	public static <T> BaseResult<T> warned(String message) {
+		return failed(HttpStatus.MULTI_STATUS, message);
+	}
+
+	public static <T> BaseResult<T> failed() {
+		return failed("");
+	}
+
+	public static <T> BaseResult<T> failed(String msg) {
+		return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, String msg) {
+		return getResponseData(false, statusCode, null, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, T data, String msg) {
+		return getResponseData(false, statusCode, data, msg);
+	}
+	public static <T> BaseResult<T> failed(int code, T data, String msg) {
+		return new BaseResult<>(false, code, data, msg);
+	}
+
+	public static <T> BaseResult<T> status(boolean flag) {
+		return flag ? succeed() : failed("操作失败");
+	}
+
+	private static <T> BaseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
+		BaseResult<T> obj = new BaseResult<T>();
+		obj.setStatus(status);
+		obj.setCode(statusCode.value());
+		obj.setData(data);
+		obj.setMsg(message);
+		return obj;
+	}
+}

+ 124 - 8
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,37 +1,40 @@
 package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.common.entity.RefundModel;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 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.util.CollectionUtils;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.common.controller.BaseController;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @RequestMapping("api")
 @Api(tags = "对外接口")
 @RestController
 public class APIController extends BaseController {
-
+	@Autowired
+	private OrderPayOpsService orderPayOpsService;
 	@Autowired
 	private SysUserCashAccountDao sysUserCashAccountDao;
 	@Autowired
@@ -53,6 +56,12 @@ public class APIController extends BaseController {
 	@Autowired
 	private VipGroupService vipGroupService;
 
+	@Autowired
+	private SysConfigService sysConfigService;
+
+	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
+
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId,Integer tenantId) {
 		// 添加用户现金账户
@@ -123,4 +132,111 @@ public class APIController extends BaseController {
 		return CollectionUtils.isEmpty(listDtos)?false:true;
 	}
 
+
+
+	// 商城创建订单
+	@PostMapping("/mallCreateOrder")
+	public HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model) {
+		try {
+			return succeed(studentPaymentOrderService.createOrder(model));
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
+
+	// 商城订单优惠券金额
+	@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) {
+
+		try {
+			studentPaymentOrderService.updateOrder(map);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+		return succeed();
+	}
+
+
+	/**
+	 * 商城取消订单接口
+	 *
+	 */
+	@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);
+			return succeed(cancelModel);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
+
+
+	// 商城获取 退款数据
+	@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();
+		}
+	}
+
+
+
+	// 商城获取 退款数据  只能全额退款
+	@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());
+
+			return succeed(mapBaseResult);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
 }