From a26557305ca10cae41ef8b78dfeb8bf3b3ce777e Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 9 Dec 2024 14:38:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-3383)=20-=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=9C=BA=E5=99=A8=E4=BA=BA=E8=8A=82=E7=82=B9=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=80=E8=87=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/model/dto/SimpleTaskDTO.java | 26 +++++++++++++++++ .../cmd/CustomCompleteDummyTaskCmd.java | 11 ++++++-- .../RobotTaskTransactionListener.java | 28 +++++++++++++++++++ .../core/service/ExtAxProcessLogService.java | 3 ++ .../impl/ExtAxProcessLogServiceImpl.java | 28 +++++++++++++------ 5 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/RobotTaskTransactionListener.java diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java new file mode 100644 index 000000000..0b2ea2462 --- /dev/null +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/SimpleTaskDTO.java @@ -0,0 +1,26 @@ +package cn.axzo.workflow.common.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 简单的任务模型 + * + * @author wangli + * @since 2024-12-09 14:30 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SimpleTaskDTO { + /** + * 流程实例 ID + */ + private String processInstanceId; + + /** + * 任务 ID + */ + private String taskId; +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java index aac271f09..c122e0bc3 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomCompleteDummyTaskCmd.java @@ -1,18 +1,22 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; +import cn.axzo.workflow.common.model.dto.SimpleTaskDTO; import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.exception.WorkflowEngineException; import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper; +import cn.axzo.workflow.core.engine.tx.listener.RobotTaskTransactionListener; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; import cn.axzo.workflow.core.service.ExtAxProcessLogService; import com.alibaba.fastjson.JSON; +import org.flowable.common.engine.impl.cfg.TransactionState; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.TaskService; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; +import org.flowable.engine.impl.context.Context; import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.task.api.Task; import org.flowable.task.service.impl.persistence.entity.TaskEntity; @@ -20,6 +24,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.io.Serializable; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -119,16 +124,18 @@ public class CustomCompleteDummyTaskCmd extends AbstractCommand implements if (CollectionUtils.isEmpty(taskList)) { return; } + + List restoreTasks = new ArrayList<>(); taskList.stream().filter(i -> !Objects.equals(i.getTaskDefinitionKey(), NODE_ROBOT.getType())) .filter(i -> Objects.equals(i.getAssignee(), HIDDEN_ASSIGNEE_ID)) .forEach(i -> { taskService.setAssignee(i.getId(), i.getOwner()); taskService.setOwner(i.getId(), null); - // TODO 待测试事务是否能在同一个 - extAxProcessLogService.restore(i.getProcessInstanceId(), i.getId()); + restoreTasks.add(new SimpleTaskDTO(i.getProcessInstanceId(), i.getId())); }); + Context.getTransactionContext().addTransactionListener(TransactionState.COMMITTED, new RobotTaskTransactionListener(restoreTasks, extAxProcessLogService)); } } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/RobotTaskTransactionListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/RobotTaskTransactionListener.java new file mode 100644 index 000000000..0aee568d0 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/tx/listener/RobotTaskTransactionListener.java @@ -0,0 +1,28 @@ +package cn.axzo.workflow.core.engine.tx.listener; + +import cn.axzo.workflow.common.model.dto.SimpleTaskDTO; +import cn.axzo.workflow.core.service.ExtAxProcessLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.impl.cfg.TransactionListener; +import org.flowable.common.engine.impl.interceptor.CommandContext; + +import java.util.List; + +/** + * 恢复创建机器人节点时暂停的审批人任务 + * + * @author wangli + * @since 2024-12-09 14:26 + */ +@Slf4j +@AllArgsConstructor +public class RobotTaskTransactionListener implements TransactionListener { + private final List tasks; + private final ExtAxProcessLogService processLogService; + + @Override + public void execute(CommandContext commandContext) { + processLogService.batchRestore(tasks); + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxProcessLogService.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxProcessLogService.java index 0fb875369..d3f4a6859 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxProcessLogService.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxProcessLogService.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.core.service; +import cn.axzo.workflow.common.model.dto.SimpleTaskDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog; @@ -55,4 +56,6 @@ public interface ExtAxProcessLogService { List genericQuery(ExtAxProcessLog query); void restore(String processInstanceId, String taskId); + + void batchRestore(List tasks); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxProcessLogServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxProcessLogServiceImpl.java index f7e78a90c..4dccf3f5b 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxProcessLogServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxProcessLogServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.core.service.impl; +import cn.axzo.workflow.common.model.dto.SimpleTaskDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog; import cn.axzo.workflow.core.repository.mapper.ExtAxProcessLogMapper; @@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; @@ -59,7 +61,7 @@ public class ExtAxProcessLogServiceImpl implements ExtAxProcessLogService { @Override public void updateAssignee(ExtAxProcessLog queryLog, BpmnTaskDelegateAssigner assignee, String operationDesc) { List filterAssignee = Lists.newArrayList(NO_ASSIGNEE, HIDDEN_ASSIGNEE_ID, ROBOT_ASSIGNEE_ID, - DUMMY_ASSIGNEE_ID); + DUMMY_ASSIGNEE_ID); if (Objects.isNull(assignee) || filterAssignee.contains(assignee.buildAssigneeId())) { return; } @@ -80,17 +82,25 @@ public class ExtAxProcessLogServiceImpl implements ExtAxProcessLogService { @Override public void restore(String processInstanceId, String taskId) { - extAxProcessLogMapper.restore(processInstanceId, taskId); + batchRestore(Lists.newArrayList(new SimpleTaskDTO(processInstanceId, taskId))); + } + + @Override + public void batchRestore(List tasks) { + if (CollectionUtils.isEmpty(tasks)) { + return; + } + tasks.forEach(task -> extAxProcessLogMapper.restore(task.getProcessInstanceId(), task.getTaskId())); } LambdaQueryWrapper buildQueryWrapper(ExtAxProcessLog log) { return new LambdaQueryWrapper() - .eq(Objects.nonNull(log.getId()), ExtAxProcessLog::getId, log.getId()) - .eq(StringUtils.hasText(log.getProcessInstanceId()), ExtAxProcessLog::getProcessInstanceId, log.getProcessInstanceId()) - .eq(StringUtils.hasText(log.getActivityId()), ExtAxProcessLog::getActivityId, log.getActivityId()) - .eq(StringUtils.hasText(log.getActivityName()), ExtAxProcessLog::getActivityName, log.getActivityName()) - .eq(StringUtils.hasText(log.getTaskId()), ExtAxProcessLog::getTaskId, log.getTaskId()) - .eq(StringUtils.hasText(log.getTenantId()), ExtAxProcessLog::getTenantId, log.getTenantId()) - .eq(ExtAxProcessLog::getIsDelete, log.getIsDelete()); + .eq(Objects.nonNull(log.getId()), ExtAxProcessLog::getId, log.getId()) + .eq(StringUtils.hasText(log.getProcessInstanceId()), ExtAxProcessLog::getProcessInstanceId, log.getProcessInstanceId()) + .eq(StringUtils.hasText(log.getActivityId()), ExtAxProcessLog::getActivityId, log.getActivityId()) + .eq(StringUtils.hasText(log.getActivityName()), ExtAxProcessLog::getActivityName, log.getActivityName()) + .eq(StringUtils.hasText(log.getTaskId()), ExtAxProcessLog::getTaskId, log.getTaskId()) + .eq(StringUtils.hasText(log.getTenantId()), ExtAxProcessLog::getTenantId, log.getTenantId()) + .eq(ExtAxProcessLog::getIsDelete, log.getIsDelete()); } }