Bläddra i källkod

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

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

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

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

+ 6 - 6
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/orderpercentage/OrderPercentageDO.java

@@ -30,27 +30,27 @@ public class OrderPercentageDO extends BaseDO {
     /**
      * 毛利 = 成本 * 0.38... (推广费用)
      */
-    private Integer grossProfitPerc;
+    private String grossProfitPerc;
     /**
      * 推广-用户额度 百分比
      */
-    private Integer grossProfitUserQuotaPerc;
+    private String grossProfitUserQuotaPerc;
     /**
      * 推广-推荐人额度 百分比
      */
-    private Integer grossProfitAncestorQuotaPerc;
+    private String grossProfitAncestorQuotaPerc;
     /**
      * 推广-合赢奖额度(浮动) 百分比
      */
-    private Integer grossProfitBonusQuotaPerc;
+    private String grossProfitBonusQuotaPerc;
     /**
      * 推广-平台分成额度(浮动) 百分比
      */
-    private Integer grossProfitPlatformQuotaPerc;
+    private String grossProfitPlatformQuotaPerc;
     /**
      * 分成百分比
      */
-    private Integer divideIntoPerc;
+    private String divideIntoPerc;
 
     private Integer status;
 

+ 8 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java

@@ -59,5 +59,13 @@ public class PtProfitLogDO extends BaseDO {
      */
     private String orderNo;
 
+    /**
+     * 增加金额
+     */
+    private Integer freezeAmount;
 
+    /**
+     * 增加后金额
+     */
+    private Integer afterFreezeAmount;
 }

+ 94 - 94
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java

@@ -98,100 +98,100 @@ public class OrderCalcServiceImpl implements OrderCalcService {
 
     @Override
     public void calc(List<DistriOrderMessage> tradeOrderDO) {
-
-        // 获取到当前订单的所有人
-        List<Long> userId = tradeOrderDO.stream().map(DistriOrderMessage::getUserId).collect(Collectors.toList());
-
-
-        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
-        // 当前计算百分比模板
-        String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
-
-
-        // 每个订单收益
-        List<OrderCalcSaveReqVO> saveList = new ArrayList<>();
-        // 平台收益
-        List<PtProfitSaveReqVO> ptProfitSaveReqVOS = new ArrayList<>();
-        // 平台收益日志
-        List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS = new ArrayList<>();
-
-        PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
-
-        tradeOrderDO.forEach(k -> {
-
-            // 计算利润: (价格 - 成本价格) * 产品数量
-            Integer profit = (k.getPrice() - k.getCostPrice()) * k.getProductCount();
-            // 计算毛利: 利润 * 0.38
-            Integer grossProfit = profit * orderPercentageDO.getGrossProfitPerc();
-            // 计算用户额度: 利润 * 0.38
-            Integer userProfit = grossProfit * orderPercentageDO.getGrossProfitUserQuotaPerc();
-            // 计算直推人额度: 利润 * 0.38
-            Integer ancestorQuota = grossProfit * orderPercentageDO.getGrossProfitAncestorQuotaPerc();
-            // 计算合赢奖: 利润 * 0.38
-            Integer bonusQuota = grossProfit * orderPercentageDO.getGrossProfitBonusQuotaPerc();
-            // 计算平台收益: 利润 * 0.38
-            Integer platformQuota = grossProfit * orderPercentageDO.getGrossProfitPlatformQuotaPerc();
-
-
-            // 计算
-            OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
-                    .userId(k.getUserId())
-                    .orderNo(k.getNo())
-                    .cost(k.getCostPrice())
-                    .price(k.getPrice())
-                    .grossProfit(grossProfit)
-                    .grossProfitUserQuota(userProfit)
-                    .grossProfitAncestorQuota(ancestorQuota)
-                    .grossProfitBonusQuota(bonusQuota)
-                    .grossProfitPlatformQuota(platformQuota)
-                    .percentTemplate(percentTemplate)
-                    .build();
-            saveList.add(orderCalcSaveReqVO);
-
-            // 每个订单计算的过程
-            // 增加平台收益
-            // 平台服务费
-            Integer ptGrossAdd = ptProfitDO.getPtGrossAdd() + platformQuota;
-            // 平台收益
-            Integer ptAdd = ptProfitDO.getPtAdd() + grossProfit * (10000 - orderPercentageDO.getGrossProfitBonusQuotaPerc());
-            // 平台总收益
-            Integer ptTotal = ptProfitDO.getPtTotalAdd() + ptGrossAdd + ptAdd;
-
-            PtProfitSaveReqVO ptProfitSaveReqVO = PtProfitSaveReqVO.builder()
-                    .ptAdd(ptAdd)
-                    .ptGrossAdd(ptGrossAdd)
-                    .ptTotalAdd(ptTotal).build();
-            ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
-
-            // 平台记录
-            PtProfitLogSaveReqVO ptGrossAddLog = PtProfitLogSaveReqVO.builder()
-                    .orderId(k.getOrderId())
-                    .profitStatus(1)
-                    .amount(platformQuota)
-                    .afterAmount(ptProfitSaveReqVO.getPtGrossAdd())
-                    .percentTemplate(percentTemplate).build();
-
-            PtProfitLogSaveReqVO ptAddLog = PtProfitLogSaveReqVO.builder()
-                    .orderId(k.getOrderId())
-                    .profitStatus(2)
-                    .amount(grossProfit * (PERCENT - orderPercentageDO.getGrossProfitBonusQuotaPerc()))
-                    .afterAmount(ptProfitSaveReqVO.getPtAdd())
-                    .percentTemplate(percentTemplate).build();
-            ptProfitLogSaveReqVOS.add(ptGrossAddLog);
-            ptProfitLogSaveReqVOS.add(ptAddLog);
-
-
-        });
-
-        // 将信息存储到数据库中
-        orderCalcMapper.insertBatch(BeanUtils.toBean(saveList, OrderCalcDO.class));
-        ptProfitService.saveBatch(ptProfitSaveReqVOS);
-        ptProfitLogService.saveBatch(ptProfitLogSaveReqVOS);
-
-
-        // todo 计算当天用户的碰撞
-
-
+//
+//        // 获取到当前订单的所有人
+//        List<Long> userId = tradeOrderDO.stream().map(DistriOrderMessage::getUserId).collect(Collectors.toList());
+//
+//
+//        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+//        // 当前计算百分比模板
+//        String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
+//
+//
+//        // 每个订单收益
+//        List<OrderCalcSaveReqVO> saveList = new ArrayList<>();
+//        // 平台收益
+//        List<PtProfitSaveReqVO> ptProfitSaveReqVOS = new ArrayList<>();
+//        // 平台收益日志
+//        List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS = new ArrayList<>();
+//
+//        PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
+//
+//        tradeOrderDO.forEach(k -> {
+//
+//            // 计算利润: (价格 - 成本价格) * 产品数量
+//            Integer profit = (k.getPrice() - k.getCostPrice()) * k.getProductCount();
+//            // 计算毛利: 利润 * 0.38
+//            Integer grossProfit = profit * orderPercentageDO.getGrossProfitPerc();
+//            // 计算用户额度: 利润 * 0.38
+//            Integer userProfit = grossProfit * orderPercentageDO.getGrossProfitUserQuotaPerc();
+//            // 计算直推人额度: 利润 * 0.38
+//            Integer ancestorQuota = grossProfit * orderPercentageDO.getGrossProfitAncestorQuotaPerc();
+//            // 计算合赢奖: 利润 * 0.38
+//            Integer bonusQuota = grossProfit * orderPercentageDO.getGrossProfitBonusQuotaPerc();
+//            // 计算平台收益: 利润 * 0.38
+//            Integer platformQuota = grossProfit * orderPercentageDO.getGrossProfitPlatformQuotaPerc();
+//
+//
+//            // 计算
+//            OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
+//                    .userId(k.getUserId())
+//                    .orderNo(k.getNo())
+//                    .cost(k.getCostPrice())
+//                    .price(k.getPrice())
+//                    .grossProfit(grossProfit)
+//                    .grossProfitUserQuota(userProfit)
+//                    .grossProfitAncestorQuota(ancestorQuota)
+//                    .grossProfitBonusQuota(bonusQuota)
+//                    .grossProfitPlatformQuota(platformQuota)
+//                    .percentTemplate(percentTemplate)
+//                    .build();
+//            saveList.add(orderCalcSaveReqVO);
+//
+//            // 每个订单计算的过程
+//            // 增加平台收益
+//            // 平台服务费
+//            Integer ptGrossAdd = ptProfitDO.getPtGrossAdd() + platformQuota;
+//            // 平台收益
+//            Integer ptAdd = ptProfitDO.getPtAdd() + grossProfit * (10000 - orderPercentageDO.getGrossProfitBonusQuotaPerc());
+//            // 平台总收益
+//            Integer ptTotal = ptProfitDO.getPtTotalAdd() + ptGrossAdd + ptAdd;
+//
+//            PtProfitSaveReqVO ptProfitSaveReqVO = PtProfitSaveReqVO.builder()
+//                    .ptAdd(ptAdd)
+//                    .ptGrossAdd(ptGrossAdd)
+//                    .ptTotalAdd(ptTotal).build();
+//            ptProfitSaveReqVOS.add(ptProfitSaveReqVO);
+//
+//            // 平台记录
+//            PtProfitLogSaveReqVO ptGrossAddLog = PtProfitLogSaveReqVO.builder()
+//                    .orderId(k.getOrderId())
+//                    .profitStatus(1)
+//                    .amount(platformQuota)
+//                    .afterAmount(ptProfitSaveReqVO.getPtGrossAdd())
+//                    .percentTemplate(percentTemplate).build();
+//
+//            PtProfitLogSaveReqVO ptAddLog = PtProfitLogSaveReqVO.builder()
+//                    .orderId(k.getOrderId())
+//                    .profitStatus(2)
+//                    .amount(grossProfit * (PERCENT - orderPercentageDO.getGrossProfitBonusQuotaPerc()))
+//                    .afterAmount(ptProfitSaveReqVO.getPtAdd())
+//                    .percentTemplate(percentTemplate).build();
+//            ptProfitLogSaveReqVOS.add(ptGrossAddLog);
+//            ptProfitLogSaveReqVOS.add(ptAddLog);
+//
+//
+//        });
+//
+//        // 将信息存储到数据库中
+//        orderCalcMapper.insertBatch(BeanUtils.toBean(saveList, OrderCalcDO.class));
+//        ptProfitService.saveBatch(ptProfitSaveReqVOS);
+//        ptProfitLogService.saveBatch(ptProfitLogSaveReqVOS);
+//
+//
+//        // todo 计算当天用户的碰撞
+//
+//
     }
 
 }

+ 1 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java

@@ -108,6 +108,7 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
                 .percentTemplate(percentTemplate)
                 .userId(userId)
                 .profitStatus(caclEnum.getType()).orderId(tradeOrderId).orderNo(OrderNum)
+                .freezeAmount(freezeAmount).afterFreezeAmount(afterFreezeAmount)
                 .build();
         ptProfitLogMapper.insert(BeanUtils.toBean(ptProfitLog, PtProfitLogDO.class));
 

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

@@ -13,7 +13,9 @@ import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
 import cn.newfeifan.mall.framework.common.util.number.MoneyUtils;
 import cn.newfeifan.mall.module.distri.constant.DistriConstants;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
 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;
@@ -62,6 +64,7 @@ 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.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.BeanUtils;
@@ -69,6 +72,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -138,6 +143,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
     @Resource
     private IntegralService integralService;
 
+    @Resource
+    private OrderPercentageMapper orderPercentageMapper;
+
     // =================== Order ===================
 
 
@@ -586,11 +594,49 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
         if(payPoints>0){
 
             //下面这部分,应该是写到订单支付成功的地方的,写在下面这里,只是为了方便测试
-            Integer freezeAmount =2;//测试方便,临时写死,等汉鹏的方法
+
+            //查询订单提成比例
+            QueryWrapper<OrderPercentageDO> queryWrapper = new QueryWrapper<>();
+            OrderPercentageDO orderPercentageDO = orderPercentageMapper.selectOne(queryWrapper);//表中只有一条记录
 
             for(Map<String,Object> m:orderMapList){
                 TradeOrderDO order = (TradeOrderDO)(m.get("order"));
 
+                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;
+                }
+                //转为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);
+
                 Long tradeOrderId = order.getId();
                 String OrderNum =order.getNo();
                 integralService.updateUserIntegral(userId, CaclEnum.ORDER_PAY_INTEGRAL, payPoints*(-1),freezeAmount,tradeOrderId,OrderNum);