|
@@ -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;
|
|
@@ -49,14 +51,14 @@ import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
|
|
|
import cn.newfeifan.mall.module.trade.service.message.TradeMessageService;
|
|
|
import cn.newfeifan.mall.module.trade.service.message.bo.TradeOrderMessageWhenDeliveryOrderReqBO;
|
|
|
import cn.newfeifan.mall.module.trade.service.order.handler.TradeOrderHandler;
|
|
|
+import cn.newfeifan.mall.module.trade.service.order.handler.TradeProductSkuOrderHandler;
|
|
|
import cn.newfeifan.mall.module.trade.service.price.TradePriceService;
|
|
|
import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
|
|
|
import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
|
|
|
import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
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;
|
|
|
|
|
@@ -81,12 +83,18 @@ 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
|
|
|
|
|
|
@Resource
|
|
|
private ShopMapper shopMapper;//add by ben 20240314
|
|
|
|
|
|
+ @Resource
|
|
|
+ private TradeProductSkuOrderHandler tradeProductSkuOrderHandler;//add by ben 20240405
|
|
|
+
|
|
|
@Resource
|
|
|
private TradeOrderMapper tradeOrderMapper;
|
|
|
@Resource
|
|
@@ -126,52 +134,116 @@ 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<>();
|
|
|
- for (AppTradeOrderSettlementReqVO.Item skuItem : productSkuList) {
|
|
|
+ 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>>();
|
|
|
- for (ProductSkuDO sku : productSkuDOList) {//把sku根据店聚合放到map中
|
|
|
+ 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();
|
|
|
- if (shopId != null) {
|
|
|
- List<Long> shopSkuList = shopSkuIds.get(shopId);
|
|
|
- if (shopSkuList == null) {
|
|
|
- shopSkuList = new ArrayList<Long>();
|
|
|
- shopSkuIds.put(shopId, shopSkuList);
|
|
|
- }
|
|
|
- shopSkuList.add(skuId);//把sku根据店聚合放到map中
|
|
|
+
|
|
|
+ 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>();
|
|
|
+ shopSkuIds.put(shopId,shopSkuList);
|
|
|
}
|
|
|
+ shopSkuList.add(skuId);//把sku根据店聚合放到map中
|
|
|
}
|
|
|
- respVO.setShopSkuIds(shopSkuIds);//把sku根据店聚合放到map中
|
|
|
+
|
|
|
|
|
|
//把店铺id和店铺名称查出来放到map中
|
|
|
List<Long> shopIds = new ArrayList<Long>();
|
|
|
for (Long shopid : shopSkuIds.keySet()) {
|
|
|
shopIds.add(shopid);
|
|
|
}
|
|
|
- List<ShopDO> shopDOList = shopMapper.selectList(new LambdaQueryWrapper<ShopDO>().eq(ShopDO::getId,shopIds));
|
|
|
- Map<Long, String> shopNameMap = new HashMap<Long, String>();//key为店铺id,value为店铺名
|
|
|
+ List<ShopDO> shopDOList = shopMapper.selectListById(shopIds);
|
|
|
+ Map<Long,String> shopNameMap = new HashMap<Long,String>();//key为店铺id,value为店铺名
|
|
|
for (ShopDO shopDO : shopDOList) {
|
|
|
- shopNameMap.put(shopDO.getId(), shopDO.getName());
|
|
|
+ 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.setPrice(new TradePriceCalculateRespBO.Price());
|
|
|
+ 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.setShopRespVOMap(shopRespVOMap);//保存每个店铺返回页面的 订单信息汇总
|
|
|
+ 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;
|
|
|
}
|
|
@@ -206,30 +278,215 @@ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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)
|
|
|
public TradeOrderDO createOrder(Long userId, AppTradeOrderCreateReqVO createReqVO) {
|
|
|
- // 1.1 价格计算
|
|
|
- TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO);
|
|
|
- // 1.2 构建订单
|
|
|
- TradeOrderDO order = buildTradeOrder(userId, createReqVO, calculateRespBO);
|
|
|
- List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO);
|
|
|
-
|
|
|
- // 2. 订单创建前的逻辑
|
|
|
- tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
|
|
|
-
|
|
|
- // 3. 保存订单
|
|
|
- tradeOrderMapper.insert(order);
|
|
|
- orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
|
|
|
- tradeOrderItemMapper.insertBatch(orderItems);
|
|
|
-
|
|
|
- // 4. 订单创建后的逻辑
|
|
|
- afterCreateTradeOrder(order, orderItems, createReqVO);
|
|
|
- return order;
|
|
|
+
|
|
|
+ // add by Ben 20240314
|
|
|
+ // 4. 查询每个sku对应的店铺ID,并传回页面
|
|
|
+ List<AppTradeOrderSettlementReqVO.Item> productSkuList = createReqVO.getItems();
|
|
|
+ // 把所有商品的id都取出来,为查询所有商品的店铺做准备
|
|
|
+ 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);
|
|
|
+
|
|
|
+ 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
|
|
|
+ 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>();
|
|
|
+ shopSkuIds.put(shopId,shopSkuList);
|
|
|
+ }
|
|
|
+ shopSkuList.add(skuId);//把sku根据店聚合放到map中
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //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 = 3;//为了测试方便,临时写死
|
|
|
+
|
|
|
+ //计算订单含积分的各项商品价格
|
|
|
+ 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 allShopPayRMB = 0;//所有店铺订单实际支付的金额
|
|
|
+
|
|
|
+ List<Map<String,Object>> orderMapList = new ArrayList<Map<String,Object>>();
|
|
|
+
|
|
|
+ //循环调用原来的计算订单价格方法,计算价格
|
|
|
+ //循环一次生成一间店的订单
|
|
|
+ for(Long shopId:shopSkuItemMap.keySet()){
|
|
|
+
|
|
|
+ AppTradeOrderCreateReqVO shopCreateReqVO = new AppTradeOrderCreateReqVO();
|
|
|
+
|
|
|
+ BeanUtils.copyProperties(createReqVO, shopCreateReqVO);
|
|
|
+ List<AppTradeOrderSettlementReqVO.Item> itemList = shopSkuItemMap.get(shopId);//店铺的商品列表
|
|
|
+ shopCreateReqVO.setItems(itemList);//设置为只有一个店铺的商品列表
|
|
|
+
|
|
|
+ //设置本店的订单备注
|
|
|
+ String remark = shopRemarks.get(shopId);
|
|
|
+ shopCreateReqVO.setRemark(remark);
|
|
|
+
|
|
|
+ // 1.1 价格计算
|
|
|
+ TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, shopCreateReqVO);
|
|
|
+ // 1.2 构建订单
|
|
|
+ TradeOrderDO order = buildTradeOrder(userId, shopCreateReqVO, calculateRespBO);
|
|
|
+ List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO);
|
|
|
+
|
|
|
+ // 2. 订单创建前的逻辑
|
|
|
+ //修改sku库存
|
|
|
+ tradeProductSkuOrderHandler.beforeOrderCreate(order, orderItems);
|
|
|
+ //下面的要注释掉:下面是旧的“订单创建前的逻辑”,因为里面的修改积分、营销与我们的业务不符,所以注释掉,只保留处理sku库存的代码
|
|
|
+// tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
|
|
|
+
|
|
|
+ // 3. 保存一间店铺的订单
|
|
|
+ Integer shopPayPoints = 0;//一间店铺订单总支付积分
|
|
|
+ Integer shopPayPrice = 0;//一间店铺订单总支付价格
|
|
|
+
|
|
|
+ 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()*orderItem.getCount()-orderItemTmp.getPayPoints();//本商品实付人民币
|
|
|
+ orderItem.setPayRmb(payRmb);//本商品实付人民币
|
|
|
+ orderItem.setPayPrice(payRmb);//本商品实付人民币
|
|
|
+
|
|
|
+ shopPayPoints += orderItemTmp.getPayPoints();//一间店铺订单总支付积分
|
|
|
+ shopPayPrice += payRmb;//一间店铺订单总支付价格
|
|
|
+ }
|
|
|
+
|
|
|
+ shopPayPrice+=order.getDeliveryPrice();//店铺支付总金额,加上运费
|
|
|
+
|
|
|
+ allShopPayRMB +=shopPayPrice;
|
|
|
+
|
|
|
+ Long merchantId = shopMerchantMap.get(shopId);//商户ID
|
|
|
+
|
|
|
+ order.setMerchantId(merchantId);
|
|
|
+ order.setShopId(shopId);
|
|
|
+ order.setPayPrice(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 virtualOrder = new TradeOrderDO();//为了生成支付订单,创建的虚拟订单,本订单不会保存到数据库
|
|
|
+ TradeOrderDO firstOrder = (TradeOrderDO)(orderMapList.get(0).get("order"));
|
|
|
+ List<TradeOrderItemDO> firstOrderItems = (List<TradeOrderItemDO>)(orderMapList.get(0).get("orderItems"));
|
|
|
+
|
|
|
+ BeanUtils.copyProperties(firstOrder, virtualOrder);
|
|
|
+ virtualOrder.setPayPrice(allShopPayRMB);
|
|
|
+ virtualOrder.setPayRmb(allShopPayRMB);
|
|
|
+ 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,
|
|
@@ -275,7 +532,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
private void afterCreateTradeOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
|
|
|
AppTradeOrderCreateReqVO createReqVO) {
|
|
|
// 1. 执行订单创建后置处理器
|
|
|
- tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
|
|
|
+
|
|
|
+ //下面的代码是原来的营销代码,用不上,先注释掉
|
|
|
+// tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems));
|
|
|
|
|
|
// 2. 删除购物车商品
|
|
|
Set<Long> cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId);
|
|
@@ -283,50 +542,74 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
cartService.deleteCart(order.getUserId(), cartIds);
|
|
|
}
|
|
|
|
|
|
- // 3. 生成预支付
|
|
|
- createPayOrder(order, orderItems);
|
|
|
+ // 3. 生成预支付(去除)
|
|
|
+// createPayOrder(order, orderItems);
|
|
|
|
|
|
// 4. 插入订单日志
|
|
|
TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus());
|
|
|
|
|
|
- // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
|
|
|
+ // 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);
|
|
|
+
|
|
|
+ payOrderCreateReqDTO.setPrice(order.getPayRmb());//同步订单价格
|
|
|
+
|
|
|
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) {
|
|
|
+
|
|
|
+ Long tradeOrderId = tradeOrderDO.getId();
|
|
|
|
|
|
- // 4. 记录订单日志
|
|
|
- TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
|
|
|
- TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
|
|
|
+ // 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());
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -881,7 +1164,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void cancelPaidOrder(Long userId, Long orderId) {
|
|
|
- // TODO 芋艿:这里实现要优化下;
|
|
|
+ // TODO 非繁人:这里实现要优化下;
|
|
|
TradeOrderDO order = tradeOrderMapper.selectOrderByIdAndUserId(orderId, userId);
|
|
|
if (order == null) {
|
|
|
throw exception(ORDER_NOT_FOUND);
|