最近在工作中遇到一个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