From 2fa4680bac41fdcf5215619d736038a14fdb4d7c Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 24 Oct 2025 18:36:21 +0800 Subject: [PATCH 01/25] =?UTF-8?q?feat(REQ-5250)=20-=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20checkInstanceApprover=20=E5=87=BD=E6=95=B0onlyPersonId=20?= =?UTF-8?q?=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/impl/BpmnProcessInstanceServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4b42ba366..63eb0cd35 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 @@ -1222,7 +1222,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } List list = taskService.createTaskQuery() .processInstanceId(dto.getProcessInstanceId()) - .taskAssigneeLikeIgnoreCase(dto.getApprover().buildAssigneeId()) + .taskAssigneeLikeIgnoreCase("%" + dto.getApprover().buildAssigneeId() + "%") .active() .list(); return !CollectionUtils.isEmpty(list); From 8259f31173a8110c308d56ebf9659faf459dd921 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 20 Nov 2025 11:40:26 +0800 Subject: [PATCH 02/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=9B=9E=E9=80=80=E7=9A=84=20API=20=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/workflow/client/feign/bpmn/ProcessTaskApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessTaskApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessTaskApi.java index 7afa2cb7b..9aeb5b90b 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessTaskApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessTaskApi.java @@ -120,7 +120,7 @@ public interface ProcessTaskApi { */ @Operation(summary = "系统操作回退任务到指定节点") @PostMapping("/api/process/task/system/back") - @Manageable + @InvokeMode(ASYNC) CommonResponse systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto); /** From a9a90ab46dc830af8d79783cb70724005a3fa4d1 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 20 Nov 2025 15:52:17 +0800 Subject: [PATCH 03/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E6=97=A5=E5=BF=97=E6=8E=A5=E5=8F=A3=E5=85=A5?= =?UTF-8?q?=E5=8F=82=EF=BC=8C=E6=8E=A7=E5=88=B6=E6=98=AF=E5=90=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E8=AF=A2=E6=9C=AA=E6=9D=A5=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpmn/process/BpmnProcessInstanceLogQueryDTO.java | 7 +++++++ .../core/service/impl/BpmnProcessInstanceServiceImpl.java | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java index e0a4841d7..53a1ab6ee 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceLogQueryDTO.java @@ -47,6 +47,13 @@ public class BpmnProcessInstanceLogQueryDTO { @Builder.Default private Boolean hasButton = false; + /** + * 是否包含未来的节点,默认包含 + */ + @ApiModelProperty(value = "是否包含未来的节点,默认包含") + @Builder.Default + private Boolean includeFutureTasks = true; + /** * 是否需要加密(同一个实例的日志,在不同端[cms/oms]下,审批人的信息需要按一定规则进行隐藏控制) */ 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 4b42ba366..351f950ba 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 @@ -1245,7 +1245,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic List forecasting = new ArrayList<>(); // 只有还在运行中的实例才需要推测后续节点 - if (Objects.equals(historicProcessInstance.getBusinessStatus(), PROCESSING.getStatus())) { + if (Objects.equals(historicProcessInstance.getBusinessStatus(), PROCESSING.getStatus()) && Objects.equals(Boolean.TRUE, dto.getIncludeFutureTasks())) { ProcessInstance instance = runtimeService.createProcessInstanceQuery() .processInstanceId(dto.getProcessInstanceId()) .includeProcessVariables() From 167298881b4dae8334f1c21cb0af798930fcc36b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Nov 2025 10:10:01 +0800 Subject: [PATCH 04/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20MQ=20=E4=BA=8B=E4=BB=B6=E5=AE=9E=E7=8E=B0=E7=AE=97=20boolean?= =?UTF-8?q?=20=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mq/check/ImplementationReadyChecker.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/check/ImplementationReadyChecker.java b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/check/ImplementationReadyChecker.java index b8a9b3522..a32f44233 100644 --- a/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/check/ImplementationReadyChecker.java +++ b/workflow-engine-spring-boot-starter/src/main/java/cn/axzo/workflow/starter/mq/check/ImplementationReadyChecker.java @@ -81,19 +81,30 @@ public class ImplementationReadyChecker implements ApplicationListener 32) throw new IllegalArgumentException("bits must be 1~32"); + if (bits <= 0 || bits > 32) { + throw new IllegalArgumentException("bits must be 1~32"); + } + boolean[] arr = new boolean[bits]; for (int i = 0; i < bits; i++) { - int shift = bits - 1 - i; + int shift = bits - 1 - i; // 从高位到低位遍历 arr[i] = ((value >>> shift) & 1) == 1; } return arr; From 84e2e890de17598f0945acb85b60ce8c12dd2b62 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Nov 2025 14:46:21 +0800 Subject: [PATCH 05/25] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=E8=BD=AC?= =?UTF-8?q?=E4=BA=A4=E6=97=B6=E7=9A=84=E4=BB=BB=E5=8A=A1=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/core/engine/cmd/CustomTransferUserTaskCmd.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java index 6d370a2be..96f002ecf 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomTransferUserTaskCmd.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_HAS_BEEN_COMPLETE; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF; import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; @@ -100,6 +101,9 @@ public class CustomTransferUserTaskCmd extends AbstractCommand implements TaskService taskService = processEngineConfiguration.getTaskService(); TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult(); + if (Objects.isNull(task)) { + throw new WorkflowEngineException(TASK_HAS_BEEN_COMPLETE); + } validTargetAssigneeNodeId(task.getProcessDefinitionId()); From 8716ea808f403461d0b5f43b5aae41e1bb307e0b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 26 Nov 2025 14:49:01 +0800 Subject: [PATCH 06/25] =?UTF-8?q?feat(REQ-6570)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=85=AB=E5=A4=A7=E6=8C=89=E9=92=AE=E6=93=8D=E4=BD=9C=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=B8=AD=E7=9A=84=E9=99=84=E4=BB=B6=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=20fileKey=20?= =?UTF-8?q?=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/request/bpmn/task/AttachmentDTO.java | 2 ++ .../core/engine/cmd/helper/CustomTaskHelper.java | 16 ++++++++-------- .../impl/BpmnProcessInstanceServiceImpl.java | 3 ++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java index e0995aed8..5b74053d3 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/AttachmentDTO.java @@ -52,9 +52,11 @@ public class AttachmentDTO implements Serializable { /** * 文件描述 + * 该数据无实际作用 */ @ApiModelProperty(value = "文件描述") @IndexField(exist = false) + @Deprecated private String description; /** diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java index ab58d0007..9c0bf772f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java @@ -1,10 +1,10 @@ package cn.axzo.workflow.core.engine.cmd.helper; import cn.axzo.workflow.common.enums.BpmnFlowNodeType; +import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO; -import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.engine.model.AddComment; import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst; @@ -51,6 +51,12 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ASSIGNEE_HAS_BEEN_EXISTS; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ASSIGNER_NUMBER_EXCEEDS_NUMBER_LIMIT; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_NOT_EXISTS; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_HAS_BEEN_COMPLETE; +import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_TYPE_MISMATCH; import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVAL_ASSIGNER_LIMIT_NUMBER; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE; import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; @@ -61,12 +67,6 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ATTACHMENTS_VA import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE; import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY; import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ASSIGNEE_HAS_BEEN_EXISTS; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ASSIGNER_NUMBER_EXCEEDS_NUMBER_LIMIT; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_COMPLETE_FAIL_NOT_EXISTS; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_HAS_BEEN_COMPLETE; -import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_TYPE_MISMATCH; import static org.flowable.task.api.Task.DEFAULT_PRIORITY; /** @@ -263,7 +263,7 @@ public class CustomTaskHelper { Authentication.setAuthenticatedUserId(assigner.buildAssigneeId()); attachmentList.forEach(dto -> { Attachment attachment = taskService.createAttachment(dto.getType().getType(), task.getId(), processInstanceId, - dto.getName(), dto.getDescription(), dto.getUrl()); + dto.getName(), dto.getFileKey(), dto.getUrl()); taskService.saveAttachment(attachment); }); task.setTransientVariableLocal(TASK_ATTACHMENTS_VAR_NAME, attachmentList); 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 4b42ba366..48d5c4174 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 @@ -1806,7 +1806,8 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic .id(e.getId()) .type(type) .name(e.getName()) - .description(e.getDescription()) +// .description(e.getDescription()) + .fileKey(e.getDescription()) .url(e.getUrl()) .build()) .collect(Collectors.toList()); From c7edc54720ceec416103bb0fbf95af1c83324776 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 24 Nov 2025 11:52:41 +0800 Subject: [PATCH 07/25] =?UTF-8?q?feat(REQ-5965)=20-=20feignAPI=20=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9E=E7=8E=B0=EF=BC=8C=E8=8E=B7=E5=8F=96=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E6=9C=8D=E5=8A=A1=E5=90=8D=E7=A7=B0=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/bpmn/BpmnProcessActivityController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java index f95ed8e24..e2c4e3164 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java @@ -1,12 +1,12 @@ package cn.axzo.workflow.server.controller.web.bpmn; import cn.axzo.workflow.client.feign.bpmn.ProcessActivityApi; +import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; -import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.service.BpmnProcessActivityService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.axzo.workflow.server.common.annotation.RepeatSubmit; @@ -24,10 +24,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotBlank; import java.util.ArrayList; import java.util.List; +import static cn.axzo.workflow.client.config.WorkflowRequestInterceptor.HEADER_SERVER_NAME; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_HAS_REPEAT; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId; import static cn.azxo.framework.common.model.CommonResponse.success; @@ -44,7 +46,8 @@ import static cn.azxo.framework.common.model.CommonResponse.success; @ErrorReporter @Validated public class BpmnProcessActivityController extends BasicPopulateAvatarController implements ProcessActivityApi { - + @Resource + private HttpServletRequest request; @Resource private BpmnProcessActivityService bpmnProcessActivityService; @@ -76,7 +79,8 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController @Override @RepeatSubmit public CommonResponse trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto) { - log.info("业务节点唤醒 trigger ===>>>参数:{}", JSON.toJSONString(dto)); + String header = request.getHeader(HEADER_SERVER_NAME); + log.info("业务节点唤醒 trigger ===>>>参数:{}, 请求来自微服务: {}", JSON.toJSONString(dto), header); bpmnProcessActivityService.trigger(dto); return success(true); } From ccda358a99b41703da6300be056eafe9be4837b3 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 24 Nov 2025 15:16:10 +0800 Subject: [PATCH 08/25] =?UTF-8?q?feat(REQ-5965)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E8=A7=A6=E5=8F=91=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../engine/cmd/CustomActivityTriggerAsyncCmd.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index 98e4209ba..81a172c82 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -12,6 +12,7 @@ import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.job.service.JobService; import org.flowable.job.service.impl.persistence.entity.JobEntity; +import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,10 +48,12 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple public String execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); - TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()) - .taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId()) - .singleResult(); + TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()); + if (StringUtils.isNotBlank(dto.getActivityId())) { + taskQuery.taskDefinitionKey(dto.getActivityId()); + } + TaskEntity task = (TaskEntity) taskQuery.singleResult(); if (Objects.isNull(task)) { throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); } From 039e2f27e84e3c905d3b0480072625c31a18d958 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 14:48:33 +0800 Subject: [PATCH 09/25] =?UTF-8?q?feat(REQ-5965)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20trigger=20=E6=97=A5=E5=BF=97=EF=BC=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=96=B9=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/web/bpmn/BpmnProcessActivityController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java index e2c4e3164..0f8b794ff 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java @@ -64,7 +64,8 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController @RepeatSubmit @Deprecated public CommonResponse trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId) { - log.info("业务节点唤醒 trigger2 ===>>>参数:{}", triggerId); + String header = request.getHeader(HEADER_SERVER_NAME); + log.info("业务节点唤醒 trigger2 ===>>>参数:{}, 请求来自微服务:{}", triggerId, header); return trigger(new BpmnActivityTriggerDTO(triggerId, true, null)); } From 7c4434c3a4d2f36c645413d6c52d90d88cbbf222 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 15:03:36 +0800 Subject: [PATCH 10/25] =?UTF-8?q?feat(REQ-5965)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20trigger=20=E6=97=A5=E5=BF=97=EF=BC=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=96=B9=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/web/bpmn/BpmnProcessActivityController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java index 0f8b794ff..bdc654c12 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java @@ -65,7 +65,8 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController @Deprecated public CommonResponse trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId) { String header = request.getHeader(HEADER_SERVER_NAME); - log.info("业务节点唤醒 trigger2 ===>>>参数:{}, 请求来自微服务:{}", triggerId, header); + String remoteAddr = request.getRemoteAddr(); + log.info("业务节点唤醒 trigger2 ===>>>参数:{}, 请求来自微服务:{}, ip: {}", triggerId, header, remoteAddr); return trigger(new BpmnActivityTriggerDTO(triggerId, true, null)); } @@ -81,7 +82,8 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController @RepeatSubmit public CommonResponse trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto) { String header = request.getHeader(HEADER_SERVER_NAME); - log.info("业务节点唤醒 trigger ===>>>参数:{}, 请求来自微服务: {}", JSON.toJSONString(dto), header); + String remoteAddr = request.getRemoteAddr(); + log.info("业务节点唤醒 trigger ===>>>参数:{}, 请求来自微服务: {}, ip: {}", JSON.toJSONString(dto), header, remoteAddr); bpmnProcessActivityService.trigger(dto); return success(true); } From 952fe675902cc5f3d2284ba02456203153150172 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 16:41:49 +0800 Subject: [PATCH 11/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BpmnProcessActivityServiceImpl.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java index bec4239e5..00b769abc 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java @@ -1,11 +1,11 @@ package cn.axzo.workflow.core.service.impl; +import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; -import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.cmd.CustomAbortProcessInstanceCmd; import cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerAsyncCmd; import cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd; @@ -15,6 +15,7 @@ import cn.axzo.workflow.core.engine.cmd.CustomBusinessNodeTimeoutCallbackCmd; import cn.axzo.workflow.core.engine.cmd.CustomBusinessNodeTimeoutTriggerCmd; import cn.axzo.workflow.core.service.BpmnProcessActivityService; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; +import com.google.common.util.concurrent.Uninterruptibles; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.impl.interceptor.CommandExecutor; import org.flowable.engine.RuntimeService; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.time.Duration; import java.util.Objects; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; @@ -48,10 +50,19 @@ public class BpmnProcessActivityServiceImpl implements BpmnProcessActivityServic @Transactional(rollbackFor = Exception.class) public void trigger(BpmnActivityTriggerDTO dto) { CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor(); - if (Boolean.TRUE.equals(dto.getAsync())) { - commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); - } else { - commandExecutor.execute(new CustomActivityTriggerCmd(dto)); + try { + if (Boolean.TRUE.equals(dto.getAsync())) { + commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); + } else { + commandExecutor.execute(new CustomActivityTriggerCmd(dto)); + } + } catch (WorkflowEngineException e) { + Uninterruptibles.sleepUninterruptibly(Duration.ofSeconds(2)); + if (Boolean.TRUE.equals(dto.getAsync())) { + commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); + } else { + commandExecutor.execute(new CustomActivityTriggerCmd(dto)); + } } } From 0d77c05b5359f70f7c84b33797fdc63a81f8b159 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 18:13:07 +0800 Subject: [PATCH 12/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/impl/BpmnProcessActivityServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java index 00b769abc..8bc91f7d7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java @@ -56,7 +56,8 @@ public class BpmnProcessActivityServiceImpl implements BpmnProcessActivityServic } else { commandExecutor.execute(new CustomActivityTriggerCmd(dto)); } - } catch (WorkflowEngineException e) { + } catch (Exception e) { + log.info("trigger error msg: {}", e.getMessage(), e); Uninterruptibles.sleepUninterruptibly(Duration.ofSeconds(2)); if (Boolean.TRUE.equals(dto.getAsync())) { commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); From b68a6bec15885367be7c54bb8d7790a9c87b12f9 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 18:49:54 +0800 Subject: [PATCH 13/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomActivityTriggerAsyncCmd.java | 45 ++++++++++++---- .../engine/cmd/CustomActivityTriggerCmd.java | 53 +++++++++++++++---- 2 files changed, 78 insertions(+), 20 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index 81a172c82..54e2ed538 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -7,20 +7,27 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.engine.runtime.Execution; import org.flowable.job.service.JobService; import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.task.api.TaskQuery; +import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import java.io.Serializable; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; +import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.findLatestByCreateTime; import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.validateActivityConfig; /** @@ -48,19 +55,35 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple public String execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); - TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()); - if (StringUtils.isNotBlank(dto.getActivityId())) { - taskQuery.taskDefinitionKey(dto.getActivityId()); - } - TaskEntity task = (TaskEntity) taskQuery.singleResult(); - if (Objects.isNull(task)) { - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); + log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); + + if (list.size() == 1) { + HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); + log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); } - if (!validateActivityConfig(task)) { + List tasks = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()).list(); + if (CollectionUtils.isEmpty(tasks)) { + log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { + tasks = tasks.stream() + .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) + .collect(Collectors.toList()); + } + + TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + if (Objects.isNull(task)) { + log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (!validateActivityConfig((task))) { log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); - return ""; + return null; } return startAsync(commandContext); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 3eb2e4b14..20537295c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -5,20 +5,28 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import com.alibaba.fastjson.JSON; -import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; +import org.flowable.engine.runtime.Execution; +import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.Comparator; +import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -49,26 +57,53 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S public Void execute(CommandContext commandContext) { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); + log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()) - .taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId()) - .singleResult(); - if (Objects.isNull(task)) { - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + if (list.size() == 1) { + HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); + log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); } - if (!validateActivityConfig(task)) { + List tasks = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()).list(); + if (CollectionUtils.isEmpty(tasks)) { + log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (StringUtils.hasText(dto.getActivityId())) { + tasks = tasks.stream() + .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) + .collect(Collectors.toList()); + } + + TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + if (Objects.isNull(task)) { + log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (!validateActivityConfig((task))) { log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); return null; } + addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); runtimeService.trigger(dto.getTriggerId()); return null; } + public static Optional findLatestByCreateTime(List tasks) { + if (tasks == null || tasks.isEmpty()) { + return Optional.empty(); + } + return tasks.stream() + .filter(Objects::nonNull) + .filter(t -> t.getCreateTime() != null) + .max(Comparator.comparing(Task::getCreateTime)); + } + public static boolean validateActivityConfig(TaskEntity task) { BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId()); FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey()); From 5197a4963780e8318e58c3e1733adec471ab81a5 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 27 Nov 2025 18:52:14 +0800 Subject: [PATCH 14/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BpmnProcessActivityServiceImpl.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java index 8bc91f7d7..5a6a085d2 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java @@ -15,7 +15,6 @@ import cn.axzo.workflow.core.engine.cmd.CustomBusinessNodeTimeoutCallbackCmd; import cn.axzo.workflow.core.engine.cmd.CustomBusinessNodeTimeoutTriggerCmd; import cn.axzo.workflow.core.service.BpmnProcessActivityService; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; -import com.google.common.util.concurrent.Uninterruptibles; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.impl.interceptor.CommandExecutor; import org.flowable.engine.RuntimeService; @@ -27,7 +26,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; -import java.time.Duration; import java.util.Objects; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; @@ -50,20 +48,10 @@ public class BpmnProcessActivityServiceImpl implements BpmnProcessActivityServic @Transactional(rollbackFor = Exception.class) public void trigger(BpmnActivityTriggerDTO dto) { CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor(); - try { - if (Boolean.TRUE.equals(dto.getAsync())) { - commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); - } else { - commandExecutor.execute(new CustomActivityTriggerCmd(dto)); - } - } catch (Exception e) { - log.info("trigger error msg: {}", e.getMessage(), e); - Uninterruptibles.sleepUninterruptibly(Duration.ofSeconds(2)); - if (Boolean.TRUE.equals(dto.getAsync())) { - commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); - } else { - commandExecutor.execute(new CustomActivityTriggerCmd(dto)); - } + if (Boolean.TRUE.equals(dto.getAsync())) { + commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); + } else { + commandExecutor.execute(new CustomActivityTriggerCmd(dto)); } } From 4ec43e1f9c1ab289d3a32ed5c0e6088e888fe082 Mon Sep 17 00:00:00 2001 From: wangli Date: Fri, 28 Nov 2025 11:10:41 +0800 Subject: [PATCH 15/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomActivityTriggerAsyncCmd.java | 76 ++++++++++-------- .../engine/cmd/CustomActivityTriggerCmd.java | 77 ++++++++++++------- 2 files changed, 95 insertions(+), 58 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index 54e2ed538..6a59c04f9 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -7,19 +7,16 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.runtime.Execution; import org.flowable.job.service.JobService; import org.flowable.job.service.impl.persistence.entity.JobEntity; import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.List; @@ -27,7 +24,6 @@ import java.util.Objects; import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; -import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.findLatestByCreateTime; import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.validateActivityConfig; /** @@ -53,39 +49,57 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple @Override public String execute(CommandContext commandContext) { +// ProcessEngineConfigurationImpl processEngineConfiguration = +// CommandContextUtil.getProcessEngineConfiguration(commandContext); +// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); +// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); +// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); +// +// if (list.size() == 1) { +// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); +// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); +// } +// +// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()).list(); +// if (CollectionUtils.isEmpty(tasks)) { +// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { +// tasks = tasks.stream() +// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) +// .collect(Collectors.toList()); +// } +// +// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); +// if (Objects.isNull(task)) { +// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (!validateActivityConfig((task))) { +// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); +// return null; +// } + ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); - log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - - if (list.size() == 1) { - HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); - log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); + TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()); + if (StringUtils.isNotBlank(dto.getActivityId())) { + taskQuery.taskDefinitionKey(dto.getActivityId()); } - - List tasks = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()).list(); - if (CollectionUtils.isEmpty(tasks)) { - log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { - tasks = tasks.stream() - .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) - .collect(Collectors.toList()); - } - - TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + List list = taskQuery.list(); + log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); + TaskEntity task = (TaskEntity) taskQuery.singleResult(); if (Objects.isNull(task)) { - log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); } - if (!validateActivityConfig((task))) { - log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); - return null; - } + if (!validateActivityConfig(task)) { + log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); + return ""; + } return startAsync(commandContext); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 20537295c..4f031031f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -5,21 +5,19 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import com.alibaba.fastjson.JSON; +import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; -import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; -import org.flowable.engine.runtime.Execution; import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.io.Serializable; import java.util.Comparator; @@ -55,41 +53,66 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S @Override public Void execute(CommandContext commandContext) { +// ProcessEngineConfigurationImpl processEngineConfiguration = +// CommandContextUtil.getProcessEngineConfiguration(commandContext); +// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); +// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); +// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); +// +// if (list.size() == 1) { +// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); +// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); +// } +// +// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()).list(); +// if (CollectionUtils.isEmpty(tasks)) { +// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (StringUtils.hasText(dto.getActivityId())) { +// tasks = tasks.stream() +// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) +// .collect(Collectors.toList()); +// } +// +// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); +// if (Objects.isNull(task)) { +// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (!validateActivityConfig((task))) { +// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); +// return null; +// } +// +// +// addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); +// runtimeService.trigger(dto.getTriggerId()); +// return null; + ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); - log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - if (list.size() == 1) { - HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); - log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); + TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()); + if (StringUtils.isNotBlank(dto.getActivityId())) { + taskQuery.taskDefinitionKey(dto.getActivityId()); } - - List tasks = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()).list(); - if (CollectionUtils.isEmpty(tasks)) { - log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (StringUtils.hasText(dto.getActivityId())) { - tasks = tasks.stream() - .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) - .collect(Collectors.toList()); - } - - TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + List list = taskQuery.list(); + log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); + TaskEntity task = (TaskEntity) taskQuery.singleResult(); if (Objects.isNull(task)) { - log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); } - if (!validateActivityConfig((task))) { + + if (!validateActivityConfig(task)) { log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); return null; } - addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); runtimeService.trigger(dto.getTriggerId()); return null; } From a603654dccb4357b3ca08c9a35f293ef0ad1bd25 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Nov 2025 11:56:37 +0800 Subject: [PATCH 16/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E7=BB=86=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/core/engine/cmd/CustomCommandContext.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCommandContext.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCommandContext.java index ca0111bde..056d87c45 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCommandContext.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCommandContext.java @@ -40,9 +40,9 @@ public class CustomCommandContext extends CommandContext { } else if (exception instanceof FlowableException && ((FlowableException) exception).isReduceLogLevel()) { // reduce log level, because this may have been caused because of job deletion due to cancelActiviti="true" - LOGGER.info("Error while closing command context", exception); + LOGGER.info("Error while closing command context: {}", exception.getMessage(), exception); } else if (exception instanceof WorkflowEngineException) { - LOGGER.warn("Workflow error while closing command context", exception); + LOGGER.warn("Workflow error while closing command context: {}", exception.getMessage(), exception); } else if (exception instanceof PersistenceException) { Throwable rootCause = getRootCause(exception); if (rootCause instanceof MySQLTransactionRollbackException) { @@ -53,7 +53,7 @@ public class CustomCommandContext extends CommandContext { LOGGER.warn("persistence error while closing command context:{}", exception.getMessage(), exception); } } else { - LOGGER.error("Error while closing command context", exception); + LOGGER.error("Error while closing command context: {}", exception.getMessage(), exception); } } From 415b18f5f15b9bbaf0636516e3841d916ea91905 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Nov 2025 14:42:43 +0800 Subject: [PATCH 17/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomActivityTriggerAsyncCmd.java | 98 +++++++++-------- .../engine/cmd/CustomActivityTriggerCmd.java | 102 +++++++++--------- 2 files changed, 103 insertions(+), 97 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index 6a59c04f9..c1bd71440 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -7,16 +7,19 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; +import org.flowable.engine.runtime.Execution; import org.flowable.job.service.JobService; import org.flowable.job.service.impl.persistence.entity.JobEntity; import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; import java.io.Serializable; import java.util.List; @@ -24,6 +27,7 @@ import java.util.Objects; import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; +import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.findLatestByCreateTime; import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.validateActivityConfig; /** @@ -49,57 +53,57 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple @Override public String execute(CommandContext commandContext) { -// ProcessEngineConfigurationImpl processEngineConfiguration = -// CommandContextUtil.getProcessEngineConfiguration(commandContext); -// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); -// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); -// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); -// -// if (list.size() == 1) { -// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); -// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); -// } -// -// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()).list(); -// if (CollectionUtils.isEmpty(tasks)) { -// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { -// tasks = tasks.stream() -// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) -// .collect(Collectors.toList()); -// } -// -// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); -// if (Objects.isNull(task)) { -// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (!validateActivityConfig((task))) { -// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); -// return null; -// } - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); - TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()); - if (StringUtils.isNotBlank(dto.getActivityId())) { - taskQuery.taskDefinitionKey(dto.getActivityId()); - } - List list = taskQuery.list(); - log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); - TaskEntity task = (TaskEntity) taskQuery.singleResult(); - if (Objects.isNull(task)) { - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); + log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); + + if (list.size() == 1) { + HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); + log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); } - if (!validateActivityConfig(task)) { - log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); - return ""; + List tasks = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()).list(); + if (CollectionUtils.isEmpty(tasks)) { + log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); } + if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { + tasks = tasks.stream() + .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) + .collect(Collectors.toList()); + } + + TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + if (Objects.isNull(task)) { + log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (!validateActivityConfig((task))) { + log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); + return null; + } + +// ProcessEngineConfigurationImpl processEngineConfiguration = +// CommandContextUtil.getProcessEngineConfiguration(commandContext); +// TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()); +// if (StringUtils.isNotBlank(dto.getActivityId())) { +// taskQuery.taskDefinitionKey(dto.getActivityId()); +// } +// List list = taskQuery.list(); +// log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); +// TaskEntity task = (TaskEntity) taskQuery.singleResult(); +// if (Objects.isNull(task)) { +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// +// if (!validateActivityConfig(task)) { +// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); +// return ""; +// } return startAsync(commandContext); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 4f031031f..04a8cfafe 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -5,19 +5,21 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import com.alibaba.fastjson.JSON; -import org.apache.commons.lang3.StringUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; +import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; +import org.flowable.engine.runtime.Execution; import org.flowable.task.api.Task; -import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.io.Serializable; import java.util.Comparator; @@ -53,68 +55,68 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S @Override public Void execute(CommandContext commandContext) { -// ProcessEngineConfigurationImpl processEngineConfiguration = -// CommandContextUtil.getProcessEngineConfiguration(commandContext); -// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); -// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); -// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); -// -// if (list.size() == 1) { -// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); -// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); -// } -// -// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()).list(); -// if (CollectionUtils.isEmpty(tasks)) { -// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (StringUtils.hasText(dto.getActivityId())) { -// tasks = tasks.stream() -// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) -// .collect(Collectors.toList()); -// } -// -// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); -// if (Objects.isNull(task)) { -// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (!validateActivityConfig((task))) { -// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); -// return null; -// } -// -// -// addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); -// runtimeService.trigger(dto.getTriggerId()); -// return null; - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); + log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()); - if (StringUtils.isNotBlank(dto.getActivityId())) { - taskQuery.taskDefinitionKey(dto.getActivityId()); + if (list.size() == 1) { + HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); + log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); } - List list = taskQuery.list(); - log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); - TaskEntity task = (TaskEntity) taskQuery.singleResult(); - if (Objects.isNull(task)) { + + List tasks = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()).list(); + if (CollectionUtils.isEmpty(tasks)) { + log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); } + if (StringUtils.hasText(dto.getActivityId())) { + tasks = tasks.stream() + .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) + .collect(Collectors.toList()); + } - if (!validateActivityConfig(task)) { + TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); + if (Objects.isNull(task)) { + log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + if (!validateActivityConfig((task))) { log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); return null; } + addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); runtimeService.trigger(dto.getTriggerId()); return null; + +// ProcessEngineConfigurationImpl processEngineConfiguration = +// CommandContextUtil.getProcessEngineConfiguration(commandContext); +// +// TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()); +// if (StringUtils.isNotBlank(dto.getActivityId())) { +// taskQuery.taskDefinitionKey(dto.getActivityId()); +// } +// List list = taskQuery.list(); +// log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); +// TaskEntity task = (TaskEntity) taskQuery.singleResult(); +// if (Objects.isNull(task)) { +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// +// if (!validateActivityConfig(task)) { +// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); +// return null; +// } +// +// addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); +// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); +// runtimeService.trigger(dto.getTriggerId()); +// return null; } public static Optional findLatestByCreateTime(List tasks) { From d452465750d55b736ddf0d8269d9f651d0375d88 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Nov 2025 15:12:26 +0800 Subject: [PATCH 18/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomActivityTriggerAsyncCmd.java | 103 ++++++++---------- .../engine/cmd/CustomActivityTriggerCmd.java | 99 ++++++++--------- 2 files changed, 94 insertions(+), 108 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index c1bd71440..98ffe6110 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -5,29 +5,22 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO; import cn.axzo.workflow.core.engine.job.AsyncActivityTriggerJobHandler; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; -import org.apache.commons.lang3.StringUtils; import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; -import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.engine.runtime.Execution; import org.flowable.job.service.JobService; import org.flowable.job.service.impl.persistence.entity.JobEntity; -import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.io.Serializable; -import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; -import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.findLatestByCreateTime; import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.validateActivityConfig; /** @@ -53,57 +46,55 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple @Override public String execute(CommandContext commandContext) { - ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); - log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - - if (list.size() == 1) { - HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); - log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); - } - - List tasks = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()).list(); - if (CollectionUtils.isEmpty(tasks)) { - log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { - tasks = tasks.stream() - .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) - .collect(Collectors.toList()); - } - - TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); - if (Objects.isNull(task)) { - log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (!validateActivityConfig((task))) { - log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); - return null; - } - // ProcessEngineConfigurationImpl processEngineConfiguration = // CommandContextUtil.getProcessEngineConfiguration(commandContext); -// TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()); -// if (StringUtils.isNotBlank(dto.getActivityId())) { -// taskQuery.taskDefinitionKey(dto.getActivityId()); -// } -// List list = taskQuery.list(); -// log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); -// TaskEntity task = (TaskEntity) taskQuery.singleResult(); -// if (Objects.isNull(task)) { -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); +// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); +// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); +// +// if (list.size() == 1) { +// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); +// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); // } // -// if (!validateActivityConfig(task)) { -// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); -// return ""; +// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()).list(); +// if (CollectionUtils.isEmpty(tasks)) { +// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); // } +// if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { +// tasks = tasks.stream() +// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) +// .collect(Collectors.toList()); +// } +// +// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); +// if (Objects.isNull(task)) { +// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (!validateActivityConfig((task))) { +// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); +// return null; +// } + + ProcessEngineConfigurationImpl processEngineConfiguration = + CommandContextUtil.getProcessEngineConfiguration(commandContext); + TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()); + if (StringUtils.hasText(dto.getActivityId())) { + taskQuery.taskDefinitionKey(dto.getActivityId()); + } + TaskEntity task = (TaskEntity) taskQuery.singleResult(); + if (Objects.isNull(task)) { + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + + if (!validateActivityConfig(task)) { + log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); + return ""; + } return startAsync(commandContext); } @@ -113,7 +104,7 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple TaskService taskService = processEngineConfiguration.getTaskService(); TaskEntity task = (TaskEntity) taskService.createTaskQuery() .executionId(dto.getTriggerId()) - .taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId()) + .taskDefinitionKey(StringUtils.hasText(dto.getActivityId()) ? dto.getActivityId() : null) .singleResult(); JobService jobService = processEngineConfiguration.getJobServiceConfiguration().getJobService(); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 04a8cfafe..fa21734df 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -9,16 +9,14 @@ import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; -import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; -import org.flowable.engine.runtime.Execution; import org.flowable.task.api.Task; +import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.Serializable; @@ -26,7 +24,6 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -55,68 +52,66 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S @Override public Void execute(CommandContext commandContext) { - ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); - log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); - - if (list.size() == 1) { - HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); - log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); - } - - List tasks = processEngineConfiguration.getTaskService().createTaskQuery() - .executionId(dto.getTriggerId()).list(); - if (CollectionUtils.isEmpty(tasks)) { - log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (StringUtils.hasText(dto.getActivityId())) { - tasks = tasks.stream() - .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) - .collect(Collectors.toList()); - } - - TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); - if (Objects.isNull(task)) { - log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); - throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); - } - if (!validateActivityConfig((task))) { - log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); - return null; - } - - - addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); - runtimeService.trigger(dto.getTriggerId()); - return null; - // ProcessEngineConfigurationImpl processEngineConfiguration = // CommandContextUtil.getProcessEngineConfiguration(commandContext); +// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); +// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); +// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); // -// TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()); -// if (StringUtils.isNotBlank(dto.getActivityId())) { -// taskQuery.taskDefinitionKey(dto.getActivityId()); +// if (list.size() == 1) { +// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); +// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); // } -// List list = taskQuery.list(); -// log.info("tasks size: {}, activityIds: {}", list.size(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Task::getTaskDefinitionKey).collect(Collectors.toList()))); -// TaskEntity task = (TaskEntity) taskQuery.singleResult(); -// if (Objects.isNull(task)) { +// +// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() +// .executionId(dto.getTriggerId()).list(); +// if (CollectionUtils.isEmpty(tasks)) { +// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); // throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); // } +// if (StringUtils.hasText(dto.getActivityId())) { +// tasks = tasks.stream() +// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) +// .collect(Collectors.toList()); +// } // -// if (!validateActivityConfig(task)) { +// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); +// if (Objects.isNull(task)) { +// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); +// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); +// } +// if (!validateActivityConfig((task))) { // log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); // return null; // } // +// // addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); -// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); // runtimeService.trigger(dto.getTriggerId()); // return null; + + ProcessEngineConfigurationImpl processEngineConfiguration = + CommandContextUtil.getProcessEngineConfiguration(commandContext); + + TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() + .executionId(dto.getTriggerId()); + if (StringUtils.hasText(dto.getActivityId())) { + taskQuery.taskDefinitionKey(dto.getActivityId()); + } + TaskEntity task = (TaskEntity) taskQuery.singleResult(); + if (Objects.isNull(task)) { + throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); + } + + if (!validateActivityConfig(task)) { + log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); + return null; + } + + addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + runtimeService.triggerAsync(dto.getTriggerId()); + return null; } public static Optional findLatestByCreateTime(List tasks) { From fbe3bfd836761981a6df1f2d042fe362a9bf813b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Nov 2025 15:41:55 +0800 Subject: [PATCH 19/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=20trigger=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/CustomActivityTriggerAsyncCmd.java | 33 ------------ .../engine/cmd/CustomActivityTriggerCmd.java | 52 ------------------- 2 files changed, 85 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java index 98ffe6110..bbb35888a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerAsyncCmd.java @@ -46,39 +46,6 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand imple @Override public String execute(CommandContext commandContext) { -// ProcessEngineConfigurationImpl processEngineConfiguration = -// CommandContextUtil.getProcessEngineConfiguration(commandContext); -// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); -// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); -// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); -// -// if (list.size() == 1) { -// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); -// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); -// } -// -// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()).list(); -// if (CollectionUtils.isEmpty(tasks)) { -// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (org.springframework.util.StringUtils.hasText(dto.getActivityId())) { -// tasks = tasks.stream() -// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) -// .collect(Collectors.toList()); -// } -// -// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); -// if (Objects.isNull(task)) { -// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (!validateActivityConfig((task))) { -// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); -// return null; -// } - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); TaskQuery taskQuery = processEngineConfiguration.getTaskService().createTaskQuery() diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index fa21734df..d22f4769d 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -12,7 +12,6 @@ import org.flowable.engine.RuntimeService; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; -import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; @@ -20,10 +19,7 @@ import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.io.Serializable; -import java.util.Comparator; -import java.util.List; import java.util.Objects; -import java.util.Optional; import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS; import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC; @@ -52,44 +48,6 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S @Override public Void execute(CommandContext commandContext) { -// ProcessEngineConfigurationImpl processEngineConfiguration = -// CommandContextUtil.getProcessEngineConfiguration(commandContext); -// RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); -// List list = runtimeService.createExecutionQuery().executionId(dto.getTriggerId()).list(); -// log.info("execution list size: {}, executionId: {}, id: {}", list.size(), dto.getTriggerId(), org.springframework.util.StringUtils.collectionToCommaDelimitedString(list.stream().map(Execution::getId).collect(Collectors.toSet()))); -// -// if (list.size() == 1) { -// HistoricProcessInstance instance = processEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(list.get(0).getProcessInstanceId()).singleResult(); -// log.info("instance business status : {}", Objects.nonNull(instance) ? instance.getBusinessStatus() : "未找到实例"); -// } -// -// List tasks = processEngineConfiguration.getTaskService().createTaskQuery() -// .executionId(dto.getTriggerId()).list(); -// if (CollectionUtils.isEmpty(tasks)) { -// log.info("未通过 triggerId 找到任务集合,无法继续触发,executionId: {}", dto.getTriggerId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (StringUtils.hasText(dto.getActivityId())) { -// tasks = tasks.stream() -// .filter(task -> Objects.equals(task.getTaskDefinitionKey(), dto.getActivityId())) -// .collect(Collectors.toList()); -// } -// -// TaskEntity task = (TaskEntity) findLatestByCreateTime(tasks).orElse(null); -// if (Objects.isNull(task)) { -// log.info("未找到对应的任务,无法继续触发,executionId: {}, activityId: {}", dto.getTriggerId(), dto.getActivityId()); -// throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId()); -// } -// if (!validateActivityConfig((task))) { -// log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey()); -// return null; -// } -// -// -// addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); -// runtimeService.trigger(dto.getTriggerId()); -// return null; - ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); @@ -114,16 +72,6 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S return null; } - public static Optional findLatestByCreateTime(List tasks) { - if (tasks == null || tasks.isEmpty()) { - return Optional.empty(); - } - return tasks.stream() - .filter(Objects::nonNull) - .filter(t -> t.getCreateTime() != null) - .max(Comparator.comparing(Task::getCreateTime)); - } - public static boolean validateActivityConfig(TaskEntity task) { BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId()); FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey()); From 00ecd83eb24bffa31315c2455779dbd1e2b36ae3 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 4 Dec 2025 16:08:31 +0800 Subject: [PATCH 20/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=87=E7=A8=8B=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/listener/TaskEntityEventHandle.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java index 5baa7408d..3ced88921 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java @@ -97,32 +97,35 @@ public class TaskEntityEventHandle implements EntityEventHandle { @Override public void onCreate(TaskEntity taskEntity) { + log.info("TaskEntityEventHandle#onCreate processInstanceId: {}, taskEntityId: {}", taskEntity.getProcessInstanceId(), taskEntity.getTaskDefinitionKey()); // 记录发起人 boolean isNodeStarter = Objects.equals(taskEntity.getTaskDefinitionKey(), NODE_STARTER.getType()); BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(taskEntity.getProcessDefinitionId()); FlowElement flowElement = bpmnModel.getFlowElement(taskEntity.getTaskDefinitionKey()); - ExtAxProcessLog log = new ExtAxProcessLog(); - log.setProcessInstanceId(taskEntity.getProcessInstanceId()); - log.setTenantId(taskEntity.getTenantId()); - log.setActivityId(taskEntity.getTaskDefinitionKey()); - log.setActivityName(taskEntity.getName()); - log.setApprovalMethod((isNodeStarter ? nobody : getApprovalMethod(flowElement).orElse(nobody)).getType()); - log.setNodeType((getNodeType(flowElement).orElse(BpmnFlowNodeType.NODE_EMPTY)).getType()); - log.setNodeMode((isNodeStarter ? BpmnFlowNodeMode.GENERAL : getNodeMode(flowElement)).getType()); - log.setTaskId(taskEntity.getId()); + ExtAxProcessLog processLog = new ExtAxProcessLog(); + processLog.setProcessInstanceId(taskEntity.getProcessInstanceId()); + processLog.setTenantId(taskEntity.getTenantId()); + processLog.setActivityId(taskEntity.getTaskDefinitionKey()); + processLog.setActivityName(taskEntity.getName()); + processLog.setApprovalMethod((isNodeStarter ? nobody : getApprovalMethod(flowElement).orElse(nobody)).getType()); + processLog.setNodeType((getNodeType(flowElement).orElse(BpmnFlowNodeType.NODE_EMPTY)).getType()); + processLog.setNodeMode((isNodeStarter ? BpmnFlowNodeMode.GENERAL : getNodeMode(flowElement)).getType()); + processLog.setTaskId(taskEntity.getId()); String operationDesc = taskEntity.getVariable(COMMENT_TYPE_OPERATION_DESC, String.class); - log.setOperationDesc(StringUtils.hasText(operationDesc) ? operationDesc : HANDLING.getDesc()); - log.setStartTime(taskEntity.getCreateTime()); - log.setStatus(PROCESSING.getStatus()); - log.setSignature(getActivitySignature(flowElement)); + processLog.setOperationDesc(StringUtils.hasText(operationDesc) ? operationDesc : HANDLING.getDesc()); + processLog.setStartTime(taskEntity.getCreateTime()); + processLog.setStatus(PROCESSING.getStatus()); + processLog.setSignature(getActivitySignature(flowElement)); - processLogService.insert(log); + log.info("TaskEntityEventHandle#onCreate insert:{}", JSON.toJSONString(processLog)); + processLogService.insert(processLog); } @Override public void onInitialized(TaskEntity taskEntity) { + log.info("TaskEntityEventHandle#onInitialized processInstanceId: {}, taskEntityId: {}", taskEntity.getProcessInstanceId(), taskEntity.getTaskDefinitionKey()); Process process = ProcessDefinitionUtil.getProcess(taskEntity.getProcessDefinitionId()); ExtAxProcessLog queryLog = new ExtAxProcessLog(); queryLog.setProcessInstanceId(taskEntity.getProcessInstanceId()); @@ -132,15 +135,18 @@ public class TaskEntityEventHandle implements EntityEventHandle { .ifPresent(updateLog::setButtonConf); BpmnMetaParserHelper.getFormFieldPermissionConf(process.getFlowElement(taskEntity.getTaskDefinitionKey())) .ifPresent(updateLog::setFormFieldPermissionConf); + log.info("TaskEntityEventHandle#onInitialized update, queryLog: {}, updateLog: {}", JSON.toJSONString(queryLog), JSON.toJSONString(updateLog)); processLogService.update(queryLog, updateLog); } @Override public void onUpdated(TaskEntity taskEntity) { + log.info("TaskEntityEventHandle#onUpdated processInstanceId: {}, taskEntityId: {}", taskEntity.getProcessInstanceId(), taskEntity.getTaskDefinitionKey()); if (Objects.equals(HIDDEN_ASSIGNEE_ID, taskEntity.getAssignee())) { ExtAxProcessLog queryLog = new ExtAxProcessLog(); queryLog.setProcessInstanceId(taskEntity.getProcessInstanceId()); queryLog.setTaskId(taskEntity.getId()); + log.info("TaskEntityEventHandle#onUpdated delete: {}", JSON.toJSONString(queryLog)); processLogService.delete(queryLog); } else { ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); @@ -157,6 +163,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { // 快照审批人的组织架构信息 OrgStructureSnapshotInfo snapshotInfo = buildApproverOrgStructureInfo(assignee, taskEntity); + log.info("TaskEntityEventHandle#onUpdated updateAssigneeAndSnapshot, queryLog: {}, assignee: {}, snapshotInfo: {}", JSON.toJSONString(queryLog), JSON.toJSONString(assignee), JSON.toJSONString(snapshotInfo)); processLogService.updateAssigneeAndSnapshot(queryLog, assignee, snapshotInfo); }); } @@ -230,6 +237,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { @Override public void onDeleted(TaskEntity taskEntity) { + log.info("TaskEntityEventHandle#onDeleted processInstanceId: {}, taskEntityId: {}", taskEntity.getProcessInstanceId(), taskEntity.getTaskDefinitionKey()); ExtAxProcessLog queryLog = new ExtAxProcessLog(); queryLog.setProcessInstanceId(taskEntity.getProcessInstanceId()); queryLog.setTaskId(taskEntity.getId()); @@ -289,6 +297,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { update.setOperationDesc("抄送" + carbonCopies.size() + "人"); } + log.info("TaskEntityEventHandle#onDeleted update, queryLog: {}, update: {}", JSON.toJSONString(queryLog), JSON.toJSONString(update)); processLogService.update(queryLog, update); if (needDelete) { @@ -296,6 +305,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { ExtAxProcessLog deleteLog = new ExtAxProcessLog(); deleteLog.setProcessInstanceId(taskEntity.getProcessInstanceId()); deleteLog.setTaskId(taskEntity.getId()); + log.info("TaskEntityEventHandle#onDeleted delete, deleteLog: {}", JSON.toJSONString(deleteLog)); processLogService.delete(deleteLog); } } From ce8b67ed15ff7450c23dd9885f1b6108ef9fc414 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 4 Dec 2025 16:51:05 +0800 Subject: [PATCH 21/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=87=E7=A8=8B=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/web/bpmn/BpmnProcessActivityController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java index bdc654c12..444e821df 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/bpmn/BpmnProcessActivityController.java @@ -81,6 +81,7 @@ public class BpmnProcessActivityController extends BasicPopulateAvatarController @Override @RepeatSubmit public CommonResponse trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto) { + log.info("businessNode trigger ===>>>参数:{}", JSON.toJSONString(dto)); String header = request.getHeader(HEADER_SERVER_NAME); String remoteAddr = request.getRemoteAddr(); log.info("业务节点唤醒 trigger ===>>>参数:{}, 请求来自微服务: {}, ip: {}", JSON.toJSONString(dto), header, remoteAddr); From 65540e1685e1201d887b0b6e1a458901acf8396c Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 4 Dec 2025 16:54:45 +0800 Subject: [PATCH 22/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=87=E7=A8=8B=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java | 2 ++ .../core/service/impl/BpmnProcessActivityServiceImpl.java | 1 + 2 files changed, 3 insertions(+) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index d22f4769d..111e7404a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -48,6 +48,7 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S @Override public Void execute(CommandContext commandContext) { + log.info("CustomActivityTriggerCmd execute start, dto: {}", JSON.toJSONString(dto)); ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext); @@ -68,6 +69,7 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + log.info("CustomActivityTriggerCmd triggerAsync"); runtimeService.triggerAsync(dto.getTriggerId()); return null; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java index 5a6a085d2..131a8515a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessActivityServiceImpl.java @@ -47,6 +47,7 @@ public class BpmnProcessActivityServiceImpl implements BpmnProcessActivityServic @Override @Transactional(rollbackFor = Exception.class) public void trigger(BpmnActivityTriggerDTO dto) { + log.info("processActivityService trigger called"); CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor(); if (Boolean.TRUE.equals(dto.getAsync())) { commandExecutor.execute(new CustomActivityTriggerAsyncCmd(dto)); From 9a0945fac108ed3ad2afdf34a5d9e51f8a1b51b4 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 4 Dec 2025 17:25:03 +0800 Subject: [PATCH 23/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=20triggerAsync=20=E5=90=8E=EF=BC=8C=E4=B8=9A=E5=8A=A1=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=96=87=E6=A1=88=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/engine/cmd/helper/CustomTaskHelper.java | 10 +++++++++- .../engine/ext/listener/TaskEntityEventHandle.java | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java index ab58d0007..a39a566bc 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/helper/CustomTaskHelper.java @@ -283,6 +283,10 @@ public class CustomTaskHelper { } public static void addComment(CommandContext commandContext, TaskEntity task, String type, String message) { + addComment(commandContext, task, type, message, false); + } + + public static void addComment(CommandContext commandContext, TaskEntity task, String type, String message, boolean withVariableLocal) { if (!StringUtils.hasText(type) || !StringUtils.hasText(message)) { return; } @@ -307,7 +311,11 @@ public class CustomTaskHelper { comment.setFullMessage(message); processEngineConfiguration.getCommentEntityManager().insert(comment); - task.setTransientVariableLocal(type, message); + if (withVariableLocal) { + task.setVariableLocal(type, message); + } else { + task.setTransientVariableLocal(type, message); + } } public static Attachment addAttachment(CommandContext commandContext, Task task, AttachmentDTO attachmentDto) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java index 3ced88921..6f796d710 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java @@ -45,6 +45,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION; @@ -265,7 +266,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { if (Objects.nonNull(advice) && StringUtils.hasText(advice.toString())) { update.setAdvice(advice.toString()); } - Object operationDesc = taskEntity.getTransientVariableLocal(COMMENT_TYPE_OPERATION_DESC); + Object operationDesc = Optional.ofNullable(taskEntity.getTransientVariableLocal(COMMENT_TYPE_OPERATION_DESC)).orElse(taskEntity.getVariableLocal(COMMENT_TYPE_OPERATION_DESC)); if (Objects.nonNull(operationDesc) && StringUtils.hasText(operationDesc.toString())) { update.setOperationDesc(Objects.nonNull(assignee) ? (StringUtils.hasText(assignee.getAssignerName()) ? assignee.getAssignerName() : "") + operationDesc @@ -275,6 +276,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { (StringUtils.hasText(assignee.getAssignerName()) ? assignee.getAssignerName() : "") : ""); } + taskEntity.removeVariableLocal(COMMENT_TYPE_OPERATION_DESC); String completionType = taskEntity.getVariable(TASK_COMPLETE_OPERATION_TYPE + taskEntity.getId(), String.class); From a49f9bad15bed93914b0f30fe20a6084b1f8aa2a Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 8 Dec 2025 10:20:01 +0800 Subject: [PATCH 24/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=20triggerAsync=20=E5=90=8E=EF=BC=8C=E4=B8=9A=E5=8A=A1=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=96=87=E6=A1=88=E6=B6=88=E5=A4=B1=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java | 2 +- .../server/engine/ext/listener/TaskEntityEventHandle.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 111e7404a..03d97a8f9 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -67,7 +67,7 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S return null; } - addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); + addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意", true); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); log.info("CustomActivityTriggerCmd triggerAsync"); runtimeService.triggerAsync(dto.getTriggerId()); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java index 6f796d710..34575c4c3 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/engine/ext/listener/TaskEntityEventHandle.java @@ -267,6 +267,7 @@ public class TaskEntityEventHandle implements EntityEventHandle { update.setAdvice(advice.toString()); } Object operationDesc = Optional.ofNullable(taskEntity.getTransientVariableLocal(COMMENT_TYPE_OPERATION_DESC)).orElse(taskEntity.getVariableLocal(COMMENT_TYPE_OPERATION_DESC)); + log.info("TaskEntityEventHandle#onDeleted processInstanceId: {}, operationDesc: {}", taskEntity.getProcessInstanceId(), operationDesc); if (Objects.nonNull(operationDesc) && StringUtils.hasText(operationDesc.toString())) { update.setOperationDesc(Objects.nonNull(assignee) ? (StringUtils.hasText(assignee.getAssignerName()) ? assignee.getAssignerName() : "") + operationDesc From 836a95cef8f1c55e4d2281fc7c28bdcc577820c2 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 10 Dec 2025 12:34:39 +0800 Subject: [PATCH 25/25] =?UTF-8?q?feat(REQ-5865)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E5=AE=8C=E6=88=90=E7=9A=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RocketMqBpmnProcessEventListener.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) 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 66629e9f9..87faf2a8c 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 @@ -67,7 +67,7 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< @Override public void onCreated(FlowableEngineEntityEvent event) { - log.info("MessagePushProcessEventListener#onCreated..., processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCreated..., processInstanceId: {}", event.getProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) event.getEntity()).getDeploymentId()).singleResult()); Process mainProcess = getContext().getProcess(() -> repositoryService.getBpmnModel(event.getProcessDefinitionId()).getMainProcess()); @@ -92,13 +92,13 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< setProcessInstanceVersion(event.getProcessInstanceId(), dto); sendMessageQueue(dto, PROCESS_INSTANCE_CREATED); - log.info("MessagePushProcessEventListener#onCreated...end, processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCreated...end, processInstanceId: {}", event.getProcessInstanceId()); } @Override public void onStarted(FlowableProcessStartedEvent event) { - log.info("MessagePushProcessEventListener#onStarted..., processInstanceId: {}", event.getNestedProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onStarted..., processInstanceId: {}", event.getNestedProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) event.getEntity()).getDeploymentId()) .singleResult()); @@ -127,12 +127,12 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< setProcessInstanceVersion(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId(), dto); sendMessageQueue(dto, PROCESS_INSTANCE_STARTED); - log.info("MessagePushProcessEventListener#onStarted...end: {}", ((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onStarted...end: {}", ((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId()); } @Override public void onCancelled(FlowableCancelledEvent event) { - log.info("MessagePushProcessEventListener#onCancelled..., processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCancelled..., processInstanceId: {}", event.getProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId()) .singleResult()); @@ -163,7 +163,7 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< setProcessDeleteReason(event, dto); setProcessInstanceVersion(event.getProcessInstanceId(), dto); sendMessageQueue(dto, PROCESS_INSTANCE_CANCELLED); - log.info("MessagePushProcessEventListener#onCancelled...end, processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCancelled...end, processInstanceId: {}", event.getProcessInstanceId()); } /** @@ -173,7 +173,7 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< */ @Override public void onRejected(FlowableCancelledEvent event) { - log.info("MessagePushProcessEventListener#onRejected..., processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onRejected..., processInstanceId: {}", event.getProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId()) .singleResult()); @@ -204,12 +204,12 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< setProcessDeleteReason(event, dto); setProcessInstanceVersion(event.getProcessInstanceId(), dto); sendMessageQueue(dto, PROCESS_INSTANCE_REJECTED); - log.info("MessagePushProcessEventListener#onRejected...end, processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onRejected...end, processInstanceId: {}", event.getProcessInstanceId()); } @Override public void onAborted(FlowableCancelledEvent event) { - log.info("MessagePushProcessEventListener#onAborted..., processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onAborted..., processInstanceId: {}", event.getProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId()) .singleResult()); @@ -240,12 +240,12 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< setProcessDeleteReason(event, dto); setProcessInstanceVersion(event.getProcessInstanceId(), dto); sendMessageQueue(dto, PROCESS_INSTANCE_ABORTED); - log.info("MessagePushProcessEventListener#onAborted...end, processInstanceId: {}.", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onAborted...end, processInstanceId: {}.", event.getProcessInstanceId()); } @Override public void onCompleted(FlowableEngineEntityEvent event) { - log.info("MessagePushProcessEventListener#onCompleted...,processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCompleted...,processInstanceId: {}", event.getProcessInstanceId()); Deployment deployment = getContext().getDeployment(() -> repositoryService.createDeploymentQuery() .deploymentId(((ExecutionEntityImpl) event.getEntity()).getDeploymentId()) .singleResult()); @@ -279,7 +279,7 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener< } dto.setWorkflowEngineVersion(version); sendMessageQueue(dto, PROCESS_INSTANCE_COMPLETED); - log.info("MessagePushProcessEventListener#onCompleted...end,processInstanceId: {}", event.getProcessInstanceId()); + log.info("RocketMqBpmnProcessEventListener#onCompleted...end,processInstanceId: {}", event.getProcessInstanceId()); } private void setProcessDeleteReason(FlowableCancelledEvent event, ProcessInstanceDTO dto) {