diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java index 774ae400c..333bdf36a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/process/ProcessNodeDetailVO.java @@ -2,9 +2,12 @@ package cn.axzo.workflow.common.model.response.bpmn.process; import cn.axzo.workflow.common.enums.BpmnFlowNodeMode; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import lombok.Data; import lombok.experimental.Accessors; +import java.util.List; + /** * 流程实例下的节点信息 * @@ -40,5 +43,9 @@ public class ProcessNodeDetailVO { */ private BpmnButtonConf buttonConf; + /** + * 推测出来的审批人 + */ + private List forecastAssigners; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCalcAssigneeCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCalcAssigneeCmd.java new file mode 100644 index 000000000..d98dd401b --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCalcAssigneeCmd.java @@ -0,0 +1,50 @@ +package cn.axzo.workflow.core.engine.cmd; + +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener; +import org.flowable.bpmn.model.UserTask; +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.engine.runtime.Execution; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify; + +/** + * TODO + * + * @author wangli + * @since 2023/12/11 17:56 + */ +public class CustomCalcAssigneeCmd implements Command>, Serializable { + private String processInstanceId; + private UserTask userTask; + private EngineExecutionStartListener engineExecutionStartListener; + + public CustomCalcAssigneeCmd(String processInstanceId, UserTask userTask, + EngineExecutionStartListener engineExecutionStartListener) { + this.processInstanceId = processInstanceId; + this.userTask = userTask; + this.engineExecutionStartListener = engineExecutionStartListener; + } + + @Override + public List execute(CommandContext commandContext) { + ProcessEngineConfigurationImpl processEngineConfiguration = + CommandContextUtil.getProcessEngineConfiguration(commandContext); + List list = + processEngineConfiguration.getRuntimeService().createExecutionQuery().processInstanceId(processInstanceId).list(); + List forecastAssigners = new ArrayList<>(); + getApproverSpecify(userTask).ifPresent(specify -> { + forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask, + (DelegateExecution) list.get(0))); + }); + return forecastAssigners; + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignment.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignmentCmd.java similarity index 84% rename from workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignment.java rename to workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignmentCmd.java index af482b7d7..76d6e6318 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignment.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomEventAssignmentCmd.java @@ -18,13 +18,13 @@ import java.io.Serializable; * @author wangli * @since 2023/12/9 16:37 */ -public class CustomEventAssignment implements Command, Serializable { +public class CustomEventAssignmentCmd implements Command, Serializable { private String processDefinitionId; private String taskDefinitionKey; private TaskEntity task; - public CustomEventAssignment(String processDefinitionId, String taskDefinitionKey, TaskEntity task) { + public CustomEventAssignmentCmd(String processDefinitionId, String taskDefinitionKey, TaskEntity task) { this.processDefinitionId = processDefinitionId; this.taskDefinitionKey = taskDefinitionKey; this.task = task; @@ -32,7 +32,8 @@ public class CustomEventAssignment implements Command, Serializable { @Override public Void execute(CommandContext commandContext) { - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); + ProcessEngineConfigurationImpl processEngineConfiguration = + CommandContextUtil.getProcessEngineConfiguration(commandContext); BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId); UserTask flowElement = (UserTask) bpmnModel.getFlowElement(taskDefinitionKey); processEngineConfiguration.getListenerNotificationHelper().executeTaskListeners(flowElement, task, diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java index f7b4f6273..8b6781a32 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java @@ -165,7 +165,7 @@ public class EngineExecutionStartListener implements ExecutionListener { * @param userTask 当前节点, 这个对象会包含配置元数据, 可以在该方法中或者基于 BpmnTaskAssigneeSelector 建一个抽象类, 做解析元数据公共方法 * @return */ - private List approverSelect(String type, UserTask userTask, DelegateExecution execution) { + public List approverSelect(String type, UserTask userTask, DelegateExecution execution) { List assigners = new ArrayList<>(); // 如果开启了 mock 模式(workflow.mock=true), 则直接返回 mock 的审批人 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 6a1caccf9..2c8cbfe5a 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 @@ -19,6 +19,8 @@ import cn.axzo.workflow.core.common.enums.BpmnProcessTaskResultEnum; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.common.utils.BpmnCollectionUtils; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; +import cn.axzo.workflow.core.engine.cmd.CustomCalcAssigneeCmd; +import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener; import cn.axzo.workflow.core.service.BpmnProcessDefinitionService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import cn.axzo.workflow.core.service.converter.BpmnHistoricProcessInstanceConverter; @@ -51,6 +53,7 @@ import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.form.api.FormInfo; +import org.flowable.spring.SpringProcessEngineConfiguration; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -114,6 +117,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic private ProcessGraphicService graphicService; @Resource private FlowNodeForecastService forecastService; + @Resource + private EngineExecutionStartListener engineExecutionStartListener; + @Resource + private SpringProcessEngineConfiguration springProcessEngineConfiguration; @Override public HistoricProcessInstance getProcessInstanceByBusinessKey(String businessKey, @Nullable String tenantId, @@ -589,6 +596,19 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } else if (userTask.getBehavior() instanceof UserTaskActivityBehavior) { node.setNodeMode(BpmnFlowNodeMode.GENERAL); } + List forecastAssigners = + springProcessEngineConfiguration.getCommandExecutor().execute(new CustomCalcAssigneeCmd(processInstanceId, userTask, engineExecutionStartListener)); + node.setForecastAssigners(forecastAssigners); + // List forecastAssigners = new ArrayList<>(); + // DelegateExecution execution = (DelegateExecution) runtimeService + // .createExecutionQuery().processInstanceId(processInstanceId) + // .activityId(userTask.getId()).singleResult(); + + // getApproverSpecify(userTask).ifPresent(specify -> { + // forecastAssigners.addAll(engineExecutionStartListener + // .approverSelect(specify.getType(), userTask, + // (DelegateExecution) list.get(0))); + // }); } else if (i instanceof ReceiveTask) { ReceiveTask receiveTask = (ReceiveTask) i; node.setId(receiveTask.getId())