update - 流程节点推测功能细化,可以提前过滤掉已经完成或者不需要的节点,提高性能

This commit is contained in:
wangli 2024-04-17 11:41:53 +08:00
parent 3add4f209c
commit c9fd2a54b0
4 changed files with 49 additions and 27 deletions

View File

@ -108,6 +108,7 @@ public interface ProcessInstanceApi {
*/
@PostMapping("/api/process/instance/carbon-copy")
CommonResponse<Boolean> carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
/**
* 获得流程实例
*
@ -148,6 +149,19 @@ public interface ProcessInstanceApi {
CommonResponse<List<ProcessNodeDetailVO>> processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId);
/**
* 推断指定流程实例的过滤掉部分节点执行顺序
*
* @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数
* 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
* @return
*/
@GetMapping("/api/process/instance/node/filter/forecasting")
CommonResponse<List<ProcessNodeDetailVO>> processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId,
@RequestParam(required = false, defaultValue = "false") Boolean allNode,
@Nullable @RequestParam(required = false) List<String> nodeDefinitionKeys);
/**
* 获取指定流程实例的协作单位
*

View File

@ -133,18 +133,8 @@ public interface BpmnProcessInstanceService {
*/
List<ProcessNodeDetailVO> getProcessInstanceNodeForecast(String processInstanceId, String tenantId);
/**
* 可过滤指定节点集合的剩余接地那推送
*
* @param processInstanceId
* @param tenantId
* @param allNode
* @param removeTaskDefinitionKeys
* @return
*/
List<ProcessNodeDetailVO> getProcessInstanceNodeForecast(String processInstanceId, String tenantId, Boolean allNode, List<String> removeTaskDefinitionKeys);
List<ProcessNodeDetailVO> getProcessInstanceNodeFilterForecast(String processInstanceId, String tenantId, List<String> nodeDefinitionKeys);
List<String> getTenantIds();
}

View File

@ -767,6 +767,12 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public List<ProcessNodeDetailVO> getProcessInstanceNodeForecast(String processInstanceId,
@Nullable String tenantId) {
return getProcessInstanceNodeFilterForecast(processInstanceId, tenantId, Collections.emptyList());
}
@Override
public List<ProcessNodeDetailVO> getProcessInstanceNodeFilterForecast(String processInstanceId, String tenantId, List<String> nodeDefinitionKeys) {
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId);
if (StringUtils.isNotBlank(tenantId)) {
@ -778,7 +784,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId());
List<ProcessNodeDetailVO> resultList = new ArrayList<>(flowElements.size());
// 发起人节点,也是一个 UserTask 节点, 所以这里默认就包含了发起人节点
flowElements.stream().filter(i -> (i instanceof UserTask || i instanceof ReceiveTask || i instanceof ServiceTask))
flowElements.stream()
.filter(i -> !nodeDefinitionKeys.contains(i.getId()))
.filter(i -> (i instanceof UserTask || i instanceof ReceiveTask || i instanceof ServiceTask))
.forEach(i -> {
ProcessNodeDetailVO node = new ProcessNodeDetailVO();
node.setForecastAssigners(Collections.emptyList());
@ -802,20 +810,6 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
return resultList;
}
/**
* 可过滤指定节点集合的剩余接地那推送
*
* @param processInstanceId
* @param tenantId
* @param allNode
* @param removeTaskDefinitionKeys
* @return
*/
@Override
public List<ProcessNodeDetailVO> getProcessInstanceNodeForecast(String processInstanceId, String tenantId, Boolean allNode, List<String> removeTaskDefinitionKeys) {
return Collections.emptyList();
}
private void parseServiceTask(String processInstanceId, ServiceTask i, ProcessNodeDetailVO node) {
// ServiceTask 主要作用于抄送
node.setId(i.getId()).setName(i.getName());

View File

@ -217,6 +217,30 @@ public class BpmnProcessInstanceController implements ProcessInstanceApi {
return success(bpmnProcessInstanceService.getProcessInstanceNodeForecast(processInstanceId, tenantId));
}
/**
* 推断指定流程实例的过滤掉部分节点执行顺序
*
* @param processInstanceId
* @param tenantId
* @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数
* 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
* @param nodeDefinitionKeys
* @return
*/
@Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序")
@GetMapping("/node/filter/forecasting")
@Override
public CommonResponse<List<ProcessNodeDetailVO>> processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId,
@RequestParam(required = false, defaultValue = "false") Boolean allNode,
@Nullable @RequestParam(required = false) List<String> nodeDefinitionKeys) {
if (allNode) {
return success(bpmnProcessInstanceService.getProcessInstanceNodeForecast(processInstanceId, tenantId));
} else {
return success(bpmnProcessInstanceService.getProcessInstanceNodeFilterForecast(processInstanceId, tenantId, nodeDefinitionKeys));
}
}
/**
* 获取指定流程实例的协作单位
*