feat(REQ-4418) - 新增流程批量查询接口

This commit is contained in:
wangli 2025-09-01 16:27:52 +08:00
parent f73b1cfcda
commit 0f743afe99
5 changed files with 82 additions and 8 deletions

View File

@ -165,7 +165,7 @@ public interface ProcessInstanceApi {
@Operation(summary = "批量获得流程实例")
@PostMapping("/api/process/instance/batch/get")
@InvokeMode(SYNC)
CommonResponse<BpmPageResult<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto);
CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto);
/**
* 获取指定流程实例的流程变量

View File

@ -1,11 +1,11 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
import cn.axzo.workflow.common.model.request.BpmPageParam;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.util.List;
/**
@ -14,15 +14,22 @@ import java.util.List;
* @author wangli
* @since 2023/7/14 10:12
*/
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("批量查询流程实例的入参模型")
@Accessors(chain = true)
public class BpmnProcessInstanceBatchQueryDTO extends BpmPageParam {
public class BpmnProcessInstanceBatchQueryDTO {
/**
* 流程实例 ID 列表
*/
@NotEmpty(message = "流程实例 ID 列表不能为空")
@Size(max = 20, message = "一次性查询不能超过 20个")
private List<String> processInstanceIds;
/**
* 是否包含流程变量默认 false
* <p>
* 注意开启后可能会严重影响查询性能
*/
private Boolean hasVariables;
}

View File

@ -3,6 +3,7 @@ package cn.axzo.workflow.core.service;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
@ -136,6 +137,14 @@ public interface BpmnProcessInstanceService {
*/
BpmnProcessInstanceVO getProcessInstanceVO(BpmnProcessInstanceQueryDTO dto);
/**
* 批量获得流程实例 VO 信息
*
* @param dto
* @return
*/
List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto);
ObjectNode getProcessInstanceGraphical(String processInstanceId, @Nullable String tenantId);
BpmPageResult<HistoricProcessInstanceVO> historicProcessInstancePage(HistoricProcessInstanceSearchDTO dto);
@ -184,6 +193,7 @@ public interface BpmnProcessInstanceService {
/**
* 获取指定流程实例对应的模型 ID
*
* @param processInstanceId
* @return
*/

View File

@ -22,6 +22,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
@ -93,6 +94,7 @@ import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.BpmnModel;
@ -829,6 +831,61 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
processInstance.getProcessDefinitionKey()), runningTasks);
}
@Override
public List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto) {
List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(Sets.newHashSet(dto.getProcessInstanceIds())).list();
Map<String, Map<String, Object>> variableMaps = historyService.createNativeHistoricVariableInstanceQuery()
.sql("select * from act_hi_varinst where PROC_INST_ID_ in (#{ids}) and (NAME_ = '" + INTERNAL_INITIATOR + "' or NAME_ = '" + OLD_INTERNAL_INITIATOR + "' or NAME_ = '" + WORKFLOW_ENGINE_VERSION + "')")
.parameter("ids", dto.getProcessInstanceIds()).list()
.stream()
.collect(Collectors.groupingBy(HistoricVariableInstance::getProcessInstanceId, Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue, (s, t) -> s)));
Map<String, Task> taskMaps = taskService.createTaskQuery().processInstanceIdIn(dto.getProcessInstanceIds())
.active()
.list()
.stream().collect(Collectors.groupingBy(
Task::getProcessInstanceId,
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Task::getCreateTime)),
Optional::get
)
));
Map<String, CategoryItemVO> categoryMaps = categoryService.getByValues(processInstanceList.stream().map(HistoricProcessInstance::getProcessDefinitionKey).filter(StringUtils::hasText).distinct().collect(Collectors.toList()))
.stream()
.filter(i -> Objects.equals(i.getType(), BPM_MODEL_CATEGORY))
.collect(Collectors.toMap(CategoryItemVO::getValue, Function.identity(), (s, t) -> s));
return processInstanceList.stream().map(e -> {
BpmnProcessInstanceVO vo = new BpmnProcessInstanceVO();
vo.setId(e.getId());
vo.setName(e.getName());
vo.setCategory(e.getProcessDefinitionKey());
CategoryItemVO category = categoryMaps.getOrDefault(e.getProcessDefinitionKey(), null);
if (Objects.nonNull(category)) {
vo.setCategoryDesc(category.getLabel());
vo.setWorkspaceType(WorkspaceType.getType(Integer.valueOf(category.getWorkspaceTypeCode())));
}
vo.setResult(BpmnProcessInstanceResultEnum.valueOfStatus(e.getBusinessStatus()));
vo.setCreateAt(e.getStartTime());
vo.setEndTime(e.getEndTime());
vo.setProcessDefinitionKey(e.getProcessDefinitionKey());
vo.setProcessDefinitionId(e.getProcessDefinitionId());
vo.setBusinessKey(e.getBusinessKey());
vo.setBusinessStatus(e.getBusinessStatus());
vo.setTenantId(e.getTenantId());
Task task = taskMaps.getOrDefault(e.getId(), null);
if (Objects.nonNull(task)) {
vo.setCurrentDefinitionKey(task.getTaskDefinitionKey());
}
Map<String, Object> variables = variableMaps.getOrDefault(e.getId(), Collections.emptyMap());
if (!CollectionUtils.isEmpty(variables)) {
vo.setInitiator(BpmnTaskDelegateAssigner.toObjectCompatible(variables.getOrDefault(INTERNAL_INITIATOR, variables.getOrDefault(OLD_INTERNAL_INITIATOR, null))));
vo.setWorkflowEngineVersion(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, "").toString());
}
return vo;
}).collect(Collectors.toList());
}
/**
* 获得流程实例 Map
*

View File

@ -291,9 +291,9 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
@Operation(summary = "批量获得流程实例")
@GetMapping("/batch/get")
@Override
public CommonResponse<BpmPageResult<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) {
log.info("获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto));
return null;
public CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) {
log.info("批量获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto));
return success(bpmnProcessInstanceService.getBatchProcessInstanceVO(dto));
}
/**