add - 为审批日志中的推测节点,添加推送人员的展示

This commit is contained in:
wangli 2023-12-11 18:26:21 +08:00
parent 5b5e088188
commit 18d7e84fd6
5 changed files with 82 additions and 4 deletions

View File

@ -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.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.util.List;
/** /**
* 流程实例下的节点信息 * 流程实例下的节点信息
* *
@ -40,5 +43,9 @@ public class ProcessNodeDetailVO {
*/ */
private BpmnButtonConf buttonConf; private BpmnButtonConf buttonConf;
/**
* 推测出来的审批人
*/
private List<BpmnTaskDelegateAssigner> forecastAssigners;
} }

View File

@ -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<List<BpmnTaskDelegateAssigner>>, 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<BpmnTaskDelegateAssigner> execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
List<Execution> list =
processEngineConfiguration.getRuntimeService().createExecutionQuery().processInstanceId(processInstanceId).list();
List<BpmnTaskDelegateAssigner> forecastAssigners = new ArrayList<>();
getApproverSpecify(userTask).ifPresent(specify -> {
forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask,
(DelegateExecution) list.get(0)));
});
return forecastAssigners;
}
}

View File

@ -18,13 +18,13 @@ import java.io.Serializable;
* @author wangli * @author wangli
* @since 2023/12/9 16:37 * @since 2023/12/9 16:37
*/ */
public class CustomEventAssignment implements Command<Void>, Serializable { public class CustomEventAssignmentCmd implements Command<Void>, Serializable {
private String processDefinitionId; private String processDefinitionId;
private String taskDefinitionKey; private String taskDefinitionKey;
private TaskEntity task; private TaskEntity task;
public CustomEventAssignment(String processDefinitionId, String taskDefinitionKey, TaskEntity task) { public CustomEventAssignmentCmd(String processDefinitionId, String taskDefinitionKey, TaskEntity task) {
this.processDefinitionId = processDefinitionId; this.processDefinitionId = processDefinitionId;
this.taskDefinitionKey = taskDefinitionKey; this.taskDefinitionKey = taskDefinitionKey;
this.task = task; this.task = task;
@ -32,7 +32,8 @@ public class CustomEventAssignment implements Command<Void>, Serializable {
@Override @Override
public Void execute(CommandContext commandContext) { public Void execute(CommandContext commandContext) {
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration(commandContext);
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId); BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
UserTask flowElement = (UserTask) bpmnModel.getFlowElement(taskDefinitionKey); UserTask flowElement = (UserTask) bpmnModel.getFlowElement(taskDefinitionKey);
processEngineConfiguration.getListenerNotificationHelper().executeTaskListeners(flowElement, task, processEngineConfiguration.getListenerNotificationHelper().executeTaskListeners(flowElement, task,

View File

@ -165,7 +165,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
* @param userTask 当前节点, 这个对象会包含配置元数据, 可以在该方法中或者基于 BpmnTaskAssigneeSelector 建一个抽象类, 做解析元数据公共方法 * @param userTask 当前节点, 这个对象会包含配置元数据, 可以在该方法中或者基于 BpmnTaskAssigneeSelector 建一个抽象类, 做解析元数据公共方法
* @return * @return
*/ */
private List<BpmnTaskDelegateAssigner> approverSelect(String type, UserTask userTask, DelegateExecution execution) { public List<BpmnTaskDelegateAssigner> approverSelect(String type, UserTask userTask, DelegateExecution execution) {
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>(); List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
// 如果开启了 mock 模式workflow.mock=true, 则直接返回 mock 的审批人 // 如果开启了 mock 模式workflow.mock=true, 则直接返回 mock 的审批人

View File

@ -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.exception.WorkflowEngineException;
import cn.axzo.workflow.core.common.utils.BpmnCollectionUtils; import cn.axzo.workflow.core.common.utils.BpmnCollectionUtils;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; 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.BpmnProcessDefinitionService;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.converter.BpmnHistoricProcessInstanceConverter; 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.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.runtime.ProcessInstanceQuery;
import org.flowable.form.api.FormInfo; import org.flowable.form.api.FormInfo;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -114,6 +117,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
private ProcessGraphicService graphicService; private ProcessGraphicService graphicService;
@Resource @Resource
private FlowNodeForecastService forecastService; private FlowNodeForecastService forecastService;
@Resource
private EngineExecutionStartListener engineExecutionStartListener;
@Resource
private SpringProcessEngineConfiguration springProcessEngineConfiguration;
@Override @Override
public HistoricProcessInstance getProcessInstanceByBusinessKey(String businessKey, @Nullable String tenantId, public HistoricProcessInstance getProcessInstanceByBusinessKey(String businessKey, @Nullable String tenantId,
@ -589,6 +596,19 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
} else if (userTask.getBehavior() instanceof UserTaskActivityBehavior) { } else if (userTask.getBehavior() instanceof UserTaskActivityBehavior) {
node.setNodeMode(BpmnFlowNodeMode.GENERAL); node.setNodeMode(BpmnFlowNodeMode.GENERAL);
} }
List<BpmnTaskDelegateAssigner> forecastAssigners =
springProcessEngineConfiguration.getCommandExecutor().execute(new CustomCalcAssigneeCmd(processInstanceId, userTask, engineExecutionStartListener));
node.setForecastAssigners(forecastAssigners);
// List<BpmnTaskDelegateAssigner> 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) { } else if (i instanceof ReceiveTask) {
ReceiveTask receiveTask = (ReceiveTask) i; ReceiveTask receiveTask = (ReceiveTask) i;
node.setId(receiveTask.getId()) node.setId(receiveTask.getId())