update - 优化已完成的历史实例的节点推测

This commit is contained in:
wangli 2024-04-19 00:35:41 +08:00
parent 6cb1baf326
commit 2f12bfe489
2 changed files with 32 additions and 8 deletions

View File

@ -111,6 +111,7 @@ import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.GENERAL;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.OR;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_ID_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_SUSPENDED;
@ -781,7 +782,23 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
ProcessInstance instance = query.singleResult();
List<FlowElement> flowElements = forecastService.performProcessForecasting(processInstanceId, instance);
BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId());
String processDefinitionId;
boolean skipAllNode;
if (Objects.isNull(instance)) {
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if (Objects.isNull(processInstance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_ID_NOT_EXISTS, processInstanceId);
}
processDefinitionId = processInstance.getProcessDefinitionId();
skipAllNode = true;
} else {
skipAllNode = false;
processDefinitionId = instance.getProcessDefinitionId();
}
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
List<ProcessNodeDetailVO> resultList = new ArrayList<>(flowElements.size());
// 发起人节点,也是一个 UserTask 节点, 所以这里默认就包含了发起人节点
flowElements.stream()
@ -800,19 +817,19 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
node.setNodeMode(GENERAL);
node.setId(i.getId()).setName(i.getName());
if (i instanceof UserTask) {
parseUserTask(processInstanceId, (UserTask) i, node, nodeDefinitionKeys);
parseUserTask(processInstanceId, (UserTask) i, node, skipAllNode, nodeDefinitionKeys);
} else if (i instanceof ServiceTask) {
parseServiceTask(processInstanceId, (ServiceTask) i, node, nodeDefinitionKeys);
parseServiceTask(processInstanceId, (ServiceTask) i, node, skipAllNode, nodeDefinitionKeys);
}
resultList.add(node);
});
return resultList;
}
private void parseServiceTask(String processInstanceId, ServiceTask i, ProcessNodeDetailVO node, List<String> skipTaskDefinitionKeys) {
private void parseServiceTask(String processInstanceId, ServiceTask i, ProcessNodeDetailVO node, boolean skipAllNode, List<String> skipTaskDefinitionKeys) {
// ServiceTask 主要作用于抄送
node.setId(i.getId()).setName(i.getName());
if (skipTaskDefinitionKeys.contains(i.getId())) {
if (skipAllNode || skipTaskDefinitionKeys.contains(i.getId())) {
return;
}
getCarbonCopyConfigs(i).ifPresent(carbons ->
@ -822,7 +839,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
historicTaskInstanceConverter, serviceVersion))));
}
private void parseUserTask(String processInstanceId, UserTask i, ProcessNodeDetailVO node, List<String> skipTaskDefinitionKeys) {
private void parseUserTask(String processInstanceId, UserTask i, ProcessNodeDetailVO node, boolean skipAllNode, List<String> skipTaskDefinitionKeys) {
node.setFormKey(i.getFormKey());
// 设置审批模式,
if (i.getBehavior() instanceof MultiInstanceActivityBehavior) {
@ -835,7 +852,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
node.setNodeMode(BpmnFlowNodeMode.GENERAL);
}
if (skipTaskDefinitionKeys.contains(i.getId())) {
if (skipAllNode || skipTaskDefinitionKeys.contains(i.getId())) {
return;
}
if (Objects.equals(node.getApprovalMethod(), human)) {

View File

@ -27,6 +27,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
@ -124,16 +125,22 @@ public class FlowNodeForecastService implements InitializingBean {
// .includeProcessVariables()
.singleResult();
}
String processDefinitionId;
if (Objects.isNull(instance)) {
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if (Objects.isNull(processInstance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_ID_NOT_EXISTS, processInstanceId);
}
processInstanceId = processInstance.getId();
processDefinitionId = processInstance.getProcessDefinitionId();
} else {
processInstanceId = instance.getProcessInstanceId();
processDefinitionId = instance.getProcessDefinitionId();
}
BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId());
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
// 保持推测出来的节点执行顺序的容器
List<FlowElement> orderedNodes = new ArrayList<>();