Explorar el Código

update: 修改订单预览、提交订单相关

Ben hace 1 año
padre
commit
1cb7d62fcf

+ 6 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/sku/ProductSkuDO.java

@@ -42,6 +42,12 @@ public class ProductSkuDO extends BaseDO {
      */
     private Long shopId;
 
+    /**
+     * 商户ID,关联`sale_merchant`表
+     * add by Ben 20240316
+     */
+    private Long merchantId;
+
     /**
      * SPU 编号
      *

+ 13 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -36,7 +36,19 @@ public class TradeOrderDO extends BaseDO {
     private Integer payPoints;
 
     //本商品实付的人民币金额 add by Ben
-    private Integer payRMB;
+    private Integer payRmb;
+
+    /**
+     * 店铺ID,关联`sale_shop`表
+     * add by Ben 20240316
+     */
+    private Long shopId;
+
+    /**
+     * 商户ID,关联`sale_merchant`表
+     * add by Ben 20240316
+     */
+    private Long merchantId;
 
     /**
      * 发货物流公司编号 - 空(无需发货)

+ 1 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderItemDO.java

@@ -30,7 +30,7 @@ public class TradeOrderItemDO extends BaseDO {
     private Integer payPoints;
 
     //本商品实付的人民币金额 add by Ben
-    private Integer payRMB;
+    private Integer payRmb;
 
     //退还的使用的积分 add by Ben
     private Integer refundPoints;

+ 92 - 35
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -328,6 +328,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         // 查询每个skuid对应的sku对象
         List<ProductSkuDO> productSkuDOList = productSkuMapper.selectListBySKuId(productSkuIdList);
 
+        Map<Long,Long> shopMerchantMap = new HashMap<Long,Long>();//key是店铺ID,value是商户ID
+        for(ProductSkuDO productSkuDO:productSkuDOList){
+            shopMerchantMap.put(productSkuDO.getShopId(),productSkuDO.getMerchantId());
+        }
+
         //key为店铺ID,value为skuid的List
         Map<Long,List<Long>> shopSkuIds = new HashMap<Long, List<Long>>();
         //key为店铺ID,value为item的Map
@@ -359,10 +364,18 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         //add by Ben
         //为键值对,键为店铺ID,值为备注文本
         Map<Long,String> shopRemarks = createReqVO.getShopRemarks();
-
+        if(shopRemarks==null){
+            shopRemarks = new HashMap<Long,String>();
+        }
 
         //消费者在页面录入的,要使用的积分
         Integer payPoints = createReqVO.getPayPoints();
+        if(payPoints == null){
+            payPoints = 0;
+        }
+
+
+        payPoints = 4;//为了测试方便,临时写死
 
         //计算订单含积分的各项商品价格
         TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
@@ -382,6 +395,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
         Integer allShopPainRMB = 0;//所有店铺订单实际支付的金额
 
+        List<Map<String,Object>> orderMapList = new ArrayList<Map<String,Object>>();
+
         //循环调用原来的计算订单价格方法,计算价格
         //循环一次生成一间店的订单
         for(Long shopId:shopSkuItemMap.keySet()){
@@ -408,15 +423,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             //下面的要注释掉:下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
 //            tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
 
-
-
-
             // 3. 保存一间店铺的订单
             Integer shopPayPoints = 0;//一间店铺订单总支付积分
             Integer shopPayPrice = 0;//一间店铺订单总支付价格
-//            orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
+
             for(TradeOrderItemDO orderItem:orderItems){//一间店铺订单的所有商品项
-                orderItem.setOrderId(order.getId());
+//                orderItem.setOrderId(order.getId());
 
                 //3.5 add by Ben
                 //计算抵扣积分后的价格
@@ -424,7 +436,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
                 orderItem.setPayPoints(orderItemTmp.getPayPoints()); //本商品使用积分
                 Integer payRmb = orderItem.getPrice()-orderItemTmp.getPayPoints();//本商品实付人民币
-                orderItem.setPayRMB(payRmb);//本商品实付人民币
+                orderItem.setPayRmb(payRmb);//本商品实付人民币
                 orderItem.setPayPrice(payRmb);//本商品实付人民币
 
                 shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
@@ -433,22 +445,48 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
             allShopPainRMB+=shopPayPrice;
 
+            Long merchantId = shopMerchantMap.get(shopId);//商户ID
+
+            order.setMerchantId(merchantId);
+            order.setShopId(shopId);
             order.setPayPrice(shopPayPrice);
-            order.setPayRMB(shopPayPrice);
+            order.setPayRmb(shopPayPrice);
             order.setPayPoints(shopPayPoints);
 
             tradeOrderMapper.insert(order);
+
+            orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
             tradeOrderItemMapper.insertBatch(orderItems);
 
             // 4. 订单创建后的逻辑
             afterCreateTradeOrder(order, orderItems, shopCreateReqVO);
+
+//            Map<>
+            Map<String,Object> orderMap = new HashMap<String,Object>();
+            orderMap.put("order",order);
+            orderMap.put("orderItems",orderItems);
+            orderMapList.add(orderMap);//把订单保存起来,为支付订单做准备
         }
 
-        TradeOrderDO order = new TradeOrderDO();
-        order.setPayPrice(allShopPainRMB);
-        order.setPayRMB(allShopPainRMB);
+        TradeOrderDO virtualOrder = new TradeOrderDO();//为了生成支付订单,创建的虚拟订单,本订单不会保存到数据库
+        TradeOrderDO firstOrder = (TradeOrderDO)(orderMapList.get(0).get("order"));
+        List<TradeOrderItemDO> firstOrderItems = (List<TradeOrderItemDO>)(orderMapList.get(0).get("orderItems"));
 
-        return order;
+        BeanUtils.copyProperties(firstOrder, virtualOrder);
+        virtualOrder.setPayPrice(allShopPainRMB);
+        virtualOrder.setPayRmb(allShopPainRMB);
+        virtualOrder.setId(0l);//为了让payOrder中的tradeOrderId为0;
+
+        // 3. 生成预支付:生成支付订单记录
+        Long payOrderId = createPayOrder(virtualOrder, firstOrderItems);
+
+        for(Map<String,Object> m:orderMapList){
+            TradeOrderDO order = (TradeOrderDO)(m.get("order"));
+            // 更新到交易单上
+            tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
+        }
+
+        return virtualOrder;
     }
 
     private TradeOrderDO buildTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
@@ -495,7 +533,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                                        AppTradeOrderCreateReqVO createReqVO) {
         // 1. 执行订单创建后置处理器
 
-        //下面的代码是
+        //下面的代码是原来的营销代码,用不上,先注释掉
 //        tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
 
         // 2. 删除购物车商品
@@ -505,7 +543,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         }
 
         // 3. 生成预支付
-        createPayOrder(order, orderItems);
+//        createPayOrder(order, orderItems);
 
         // 4. 插入订单日志
         TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus());
@@ -513,41 +551,60 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         // TODO 是可以思考下, 订单的营销优惠记录, 应该记录在哪里
     }
 
-    private void createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
+    private Long createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
         // 创建支付单,用于后续的支付
         PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert(
                 order, orderItems, tradeOrderProperties);
         Long payOrderId = payOrderApi.createOrder(payOrderCreateReqDTO);
 
+        // update By Ben  因为订单与支付订单表的关系已经变成多对一了,所以把下面为订单表设置支付订单ID要移到外面做。
         // 更新到交易单上
-        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
+//        tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
+
         order.setPayOrderId(payOrderId);
+
+        return payOrderId;//返回支付订单ID
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_PAY)
-    public void updateOrderPaid(Long id, Long payOrderId) {
-        // 1. 校验并获得交易订单(可支付)
-        KeyValue<TradeOrderDO, PayOrderRespDTO> orderResult = validateOrderPayable(id, payOrderId);
-        TradeOrderDO order = orderResult.getKey();
-        PayOrderRespDTO payOrder = orderResult.getValue();
-
-        // 2. 更新 TradeOrderDO 状态为已支付,等待发货
-        int updateCount = tradeOrderMapper.updateByIdAndStatus(id, order.getStatus(),
-                new TradeOrderDO().setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()).setPayStatus(true)
-                        .setPayTime(LocalDateTime.now()).setPayChannelCode(payOrder.getChannelCode()));
-        if (updateCount == 0) {
-            throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
-        }
+    //下面的参数中的id1为交易订单TradeOrder表的id,已经没用了,因为一个支付订单对应多个订单。
+    //只有支付订单id参数payOrderId是有用的。
+    public void updateOrderPaid(Long id1, Long payOrderId) {
 
-        // 3. 执行 TradeOrderHandler 的后置处理
-        List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
-        tradeOrderHandlers.forEach(handler -> handler.afterPayOrder(order, orderItems));
+        //add by Ben 根据支付订单id,查询所有 支付订单 对应的 订单
+        List<TradeOrderDO> TradeOrderDOList = tradeOrderMapper.selectList("no", payOrderId);
+
+        for(TradeOrderDO tradeOrderDO:TradeOrderDOList) {
 
-        // 4. 记录订单日志
-        TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
-        TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
+            Long tradeOrderId = tradeOrderDO.getId();
+
+            // 1. 校验并获得交易订单(可支付)
+            KeyValue<TradeOrderDO, PayOrderRespDTO> orderResult = validateOrderPayable(tradeOrderId, payOrderId);
+
+            TradeOrderDO order = orderResult.getKey();
+            PayOrderRespDTO payOrder = orderResult.getValue();
+
+            // 2. 更新 TradeOrderDO 状态为已支付,等待发货
+            int updateCount = tradeOrderMapper.updateByIdAndStatus(tradeOrderId, order.getStatus(),
+                    new TradeOrderDO().setStatus(TradeOrderStatusEnum.UNDELIVERED.getStatus()).setPayStatus(true)
+                            .setPayTime(LocalDateTime.now()).setPayChannelCode(payOrder.getChannelCode()));
+            if (updateCount == 0) {
+                throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID);
+            }
+
+            // 3. 执行 TradeOrderHandler 的后置处理
+            List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(tradeOrderId);
+
+            //注释 by Ben ,下面是系统原来的营销部分,和我们业务对不上,注释掉
+//            tradeOrderHandlers.forEach(handler -> handler.afterPayOrder(order, orderItems));
+
+            // 4. 记录订单日志
+            TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
+            TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
+
+        }
     }
 
     /**