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] =?UTF-8?q?feat(REQ-5865)=20-=20=E6=B5=8B=E8=AF=95=20trigg?= =?UTF-8?q?er=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());