From 8dea752d48ee62718a5e62d3338151363432586d Mon Sep 17 00:00:00 2001 From: lapuda <577732344@qq.com> Date: Thu, 16 Jul 2026 09:25:35 +0800 Subject: [PATCH] feat: Enhance department management with parent ID validation and department scope handling --- .../controller/system/SysDeptController.java | 10 +++++ .../controller/system/SysUserController.java | 23 +++++++++- .../service/impl/SysDeptServiceImpl.java | 42 +++++++++++++++++-- .../resources/mapper/system/SysDeptMapper.xml | 4 +- .../resources/mapper/system/SysUserMapper.xml | 9 +++- sql/highgo.sql | 3 +- sql/ry_20240629.sql | 4 +- 7 files changed, 81 insertions(+), 14 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 59e7588..9864c3f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -76,6 +76,11 @@ public class SysDeptController extends BaseController @PostMapping public AjaxResult add(@Validated @RequestBody SysDept dept) { + if (dept.getParentId() == null) + { + return error("上级部门不能为空"); + } + deptService.checkDeptDataScope(dept.getParentId()); if (!deptService.checkDeptNameUnique(dept)) { return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); @@ -93,7 +98,12 @@ public class SysDeptController extends BaseController public AjaxResult edit(@Validated @RequestBody SysDept dept) { Long deptId = dept.getDeptId(); + if (dept.getParentId() == null) + { + return error("上级部门不能为空"); + } deptService.checkDeptDataScope(deptId); + deptService.checkDeptDataScope(dept.getParentId()); if (!deptService.checkDeptNameUnique(dept)) { return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 49cffa4..f90a938 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.annotation.Log; @@ -64,8 +65,10 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/list") - public TableDataInfo list(SysUser user) + public TableDataInfo list(SysUser user, + @RequestParam(value = "deptScope", required = false, defaultValue = "SELF") String deptScope) { + applyDeptScope(user, deptScope); startPage(); List list = userService.selectUserList(user); return getDataTable(list); @@ -74,8 +77,10 @@ public class SysUserController extends BaseController @Log(title = "用户管理", businessType = BusinessType.EXPORT) @PreAuthorize("@ss.hasPermi('system:user:export')") @PostMapping("/export") - public void export(HttpServletResponse response, SysUser user) + public void export(HttpServletResponse response, SysUser user, + @RequestParam(value = "deptScope", required = false, defaultValue = "SELF") String deptScope) { + applyDeptScope(user, deptScope); List list = userService.selectUserList(user); ExcelUtil util = new ExcelUtil(SysUser.class); util.exportExcel(response, list, "用户数据"); @@ -260,6 +265,20 @@ public class SysUserController extends BaseController return success(deptService.selectDeptTreeList(dept)); } + /** + * 设置用户列表的部门范围。 + * + * 未指定部门时使用当前登录用户所在部门,默认只查询本级部门。 + */ + private void applyDeptScope(SysUser user, String deptScope) + { + if (user.getDeptId() == null || user.getDeptId() == 0) + { + user.setDeptId(getDeptId()); + } + user.getParams().put("deptScope", "CHILDREN".equalsIgnoreCase(deptScope) ? "CHILDREN" : "SELF"); + } + @ApiOperation("企业资质审核") @PreAuthorize("@ss.hasPermi('sys:company:approval')") @PostMapping("/approval") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 54b605d..12c9567 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.annotation.DataScope; @@ -211,7 +212,17 @@ public class SysDeptServiceImpl implements ISysDeptService @Override public int insertDept(SysDept dept) { + if (StringUtils.isNull(dept.getParentId())) + { + throw new ServiceException("上级部门不能为空"); + } + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + if (StringUtils.isNull(info) || !"0".equals(info.getDelFlag())) + { + throw new ServiceException("上级部门不存在"); + } + // 如果父节点不为正常状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { @@ -230,13 +241,36 @@ public class SysDeptServiceImpl implements ISysDeptService @Override public int updateDept(SysDept dept) { + if (StringUtils.isNull(dept.getDeptId())) + { + throw new ServiceException("部门编号不能为空"); + } + if (StringUtils.isNull(dept.getParentId())) + { + throw new ServiceException("上级部门不能为空"); + } + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); - if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) + if (StringUtils.isNull(oldDept)) + { + throw new ServiceException("部门不存在"); + } + if (StringUtils.isNull(newParentDept) || !"0".equals(newParentDept.getDelFlag())) + { + throw new ServiceException("上级部门不存在"); + } + if (dept.getDeptId().equals(newParentDept.getDeptId()) + || ArrayUtils.contains(StringUtils.split(newParentDept.getAncestors(), ","), dept.getDeptId().toString())) + { + throw new ServiceException("不能选择当前部门或其下级部门作为上级部门"); + } + + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + if (!StringUtils.equals(newAncestors, oldAncestors)) { - String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); - String oldAncestors = oldDept.getAncestors(); - dept.setAncestors(newAncestors); updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); } int result = deptMapper.updateDept(dept); diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 05acf4c..3a9ff2d 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -59,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - \ No newline at end of file + diff --git a/sql/highgo.sql b/sql/highgo.sql index 11ec237..1e8cdee 100644 --- a/sql/highgo.sql +++ b/sql/highgo.sql @@ -1257,7 +1257,7 @@ create table "ks_db3"."sys_dept" "dept_id" bigint not null, "parent_id" bigint default 0 null, - "ancestors" varchar(50) default '' + "ancestors" text default '' null, "dept_name" varchar(30) default '' null, @@ -2633,4 +2633,3 @@ comment on table "ks_db3"."sys_user_role" is '用户和角色关联表'; comment on column "ks_db3"."sys_user_role"."role_id" is '角色id'; comment on column "ks_db3"."sys_user_role"."user_id" is '用户id'; - diff --git a/sql/ry_20240629.sql b/sql/ry_20240629.sql index a8647d2..410d724 100644 --- a/sql/ry_20240629.sql +++ b/sql/ry_20240629.sql @@ -5,7 +5,7 @@ drop table if exists sys_dept; create table sys_dept ( dept_id bigint(20) not null auto_increment comment '部门id', parent_id bigint(20) default 0 comment '父部门id', - ancestors varchar(50) default '' comment '祖级列表', + ancestors varchar(1000) default '' comment '祖级列表', dept_name varchar(30) default '' comment '部门名称', order_num int(4) default 0 comment '显示顺序', leader varchar(20) default null comment '负责人', @@ -698,4 +698,4 @@ create table gen_table_column ( update_by varchar(64) default '' comment '更新者', update_time datetime comment '更新时间', primary key (column_id) -) engine=innodb auto_increment=1 comment = '代码生成业务表字段'; \ No newline at end of file +) engine=innodb auto_increment=1 comment = '代码生成业务表字段';