Activiti 并行网关实现撤回功能

最近在工作中遇到一个Activiti
工作流的撤回功能,不是驳回,驳回可以直接由当前任务操作人员完成,但是撤回不一样,撤回是上一个任务人员操作的,并且把当前任务结束掉,活动任务回到上一个任务上面去,以下是自己的设计思路,以及完成方案

思路:
从主路撤回到主路的上一节点
从支路撤回到主路的上一节点
从支路撤回到支路的上一节点
从主路撤回到支路的上一节点
分别如图:
在这里插入图片描述在这里插入图片描述
从支路撤回到支路的上一节点(在包含网关中的支路任意一个节点已经审批,则回复审批的任务,图中的1或者2都是)

在这里插入图片描述在这里插入图片描述找到这四种类型之后,基本发现了一个规律:
必须得有至少一个当前运行节点(对应数据库中表:act_hi_actinst)
至少一个当前运行任务(对应数据库中表:act_ru_task)
至少一个目标运行节点(对应数据库中表:act_hi_actinst)
至少一个目标运行任务(对应数据库中表:act_hi_taskinst)

设计思路:
在这里插入图片描述
查找当前任务:

/**
 * 查询当前正在运行的任务
 *
 * @param processInstanceId
 * @return
 */
List<Task> findCurrentTask(String processInstanceId) {
   
    List<Task> list = taskService
            .createTaskQuery()
            .processInstanceId(processInstanceId)
            .active()
            .list();
    for (Task task : list) {
   
        log.info("当前运行的任务id:{},name:{},definaKey:{}", task.getId(), task.getName(),
                task.getTaskDefinitionKey());
    }
    return list;
}

查找目标任务:倒序排序,取最近的一个

/**
 * 查询要退回的目标任务
 *
 * @param targetActivity
 * @param processInstanceId
 * @return
 */
HistoricTaskInstanceEntity findTargetTask(String targetActivity, String processInstanceId) {
   
    List<HistoricTaskInstance> list = historyService
            .createHistoricTaskInstanceQuery()
            .taskDefinitionKey(targetActivity)
            .processInstanceId(processInstanceId)
            .orderByTaskCreateTime()
            .desc()
            .list();
    for (HistoricTaskInstance hti : list) {
   
        log.info("要退回的目标任务id:{},name:{},definaKey:{}",
                hti.getId(), hti.getName(), hti.getTaskDefinitionKey());
    }
    return (HistoricTaskInstanceEntity) list.get(0);
}

查找当前运行节点:略
查找目标运行节点集合:略
验证目标节点是否是当前节点的上一个节点:
/**
 * 查找目标activity
 *
 * @param curr
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Activiti中,如果在并行处需要进行回退操作,可以采用以下方法: 1. 使用多实例任务:在并行处创建多个实例任务,每个任务都是独立运行的,如果需要回退操作,可以通过撤销或跳转到之前的任务来实现回退。 2. 使用Java API:通过使用Activiti的Java API,在并行处根据需要的情况,将正在执行的任务撤销或跳转到之前的任务。可以使用如下代码示例: ```java // 获取当前流程实例的任务列表 List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); // 获取需要回退的任务,并将其设置为活动状态,将其他正在执行的任务设置为完结状态 for (Task task : tasks) { if (task.getTaskDefinitionKey().equals("parallelGatewayId")) { taskService.complete(task.getId()); } else { // 回退到之前的任务节点,例如:可以将其跳转到上一个用户任务节点 BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); FlowNode targetFlowNode = (FlowNode) bpmnModel.getFlowElement(previousTaskDefinitionKey); // 通过工作流的Java API实现任务的跳转 managementService.executeCommand(new JumpTaskCmd(task.getId(), targetFlowNode.getId())); } } ``` 3. 使用流程动态调整:通过在运行时动态调整流程,将并行后的任务回退,然后再重新启动回退的任务。可以使用如下代码示例: ```java // 创建一个HistoricActivityInstanceQuery对象,获取并行后的任务节点 HistoricActivityInstanceQuery historicQuery = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId).activityType("parallelGateway"); // 获取并行后的任务节点的历史实例列表 List<HistoricActivityInstance> historicInstances = historicQuery.list(); // 回退并行后的任务节点 for (HistoricActivityInstance activityInstance : historicInstances) { // 设置任务节点为撤销状态 runtimeService.createProcessInstanceModification(processInstanceId) .cancelActivityInstances(activityInstance.getId()) .execute(); } // 重新启动回退的任务节点 runtimeService.createProcessInstanceModification(processInstanceId) .startBeforeActivity(taskDefinitionKey) .execute(); ``` 以上是在Activiti实现并行回退的几种方法,具体选择哪种方法应根据具体的业务需求和实际情况进行酌情选择。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值