diff --git a/src/main/java/com/zsc/edu/gateway/framework/DeptTreeUtil.java b/src/main/java/com/zsc/edu/gateway/framework/DeptTreeUtil.java deleted file mode 100644 index 544aaef..0000000 --- a/src/main/java/com/zsc/edu/gateway/framework/DeptTreeUtil.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.zsc.edu.gateway.framework; - -import com.zsc.edu.gateway.modules.system.entity.Dept; -import com.zsc.edu.gateway.modules.system.entity.User; -import com.zsc.edu.gateway.modules.system.vo.DeptTree; -import com.zsc.edu.gateway.modules.system.vo.UserTree; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -/** - * @author zhuang - */ -@Component -public class DeptTreeUtil { - - public static List makeTree(List list, Predicate rootCheck, BiFunction parentCheck, BiConsumer> setSubChildren) { - return list.stream() - .filter(rootCheck) - .peek(x -> setSubChildren.accept(x, makeChildren(x, list, parentCheck, setSubChildren))) - .collect(Collectors.toList()); - } - - private static List makeChildren(E parent, List allData, BiFunction parentCheck, BiConsumer> setSubChildren) { - return allData.stream() - .filter(x -> parentCheck.apply(parent, x)) - .peek(x -> setSubChildren.accept(x, makeChildren(x, allData, parentCheck, setSubChildren))) - .collect(Collectors.toList()); - } - - public static List buildDeptTree(List depots, Map> userMap) { - List deptTrees = depots.stream() - .map(DeptTreeUtil::convertToDeptTree) - .collect(Collectors.toList()); - - deptTrees.forEach(deptTree -> { - List users = userMap.getOrDefault(deptTree.getId(), Collections.emptyList()); - deptTree.setMembers(users.stream() - .map(DeptTreeUtil::convertToUserTree) - .collect(Collectors.toList())); - }); - - return makeTree( - deptTrees, - deptTree -> deptTree.getPid() == null || deptTree.getPid() == 0L, - (parent, child) -> parent.getId().equals(child.getPid()), - DeptTree::setChildren - ); - } - - private static DeptTree convertToDeptTree(Dept dept) { - DeptTree deptTree = new DeptTree(); - deptTree.setId(dept.getId()); - deptTree.setPid(dept.getPid()); - deptTree.setName(dept.getName()); - return deptTree; - } - - private static UserTree convertToUserTree(User user) { - UserTree userTree = new UserTree(); - userTree.setId(user.getId()); - userTree.setName(user.getName()); - return userTree; - } -} diff --git a/src/main/java/com/zsc/edu/gateway/framework/TreeUtil.java b/src/main/java/com/zsc/edu/gateway/framework/TreeUtil.java new file mode 100644 index 0000000..2fb31cb --- /dev/null +++ b/src/main/java/com/zsc/edu/gateway/framework/TreeUtil.java @@ -0,0 +1,130 @@ +package com.zsc.edu.gateway.framework; + +import java.util.*; +import java.util.function.*; +import java.util.stream.Collectors; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +/** + * @Description: 树操作方法工具类 + * @Copyright: Copyright (c) 赵侠客 + * @Date: 2024-07-22 10:42 + * @Version: 1.0 + */ +public class TreeUtil { + + /** + * 将list合成树 + * + * @param list 需要合成树的List + * @param rootCheck 判断E中为根节点的条件,如:x->x.getPId()==-1L , x->x.getParentId()==null,x->x.getParentMenuId()==0 + * @param parentCheck 判断E中为父节点条件,如:(x,y)->x.getId().equals(y.getPId()) + * @param setSubChildren E中设置下级数据方法,如:Menu::setSubMenus + * @param 泛型实体对象 + * @return 合成好的树 + */ + public static List makeTree(List list, Predicate rootCheck, BiFunction parentCheck, BiConsumer> setSubChildren) { + return list.stream().filter(rootCheck).peek(x -> setSubChildren.accept(x, makeChildren(x, list, parentCheck, setSubChildren))).collect(Collectors.toList()); + } + + /** + * 将树打平成tree + * + * @param tree 需要打平的树 + * @param getSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null) + * @param setSubChildren 将下级数据置空方法,如:x->x.setSubMenus(null) + * @param 泛型实体对象 + * @return 打平后的数据 + */ + public static List flat(List tree, Function> getSubChildren, Consumer setSubChildren) { + List res = new ArrayList<>(); + forPostOrder(tree, item -> { + setSubChildren.accept(item); + res.add(item); + }, getSubChildren); + return res; + } + + /** + * 前序遍历 + * + * @param tree 需要遍历的树 + * @param consumer 遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素 + * @param setSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null) + * @param 泛型实体对象 + */ + public static void forPreOrder(List tree, Consumer consumer, Function> setSubChildren) { + for (E l : tree) { + consumer.accept(l); + List es = setSubChildren.apply(l); + if (es != null && es.size() > 0) { + forPreOrder(es, consumer, setSubChildren); + } + } + } + + /** + * 层序遍历 + * + * @param tree 需要遍历的树 + * @param consumer 遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素 + * @param setSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null) + * @param 泛型实体对象 + */ + public static void forLevelOrder(List tree, Consumer consumer, Function> setSubChildren) { + Queue queue = new LinkedList<>(tree); + while (!queue.isEmpty()) { + E item = queue.poll(); + consumer.accept(item); + List childList = setSubChildren.apply(item); + if (childList != null && !childList.isEmpty()) { + queue.addAll(childList); + } + } + } + + /** + * 后序遍历 + * + * @param tree 需要遍历的树 + * @param consumer 遍历后对单个元素的处理方法,如:x-> System.out.println(x)、 System.out::println打印元素 + * @param setSubChildren 设置下级数据方法,如:Menu::getSubMenus,x->x.setSubMenus(null) + * @param 泛型实体对象 + */ + public static void forPostOrder(List tree, Consumer consumer, Function> setSubChildren) { + for (E item : tree) { + List childList = setSubChildren.apply(item); + if (childList != null && !childList.isEmpty()) { + forPostOrder(childList, consumer, setSubChildren); + } + consumer.accept(item); + } + } + + /** + * 对树所有子节点按comparator排序 + * + * @param tree 需要排序的树 + * @param comparator 排序规则Comparator,如:Comparator.comparing(MenuVo::getRank)按Rank正序 ,(x,y)->y.getRank().compareTo(x.getRank()),按Rank倒序 + * @param getChildren 获取下级数据方法,如:MenuVo::getSubMenus + * @param 泛型实体对象 + * @return 排序好的树 + */ + public static List sort(List tree, Comparator comparator, Function> getChildren) { + for (E item : tree) { + List childList = getChildren.apply(item); + if (childList != null && !childList.isEmpty()) { + sort(childList, comparator, getChildren); + } + } + tree.sort(comparator); + return tree; + } + + private static List makeChildren(E parent, List allData, BiFunction parentCheck, BiConsumer> children) { + return allData.stream().filter(x -> parentCheck.apply(parent, x)).peek(x -> children.accept(x, makeChildren(x, allData, parentCheck, children))).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/zsc/edu/gateway/modules/notice/controller/UserMessageController.java b/src/main/java/com/zsc/edu/gateway/modules/notice/controller/UserMessageController.java index 259eddf..a7122b1 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/notice/controller/UserMessageController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/notice/controller/UserMessageController.java @@ -116,17 +116,17 @@ public class UserMessageController { } /** - * 管理员为消息添加附件 - * - * @param messageId 消息ID - * @param attachmentIds 附件ID集合 - * @return 消息列表 - */ - @PostMapping("/attachment/{messageId}") - @PreAuthorize("hasAuthority('MESSAGE_CREATE')") - public Boolean insertInto(@PathVariable("messageId") Long messageId, @RequestBody List attachmentIds) { - return service.insertInto(messageId, attachmentIds); - } + // * 管理员为消息添加附件 + // * + // * @param messageId 消息ID + // * @param attachmentIds 附件ID集合 + // * @return 消息列表 + // */ +// @PostMapping("/attachment/{messageId}") +// @PreAuthorize("hasAuthority('MESSAGE_CREATE')") +// public Boolean insertInto(@PathVariable("messageId") Long messageId, @RequestBody List attachmentIds) { +// return service.insertInto(messageId, attachmentIds); +// } /** * 获取消息推送方式 diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/controller/DeptController.java b/src/main/java/com/zsc/edu/gateway/modules/system/controller/DeptController.java index e2dc86b..afd7a0c 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/controller/DeptController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/controller/DeptController.java @@ -1,15 +1,12 @@ package com.zsc.edu.gateway.modules.system.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.entity.Dept; import com.zsc.edu.gateway.modules.system.entity.User; -import com.zsc.edu.gateway.modules.system.query.DeptQuery; import com.zsc.edu.gateway.modules.system.service.DeptService; import com.zsc.edu.gateway.modules.system.service.UserService; -import com.zsc.edu.gateway.modules.system.vo.DeptTree; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -35,7 +32,7 @@ public class DeptController { * @return 部门列表 */ @GetMapping() - public List getDeptTree() { + public List getDeptTree() { return service.getDeptTree(); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/entity/Dept.java b/src/main/java/com/zsc/edu/gateway/modules/system/entity/Dept.java index 39d04b9..af06bd7 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/entity/Dept.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/entity/Dept.java @@ -49,7 +49,4 @@ public class Dept extends BaseEntity { @TableField(exist = false) public List children = new ArrayList<>(0); - @TableField(exist = false) - public List members = new ArrayList<>(0); - } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/repo/DeptRepository.java b/src/main/java/com/zsc/edu/gateway/modules/system/repo/DeptRepository.java index cdb1408..8c844a7 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/repo/DeptRepository.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/repo/DeptRepository.java @@ -2,11 +2,6 @@ package com.zsc.edu.gateway.modules.system.repo; import com.zsc.edu.gateway.modules.system.entity.Dept; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.zsc.edu.gateway.modules.system.entity.User; -import org.apache.ibatis.annotations.Many; -import org.apache.ibatis.annotations.Result; -import org.apache.ibatis.annotations.Results; -import org.apache.ibatis.annotations.Select; import java.util.List; @@ -19,6 +14,5 @@ import java.util.List; * @since 2023-04-06 */ public interface DeptRepository extends BaseMapper { - @Select("SELECT d.*, u.* FROM sys_dept d LEFT JOIN sys_user u ON d.id = u.dept_id") - List selectAllWithMembers(); + List selectDeptTree(); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/DeptService.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/DeptService.java index be8c89a..17b43d3 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/DeptService.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/DeptService.java @@ -3,7 +3,6 @@ package com.zsc.edu.gateway.modules.system.service; import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.entity.Dept; import com.baomidou.mybatisplus.extension.service.IService; -import com.zsc.edu.gateway.modules.system.vo.DeptTree; import java.util.List; @@ -31,13 +30,11 @@ public interface DeptService extends IService { Boolean edit(DeptDto dto, Long id); Boolean toggle(Long id); -// -// /** -// * 生成部门树结构 -// * @param id -// * @return -// */ -//// Dept listTree(Long id); - List getDeptTree(); + /** + * 生成部门树结构 + * + * @return Dept + */ + List getDeptTree(); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/DeptServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/DeptServiceImpl.java index 4688917..ec09102 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/DeptServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/DeptServiceImpl.java @@ -2,23 +2,17 @@ package com.zsc.edu.gateway.modules.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zsc.edu.gateway.exception.ConstraintException; -import com.zsc.edu.gateway.framework.DeptTreeUtil; +import com.zsc.edu.gateway.framework.TreeUtil; import com.zsc.edu.gateway.modules.system.dto.DeptDto; import com.zsc.edu.gateway.modules.system.entity.Dept; -import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.mapper.DeptMapper; import com.zsc.edu.gateway.modules.system.repo.DeptRepository; -import com.zsc.edu.gateway.modules.system.repo.UserRepository; import com.zsc.edu.gateway.modules.system.service.DeptService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.zsc.edu.gateway.modules.system.vo.DeptTree; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** *

@@ -34,7 +28,6 @@ public class DeptServiceImpl extends ServiceImpl implement private final DeptMapper mapper; private final DeptRepository repo; - private final UserRepository userRepository; @Override public Dept create(DeptDto dto) { @@ -64,14 +57,14 @@ public class DeptServiceImpl extends ServiceImpl implement } @Override - public List getDeptTree() { - List depots = repo.selectList(null); - List users = userRepository.selectList(null); - Map> userMap = new HashMap<>(); - for (User user : users) { - userMap.computeIfAbsent(user.getDeptId(), k -> new ArrayList<>()).add(user); - } - return DeptTreeUtil.buildDeptTree(depots, userMap); + public List getDeptTree() { + List deptTrees = repo.selectDeptTree(); + return TreeUtil.makeTree( + deptTrees, + department -> department.getPid() == null || department.getPid() == -1L, + (parent, child) -> parent.getId().equals(child.getPid()), + Dept::setChildren + ); } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/vo/DeptTree.java b/src/main/java/com/zsc/edu/gateway/modules/system/vo/DeptTree.java deleted file mode 100644 index 93a3657..0000000 --- a/src/main/java/com/zsc/edu/gateway/modules/system/vo/DeptTree.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.zsc.edu.gateway.modules.system.vo; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.zsc.edu.gateway.modules.system.entity.User; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author zhuang - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class DeptTree { - - private Long id; - @JsonIgnore - private Long pid; - private String name; - List children = new ArrayList<>(); - List members = new ArrayList<>(); -} diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/vo/UserTree.java b/src/main/java/com/zsc/edu/gateway/modules/system/vo/UserTree.java deleted file mode 100644 index 7a35ea4..0000000 --- a/src/main/java/com/zsc/edu/gateway/modules/system/vo/UserTree.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.zsc.edu.gateway.modules.system.vo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author zhuang - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UserTree { - private Long id; - private String name; -} diff --git a/src/main/resources/mappers/systemMappers/DeptMapper.xml b/src/main/resources/mappers/systemMappers/DeptMapper.xml index 01a2a56..63f120d 100644 --- a/src/main/resources/mappers/systemMappers/DeptMapper.xml +++ b/src/main/resources/mappers/systemMappers/DeptMapper.xml @@ -1,9 +1,37 @@ - + SELECT sd.* + FROM sys_dept sd + left join sys_dept d on sd.id = d.pid