From d70babfebb48214e243659007803443377a283c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=84=E9=94=90=E6=B3=A2?= <10549902+zhuangruibo@user.noreply.gitee.com> Date: Mon, 27 Apr 2026 09:54:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysDeptController.java | 21 ++++- .../system/domain/vo/SysDeptMinVo.java | 83 +++++++++++++++++++ .../system/service/ISysDeptService.java | 12 +++ .../service/impl/SysDeptServiceImpl.java | 50 +++++++++++ .../src/api/system/dept/index.ts | 9 ++ .../src/api/system/dept/types.ts | 1 + .../src/views/system/dept/index-fold.vue | 60 ++++++++++---- 7 files changed, 216 insertions(+), 20 deletions(-) create mode 100644 zdxt-modules/zdxt-system/src/main/java/org/dromara/system/domain/vo/SysDeptMinVo.java diff --git a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index d54959e6..a6fe25ee 100644 --- a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java +++ b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -11,6 +11,7 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptMinVo; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysPostService; @@ -34,13 +35,13 @@ public class SysDeptController extends BaseController { private final ISysPostService postService; /** - * 获取部门列表 + * 获取部门列表(精简字段,减少传输量) */ @SaCheckPermission("system:dept:list") @GetMapping("/list") - public R> list(SysDeptBo dept) { + public R> list(SysDeptBo dept) { List depts = deptService.selectDeptList(dept); - return R.ok(depts); + return R.ok(depts.stream().map(SysDeptMinVo::from).toList()); } /** @@ -143,4 +144,18 @@ public class SysDeptController extends BaseController { return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds))); } + /** + * 搜索部门列表(含祖级节点补全) + *

+ * 用于前端搜索场景:搜索匹配的部门并自动补全其所有祖级节点, + * 保证前端能构建从根节点到匹配节点的完整树路径。 + *

+ */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/search") + public R> searchList(SysDeptBo dept) { + List depts = deptService.selectDeptListWithAncestors(dept); + return R.ok(depts.stream().map(SysDeptMinVo::from).toList()); + } + } diff --git a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/domain/vo/SysDeptMinVo.java b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/domain/vo/SysDeptMinVo.java new file mode 100644 index 00000000..43570608 --- /dev/null +++ b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/domain/vo/SysDeptMinVo.java @@ -0,0 +1,83 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 部门精简视图对象(用于列表接口,减少传输数据量) + *

+ * 相比 SysDeptVo 去掉了: creditcode, deptCategory, leader, phone, email, createTime, zzDisplayPath + *

+ * + * @author system + */ +@Data +public class SysDeptMinVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + private String deptId; + + /** + * 父部门id + */ + private String parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private String leaderName; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + + /** + * 区域标识 + */ + private Integer zone; + + /** + * 从 SysDeptVo 转换 + */ + public static SysDeptMinVo from(SysDeptVo vo) { + SysDeptMinVo min = new SysDeptMinVo(); + min.setDeptId(vo.getDeptId()); + min.setParentId(vo.getParentId()); + min.setParentName(vo.getParentName()); + min.setAncestors(vo.getAncestors()); + min.setDeptName(vo.getDeptName()); + min.setOrderNum(vo.getOrderNum()); + min.setLeaderName(vo.getLeaderName()); + min.setStatus(vo.getStatus()); + min.setZone(vo.getZone()); + return min; + } +} diff --git a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/ISysDeptService.java index b722302e..0d617953 100644 --- a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -176,4 +176,16 @@ public interface ISysDeptService { SysDeptVo iterationDeptParentToBureau(String deptId); List selectDeptByZone(SysDeptBo dept1); + + /** + * 搜索部门并补全祖级节点 + *

+ * 根据条件搜索匹配的部门,同时通过 ancestors 字段回溯补全所有祖级节点, + * 确保前端能构建完整的树路径。 + *

+ * + * @param dept 部门查询条件 + * @return 匹配部门 + 祖级部门的合并列表 + */ + List selectDeptListWithAncestors(SysDeptBo dept); } diff --git a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 41c61a08..3b7dff06 100644 --- a/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -663,4 +663,54 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { return baseMapper.selectDeptList(lqw); } + /** + * 搜索部门并补全祖级节点 + *

+ * 先按条件搜索匹配部门,再从匹配结果的 ancestors 字段中提取所有祖级 ID, + * 一次性补查祖级部门,合并后返回完整的树路径数据。 + *

+ */ + @Override + public List selectDeptListWithAncestors(SysDeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); + List matchedDepts = new ArrayList<>(baseMapper.selectDeptList(lqw)); + + if (CollUtil.isEmpty(matchedDepts)) { + return matchedDepts; + } + + // 收集已匹配的部门 ID + Set matchedIds = matchedDepts.stream() + .map(SysDeptVo::getDeptId) + .collect(Collectors.toSet()); + + // 从 ancestors 字段提取需要补查的祖级 ID + Set ancestorIds = new HashSet<>(); + for (SysDeptVo d : matchedDepts) { + if (StringUtils.isNotBlank(d.getAncestors())) { + for (String id : StringUtils.splitList(d.getAncestors())) { + if (!"0".equals(id) && !matchedIds.contains(id)) { + ancestorIds.add(id); + } + } + } + } + + // 补查祖级部门(@TableLogic 自动过滤已删除记录) + if (CollUtil.isNotEmpty(ancestorIds)) { + List ancestors = baseMapper.selectVoList( + new LambdaQueryWrapper() + .in(SysDept::getDeptId, ancestorIds) + ); + matchedDepts.addAll(ancestors); + } + + // 按 parentId → orderNum 排序,便于前端构建树 + matchedDepts.sort(Comparator + .comparing(SysDeptVo::getParentId, Comparator.nullsLast(Comparator.naturalOrder())) + .thenComparing(SysDeptVo::getOrderNum, Comparator.nullsLast(Comparator.naturalOrder()))); + + return matchedDepts; + } + } diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/index.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/index.ts index 03c54d5c..3c739dc3 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/index.ts +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/index.ts @@ -11,6 +11,15 @@ export const listDept = (query?: DeptQuery) => { }); }; +// 搜索部门列表(含祖级节点补全) +export const searchDeptList = (query?: DeptQuery) => { + return request({ + url: '/system/dept/list/search', + method: 'get', + params: query + }); +}; + /** * 通过deptIds查询部门 * @param deptIds diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/types.ts b/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/types.ts index adaefd26..a1cc2ccc 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/types.ts +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/api/system/dept/types.ts @@ -26,6 +26,7 @@ export interface DeptVO extends BaseEntity { delFlag: string; ancestors: string; menuId: string | number; + hasChildren?: boolean; } /** diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/views/system/dept/index-fold.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/views/system/dept/index-fold.vue index b039f468..a7064aab 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/views/system/dept/index-fold.vue +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/views/system/dept/index-fold.vue @@ -44,24 +44,19 @@ :data="deptList" row-key="deptId" border - lazy - :load="loadChildren" + :lazy="!isSearchMode" + :load="isSearchMode ? undefined : loadChildren" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" + :default-expand-all="isSearchMode" > - + - - - - - +