activiti6直接跳转到发起人

该文章描述了一个在Activiti6中如何将流程实例从当前任务状态跳转回发起人的方法。通过查询历史任务,获取当前任务和起始任务的节点,创建新的序列流,完成当前任务,并将下一任务指派给发起人。最后恢复原始的流程方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

activiti6直接跳转到发起人
下面是我的图
把1和2完成待办直到3的时候 执行方法会跳转到1
多实例没有试过
自己记录笔记
请添加图片描述

Controller
@PostMapping("/jumpToStart")
	@ApiOperation(value = "退回发起人", httpMethod = "POST", notes = "退回发起人")
	@ResponseBody
	public ResponseVo jumpToStart(String processInstanceId) {
		jbpmProcessinstanceService.jumpToStart(processInstanceId);
		return new ResponseVo<>();
	}
service
public void jumpToStart(String processInstanceId) {

		Task task = ProcessEngines.getDefaultProcessEngine().getTaskService()
				.createTaskQuery().processInstanceId(processInstanceId).singleResult();
		//String processInstanceId = task.getProcessInstanceId();
		//  获取所有历史任务(按创建时间升序)
		List<HistoricTaskInstance> hisTaskList = ProcessEngines.getDefaultProcessEngine().getHistoryService().createHistoricTaskInstanceQuery()
				.processInstanceId(processInstanceId)
				.orderByTaskCreateTime()
				.asc()
				.list();

		if (CollectionUtils.isEmpty(hisTaskList) || hisTaskList.size() < 2) {
			return;
		}

		//  第一个任务
		HistoricTaskInstance startTask = hisTaskList.get(0);
		//  当前任务
		HistoricTaskInstance currentTask = hisTaskList.get(hisTaskList.size() - 1);

		BpmnModel bpmnModel = ProcessEngines.getDefaultProcessEngine().getRepositoryService().getBpmnModel(task.getProcessDefinitionId());

		//  获取第一个活动节点
		FlowNode startFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(startTask.getTaskDefinitionKey());
		//  获取当前活动节点
		FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentTask.getTaskDefinitionKey());

		//  临时保存当前活动的原始方向
		List<SequenceFlow> originalSequenceFlowList = new ArrayList<>();
		originalSequenceFlowList.addAll(currentFlowNode.getOutgoingFlows());
		//  清理活动方向
		currentFlowNode.getOutgoingFlows().clear();

		//  建立新方向
		SequenceFlow newSequenceFlow = new SequenceFlow();
		newSequenceFlow.setId("newSequenceFlowId");
		newSequenceFlow.setSourceFlowElement(currentFlowNode);
		newSequenceFlow.setTargetFlowElement(startFlowNode);
		List<SequenceFlow> newSequenceFlowList = new ArrayList<>();
		newSequenceFlowList.add(newSequenceFlow);
		//  当前节点指向新的方向
		currentFlowNode.setOutgoingFlows(newSequenceFlowList);

		//  完成当前任务
		ProcessEngines.getDefaultProcessEngine().getTaskService().complete(task.getId());

		//  重新查询当前任务
		Task nextTask = ProcessEngines.getDefaultProcessEngine().getTaskService().createTaskQuery().processInstanceId(processInstanceId).singleResult();
		if (null != nextTask) {
			ProcessEngines.getDefaultProcessEngine().getTaskService().setAssignee(nextTask.getId(), startTask.getAssignee());
		}

		//  恢复原始方向
		currentFlowNode.setOutgoingFlows(originalSequenceFlowList);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高空二踢脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值