Bläddra i källkod

商城订单修改

liujunchi 2 år sedan
förälder
incheckning
5b91bf0feb
19 ändrade filer med 1936 tillägg och 2324 borttagningar
  1. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/GroupType.java
  2. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  3. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  4. 116 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  5. 16 4
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  6. 23 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  7. 53 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java
  8. 5 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/util/StringUtil.java
  9. 4 0
      mec-mall/mall-portal/pom.xml
  10. 209 216
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  11. 153 182
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  12. 0 93
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderPayReq.java
  13. 116 128
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  14. 0 78
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  15. 1121 1444
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  16. 0 113
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  17. 56 56
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/task/OrderTimeOutCancelTask.java
  18. 1 1
      mec-mall/pom.xml
  19. 52 5
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

+ 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;

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

@@ -14,10 +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.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -225,4 +227,8 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     //获取云教练订单
     StudentPaymentOrder getMemberIngOrder(OrderTypeEnum member, DealStatusEnum status);
+
+    Map createOrder(MallCreateOrderModel model) throws Exception;
+
+    void mallBuyOrderCallback(StudentPaymentOrder order);
 }

+ 116 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -18,6 +18,7 @@ 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.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.PageUtil;
@@ -116,10 +117,17 @@ 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;
@@ -529,6 +537,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);
         }
     }
 
@@ -1000,4 +1011,107 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
 
+    @Override
+    public Map createOrder(MallCreateOrderModel model) throws Exception {
+
+        SysUser student = studentDao.getUser(model.getUserId());
+        Map payMap = new HashMap();
+        if (student == null) {
+            payMap.put("mallStatus",0);
+            return payMap;
+        }
+        Date date = new Date();
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
+
+        studentPaymentOrder.setGroupType(GroupType.GOODS_SELL);
+        studentPaymentOrder.setUserId(model.getUserId());
+        studentPaymentOrder.setType(OrderTypeEnum.MALL_BUY);
+        studentPaymentOrder.setOrderNo(model.getOrderNo());
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setCreateTime(date);
+        studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrder.setOrganId(student.getOrganId());
+        studentPaymentOrder.setRoutingOrganId(student.getOrganId());
+        studentPaymentOrder.setTenantId(student.getTenantId());
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+        // todo  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(),
+                "renew"
+        );
+        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());
+        }
+    }
 }

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

@@ -2,15 +2,15 @@ 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.page.QueryInfo;
+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 +35,16 @@ public interface WebFeignService {
 
 	@PostMapping(value = "api/queryVipPracticeGroups")
     Boolean queryVipPracticeGroups();
+
+	@GetMapping(value = "/queryByTenantId/{id}")
+	HttpResponseResult<HfMerchantConfig> queryByTenantId(@PathVariable("id") Integer id);
+
+	@PostMapping("/mallCreateOrder")
+	HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model);
+
+	@PostMapping("/executePayment")
+	HttpResponseResult executePayment(@RequestBody Map paymentParam);
+
+	@PostMapping("/updateOrder")
+	HttpResponseResult updateOrder(@RequestBody Map map);
 }

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

@@ -1,13 +1,16 @@
 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.page.QueryInfo;
+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 +49,24 @@ 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;
+	}
 }

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

@@ -0,0 +1,53 @@
+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 orderNo;
+
+    private BigDecimal amount;
+
+    private List<Integer> couponIdList;
+
+    private Integer userId;
+
+    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;
+    }
+}

+ 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,为空则返回默认值
      *

+ 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>

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

@@ -1,216 +1,209 @@
-// 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.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 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("按状态分页获取用户订单列表")
+    @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 (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, "用户取消订单");
+                               }, 60L, TimeUnit.SECONDS);
+        return CommonResult.success(null);
+    }
+}

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

@@ -1,182 +1,153 @@
-// 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.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;
+
+    @ApiOperation(value = "订单付款")
+    @PostMapping("/orderPay")
+    public HttpResponseResult<OrderPayRes> orderPay(@Valid @RequestBody Map payReq, HttpServletRequest request) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        String orderNo = MapUtil.getStr(payReq,"orderNo");
+
+        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderNo));
+        try {
+            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
+            if (b) {
+                return orderService.orderPay(payReq);
+            }
+            return failed("请求超时");
+        } catch (BizException e) {
+            return failed(e.getMessage());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return failed("付款失败");
+        } finally {
+            if (lock.getHoldCount()>0) {
+                lock.unlock();
+            }
+        }
+    }
+
+
+    /***
+     * 支付回调
+     * @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;
+
+                            default:
+                                break;
+                        }
+                    } else {
+                        return failed("请求超时");
+                    }
+                }catch (Exception e) {
+                    e.printStackTrace();
+                    return failed("请求超时");
+                }
+            } else {
+                return "验签失败";
+            }
+        } catch (Exception e) {
+            return e.getMessage();
+        }
+
+        return "succeeded";
+    }
+
+}

+ 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;
-    }
-}

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

@@ -1,128 +1,116 @@
-// 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 payReq 支付信息
+     * @return
+     */
+    @Transactional
+    HttpResponseResult orderPay(Map payReq) throws Exception;
+    /**
+     * 获取订单信息
+     *
+     * @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);
+}

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

@@ -1,78 +0,0 @@
-// 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);
-// }

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

@@ -1,1444 +1,1121 @@
-// 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.github.pagehelper.PageHelper;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.entity.MallCreateOrderModel;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.IdGeneratorService;
+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.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 IdGeneratorService idGeneratorService;
+
+    @Autowired
+    private WebFeignService webFeignService;
+
+    @Autowired
+    private OmsOrderSettingMapper orderSettingMapper;
+    @Autowired
+    private OmsOrderItemMapper orderItemMapper;
+
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
+
+    @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("库存不足,无法下单");
+        }
+
+        String orderSn = generateOrderSn();
+        BigDecimal amount = calcTotalAmount(orderItemList);
+
+        // 远程调用管乐迷订单记录
+        MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setAmount(amount);
+        model.setOrderNo(orderSn);
+        model.setUserId(currentMember.getId().intValue());
+        model.setCouponIdList(StringUtil.toIntegerList(orderParam.getCouponId()));
+        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("管乐迷订单生成失败");
+        }
+
+        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);
+
+        //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
+        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(amount);
+        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(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);
+        if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
+            paySuccess(order.getId(),order.getPayType());
+            order.setStatus(1);
+        }
+        result.put("pay",data);
+        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 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)) {
+
+            //修改订单状态为取消
+            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
+    @Transactional
+    public HttpResponseResult orderPay(Map payReq) {
+
+        String orderNo = MapUtil.getStr(payReq,"orderNo");
+        OmsOrderDetail detail = detail(orderNo);
+        if (detail == null) {
+            throw new BizException("订单不存在");
+        }
+        if (detail.getStatus() != 0 && detail.getStatus() != 6) {
+            throw new BizException("订单已付款或已关闭");
+        }
+
+        // 远程调用支付接口
+        return webFeignService.executePayment(payReq);
+    }
+
+
+    @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) {
+        //订单完成
+        OmsOrderDetail detail = detail(orderNo);
+        if (detail.getStatus() == 0) {
+            orderSuccess(detail, payAmount, payChannel);
+            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());
+        }
+    }
+
+
+    /***
+     * 处理回调-支付失败
+     * @author liweifan
+     * @param: hfRes
+     * @updateTime 2022/4/27 15:09
+     */
+    @Override
+    @Transactional
+    public void paymentFailedHandle(String orderNo, Map<String, Object> notifyMap) {
+
+        OmsOrderDetail detail = detail(orderNo);
+        if (null == detail) {
+            LOG.error("汇付支付回调,订单未找到。 req is {}", orderNo);
+            throw new BizException("订单未找到");
+        }
+        if (detail.getStatus() == 0) {
+            cancelOrder(detail.getId(), "支付失败");
+            HttpResponseResult httpResponseResult = webFeignService.updateOrder(notifyMap);
+            if (!httpResponseResult.getStatus()) {
+                throw new BizException(httpResponseResult.getMsg());
+            }
+        } else {
+            LOG.error("汇付支付回调,订单状态异常。 req is {}", orderNo);
+        }
+    }
+
+    /**
+     * 订单完成
+     *
+     * @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".equals(payChannel) || "ali_app".equals(payChannel)) {
+                paySuccess(detail.getId(), 1);
+            } else if ("wx_lite".equals(payChannel) || "wx_app".equals(payChannel)) {
+                paySuccess(detail.getId(), 2);
+            }
+        }
+    }
+
+
+    /**
+     * 生成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;
+    }
+
+}

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

@@ -1,113 +0,0 @@
-// 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);
-//     }
-// }

+ 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();
+    }
+}

+ 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>

+ 52 - 5
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,19 +1,20 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dto.PaymentParam;
 import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
 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 io.swagger.annotations.Api;
 
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 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;
@@ -26,12 +27,14 @@ import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.common.controller.BaseController;
 
 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,9 @@ public class APIController extends BaseController {
 	@Autowired
 	private VipGroupService vipGroupService;
 
+	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
+
 	@GetMapping("/createCashAccount")
 	public Boolean createCashAccount(Integer userId,Integer tenantId) {
 		// 添加用户现金账户
@@ -123,4 +129,45 @@ 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();
+		}
+	}
+
+	@ApiOperation(value = "台牌支付")
+	@PostMapping("/executePayment")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
+			@ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
+	})
+	public Object executePayment(@RequestBody PaymentParam paymentParam) {
+		try {
+			Map<String, Object> payment = orderPayOpsService.executePayment(paymentParam);
+			return succeed(payment);
+		} catch (Exception e) {
+			return failed(e.getMessage());
+		}
+	}
+
+
+	@PostMapping("/updateOrder")
+	public HttpResponseResult notify(@RequestBody Map map) {
+
+		try {
+			studentPaymentOrderService.updateOrder(map);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+		return succeed();
+	}
+
 }