Activiti工作流异常退回流程上一个节点

1.开始调用入口
@Resource
private RemoteWorkFlowService remoteWorkFlowService;//异常退回流程上一个节点

WorkflowAuditParamsDto wfAuditDto = new WorkflowAuditParamsDto();
wfAuditDto.setProcessInstanceId(params.getProcessInstanceId());
wfAuditDto.setFallbackNode(currentWfNodeName);
wfAuditDto.setComment("流程异常处置");//审核意见
remoteWorkFlowService.auditFallbackNode(wfAuditDto, SecurityConstants.INNER);

2.openFeign实现FeignClient

@FeignClient(contextId = "remoteWorkFlowService", 
    value = "xxx-activiti", path = "xxx/workflow", 
    fallbackFactory = RemoteWorkFlowServiceFallbackFactory.class)
public interface RemoteWorkFlowService {
    /**
     * 工作流-退回到指定节点
     *
     * @param dto 审批参数
     * @return 结果
     */
    @PostMapping("xxx/auditFallbackNode")
    Result<String> auditFallbackNode(@RequestBody WorkflowAuditParamsDto dto, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

}


@Slf4j
public class RemoteWorkFlowServiceFallbackFactory implements FallbackFactory<RemoteWorkFlowService> {
    @Override
    public RemoteWorkFlowService create(Throwable cause) {
        log.error("工作流接口内部调用失败:{}", cause.getMessage());
        return new RemoteWorkFlowService() {
            @Override
            public Result<String> auditFallbackNode(WorkflowAuditParamsDto dto, String source) {
                log.error("工作流接口调用失败-退回到指定节点:errorMessage:{}", cause.getMessage());
                return Result.error("工作流接口调用失败-退回到指定节点:请稍后再试!");
            }
        };
    }
}

@ApiOperation(value = "审批流程-退回到指定节点")
@ApiOperationSupport(order = 1)
@PostMapping("/auditFallbackNode")
public Result<?> auditFallbackNode(@RequestBody WorkflowAuditParamsDto dto) {
    if (StringUtils.isBlank(dto.getProcessInstanceId())) {
        return Result.error(HttpStatus.BAD_REQUEST, "Request parameter of getProcessInstanceId cannot be empty!");
    }
    return workflowAuditService.auditFallbackNode(dto.getProcessInstanceId(),dto.getFallbackNode(), dto.getComment());
}

3.具体实现

@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private RepositoryService repositoryService;
@Override
public Result<?> auditFallbackNode(String processInstanceId,String fallbackNode, String comment) {
    if (StringUtils.isBlank(processInstanceId)) {
        return Result.error("parameter of processInstanceId is empty!");
    }
    List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInstanceId).list();
    if (taskList.isEmpty()) {
        return Result.error("找不到要审批的数据");
    }
    String taskId = taskList.get(0).getId();
    forceNode(taskId, fallbackNode,comment);
    return Result.success();
}

/**
 * 强制跳转节点
 * @param taskId 任务id
 * @param fallbackNode 节点id
 * @param comment
 * @return
 */
public Boolean forceNode(String taskId, String fallbackNode,String comment){
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    String processDefinitionId = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
    BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
    Execution execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();
    String activityId = execution.getActivityId();
    FlowNode currentFlowNode =  (FlowNode)bpmnModel.getMainProcess().getFlowElement(activityId);
    FlowNode targetFlowNode =  (FlowNode)bpmnModel.getMainProcess().getFlowElement(fallbackNode);
    //节点连线
    List<SequenceFlow> sequenceFlowList = new ArrayList<>();
    SequenceFlow sequenceFlow = new SequenceFlow();
    sequenceFlow.setId("newFlow");
    sequenceFlow.setSourceFlowElement(currentFlowNode);
    sequenceFlow.setTargetFlowElement(targetFlowNode);
    sequenceFlowList.add(sequenceFlow);
    // 备份原流程
    List<SequenceFlow> dataflows = currentFlowNode.getOutgoingFlows();
    List<SequenceFlow> oriSequenceFlows = new ArrayList<SequenceFlow>();
    oriSequenceFlows.addAll(dataflows);
    currentFlowNode.getOutgoingFlows().clear();
    currentFlowNode.setOutgoingFlows(sequenceFlowList);
    taskService.addComment(taskId, task.getProcessInstanceId(), comment);
    taskService.claim(taskId, operateName());
    taskService.complete(taskId);
    currentFlowNode.setOutgoingFlows(oriSequenceFlows);
    return true;
}

参考1:

https://blog.csdn.net/wufaqidong1/article/details/128427063

参考2:activiti工作流核心java api使用,activiti退回、跳过、强制结束实现,BpmnModel模型操作,运行中流程图、获取流程变量、候选人操作_java_Henry-tech-华为开发者空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值