|
@@ -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;
|
|
|
}
|
|
|
|