diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java index 7e5685ffa..82cda512c 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessInstanceApi.java @@ -165,7 +165,7 @@ public interface ProcessInstanceApi { @Operation(summary = "批量获得流程实例") @PostMapping("/api/process/instance/batch/get") @InvokeMode(SYNC) - CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto); + CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto); /** * 获取指定流程实例的流程变量 diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java index b6f0b9ae8..b727c3512 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java @@ -46,7 +46,7 @@ public interface PrintAdminApi { * @return */ @Operation(summary = "打印模板配置内容更新保存") - @PostMapping("/api/process/model/print/template/upsert") + @PostMapping("/api/print/admin/template/upsert") @InvokeMode(SYNC) CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto); diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceBatchQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceBatchQueryDTO.java index 2b08a427b..7312cb559 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceBatchQueryDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceBatchQueryDTO.java @@ -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 processInstanceIds; + /** + * 是否包含流程变量,默认 false + *

+ * 注意:开启后可能会严重影响查询性能, + */ + private Boolean hasVariables; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/BpmnProcessInstanceService.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/BpmnProcessInstanceService.java index 5121fc0de..7432d5fb7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/BpmnProcessInstanceService.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/BpmnProcessInstanceService.java @@ -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 getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto); + ObjectNode getProcessInstanceGraphical(String processInstanceId, @Nullable String tenantId); BpmPageResult historicProcessInstancePage(HistoricProcessInstanceSearchDTO dto); @@ -184,6 +193,7 @@ public interface BpmnProcessInstanceService { /** * 获取指定流程实例对应的模型 ID + * * @param processInstanceId * @return */ 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 14606bac0..4b42ba366 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 @@ -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 getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto) { + List processInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(Sets.newHashSet(dto.getProcessInstanceIds())).list(); + Map> 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 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 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 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 * diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java index 12c76d256..6cf182166 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessInstanceController.java @@ -291,9 +291,9 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController @Operation(summary = "批量获得流程实例") @GetMapping("/batch/get") @Override - public CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) { - log.info("获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto)); - return null; + public CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) { + log.info("批量获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto)); + return success(bpmnProcessInstanceService.getBatchProcessInstanceVO(dto)); } /** diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java index 0821ba4ca..38d4cd32f 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java @@ -155,7 +155,7 @@ public class PrintAdminController implements PrintAdminApi { * @return */ @Operation(summary = "打印模板配置内容") - @PostMapping("/print/template/upsert") + @PostMapping("/template/upsert") @Override public CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) { log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto));