فهرست منبع

增加合赢奖计算

Harper 11 ماه پیش
والد
کامیت
952f46a3b3
20فایلهای تغییر یافته به همراه455 افزوده شده و 14 حذف شده
  1. 3 0
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/CaclEnum.java
  2. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitionbrothers/vo/PartitionBrothersSaveReqVO.java
  3. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/PartitionCrashController.java
  4. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java
  5. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitionson/vo/PartitionSonSaveReqVO.java
  6. 8 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
  7. 5 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  8. 8 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  9. 13 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  10. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java
  11. 27 5
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  12. 7 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashService.java
  13. 245 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java
  14. 11 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogService.java
  15. 15 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ptprofitlog/PtProfitLogServiceImpl.java
  16. 21 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java
  17. 72 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  18. 3 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java
  19. 1 1
      feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml
  20. 1 1
      feifan-server/src/main/resources/application-local.yaml

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

@@ -12,6 +12,9 @@ public enum CaclEnum {
     DIRECT_REFERRAL_QUOTA(4, "直推人额度"),
     TOGETHER_AWARD(5, "合赢奖"),
     HIGH_QUOTA(6, "最高可以获得积分"),
+    SMALL_QUOTA_CRASH(7, "小区额度分配"),
+    AFTER_CRASH_CALC_PT_TOTAL_QUOTA(8, "碰撞后计算平台总收益"),
+
     ;
 
     /**

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitionbrothers/vo/PartitionBrothersSaveReqVO.java

@@ -7,6 +7,9 @@ import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 兄弟分区新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class PartitionBrothersSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5562")

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/PartitionCrashController.java

@@ -38,6 +38,9 @@ public class PartitionCrashController {
     @Resource
     private PartitionCrashService partitionCrashService;
 
+
+    // 查询某一个用户昨天的后代产生的订单
+
     @PostMapping("/create")
     @Operation(summary = "创建分区碰撞")
     @PreAuthorize("@ss.hasPermission('distri:partition-crash:create')")

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java

@@ -7,6 +7,9 @@ import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 分区碰撞新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class PartitionCrashSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15914")

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitionson/vo/PartitionSonSaveReqVO.java

@@ -7,6 +7,9 @@ import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 后代分区新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class PartitionSonSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12758")

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

@@ -60,4 +60,12 @@ public interface DuserService {
 
     void hasUserAndCreat(List<Long> userIds);
 
+    /**
+     * 获取所有的用户
+     * @return
+     */
+    List<DuserDO> selectAllUser();
+
+
+
 }

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

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

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

@@ -69,4 +69,12 @@ public interface IntegralService {
     void updateBatch(List<IntegralSaveReqVO> integralSaveReqVOS);
 
 
+    /**
+     * 查询当前用户的父亲的积分信息
+     * @param userId
+     * @return
+     */
+    IntegralDO selectUserParent(Long userId);
+
+
 }

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

@@ -1,6 +1,8 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
+import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 
@@ -34,6 +36,9 @@ public class IntegralServiceImpl implements IntegralService {
     @Resource
     private IntegralMapper integralMapper;
 
+    @Resource
+    private SharePathService sharePathService;
+
     @Override
     public Long createIntegral(IntegralSaveReqVO createReqVO) {
         // 插入
@@ -90,7 +95,7 @@ public class IntegralServiceImpl implements IntegralService {
     @Override
     public void updateBatch(List<IntegralSaveReqVO> integralSaveReqVOS) {
 
-        integralSaveReqVOS.forEach(k->{
+        integralSaveReqVOS.forEach(k -> {
             // 校验存在
             validateIntegralExists(k.getId());
             // 更新
@@ -100,4 +105,11 @@ public class IntegralServiceImpl implements IntegralService {
 
     }
 
+    @Override
+    public IntegralDO selectUserParent(Long userId) {
+
+        Long parentId = sharePathService.queryParentBySonUserId(userId);
+        return integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eqIfPresent(IntegralDO::getUserId, parentId));
+    }
+
 }

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcService.java

@@ -1,5 +1,6 @@
 package cn.newfeifan.mall.module.distri.service.ordercalc;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import javax.validation.*;
 
@@ -60,4 +61,6 @@ public interface OrderCalcService {
     void calc(List<DistriOrderMessage> tradeOrderDO);
 
 
+    List<OrderCalcDO> queryTodayCalcByUserIds(LocalDateTime todayStart, LocalDateTime todayEnd);
+
 }

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

@@ -1,6 +1,7 @@
 package cn.newfeifan.mall.module.distri.service.ordercalc;
 
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 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;
@@ -14,6 +15,7 @@ import cn.newfeifan.mall.module.distri.mq.message.order.DistriOrderMessage;
 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.partitioncrash.PartitionCrashService;
 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;
@@ -26,6 +28,7 @@ import org.springframework.validation.annotation.Validated;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -71,6 +74,9 @@ public class OrderCalcServiceImpl implements OrderCalcService {
     @Resource
     private IntegralService integralService;
 
+    @Resource
+    private PartitionCrashService partitionCrashService;
+
     @Override
     public Long createOrderCalc(OrderCalcSaveReqVO createReqVO) {
         // 插入
@@ -125,13 +131,29 @@ public class OrderCalcServiceImpl implements OrderCalcService {
         // 判断当前下单人是否有有上级, 如果没有, 创建直推人关系
         sharePathService.createSharePathByUserId(userId);
 
-        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
-        // 当前计算百分比模板
-        String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
+        try {
+
+            OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+            // 当前计算百分比模板
+            String percentTemplate = JsonUtils.toJsonString(orderPercentageDO);
 
-        calc(tradeOrderDO, orderPercentageDO, percentTemplate);
+            calc(tradeOrderDO, orderPercentageDO, percentTemplate);
+
+        } catch (Exception e) {
+
+        } finally {
+            // todo 计算当天用户的碰撞
+            // 计算兄弟分区, 以及后代分区
+            partitionCrashService.calcCrash(userId);
+        }
+
+
+    }
+
+    @Override
+    public List<OrderCalcDO> queryTodayCalcByUserIds(LocalDateTime todayStart, LocalDateTime todayEnd) {
 
-        // todo 计算当天用户的碰撞
+        return   orderCalcMapper.selectList(new LambdaQueryWrapperX<OrderCalcDO>().betweenIfPresent(OrderCalcDO::getCreateTime,todayStart,todayEnd));
 
     }
 

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

@@ -52,4 +52,11 @@ public interface PartitionCrashService {
      */
     PageResult<PartitionCrashDO> getPartitionCrashPage(PartitionCrashPageReqVO pageReqVO);
 
+    /**
+     * 计算碰撞后分区
+     * @param userId
+     */
+    void calcCrash(List<Long> userId);
+
+
 }

+ 245 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/partitioncrash/PartitionCrashServiceImpl.java

@@ -1,15 +1,41 @@
 package cn.newfeifan.mall.module.distri.service.partitioncrash;
 
+import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.partitionbrothers.vo.PartitionBrothersSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.partitionson.vo.PartitionSonSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
+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.enums.CaclEnum;
+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.partitionbrothers.PartitionBrothersService;
+import cn.newfeifan.mall.module.distri.service.partitionson.PartitionSonService;
+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;
+
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
 import cn.newfeifan.mall.module.distri.controller.admin.partitioncrash.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.partitioncrash.PartitionCrashDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash.PartitionCrashMapper;
@@ -29,6 +55,31 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
     @Resource
     private PartitionCrashMapper partitionCrashMapper;
 
+    @Resource
+    private SharePathService sharePathService;
+
+    @Resource
+    private PartitionSonService partitionSonService;
+
+    @Resource
+    private PartitionBrothersService partitionBrothersService;
+
+    @Resource
+    private DuserService duserService;
+
+    @Resource
+    private PtProfitLogService ptProfitLogService;
+
+    @Resource
+    private IntegralService integralService;
+
+    @Resource
+    private OrderPercentageService orderPercentageService;
+
+    @Resource
+    private PtProfitService ptProfitService;
+
+
     @Override
     public Long createPartitionCrash(PartitionCrashSaveReqVO createReqVO) {
         // 插入
@@ -71,4 +122,196 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
         return partitionCrashMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public void calcCrash(List<Long> userId) {
+
+        // 获取所有的营销用户
+        List<DuserDO> duserDOS = duserService.selectAllUser();
+        if (duserDOS.isEmpty()) {
+            return;
+        }
+        // 获取当前合赢奖百分比
+        OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
+        List<HashMap<Long, Integer>> afterCrashMap = duserDOS.stream().map(k -> CompletableFuture.supplyAsync(() -> {
+
+            // 获取当前用户的钱包
+            IntegralDO integralDO = integralService.selectByUser(k.getUserId());
+            // 获取当前父亲的钱包
+            IntegralDO parentIntegralDo = integralService.selectUserParent(k.getUserId());
+
+            // 创建一个分区编号
+            String todayNo = crashTodayNo(k.getUserId());
+            String yesterdayNo = crashYesterdayNo(k.getUserId());
+
+            PartitionSonSaveReqVO.PartitionSonSaveReqVOBuilder sonBuilder = PartitionSonSaveReqVO.builder();
+            PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder brotherBuilder = PartitionBrothersSaveReqVO.builder();
+            PartitionCrashSaveReqVO.PartitionCrashSaveReqVOBuilder crashSaveReqVOBuilder = PartitionCrashSaveReqVO.builder();
+            sonBuilder.partNo(todayNo);
+            sonBuilder.name(k.getName());
+            sonBuilder.nickName(k.getNickName());
+            sonBuilder.hasHit(1);
+
+            brotherBuilder.partNo(todayNo);
+            brotherBuilder.name(k.getName());
+            brotherBuilder.nickName(k.getNickName());
+            brotherBuilder.hasHit(1);
+
+
+            crashSaveReqVOBuilder.partNo(todayNo);
+            crashSaveReqVOBuilder.nickName(k.getNickName());
+            crashSaveReqVOBuilder.userName(k.getName());
+
+            // 获取当前用户的后代分区 , 并且该分区存在有下单的用户
+            List<OrderCalcDO> sonOrderCalcDOS = sharePathService.selectSons(k.getUserId(), userId);
+            if (sonOrderCalcDOS.isEmpty()) {
+                // 插入空数据
+                sonBuilder = addSonEmpty(sonBuilder, k);
+                crashSaveReqVOBuilder.sonPrice(0);
+                partitionSonService.createPartitionSon(sonBuilder.build());
+            }
+            // 合计儿子分支额度
+            Integer sonSumPrice = sonOrderCalcDOS.stream().mapToInt(OrderCalcDO::getGrossProfitBonusQuota).sum();
+            crashSaveReqVOBuilder.sonPrice(sonSumPrice);
+
+            // 获取当前用户的兄弟分区
+            List<OrderCalcDO> brothersOrderCalcDOS = sharePathService.selectBrothers(k.getUserId(), userId);
+            if (brothersOrderCalcDOS.isEmpty()) {
+                // 插入空数据
+                brotherBuilder = addBrotherEmpty(brotherBuilder, k);
+                crashSaveReqVOBuilder.brotherPrice(0);
+                partitionBrothersService.createPartitionBrothers(brotherBuilder.build());
+            }
+
+            // 合并兄弟分支额度
+            Integer brotherSumPrice = brothersOrderCalcDOS.stream().mapToInt(OrderCalcDO::getGrossProfitBonusQuota).sum();
+            crashSaveReqVOBuilder.brotherPrice(sonSumPrice);
+
+
+            // 判断,昨天是否有存余的分支
+            PartitionCrashDO yesterdayCrash = partitionCrashMapper.selectOne(new LambdaQueryWrapperX<PartitionCrashDO>().eqIfPresent(PartitionCrashDO::getPartNo, yesterdayNo));
+            // 如果不为空, 则判断增加到哪个分支中
+            if (yesterdayCrash.getSonPrice() >= yesterdayCrash.getBrotherPrice()) {
+                sonSumPrice = sonSumPrice + yesterdayCrash.getSonPrice();
+            } else {
+                brotherSumPrice = brotherSumPrice + yesterdayCrash.getBrotherPrice();
+            }
+
+            int afterCrash = 0;
+            Integer smallQuota = 0;
+            // 碰撞计算
+            if (sonSumPrice >= brotherSumPrice) {
+                sonBuilder.size(1);
+                brotherBuilder.size(0);
+                afterCrash = sonSumPrice - brotherSumPrice;
+                smallQuota = brotherSumPrice;
+
+            } else {
+                sonBuilder.size(0);
+                brotherBuilder.size(1);
+                afterCrash = brotherSumPrice - sonSumPrice;
+                smallQuota = sonSumPrice;
+            }
+
+
+            crashSaveReqVOBuilder.brotherPrice(brotherSumPrice);
+            crashSaveReqVOBuilder.sonPrice(sonSumPrice);
+            crashSaveReqVOBuilder.afterHitQuota(afterCrash);
+
+            // 积分添加 添加的时候, 需要注意当前用户是否有足够的积分可以获取
+            // 碰撞后的额度的
+            Integer highQuota = integralDO.getHighQuota();
+            Integer parentHighQuota = parentIntegralDo.getHighQuota();
+
+            BigDecimal smallBigDecimal = new BigDecimal(String.valueOf(smallQuota));
+            BigDecimal multiply = smallBigDecimal.multiply(new BigDecimal(String.valueOf(orderPercentageDO.getDivideIntoPerc())));
+            if (compare(highQuota, multiply)) {
+                Integer currentQuota = integralDO.getCurrentQuota();
+                integralDO.setCurrentQuota(currentQuota + multiply.intValue());
+                // 碰撞后的额度添加到日志中 增加日志模块
+                integralService.updateIntegral(BeanUtils.toBean(integralDO, IntegralSaveReqVO.class));
+                ptProfitLogService.addMessage(k.getUserId(), CaclEnum.SMALL_QUOTA_CRASH, currentQuota, integralDO.getCurrentQuota(), JsonUtils.toJsonString(orderPercentageDO));
+            }
+            if (compare(parentHighQuota, multiply)) {
+                Integer currentQuota = parentIntegralDo.getCurrentQuota();
+                parentIntegralDo.setCurrentQuota(currentQuota + multiply.intValue());
+                // 碰撞后的额度添加到日志中 增加日志模块
+                integralService.updateIntegral(BeanUtils.toBean(parentIntegralDo, IntegralSaveReqVO.class));
+                ptProfitLogService.addMessage(parentIntegralDo.getUserId(), CaclEnum.SMALL_QUOTA_CRASH, currentQuota, parentIntegralDo.getCurrentQuota(), JsonUtils.toJsonString(orderPercentageDO));
+            }
+
+            // 获取计算后积分, Long为userId, Integer为碰撞后额度
+            HashMap<Long, Integer> map = new HashMap<>();
+            map.put(k.getUserId(), multiply.intValue());
+            map.put(parentIntegralDo.getUserId(), multiply.intValue());
+            return map;
+
+        })).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());
+
+        // 计算平台积分
+        // 获取当前平台的额度
+        PtProfitDO ptProfit = ptProfitService.getPtProfit();
+        // 遍历hashMap
+        for (HashMap<Long, Integer> longIntegerHashMap : afterCrashMap) {
+            for (Map.Entry<Long, Integer> entry : longIntegerHashMap.entrySet()) {
+                if (ptProfit.getPtTotalAdd() <= 0) {
+                    break;
+                }
+                // 当前平台总积分
+                Integer ptTotalAdd = ptProfit.getPtTotalAdd();
+                // 平台扣除积分
+                ptProfit.setPtTotalAdd(ptProfit.getPtTotalAdd() - entry.getValue());
+                // 碰撞后的额度添加到日志中 增加日志模块
+                ptProfitLogService.addMessage(entry.getKey(), CaclEnum.AFTER_CRASH_CALC_PT_TOTAL_QUOTA
+                        , ptTotalAdd, ptProfit.getPtTotalAdd() - entry.getValue(), JsonUtils.toJsonString(orderPercentageDO));
+            }
+        }
+    }
+
+    public Boolean compare(Integer highQuota, BigDecimal afterCrash) {
+        BigDecimal high = new BigDecimal(String.valueOf(highQuota));
+        int i = high.compareTo(afterCrash);
+        return i >= 0;
+    }
+
+
+    private PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder addBrotherEmpty(PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder brotherBuilder, DuserDO duserDO) {
+
+        return brotherBuilder.name(duserDO.getName())
+                .nickName(duserDO.getNickName())
+                .size(0)
+                .price(0)
+                .afterHitQuota(0)
+                .hasHit(0);
+    }
+
+    private PartitionSonSaveReqVO.PartitionSonSaveReqVOBuilder addSonEmpty(
+            PartitionSonSaveReqVO.PartitionSonSaveReqVOBuilder sonBuilder,
+            DuserDO duserDO) {
+        return sonBuilder.name(duserDO.getName())
+                .nickName(duserDO.getNickName())
+                .size(0)
+                .price(0)
+                .afterHitQuota(0)
+                .hasHit(0);
+    }
+
+
+    // 创建编号 创建今天的编号
+    public String crashTodayNo(Long userId) {
+        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
+        String todayStartString = todayStart.toString();
+        return "CRASH:" + userId + todayStartString;
+
+    }
+
+    // 获取昨天的编号
+    public String crashYesterdayNo(Long userId) {
+        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
+        LocalDateTime localDateTime = todayStart.minusDays(1);
+        String yesterdayString = localDateTime.toString();
+        return "CRASH:" + userId + yesterdayString;
+
+    }
+
+
 }

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

@@ -5,7 +5,7 @@ import javax.validation.*;
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 
 /**
  * 平台利润记录 Service 接口
@@ -54,5 +54,15 @@ public interface PtProfitLogService {
 
     void saveBatch(List<PtProfitLogSaveReqVO> ptProfitLogSaveReqVOS);
 
+    /**
+     * 增加日志
+     *
+     * @param userId      用户ID
+     * @param caclEnum    日志模板
+     * @param amount      增加额度
+     * @param afterAmount 增加之后的额度
+     * @param jsonString
+     */
+    void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount, String jsonString);
 
 }

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

@@ -1,18 +1,17 @@
 package cn.newfeifan.mall.module.distri.service.ptprofitlog;
 
+import cn.newfeifan.mall.module.distri.enums.CaclEnum;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 
 import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofitlog.PtProfitLogDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
-import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 
 import cn.newfeifan.mall.module.distri.dal.mysql.ptprofitlog.PtProfitLogMapper;
@@ -32,6 +31,7 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
     @Resource
     private PtProfitLogMapper ptProfitLogMapper;
 
+
     @Override
     public Long createPtProfitLog(PtProfitLogSaveReqVO createReqVO) {
         // 插入
@@ -80,4 +80,17 @@ public class PtProfitLogServiceImpl implements PtProfitLogService {
         ptProfitLogMapper.insertBatch(ptProfitLog);
     }
 
+    @Override
+    public void addMessage(Long userId, CaclEnum caclEnum, Integer amount, Integer afterAmount, String percentTemplate) {
+        PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
+                .afterAmount(afterAmount)
+                .amount(amount)
+                .percentTemplate(percentTemplate)
+                .userId(userId)
+                .profitStatus(caclEnum.getType())
+                .build();
+        ptProfitLogMapper.insert(BeanUtils.toBean(ptProfitLog, PtProfitLogDO.class));
+
+    }
+
 }

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

@@ -4,6 +4,7 @@ import java.util.*;
 import javax.validation.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
@@ -79,4 +80,24 @@ public interface SharePathService {
     SharePathDO getSharePathByDescendant(Long userId);
 
 
+    /**
+     * 获取儿子订单计算分区
+     *
+     * @param userId
+     * @return
+     */
+    List<OrderCalcDO> selectSons(Long userId, List<Long> userIds);
+
+    /**
+     * 获取兄弟订单分区
+     *
+     * @param userId
+     * @param userId1
+     * @return
+     */
+    List<OrderCalcDO> selectBrothers(Long userId, List<Long> userId1);
+
+
+    Long queryParentBySonUserId(Long userId);
+
 }

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

@@ -2,7 +2,9 @@ package cn.newfeifan.mall.module.distri.service.sharepath;
 
 import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
 import cn.newfeifan.mall.module.distri.service.duser.DuserService;
+import cn.newfeifan.mall.module.distri.service.ordercalc.OrderCalcService;
 import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
 import cn.newfeifan.mall.module.member.service.user.MemberUserService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -13,7 +15,12 @@ import javax.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
@@ -43,6 +50,8 @@ public class SharePathServiceImpl implements SharePathService {
     private DuserService duserService;
     @Resource
     private MemberUserService memberUserService;
+    @Resource
+    private OrderCalcService orderCalcService;
 
     @Override
     public Long createSharePath(SharePathSaveReqVO createReqVO) {
@@ -170,5 +179,68 @@ public class SharePathServiceImpl implements SharePathService {
         return sharePathDOS.get(0);
     }
 
+    @Override
+    public List<OrderCalcDO> selectSons(Long userId, List<Long> userIds) {
+        List<Long> allDescendants = sharePathMapper.findAllDescendants(userId);
+        if (allDescendants.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 查询出两个list的并集
+        List<Long> unionList = unionList(userIds, allDescendants);
+        if (unionList.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 获取这个分区的所有订单的合赢奖
+        return calcQuota(unionList);
+
+    }
+
+    private List<OrderCalcDO> calcQuota(List<Long> unionList) {
+
+        // 根据当前userId, 查询当日,计算出来的订单
+        // 创建日期
+        LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
+        LocalDateTime todayEnd = todayStart.plusDays(1);
+
+        return orderCalcService.queryTodayCalcByUserIds(todayStart, todayEnd);
+
+    }
+
+    @Override
+    public List<OrderCalcDO> selectBrothers(Long userId, List<Long> userIds) {
+
+        List<Long> sortedSiblings = sharePathMapper.findLessSortedSiblings(userId);
+        if (sortedSiblings.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 查询出两个list的并集
+        List<Long> unionList = unionList(userIds, sortedSiblings);
+        if (unionList.isEmpty()) {
+            return Collections.emptyList();
+        }
+        // 获取这个分区的所有订单的合赢奖
+        return calcQuota(unionList);
+    }
+
+    @Override
+    public Long queryParentBySonUserId(Long userId) {
+
+        SharePathDO sharePathDO = sharePathMapper.selectOne(new LambdaQueryWrapperX<SharePathDO>()
+                .eqIfPresent(SharePathDO::getDescendant, userId).eqIfPresent(SharePathDO::getDepth, 1));
+        if (sharePathDO == null) {
+            return 1L;
+        } else {
+            return sharePathDO.getAncestor();
+        }
+
+
+    }
+
+
+    public List<Long> unionList(List<Long> orderUserId, List<Long> userId) {
+        return Stream.concat(orderUserId.stream(), userId.stream()).distinct().collect(Collectors.toList());
+
+    }
+
 
 }

+ 3 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/job/order/TradeOrderAutoCalcJob.java

@@ -31,7 +31,9 @@ public class TradeOrderAutoCalcJob implements JobHandler {
         List<DistriOrderMessage> appTradeOrderDetailRespVos = tradeOrderQueryService.queryAllOrder();
         CalcMessage calcMessage = CalcMessage.builder().distriOrderMessages(appTradeOrderDetailRespVos).build();
         distriOrderProducer.sendDistriOrderMessage(calcMessage);
-        return String.format("执行成功");
+        return String.format("计算订单信息结束");
+
+
     }
 
 }

+ 1 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/resources/mapper/order/BrokerageUserMapper.xml

@@ -38,6 +38,6 @@
                            on tor.id = toi.order_id
                  LEFT JOIN product_sku ps
                            on toi.sku_id = ps.id
-        where tor.update_time BETWEEN #{start} AND #{end}
+        where  tor.update_time BETWEEN #{start} AND #{end}
     </select>
 </mapper>

+ 1 - 1
feifan-server/src/main/resources/application-local.yaml

@@ -1,5 +1,5 @@
 server:
-  port: 8002
+  port: 8004
 
 --- #################### 数据库相关配置 ####################