|
@@ -328,6 +328,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
// 查询每个skuid对应的sku对象
|
|
// 查询每个skuid对应的sku对象
|
|
List<ProductSkuDO> productSkuDOList = productSkuMapper.selectListBySKuId(productSkuIdList);
|
|
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
|
|
//key为店铺ID,value为skuid的List
|
|
Map<Long,List<Long>> shopSkuIds = new HashMap<Long, List<Long>>();
|
|
Map<Long,List<Long>> shopSkuIds = new HashMap<Long, List<Long>>();
|
|
//key为店铺ID,value为item的Map
|
|
//key为店铺ID,value为item的Map
|
|
@@ -359,10 +364,18 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
//add by Ben
|
|
//add by Ben
|
|
//为键值对,键为店铺ID,值为备注文本
|
|
//为键值对,键为店铺ID,值为备注文本
|
|
Map<Long,String> shopRemarks = createReqVO.getShopRemarks();
|
|
Map<Long,String> shopRemarks = createReqVO.getShopRemarks();
|
|
-
|
|
|
|
|
|
+ if(shopRemarks==null){
|
|
|
|
+ shopRemarks = new HashMap<Long,String>();
|
|
|
|
+ }
|
|
|
|
|
|
//消费者在页面录入的,要使用的积分
|
|
//消费者在页面录入的,要使用的积分
|
|
Integer payPoints = createReqVO.getPayPoints();
|
|
Integer payPoints = createReqVO.getPayPoints();
|
|
|
|
+ if(payPoints == null){
|
|
|
|
+ payPoints = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ payPoints = 4;//为了测试方便,临时写死
|
|
|
|
|
|
//计算订单含积分的各项商品价格
|
|
//计算订单含积分的各项商品价格
|
|
TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
|
|
TradePriceCalculateRespBO tradePriceCalculateRespBO = calculatePriceWithPoints(userId, createReqVO);
|
|
@@ -382,6 +395,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
|
|
|
Integer allShopPainRMB = 0;//所有店铺订单实际支付的金额
|
|
Integer allShopPainRMB = 0;//所有店铺订单实际支付的金额
|
|
|
|
|
|
|
|
+ List<Map<String,Object>> orderMapList = new ArrayList<Map<String,Object>>();
|
|
|
|
+
|
|
//循环调用原来的计算订单价格方法,计算价格
|
|
//循环调用原来的计算订单价格方法,计算价格
|
|
//循环一次生成一间店的订单
|
|
//循环一次生成一间店的订单
|
|
for(Long shopId:shopSkuItemMap.keySet()){
|
|
for(Long shopId:shopSkuItemMap.keySet()){
|
|
@@ -408,15 +423,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
//下面的要注释掉:下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
|
|
//下面的要注释掉:下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
|
|
// tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
|
|
// tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
// 3. 保存一间店铺的订单
|
|
// 3. 保存一间店铺的订单
|
|
Integer shopPayPoints = 0;//一间店铺订单总支付积分
|
|
Integer shopPayPoints = 0;//一间店铺订单总支付积分
|
|
Integer shopPayPrice = 0;//一间店铺订单总支付价格
|
|
Integer shopPayPrice = 0;//一间店铺订单总支付价格
|
|
-// orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
|
|
|
|
|
|
+
|
|
for(TradeOrderItemDO orderItem:orderItems){//一间店铺订单的所有商品项
|
|
for(TradeOrderItemDO orderItem:orderItems){//一间店铺订单的所有商品项
|
|
- orderItem.setOrderId(order.getId());
|
|
|
|
|
|
+// orderItem.setOrderId(order.getId());
|
|
|
|
|
|
//3.5 add by Ben
|
|
//3.5 add by Ben
|
|
//计算抵扣积分后的价格
|
|
//计算抵扣积分后的价格
|
|
@@ -424,7 +436,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
|
|
TradePriceCalculateRespBO.OrderItem orderItemTmp = itemPayPointsMap.get(skuId);
|
|
orderItem.setPayPoints(orderItemTmp.getPayPoints()); //本商品使用积分
|
|
orderItem.setPayPoints(orderItemTmp.getPayPoints()); //本商品使用积分
|
|
Integer payRmb = orderItem.getPrice()-orderItemTmp.getPayPoints();//本商品实付人民币
|
|
Integer payRmb = orderItem.getPrice()-orderItemTmp.getPayPoints();//本商品实付人民币
|
|
- orderItem.setPayRMB(payRmb);//本商品实付人民币
|
|
|
|
|
|
+ orderItem.setPayRmb(payRmb);//本商品实付人民币
|
|
orderItem.setPayPrice(payRmb);//本商品实付人民币
|
|
orderItem.setPayPrice(payRmb);//本商品实付人民币
|
|
|
|
|
|
shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
|
|
shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
|
|
@@ -433,22 +445,48 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
|
|
|
allShopPainRMB+=shopPayPrice;
|
|
allShopPainRMB+=shopPayPrice;
|
|
|
|
|
|
|
|
+ Long merchantId = shopMerchantMap.get(shopId);//商户ID
|
|
|
|
+
|
|
|
|
+ order.setMerchantId(merchantId);
|
|
|
|
+ order.setShopId(shopId);
|
|
order.setPayPrice(shopPayPrice);
|
|
order.setPayPrice(shopPayPrice);
|
|
- order.setPayRMB(shopPayPrice);
|
|
|
|
|
|
+ order.setPayRmb(shopPayPrice);
|
|
order.setPayPoints(shopPayPoints);
|
|
order.setPayPoints(shopPayPoints);
|
|
|
|
|
|
tradeOrderMapper.insert(order);
|
|
tradeOrderMapper.insert(order);
|
|
|
|
+
|
|
|
|
+ orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
|
|
tradeOrderItemMapper.insertBatch(orderItems);
|
|
tradeOrderItemMapper.insertBatch(orderItems);
|
|
|
|
|
|
// 4. 订单创建后的逻辑
|
|
// 4. 订单创建后的逻辑
|
|
afterCreateTradeOrder(order, orderItems, shopCreateReqVO);
|
|
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,
|
|
private TradeOrderDO buildTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
|
|
@@ -495,7 +533,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
AppTradeOrderCreateReqVO createReqVO) {
|
|
AppTradeOrderCreateReqVO createReqVO) {
|
|
// 1. 执行订单创建后置处理器
|
|
// 1. 执行订单创建后置处理器
|
|
|
|
|
|
- //下面的代码是
|
|
|
|
|
|
+ //下面的代码是原来的营销代码,用不上,先注释掉
|
|
// tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
|
|
// tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
|
|
|
|
|
|
// 2. 删除购物车商品
|
|
// 2. 删除购物车商品
|
|
@@ -505,7 +543,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
}
|
|
}
|
|
|
|
|
|
// 3. 生成预支付
|
|
// 3. 生成预支付
|
|
- createPayOrder(order, orderItems);
|
|
|
|
|
|
+// createPayOrder(order, orderItems);
|
|
|
|
|
|
// 4. 插入订单日志
|
|
// 4. 插入订单日志
|
|
TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus());
|
|
TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus());
|
|
@@ -513,41 +551,60 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
// TODO 是可以思考下, 订单的营销优惠记录, 应该记录在哪里
|
|
// TODO 是可以思考下, 订单的营销优惠记录, 应该记录在哪里
|
|
}
|
|
}
|
|
|
|
|
|
- private void createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
|
|
|
|
|
+ private Long createPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {
|
|
// 创建支付单,用于后续的支付
|
|
// 创建支付单,用于后续的支付
|
|
PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert(
|
|
PayOrderCreateReqDTO payOrderCreateReqDTO = TradeOrderConvert.INSTANCE.convert(
|
|
order, orderItems, tradeOrderProperties);
|
|
order, orderItems, tradeOrderProperties);
|
|
Long payOrderId = payOrderApi.createOrder(payOrderCreateReqDTO);
|
|
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);
|
|
order.setPayOrderId(payOrderId);
|
|
|
|
+
|
|
|
|
+ return payOrderId;//返回支付订单ID
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MEMBER_PAY)
|
|
@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());
|
|
|
|
+
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|