1. 流程定義節點
a) <processname=”” xmlns=”” key=””, version=””>
b) name:
i. 流程定義的名稱;
c) key:
i. 流程關鍵字(鍵值);
ii. 如果默認不寫key值,就是name值;
iii. 在程序通過key值去啓動一個流程實例;
d) version:
i. 必須在數據庫中存入指定版本號;
ii. 如果版本之前已經存在,報錯;
iii. 不指定,數據庫完成自增;
e) xmlns:
i. 引入schema約束,編寫文件提示效果;
ii. 配置該文件會有提示;
iii. 解壓目錄src/jpdl-4.4.xsd;
2. transition流轉節點:(指向線條)
a) 節點適用:
i. 一個活動可以指定一個或多個transition節點;
ii. start只能有一個transition流轉節點;
iii. end沒有;
iv. 活動可以添加transition流轉,可以添加一個或多個
3. 多transition流轉選擇;
a) 通過TaskService完成時指定:
i. 完成任務時,指定任務流轉節點名稱;
ii. 適用於當前正在執行任務,
taskService.complateTask(任務id, transition名字);
b) 示例:
public voidtestTransitionByTaskService() { //獲取流程實例對學校 ProcessInstanceprocessInstance = processEngine.getExecutionService() .startProcessInstanceByKey("transition"); //獲取任務對象 Task task = processEngine.getTaskService() .createTaskQuery() .processInstanceId(processInstance.getId()) .uniqueResult(); System.out.println(task.getId()); //下一步流程的transitionName String transitionName = "to 審覈【經理】"; //控制下一步流轉 //傳入當前任務的id,下一個節點的name processEngine.getTaskService() .completeTask(task.getId(), transitionName); }
c) 通過ExecutionService指定:
i. 用於狀態停留節點(state),無任務;
executionService.singalExecutionById(執行id, transition名字) processEngine.getExecutionService().signalExecutionById("transition.10001",transitionName);
ii. 執行id獲取方法:
1. jbpm4_execution表的id字段;
2. ProcessInstance#getId():執行流程獲取id;
d) 示例:
public voidtestTransitionTest() { //下一個流程執行節點name String transitionName = "to 審覈【經理】"; processEngine.getExecutionService() .signalExecutionById("transition.10001", transitionName); }
4. start
a) 開始節點;
5. end:
a) 結束節點;
b) end-cancel:
i. 取消結束;
c) end-error:
i. 異常結束節點
6. task任務節點:
a) 條件:
i. 存在負責人,由指定的負責人進行任務的辦理;
ii. Assignment--->assignee
b) 指定負責人的方式:
i. 繪圖時指定(個人、#{變量名})
ii. 通過<task>中添加<assignment-handler class=””>指定類;
7. task任務——指定個人:
a) 繪圖時指定;
Assignment--->assignee---->個人名稱
b) 缺點:
i. 與人就行耦合,人離職就不能使用了;
c) 通過變量指定;
Assignment--->assignee---->#{變量名}
d) 運行中,通過變量指定負責人:
i. 定義Map變量;
ii. 通過executionService、TaskService設置;
e) 示例:
Map<String, Object> assigne = new HashMap<String, Object>(); assigne.put("userName", "張三"); processEngine.getExecutionService().startProcessInstanceByKey("task", assigne);
8. task任務——指定類
a) 方式:
i. <task>中添加<assignment-handler class=””>指定類;
b) 類:
i. 實現接口AssignmentHandler
c) 重寫方法:
i. assign(assignable,openExecution)
d) 參數:
i. assignable:指定負責人的
1. assignable.setAssignee(負責人)
ii. openExecution:獲取變量的;
1. .getVariable();
e) 好處:
i. 可以有效控制任務的負責人;
ii. 可以添加邏輯;
f) 示例:
public class AssignmentHandlerTest implements AssignmentHandler{ @Override public void assign(Assignable assignable, OpenExecution openExecution) throws Exception { //通過獲取變量指定 // String userName=(String)openExecution.getVariable("userName"); // assignable.setAssignee(userName); assignable.setAssignee("李四"); } }
9. task任務——強制指定負責人
a) 用途:
i. 當前任務已經有負責人了,強制更換負責人;
ii. 可以在任務完成之前的任何時候;
b) 方式:
taskService.assignTask(任務id,負責人)
c) 示例:
processEngine.getTaskService().assignTask("30010", "王五");
10. 組任務candidate---多用戶(繪圖):
a) 用途:
i. 存在一個任務,該任務由指定一組人來完成;
ii. 組內任何人都可以完成;
b) 方式:
i. 繪圖時:Assignment----type---candidate-user
ii. Assignment----expression---多個用戶之間“,”隔開;
iii. 小王,小麗,小六
iv.
c) 表jbpm4_participation:
i. 多用戶數據被存在於jbpm4_participation中;
ii. 在jbpm4_task表中當前任務沒有負責人;
d) 查詢組任務:
i. taskService.findGroupTasks(組中定義的用戶名之一)
e) 拾取任務:
taskService.takeTask(任務id,任務負責人)
i. 任務被拾取後,其它人將不可再次查詢,拾取
ii. 組任務被拾取後,就變成個人任務了,不再是組任務;
f) 拾取任務後操作:
i. 自己完成;
ii. 改變任務負責人
iii. 將任務歸還任務組;
g) 改變任務負責人:
taskService.assignTask(任務id,其它用戶);
h) 將任務歸還任務組
taskService.assignTask(任務id,null);
i) 查詢個人任務:
findPersonalTask();
11. 組用戶——多用戶(assignment-handler)
a) <task>節點,添加:
<assignment-handlerclass=””>
b) 組用戶類:
i. 實現AssignmentHandler接口;
ii. 重寫方法assign(assignable, openExecution)
c) 添加組用戶:
assignable.addCandidate(用戶之一);
d) 實例:
public class GroupTaskAssignmentHandler implements AssignmentHandler{ @Override public void assign(Assignable assignable, OpenExecution openExecution) throwsException { //指定組內候選人 assignable.addCandidateUser("一毛"); assignable.addCandidateUser("二毛"); assignable.addCandidateUser("三毛"); } }
12. 組任務—已存在組添加用戶:
a) 添加方法:
public void testTaskGroupAssignPersonal() { String user = "四毛"; //將任務指派給組內某個成員 processEngine.getTaskService().addTaskParticipatingUser("80009", user, Participation.CANDIDATE); }
13. state:
a) 狀態節點;
i. 自動完成的一些任務的節點;
ii. 同其它節點的執行;
14. decision判斷節點:
a) 作用:
i. 主要用於分支情況;
ii. 根據 自定義方式控制節點的流轉;
b) handler class :
i. 指定判斷類;
ii. 實現接口:DecisionHandler;
iii. 重寫方法decide():
iv. 參數openExcution:
1. 用於獲得流程運行過程中的一些變量;
2. .getVarable(“變量name”);
v. 返回值:
1. 下一個流程節點的“name”
c) 實例:
i. DecisionHandler:
public class DecisionHandlerTest implements DecisionHandler{ @Override public Stringdecide(OpenExecution openExecution) { //獲取參數 double money = (Double)openExecution.getVariable("money"); if(money< 10000) { return "to結束"; } else{ return "to審批【總經理】"; } } }
15. fork/join分支、合併節點:
a) 作用:
i. 表示並行的、一定要執行的任務;
ii. 在fork分支後,一定要用join將分支合併;
b) 整個任務必須所有的分支都執行完畢,方可完成;