Kaynağa Gözat

Merge branch 'dev/2024/0407/update-distri'

gaohp 1 yıl önce
ebeveyn
işleme
0252b1630d
39 değiştirilmiş dosya ile 674 ekleme ve 86 silme
  1. 13 12
      feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java
  2. 5 0
      feifan-module-distri/feifan-module-distri-biz/pom.xml
  3. 2 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserPageReqVO.java
  4. 3 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserRespVO.java
  5. 9 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserSaveReqVO.java
  6. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java
  7. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashPageReqVO.java
  8. 3 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashRespVO.java
  9. 2 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashSaveReqVO.java
  10. 8 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogPageReqVO.java
  11. 10 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java
  12. 8 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  13. 26 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java
  14. 14 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathPageReqVO.java
  15. 13 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathRespVO.java
  16. 17 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathSaveReqVO.java
  17. 18 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathtransFerenceRelaReqVO.java
  18. 18 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java
  19. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/socialstatus/vo/SocialStatusSaveReqVO.java
  20. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/duser/DuserDO.java
  21. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/partitioncrash/PartitionCrashDO.java
  22. 12 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  23. 16 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/sharepath/SharePathDO.java
  24. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/socialstatus/SocialStatusDO.java
  25. 3 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/duser/DuserMapper.java
  26. 1 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/partitioncrash/PartitionCrashMapper.java
  27. 4 3
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  28. 15 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java
  29. 8 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
  30. 74 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  31. 10 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  32. 16 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  33. 146 42
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/ordercalc/OrderCalcServiceImpl.java
  34. 23 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java
  35. 56 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  36. 46 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/builder/TreeBuilder.java
  37. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusService.java
  38. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusServiceImpl.java
  39. 43 6
      feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml

+ 13 - 12
feifan-module-distri/feifan-module-distri-api/src/main/java/cn/newfeifan/mall/module/distri/enums/ErrorCodeConstants.java

@@ -7,17 +7,18 @@ public interface ErrorCodeConstants {
     ErrorCode SHARE_PATH_NOT_EXISTS = new ErrorCode(1_002_030_000, "分销路径不存在");
     ErrorCode SOCIAL_STATUS_NOT_EXISTS = new ErrorCode(1_002_030_001, "身价不存在");
     ErrorCode SOURCE_NOT_EXISTS = new ErrorCode(1_002_030_002, "分销来源不存在");
-    ErrorCode INTEGRAL_NOT_EXISTS = new ErrorCode(1_002_030_002, "积分表不存在");
-    ErrorCode ORDER_CALC_NOT_EXISTS = new ErrorCode(1_002_030_002, "计算不存在");
-    ErrorCode ORDER_PERCENTAGE_NOT_EXISTS = new ErrorCode(1_002_030_002, "订单计算不存在");
-    ErrorCode PARTITION_BROTHERS_NOT_EXISTS = new ErrorCode(1_002_030_002, "兄弟分区不存在");
-    ErrorCode PARTITION_SON_NOT_EXISTS = new ErrorCode(1_002_030_002, "儿子分区不存在");
-    ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_030_003, "分销用户不存在");
-    ErrorCode DUSER_NOT_EXISTS = new ErrorCode(1_002_030_003, "分销用户不存在");
-    ErrorCode IS_EXISTS = new ErrorCode(1_002_030_003, "当前推销人已经存在上级");
-    ErrorCode PARTITION_CRASH_NOT_EXISTS = new ErrorCode(1_002_030_003, "碰撞分区不存在");
-    ErrorCode PT_PROFIT_NOT_EXISTS = new ErrorCode(1_002_030_003, "平台利润不存在");
-    ErrorCode PT_PROFIT_LOG_NOT_EXISTS = new ErrorCode(1_002_030_003, "平台利润日志表不存在");
-    ErrorCode PERCENT_LARGE_ONE_HUNDRED = new ErrorCode(1_002_030_003, "百分比总和超过100");
+    ErrorCode INTEGRAL_NOT_EXISTS = new ErrorCode(1_002_030_003, "积分表不存在");
+    ErrorCode ORDER_CALC_NOT_EXISTS = new ErrorCode(1_002_030_004, "计算不存在");
+    ErrorCode ORDER_PERCENTAGE_NOT_EXISTS = new ErrorCode(1_002_030_005, "订单计算不存在");
+    ErrorCode PARTITION_BROTHERS_NOT_EXISTS = new ErrorCode(1_002_030_006, "兄弟分区不存在");
+    ErrorCode PARTITION_SON_NOT_EXISTS = new ErrorCode(1_002_030_007, "儿子分区不存在");
+    ErrorCode USER_NOT_EXISTS = new ErrorCode(1_002_030_008, "分销用户不存在");
+    ErrorCode DUSER_NOT_EXISTS = new ErrorCode(1_002_030_009, "分销用户不存在");
+    ErrorCode IS_EXISTS = new ErrorCode(1_002_030_010, "当前推销人已经存在上级");
+    ErrorCode PARTITION_CRASH_NOT_EXISTS = new ErrorCode(1_002_030_011, "碰撞分区不存在");
+    ErrorCode PT_PROFIT_NOT_EXISTS = new ErrorCode(1_002_030_012, "平台利润不存在");
+    ErrorCode PT_PROFIT_LOG_NOT_EXISTS = new ErrorCode(1_002_030_013, "平台利润日志表不存在");
+    ErrorCode PERCENT_LARGE_ONE_HUNDRED = new ErrorCode(1_002_030_014, "百分比总和超过100");
+    ErrorCode HAS_PARENT = new ErrorCode(1_002_030_015, "该直推人已经有推荐人, 故不能增加");
 
 }

+ 5 - 0
feifan-module-distri/feifan-module-distri-biz/pom.xml

@@ -44,6 +44,11 @@
             <artifactId>feifan-module-system-biz</artifactId>
             <version>${revision}</version>
         </dependency>
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-member-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
 
         <dependency>
             <groupId>cn.newfeifan.zx</groupId>

+ 2 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserPageReqVO.java

@@ -38,6 +38,8 @@ public class DuserPageReqVO extends PageParam {
 
     @Schema(description = "用户类型", example = "3773")
     private Long categoryId;
+    @Schema(description = "身价距下一级所需点数")
+    private Long socialUpNeed;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)

+ 3 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserRespVO.java

@@ -48,7 +48,9 @@ public class DuserRespVO {
     @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "3773")
     @ExcelProperty("用户类型")
     private Long categoryId;
-
+    @Schema(description = "身价距下一级所需点数")
+    @ExcelProperty("身价距下一级所需点数")
+    private Long socialUpNeed;
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 9 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserSaveReqVO.java

@@ -2,11 +2,15 @@ package cn.newfeifan.mall.module.distri.controller.admin.duser.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
 import java.util.*;
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 推荐用户新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class DuserSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23853")
@@ -25,18 +29,21 @@ public class DuserSaveReqVO {
     private String mobile;
 
     @Schema(description = "团队人员来源")
-    private Integer source;
+    private Long source;
 
     @Schema(description = "团队用户当前积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "11037")
     @NotNull(message = "团队用户当前积分不能为空")
     private Long integralId;
 
     @Schema(description = "团队用户当前身价(等级)", example = "2")
-    private Integer socialStatus;
+    private Long socialStatus;
 
     @Schema(description = "团队用户当前点数")
     private Long socialStatusPoint;
 
+    @Schema(description = "身价距下一级所需点数")
+    private Long socialUpNeed;
+
     @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "3773")
     @NotNull(message = "用户类型不能为空")
     private Long categoryId;

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java

@@ -2,11 +2,15 @@ package cn.newfeifan.mall.module.distri.controller.admin.integral.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
 import java.util.*;
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 推荐用户积分新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class IntegralSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19201")

+ 2 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/partitioncrash/vo/PartitionCrashPageReqVO.java

@@ -29,7 +29,8 @@ public class PartitionCrashPageReqVO extends PageParam {
 
     @Schema(description = "碰撞后额度")
     private Integer afterHitQuota;
-
+    @Schema(description = "用户名称", example = "王五")
+    private String userName;
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

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

@@ -40,5 +40,7 @@ public class PartitionCrashRespVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
-
+    @Schema(description = "用户名称", example = "王五")
+    @ExcelProperty("用户名称")
+    private String userName;
 }

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

@@ -23,7 +23,8 @@ public class PartitionCrashSaveReqVO {
 
     @Schema(description = "子分区额度", example = "30462")
     private Integer sonPrice;
-
+    @Schema(description = "用户名称", example = "王五")
+    private String userName;
     @Schema(description = "碰撞后额度")
     private Integer afterHitQuota;
 

+ 8 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogPageReqVO.java

@@ -21,12 +21,18 @@ public class PtProfitLogPageReqVO extends PageParam {
     @Schema(description = "增加后金额")
     private Integer afterAmount;
 
-    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖", example = "2")
     private Integer profitStatus;
 
-    @Schema(description = "订单号", example = "15682")
+    @Schema(description = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
+    @Schema(description = "订单Id", example = "26464")
     private Long orderId;
 
+    @Schema(description = "订单编号")
+    private String orderNo;
+
     @Schema(description = "计算百分比模板")
     private String percentTemplate;
 

+ 10 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java

@@ -25,14 +25,21 @@ public class PtProfitLogRespVO {
     @ExcelProperty("增加后金额")
     private Integer afterAmount;
 
-    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖", example = "2")
     @ExcelProperty("收益类型 1:平台服务器费 2:平台收益")
     private Integer profitStatus;
 
-    @Schema(description = "订单号", example = "15682")
-    @ExcelProperty("订单号")
+    @Schema(description = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
+    @Schema(description = "订单Id", example = "26464")
+    @ExcelProperty("订单Id")
     private Long orderId;
 
+    @Schema(description = "订单编号")
+    @ExcelProperty("订单编号")
+    private String orderNo;
+
     @Schema(description = "计算百分比模板")
     @ExcelProperty("计算百分比模板")
     private String percentTemplate;

+ 8 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java

@@ -22,12 +22,18 @@ public class PtProfitLogSaveReqVO {
     @Schema(description = "增加后金额")
     private Integer afterAmount;
 
-    @Schema(description = "收益类型 1:平台服务器费 2:平台收益", example = "2")
+    @Schema(description = "收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖", example = "2")
     private Integer profitStatus;
 
-    @Schema(description = "订单号", example = "15682")
+    @Schema(description = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
+    @Schema(description = "订单Id", example = "26464")
     private Long orderId;
 
+    @Schema(description = "订单编号")
+    private String orderNo;
+
     @Schema(description = "计算百分比模板")
     private String percentTemplate;
 

+ 26 - 4
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java

@@ -1,7 +1,9 @@
 package cn.newfeifan.mall.module.distri.controller.admin.sharepath;
 
 import org.springframework.web.bind.annotation.*;
+
 import javax.annotation.Resource;
+
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -18,11 +20,13 @@ import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.CommonResult;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
+
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 
 import cn.newfeifan.mall.framework.excel.core.util.ExcelUtils;
 
 import cn.newfeifan.mall.framework.operatelog.core.annotations.OperateLog;
+
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.*;
 
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
@@ -41,10 +45,28 @@ public class SharePathController {
     @PostMapping("/create")
     @Operation(summary = "创建分销用户关系")
     @PreAuthorize("@ss.hasPermission('distri:share-path:create')")
-    public CommonResult<Long> createSharePath(@Valid @RequestBody SharePathSaveReqVO createReqVO) {
-        return success(sharePathService.createSharePath(createReqVO));
+    public CommonResult<Boolean> createSharePath(@Valid @RequestBody SharePathSaveReqVO createReqVO) {
+        sharePathService.createSharePathByUserId(createReqVO);
+        return success(true);
+    }
+
+    @GetMapping("/getTree")
+    @Operation(summary = "获取分销人员关系树")
+    @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
+    public CommonResult<SharePathRespVO> getTree() {
+        TreeNode sharePath = sharePathService.getTree();
+        return success(BeanUtils.toBean(sharePath, SharePathRespVO.class));
     }
 
+    @PutMapping("/transference_rela")
+    @Operation(summary = "转让分销关系")
+    @PreAuthorize("@ss.hasPermission('distri:share-path:update')")
+    public CommonResult<Boolean> transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO) {
+        sharePathService.transferenceRela(sharePathtransFerenceRelaReqVO);
+        return success(true);
+    }
+
+
     @PutMapping("/update")
     @Operation(summary = "更新分销用户关系")
     @PreAuthorize("@ss.hasPermission('distri:share-path:update')")
@@ -84,12 +106,12 @@ public class SharePathController {
     @PreAuthorize("@ss.hasPermission('distri:share-path:export')")
     @OperateLog(type = EXPORT)
     public void exportSharePathExcel(@Valid SharePathPageReqVO pageReqVO,
-              HttpServletResponse response) throws IOException {
+                                     HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
         List<SharePathDO> list = sharePathService.getSharePathPage(pageReqVO).getList();
         // 导出 Excel
         ExcelUtils.write(response, "分销用户关系.xls", "数据", SharePathRespVO.class,
-                        BeanUtils.toBean(list, SharePathRespVO.class));
+                BeanUtils.toBean(list, SharePathRespVO.class));
     }
 
 }

+ 14 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathPageReqVO.java

@@ -31,4 +31,18 @@ public class SharePathPageReqVO extends PageParam {
     @Schema(description = "顺序")
     private Integer sort;
 
+
+    @Schema(description = "推荐人姓名", example = "王五")
+    private String ancName;
+
+    @Schema(description = "推荐人手机号")
+    private String ancPhone;
+
+    @Schema(description = "直推人姓名", example = "李四")
+    private String descName;
+
+    @Schema(description = "推荐人手机号")
+    private String descPhone;
+
+
 }

+ 13 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathRespVO.java

@@ -37,4 +37,17 @@ public class SharePathRespVO {
     @ExcelProperty("顺序")
     private Integer sort;
 
+
+    @Schema(description = "推荐人姓名", example = "王五")
+    private String ancName;
+
+    @Schema(description = "推荐人手机号")
+    private String ancPhone;
+
+    @Schema(description = "直推人姓名", example = "李四")
+    private String descName;
+
+    @Schema(description = "推荐人手机号")
+    private String descPhone;
+
 }

+ 17 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathSaveReqVO.java

@@ -2,6 +2,7 @@ package cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
 import java.util.*;
 import javax.validation.constraints.*;
 
@@ -24,4 +25,20 @@ public class SharePathSaveReqVO {
     @Schema(description = "顺序")
     private Integer sort;
 
+    @Schema(description = "链接来源")
+    private Long source;
+
+
+    @Schema(description = "推荐人姓名", example = "王五")
+    private String ancName;
+
+    @Schema(description = "推荐人手机号")
+    private String ancPhone;
+
+    @Schema(description = "直推人姓名", example = "李四")
+    private String descName;
+
+    @Schema(description = "推荐人手机号")
+    private String descPhone;
+
 }

+ 18 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathtransFerenceRelaReqVO.java

@@ -0,0 +1,18 @@
+package cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 分销用户关系转让 Request VO")
+@Data
+public class SharePathtransFerenceRelaReqVO {
+
+
+    @Schema(description = "转让人")
+    private Long ancestor;
+
+    @Schema(description = "被转让人")
+    private Long descendant;
+
+
+}

+ 18 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java

@@ -0,0 +1,18 @@
+package cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TreeNode {
+    private String name; // 节点名称
+    private Integer value; // 节点值,某些节点可能没有值
+    private List<TreeNode> children; // 子节点列表
+}

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/socialstatus/vo/SocialStatusSaveReqVO.java

@@ -2,11 +2,15 @@ package cn.newfeifan.mall.module.distri.controller.admin.socialstatus.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
 import java.util.*;
 import javax.validation.constraints.*;
 
 @Schema(description = "管理后台 - 分销用户身价新增/修改 Request VO")
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class SocialStatusSaveReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19722")
@@ -22,4 +26,6 @@ public class SocialStatusSaveReqVO {
     @Schema(description = "升级所需点数")
     private Long point;
 
+
+
 }

+ 4 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/duser/DuserDO.java

@@ -55,6 +55,10 @@ public class DuserDO extends BaseDO {
      * 团队用户当前点数
      */
     private Long socialStatusPoint;
+    /**
+     * 身价距下一级所需点数
+     */
+    private Long socialUpNeed;
     /**
      * 用户类型
      */

+ 4 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/partitioncrash/PartitionCrashDO.java

@@ -47,5 +47,8 @@ public class PartitionCrashDO extends BaseDO {
      * 碰撞后额度
      */
     private Integer afterHitQuota;
-
+    /**
+     * 用户名称
+     */
+    private String userName;
 }

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

@@ -36,16 +36,26 @@ public class PtProfitLogDO extends BaseDO {
      */
     private Integer afterAmount;
     /**
-     * 收益类型 1:平台服务器费 2:平台收益
+     * 收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖
      */
     private Integer profitStatus;
     /**
-     * 订单号
+     * 用户ID , 只有收益类型为 3,4才有值
+     */
+    private Long userId;
+
+    /**
+     * 订单Id
      */
     private Long orderId;
+    /**
+     * 订单编号
+     */
+    private String orderNo;
     /**
      * 计算百分比模板
      */
     private String percentTemplate;
 
+
 }

+ 16 - 1
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/sharepath/SharePathDO.java

@@ -43,5 +43,20 @@ public class SharePathDO extends BaseDO {
      * 顺序
      */
     private Integer sort;
-
+    /**
+     * 推荐人姓名
+     */
+    private String ancName;
+    /**
+     * 推荐人手机号
+     */
+    private String ancPhone;
+    /**
+     * 直推人姓名
+     */
+    private String descName;
+    /**
+     * 推荐人手机号
+     */
+    private String descPhone;
 }

+ 3 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/socialstatus/SocialStatusDO.java

@@ -1,9 +1,11 @@
 package cn.newfeifan.mall.module.distri.dal.dataobject.socialstatus;
 
 import lombok.*;
+
 import java.util.*;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+
 import com.baomidou.mybatisplus.annotation.*;
 import cn.newfeifan.mall.framework.mybatis.core.dataobject.BaseDO;
 
@@ -40,4 +42,5 @@ public class SocialStatusDO extends BaseDO {
      */
     private Long point;
 
+
 }

+ 3 - 2
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/duser/DuserMapper.java

@@ -22,12 +22,13 @@ public interface DuserMapper extends BaseMapperX<DuserDO> {
                 .eqIfPresent(DuserDO::getUserId, reqVO.getUserId())
                 .likeIfPresent(DuserDO::getName, reqVO.getName())
                 .eqIfPresent(DuserDO::getMobile, reqVO.getMobile())
-                .eqIfPresent(DuserDO::getSource, reqVO.getSource())
                 .eqIfPresent(DuserDO::getIntegralId, reqVO.getIntegralId())
                 .eqIfPresent(DuserDO::getSocialStatus, reqVO.getSocialStatus())
                 .eqIfPresent(DuserDO::getSocialStatusPoint, reqVO.getSocialStatusPoint())
-                .eqIfPresent(DuserDO::getCategoryId, reqVO.getCategoryId())
                 .betweenIfPresent(DuserDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(DuserDO::getSource, reqVO.getSource())
+                .eqIfPresent(DuserDO::getSocialUpNeed, reqVO.getSocialUpNeed())
+                .eqIfPresent(DuserDO::getCategoryId, reqVO.getCategoryId())
                 .orderByDesc(DuserDO::getId));
     }
     int hasParent(Long userId);

+ 1 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/partitioncrash/PartitionCrashMapper.java

@@ -25,6 +25,7 @@ public interface PartitionCrashMapper extends BaseMapperX<PartitionCrashDO> {
                 .eqIfPresent(PartitionCrashDO::getSonPrice, reqVO.getSonPrice())
                 .eqIfPresent(PartitionCrashDO::getAfterHitQuota, reqVO.getAfterHitQuota())
                 .betweenIfPresent(PartitionCrashDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(PartitionCrashDO::getUserName, reqVO.getUserName())
                 .orderByDesc(PartitionCrashDO::getId));
     }
 

+ 4 - 3
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java

@@ -21,11 +21,12 @@ public interface PtProfitLogMapper extends BaseMapperX<PtProfitLogDO> {
         return selectPage(reqVO, new LambdaQueryWrapperX<PtProfitLogDO>()
                 .eqIfPresent(PtProfitLogDO::getAmount, reqVO.getAmount())
                 .eqIfPresent(PtProfitLogDO::getAfterAmount, reqVO.getAfterAmount())
-                .eqIfPresent(PtProfitLogDO::getProfitStatus, reqVO.getProfitStatus())
-                .eqIfPresent(PtProfitLogDO::getOrderId, reqVO.getOrderId())
                 .eqIfPresent(PtProfitLogDO::getPercentTemplate, reqVO.getPercentTemplate())
                 .betweenIfPresent(PtProfitLogDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(PtProfitLogDO::getProfitStatus, reqVO.getProfitStatus())
+                .eqIfPresent(PtProfitLogDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(PtProfitLogDO::getOrderId, reqVO.getOrderId())
+                .eqIfPresent(PtProfitLogDO::getOrderNo, reqVO.getOrderNo())
                 .orderByDesc(PtProfitLogDO::getId));
     }
-
 }

+ 15 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java

@@ -8,6 +8,7 @@ import cn.newfeifan.mall.framework.mybatis.core.mapper.BaseMapperX;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import org.apache.ibatis.annotations.Mapper;
 import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.*;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 分销用户关系 Mapper
@@ -24,7 +25,21 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
                 .eqIfPresent(SharePathDO::getAncestor, reqVO.getAncestor())
                 .eqIfPresent(SharePathDO::getDescendant, reqVO.getDescendant())
                 .eqIfPresent(SharePathDO::getSort, reqVO.getSort())
+                .likeIfPresent(SharePathDO::getAncName, reqVO.getAncName())
+                .eqIfPresent(SharePathDO::getAncPhone, reqVO.getAncPhone())
+                .likeIfPresent(SharePathDO::getDescName, reqVO.getDescName())
+                .eqIfPresent(SharePathDO::getDescPhone, reqVO.getDescPhone())
                 .orderByDesc(SharePathDO::getId));
     }
 
+    void addNode(@Param("parentId") Long parentId, @Param("newDescendantId") Long newDescendantId);
+
+
+    int getMaxSortByParentId(@Param("parentId") Long parentId);
+
+    // 删除节点及其子节点的旧祖先关系
+    void deleteOldAncestors(@Param("nodeId") Long nodeId);
+
+    // 添加节点及其子节点的新祖先关系
+    void addNewAncestors(@Param("nodeId") Long nodeId, @Param("newParentId") Long newParentId);
 }

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

@@ -3,6 +3,7 @@ package cn.newfeifan.mall.module.distri.service.duser;
 import java.util.*;
 import javax.validation.*;
 import cn.newfeifan.mall.module.distri.controller.admin.duser.vo.*;
+import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.SharePathSaveReqVO;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
@@ -52,4 +53,11 @@ public interface DuserService {
      */
     PageResult<DuserDO> getDuserPage(DuserPageReqVO pageReqVO);
 
+
+    void hasUserAndCreat(SharePathSaveReqVO saveReqVO);
+    void hasUserAndCreat(Long userId);
+
+
+    void hasUserAndCreat(List<Long> userIds);
+
 }

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

@@ -1,11 +1,26 @@
 package cn.newfeifan.mall.module.distri.service.duser;
 
+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.sharepath.vo.SharePathSaveReqVO;
+import cn.newfeifan.mall.module.distri.controller.admin.socialstatus.vo.SocialStatusSaveReqVO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
+import cn.newfeifan.mall.module.distri.dal.dataobject.socialstatus.SocialStatusDO;
+import cn.newfeifan.mall.module.distri.service.integral.IntegralService;
+import cn.newfeifan.mall.module.distri.service.socialstatus.SocialStatusService;
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
+import cn.newfeifan.mall.module.system.service.member.MemberService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.duser.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -29,6 +44,10 @@ public class DuserServiceImpl implements DuserService {
     @Resource
     private DuserMapper duserMapper;
 
+    @Resource
+    private MemberUserService memberUserService;
+
+
     @Override
     public Long createDuser(DuserSaveReqVO createReqVO) {
         // 插入
@@ -71,4 +90,59 @@ public class DuserServiceImpl implements DuserService {
         return duserMapper.selectPage(pageReqVO);
     }
 
+    @Resource
+    private IntegralService integralService;
+
+    @Resource
+    private SocialStatusService socialStatusService;
+
+    @Override
+    public void hasUserAndCreat(SharePathSaveReqVO saveReqVO) {
+        checkAndCreat(saveReqVO.getDescendant());
+        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);
+        // 判断是否有钱包
+        IntegralDO integralDO = integralService.selectByUser(userId);
+        if (integralDO == null) {
+            // 创建一个钱包
+            IntegralSaveReqVO integralSaveReqVO = IntegralSaveReqVO.builder()
+                    .currentQuota(0)
+                    .freezeQuota(0)
+                    .categoryId(3L)
+                    .userId(userId).build();
+            Long integralId = integralService.createIntegral(integralSaveReqVO);
+            integralDO = new IntegralDO().setId(integralId);
+        }
+        if (duserDO == null) {
+            // 创建一个新的营销用户
+            DuserSaveReqVO duserSaveReqVO = DuserSaveReqVO.builder()
+                    .userId(userId)
+                    .mobile(user.getMobile())
+                    .name(user.getName())
+                    .integralId(integralDO.getId())
+                    .source(userId)
+                    .socialStatus(1L)
+                    .socialStatusPoint(0L)
+                    .build();
+            duserMapper.insert(BeanUtils.toBean(duserSaveReqVO, DuserDO.class));
+        }
+    }
+
 }

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

@@ -52,4 +52,14 @@ public interface IntegralService {
      */
     PageResult<IntegralDO> getIntegralPage(IntegralPageReqVO pageReqVO);
 
+    /**
+     * 根据用户ID查询是否有钱包
+     * @param descendant
+     * @return
+     */
+    IntegralDO selectByUser(Long descendant);
+
+
+    void saveBatch(List<IntegralSaveReqVO> integralSaveReqVOS);
+
 }

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

@@ -1,11 +1,16 @@
 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;
+
 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.integral.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -71,4 +76,15 @@ public class IntegralServiceImpl implements IntegralService {
         return integralMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public IntegralDO selectByUser(Long descendant) {
+        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);
+    }
+
 }

+ 146 - 42
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,8 +23,10 @@ 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;
 
 import cn.newfeifan.mall.module.distri.controller.admin.ordercalc.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
@@ -49,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) {
@@ -92,17 +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<>();
         // 平台收益
@@ -110,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);
+            // ========== 修改平台信息 =================
             // 每个订单计算的过程
             // 增加平台收益
             // 平台服务费
@@ -157,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);
+    }
+
+
 }

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

@@ -22,6 +22,10 @@ public interface SharePathService {
      */
     Long createSharePath(@Valid SharePathSaveReqVO createReqVO);
 
+    void createSharePathByUserId(SharePathSaveReqVO createReqVO);
+
+
+
     /**
      * 更新分销用户关系
      *
@@ -52,4 +56,23 @@ public interface SharePathService {
      */
     PageResult<SharePathDO> getSharePathPage(SharePathPageReqVO pageReqVO);
 
+
+    TreeNode getTree();
+
+
+    /**
+     * 转让分销用户关系
+     * @param sharePathtransFerenceRelaReqVO
+     */
+    void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO);
+
+
+    /**
+     * 通过直推人, 获取当前的直推关系
+     * @param userId
+     * @return
+     */
+    SharePathDO getSharePathByDescendant(Long userId);
+
+
 }

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

@@ -1,11 +1,17 @@
 package cn.newfeifan.mall.module.distri.service.sharepath;
 
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.newfeifan.mall.module.distri.service.duser.DuserService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.sharepath.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -29,6 +35,10 @@ public class SharePathServiceImpl implements SharePathService {
     @Resource
     private SharePathMapper sharePathMapper;
 
+    @Resource
+    private DuserService duserService;
+
+
     @Override
     public Long createSharePath(SharePathSaveReqVO createReqVO) {
         // 插入
@@ -38,6 +48,28 @@ public class SharePathServiceImpl implements SharePathService {
         return sharePath.getId();
     }
 
+
+    @Override
+    public void createSharePathByUserId(SharePathSaveReqVO createReqVO) {
+        // 判断当前直推人是否有父亲
+        Boolean has = hasParent(createReqVO.getDescendant());
+        if (has) {
+            throw exception(HAS_PARENT);
+        }
+        // 创建直推人以及推荐人的关系
+        // 需要判断当前推荐人跟直推人是否已经存在于用户表(duser)了
+        duserService.hasUserAndCreat(createReqVO);
+        // 存储他们之间的关系
+        sharePathMapper.addNode(createReqVO.getAncestor(), createReqVO.getDescendant());
+    }
+
+    private Boolean hasParent(Long descendant) {
+        SharePathDO sharePathDO = sharePathMapper.selectOne(new LambdaQueryWrapperX<SharePathDO>()
+                .eqIfPresent(SharePathDO::getDescendant, descendant)
+                .eqIfPresent(SharePathDO::getDepth, 1));
+        return sharePathDO != null;
+    }
+
     @Override
     public void updateSharePath(SharePathSaveReqVO updateReqVO) {
         // 校验存在
@@ -71,4 +103,28 @@ public class SharePathServiceImpl implements SharePathService {
         return sharePathMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public TreeNode getTree() {
+
+
+        return null;
+    }
+
+    @Override
+    public void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO) {
+        // 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);
+    }
+
+
 }

+ 46 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/builder/TreeBuilder.java

@@ -0,0 +1,46 @@
+package cn.newfeifan.mall.module.distri.service.sharepath.builder;
+
+import cn.newfeifan.mall.module.distri.controller.admin.sharepath.vo.TreeNode;
+import cn.newfeifan.mall.module.distri.dal.dataobject.sharepath.SharePathDO;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Component
+public class TreeBuilder {
+    private Map<Long, List<SharePathDO>> childrenMap = new HashMap<>();
+
+    public TreeNode buildTree(List<SharePathDO> paths) {
+        // 初始化childrenMap
+        for (SharePathDO path : paths) {
+            childrenMap.computeIfAbsent(path.getAncestor(), k -> new ArrayList<>()).add(path);
+        }
+
+        // 假设根节点的ancestor为null或特定值,这里以null为例
+        return buildTreeNode(null);
+    }
+
+    private TreeNode buildTreeNode(Long parentId) {
+        List<SharePathDO> children = childrenMap.get(parentId);
+        if (children == null) {
+            return null;
+        }
+
+        TreeNode node = new TreeNode(); // TreeNode是自定义的树节点类,需要包含子节点列表等信息
+        List<TreeNode> childNodes = new ArrayList<>();
+
+        for (SharePathDO child : children) {
+            TreeNode childNode = buildTreeNode(child.getDescendant());
+            if (childNode != null) {
+                childNodes.add(childNode);
+            }
+        }
+
+        node.setChildren(childNodes);
+        return node;
+    }
+}

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

@@ -52,4 +52,7 @@ public interface SocialStatusService {
      */
     PageResult<SocialStatusDO> getSocialStatusPage(SocialStatusPageReqVO pageReqVO);
 
+
+
+
 }

+ 6 - 0
feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusServiceImpl.java

@@ -1,11 +1,15 @@
 package cn.newfeifan.mall.module.distri.service.socialstatus;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.socialstatus.vo.*;
 import cn.newfeifan.mall.module.distri.dal.dataobject.socialstatus.SocialStatusDO;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
@@ -71,4 +75,6 @@ public class SocialStatusServiceImpl implements SocialStatusService {
         return socialStatusMapper.selectPage(pageReqVO);
     }
 
+
+
 }

+ 43 - 6
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml

@@ -2,11 +2,48 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.newfeifan.mall.module.distri.dal.mysql.sharepath.SharePathMapper">
 
-    <!--
-        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
-        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
-        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
-        文档可见:https://www.zhongxing.cn/MyBatis/x-plugins/
-     -->
 
+    <!-- 增加节点 -->
+    <insert id="addNode">
+        INSERT INTO distri_share_path (ancestor, descendant, depth, sort)
+        SELECT ancestor, #{newDescendantId}, depth + 1,
+               (SELECT IFNULL(MAX(sort), 0) + 1 FROM distri_share_path WHERE ancestor = #{parentId} AND depth = 1)
+        FROM distri_share_path
+        WHERE descendant = #{parentId}
+        UNION ALL
+        SELECT #{parentId}, #{newDescendantId}, 1,
+               (SELECT IFNULL(MAX(sort), 0) + 1 FROM distri_share_path WHERE ancestor = #{parentId} AND depth = 1);
+    </insert>
+
+
+
+    <!-- Get the maximum sort value for a given parent ID -->
+    <select id="getMaxSortByParentId" resultType="int" parameterType="long">
+        SELECT IFNULL(MAX(sort), 0) + 1 FROM distri_share_path WHERE ancestor = #{parentId} AND depth = 1
+    </select>
+
+
+    <!-- 删除旧的祖先关系 -->
+    <delete id="deleteOldAncestors" parameterType="java.lang.Long">
+        DELETE FROM distri_share_path
+        WHERE descendant IN (
+            SELECT descendant FROM distri_share_path WHERE ancestor = #{nodeId}
+        )
+          AND ancestor NOT IN (
+            SELECT descendant FROM distri_share_path WHERE ancestor = #{nodeId}
+        );
+    </delete>
+
+    <!-- 添加新的祖先关系 -->
+    <insert id="addNewAncestors" parameterType="map">
+        INSERT INTO distri_share_path (ancestor, descendant, depth, sort)
+        SELECT np.ancestor, c.descendant, np.depth + c.depth + 1, 0
+        FROM distri_share_path AS np
+                 CROSS JOIN (
+            SELECT descendant, depth FROM distri_share_path WHERE ancestor = #{nodeId}
+        ) AS c
+        WHERE np.descendant = #{newParentId}
+        UNION ALL
+        SELECT #{nodeId} as ancestor, descendant, depth + 1, 0 FROM distri_share_path WHERE ancestor = #{nodeId};
+    </insert>
 </mapper>