Bläddra i källkod

update: 修复订单支付使用积分,并使用积分日志。

Ben 1 år sedan
förälder
incheckning
aa247f2da6

+ 5 - 3
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/constant/DistriConstants.java

@@ -1,13 +1,15 @@
 package cn.newfeifan.mall.module.distri.constant;
 
-import cn.newfeifan.mall.framework.common.exception.ErrorCode;
+import java.math.BigDecimal;
 
 public class DistriConstants {
     // ========== 分销信息商户信息 1-002-029-000 ==========
     public static final Integer PERCENT = 10000;//积分数据库中的值,比页面显示的值,大了此倍数
 
-    // 数据库中,积分比金钱大的倍数
-    public static final Integer INTEGRAL2MONEY = PERCENT/100;
+    // 数据库中,积分比金钱大的倍数,即钱转成积分要乘于此参数
+    public static final Integer MONEY2INTEGRAL = PERCENT/100;
+    // MONEY2INTEGRAL的BigDecimal版本
+    public static final BigDecimal MONEY2INTEGRAL_BIG_DECIMAL = new BigDecimal(Integer.parseInt(MONEY2INTEGRAL.toString()));
 
     public static final Double ONE_HUNDRED = 1d;
 

+ 3 - 2
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java

@@ -14,9 +14,10 @@ public enum CaclEnum {
     HIGH_QUOTA(6, "最高可以获得积分"),
     SMALL_QUOTA_CRASH(7, "小区额度分配"),
     AFTER_CRASH_CALC_PT_TOTAL_QUOTA(8, "碰撞后计算平台总收益"),
-    ORDER_PAY_INTEGRAL(9,"购物获得积分"),//购物获得冻结积分
+    ORDER_PAY_INTEGRAL(9,"购物使用积分"),//支付了一部分积分作购物用
     ORDER_REFUND_INTEGRAL(10,"订单退款,积分退回"),
-    ORDER_INTEGRAL_UNFREEZE(11,"订单积分到账")//购物收货7天后,冻结积分变为可用积分
+    ORDER_INTEGRAL_UNFREEZE(11,"订单积分到账"),//购物收货7天后,冻结积分变为可用积分
+    ORDER_GET_FREEZE_INTEGRAL(12,"购物返积分"),//购物获得冻结积分
     ;
 
     /**

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

@@ -18,7 +18,6 @@ import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
 import cn.newfeifan.mall.module.distri.dal.mysql.orderpercentage.OrderPercentageMapper;
 import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
-import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
 import cn.newfeifan.mall.module.member.api.address.MemberAddressApi;
 import cn.newfeifan.mall.module.member.api.address.dto.MemberAddressRespDTO;
 import cn.newfeifan.mall.module.pay.api.order.PayOrderApi;
@@ -391,14 +390,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return tradePriceService.calculatePrice(calculateReqBO);
     }
 
+    //把数据库的钱转换为数据库的积分
+    public static BigDecimal money2Integral(BigDecimal money){
+        return money.multiply(DistriConstants.MONEY2INTEGRAL_BIG_DECIMAL);
+    }
+
     //把数据库的钱转换为数据库的积分
     public static Integer money2Integral(Integer money){
-        return money*DistriConstants.INTEGRAL2MONEY;
+        return money*DistriConstants.MONEY2INTEGRAL;
     }
 
     //把数据库的积分转换为数据库的钱
     public static Integer integral2Money(Integer integral){
-        return integral/DistriConstants.INTEGRAL2MONEY;
+        return integral/DistriConstants.MONEY2INTEGRAL;
     }
 
     @Override
@@ -590,14 +594,23 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             tradeOrderMapper.updateById(new TradeOrderDO().setId(order.getId()).setPayOrderId(payOrderId));
         }
 
-        //如果订单有使用积分,则抵扣用户的积分 add by Ben
+        //如果订单有使用积分,则抵扣用户的积分add by Ben
         if(payPoints>0){
+            for(Map<String,Object> m:orderMapList) {
+                TradeOrderDO order = (TradeOrderDO) (m.get("order"));
+                Long tradeOrderId = order.getId();
+                String OrderNum =order.getNo();
+                Integer payIntegral = order.getPayIntegral();//每个订单使用的积分
+                integralService.updateUserIntegral(userId, CaclEnum.ORDER_PAY_INTEGRAL, payIntegral * (-1), 0, tradeOrderId, OrderNum);
+            }
+        }
 
-            //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
+        boolean caculateFreezeAmount = false;//增加冻结积分
+
+        //增加冻结积分这分部分,是订单微信支付成功后,才执行的,下面的代码只是为了测试方便写在这,实际永远不会执行。add by Ben
+        if(caculateFreezeAmount){
 
-            //查询订单提成比例
-            QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
-            OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
+            //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
 
             for(Map<String,Object> m:orderMapList){
                 TradeOrderDO order = (TradeOrderDO)(m.get("order"));
@@ -624,18 +637,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                             *tradeOrderItemDO.getCount();
                     totalPromotionExpenses+=promotionExpenses;
                 }
-                //转为BigDecimal
-                BigDecimal profit = new BigDecimal(String.valueOf(totalPromotionExpenses));
-
-                // 计算毛利: 利润 * 0.38
-                BigDecimal grossProfit = profit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitPerc())).setScale(4, RoundingMode.DOWN);
-
-                // 计算直推人额度: 毛利 * 0.35
-                BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
-                Integer descendantQuotaInt = descendantQuota.intValue();
 
-                //把钱转为:增加的冻结积分
-                Integer freezeAmount = money2Integral(descendantQuotaInt);
+                //把商品的推广费总额,转换为直推人获得的冻结积分
+                Integer freezeAmount = promotionExpenses2GrossProfitAncestorQuota(orderPercentageMapper,totalPromotionExpenses);
 
                 Long tradeOrderId = order.getId();
                 String OrderNum =order.getNo();
@@ -647,6 +651,37 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         return virtualOrder;
     }
 
+    /**
+     * 把商品的推广费总额,转换为直推人获得的冻结积分
+     * @param totalPromotionExpenses 商品的推广费总额
+     * @return 输入推广费,对应的直推人获得的冻结积分
+     */
+    public static Integer promotionExpenses2GrossProfitAncestorQuota(
+            OrderPercentageMapper orderPercentageMapper,
+            Integer totalPromotionExpenses){
+
+        //查询订单提成比例
+        QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
+        OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
+
+        //转为BigDecimal
+        BigDecimal profit = new BigDecimal(String.valueOf(totalPromotionExpenses));
+
+        // 计算毛利: 利润 * 0.38
+        BigDecimal grossProfit = profit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitPerc())).setScale(4, RoundingMode.DOWN);
+
+        // 计算直推人额度: 毛利 * 0.35
+        BigDecimal descendantQuota = grossProfit.multiply(new BigDecimal(orderPercentageDO.getGrossProfitAncestorQuotaPerc())).setScale(4, RoundingMode.DOWN);
+
+        //把钱转为:增加的冻结积分
+        BigDecimal freezeAmount_bigDecimal = money2Integral(descendantQuota);
+
+        Integer freezeAmount = freezeAmount_bigDecimal.intValue();
+
+        return freezeAmount;
+    }
+
+
     private TradeOrderDO buildTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
                                          TradePriceCalculateRespBO calculateRespBO) {
         TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, createReqVO, calculateRespBO);
@@ -804,7 +839,41 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus());
             TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue());
 
+
+            // 5. 增加用户冻结积分 20240420
+
+            List<Long> skuList = new ArrayList<>();
+            //汇总各订单项利润
+            List<TradeOrderItemDO> TradeOrderItemList = tradeOrderItemMapper.selectList("order_id", order.getId());
+            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
+                Long skuId = tradeOrderItemDO.getSkuId();
+                skuList.add(skuId);
+            }
+
+            List<ProductSkuDO> productSkuDOS = productSkuMapper.selectBatchIds(skuList);
+            Map<Long,ProductSkuDO> skuDOMap = new HashMap<Long,ProductSkuDO>();
+            for (ProductSkuDO productSkuDO : productSkuDOS) {
+                skuDOMap.put(productSkuDO.getId(),productSkuDO);
+            }
+
+            Integer totalPromotionExpenses = 0;//总推广费,单位为分
+            for (TradeOrderItemDO tradeOrderItemDO : TradeOrderItemList) {
+                ProductSkuDO productSkuDO = skuDOMap.get(tradeOrderItemDO.getSkuId());
+                //这类商品的总推广费
+                Integer promotionExpenses = (productSkuDO.getPrice()-productSkuDO.getCostPrice())
+                        *tradeOrderItemDO.getCount();
+                totalPromotionExpenses+=promotionExpenses;
+            }
+
+            //把商品的推广费总额,转换为直推人获得的冻结积分
+            Integer freezeAmount = promotionExpenses2GrossProfitAncestorQuota(orderPercentageMapper,totalPromotionExpenses);
+
+            String OrderNum =order.getNo();
+            integralService.updateUserIntegral(tradeOrderDO.getUserId(), CaclEnum.ORDER_GET_FREEZE_INTEGRAL, 0,freezeAmount,tradeOrderId,OrderNum);
+
         }
+
+
     }
 
     /**