Explorar el Código

修改营销模块, 增加新增推荐人跟直推人之间关系的接口
增加转移直推人的接口

gaohp hace 11 meses
padre
commit
f32039a87d
Se han modificado 26 ficheros con 375 adiciones y 30 borrados
  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. 6 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/duser/vo/DuserSaveReqVO.java
  4. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/integral/vo/IntegralSaveReqVO.java
  5. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogPageReqVO.java
  6. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogRespVO.java
  7. 4 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/ptprofitlog/vo/PtProfitLogSaveReqVO.java
  8. 26 4
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/SharePathController.java
  9. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathSaveReqVO.java
  10. 18 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/SharePathtransFerenceRelaReqVO.java
  11. 18 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/sharepath/vo/TreeNode.java
  12. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/controller/admin/socialstatus/vo/SocialStatusSaveReqVO.java
  13. 7 1
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/ptprofitlog/PtProfitLogDO.java
  14. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/dataobject/socialstatus/SocialStatusDO.java
  15. 2 2
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/ptprofitlog/PtProfitLogMapper.java
  16. 11 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/dal/mysql/sharepath/SharePathMapper.java
  17. 4 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserService.java
  18. 61 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/duser/DuserServiceImpl.java
  19. 8 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralService.java
  20. 9 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/integral/IntegralServiceImpl.java
  21. 15 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathService.java
  22. 45 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/SharePathServiceImpl.java
  23. 46 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/sharepath/builder/TreeBuilder.java
  24. 3 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusService.java
  25. 6 0
      feifan-module-distri/feifan-module-distri-biz/src/main/java/cn/newfeifan/mall/module/distri/service/socialstatus/SocialStatusServiceImpl.java
  26. 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>

+ 6 - 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,14 +29,14 @@ 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;

+ 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")

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

@@ -21,9 +21,12 @@ 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 = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
     @Schema(description = "订单号", example = "15682")
     private Long orderId;
 

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

@@ -25,10 +25,13 @@ 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 = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
     @Schema(description = "订单号", example = "15682")
     @ExcelProperty("订单号")
     private Long orderId;

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

@@ -22,9 +22,12 @@ 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 = "用户ID , 只有收益类型为 3,4才有值", example = "6982")
+    private Long userId;
+
     @Schema(description = "订单号", example = "15682")
     private Long orderId;
 

+ 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));
     }
 
 }

+ 4 - 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,7 @@ public class SharePathSaveReqVO {
     @Schema(description = "顺序")
     private Integer sort;
 
+    @Schema(description = "链接来源")
+    private Long source;
+
 }

+ 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;
 
+
+
 }

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

@@ -36,9 +36,14 @@ public class PtProfitLogDO extends BaseDO {
      */
     private Integer afterAmount;
     /**
-     * 收益类型 1:平台服务器费 2:平台收益
+     * 收益类型 1:平台服务器费 2:平台收益 3用户下单返回毛利额度 4直推人额度 5合赢奖
      */
     private Integer profitStatus;
+    /**
+     * 用户ID , 只有收益类型为 3,4才有值
+     */
+    private Long userId;
+
     /**
      * 订单号
      */
@@ -48,4 +53,5 @@ public class PtProfitLogDO extends BaseDO {
      */
     private String percentTemplate;
 
+
 }

+ 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;
 
+
 }

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

@@ -21,11 +21,11 @@ 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())
                 .orderByDesc(PtProfitLogDO::getId));
     }
-
 }

+ 11 - 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
@@ -27,4 +28,14 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
                 .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);
 }

+ 4 - 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,7 @@ public interface DuserService {
      */
     PageResult<DuserDO> getDuserPage(DuserPageReqVO pageReqVO);
 
+
+    void hasUserAndCreat(SharePathSaveReqVO saveReqVO);
+
 }

+ 61 - 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,46 @@ 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());
+    }
+
+    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));
+        }
+    }
+
 }

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

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

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

@@ -1,11 +1,15 @@
 package cn.newfeifan.mall.module.distri.service.integral;
 
+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 +75,9 @@ 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));
+    }
+
 }

+ 15 - 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,15 @@ public interface SharePathService {
      */
     PageResult<SharePathDO> getSharePathPage(SharePathPageReqVO pageReqVO);
 
+
+    TreeNode getTree();
+
+
+    /**
+     * 转让分销用户关系
+     * @param sharePathtransFerenceRelaReqVO
+     */
+    void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO);
+
+
 }

+ 45 - 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,17 @@ public class SharePathServiceImpl implements SharePathService {
         return sharePathMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public TreeNode getTree() {
+
+
+        return null;
+    }
+
+    @Override
+    public void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO) {
+        // todo 转让用户关系
+    }
+
+
 }

+ 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>