【Activiti工作流】Activiti 并行子流程
-
業務場景
流程發起後需要多個部門同時處理,部門數根據業務資料來定。一筆業務申請涉及到多個部門,發起崗送出給各個部門處理人,處理人處理後由各個部門的負責人稽核,等待所有部門處理完送出給彙總崗彙總,最後交給彙總崗負責人确認,流程結束。
- 流程圖繪制 子流程繪制
【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程 部門處理人,取傳入的list中的元素【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程 【Activiti工作流】Activiti 并行子流程【Activiti工作流】Activiti 并行子流程 - 部署流程
@Test
public void deploy() {
// 擷取倉庫服務 :管理流程定義
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()// 建立一個部署的建構器
.addClasspathResource("diagrams/WorkPlan.bpmn")// 從類路徑中添加資源,一次隻能添加一個資源
.name("WorkPlan")// 設定部署的名稱
.category("辦公類别")// 設定部署的類别
.deploy();
System.out.println("部署的id" + deploy.getId());
System.out.println("部署的名稱" + deploy.getName());
}
-
啟動流程
流程正常啟動,activiti 會根據傳入的集合大小,建立對應個數的子流程。
@Test
public void startProcess() {
// 指定執行我們剛才部署的工作流程
String processDefiKey = "WorkPlan";
// 業務流水号
String businessKey = "SQ20191109052000001";
// 取運作時服務
RuntimeService runtimeService = processEngine.getRuntimeService();
// 流程變量
Map<String, Object> variables = new HashMap<>();
List<String> list = new ArrayList<String>();
list.add("張三");
list.add("李四");
variables.put("userList", list);
// 取得流程執行個體
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey, businessKey, variables);// 通過流程定義的key來執行流程
System.out.println("流程執行個體id:" + pi.getId());// 流程執行個體id
System.out.println("流程定義id:" + pi.getProcessDefinitionId());// 輸出流程定義的id
// 查詢所有的子流程
List<Task> taskList = processEngine.getTaskService().createTaskQuery()
.processInstanceId(pi.getProcessInstanceId()).list();
variables.clear();
variables.put("approve_status", "111");
// 完成目前節點
for (Task task : taskList) {
// 設定目前辦理人為發起人
processEngine.getTaskService().setAssignee(task.getId(), "發起人");
// 完成目前子流程第一個節點
processEngine.getTaskService().complete(task.getId(), variables);
}
}
這裡list傳入兩個值,啟動流程後,成功送出到兩個節點。
至此可以正常走流程,等待所有子流程處理完,流程才會送出到彙總崗。
-
其他代碼
流程送出的方法
// 完成任務
@Test
public void compileTask() {
String taskId = "47532";
Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();
// taskId:任務id
Map<String, Object> variables = new HashMap<>();
variables.put("approve_status", "111");
processEngine.getTaskService().complete(taskId, variables);
Task nexttask = processEngine.getTaskService().createTaskQuery()
.processInstanceBusinessKey("SQ20191109052000001")//業務流水号
.executionId(task.getExecutionId())//目前執行ID
.singleResult();
if (nexttask != null) {
switch (nexttask.getName()) {
case "部門負責人":
processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "負責人");
break;
case "發起崗":
processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "發起崗");
break;
}
}
System.out.println(nexttask.getId());
System.out.println("目前任務執行完畢" + taskId);
}
查詢處理人任務的方法
/** 查詢目前的個人任務(實際就是查詢act_ru_task表) */
@Test
public void findMyPersonalTask() {
String assignee = "張三";
// 擷取事務Service
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()// 建立任務查詢對象
.taskAssignee(assignee)// 指定個人任務查詢,指定辦理人
.list();// 擷取該辦理人下的事務清單
if (taskList != null && taskList.size() > 0) {
for (Task task : taskList) {
System.out.println("#############################################");
System.out.println("任務ID:" + task.getId());
System.out.println("任務名稱:" + task.getName());
System.out.println("任務的建立時間:" + task.getCreateTime());
System.out.println("任務辦理人:" + task.getAssignee());
System.out.println("流程執行個體ID:" + task.getProcessInstanceId());
System.out.println("執行對象ID:" + task.getExecutionId());
System.out.println("流程定義ID:" + task.getProcessDefinitionId());
System.out.println("#############################################");
}
} else {
System.out.println(assignee + "沒有正在處理的任務");
}
}
yusys