From 60711c5a720f9ada0d4340794189558a35314f6d Mon Sep 17 00:00:00 2001 From: song-cc-rock Date: Mon, 18 May 2026 15:07:58 +0800 Subject: [PATCH] feat: Approval exception handler --- .../approval/constants/ApprovalStatus.java | 8 +- .../service/ApprovalActionService.java | 110 ++++++++++- .../approval/service/ApprovalFlowService.java | 179 +++++++++++++----- .../service/ApprovalInstanceService.java | 2 +- .../service/ApprovalResourceService.java | 2 +- .../crm/system/service/UserExtendService.java | 2 +- 6 files changed, 244 insertions(+), 59 deletions(-) diff --git a/backend/crm/src/main/java/cn/cordys/crm/approval/constants/ApprovalStatus.java b/backend/crm/src/main/java/cn/cordys/crm/approval/constants/ApprovalStatus.java index 071daa240b..d9c02f9454 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/approval/constants/ApprovalStatus.java +++ b/backend/crm/src/main/java/cn/cordys/crm/approval/constants/ApprovalStatus.java @@ -16,5 +16,11 @@ public enum ApprovalStatus { /** 已驳回 */ UNAPPROVED, /** 已撤销 */ - REVOKED + REVOKED, + + // 扩展项 + /** 自动通过 */ + AUTO_APPROVED, + /** 自动拒绝 */ + AUTO_UNAPPROVED } diff --git a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalActionService.java b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalActionService.java index c37e655906..8551cdb071 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalActionService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalActionService.java @@ -326,6 +326,7 @@ private void approvedProcess(ApprovalTask currentTask, String currentUserId, Str appendProcessSignTask(currentTask); // 多人依次审批类型的待办 + List multiSeqApprovalTasks = new ArrayList<>(); ApprovalNodeApprover nodeApprover = getNodeApprover(currentTask.getNodeId()); if (MultiApproverModeEnum.valueOf(nodeApprover.getMultiApproverMode()) == MultiApproverModeEnum.SEQUENTIAL) { // 依次审批, 如果存在审批中任务则跳过 @@ -337,8 +338,23 @@ private void approvedProcess(ApprovalTask currentTask, String currentUserId, Str if (approvingTasks.isEmpty()) { User nextUser = getMultiSeqNextOne(currentTask.getNodeId(), currentTask.getInstanceId(), currentOrgId); if (nextUser != null) { - ApprovalTask multiSeqNextTask = buildTask(currentTask.getNodeId(), currentTask.getInstanceId(), nextUser.getId(), ApprovalTaskType.NL.name(), currentUserId, currentTask.getNodeRound()); - approvalTaskMapper.insert(multiSeqNextTask); + ApprovalTask nextTask = buildTask(currentTask.getNodeId(), currentTask.getInstanceId(), nextUser.getId(), ApprovalTaskType.NL.name(), currentUserId, currentTask.getNodeRound()); + // 如果配置审批人提审人相同跳过 + SameSubmitterActionEnum sameAction = SameSubmitterActionEnum.valueOf(nodeApprover.getSameSubmitterAction()); + ApprovalInstance instance = approvalInstanceMapper.selectByPrimaryKey(currentTask.getInstanceId()); + if (sameAction == SameSubmitterActionEnum.SKIP && Strings.CI.equals(nextUser.getId(), instance.getSubmitterId())) { + nextTask.setAction(ApprovalAction.APPROVE.name()); + nextTask.setStatus(ApprovalStatus.AUTO_APPROVED.name()); + approvalFlowService.saveAutoRecord(currentTask.getInstanceId(), currentTask.getNodeId(), ApprovalStatus.AUTO_APPROVED, "审批人与提交人为同一人时, 自动同意跳过", nextTask.getId()); + // 依次审批下一位自动同意跳过, 发送下下一个位次的待办 + User nextPlusUser = getMultiSeqNextPlusOne(currentTask.getNodeId(), currentTask.getInstanceId(), currentOrgId); + if (nextPlusUser != null) { + ApprovalTask nextNextTask = buildTask(currentTask.getNodeId(), currentTask.getInstanceId(), nextPlusUser.getId(), ApprovalTaskType.NL.name(), currentUserId, currentTask.getNodeRound()); + multiSeqApprovalTasks.add(nextNextTask); + } + } + multiSeqApprovalTasks.add(nextTask); + approvalTaskMapper.batchInsert(multiSeqApprovalTasks); } } } @@ -600,6 +616,29 @@ private User getMultiSeqNextOne(String nodeId, String instanceId, String current return null; } + /** + * 获取多人依次审批下下一个审批人 + * @param nodeId 节点ID + * @param instanceId 实例ID + * @param currentOrgId 组织ID + * @return 下一个审批人 + */ + private User getMultiSeqNextPlusOne(String nodeId, String instanceId, String currentOrgId) { + ApprovalInstance instance = approvalInstanceMapper.selectByPrimaryKey(instanceId); + List approvers = approvalFlowService.getCurrentNodeApproverList(nodeId, instance.getSubmitterId(), currentOrgId); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ApprovalTask::getNodeId, nodeId) + .eq(ApprovalTask::getInstanceId, instanceId) + .eq(ApprovalTask::getType, ApprovalTaskType.NL.name()) + .eq(ApprovalTask::getStatus, ApprovalStatus.APPROVED.name()); + List approvedTask = approvalTaskMapper.selectListByLambda(queryWrapper); + if (approvedTask.size() < approvers.size()) { + // 依次审批, 返回下下一个审批人 + return approvers.get(approvedTask.size() + 1); + } + return null; + } + /** * 获取多人依次审批当前用户下一个审批人 * @param nodeId 节点ID @@ -845,7 +884,7 @@ private void handleNextApprovalNode(ApprovalNodeResponse node, ApprovalInstance resourceService.updateResourceApprovalStatus(FormKey.ofKey(instance.getType()), instance.getResourceId(), instance.getApprovalStatus()); } if (ApprovalNodeTypeEnum.valueOf(node.getNodeType()) == ApprovalNodeTypeEnum.APPROVER) { - List approvalTasks = getNodeApproverTasks((ApprovalNodeApproverResponse) node, instance.getId(), currentUserId, ApprovalTaskType.NL.name()); + List approvalTasks = getNodeApproverTasks((ApprovalNodeApproverResponse) node, instance.getId(), currentUserId, ApprovalTaskType.NL.name(), instance.getSubmitterId()); List ccTasks = getNodeCcTasks((ApprovalNodeApproverResponse) node, instance.getId(), currentUserId); List allTasks = ListUtils.union(approvalTasks, ccTasks); if (CollectionUtils.isNotEmpty(allTasks)) { @@ -888,17 +927,68 @@ public String selectBusinessName(FormKey formKey, String resourceId) { * @param taskType 任务类型 * @return 待办任务集合 */ - public List getNodeApproverTasks(ApprovalNodeApproverResponse approverNode, String instanceId, String userId, String taskType) { + public List getNodeApproverTasks(ApprovalNodeApproverResponse approverNode, String instanceId, String userId, String taskType, String submitter) { List approvalTasks = new ArrayList<>(); if (approverNode == null) { return approvalTasks; } Integer nextRound = extApprovalInstanceMapper.getNextNodeRound(instanceId, approverNode.getId()); - if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(approverNode.getApproverList())) { - approverNode.getApproverList().forEach(approver -> { - ApprovalTask approvalTask = buildTask(approverNode.getId(), instanceId, approver, taskType, userId, nextRound); - approvalTasks.add(approvalTask); - }); + if (CollectionUtils.isNotEmpty(approverNode.getApproverList())) { + MultiApproverModeEnum multiMode = MultiApproverModeEnum.valueOf(approverNode.getMultiApproverMode()); + SameSubmitterActionEnum sameAction = SameSubmitterActionEnum.valueOf(approverNode.getSameSubmitterAction()); + if (sameAction == SameSubmitterActionEnum.SKIP) { + // 如果配置了审批人和提审人相同, 自动跳过 (会签, 依次审批 生成的提审人待办需直接同意, 或签和单人审批已在流程执行的时候处理过) + switch (multiMode) { + case SEQUENTIAL -> { + // 依次审批只需要发送第一个人的待办 + String firstApprover = approverNode.getApproverList().get(0); + ApprovalTask firstTask = buildTask(approverNode.getId(), instanceId, firstApprover, taskType, userId, nextRound); + if (Strings.CI.equals(firstApprover, submitter)) { + // 自动跳过该审批人 + firstTask.setAction(ApprovalAction.APPROVE.name()); + firstTask.setStatus(ApprovalStatus.AUTO_APPROVED.name()); + approvalFlowService.saveAutoRecord(instanceId, approverNode.getId(), ApprovalStatus.AUTO_APPROVED, "审批人与提交人为同一人时, 自动同意跳过", firstTask.getId()); + // 第一个需要自动同意跳过, 发送第二个人待办 + String secondApprover = approverNode.getApproverList().get(1); + if (StringUtils.isNotBlank(secondApprover)) { + ApprovalTask secondTask = buildTask(approverNode.getId(), instanceId, secondApprover, taskType, userId, nextRound); + approvalTasks.add(secondTask); + } + } + approvalTasks.add(firstTask); + } + case ALL -> { + // 如果是会签, 需要发送所有审批人的待办 + approverNode.getApproverList().forEach(approver -> { + ApprovalTask approvalTask = buildTask(approverNode.getId(), instanceId, approver, taskType, userId, nextRound); + if (Strings.CI.equals(approver, submitter)) { + // 自动跳过该审批人 + approvalTask.setAction(ApprovalAction.APPROVE.name()); + approvalTask.setStatus(ApprovalStatus.AUTO_APPROVED.name()); + approvalFlowService.saveAutoRecord(instanceId, approverNode.getId(), ApprovalStatus.AUTO_APPROVED, "审批人与提交人为同一人时, 自动同意跳过", approvalTask.getId()); + } + approvalTasks.add(approvalTask); + }); + } + default -> { + + } + } + } else { + // 并未配置自动跳过的逻辑, 正常逻辑 + if (multiMode == MultiApproverModeEnum.SEQUENTIAL) { + // 依次审批只需要发送第一个人的待办 + String firstApprover = approverNode.getApproverList().getFirst(); + ApprovalTask firstTask = buildTask(approverNode.getId(), instanceId, firstApprover, taskType, userId, nextRound); + approvalTasks.add(firstTask); + } else { + // 会签, 或签需要发送所有待办 + approverNode.getApproverList().forEach(approver -> { + ApprovalTask approvalTask = buildTask(approverNode.getId(), instanceId, approver, taskType, userId, nextRound); + approvalTasks.add(approvalTask); + }); + } + } } return approvalTasks; } @@ -909,7 +999,7 @@ public List getNodeCcTasks(ApprovalNodeApproverResponse approverNo return approvalTasks; } Integer nextRound = extApprovalInstanceMapper.getNextNodeRound(instanceId, approverNode.getId()); - if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(approverNode.getCcList())) { + if (CollectionUtils.isNotEmpty(approverNode.getCcList())) { approverNode.getCcList().forEach(cc -> { ApprovalTask approvalTask = buildTask(approverNode.getId(), instanceId, cc, ApprovalTaskType.CC.name(), userId, nextRound); approvalTasks.add(approvalTask); diff --git a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java index 6bc26021c1..c2e9d5b81b 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalFlowService.java @@ -56,6 +56,7 @@ import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service @Transactional(rollbackFor = Exception.class) @@ -96,6 +97,8 @@ public class ApprovalFlowService { @Resource private BaseMapper approvalRecordMapper; @Resource + private BaseMapper approvalTaskMapper; + @Resource private ModuleFormService formService; @Resource private UserViewService userViewService; @@ -1679,57 +1682,110 @@ private ApprovalNodeResponse getNextNodeWithExceptionHandler(ApprovalInstance in if (ApprovalNodeTypeEnum.valueOf(nextNode.getNodeType()) == ApprovalNodeTypeEnum.END) { return nextNode; } + if (ApprovalNodeTypeEnum.valueOf(nextNode.getNodeType()) == ApprovalNodeTypeEnum.APPROVER) { - ApprovalNodeApproverResponse nextApproverNode = (ApprovalNodeApproverResponse) nextNode; - if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_PASS) { - // 自动通过, 插入审批记录, 获取下一个节点 - saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.APPROVED, null); - return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); + return handleNextApproverNodeWithExceptionHandler(instance, nextNode, fieldValues, currentOrgId); + } + // 条件类型节点, 继续往下获取 + return getNextNodeWithExceptionHandler(instance, nodeId, fieldValues, currentOrgId); + } + + /** + * 处理实例下一个审批节点,包含异常处 + * @param instance 审批实例 + * @param nextNode 下一个审批节点 + * @param fieldValues 资源业务字段值 + * @param currentOrgId 当前组织ID + * @return 下一个节点 (审批节点) + */ + private ApprovalNodeResponse handleNextApproverNodeWithExceptionHandler(ApprovalInstance instance, ApprovalNodeResponse nextNode, List fieldValues, String currentOrgId) { + ApprovalNodeApproverResponse nextApproverNode = (ApprovalNodeApproverResponse) nextNode; + if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_PASS) { + // 自动通过, 插入审批记录, 获取下一个节点 + saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.AUTO_APPROVED, null, null); + return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); + } + if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_REJECT) { + // 自动驳回, 插入审批记录 + saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.AUTO_UNAPPROVED, null, null); + ApprovalNodeExceptionResponse exNode = BeanUtils.copyBean(new ApprovalNodeExceptionResponse(), nextApproverNode); + exNode.setNodeType(ApprovalNodeTypeEnum.EXCEPTION.name()); + return exNode; + } + // 人工审批, 异常处理 + List nextApprovers = getCurrentNodeApproverList(nextApproverNode.getApproverType(), nextApproverNode.getApproverList(), instance.getSubmitterId(), currentOrgId); + List nextCcList = getCurrentNodeCcList(nextApproverNode.getCcType(), nextApproverNode.getCcList(), instance.getSubmitterId(), currentOrgId); + nextApproverNode.setApproverList(nextApprovers.stream().map(User::getId).distinct().collect(Collectors.toList())); + nextApproverNode.setCcList(nextCcList.stream().map(User::getId).distinct().collect(Collectors.toList())); + + // 审批人为空时 + if (CollectionUtils.isEmpty(nextApprovers)) { + EmptyApproverActionEnum emptyAction = EmptyApproverActionEnum.valueOf(nextApproverNode.getEmptyApproverAction()); + switch (emptyAction) { + case AUTO_PASS -> { + // 自动通过, 插入审批记录, 获取下一个节点 + saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.AUTO_APPROVED, "审批人为空,自动通过", null); + return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); + } + case ASSIGN_SPECIFIC -> { + //指定人员处理: 返回人员列表 + nextApproverNode.setApproverType(ApproverTypeEnum.MEMBER.name()); + nextApproverNode.setApproverList(List.of(nextApproverNode.getFallbackApprover())); + } + case ASSIGN_ADMIN -> { + //审批管理员:返回人员 + nextApproverNode.setApproverType(ApproverTypeEnum.MEMBER.name()); + nextApproverNode.setApproverList(List.of(nextApproverNode.getFallbackApprover())); + } + default -> { + + } } - if (ApprovalTypeEnum.valueOf(nextApproverNode.getApprovalType()) == ApprovalTypeEnum.AUTO_REJECT) { - // 自动驳回, 插入审批记录 - saveAutoRecord(instance.getId(), nodeId, ApprovalStatus.UNAPPROVED, null); - ApprovalNodeExceptionResponse exNode = BeanUtils.copyBean(new ApprovalNodeExceptionResponse(), nextApproverNode); - exNode.setNodeType(ApprovalNodeTypeEnum.EXCEPTION.name()); - return exNode; + } + + // 审批人与提交人同一人时 + Optional findSame = nextApproverNode.getApproverList().stream().filter(approver -> Strings.CS.equals(approver, instance.getSubmitterId())).findAny(); + if (findSame.isEmpty()) { + return nextApproverNode; + } + SameSubmitterActionEnum sameAction = SameSubmitterActionEnum.valueOf(nextApproverNode.getSameSubmitterAction()); + switch (sameAction) { + case ASSIGN_SUPERIOR -> { + // 转交给直属上级审批 + OrganizationUser criteria = new OrganizationUser(); + criteria.setUserId(findSame.get()); + criteria.setOrganizationId(currentOrgId); + OrganizationUser currentUser = organizationUserMapper.selectOne(criteria); + if (currentUser != null && StringUtils.isNotEmpty(currentUser.getSupervisorId())) { + // 替换审批人列表中与提审人相同审批人 => 直属上级 + String supervisorId = currentUser.getSupervisorId(); + List newApproverList = nextApproverNode.getApproverList().stream() + .map(approver -> Strings.CS.equals(approver, instance.getSubmitterId()) ? supervisorId : approver) + .collect(Collectors.toList()); + nextApproverNode.setApproverList(newApproverList); + } } - // 人工审批, 异常处理 - List nextApprovers = getCurrentNodeApproverList(nextApproverNode.getApproverType(), nextApproverNode.getApproverList(), instance.getSubmitterId(), currentOrgId); - List nextCcList = getCurrentNodeCcList(nextApproverNode.getCcType(), nextApproverNode.getCcList(), instance.getSubmitterId(), currentOrgId); - nextApproverNode.setApproverList(nextApprovers.stream().map(User::getId).collect(Collectors.toList())); - nextApproverNode.setCcList(nextCcList.stream().map(User::getId).collect(Collectors.toList())); - // 审批人为空 - if (CollectionUtils.isEmpty(nextApprovers)) { - EmptyApproverActionEnum emptyAction = EmptyApproverActionEnum.valueOf(nextApproverNode.getEmptyApproverAction()); - switch (emptyAction) { - case AUTO_PASS -> { - // 自动通过, 插入审批记录, 获取下一个节点 - saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.APPROVED, "审批人为空,自动通过"); - return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); - } - case ASSIGN_SPECIFIC -> { - //指定人员处理: 返回人员列表 - nextApproverNode.setApproverType(ApproverTypeEnum.MEMBER.name()); - nextApproverNode.setApproverList(List.of(nextApproverNode.getFallbackApprover())); - return nextApproverNode; - } - case ASSIGN_ADMIN -> { - //审批管理员:返回人员 - nextApproverNode.setApproverType(ApproverTypeEnum.MEMBER.name()); - nextApproverNode.setApproverList(List.of(nextApproverNode.getFallbackApprover())); - return nextApproverNode; - } - default -> { - return nextApproverNode; - } + case SKIP -> { + // 自动跳过 + if (nextApproverNode.getApproverList().size() == 1) { + // 如果刚好为单人审批, 直接插入待办任务和记录, 流转到下一个节点 + ApprovalTask autoTask = saveAutoTask(instance.getId(), nextApproverNode.getId(), findSame.get(), ApprovalStatus.APPROVED); + saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.AUTO_APPROVED, "审批人与提交人为同一人时, 自动同意跳过", autoTask.getId()); + return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); + } + if (MultiApproverModeEnum.valueOf(nextApproverNode.getMultiApproverMode()) == MultiApproverModeEnum.ANY) { + // 如果为多人或签, 插入待办任务和记录, 且需要流转到下一个节点 + ApprovalTask autoTask = saveAutoTask(instance.getId(), nextApproverNode.getId(), findSame.get(), ApprovalStatus.APPROVED); + saveAutoRecord(instance.getId(), nextApproverNode.getId(), ApprovalStatus.AUTO_APPROVED, "审批人与提交人为同一人时, 自动同意跳过", autoTask.getId()); + return getNextNodeWithExceptionHandler(instance, nextApproverNode.getId(), fieldValues, currentOrgId); } } - // TODO: 审批人与提交人同一人时 + default -> { - return nextApproverNode; + } } - // 条件类型节点, 继续往下获取 - return getNextNodeWithExceptionHandler(instance, nodeId, fieldValues, currentOrgId); + + return nextApproverNode; } /** @@ -1739,10 +1795,43 @@ private ApprovalNodeResponse getNextNodeWithExceptionHandler(ApprovalInstance in * @param nodeId 节点ID * @param approvalStatus 审批状态 */ - private void saveAutoRecord(String instanceId, String nodeId, ApprovalStatus approvalStatus, String comment) { + private ApprovalTask saveAutoTask(String instanceId, String nodeId, String approver, ApprovalStatus approvalStatus) { + Integer nextRound = extApprovalInstanceMapper.getNextNodeRound(instanceId, nodeId); + ApprovalTask task = new ApprovalTask(); + task.setId(IDGenerator.nextStr()); + task.setInstanceId(instanceId); + task.setNodeId(nodeId); + task.setNodeRound(nextRound); + task.setApproverId(approver); + task.setType(ApprovalTaskType.NL.name()); + task.setStatus(approvalStatus.name()); + if (approvalStatus == ApprovalStatus.AUTO_APPROVED) { + task.setAction(ApprovalAction.APPROVE.name()); + } else { + task.setAction(ApprovalAction.REJECT.name()); + } + task.setCreateTime(System.currentTimeMillis()); + task.setCreateUser(InternalUser.ADMIN.getValue()); + task.setUpdateTime(System.currentTimeMillis()); + task.setUpdateUser(InternalUser.ADMIN.getValue()); + approvalTaskMapper.insert(task); + return task; + } + + /** + * 自动审批的记录 + * + * @param instanceId 实例ID + * @param nodeId 节点ID + * @param approvalStatus 审批状态 + */ + public void saveAutoRecord(String instanceId, String nodeId, ApprovalStatus approvalStatus, String comment, String taskId) { Integer nextRound = extApprovalInstanceMapper.getNextNodeRound(instanceId, nodeId); ApprovalRecord record = new ApprovalRecord(); record.setId(IDGenerator.nextStr()); + if (StringUtils.isNotBlank(taskId)) { + record.setTaskId(taskId); + } record.setInstanceId(instanceId); record.setNodeId(nodeId); record.setNodeRound(nextRound); diff --git a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java index 0c8b258324..31129c058b 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalInstanceService.java @@ -105,7 +105,7 @@ private List getAllTasks(ApprovalInstance latestInstance) { */ private Map> getAddSignMap(List taskIds) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ApprovalAddSignTask::getRootTaskId, taskIds); + wrapper.in(ApprovalAddSignTask::getRootTaskId, taskIds); List approvalAddSignTasks = approvalAddSignTaskMapper.selectListByLambda(wrapper); return approvalAddSignTasks.stream().collect(Collectors.groupingBy(ApprovalAddSignTask::getSignTaskId)); } diff --git a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalResourceService.java b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalResourceService.java index 55481a4b19..719fc41c4f 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalResourceService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/approval/service/ApprovalResourceService.java @@ -254,7 +254,7 @@ public void push(ApprovalResourceBaseParam param, String currentOrgId, String cu updateResourceApprovalStatus(FormKey.ofKey(param.getFormKey()), param.getResourceId(), ApprovalStatus.APPROVING.name()); approvalInstanceMapper.insert(instance); ApprovalNodeApproverResponse approverNode = (ApprovalNodeApproverResponse) firstApprovalNode; - List approvalTasks = approvalActionService.getNodeApproverTasks(approverNode, instance.getId(), currentUserId, null); + List approvalTasks = approvalActionService.getNodeApproverTasks(approverNode, instance.getId(), currentUserId, null, instance.getSubmitterId()); List ccTasks = approvalActionService.getNodeCcTasks(approverNode, instance.getId(), currentUserId); List allTasks = ListUtils.union(approvalTasks, ccTasks); if (CollectionUtils.isNotEmpty(allTasks)) { diff --git a/backend/crm/src/main/java/cn/cordys/crm/system/service/UserExtendService.java b/backend/crm/src/main/java/cn/cordys/crm/system/service/UserExtendService.java index 7c3641c7d3..8a56b0ce91 100644 --- a/backend/crm/src/main/java/cn/cordys/crm/system/service/UserExtendService.java +++ b/backend/crm/src/main/java/cn/cordys/crm/system/service/UserExtendService.java @@ -381,7 +381,7 @@ private void collectDeptNodes(List nodes, Map dept public Map getAllUserSimpleMap() { List userExtends = userExtendMapper.selectAll(null); List users = userMapper.selectAll(null); - Map avatarMap = userExtends.stream().collect(Collectors.toMap(UserExtend::getId, UserExtend::getAvatar)); + Map avatarMap = userExtends.stream().filter(userExtend -> StringUtils.isNotBlank(userExtend.getAvatar())).collect(Collectors.toMap(UserExtend::getId, UserExtend::getAvatar)); List simples = users.stream().map(user -> new UserSimple(user.getId(), user.getName(), avatarMap.get(user.getId()))).toList(); return simples.stream().collect(Collectors.toMap(UserSimple::getId, u -> u)); }