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