diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java index 7e6444fb2a..add4529ad3 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/definition/BpmAutoApproveType.java @@ -15,6 +15,7 @@ import java.util.Arrays; @AllArgsConstructor public enum BpmAutoApproveType implements IntArrayValuable { + // TODO @lesan:0、1、/2 会不会好理解一点哈。 NONE(1, "不自动通过"), APPROVE_ALL(2, "仅审批一次,后续重复的审批节点均自动通过"), APPROVE_SEQUENT(3, "仅针对连续审批的节点自动通过"); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java index 6416e30cd1..4effd29989 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessDefinitionInfoDO.java @@ -164,6 +164,8 @@ public class BpmProcessDefinitionInfoDO extends BaseDO { /** * 自动去重类型 + * + * 枚举 {@link cn.iocoder.yudao.module.bpm.enums.definition.BpmAutoApproveType} */ private Integer autoApprovalType; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java index ceb0fccdd4..304cda3d8c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/redis/RedisKeyConstants.java @@ -10,6 +10,6 @@ public interface RedisKeyConstants { /** * 流程 ID 的缓存 */ - String BPM_PROCESS_ID = "bpm:process_id:seq_no:"; + String BPM_PROCESS_ID = "bpm:process_id:"; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java index 38d99b71d8..ce1e029e3a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java @@ -1172,51 +1172,50 @@ public class BpmTaskServiceImpl implements BpmTaskService { log.error("[processTaskAssigned][taskId({}) 没有找到流程实例]", task.getId()); return; } - // 自动去重 TODO @芋艿 驳回的情况得考虑一下 + + // 自动去重,通过自动审批的方式 TODO @芋艿 驳回的情况得考虑一下;@lesan:驳回后,又自动审批么? BpmProcessDefinitionInfoDO processDefinitionInfo = bpmProcessDefinitionService.getProcessDefinitionInfo(task.getProcessDefinitionId()); if (processDefinitionInfo == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到流程定义]", task.getId()); + log.error("[processTaskAssigned][taskId({}) 没有找到流程定义({})]", task.getId(), task.getProcessDefinitionId()); return; } if (processDefinitionInfo.getAutoApprovalType() != null) { - HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() + HistoricTaskInstanceQuery sameAssigneeQuery = historyService.createHistoricTaskInstanceQuery() .processInstanceId(task.getProcessInstanceId()) - .taskAssignee(task.getAssignee()) - .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, - BpmTaskStatusEnum.APPROVE.getStatus()) + .taskAssignee(task.getAssignee()) // 相同审批人 + .taskVariableValueEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS, BpmTaskStatusEnum.APPROVE.getStatus()) .finished(); - if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType())){ - long count = query.count(); - if (count > 0) { - // 自动通过 - getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) - .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); - return; - } + if (BpmAutoApproveType.APPROVE_ALL.getType().equals(processDefinitionInfo.getAutoApprovalType()) + && sameAssigneeQuery.count() > 0) { + getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) + .setReason(BpmAutoApproveType.APPROVE_ALL.getName())); + return; } if (BpmAutoApproveType.APPROVE_SEQUENT.getType().equals(processDefinitionInfo.getAutoApprovalType())) { BpmnModel bpmnModel = modelService.getBpmnModelByDefinitionId(processInstance.getProcessDefinitionId()); if (bpmnModel == null) { - log.error("[processTaskAssigned][taskId({}) 没有找到流程模型]", task.getId()); + log.error("[processTaskAssigned][taskId({}) 没有找到流程模型({})]", task.getId(), task.getProcessDefinitionId()); return; } + // TODO @lesan:这里的逻辑,要不在 BpmnModelUtils 抽个方法???尽量收敛 FlowNode taskElement = (FlowNode) BpmnModelUtils.getFlowElementById(bpmnModel, task.getTaskDefinitionKey()); List incomingFlows = taskElement.getIncomingFlows(); List sourceTaskIds = new ArrayList<>(); + // TODO @lesan:这种 CollUtil.isnotempty 简化 if (incomingFlows != null && !incomingFlows.isEmpty()) { + // TODO @lesan:这种,idea 一般会告警,可以处理掉哈。一切警告,皆是错误 incomingFlows.forEach(flow -> { sourceTaskIds.add(flow.getSourceRef()); }); } - long count = query.taskDefinitionKeys(sourceTaskIds).count(); - if (count > 0) { - // 自动通过 + if (sameAssigneeQuery.taskDefinitionKeys(sourceTaskIds).count() > 0) { getSelf().approveTask(Long.valueOf(task.getAssignee()), new BpmTaskApproveReqVO().setId(task.getId()) .setReason(BpmAutoApproveType.APPROVE_SEQUENT.getName())); return; } } } + // 审批人与提交人为同一人时,根据 BpmUserTaskAssignStartUserHandlerTypeEnum 策略进行处理 if (StrUtil.equals(task.getAssignee(), processInstance.getStartUserId())) { // 判断是否为退回或者驳回:如果是退回或者驳回不走这个策略