From dda94f46231bbe069365d7470ecae335992840c8 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Mon, 10 Aug 2026 10:45:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4-=E9=83=A8?= =?UTF-8?q?=E9=97=A8/=E5=B2=97=E4=BD=8D=E5=88=A0=E9=99=A4,=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E4=BA=BA=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/exception/ErrorCode.java | 2 + .../domain/gateway/OrgDepartmentGateway.java | 5 ++ .../domain/gateway/OrgPersonnelGateway.java | 10 ++++ .../service/OrgDepartmentDomainService.java | 8 ++++ .../service/OrgPositionDomainService.java | 7 +++ .../gatewayimpl/OrgDepartmentGatewayImpl.java | 48 +++++++++++++++++++ .../gatewayimpl/OrgPersonnelGatewayImpl.java | 24 ++++++++++ 7 files changed, 104 insertions(+) diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index e2cddd5e..5ad0c866 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -14,6 +14,7 @@ public enum ErrorCode { DATA_NOT_EXIST("01-02-101", "数据不存在"), // ---- 部门 ---- ORG_DEPARTMENT_NOT_FOUND("01-02-001", "部门不存在"), + ORG_DEPARTMENT_HAS_PERSONNEL("01-02-002", "该部门(含子部门)下存在人员,无法删除"), // ---- 装备信息 ---- ORG_EQUIPMENT_NOT_FOUND("01-03-001", "装备信息不存在"), @@ -54,6 +55,7 @@ public enum ErrorCode { ORG_POSITION_NOT_FOUND("01-08-001", "岗位不存在"), ORG_POSITION_GBS_ROLE_REQUIRED("01-08-002", "岗位关联GBS角色编码不能为空"), ORG_POSITION_GBS_ROLE_SYNC_ERROR("01-08-003", "岗位关联人员GBS角色同步失败"), + ORG_POSITION_HAS_PERSONNEL("01-08-004", "该岗位下存在人员,无法删除"), // ---- 机构资质证书 ---- ORG_QUALIFICATION_NOT_FOUND("01-09-001", "机构资质证书不存在"), diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java index f810d7f8..1087409b 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgDepartmentGateway.java @@ -30,4 +30,9 @@ public interface OrgDepartmentGateway { * 按机构ID + 部门名称集合批量精确查询未删除部门(用于导入名称解析)。 */ List listByOrgIdAndNames(Long orgId, Collection deptNames); + + /** + * 查询部门自身及所有未删除子部门 ID(含自身)。 + */ + List listSelfAndDescendantIds(Long deptId); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java index 6681ff91..f2693d88 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgPersonnelGateway.java @@ -47,4 +47,14 @@ public interface OrgPersonnelGateway { * 按主键批量查询未删除人员(WPS 用户展示等)。 */ java.util.List listByIds(Collection ids); + + /** + * 指定部门集合下是否存在未删除人员(直接归属)。 + */ + boolean existsByDeptIds(Collection deptIds); + + /** + * 指定岗位下是否存在未删除人员。 + */ + boolean existsByPostId(Long postId); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java index b4a396bb..89e2553d 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgDepartmentDomainService.java @@ -4,6 +4,7 @@ import org.qinan.safetyeval.domain.entity.OrgDepartmentEntity; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.query.OrgDepartmentQuery; import org.qinan.safetyeval.domain.query.PageResult; @@ -23,6 +24,9 @@ public class OrgDepartmentDomainService { @Resource private OrgDepartmentGateway orgDepartmentGateway; + @Resource + private OrgPersonnelGateway orgPersonnelGateway; + public OrgDepartmentEntity add(OrgDepartmentEntity entity) { return orgDepartmentGateway.save(entity); } @@ -44,6 +48,10 @@ public class OrgDepartmentDomainService { if (existing == null) { throw new BizException(ErrorCode.ORG_DEPARTMENT_NOT_FOUND); } + List deptIds = orgDepartmentGateway.listSelfAndDescendantIds(id); + if (orgPersonnelGateway.existsByDeptIds(deptIds)) { + throw new BizException(ErrorCode.ORG_DEPARTMENT_HAS_PERSONNEL); + } orgDepartmentGateway.delete(id); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPositionDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPositionDomainService.java index a9027a3f..e1b01010 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPositionDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgPositionDomainService.java @@ -3,6 +3,7 @@ package org.qinan.safetyeval.domain.service; import org.qinan.safetyeval.domain.entity.OrgPositionEntity; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.gateway.OrgPositionGateway; import org.qinan.safetyeval.domain.query.OrgPositionQuery; import org.qinan.safetyeval.domain.query.PageResult; @@ -21,6 +22,9 @@ public class OrgPositionDomainService { @Resource private OrgPositionGateway orgPositionGateway; + @Resource + private OrgPersonnelGateway orgPersonnelGateway; + public OrgPositionEntity add(OrgPositionEntity entity) { return orgPositionGateway.save(entity); } @@ -42,6 +46,9 @@ public class OrgPositionDomainService { if (existing == null) { throw new BizException(ErrorCode.ORG_POSITION_NOT_FOUND); } + if (orgPersonnelGateway.existsByPostId(id)) { + throw new BizException(ErrorCode.ORG_POSITION_HAS_PERSONNEL); + } orgPositionGateway.delete(id); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java index 9cf38afa..efe0ad50 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgDepartmentGatewayImpl.java @@ -15,8 +15,13 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -97,6 +102,49 @@ public class OrgDepartmentGatewayImpl implements OrgDepartmentGateway { .collect(Collectors.toList()); } + @Override + public List listSelfAndDescendantIds(Long deptId) { + if (deptId == null) { + return Collections.emptyList(); + } + OrgDepartmentDO root = orgDepartmentMapper.selectById(deptId); + if (root == null) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgDepartmentDO::getDeleteEnum, "false"); + if (root.getOrgId() != null) { + wrapper.eq(OrgDepartmentDO::getOrgId, root.getOrgId()); + } + wrapper.select(OrgDepartmentDO::getId, OrgDepartmentDO::getParentId); + List all = orgDepartmentMapper.selectList(wrapper); + + Map> childrenMap = new HashMap<>(); + for (OrgDepartmentDO item : all) { + if (item.getId() == null) { + continue; + } + Long parentId = item.getParentId(); + if (parentId == null) { + continue; + } + childrenMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(item.getId()); + } + + List result = new ArrayList<>(); + ArrayDeque queue = new ArrayDeque<>(); + queue.add(deptId); + while (!queue.isEmpty()) { + Long current = queue.poll(); + result.add(current); + List children = childrenMap.get(current); + if (children != null) { + queue.addAll(children); + } + } + return result; + } + private LambdaQueryWrapper buildQueryWrapper(OrgDepartmentQuery query) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(OrgDepartmentDO::getDeleteEnum, "false"); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java index 7c48e1b4..d990d8c6 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgPersonnelGatewayImpl.java @@ -215,5 +215,29 @@ public class OrgPersonnelGatewayImpl implements OrgPersonnelGateway { return orgPersonnelDoConvertor.converDosToEes(orgPersonnelMapper.selectList(wrapper)); } + @Override + public boolean existsByDeptIds(Collection deptIds) { + if (deptIds == null || deptIds.isEmpty()) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgPersonnelDO::getDeleteEnum, "false"); + wrapper.in(OrgPersonnelDO::getDeptId, deptIds); + wrapper.last("LIMIT 1"); + return orgPersonnelMapper.selectCount(wrapper) > 0; + } + + @Override + public boolean existsByPostId(Long postId) { + if (postId == null) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrgPersonnelDO::getDeleteEnum, "false"); + wrapper.eq(OrgPersonnelDO::getPostId, postId); + wrapper.last("LIMIT 1"); + return orgPersonnelMapper.selectCount(wrapper) > 0; + } + }