Activiti工作流之流程变量
1.什么是流程變量
流程變量在 activiti 中是一個非常重要的角色,流程運轉有時需要靠流程變量,業務系統和 activiti 結合時少不了流程變量,流程變量就是 activiti 在管理工作流時根據管理需要而設置的變量。
比如在請假流程流轉時如果請假天數大于 3 天則由總經理審核,否則由人事直接審核,請假天數就可以設置為流程變量,在流程流轉時使用。
注意:
如果將 pojo 存儲到流程變量中,必須實現序列化接口 serializable,為了防止由于新增字段無法反序列化,需要生成 serialVersionUID
2.流程變量作用域
流程變量的作用域默認是一個流程實例(processInstance),也可以是一個任務(task)或一個執行實例(execution),這三個作用域流程實例的范圍最大,可以稱為 global 變量,任務和執行實例僅僅是針對一個任務和一個執行實例范圍,范圍沒有流程實例大,稱為 local 變量。
-
global 變量中變量名不允許重復,設置相同名稱的變量,后設置的值會覆蓋前設置的變量值。
-
Local 變量由于在不同的任務或不同的執行實例中,作用域互不影響,變量名可以相同沒有影響。
-
Local 變量名也可以和 global 變量名相同,沒有影響。
3.流程變量使用方法
第一步:設置流程變量
第二步:通過UEL表達式使用流程變量
(1)可以在assginee處設置UEL表達式,表達式的值為任務的負責人,比如${assignee}
(2)可以在連線上設置UEL表達式,決定流程走向,比如${num>3}
4.使用Global變量控制流程
(1)需求
員工創建請假申請單,由部門經理審核,部門經理審核通過后請假 3 天及以下由人事經理直接審核,3 天以上先由總經理審核,總經理審核通過再由人事經理存檔。
(2)流程定義
流程審批的人為方便測試設置為固定值:
填寫請假申請單:zhangsan
部門經理審批:lisi
總經理審批:wangwu
人事經理存檔:zhaoliu
?
根據請假天數走不同的分支:
?
(3)啟動流程時設置
在啟動流程時設置流程變量,變量的作用域是整個流程實例。
通過 map<key,value>設置流程變量,map 中可以設置多個變量,這個 key 就是流程變量的名字。
// 啟動流程時設置流程變量 @Testpublic void startProcessInstance() {// 流程定義keyString processDefinitionKey = "";Holiday holiday = new Holiday();holiday.setNum(3f);// 定義流程變量Map<String, Object> variables = new HashMap<>();//變量名是num,變量值是holiday.getNum(),變量名也可以是一個對象variables.put("num", holiday.getNum());//1.創建ProcessEngineer對象ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//2.獲取runtimeServiceRuntimeService runtimeService = processEngine.getRuntimeService();ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);System.out.println(" 流 程 實 例 id:" + processInstance.getProcessInstanceId());}(4)創建請假實體類對象
/*** 請假實體類:* ? 注意POJO類型,一定要實現Serializable接口,否則在存儲這個pojo時就會報異常*/ @Data public class Holiday implements Serializable {private Integer id;private String holidayName;//申請人的名字private Date beginDate;//開始時間private Date endDate;//結束日期private Float num;//請假天數private String reason;//事由private String type;//請假類型}(4)流程定義部署
? ?//新的請假流程定義的部署public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到RepositoryService對象RepositoryService repositoryService = processEngine.getRepositoryService(); ?//3.部署Deployment deploy = repositoryService.createDeployment().addClasspathResource("diagram/holiday4.bpmn").addClasspathResource("diagram/holiday4.png").name("請假流程-流程變量").deploy(); ?System.out.println(deploy.getId());System.out.println(deploy.getName());}(5)啟動流程實例
? ?//啟動流程實例,同時還要設置流程變量的值// act_ge_bytearray// act_ru_variablepublic static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到RuntimeServiceRuntimeService runtimeService = ?processEngine.getRuntimeService(); ?//3.流程定義的key問題String key = "holiday4";Map<String ,Object> map = new HashMap<>(); ?Holiday holiday = new Holiday();holiday.setNum(5F);map.put("holiday",holiday); ?//4.啟動流程實例,并且設置流程變量的值ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, map); ?//5.輸出實例信息System.out.println(processInstance.getName());System.out.println(processInstance.getProcessDefinitionId()); ?}(6)執行流程
依次執行zhangsan,lisi,wangwu,zhaoliu的任務
? ?public static void main(String[] args) {//完成任務 zhangsan -----lisi----判斷流程變量的請假天數,1天----分支:人事經理存檔(zhaoliu)//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到TaskServiceTaskService taskService = processEngine.getTaskService(); ?//3.查詢當前用戶是否有任務String key = "holiday4";Task task = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee("zhangsan").singleResult(); ?//4.判斷task!=null,說明當前用戶有任務if(task!=null){taskService.complete(task.getId());System.out.println("任務執行完畢");} ?}通過創建流程實例時設置的請假天數num變量,可以發現當num>3的時候,在通過部門經理審批后,會先走總經理審批。當num=3的時候,在通過部門經理審批后,就可以直接到達人事經理存檔環節。
(7)global變量的其它設置方法
global除了在啟動流程時設置,還可以在以下步驟中設置
-
任務辦理時設置
在完成任務時設置流程變量,該流程變量只有在該任務完成后其它結點才可使用該變量,它的作用域是整個流程實例,如果設置的流程變量的 key 在流程實例中已存在相同的名字則后設置的變量替換前邊設置的變量。
? ?public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到TaskServiceTaskService taskService = processEngine.getTaskService(); ?//3.查詢當前用戶是否有任務String key = "holiday4";Task task = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee("zhangsan").singleResult(); ?//初始化一些參數Map<String ,Object> map = new HashMap<>(); ?Holiday holiday = new Holiday();holiday.setNum(5F);map.put("holiday",holiday); ?//4.判斷task!=null,說明當前用戶有任務if(task!=null){taskService.complete(task.getId(),map);//完成任務時,設置流程變量的值System.out.println("任務執行完畢");} ?}-
通過當前流程實例設置
通過流程實例 id 設置全局變量,該流程實例必須未執行完成
? ?public static void main(String[] args) {//1.得到ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ?//2.得到RuntimeServiceRuntimeService runtimeService = ?processEngine.getRuntimeService(); ?//3.流程定義的key問題 ? myProcess_1//Map<String ,Object> map = new HashMap<>(); ?Holiday holiday = new Holiday();holiday.setNum(5F);// map.put("holiday",holiday); ?//4.通過實例id,來設置流程變量//第一個參數:流程實例的id//第二個參數:流程變量名//第三個變量:流程變量名,所對應的值runtimeService.setVariable("2501","holiday",holiday); ?}-
通過當前任務設置
5.設置local流程變量
(1)任務辦理時設置
任務辦理時設置 local 流程變量,當前運行的流程實例只能在該任務結束前使用,任務結束該變量無法在當前流程實例使用,可以通過查詢歷史任務查詢。
? ?// 辦理任務時設置local流程變量@Testpublic void completTask() { //任務idProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();String taskId = "1404";TaskService taskService = processEngine.getTaskService();// 定義流程變量Map<String, Object> variables = new HashMap<String, Object>();Holiday holiday = new Holiday();holiday.setNum(3f);// 定義流程變量variables.put("holiday", holiday);// 設置local變量,作用域為該任務 // taskService.setVariablesLocal(tasked, variables);taskService.complete(taskId);}(2)通過當前任務設置
? ?@Testpublic void setLocalVariableByTaskId(){ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//當前待辦任務idString taskId="1404";TaskService taskService = processEngine.getTaskService(); Holiday holiday = new Holiday ();holiday.setNum(3f);//通過任務設置流程變量taskService.setVariableLocal(taskId, "holiday", holiday); //一次設置多個值//taskService.setVariablesLocal(taskId, variables)}?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Activiti工作流之流程变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Activiti工作流之个人任务分配模式
- 下一篇: Activiti工作流之网关