Sfoglia il codice sorgente

修改营销模块,计算模块

gaohp 1 anno fa
parent
commit
259c84e426

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java

@@ -55,5 +55,9 @@ public interface DuserService {
 
 
     void hasUserAndCreat(SharePathSaveReqVO saveReqVO);
+    void hasUserAndCreat(Long userId);
+
+
+    void hasUserAndCreat(List<Long> userIds);
 
 }

+ 13 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java

@@ -102,6 +102,19 @@ public class DuserServiceImpl implements DuserService {
         checkAndCreat(saveReqVO.getAncestor());
     }
 
+    @Override
+    public void hasUserAndCreat(Long userId) {
+        checkAndCreat(userId);
+    }
+
+    @Override
+    public void hasUserAndCreat(List<Long> userIds) {
+        if (userIds == null) {
+            return;
+        }
+        userIds.forEach(this::hasUserAndCreat);
+    }
+
     private void checkAndCreat(Long userId) {
         DuserDO duserDO = duserMapper.selectOne(new LambdaQueryWrapperX<DuserDO>().eqIfPresent(DuserDO::getUserId, userId));
         MemberUserDO user = memberUserService.getUser(userId);

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java

@@ -60,4 +60,6 @@ public interface IntegralService {
     IntegralDO selectByUser(Long descendant);
 
 
+    void saveBatch(List<IntegralSaveReqVO> integralSaveReqVOS);
+
 }

+ 7 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
@@ -80,4 +81,10 @@ public class IntegralServiceImpl implements IntegralService {
         return integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, descendant));
     }
 
+    @Override
+    public void saveBatch(List<IntegralSaveReqVO> integralSaveReqVOS) {
+        List<IntegralDO> integralDOS = BeanUtils.toBean(integralSaveReqVOS, IntegralDO.class);
+        integralMapper.insertBatch(integralDOS);
+    }
+
 }

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

@@ -2,13 +2,20 @@ package cn.newfeifan.mall.module.distri.service.ordercalc;
 
 import cn.newfeifan.mall.framework.common.mq.message.order.DistriOrderMessage;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.module.distri.controller.admin.duser.vo.DuserSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
+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.dataobject.ptprofit.PtProfitDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
+import cn.newfeifan.mall.module.distri.service.duser.DuserService;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
 import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
 import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
 import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
+import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -16,6 +23,7 @@ import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.awt.print.PrinterGraphics;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -50,6 +58,17 @@ public class OrderCalcServiceImpl implements OrderCalcService {
     @Resource
     private PtProfitLogService ptProfitLogService;
 
+    @Resource
+    private SharePathService sharePathService;
+
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @Resource
+    private DuserService duserService;
+
+    @Resource
+    private IntegralService integralService;
 
     @Override
     public Long createOrderCalc(OrderCalcSaveReqVO createReqVO) {
@@ -93,21 +112,28 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         return orderCalcMapper.selectPage(pageReqVO);
     }
 
-    @Resource
-    private OrderPercentageService orderPercentageService;
+
 
     @Override
     public void calc(List<DistriOrderMessage> tradeOrderDO) {
 
         // 获取到当前订单的所有人
         List<Long> userId = tradeOrderDO.stream().map(DistriOrderMessage::getUserId).collect(Collectors.toList());
-
+        // 判断当前下单的人员是否有进入营销模块用户表, 如果没有的话, 需要初始化
+        duserService.hasUserAndCreat(userId);
 
         OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
         // 当前计算百分比模板
         String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
 
+        calc(tradeOrderDO, orderPercentageDO, percentTemplate);
+
+        // todo 计算当天用户的碰撞
+
 
+    }
+
+    private void calc(List<DistriOrderMessage> tradeOrderDO, OrderPercentageDO orderPercentageDO, String percentTemplate) {
         // 每个订单收益
         List<OrderCalcSaveReqVO> saveList = new ArrayList<>();
         // 平台收益
@@ -115,39 +141,39 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         // 平台收益日志
         List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS = new ArrayList<>();
 
-        PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
+        // 修改用户钱包
+        List<IntegralSaveReqVO> integralSaveReqVOS = new ArrayList<>();
+
 
+        // todo 修改用户身价 如何从订单中获取身价?
+        List<DuserSaveReqVO> duserSaveReqVOS = new ArrayList<>();
+
+        PtProfitDO ptProfitDO = ptProfitService.getPtProfit();
         tradeOrderDO.forEach(k -> {
+            // 获取当前下单人关系
+            SharePathDO sharePath = getSharePath(k.getUserId());
+            // 获取下单人的钱包以及用户表
+            IntegralDO integralDO = integralService.selectByUser(sharePath.getDescendant());
+            IntegralDO integralDOAncestor = integralService.selectByUser(sharePath.getAncestor());
 
             // 计算利润: (价格 - 成本价格) * 产品数量
             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.getGrossProfitUserQuotaPerc();
             // 计算直推人额度: 利润 * 0.38
-            Integer ancestorQuota = grossProfit * orderPercentageDO.getGrossProfitAncestorQuotaPerc();
+            Integer descendantQuota = 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);
-
+            // ========== 汇总计算 =================
+            addCaclDo(percentTemplate, saveList, k, grossProfit, ancestorQuota, descendantQuota, bonusQuota, platformQuota);
+            // ========== 修改用户钱包 =================
+            changeUserWallet(integralSaveReqVOS, integralDO, integralDOAncestor, ancestorQuota, descendantQuota);
+            // ========== 修改平台信息 =================
             // 每个订单计算的过程
             // 增加平台收益
             // 平台服务费
@@ -162,36 +188,109 @@ public class OrderCalcServiceImpl implements OrderCalcService {
                     .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);
-
-
+            // ========== 增加日志记录 =================
+            addLog(orderPercentageDO, percentTemplate, ptProfitLogSaveReqVOS, k, sharePath, integralDO, integralDOAncestor, grossProfit, ancestorQuota, descendantQuota, bonusQuota, platformQuota, ptProfitSaveReqVO);
         });
 
         // 将信息存储到数据库中
         orderCalcMapper.insertBatch(BeanUtils.toBean(saveList, OrderCalcDO.class));
         ptProfitService.saveBatch(ptProfitSaveReqVOS);
         ptProfitLogService.saveBatch(ptProfitLogSaveReqVOS);
+        integralService.saveBatch(integralSaveReqVOS);
+    }
 
+    private static void addCaclDo(String percentTemplate, List<OrderCalcSaveReqVO> saveList, DistriOrderMessage k, Integer grossProfit, Integer ancestorQuota, Integer descendantQuota, Integer bonusQuota, Integer platformQuota) {
+        OrderCalcSaveReqVO orderCalcSaveReqVO = OrderCalcSaveReqVO.builder()
+                .userId(k.getUserId())
+                .orderNo(k.getNo())
+                .cost(k.getCostPrice())
+                .price(k.getPrice())
+                .grossProfit(grossProfit)
+                .grossProfitUserQuota(ancestorQuota)
+                .grossProfitAncestorQuota(descendantQuota)
+                .grossProfitBonusQuota(bonusQuota)
+                .grossProfitPlatformQuota(platformQuota)
+                .percentTemplate(percentTemplate)
+                .build();
+        saveList.add(orderCalcSaveReqVO);
+    }
 
-        // todo 计算当天用户的碰撞
+    private static void changeUserWallet(List<IntegralSaveReqVO> integralSaveReqVOS, IntegralDO integralDO, IntegralDO integralDOAncestor, Integer ancestorQuota, Integer descendantQuota) {
+        // 修改用户钱包
+        integralDO.setCurrentQuota(integralDO.getCurrentQuota() + descendantQuota);
+        integralDOAncestor.setCurrentQuota(integralDO.getCurrentQuota() + ancestorQuota);
+
+        integralSaveReqVOS.add(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
+        integralSaveReqVOS.add(BeanUtils.toBean(integralDOAncestor, IntegralSaveReqVO.class));
+    }
 
 
+    private static void addLog(OrderPercentageDO orderPercentageDO, String percentTemplate, List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS, DistriOrderMessage k, SharePathDO sharePath, IntegralDO integralDO, IntegralDO integralDOAncestor, Integer grossProfit, Integer ancestorQuota, Integer descendantQuota, Integer bonusQuota, Integer platformQuota, PtProfitSaveReqVO ptProfitSaveReqVO) {
+
+        // 平台记录
+        PtProfitLogSaveReqVO ptGrossAddLog = PtProfitLogSaveReqVO.builder()
+                .orderId(k.getOrderId())
+                .profitStatus(1)
+                .orderNo(k.getNo())
+                .amount(platformQuota)
+                .afterAmount(ptProfitSaveReqVO.getPtGrossAdd())
+                .percentTemplate(percentTemplate).build();
+
+        PtProfitLogSaveReqVO ptAddLog = PtProfitLogSaveReqVO.builder()
+                .orderId(k.getOrderId())
+                .profitStatus(2)
+                .orderNo(k.getNo())
+                .amount(grossProfit * (PERCENT - orderPercentageDO.getGrossProfitBonusQuotaPerc()))
+                .afterAmount(ptProfitSaveReqVO.getPtAdd())
+                .percentTemplate(percentTemplate).build();
+
+
+        // 推荐人记录
+        PtProfitLogSaveReqVO tjrLog = PtProfitLogSaveReqVO.builder()
+                .orderId(k.getOrderId())
+                .profitStatus(2)
+                .orderNo(k.getNo())
+                .userId(sharePath.getAncestor())
+                .amount(ancestorQuota)
+                .afterAmount(integralDOAncestor.getCurrentQuota() + ancestorQuota)
+                .percentTemplate(percentTemplate).build();
+
+
+        // 直推人记录
+        PtProfitLogSaveReqVO ztrLog = PtProfitLogSaveReqVO.builder()
+                .orderId(k.getOrderId())
+                .profitStatus(2)
+                .orderNo(k.getNo())
+                .userId(sharePath.getDescendant())
+                .amount(descendantQuota)
+                .afterAmount(integralDO.getCurrentQuota() + descendantQuota)
+                .percentTemplate(percentTemplate).build();
+
+
+        // 合赢奖记录
+        PtProfitLogSaveReqVO hyjLog = PtProfitLogSaveReqVO.builder()
+                .orderId(k.getOrderId())
+                .profitStatus(2)
+                .orderNo(k.getNo())
+                .amount(bonusQuota)
+                .afterAmount(0)
+                .percentTemplate(percentTemplate).build();
+
+
+        ptProfitLogSaveReqVOS.add(ptGrossAddLog);
+        ptProfitLogSaveReqVOS.add(ptAddLog);
+        ptProfitLogSaveReqVOS.add(tjrLog);
+        ptProfitLogSaveReqVOS.add(ztrLog);
+        ptProfitLogSaveReqVOS.add(hyjLog);
     }
 
+
+
+    // 获取当前订单的下单人的直推关系
+    public SharePathDO getSharePath(Long userId) {
+
+        return sharePathService.getSharePathByDescendant(userId);
+    }
+
+
 }

+ 8 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java

@@ -67,4 +67,12 @@ public interface SharePathService {
     void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO);
 
 
+    /**
+     * 通过直推人, 获取当前的直推关系
+     * @param userId
+     * @return
+     */
+    SharePathDO getSharePathByDescendant(Long userId);
+
+
 }

+ 11 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java

@@ -115,5 +115,16 @@ public class SharePathServiceImpl implements SharePathService {
         // todo 转让用户关系
     }
 
+    @Override
+    public SharePathDO getSharePathByDescendant(Long userId) {
+
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().eqIfPresent(SharePathDO::getDescendant, userId)
+                .eqIfPresent(SharePathDO::getDepth, 1));
+        if (sharePathDOS.isEmpty()) {
+            return null;
+        }
+        return sharePathDOS.get(0);
+    }
+
 
 }