From a8e40a692835b0317ab3054546239bace0ff4850 Mon Sep 17 00:00:00 2001 From: wangli Date: Wed, 13 Dec 2023 22:56:50 +0800 Subject: [PATCH] =?UTF-8?q?add=20-=20=E8=BD=AC=E4=BA=A4=E5=92=8C=E5=8A=A0?= =?UTF-8?q?=E7=AD=BE=E6=97=B6,=E9=99=90=E5=88=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B7=B2=E5=9C=A8=E5=AE=A1=E6=89=B9=E5=88=97=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/common/enums/BpmnErrorCode.java | 1 + .../impl/BpmnProcessTaskServiceImpl.java | 37 +++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java index e1f423e03..b4c6ad380 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/enums/BpmnErrorCode.java @@ -59,6 +59,7 @@ public enum BpmnErrorCode implements IProjectRespCode { TASK_REMIND_ERROR_NOT_EXISTS("06004", "当前审批节点没有待审批任务, 不能催办"), ACTIVITY_TRIGGER_NOT_EXISTS("06005", "触发 ID:【{}】不存在"), CALC_TASK_ASSIGNEE_ERROR("06006", "执行计算审批候选人出现异常: {}"), + ASSIGNEE_HAS_BEEN_EXISTS("06007", "你选择的人员已是审批人,请检查后提交"), // ========== form Model 07-001 ========== FORM_MODEL_NOT_EXISTS("07001", "表单模型不存在"), diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java index e2ace2006..fdb45daa9 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessTaskServiceImpl.java @@ -82,6 +82,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -110,6 +111,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCES import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.TRANSFER; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.valueOfStatus; +import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.ASSIGNEE_HAS_BEEN_EXISTS; import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_ID_NOT_EXISTS; import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.PROCESS_INSTANCE_NOT_EXISTS; import static cn.axzo.workflow.core.common.enums.BpmnErrorCode.TASK_APOSTILLE_NOT_SUPPORT; @@ -428,13 +430,10 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { } } - private void createSignSubTasksV2(BpmnTaskCountersignDTO countersignDTO, TaskEntity taskEntity) { + private void createSignSubTasksV2(BpmnTaskCountersignDTO countersignDTO, TaskEntity taskEntity, List taskAssignerListSnapshot) { // 这个节点下所有审批人快照 String activityListSnapshot = INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + taskEntity.getTaskDefinitionKey(); - List taskAssignerListSnapshot = - runtimeService.getVariable(taskEntity.getProcessInstanceId(), - activityListSnapshot, List.class); taskAssignerListSnapshot.addAll(countersignDTO.getTargetAssignerList()); runtimeService.setVariable(taskEntity.getProcessInstanceId(), activityListSnapshot, taskAssignerListSnapshot); log.info("正在进行加签任务:{},待加签人合并列表:{}", taskEntity.getId(), JSONUtil.toJsonStr(taskAssignerListSnapshot)); @@ -767,6 +766,13 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { public void transferTask(BpmnTaskAssigneeDTO dto) { Task task = checkTask(dto.getOriginAssigner().buildAssigneeId(), dto.getTaskId()); + List originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(), + INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class); + Optional exists = originAssingeeList.stream().filter(i -> Objects.equals(i.buildAssigneeId(), dto.getTargetAssigner().buildAssigneeId())).findAny(); + if (exists.isPresent()) { + throw new WorkflowEngineException(ASSIGNEE_HAS_BEEN_EXISTS); + } + task.setAssignee(TASK_ASSIGNEE_SKIP_FLAT); ((TaskEntity) task).setScopeType("TRANSFER"); taskService.saveTask(task); @@ -779,8 +785,6 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { } Authentication.setAuthenticatedUserId(null); - List originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(), - INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class); for (BpmnTaskDelegateAssigner assigner : originAssingeeList) { if (Objects.equals(assigner.buildAssigneeId(), dto.getOriginAssigner().buildAssigneeId())) { originAssingeeList.remove(assigner); @@ -823,6 +827,25 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { @Transactional(rollbackFor = Exception.class) public void countersignTask(BpmnTaskCountersignDTO dto) { Task task = checkTask(dto.getOriginAssigner().buildAssigneeId(), dto.getTaskId()); + + // 这个节点下所有审批人快照 + String activityListSnapshot = + INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(); + List taskAssignerListSnapshot = + runtimeService.getVariable(task.getProcessInstanceId(), + activityListSnapshot, List.class); + AtomicInteger existsCount = new AtomicInteger(); + taskAssignerListSnapshot.forEach(i -> { + dto.getTargetAssignerList().forEach(j -> { + if (Objects.equals(i.buildAssigneeId(), j.buildAssigneeId())) { + existsCount.getAndIncrement(); + } + }); + }); + if (existsCount.intValue() > 0) { + throw new WorkflowEngineException(ASSIGNEE_HAS_BEEN_EXISTS); + } + if (BpmnCountersignType.isValidAppType(dto.getCountersignType()) != null) { //加签不能改变BPMN2.0原流程定义,因为下一个流程实例,不需要加签 String parentTaskId = task.getParentTaskId(); @@ -856,7 +879,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService { //该父任务加签时,会创建子任务用于分配给其他人加签 //目前多个子任务时,会按照加签人的顺序依次进行加签操作, //例如 加签按顺序依次分配给A、B、C三人,需A任务进行完成后,进行B任务、再进行C任务 - this.createSignSubTasksV2(dto, (TaskEntity) task); + this.createSignSubTasksV2(dto, (TaskEntity) task, taskAssignerListSnapshot); } else { throw new WorkflowEngineException(TASK_APOSTILLE_NOT_SUPPORT); }