部门添加祖级列表字段

This commit is contained in:
Vinjor 2024-08-07 16:40:54 +08:00
parent b58f2a9d67
commit 7e263447be
4 changed files with 34 additions and 8 deletions

View File

@ -18,6 +18,9 @@ public class DeptRespVO {
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "祖级列表", example = "1024")
private String ancestors;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer sort;

View File

@ -25,6 +25,9 @@ public class DeptSaveReqVO {
@Schema(description = "父部门 ID", example = "1024")
private Long parentId;
@Schema(description = "祖级列表", example = "1024")
private String ancestors;
@Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "显示顺序不能为空")
private Integer sort;

View File

@ -38,6 +38,10 @@ public class DeptDO extends TenantBaseDO {
* 关联 {@link #id}
*/
private Long parentId;
/**
* 祖级列表
*/
private String ancestors;
/**
* 显示顺序
*/

View File

@ -45,8 +45,8 @@ public class DeptServiceImpl implements DeptService {
if (createReqVO.getParentId() == null) {
createReqVO.setParentId(DeptDO.PARENT_ID_ROOT);
}
// 校验父部门的有效性
validateParentDept(null, createReqVO.getParentId());
// 校验父部门的有效性同时顺便设置祖级列表
createReqVO.setAncestors(validateParentDept(null, createReqVO.getParentId()));
// 校验部门名的唯一性
validateDeptNameUnique(null, createReqVO.getParentId(), createReqVO.getName());
@ -66,8 +66,8 @@ public class DeptServiceImpl implements DeptService {
}
// 校验自己存在
validateDeptExists(updateReqVO.getId());
// 校验父部门的有效性
validateParentDept(updateReqVO.getId(), updateReqVO.getParentId());
// 校验父部门的有效性同时顺便设置祖级列表
updateReqVO.setAncestors(validateParentDept(null, updateReqVO.getParentId()));
// 校验部门名的唯一性
validateDeptNameUnique(updateReqVO.getId(), updateReqVO.getParentId(), updateReqVO.getName());
@ -116,9 +116,10 @@ public class DeptServiceImpl implements DeptService {
}
@VisibleForTesting
void validateParentDept(Long id, Long parentId) {
String validateParentDept(Long id, Long parentId) {
StringBuilder ancestorsBuilder = new StringBuilder(String.valueOf(parentId));
if (parentId == null || DeptDO.PARENT_ID_ROOT.equals(parentId)) {
return;
return ancestorsBuilder.toString();
}
// 1. 不能设置自己为父部门
if (Objects.equals(id, parentId)) {
@ -130,12 +131,26 @@ public class DeptServiceImpl implements DeptService {
throw exception(DEPT_PARENT_NOT_EXITS);
}
// 3. 递归校验父部门如果父部门是自己的子部门则报错避免形成环路
if (id == null) { // id 为空说明新增不需要考虑环路
return;
if (id == null) { // id 为空说明新增不需要考虑环路,但是需要拼接祖级列表
for (int i = 0; i < Short.MAX_VALUE; i++) {
// 3.1 校验环路
parentId = parentDept.getParentId();
ancestorsBuilder.insert(0, parentId + ",");
// 3.2 继续递归下一级父部门
if (parentId == null || DeptDO.PARENT_ID_ROOT.equals(parentId)) {
break;
}
parentDept = deptMapper.selectById(parentId);
if (parentDept == null) {
break;
}
}
return ancestorsBuilder.toString();
}
for (int i = 0; i < Short.MAX_VALUE; i++) {
// 3.1 校验环路
parentId = parentDept.getParentId();
ancestorsBuilder.insert(0, parentId + ",");
if (Objects.equals(id, parentId)) {
throw exception(DEPT_PARENT_IS_CHILD);
}
@ -148,6 +163,7 @@ public class DeptServiceImpl implements DeptService {
break;
}
}
return ancestorsBuilder.toString();
}
@VisibleForTesting