|  | @@ -285,6 +285,31 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          return tradePriceService.calculatePrice(calculateReqBO);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * add by Ben
 | 
	
		
			
				|  |  | +     * 计算订单含积分的各项商品价格
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param userId          用户编号
 | 
	
		
			
				|  |  | +     * @param settlementReqVO 结算信息
 | 
	
		
			
				|  |  | +     * @return 订单价格
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private TradePriceCalculateRespBO calculatePriceWithPoints(Long userId, AppTradeOrderSettlementReqVO settlementReqVO) {
 | 
	
		
			
				|  |  | +        // 1. 如果来自购物车,则获得购物车的商品
 | 
	
		
			
				|  |  | +        List<CartDO> cartList = cartService.getCartList(userId,
 | 
	
		
			
				|  |  | +                convertSet(settlementReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 2. 计算价格
 | 
	
		
			
				|  |  | +        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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_CREATE)
 | 
	
	
		
			
				|  | @@ -335,6 +360,28 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          //为键值对,键为店铺ID,值为备注文本
 | 
	
		
			
				|  |  |          Map<Long,String> shopRemarks = createReqVO.getShopRemarks();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //消费者在页面录入的,要使用的积分
 | 
	
		
			
				|  |  | +        Integer payPoints = createReqVO.getPayPoints();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //计算订单含积分的各项商品价格
 | 
	
		
			
				|  |  | +        TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
 | 
	
		
			
				|  |  | +        //计算分摊的积分金额
 | 
	
		
			
				|  |  | +        List<Integer> dividePoints = TradePriceCalculatorHelper.dividePrice(tradePriceCalculateRespBO.getItems(), payPoints);
 | 
	
		
			
				|  |  | +        //键为skuId,value为单个商品项信息
 | 
	
		
			
				|  |  | +        Map<Long, TradePriceCalculateRespBO.OrderItem> itemPayPointsMap = new HashMap<Long, TradePriceCalculateRespBO.OrderItem>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //订单项数组
 | 
	
		
			
				|  |  | +        List<TradePriceCalculateRespBO.OrderItem> priceOrderItems = tradePriceCalculateRespBO.getItems();
 | 
	
		
			
				|  |  | +        for (int i = 0; i < priceOrderItems.size(); i++) {
 | 
	
		
			
				|  |  | +            TradePriceCalculateRespBO.OrderItem orderItem = priceOrderItems.get(i);
 | 
	
		
			
				|  |  | +            Integer itemPoint = dividePoints.get(i);//每项商品使用的积分
 | 
	
		
			
				|  |  | +            orderItem.setPayPoints(itemPoint);
 | 
	
		
			
				|  |  | +            itemPayPointsMap.put(orderItem.getSkuId(),orderItem);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Integer allShopPainRMB = 0;//所有店铺订单实际支付的金额
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          //循环调用原来的计算订单价格方法,计算价格
 | 
	
		
			
				|  |  |          //循环一次生成一间店的订单
 | 
	
		
			
				|  |  |          for(Long shopId:shopSkuItemMap.keySet()){
 | 
	
	
		
			
				|  | @@ -358,12 +405,39 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |              // 2. 订单创建前的逻辑
 | 
	
		
			
				|  |  |              //修改sku库存
 | 
	
		
			
				|  |  |              tradeProductSkuOrderHandler.beforeOrderCreate(order, orderItems);
 | 
	
		
			
				|  |  | -            //下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
 | 
	
		
			
				|  |  | +            //下面的要注释掉:下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
 | 
	
		
			
				|  |  |  //            tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            // 3. 保存订单
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 3. 保存一间店铺的订单
 | 
	
		
			
				|  |  | +            Integer shopPayPoints = 0;//一间店铺订单总支付积分
 | 
	
		
			
				|  |  | +            Integer shopPayPrice = 0;//一间店铺订单总支付价格
 | 
	
		
			
				|  |  | +//            orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
 | 
	
		
			
				|  |  | +            for(TradeOrderItemDO orderItem:orderItems){//一间店铺订单的所有商品项
 | 
	
		
			
				|  |  | +                orderItem.setOrderId(order.getId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                //3.5 add by Ben
 | 
	
		
			
				|  |  | +                //计算抵扣积分后的价格
 | 
	
		
			
				|  |  | +                Long skuId = orderItem.getSkuId();
 | 
	
		
			
				|  |  | +                TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
 | 
	
		
			
				|  |  | +                orderItem.setPayPoints(orderItemTmp.getPayPoints()); //本商品使用积分
 | 
	
		
			
				|  |  | +                Integer payRmb = orderItem.getPrice()-orderItemTmp.getPayPoints();//本商品实付人民币
 | 
	
		
			
				|  |  | +                orderItem.setPayRMB(payRmb);//本商品实付人民币
 | 
	
		
			
				|  |  | +                orderItem.setPayPrice(payRmb);//本商品实付人民币
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
 | 
	
		
			
				|  |  | +                shopPayPrice += payRmb;//一间店铺订单总支付价格
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            allShopPainRMB+=shopPayPrice;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            order.setPayPrice(shopPayPrice);
 | 
	
		
			
				|  |  | +            order.setPayRMB(shopPayPrice);
 | 
	
		
			
				|  |  | +            order.setPayPoints(shopPayPoints);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              tradeOrderMapper.insert(order);
 | 
	
		
			
				|  |  | -            orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
 | 
	
		
			
				|  |  |              tradeOrderItemMapper.insertBatch(orderItems);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              // 4. 订单创建后的逻辑
 | 
	
	
		
			
				|  | @@ -371,6 +445,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          TradeOrderDO order = new TradeOrderDO();
 | 
	
		
			
				|  |  | +        order.setPayPrice(allShopPainRMB);
 | 
	
		
			
				|  |  | +        order.setPayRMB(allShopPainRMB);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          return order;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |