Explorar el Código

修改查询人员关系树

gaohp hace 11 meses
padre
commit
e0fcb9eee7

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

@@ -51,6 +51,7 @@ public class SharePathController {
     }
 
 
+
     @PutMapping("/transference_rela")
     @Operation(summary = "转让分销关系")
     @PreAuthorize("@ss.hasPermission('distri:share-path:update')")
@@ -128,9 +129,8 @@ public class SharePathController {
     @Operation(summary = "获取分销人员关系树")
     @PreAuthorize("@ss.hasPermission('distri:share-path:query')")
     public CommonResult<TreeNode> getTree(@RequestParam("userId") Long userId,
-                                          @RequestParam(value = "minDepth", defaultValue = "1") Integer minDepth,
                                           @RequestParam("maxDepth") Integer maxDepth) {
-        TreeNode sharePath = sharePathService.getTree(userId, minDepth, maxDepth);
+        TreeNode sharePath = sharePathService.getTree(userId,maxDepth);
         return success(sharePath);
     }
 

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

@@ -12,10 +12,12 @@ import java.util.List;
 @NoArgsConstructor
 @AllArgsConstructor
 public class TreeNode {
-    private Long id;
+    private Long userId;
     private String name; // 节点名称
     private String nickname;
     private String phone;
+    private Integer deep;
     private Integer value; // 节点值,某些节点可能没有值
+    private Long parentId; // 父亲Id
     private List<TreeNode> children; // 子节点列表
 }

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

@@ -72,7 +72,7 @@ public interface SharePathMapper extends BaseMapperX<SharePathDO> {
     List<Long> findLessSortedSiblings(@Param("descendantId") Long descendantId);
 
 
-    List<TreeNode> selectDescendants(@Param("ancestor") Long userId, @Param("minDepth") Integer minDepth, @Param("maxDepth") Integer maxDepth);
+    List<TreeNode> selectDescendants(@Param("ancestor") Long userId,  @Param("maxDepth") Integer maxDepth);
 }
 
 

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

@@ -99,7 +99,7 @@ public interface SharePathService {
     List<Long> sonsId(Long userId);
 
     PageResult<SharePathRespVO> getDescendants(SharePathPageReqVO pageReqVO);
-    TreeNode getTree(Long userId, Integer minDepth, Integer maxDepth);
+    TreeNode getTree(Long userId,  Integer maxDepth);
 
     TreeNode getTreeByNameOrMobile(SharePathTreeReqVO sharePathTreeReqVO);
 }

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

@@ -157,13 +157,28 @@ public class SharePathServiceImpl implements SharePathService {
 
 
     @Override
-    public TreeNode getTree(Long userId, Integer minDepth, Integer maxDepth) {
+    public TreeNode getTree(Long userId, Integer maxDepth) {
         // 如果user为空, 则查询全部信息
         if (userId == null) {
             userId = PT_ID;
         }
         DuserDO sharePathDO = duserService.getDuserByUser(userId);
-        List<TreeNode> treeNodes = sharePathMapper.selectDescendants(userId, minDepth, maxDepth);
+        // 查询层级范围
+        List<SharePathDO> sharePathDOS = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().eq(SharePathDO::getAncestor, userId)
+                .between(SharePathDO::getDepth, 1, maxDepth));
+
+        List<TreeNode> deep = sharePathDO2TreeNode(sharePathDOS);
+        if (maxDepth > 1) {
+            List<Long> descs = sharePathDOS.stream().filter(k -> k.getDepth() > 1).map(SharePathDO::getDescendant).collect(Collectors.toList());
+            // 获取大于1层级的数据
+            List<SharePathDO> descList = sharePathMapper.selectList(new LambdaQueryWrapperX<SharePathDO>().ne(SharePathDO::getAncestor, 1).in(SharePathDO::getDescendant, descs));
+            List<TreeNode> treeNodes1 = sharePathDO2TreeNode(descList);
+            deep = deep.stream().filter(k -> k.getDeep() == 1).collect(Collectors.toList());
+            deep.addAll(treeNodes1);
+        }
+        // 整合结构
+        List<TreeNode> treeNodes = listWithTree(deep, userId);
+
         TreeNode build = TreeNode.builder()
                 .phone(sharePathDO.getMobile())
                 .name(sharePathDO.getName())
@@ -178,6 +193,37 @@ public class SharePathServiceImpl implements SharePathService {
         return null;
     }
 
+
+    public List<TreeNode> sharePathDO2TreeNode(List<SharePathDO> sharePathDOS) {
+        return sharePathDOS.stream().map(k -> TreeNode.builder()
+                .phone(k.getDescPhone())
+                .name(k.getDescName())
+                .deep(k.getDepth())
+                .parentId(k.getAncestor())
+                .userId(k.getDescendant())
+                .nickname(k.getDescNickName()).build()).collect(Collectors.toList());
+    }
+
+
+    public static List<TreeNode> listWithTree(List<TreeNode> all, Long pid) {
+        // 2、找到一级父类,再通过级联去查询儿子
+        return all.stream().filter(k ->
+                k.getParentId().equals(pid)   //查询父类
+        ).map(k -> {
+            k.setChildren(getChildren(k, all));
+            return k;//查询子类菜单
+        }).collect(Collectors.toList());
+    }
+
+    public static List<TreeNode> getChildren(TreeNode root, List<TreeNode> all) {
+        // 递归查找所有后代的儿子
+        return all.stream().filter(k -> k.getParentId().equals(root.getUserId()))
+                .map(k -> {
+                    k.setChildren(getChildren(k, all));
+                    return k;
+                }).collect(Collectors.toList());
+    }
+
     @Override
     public void transferenceRela(SharePathtransFerenceRelaReqVO sharePathtransFerenceRelaReqVO) {
         // todo 转让用户关系

+ 33 - 15
feifan-module-distri/feifan-module-distri-biz/src/main/resources/mapper/sharepath/SharePathMapper.xml

@@ -104,26 +104,44 @@
                     column="descendant" select="selectDescendants" />
 
     </resultMap>
-  <!--  <select id="selectTopLevelAncestors" resultMap="TreeNodeMap">
-        SELECT descendant, desc_name
-        FROM distri_share_path
-        WHERE depth = 1
-    </select>-->
+
 
     <select id="selectDescendants"
             resultMap="TreeNodeMap">
+
+
         WITH RECURSIVE SubPath AS (
-        SELECT descendant, desc_name, depth
-        FROM distri_share_path
-        WHERE ancestor = #{ancestor} AND depth <![CDATA[>=]]> #{minDepth}
-        UNION ALL
-        SELECT d.descendant, d.desc_name, d.depth
-        FROM distri_share_path d
-        INNER JOIN SubPath sp ON sp.descendant = d.ancestor
-        WHERE d.depth <![CDATA[<=]]> #{maxDepth}
+            SELECT
+                descendant,
+                desc_name,
+                depth,
+                1 AS current_depth
+            FROM
+                distri_share_path
+            WHERE
+                ancestor = #{ancestor}
+              AND depth = 1
+            UNION ALL
+            SELECT
+                d.descendant,
+                d.desc_name,
+                d.depth,
+                sp.current_depth + 1
+            FROM
+                distri_share_path d
+                    JOIN
+                SubPath sp ON sp.descendant = d.ancestor
+            WHERE
+                sp.current_depth <![CDATA[<]]> #{maxDepth}
         )
-        SELECT * FROM SubPath
-        WHERE depth <![CDATA[<=]]> #{maxDepth};
+        SELECT
+            descendant,
+            desc_name,
+            depth
+        FROM
+            SubPath
+        WHERE
+            current_depth <![CDATA[<=]]> #{maxDepth};
 
     </select>
 </mapper>