feat: Enhance department management with parent ID validation and department scope handling

This commit is contained in:
2026-07-16 09:25:35 +08:00
parent e21e51de8a
commit 8dea752d48
7 changed files with 81 additions and 14 deletions

View File

@@ -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() + "'失败,部门名称已存在");

View File

@@ -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<SysUser> 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<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(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")

View File

@@ -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))
{
updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
}
int result = deptMapper.updateDept(dept);

View File

@@ -59,7 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status,
select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag,
(select dept_name from sys_dept where dept_id = d.parent_id) parent_name
from sys_dept d
where d.dept_id = #{deptId}

View File

@@ -83,7 +83,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
</if>
<if test="deptId != null and deptId != 0">
AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
AND (
u.dept_id = #{deptId}
<if test="params.deptScope != null and params.deptScope == 'CHILDREN'">
OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) )
</if>
)
</if>
<if test="idCard != null and idCard != ''">
AND u.id_card = #{idCard}

View File

@@ -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';

View File

@@ -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 '负责人',