diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/enums/CheckInfoTypeEnum.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/enums/CheckInfoTypeEnum.java new file mode 100644 index 0000000..a75c4b3 --- /dev/null +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/enums/CheckInfoTypeEnum.java @@ -0,0 +1,17 @@ +package cn.axzo.orgmanax.dto.nodeuser.enums; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum CheckInfoTypeEnum { + + SUPER_ADMIN(1, "超级管理员"), + IN_PROJECT(2, "在项目中"), + TEAM_LEADER(3, "班组长"); + + private final Integer value; + private final String desc; +} diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/BatchDeleteNodeUserCheckReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/BatchDeleteNodeUserCheckReq.java index b155739..ccb36b2 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/BatchDeleteNodeUserCheckReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/req/BatchDeleteNodeUserCheckReq.java @@ -4,6 +4,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; +import java.util.Set; /** * @author : zhanghonghao@axzo.cn @@ -16,7 +17,7 @@ public class BatchDeleteNodeUserCheckReq { * personIds */ @NotNull(message = "personIds不可以为空!") - private List personIds; + private Set personIds; private Long workspaceId; @@ -27,4 +28,9 @@ public class BatchDeleteNodeUserCheckReq { * 节点ID */ private Long nodeId; + + /** + * 操作者ID + */ + private Long operatorId; } diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/resp/BatchDeleteNodeUserCheckResp.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/resp/BatchDeleteNodeUserCheckResp.java index 5b0b3a4..a109440 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/resp/BatchDeleteNodeUserCheckResp.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/nodeuser/resp/BatchDeleteNodeUserCheckResp.java @@ -1,5 +1,6 @@ package cn.axzo.orgmanax.dto.nodeuser.resp; +import cn.axzo.orgmanax.dto.nodeuser.enums.CheckInfoTypeEnum; import lombok.Data; import java.util.List; @@ -18,7 +19,7 @@ public class BatchDeleteNodeUserCheckResp { @Data public static class CheckFailInfo { - private Integer type; + private CheckInfoTypeEnum type; private Integer count; } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java index 5fa8f27..3ffa262 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java @@ -1,5 +1,8 @@ package cn.axzo.orgmanax.infra.client.workspace; +import cn.axzo.apollo.workspace.api.v2.participating.feign.ParticipatingUnitV2Api; +import cn.axzo.apollo.workspace.api.v2.participating.req.ParticipatingUnitListReq; +import cn.axzo.apollo.workspace.api.v2.participating.resp.ParticipatingUnitResp; import cn.axzo.apollo.workspace.api.v2.workspace.feign.WorkspaceV2Api; import cn.axzo.apollo.workspace.api.v2.workspace.req.ListWorkspaceReq; import cn.axzo.apollo.workspace.api.v2.workspace.req.WorkspaceDetailReq; @@ -15,6 +18,7 @@ import org.springframework.stereotype.Component; import java.util.List; /** + * */ @RequiredArgsConstructor @Component @@ -23,8 +27,11 @@ public class WorkspaceGateway { private final WorkspaceV2Api workspaceV2Api; + private final ParticipatingUnitV2Api participatingUnitV2Api; + /** * 更新和新增 + * * @param request * @return */ @@ -34,6 +41,7 @@ public class WorkspaceGateway { /** * 获取详情 + * * @param request * @return */ @@ -43,10 +51,15 @@ public class WorkspaceGateway { /** * 获取详情 + * * @param request * @return */ public List list(ListWorkspaceReq request) { return RpcWrapper.wrapApiResult(() -> workspaceV2Api.listV2(request)); } + + public List listParticipatingUnits(ParticipatingUnitListReq unitListReq) { + return RpcWrapper.wrapApiResult(() -> participatingUnitV2Api.list(unitListReq)); + } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/OrgNodeUserCheckController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserCheckController.java similarity index 71% rename from orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/OrgNodeUserCheckController.java rename to orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserCheckController.java index 0b98c20..cdcddc2 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/OrgNodeUserCheckController.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserCheckController.java @@ -4,6 +4,7 @@ import cn.axzo.foundation.result.ApiResult; import cn.axzo.orgmanax.api.nodeuser.feign.OrgNodeUserCheckApi; import cn.axzo.orgmanax.dto.nodeuser.req.BatchDeleteNodeUserCheckReq; import cn.axzo.orgmanax.dto.nodeuser.resp.BatchDeleteNodeUserCheckResp; +import cn.axzo.orgmanax.server.nodeuser.service.NodeUserCheckService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,16 +18,17 @@ import java.util.List; @RestController @RequestMapping @RequiredArgsConstructor -public class OrgNodeUserCheckController implements OrgNodeUserCheckApi { +public class NodeUserCheckController implements OrgNodeUserCheckApi { + private final NodeUserCheckService nodeUserCheckService; @Override public ApiResult> checkUnit(BatchDeleteNodeUserCheckReq req) { - return null; + return ApiResult.success(nodeUserCheckService.checkUnit(req)); } @Override public ApiResult> checkWorkspace(BatchDeleteNodeUserCheckReq req) { - return null; + return ApiResult.success(nodeUserCheckService.checkWorkspace(req)); } } \ No newline at end of file diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java index b147285..1b5246d 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java @@ -161,8 +161,9 @@ public class NodeUserFoundationServiceImpl implements NodeUserFoundationService @Override public List delete(NodeUserDelete req) { checkDeleteReq(req); - List list = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder().organizationalUnitId(req.getOuId()) - .workspaceId(req.getWorkspaceId()).personIds(req.getPersonIds()).build()); + List list = nodeUserQueryRepository.list( + NodeUserQueryRepository.ListReq.builder().organizationalUnitId(req.getOuId()) + .workspaceId(req.getWorkspaceId()).personIds(req.getPersonIds()).identityType(req.getIdentityType()).build()); if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserDelete.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserDelete.java index 2af228e..689f1f4 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserDelete.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserDelete.java @@ -28,6 +28,11 @@ public class NodeUserDelete { */ private boolean isUnitDelete; + /** + * 身份类型 按照项目删除的时候 传 + */ + private Integer identityType; + public OrganizationalNodeUser toEntity() { return BeanUtil.toBean(this, OrganizationalNodeUser.class); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserCheckService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserCheckService.java new file mode 100644 index 0000000..fcc1211 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserCheckService.java @@ -0,0 +1,13 @@ +package cn.axzo.orgmanax.server.nodeuser.service; + +import cn.axzo.orgmanax.dto.nodeuser.req.BatchDeleteNodeUserCheckReq; +import cn.axzo.orgmanax.dto.nodeuser.resp.BatchDeleteNodeUserCheckResp; + +import java.util.List; + +public interface NodeUserCheckService { + + List checkUnit(BatchDeleteNodeUserCheckReq req); + + List checkWorkspace(BatchDeleteNodeUserCheckReq req); +} \ No newline at end of file diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserCheckServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserCheckServiceImpl.java new file mode 100644 index 0000000..9af7e32 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserCheckServiceImpl.java @@ -0,0 +1,190 @@ +package cn.axzo.orgmanax.server.nodeuser.service.impl; + +import cn.axzo.apollo.workspace.api.v2.participating.feign.ParticipatingUnitV2Api; +import cn.axzo.apollo.workspace.api.v2.participating.req.ParticipatingUnitListReq; +import cn.axzo.apollo.workspace.api.v2.participating.resp.ParticipatingUnitResp; +import cn.axzo.basics.common.exception.ServiceException; +import cn.axzo.basics.common.util.NumberUtil; +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.orgmanax.dto.cooperateship.dto.OrgCooperateShipDTO; +import cn.axzo.orgmanax.dto.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; +import cn.axzo.orgmanax.dto.nodeuser.enums.CheckInfoTypeEnum; +import cn.axzo.orgmanax.dto.nodeuser.req.BatchDeleteNodeUserCheckReq; +import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; +import cn.axzo.orgmanax.dto.nodeuser.resp.BatchDeleteNodeUserCheckResp; +import cn.axzo.orgmanax.infra.client.profile.PersonProfileGateway; +import cn.axzo.orgmanax.infra.client.profile.dto.model.PersonProfileDto; +import cn.axzo.orgmanax.infra.client.tyr.RoleUserGateway; +import cn.axzo.orgmanax.infra.client.workspace.WorkspaceGateway; +import cn.axzo.orgmanax.infra.client.workspace.dto.Workspace; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; +import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; +import cn.axzo.orgmanax.server.nodeuser.service.NodeUserCheckService; +import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; +import cn.axzo.tyr.feign.enums.IdentityTypeEnum; +import cn.axzo.tyr.feign.enums.RoleTypeEnum; +import cn.axzo.tyr.feign.req.PageRoleUserReq; +import cn.axzo.tyr.feign.resp.RoleUserResp; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.BooleanUtil; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class NodeUserCheckServiceImpl implements NodeUserCheckService { + + private final WorkspaceGateway workspaceGateway; + + private final RoleUserGateway roleUserGateway; + + private final PersonProfileGateway profileGateway; + + private final CooperateShipService cooperateShipService; + + private final NodeUserService nodeUserService; + + // 企业内班组长岗位编码 + @Value("${entTeamLeader:entTeamLeader}") + private String entTeamLeader; + + // 班组管理员岗位编码 + @Value("${entTeamManager:entTeamManager}") + private String entTeamManager; + + // 企业内班组工人岗位编码 + @Value("${entWorker:entWorker}") + private String entWorker; + + + @Override + public List checkUnit(BatchDeleteNodeUserCheckReq req) { + List resultList = new ArrayList<>(); + Map> failInfoMap = new HashMap<>(); + Long ouId = req.getOuId(); + Long workspaceId = req.getWorkspaceId(); + Set personIds = req.getPersonIds(); + ParticipatingUnitListReq participatingUnitListReq = new ParticipatingUnitListReq(); + participatingUnitListReq.setLevels(ListUtil.of(Workspace.WorkspaceTypeEnum.GENERAL_ENT.value, Workspace.WorkspaceTypeEnum.GENERAL_PROJECT.value)); + participatingUnitListReq.setWorkspaceId(workspaceId); + participatingUnitListReq.setOrganizationUnitId(ouId); + List participatingUnitList = workspaceGateway.listParticipatingUnits(participatingUnitListReq); + Axssert.checkNotEmpty(participatingUnitList, "当前单位未参建任何项目,获取详细信息失败"); + Long topNodeId = participatingUnitList.get(0).getOrganizationNodeId(); + //1 单位联系人(超管)不能删除 + PageRoleUserReq param = new PageRoleUserReq(); + PageRoleUserReq.WorkspaceOuPair workspaceOuPair = new PageRoleUserReq.WorkspaceOuPair(); + workspaceOuPair.setWorkspaceId(workspaceId); + workspaceOuPair.setOuId(ouId); + param.setWorkspaceOuPairs(Collections.singletonList(workspaceOuPair)); + param.setRoleTypes(Collections.singleton(RoleTypeEnum.SUPER_ADMIN)); + List superAminInfoResult = roleUserGateway.pageAll(param); + superAminInfoResult.forEach(e -> { + if (personIds.contains(e.getPersonId())) { + BatchDeleteNodeUserCheckResp.CheckFailInfo checkFailInfo = new BatchDeleteNodeUserCheckResp.CheckFailInfo(); + checkFailInfo.setType(CheckInfoTypeEnum.SUPER_ADMIN); + addFailInfo(failInfoMap, e.getPersonId(), checkFailInfo); + } + }); + + ListOrgCooperateShipReq listOrgCooperateShipReq = new ListOrgCooperateShipReq(); + listOrgCooperateShipReq.setOuIds(Collections.singleton(ouId)); + listOrgCooperateShipReq.setStatuses(CollUtil.newHashSet(0, 1)); + List listPersonJoinedWorkspace = cooperateShipService.list(listOrgCooperateShipReq); + Set inProjectPersonIds = filterByPerson(listPersonJoinedWorkspace, personIds); + if (CollectionUtil.isNotEmpty(inProjectPersonIds)) { + inProjectPersonIds.forEach(e -> { + BatchDeleteNodeUserCheckResp.CheckFailInfo checkFailInfo = new BatchDeleteNodeUserCheckResp.CheckFailInfo(); + checkFailInfo.setType(CheckInfoTypeEnum.IN_PROJECT); + addFailInfo(failInfoMap, e, checkFailInfo); + }); + } + + ListNodeUserReq nodeUserQueryVO = new ListNodeUserReq(); + nodeUserQueryVO.setPersonIds(personIds); + nodeUserQueryVO.setOrganizationalUnitId(ouId); + nodeUserQueryVO.setTopNodeIds(Collections.singletonList(topNodeId)); + nodeUserQueryVO.setNeeds(ListNodeUserReq.Needs.builder().job(true).build()); + //查询人所在的部门节点列表 + List organizationalNodeUserList = nodeUserService.list(nodeUserQueryVO); + AtomicBoolean isWorker = new AtomicBoolean(false); + AtomicBoolean isPractitioner = new AtomicBoolean(false); + List teamLeader = Lists.newArrayList(); + List workerOrgNodeIds = Lists.newArrayList(); + organizationalNodeUserList.forEach(organizationalNodeUserVO -> { + if (IdentityTypeEnum.WORKER_LEADER.getCode().equals(organizationalNodeUserVO.getIdentityType()) || + entTeamLeader.equals(organizationalNodeUserVO.getJob().getCode())) { + teamLeader.add(organizationalNodeUserVO.getPersonId()); + } + if (IdentityTypeEnum.WORKER.getCode().equals(organizationalNodeUserVO.getIdentityType()) || + entWorker.equals(organizationalNodeUserVO.getJob().getCode())) { + isWorker.set(true); + workerOrgNodeIds.add(organizationalNodeUserVO.getOrganizationalNodeId()); + } + if (IdentityTypeEnum.PRACTITIONER.getCode().equals(organizationalNodeUserVO.getIdentityType())) { + isPractitioner.set(true); + } + }); + if (CollUtil.isNotEmpty(teamLeader)) { + teamLeader.forEach(e -> { + BatchDeleteNodeUserCheckResp.CheckFailInfo checkFailInfo = new BatchDeleteNodeUserCheckResp.CheckFailInfo(); + checkFailInfo.setType(CheckInfoTypeEnum.TEAM_LEADER); + addFailInfo(failInfoMap, e, checkFailInfo); + }); + } + if (CollUtil.isNotEmpty(failInfoMap)) { + failInfoMap.forEach((personId, checkFailInfos) -> { + BatchDeleteNodeUserCheckResp batchDeleteNodeUserCheckVO = new BatchDeleteNodeUserCheckResp(); + batchDeleteNodeUserCheckVO.setPersonId(personId); + batchDeleteNodeUserCheckVO.setFailInfos(checkFailInfos); + resultList.add(batchDeleteNodeUserCheckVO); + }); + } + return resultList; + } + + private Set filterByPerson(List result, Set personIds) { + if (CollUtil.isEmpty(personIds)) { + return personIds; + } + Set filterResult = new HashSet<>(); + List topNodeIds = result.stream() + .map(OrgCooperateShipDTO::getOrganizationalNodeId) + .distinct() + .collect(Collectors.toList()); + ListNodeUserReq nodeUserReq = new ListNodeUserReq(); + nodeUserReq.setTopNodeIds(topNodeIds); + nodeUserReq.setPersonIds(personIds); + List nodeUserDTOS = nodeUserService.list(nodeUserReq); + Map personNodeMap = nodeUserDTOS.stream().collect(Collectors.toMap(NodeUserDTO::getPersonId, NodeUserDTO::getTopNodeId)); + Set shipNodeIds = result.stream().map(OrgCooperateShipDTO::getOrganizationalNodeId).collect(Collectors.toSet()); + for (Map.Entry entry : personNodeMap.entrySet()) { + if (shipNodeIds.contains(entry.getValue())) { + filterResult.add(entry.getKey()); + } + } + return filterResult; + } + + private void addFailInfo(Map> failInfoMap, Long personId, BatchDeleteNodeUserCheckResp.CheckFailInfo checkFailInfo) { + failInfoMap.computeIfAbsent(personId, k -> new ArrayList<>()).add(checkFailInfo); + } + + @Override + public List checkWorkspace(BatchDeleteNodeUserCheckReq req) { + return new ArrayList<>(); + } +}