| 
					
				 | 
			
			
				@@ -13,6 +13,8 @@ import cn.newfeifan.mall.framework.common.util.json.JsonUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import cn.newfeifan.mall.module.member.dal.mysql.user.MemberUserMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.pay.api.order.PayOrderApi; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderCreateReqDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.newfeifan.mall.module.pay.api.order.dto.PayOrderRespDTO; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -56,6 +58,7 @@ import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalcula 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import lombok.extern.slf4j.Slf4j; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.ehcache.shadow.org.terracotta.offheapstore.HashingMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.jetbrains.annotations.NotNull; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -80,6 +83,9 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Slf4j 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private MemberUserMapper memberUserMapper;//add by ben 20240314 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ProductSkuMapper productSkuMapper;//add by ben 20240314 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -125,27 +131,35 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             settlementReqVO.setAddressId(address.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 2. 计算价格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 3. 拼接返回 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        AppTradeOrderSettlementRespVO respVO = TradeOrderConvert.INSTANCE.convert(calculateRespBO, address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // add by Ben 20240314 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 4. 查询每个sku对应的店铺ID,并传回页面 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<AppTradeOrderSettlementReqVO.Item> productSkuList = settlementReqVO.getItems(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<Long> productSkuIdList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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>(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -154,7 +168,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             shopSkuList.add(skuId);//把sku根据店聚合放到map中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        respVO.setShopSkuIds(shopSkuIds);//把sku根据店聚合放到map中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //把店铺id和店铺名称查出来放到map中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Long> shopIds = new ArrayList<Long>(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -166,10 +179,65 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (ShopDO shopDO : shopDOList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             shopNameMap.put(shopDO.getId(),shopDO.getName()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 2. 计算价格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * add by Ben 20240402 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 原来下面的代码中是取settlementReqVO.getItems()的所有项计算的,其中Items含不同店铺的商品,现在要把不同店铺的商品分开计算 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //保存每个店铺返回页面的 订单信息汇总 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Long,AppTradeOrderSettlementRespVO> shopRespVOMap = new HashMap<Long,AppTradeOrderSettlementRespVO>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //所有店铺支付总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer allShopPayPrice = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //所有店商品不算运费的商品总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer allShopItemPrice = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //所有店运费总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Integer allShopDeliveryPrice = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //循环计算各个店铺的价格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(Long shopId:shopSkuItemMap.keySet()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<AppTradeOrderSettlementReqVO.Item> items = shopSkuItemMap.get(shopId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AppTradeOrderSettlementReqVO shopSettlementReqVO = new AppTradeOrderSettlementReqVO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            BeanUtils.copyProperties(settlementReqVO, shopSettlementReqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            shopSettlementReqVO.setItems(items);//设置每个店铺的商品。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            shopSettlementReqVO.setShopId(shopId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //计算价格 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            TradePriceCalculateRespBO shopCalculateRespBO = calculatePrice(userId, shopSettlementReqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 3. 拼接返回 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AppTradeOrderSettlementRespVO respVO = TradeOrderConvert.INSTANCE.convert(shopCalculateRespBO, address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            shopRespVOMap.put(shopId,respVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //所有店铺支付总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            allShopPayPrice += shopCalculateRespBO.getPrice().getPayPrice(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //所有店商品不算运费的商品总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            allShopItemPrice += shopCalculateRespBO.getPrice().getTotalPrice(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //所有店运费总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            allShopDeliveryPrice += shopCalculateRespBO.getPrice().getDeliveryPrice(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, settlementReqVO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        TradePriceCalculateRespBO calculateRespBO = new TradePriceCalculateRespBO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calculateRespBO.getPrice().setPayPrice(allShopPayPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calculateRespBO.getPrice().setTotalPrice(allShopItemPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calculateRespBO.getPrice().setDeliveryPrice(allShopDeliveryPrice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //2.5 加载用户有的积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        MemberUserDO memberUserDO = memberUserMapper.selectById(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long memberPoints = memberUserDO.getCurrentMemberPoints();//用户当前积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 3. 拼接返回 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        AppTradeOrderSettlementRespVO respVO = TradeOrderConvert.INSTANCE.convert(calculateRespBO, address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // add by Ben 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        respVO.setShopSkuIds(shopSkuIds);//把sku根据店聚合放到map中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         respVO.setShopNameMap(shopNameMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        respVO.setCurrentMemberPoints(memberPoints);//用户当前积分 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        System.out.println("shopSkuIds@@@@@@@@"+shopSkuIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        System.out.println("shopNameMap@@@@@@@@"+shopNameMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        System.out.println("shopSkuIds@@@@@@@@"+shopSkuIds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//        System.out.println("shopNameMap@@@@@@@@"+shopNameMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return respVO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -204,6 +272,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         TradePriceCalculateReqBO calculateReqBO = TradeOrderConvert.INSTANCE.convert(userId, settlementReqVO, cartList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         calculateReqBO.getItems().forEach(item -> Assert.isTrue(item.getSelected(), // 防御性编程,保证都是选中的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 "商品({}) 未设置为选中", item.getSkuId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        calculateReqBO.setShopId(settlementReqVO.getShopId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return tradePriceService.calculatePrice(calculateReqBO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |