Browse Source

update: 修改订单预览、提交订单相关

Ben 11 months ago
parent
commit
cbdfd9a224

+ 7 - 0
feifan-module-mall/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/module/sale/dal/dataobject/shop/ShopDO.java

@@ -27,6 +27,13 @@ public class ShopDO extends BaseDO {
      */
     @TableId
     private Long id;
+
+    //是否启用全局包邮
+    private Boolean deliveryExpressFreeEnabled;
+
+    //全场包邮的最小金额,单位:分
+    private Integer deliveryExpressFreePrice;
+
     /**
      * 店铺名称
      */

+ 12 - 0
feifan-module-mall/feifan-module-trade-biz/pom.xml

@@ -118,6 +118,18 @@
             <version>2.0.0-jdk8-snapshot</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-member-biz</artifactId>
+            <version>2.0.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-member-biz</artifactId>
+            <version>2.0.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java

@@ -20,6 +20,9 @@ import java.util.List;
 @Valid
 public class AppTradeOrderSettlementReqVO {
 
+    @Schema(description = "店铺ID")
+    private Long shopId;
+
     @Schema(description = "商品项数组", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotEmpty(message = "商品不能为空")
     private List<Item> items;

+ 5 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/app/order/vo/AppTradeOrderSettlementRespVO.java

@@ -19,6 +19,11 @@ public class AppTradeOrderSettlementRespVO {
     @Schema(description = "为键值对:商品对应的店铺id和店名,key为店铺id,value为店铺名", requiredMode = Schema.RequiredMode.REQUIRED, example = "{15:'中星直营店',23:'五行茶旗舰店'}") //key为店铺ID,value为skuid的List
     Map<Long,String> shopNameMap;
 
+    /**
+     * 当前积分值
+     */
+    private Long currentMemberPoints;
+
     @Schema(description = "交易类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 对应 TradeOrderTypeEnum 枚举
     private Integer type;
 

+ 80 - 10
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -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;
@@ -56,6 +58,7 @@ import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalcula
 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;
 
@@ -80,6 +83,9 @@ 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
 
@@ -125,27 +131,35 @@ 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<>();
+        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>>();
+        //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>();
@@ -154,7 +168,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             shopSkuList.add(skuId);//把sku根据店聚合放到map中
         }
 
-        respVO.setShopSkuIds(shopSkuIds);//把sku根据店聚合放到map中
 
         //把店铺id和店铺名称查出来放到map中
         List<Long> shopIds = new ArrayList<Long>();
@@ -166,10 +179,65 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         for (ShopDO shopDO : shopDOList) {
             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.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.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;
     }
@@ -204,6 +272,8 @@ 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);
     }
 

+ 16 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/TradePriceServiceImpl.java

@@ -6,6 +6,7 @@ import cn.newfeifan.mall.module.product.api.spu.ProductSpuApi;
 import cn.newfeifan.mall.module.product.api.spu.dto.ProductSpuRespDTO;
 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.TradeDeliveryPriceCalculator;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculator;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
 import lombok.extern.slf4j.Slf4j;
@@ -51,7 +52,21 @@ public class TradePriceServiceImpl implements TradePriceService {
         // 2.1 计算价格
         TradePriceCalculateRespBO calculateRespBO = TradePriceCalculatorHelper
                 .buildCalculateResp(calculateReqBO, spuList, skuList);
-        priceCalculators.forEach(calculator -> calculator.calculate(calculateReqBO, calculateRespBO));
+
+//        原来下面会循环计算vip价格等,因为用不上,所以改为只计算运算 add by Ben
+//        priceCalculators.forEach(calculator -> calculator.calculate(calculateReqBO, calculateRespBO));
+        //计算运费
+        TradeDeliveryPriceCalculator tradeDeliveryPriceCalculator = null;
+        for(TradePriceCalculator tpc:priceCalculators){
+            //把计算运费对象取出来,这个对象不能new,因为自己new会缺少地址信息
+            if(tpc.getClass().getName().equals("cn.newfeifan.mall.module.trade.service.price.calculator.TradeDeliveryPriceCalculator")){
+                tradeDeliveryPriceCalculator = (TradeDeliveryPriceCalculator) tpc;
+                break;
+            }
+        }
+        calculateRespBO.setShopId(calculateReqBO.getShopId());
+        tradeDeliveryPriceCalculator.calculate(calculateReqBO, calculateRespBO);
+
         // 2.2  如果最终支付金额小于等于 0,则抛出业务异常
         if (calculateRespBO.getPrice().getPayPrice() <= 0) {
             log.error("[calculatePrice][价格计算不正确,请求 calculateReqDTO({}),结果 priceCalculate({})]",

+ 4 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/bo/TradePriceCalculateReqBO.java

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.trade.service.price.bo;
 
 import cn.newfeifan.mall.module.trade.enums.delivery.DeliveryTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.Valid;
@@ -16,6 +17,9 @@ import java.util.List;
 @Data
 public class TradePriceCalculateReqBO {
 
+    //店铺ID
+    private Long shopId;
+
     /**
      * 用户编号
      *

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/bo/TradePriceCalculateRespBO.java

@@ -19,6 +19,9 @@ import java.util.List;
 @Data
 public class TradePriceCalculateRespBO {
 
+    //店铺ID
+    private Long shopId;
+
     /**
      * 订单类型
      *

+ 16 - 4
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/price/calculator/TradeDeliveryPriceCalculator.java

@@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
 import cn.newfeifan.mall.framework.common.enums.CommonStatusEnum;
 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
+import cn.newfeifan.mall.module.sale.dal.dataobject.shop.ShopDO;
+import cn.newfeifan.mall.module.sale.dal.mysql.shop.ShopMapper;
 import cn.newfeifan.mall.module.trade.dal.dataobject.config.TradeConfigDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryPickUpStoreDO;
 import cn.newfeifan.mall.module.trade.enums.delivery.DeliveryExpressChargeModeEnum;
@@ -40,6 +42,9 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
 @Slf4j
 public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
 
+    @Resource
+    private ShopMapper shopMapper;
+
     @Resource
     private MemberAddressApi addressApi;
 
@@ -110,10 +115,17 @@ public class TradeDeliveryPriceCalculator implements TradePriceCalculator {
      * @return 是否包邮
      */
     private boolean isGlobalExpressFree(TradePriceCalculateRespBO result) {
-        TradeConfigDO config = tradeConfigService.getTradeConfig();
-        return config != null
-                && Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) // 开启包邮
-                && result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice(); // 满足包邮的价格
+        Long shopId = result.getShopId();
+        ShopDO shopDO = shopMapper.selectById(shopId);
+
+        return shopDO != null
+                && Boolean.TRUE.equals(shopDO.getDeliveryExpressFreeEnabled()) // 开启包邮
+                && result.getPrice().getPayPrice() >= shopDO.getDeliveryExpressFreePrice(); // 满足包邮的价格
+
+//        TradeConfigDO config = tradeConfigService.getTradeConfig();
+//        return config != null
+//                && Boolean.TRUE.equals(config.getDeliveryExpressFreeEnabled()) // 开启包邮
+//                && result.getPrice().getPayPrice() >= config.getDeliveryExpressFreePrice(); // 满足包邮的价格
     }
 
     private void calculateDeliveryPrice(List<OrderItem> selectedSkus,

+ 5 - 0
feifan-module-member/feifan-module-member-biz/src/main/java/cn/newfeifan/mall/module/member/dal/dataobject/user/MemberUserDO.java

@@ -36,11 +36,16 @@ public class MemberUserDO extends TenantBaseDO {
 
     // ========== 账号信息 ==========
 
+
     /**
      * 用户ID
      */
     @TableId
     private Long id;
+    /**
+     * 当前积分值
+     */
+    private Long currentMemberPoints;
     /**
      * 手机
      */