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 1d6ee9369..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 @@ -9,6 +9,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO; 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.BpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO; @@ -155,6 +156,17 @@ public interface ProcessInstanceApi { @InvokeMode(SYNC) CommonResponse getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto); + /** + * 批量获得流程实例 + * + * @param dto + * @return + */ + @Operation(summary = "批量获得流程实例") + @PostMapping("/api/process/instance/batch/get") + @InvokeMode(SYNC) + CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto); + /** * 获取指定流程实例的流程变量 * diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessModelApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessModelApi.java index 02ad5f6ee..e9e9bc932 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessModelApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessModelApi.java @@ -16,7 +16,6 @@ import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO; import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO; -import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO; import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO; @@ -220,17 +219,6 @@ public interface ProcessModelApi { @InvokeMode(SYNC) CommonResponse> getModelTenantIds(); - /** - * 打印模板配置内容更新保存 - * - * @param dto - * @return - */ - @Operation(summary = "打印模板配置内容更新保存") - @PostMapping("/api/process/model/print/template/upsert") - @InvokeMode(SYNC) - CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO 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 3c3e6365f..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 @@ -5,6 +5,7 @@ import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.Manageable; import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO; +import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.azxo.framework.common.model.CommonResponse; import io.swagger.v3.oas.annotations.Operation; import org.springframework.validation.annotation.Validated; @@ -26,20 +27,50 @@ import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC; * @since 2025-01-16 17:35 */ @WorkflowEngineFeignClient -@Manageable public interface PrintAdminApi { + /** + * 查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板 + * + * @param processInstanceId + * @return + */ @Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板") @GetMapping("/api/print/admin/template/exists") @InvokeMode(SYNC) CommonResponse hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId); + /** + * 打印模板配置内容更新保存 + * + * @param dto + * @return + */ + @Operation(summary = "打印模板配置内容更新保存") + @PostMapping("/api/print/admin/template/upsert") + @InvokeMode(SYNC) + CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto); + + /** + * 获取打印模板中可打印的字段 + * + * @param dto + * @return + */ @Operation(summary = "获取打印模板中可打印的字段") @PostMapping("/api/print/admin/fields") + @Manageable @InvokeMode(SYNC) CommonResponse> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto); + /** + * 获取指定流程下用于替换打印的相关变量 + * + * @param processInstanceId + * @return + */ @Operation(summary = "获取指定流程下用于替换打印的相关变量") @GetMapping("/api/print/admin/field/variables") + @Manageable @InvokeMode(SYNC) CommonResponse> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId); } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java index 0f2dac04a..98bdfd170 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java @@ -35,7 +35,7 @@ public enum ApproverSpecifyEnum { initiator_v2("initiator_v2", "发起人自己", 2), initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2), fixedPerson_v2("fixedPerson_v2", "固定人员", 2), - preAllNodApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2), + preAllNodeApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2), @JsonEnumDefaultValue unknown("unknown", "未知", 1), ; 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 new file mode 100644 index 000000000..7312cb559 --- /dev/null +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceBatchQueryDTO.java @@ -0,0 +1,35 @@ +package cn.axzo.workflow.common.model.request.bpmn.process; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 批量查询流程实例的入参模型 + * + * @author wangli + * @since 2023/7/14 10:12 + */ +@Data +@ApiModel("批量查询流程实例的入参模型") +@Accessors(chain = true) +public class BpmnProcessInstanceBatchQueryDTO { + + /** + * 流程实例 ID 列表 + */ + @NotEmpty(message = "流程实例 ID 列表不能为空") + @Size(max = 20, message = "一次性查询不能超过 20个") + private List processInstanceIds; + + /** + * 是否包含流程变量,默认 false + *

+ * 注意:开启后可能会严重影响查询性能, + */ + private Boolean hasVariables; +} diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java index b36007eca..f328bd90e 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/mq/ProcessInstanceDTO.java @@ -81,6 +81,11 @@ public class ProcessInstanceDTO implements Serializable { */ private String businessProcessInstanceName; + /** + * 模型定义的原始名称 + */ + private String definitionName; + /** * 发起人信息 */ diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java index 240381940..100756b9b 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/converter/json/ServiceTaskJsonConverter.java @@ -320,7 +320,7 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter impleme batchAddAttachment(commandContext, task.getProcessInstanceId(), task, attachmentList, assigner); completeVirtualTask(commandContext, task); - runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner); + if (Objects.nonNull(assigner)) { + runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner); + } return null; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java index 2641c73df..112c9413e 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskCmd.java @@ -161,7 +161,9 @@ public class CustomApproveTaskCmd extends AbstractCommand implements Seria resetApproverNode(task.getProcessInstanceId()); - runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + if (Objects.nonNull(approver)) { + runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + } executeSynchronous(task, taskService, runtimeService); return null; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java index 412ed17c9..81df46654 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomApproveTaskWithFormCmd.java @@ -180,7 +180,9 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand implemen resetApproverNode(task.getProcessInstanceId()); - runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + if (Objects.nonNull(approver)) { + runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + } executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId()); return null; diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java index f09b7bbf2..e1c9953a2 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCancelProcessInstanceCmd.java @@ -140,7 +140,9 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand implem completeVirtualTask(commandContext, task); - runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator); + if (Objects.nonNull(initiator)) { + runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator); + } return null; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java index c32b6a469..b23414126 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomRejectionTaskCmd.java @@ -125,7 +125,9 @@ public class CustomRejectionTaskCmd extends AbstractCommand implements Ser variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_REJECT); variables.put(INTERNAL_PROCESS_DELETE_REASON, reason); runtimeService.setVariables(task.getProcessInstanceId(), variables); - runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + if (Objects.nonNull(approver)) { + runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver); + } CommandContextUtil.getAgenda(commandContext) .planOperation(new DeleteProcessInstanceOperation(commandContext, task.getProcessInstanceId(), extAxHiTaskInstService, REJECTED)); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskAsyncCmd.java index 5840a9616..ba766c83f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskAsyncCmd.java @@ -87,7 +87,7 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand implem private void validTargetAssigneeNodeId(String processDefinitionId) { BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId); Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0); - if (categoryVersion > 0 && StringUtils.isNotBlank(dto.getTargetAssigner().getNodeId())) { + if (categoryVersion > 0 && StringUtils.isBlank(dto.getTargetAssigner().getNodeId())) { throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人"); } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java index 7a12c474a..ca4ca02f7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/AutoPassTransactionListener.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.core.engine.tx.listener; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskAsyncCmd; @@ -53,7 +54,7 @@ public class AutoPassTransactionListener implements TransactionListener { RuntimeService runtimeService = springProcessEngineConfiguration.getRuntimeService(); BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible( runtimeService.getVariable(delegateTask.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId())); - + log.info("auto pass transaction listener, assigner: {}", JSON.toJSONString(assigner)); CommandConfig commandConfig = new CommandConfig().transactionRequired(); CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor(); BpmnTaskAuditDTO pass = new BpmnTaskAuditDTO(); 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/delegate/BasedIdentityV2TaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityV2TaskAssigneeSelector.java index efa5e21d4..d62a73644 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityV2TaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityV2TaskAssigneeSelector.java @@ -104,7 +104,8 @@ public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne break; case pre_node_approver: log.info("executing role v2 with pre_node_approver"); - BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class); + BpmnTaskDelegateAssigner lastOperationApprover = + BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER)); if (Objects.isNull(lastOperationApprover)) { return Collections.emptyList(); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionV2TaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionV2TaskAssigneeSelector.java index d2962380b..3ccff50b5 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionV2TaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionV2TaskAssigneeSelector.java @@ -125,7 +125,8 @@ public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne case pre_node_approver: log.info("executing position v2 with pre_node_approver"); Optional approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement); - BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class); + BpmnTaskDelegateAssigner lastOperationApprover = + BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER)); if (Objects.isNull(lastOperationApprover)) { return Collections.emptyList(); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPreAllNodeTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPreAllNodeTaskAssigneeSelector.java index 052019e90..4be9284cf 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPreAllNodeTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPreAllNodeTaskAssigneeSelector.java @@ -35,7 +35,7 @@ public class BasedPreAllNodeTaskAssigneeSelector extends AbstractBpmnTaskAssigne @Override public String getType() { - return ApproverSpecifyEnum.preAllNodApprover_v2.getType(); + return ApproverSpecifyEnum.preAllNodeApprover_v2.getType(); } @Override diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java index 7033f0471..3827b1b39 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleV2TaskAssigneeSelector.java @@ -18,6 +18,7 @@ import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; import org.flowable.bpmn.model.FlowElement; +import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.DelegateExecution; import org.springframework.stereotype.Component; @@ -55,6 +56,8 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecial public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector { @Resource private OrgNodeUserApi orgNodeUserApi; + @Resource + private RuntimeService runtimeService; @Override public String getType() { @@ -124,7 +127,9 @@ public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSel case pre_node_approver: log.info("executing role v2 with pre_node_approver"); Optional approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement); - BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class); + BpmnTaskDelegateAssigner lastOperationApprover = + BpmnTaskDelegateAssigner.toObjectCompatible(runtimeService.getVariable(execution.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class)); + log.info("lastOperationApprover:{}", JSON.toJSONString(lastOperationApprover)); if (Objects.isNull(lastOperationApprover)) { return Collections.emptyList(); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java index 0af876e95..66629e9f9 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/RocketMqBpmnProcessEventListener.java @@ -85,7 +85,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< .setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime()) .setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId()) .setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()); + .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()) + .setDefinitionName(mainProcess.getName()); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf); @@ -154,7 +155,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< .setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()); + .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) + .setDefinitionName(mainProcess.getName()); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf); @@ -194,7 +196,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< .setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()); + .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) + .setDefinitionName(mainProcess.getName()); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf); @@ -229,7 +232,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< .setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime()) .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()); + .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) + .setDefinitionName(mainProcess.getName()); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf); @@ -264,7 +268,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< .setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime()) .setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId()) .setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()); + .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()) + .setDefinitionName(mainProcess.getName()); BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf); BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java index 1abe6f472..d934b5e1d 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE; @@ -89,13 +90,23 @@ public class CheckApproverServiceImpl implements CheckApproverService { return exists.get(); } ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); - processEngineConfiguration.getActivityInstanceEntityManager() - .findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false) + List actInsts = processEngineConfiguration.getActivityInstanceEntityManager() + .findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false); + + actInsts.stream().map(i -> new StringBuilder() + .append(i.getActivityId()).append(":") + .append(i.getActivityType()).append(":") + .append(i.getEndTime())) + .collect(Collectors.toList()) + .forEach(i -> log.info("checkApproveServiceImpl inst: {}", i.toString())); + + actInsts .stream() .filter(i -> !Objects.equals(i.getActivityId(), userTask.getId())) .filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway")) .filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow")) .filter(i -> !Objects.equals(i.getActivityType(), "startEvent")) + .filter(i -> Objects.nonNull(i.getEndTime())) .max(Comparator.comparing(ActivityInstanceEntity::getEndTime)) .ifPresent(i -> { log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType()); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java index e363a54e6..ffd36aa5c 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java @@ -295,6 +295,9 @@ public class TestController { if (!StringUtils.hasText(keyword)) { return "命令不能为空"; } + if (StringUtils.hasText(date)) { + return ShellUtil.grepLog(profile, keyword, StringUtils.hasText(date) ? DateUtil.parseDate(date) : new Date(), grepKeyword); + } String s = ShellUtil.grepRealTimeLog(profile, keyword); if (StringUtils.hasText(s)) { return s; 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 7971073ed..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 @@ -13,6 +13,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO; 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.BpmnProcessInstanceCancelDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO; @@ -281,6 +282,20 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController return success(result); } + /** + * 批量获得流程实例 + * + * @param dto + * @return + */ + @Operation(summary = "批量获得流程实例") + @GetMapping("/batch/get") + @Override + public CommonResponse> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) { + log.info("批量获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto)); + return success(bpmnProcessInstanceService.getBatchProcessInstanceVO(dto)); + } + /** * 更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例 * diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessModelController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessModelController.java index d1d6b13d6..76a64ea65 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessModelController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessModelController.java @@ -410,21 +410,6 @@ public class BpmnProcessModelController implements ProcessModelApi { return success(bpmnProcessModelService.getTenantIds()); } - /** - * 打印模板配置内容 - * - * @param dto - * @return - */ - @Operation(summary = "打印模板配置内容") - @PostMapping("/print/template/upsert") - @Override - public CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) { - log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto)); - bpmnProcessModelService.printTemplateConfig(dto); - return success(); - } - /** * 获取打印模板配置内容 * 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 9ff3009be..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 @@ -9,6 +9,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.dto.print.FieldAttributeDTO; import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO; import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO; +import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.request.category.CategoryGroupVarSearchDto; @@ -20,6 +21,7 @@ import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd; import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd; import cn.axzo.workflow.core.service.BpmnProcessDefinitionService; import cn.axzo.workflow.core.service.BpmnProcessInstanceService; +import cn.axzo.workflow.core.service.BpmnProcessModelService; import cn.axzo.workflow.core.service.CategoryGroupService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.util.RpcExternalUtil; @@ -130,6 +132,8 @@ public class PrintAdminController implements PrintAdminApi { private BpmnProcessInstanceService bpmnProcessInstanceService; @Resource private CategoryGroupService categoryGroupService; + @Resource + private BpmnProcessModelService bpmnProcessModelService; /** * 查询指定流程实例是否能使用打印 @@ -144,6 +148,20 @@ public class PrintAdminController implements PrintAdminApi { return CommonResponse.success(bpmnProcessInstanceService.hasPrintTemplate(processInstanceId, null)); } + /** + * 打印模板配置内容 + * + * @param dto + * @return + */ + @Operation(summary = "打印模板配置内容") + @PostMapping("/template/upsert") + @Override + public CommonResponse printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) { + log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto)); + bpmnProcessModelService.printTemplateConfig(dto); + return success(); + } /** * 获取打印模板中可打印的字段, 或者是 WPS 模板中可配置的变量字段 *