从容应对审批流程退回:详细操作指南
700 字大约 2 分钟2024年12月2日
1. 获取当前节点信息
在实现退回功能时,首先需要获取到当前流程实例所在的节点信息。可以通过流程实例 ID 获取当前节点:
TaskService taskService = processEngine.getTaskService();
Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
String currentTaskId = currentTask.getId();
2.1. 退回至上一节点
如果需要将流程退回至上一节点,可以通过以下步骤实现:
查找上一节点
获取当前节点的上一节点信息:
public String getPreviousActivityId(HistoricActivityInstance currentActivity) {
List<HistoricActivityInstance> activities = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(currentActivity.getProcessInstanceId())
.orderByHistoricActivityInstanceStartTime().asc()
.list();
HistoricActivityInstance previousActivity = null;
for (int i = 0; i < activities.size(); i++) {
if (activities.get(i).getId().equals(currentActivity.getId()) && i > 0) {
previousActivity = activities.get(i - 1);
break;
}
}
return previousActivity != null ? previousActivity.getActivityId() : null;
}
删除当前节点并回退
删除当前任务节点,使流程回退到上一节点:
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.createProcessInstanceModification(processInstanceId)
.cancelActivityInstance(currentActivity.getActivityInstanceId())
.startBeforeActivity(previousActivityId)
.execute();
2.2. 退回至开始节点
如果需要将流程退回至开始节点,可以通过以下步骤实现:
获取开始节点
确定流程定义中的开始节点:
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(currentTask.getProcessDefinitionId())
.singleResult();
String startActivityId = getStartActivityId(processDefinition);
重置流程实例
将流程实例重置到开始节点:
runtimeService.createProcessInstanceModification(processInstanceId)
.cancelAllForActivity(startActivityId)
.startBeforeActivity(startActivityId)
.execute();
3. 更新数据库表
在流程退回操作完成后,需要更新数据库中的相关记录,确保数据的一致性。假设我们已经创建了以下数据库表:
- Process_Instances: 存储流程实例的信息
- Approval_Tasks: 存储审批任务的信息
- Approval_Logs: 存储审批操作日志
更新流程实例表中的状态:
UPDATE Process_Instances
SET Status = 'RETURNED', Updated_At = NOW()
WHERE Process_Instance_ID = ?;
更新相关审批任务表中的任务状态:
UPDATE Approval_Tasks
SET Status = 'RETURNED', Completed_At = NOW()
WHERE Process_Instance_ID = ? AND Task_ID = ?;
记录退回操作日志:
INSERT INTO Approval_Logs (Task_ID, Approver_ID, Action, Timestamp, Comments)
VALUES (?, ?, 'RETURNED', NOW(), '任务已退回');