feat(REQ-3383) - 优化机器人节点完成时,可能导致数据一致的问题
This commit is contained in:
parent
7b6b92242a
commit
a26557305c
@ -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;
|
||||
}
|
||||
@ -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<Void> implements
|
||||
if (CollectionUtils.isEmpty(taskList)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<SimpleTaskDTO> 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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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<SimpleTaskDTO> tasks;
|
||||
private final ExtAxProcessLogService processLogService;
|
||||
|
||||
@Override
|
||||
public void execute(CommandContext commandContext) {
|
||||
processLogService.batchRestore(tasks);
|
||||
}
|
||||
}
|
||||
@ -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<ExtAxProcessLog> genericQuery(ExtAxProcessLog query);
|
||||
|
||||
void restore(String processInstanceId, String taskId);
|
||||
|
||||
void batchRestore(List<SimpleTaskDTO> tasks);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -80,7 +82,15 @@ 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<SimpleTaskDTO> tasks) {
|
||||
if (CollectionUtils.isEmpty(tasks)) {
|
||||
return;
|
||||
}
|
||||
tasks.forEach(task -> extAxProcessLogMapper.restore(task.getProcessInstanceId(), task.getTaskId()));
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ExtAxProcessLog> buildQueryWrapper(ExtAxProcessLog log) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user