Bläddra i källkod

修改虚拟商品的金额精度

Yangzw 10 månader sedan
förälder
incheckning
682b7d221b

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

@@ -86,9 +86,12 @@ public class AppTradeOrderSettlementRespVO {
     @AllArgsConstructor
     public static class Price {
 
-        @Schema(description = "商品原价(总),单位:", requiredMode = Schema.RequiredMode.REQUIRED, example = "500")
+        @Schema(description = "商品原价(总),单位:小数点后六位", requiredMode = Schema.RequiredMode.REQUIRED, example = "500")
         private Integer totalPrice;
 
+        @Schema(description = "虚拟商品原价(总)", requiredMode = Schema.RequiredMode.REQUIRED, example = "500")
+        private Double virtualTotalPrice;
+
         @Schema(description = "订单优惠(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "66")
         private Integer discountPrice;
 
@@ -107,6 +110,9 @@ public class AppTradeOrderSettlementRespVO {
         @Schema(description = "实际支付金额(总),单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "450")
         private Integer payPrice;
 
+        @Schema(description = "虚拟商品实际支付金额(总),单位:小数点后六位", requiredMode = Schema.RequiredMode.REQUIRED, example = "450")
+        private Double virtualPayPrice;
+
     }
 
     @Schema(description = "地址信息")

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

@@ -87,8 +87,10 @@ import static cn.newfeifan.mall.framework.common.exception.util.ServiceException
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
 import static cn.newfeifan.mall.framework.common.util.date.LocalDateTimeUtils.minusTime;
 import static cn.newfeifan.mall.framework.common.util.servlet.ServletUtils.getClientIP;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.framework.web.core.util.WebFrameworkUtils.getTerminal;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
+import static cn.newfeifan.mall.module.trade.enums.delivery.DeliveryTypeEnum.VIRTUAL_PRODUCT;
 
 
 /**
@@ -273,6 +275,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             shopNameMap.put(shopDO.getId(), shopDO.getName());
         }
 
+        //如果是虚拟商品,则用自己的编写的程序返回
+        if(Objects.equals(settlementReqVO.getDeliveryType(), VIRTUAL_PRODUCT.getType())){
+            return getSettlement(settlementReqVO.getItems());
+        }
+
         // 2. 计算价格
         /*
           add by Ben 20240402
@@ -346,6 +353,95 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return respVO;
     }
 
+    /**
+     * 虚拟商品自走程序
+     * @param items 商品项数组
+     * @return AppTradeOrderSettlementRespVO
+     */
+    private AppTradeOrderSettlementRespVO getSettlement(List<AppTradeOrderSettlementReqVO.Item> items){
+
+        // 4. 查询每个sku对应的店铺ID,并传回页面
+        List<AppTradeOrderSettlementReqVO.Item> productSkuList = items;
+        List<Long> productSkuIdList = new ArrayList<>();
+        Map<Long, AppTradeOrderSettlementReqVO.Item> itemMap = new HashMap<>();
+        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<>();
+        //key为店铺ID,value为item的Map
+        Map<Long, List<AppTradeOrderSettlementReqVO.Item>> shopSkuItemMap = new HashMap<>();
+
+        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<>();
+                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<>();
+                shopSkuIds.put(shopId, shopSkuList);
+            }
+            shopSkuList.add(skuId);//把sku根据店聚合放到map中
+        }
+
+
+        //把店铺id和店铺名称查出来放到map中
+        List<Long> shopIds = new ArrayList<>();
+        for (Long shopid : shopSkuIds.keySet()) {
+            shopIds.add(shopid);
+        }
+        List<ShopDO> shopDOList = shopMapper.selectListById(shopIds);
+        Map<Long, String> shopNameMap = new HashMap<>();//key为店铺id,value为店铺名
+        for (ShopDO shopDO : shopDOList) {
+            shopNameMap.put(shopDO.getId(), shopDO.getName());
+        }
+
+        AppTradeOrderSettlementRespVO respVO = new AppTradeOrderSettlementRespVO();
+        respVO.setShopNameMap(shopNameMap);
+        respVO.setShopSkuIds(shopSkuIds);
+        IntegralDO integralDO = integralMapper.selectOne("user_id", getLoginUserId());//查询出用户积分相关信息
+        Long currentQuota = integralDO.getCurrentQuota();//获取用户当前积分
+        respVO.setCurrentQuota(currentQuota);
+
+        //保存每个店铺返回页面的 订单信息汇总
+        Map<Long, AppTradeOrderSettlementRespVO> shopRespVOMap = new HashMap<>();
+        //所有店铺支付总价
+        AppTradeOrderSettlementRespVO.Price shopCalculateRespBO = new AppTradeOrderSettlementRespVO.Price();
+
+        //循环计算各个店铺的价格
+        for (Long shopId : shopSkuItemMap.keySet()) {
+            List<AppTradeOrderSettlementReqVO.Item> orderItems = shopSkuItemMap.get(shopId);
+
+            //计算价格
+            shopRespVOMap.put(shopId, respVO);
+            ProductSkuDO productSkuDO = productSkuMapper.selectById(orderItems.get(0).getSkuId());
+            shopCalculateRespBO.setVirtualPayPrice(productSkuDO.getHighPrecisionPrice().doubleValue() * orderItems.get(0).getCount());
+            shopCalculateRespBO.setVirtualTotalPrice(productSkuDO.getHighPrecisionPrice().doubleValue() * orderItems.get(0).getCount());
+        }
+
+        //把重复的收货地址置为空
+        for (Long shopId : shopRespVOMap.keySet()) {
+            AppTradeOrderSettlementRespVO a = shopRespVOMap.get(shopId);
+            a.setAddress(null);
+        }
+
+        respVO.setShopRespVOMap(shopRespVOMap);
+        respVO.setPrice(shopCalculateRespBO);
+        return respVO;
+    }
+
     /**
      * 获得用户地址
      *
@@ -777,7 +873,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         } else if (Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.PICK_UP.getType())) {
             order.setReceiverName(createReqVO.getReceiverName()).setReceiverMobile(createReqVO.getReceiverMobile());
             order.setPickUpVerifyCode(RandomUtil.randomNumbers(8)); // 随机一个核销码,长度为 8 位
-        } else if(Objects.equals(createReqVO.getDeliveryType(), DeliveryTypeEnum.VIRTUAL_PRODUCT.getType())){
+        } else if(Objects.equals(createReqVO.getDeliveryType(), VIRTUAL_PRODUCT.getType())){
             MemberAddressRespDTO address = addressApi.getAddress(createReqVO.getAddressId(), userId,2);
             order.setReceiverName(address.getName()).setReceiverMobile(address.getMobile())
                     .setReceiverDetailAddress(address.getDetailAddress());