From 1aecc6dac35464b919e37197e987dddfd1ec972e Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 25 Aug 2025 16:26:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-4418)=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8E=A8=E6=B5=8B=E6=9C=AA=E6=9D=A5=E8=8A=82=E7=82=B9=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=97=B6=E7=9A=84=E6=8A=84=E9=80=81=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomCarbonCopyUserSelectorCmd.java | 40 ++++++++++++++-- .../EngineCarbonCopyEventListener.java | 5 +- .../impl/BpmnProcessInstanceServiceImpl.java | 22 ++++++--- .../BasedRoleV2TaskAssigneeSelector.java | 4 +- .../src/main/resources/convertorXML.bpmn | 48 +++++++++---------- 5 files changed, 81 insertions(+), 38 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java index 0a3a4eb15..4ee026a32 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCarbonCopyUserSelectorCmd.java @@ -13,7 +13,6 @@ import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.CustomProperty; import org.flowable.bpmn.model.ServiceTask; -import org.flowable.common.engine.impl.interceptor.Command; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; @@ -41,6 +40,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO; import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE; import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId; @@ -60,18 +60,20 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand carbons, ServiceTask serviceTask, EngineExecutionStartListener engineExecutionStartListener, BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter, String serviceVersion) { + public CustomCarbonCopyUserSelectorCmd(String processInstanceId, List carbons, ServiceTask serviceTask, EngineExecutionStartListener engineExecutionStartListener, BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter, String serviceVersion, Integer categoryVersion) { this.processInstanceId = processInstanceId; this.carbons = carbons; this.serviceTask = serviceTask; this.engineExecutionStartListener = engineExecutionStartListener; this.historicTaskInstanceConverter = historicTaskInstanceConverter; this.serviceVersion = serviceVersion; + this.categoryVersion = categoryVersion; } public CustomCarbonCopyUserSelectorCmd(String processInstanceId, List carbons, @@ -79,6 +81,7 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand execute(CommandContext commandContext) { + List assigners = new ArrayList<>(); + if (Objects.isNull(categoryVersion) || categoryVersion < 2) { + assigners.addAll(calcUserV1(commandContext)); + } else { + // v2 版本 + assigners.addAll(calcUserV2(commandContext)); + } + return getLimitedElementList(removeDuplicateByPersonId(assigners), CARBON_ASSIGNER_LIMIT_NUMBER); + } + + private List calcUserV2(CommandContext commandContext) { + ProcessEngineConfigurationImpl processEngineConfiguration = + CommandContextUtil.getProcessEngineConfiguration(commandContext); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List executions = new ArrayList<>(); + if (Objects.isNull(execution)) { + executions.addAll(runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list()); + } else { + executions.add((Execution) execution); + } + + List assigners = new ArrayList<>(); + getApproverSpecify(serviceTask).ifPresent(specify -> { + assigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), serviceTask, + (DelegateExecution) executions.get(0), false)); + }); + return assigners; + } + + private List calcUserV1(CommandContext commandContext) { if (CollectionUtils.isEmpty(carbons)) { return Collections.emptyList(); } @@ -159,7 +193,7 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand getApproverRelationUser(BpmnCarbonCopyConf carbon, diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineCarbonCopyEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineCarbonCopyEventListener.java index dce16737d..a3b5da8db 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineCarbonCopyEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineCarbonCopyEventListener.java @@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicReference; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs; +import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig; import static cn.axzo.workflow.core.listener.AbstractBpmnEventListener.parseProcessDefinitionKey; @@ -74,14 +75,14 @@ public class EngineCarbonCopyEventListener implements JavaDelegate { String processInstanceId = execution.getProcessInstanceId(); CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor(); Process mainProcess = ProcessDefinitionUtil.getBpmnModel(processDefinitionId).getMainProcess(); - + Integer categoryVersion = getCategoryVersion(mainProcess).orElse(0); ServiceTask serviceTask = (ServiceTask) mainProcess.getFlowElement(currentActivityId); List carbonUsers = new ArrayList<>(); getCarbonCopyConfigs(serviceTask).ifPresent(carbons -> { carbonUsers.addAll(commandExecutor.execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, carbons, serviceTask, engineExecutionStartListener, - historicTaskInstanceConverter, serviceVersion, execution))); + historicTaskInstanceConverter, serviceVersion, categoryVersion, execution))); }); RuntimeService runtimeService = diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java index 6197cf182..0707d90ae 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java @@ -221,6 +221,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs; +import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes; import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter; @@ -1050,6 +1051,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic String startNodeDefinitionKey, Boolean containSelf) { BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId()); + Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(1); List resultList = new ArrayList<>(flowElements.size()); // 发起人节点,也是一个 UserTask 节点, 所以这里默认就包含了发起人节点 flowElements.stream() @@ -1073,7 +1075,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic if (i instanceof UserTask) { parseUserTask(processInstanceId, (UserTask) i, node, nodeDefinitionKeys); } else if (i instanceof ServiceTask) { - parseServiceTask(processInstanceId, (ServiceTask) i, node, nodeDefinitionKeys); + parseServiceTask(processInstanceId, (ServiceTask) i, node, nodeDefinitionKeys, categoryVersion); } resultList.add(node); }); @@ -1081,17 +1083,23 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } private void parseServiceTask(String processInstanceId, ServiceTask i, ProcessNodeDetailVO - node, List skipTaskDefinitionKeys) { + node, List skipTaskDefinitionKeys, Integer categoryVersion) { // ServiceTask 主要作用于抄送 node.setId(i.getId()).setName(i.getName()); if (skipTaskDefinitionKeys.contains(i.getId())) { return; } - getCarbonCopyConfigs(i).ifPresent(carbons -> - node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor() - .execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, carbons, - i, engineExecutionStartListener, - historicTaskInstanceConverter, serviceVersion)))); + if (categoryVersion < 2) { + getCarbonCopyConfigs(i).ifPresent(carbons -> + node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor() + .execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, carbons, + i, engineExecutionStartListener, + historicTaskInstanceConverter, serviceVersion, categoryVersion)))); + } else { + getApproverSpecify(i).ifPresent(specify -> { + node.setForecastAssigners(engineExecutionStartListener.approverSelect(specify.getType(), i, null, false)); + }); + } } private void parseUserTask(String processInstanceId, UserTask i, ProcessNodeDetailVO diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java index 8cf007cd3..d8833c660 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java @@ -91,13 +91,13 @@ public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSel break; case within_the_project_construction_units: log.info("executing role v2 with within_the_project_construction_units"); - CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId())); + CooperateShipTypeEnum cooperateShipTypeEnum = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId())); v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder() .nodeId(orgDTO.getNodeId()) .upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode()) .crossDomain(true) - .cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name()))) + .cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(cooperateShipTypeEnum.name()))) .build()); break; case specified_org: diff --git a/workflow-engine-server/src/main/resources/convertorXML.bpmn b/workflow-engine-server/src/main/resources/convertorXML.bpmn index 860a323cd..4219f0d0e 100644 --- a/workflow-engine-server/src/main/resources/convertorXML.bpmn +++ b/workflow-engine-server/src/main/resources/convertorXML.bpmn @@ -89,7 +89,7 @@ - @@ -181,7 +181,7 @@ ${nrOfInstances != nrOfActiveInstances} - @@ -200,7 +200,7 @@ - @@ -293,9 +293,9 @@ ${nrOfInstances != nrOfActiveInstances} - - @@ -318,40 +318,40 @@ - - - - - - - + - - - - - + + + + + - + - + + + + + + +