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:

5729

被折叠的 条评论
为什么被折叠?



