From 31c4a9fd063f18921e44f38c5ae10b3f989b127a Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: Sat, 7 Oct 2023 17:44:31 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=90=8E=E9=87=8D=E6=96=B0=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=B9=B6=E8=A1=8C=E6=B5=81=E7=A8=8B=E9=A9=B3=E5=9B=9E=EF=BC=8C?= =?UTF-8?q?=E6=92=A4=E9=94=80=E5=90=8E=EF=BC=8C=E5=9E=83=E5=9C=BE=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flowable/cmd/DeleteExecutionCmd.java | 32 +++++++++++++++ .../cmd/ExecutionChildByExecutionIdCmd.java | 39 +++++++++++++++++++ .../impl/ActProcessInstanceServiceImpl.java | 17 ++++++-- .../service/impl/ActTaskServiceImpl.java | 16 ++++++-- 4 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java new file mode 100644 index 000000000..698cebd6e --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/DeleteExecutionCmd.java @@ -0,0 +1,32 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.io.Serializable; + +/** + * 删除执行数据 + * + * @author may + */ +public class DeleteExecutionCmd implements Command, Serializable { + + /** + * 执行id + */ + private final String executionId; + + public DeleteExecutionCmd(String executionId) { + this.executionId = executionId; + } + + @Override + public String execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + executionEntityManager.delete(executionId); + return null; + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java new file mode 100644 index 000000000..7ace3fcbd --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/ExecutionChildByExecutionIdCmd.java @@ -0,0 +1,39 @@ +package org.dromara.workflow.flowable.cmd; + +import org.flowable.common.engine.impl.interceptor.Command; +import org.flowable.common.engine.impl.interceptor.CommandContext; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager; +import org.flowable.engine.impl.util.CommandContextUtil; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 获取并行网关执行后保留的执行实例数据 + * + * @author may + */ +public class ExecutionChildByExecutionIdCmd implements Command>, Serializable { + + /** + * 当前任务执行实例id + */ + private final String executionId; + + public ExecutionChildByExecutionIdCmd(String executionId) { + this.executionId = executionId; + } + + @Override + public List execute(CommandContext commandContext) { + ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager(); + // 获取当前执行数据 + ExecutionEntity executionEntity = executionEntityManager.findById(executionId); + // 通过当前执行数据的父执行,查询所有子执行数据 + List allChildrenExecution = + executionEntityManager.collectChildren(executionEntity.getParent()); + return allChildrenExecution.stream().filter(e -> !e.isActive()).collect(Collectors.toList()); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 5e4776b92..86bb697d3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -25,16 +25,16 @@ import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; +import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.*; -import org.flowable.engine.HistoryService; -import org.flowable.engine.RepositoryService; -import org.flowable.engine.RuntimeService; -import org.flowable.engine.TaskService; +import org.flowable.engine.*; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.task.Comment; @@ -66,6 +66,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final HistoryService historyService; private final TaskService taskService; private final IActHiProcinstService iActHiProcinstService; + private final ManagementService managementService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -471,6 +472,14 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService .moveActivityIdsToSingleActivityId(nodeIds, historicTaskInstance.getTaskDefinitionKey()).changeState(); Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).processInstanceId(processInstanceId).list().get(0); taskService.setAssignee(task.getId(), historicTaskInstance.getAssignee()); + //获取并行网关执行后保留的执行实例数据 + ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); + List executionEntities = managementService.executeCommand(childByExecutionIdCmd); + //删除流程实例垃圾数据 + for (ExecutionEntity executionEntity : executionEntities) { + DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); + managementService.executeCommand(deleteExecutionCmd); + } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); return true; } catch (Exception e) { diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index be00d9554..85d6d4292 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -19,9 +19,7 @@ import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; -import org.dromara.workflow.flowable.cmd.AddSequenceMultiInstanceCmd; -import org.dromara.workflow.flowable.cmd.DeleteSequenceMultiInstanceCmd; -import org.dromara.workflow.flowable.cmd.UpdateBusinessStatusCmd; +import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -29,6 +27,7 @@ import org.flowable.engine.*; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.TaskQuery; @@ -80,6 +79,9 @@ public class ActTaskServiceImpl implements IActTaskService { TaskQuery taskQuery = taskService.createTaskQuery(); List taskResult = taskQuery.processInstanceBusinessKey(startProcessBo.getBusinessKey()).taskTenantId(TenantHelper.getTenantId()).list(); if (CollUtil.isNotEmpty(taskResult)) { + if (CollUtil.isNotEmpty(startProcessBo.getVariables())) { + taskService.setVariables(taskResult.get(0).getId(), startProcessBo.getVariables()); + } map.put("processInstanceId", taskResult.get(0).getProcessInstanceId()); map.put("taskId", taskResult.get(0).getId()); return map; @@ -550,6 +552,9 @@ public class ActTaskServiceImpl implements IActTaskService { try { String processInstanceId = task.getProcessInstanceId(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); + //获取并行网关执行后保留的执行实例数据 + ExecutionChildByExecutionIdCmd childByExecutionIdCmd = new ExecutionChildByExecutionIdCmd(task.getExecutionId()); + List executionEntities = managementService.executeCommand(childByExecutionIdCmd); //校验单据 BusinessStatusEnum.checkStatus(processInstance.getBusinessStatus()); //判断是否有多个任务 @@ -573,6 +578,11 @@ public class ActTaskServiceImpl implements IActTaskService { for (Task t : list) { taskService.setAssignee(t.getId(), historicTaskInstance.getAssignee()); } + //删除流程实例垃圾数据 + for (ExecutionEntity executionEntity : executionEntities) { + DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); + managementService.executeCommand(deleteExecutionCmd); + } runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); } catch (Exception e) { throw new ServiceException(e.getMessage());