Преглед на файлове

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

Ben преди 11 месеца
родител
ревизия
44e683eb65

+ 10 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java

@@ -5,12 +5,21 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.AssertTrue;
+import java.util.Map;
 
 @Schema(description = "用户 App - 交易订单创建 Request VO")
 @Data
 public class AppTradeOrderCreateReqVO extends AppTradeOrderSettlementReqVO {
 
-    @Schema(description = "备注", example = "这个是我的订单哟")
+    //add by Ben
+    @Schema(description = "为键值对,键为店铺ID,值为备注文本", example = "{1:'包装好点,送人的!',2:''}")
+    private Map<Long,String> shopRemarks;
+
+    //add by Ben
+    @Schema(description = "本订单使用积分,允许两位小数", example = "36.58")
+    private Double payPoints;
+
+    @Schema(description = "【本属性已不作页面与后台传值使用,被shopRemarks替代。本属性只作java内部使用】备注", example = "这个是我的订单哟")
     private String remark;
 
     @AssertTrue(message = "配送方式不能为空")

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

@@ -51,10 +51,12 @@ import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
 import cn.newfeifan.mall.module.trade.service.message.TradeMessageService;
 import cn.newfeifan.mall.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;
 import cn.newfeifan.mall.module.trade.service.order.handler.TradeOrderHandler;
+import cn.newfeifan.mall.module.trade.service.order.handler.TradeProductSkuOrderHandler;
 import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.extern.slf4j.Slf4j;
 import org.ehcache.shadow.org.terracotta.offheapstore.HashingMap;
 import org.jetbrains.annotations.NotNull;
@@ -92,6 +94,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private ShopMapper shopMapper;//add by ben 20240314
 
+    @Resource
+    private TradeProductSkuOrderHandler tradeProductSkuOrderHandler;//add by ben 20240405
+
     @Resource
     private TradeOrderMapper tradeOrderMapper;
     @Resource
@@ -217,9 +222,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             allShopDeliveryPrice += shopCalculateRespBO.getPrice().getDeliveryPrice();
         }
 
-//        TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO);
+        //********这句是要被注释掉的
+        TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO);
 
-        TradePriceCalculateRespBO calculateRespBO = new TradePriceCalculateRespBO();
+//        TradePriceCalculateRespBO calculateRespBO = new TradePriceCalculateRespBO();
         calculateRespBO.setPrice(new TradePriceCalculateRespBO.Price());
         calculateRespBO.getPrice().setPayPrice(allShopPayPrice);
         calculateRespBO.getPrice().setTotalPrice(allShopItemPrice);
@@ -283,22 +289,88 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Transactional(rollbackFor = Exception.class)
     @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CREATE)
     public TradeOrderDO createOrder(Long userId, AppTradeOrderCreateReqVO createReqVO) {
-        // 1.1 价格计算
-        TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO);
-        // 1.2 构建订单
-        TradeOrderDO order = buildTradeOrder(userId, createReqVO, calculateRespBO);
-        List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO);
-
-        // 2. 订单创建前的逻辑
-        tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
-
-        // 3. 保存订单
-        tradeOrderMapper.insert(order);
-        orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
-        tradeOrderItemMapper.insertBatch(orderItems);
-
-        // 4. 订单创建后的逻辑
-        afterCreateTradeOrder(order, orderItems, createReqVO);
+
+        // add by Ben 20240314
+        // 4. 查询每个sku对应的店铺ID,并传回页面
+        List<AppTradeOrderSettlementReqVO.Item> productSkuList = createReqVO.getItems();
+        // 把所有商品的id都取出来,为查询所有商品的店铺做准备
+        List<Long> productSkuIdList = new ArrayList<Long>();
+        Map<Long,AppTradeOrderSettlementReqVO.Item> itemMap = new HashMap<Long,AppTradeOrderSettlementReqVO.Item>();
+        for(AppTradeOrderSettlementReqVO.Item skuItem : productSkuList){
+            productSkuIdList.add(skuItem.getSkuId());
+            itemMap.put(skuItem.getSkuId(),skuItem);
+        }
+        // 查询每个skuid对应的sku对象
+        List<ProductSkuDO> productSkuDOList = productSkuMapper.selectListBySKuId(productSkuIdList);
+
+        //key为店铺ID,value为skuid的List
+        Map<Long,List<Long>> shopSkuIds = new HashMap<Long, List<Long>>();
+        //key为店铺ID,value为item的Map
+        Map<Long,List<AppTradeOrderSettlementReqVO.Item>> shopSkuItemMap = new HashMap<Long,List<AppTradeOrderSettlementReqVO.Item>>();
+
+
+
+        for(ProductSkuDO sku:productSkuDOList){//把sku根据店聚合放到map中
+            Long skuId = sku.getId();
+            Long shopId = sku.getShopId();
+
+            List<AppTradeOrderSettlementReqVO.Item> itemList = shopSkuItemMap.get(shopId);
+            if(itemList==null){
+                itemList=new ArrayList<AppTradeOrderSettlementReqVO.Item>();
+                shopSkuItemMap.put(shopId,itemList);
+            }
+//            AppTradeOrderSettlementReqVO.Item item = new AppTradeOrderSettlementReqVO.Item();
+            itemList.add(itemMap.get(skuId));
+
+            List<Long> shopSkuList = shopSkuIds.get(shopId);
+            if(shopSkuList==null) {
+                shopSkuList = new ArrayList<Long>();
+                shopSkuIds.put(shopId,shopSkuList);
+            }
+            shopSkuList.add(skuId);//把sku根据店聚合放到map中
+        }
+
+
+        //add by Ben
+        //为键值对,键为店铺ID,值为备注文本
+        Map<Long,String> shopRemarks = createReqVO.getShopRemarks();
+
+        //循环调用原来的计算订单价格方法,计算价格
+        //循环一次生成一间店的订单
+        for(Long shopId:shopSkuItemMap.keySet()){
+
+            AppTradeOrderCreateReqVO shopCreateReqVO = new AppTradeOrderCreateReqVO();
+
+            BeanUtils.copyProperties(createReqVO, shopCreateReqVO);
+            List<AppTradeOrderSettlementReqVO.Item> itemList = shopSkuItemMap.get(shopId);//店铺的商品列表
+            shopCreateReqVO.setItems(itemList);//设置为只有一个店铺的商品列表
+
+            //设置本店的订单备注
+            String remark = shopRemarks.get(shopId);
+            shopCreateReqVO.setRemark(remark);
+
+            // 1.1 价格计算
+            TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, shopCreateReqVO);
+            // 1.2 构建订单
+            TradeOrderDO order = buildTradeOrder(userId, shopCreateReqVO, calculateRespBO);
+            List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO);
+
+            // 2. 订单创建前的逻辑
+            //修改sku库存
+            tradeProductSkuOrderHandler.beforeOrderCreate(order, orderItems);
+            //下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
+//            tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
+
+            // 3. 保存订单
+            tradeOrderMapper.insert(order);
+            orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
+            tradeOrderItemMapper.insertBatch(orderItems);
+
+            // 4. 订单创建后的逻辑
+            afterCreateTradeOrder(order, orderItems, shopCreateReqVO);
+        }
+
+        TradeOrderDO order = new TradeOrderDO();
         return order;
     }
 
@@ -345,7 +417,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     private void afterCreateTradeOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
                                        AppTradeOrderCreateReqVO createReqVO) {
         // 1. 执行订单创建后置处理器
-        tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
+
+        //下面的代码是
+//        tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
 
         // 2. 删除购物车商品
         Set<Long> cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId);
@@ -359,7 +433,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         // 4. 插入订单日志
         TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus());
 
-        // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
+        // TODO 是可以思考下, 订单的营销优惠记录, 应该记录在哪里
     }
 
     private void createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {