一、流程繪制與導入
百度啥的找了好多bpmn繪制工具,都不盡如人意,大多數都不能編輯網關出口的跳轉條件,最后還是選擇了activiti官方的那個繪圖的app。。。
啥都好,就是線不能彎,很難受。(后來開發的時候驚訝地發現了方法,雖然感覺操作不是很友好)
要是有好用的希望大家能夠推薦一下~
官網:https://www.activiti.org/get-started
下面Old Version選擇6.x Download,下載完成后是一個zip包,解壓后把里面的activiti-app.war丟到tomcat下面啟動就行,這邊使用tomcat8.5.49,該war包需要java1.8。
(這邊用idea直接起war包好像會遇到一系列問題,主要是contentPath會變,所以還是直接丟到tomcat下面吧)。
1、
啟動后訪問:http://localhost:8080/activiti-app/#/會跳轉到登錄頁,默認賬號:admin/test即可,登陸后界面如下,選擇第一個:
2、
然后選擇Create Process
3、
新建頁面如下:
Model name為流程名稱(可重復)
Model key為流程Key,實際調用中使用的即為該key,似乎key可以相同,但是后面創建的會有版本號的概念,會自動+1
4、
畫圖就完事了,繪圖規則可以自行了解bpmn
5、
保存后選擇下載,放入工程目錄/resources/processes下,修改后綴為bpmn,其實應該是可以直接解析bpmn20.xml文件的來着,具體的還在學習~
啟動項目出現:The following process definition files will be deployed: [***.bpmn]即說明流程部署成功。
二、如何開始一個流程
我們以上圖的流程為例,這邊先提幾個關鍵的service類
2.1 服務接口
1、TaskService
在流程進行過程中,每個節點的操作方法,經常用的比如:查詢處於“領導審批”這個節點的任務,完成這個任務等等。
2、RuntimeService
流程相關服務,基本的功能例如:開始一個實例流程等等。
3、RepositoryService
流程部署相關的服務
4、HistoryService
歷史流程相關的服務
2.2 開始流程
如上所說,開始流程我們需要用到RuntimeService這個類。
直接上代碼:
@PostMapping(value = "/start") @ResponseBody @ApiOperation(value = "啟動某個流程") public String start(@RequestParam String instanceKey) { // map中放入該流程需要的業務數據 Map<String, Object> map = new HashMap<>(); map.put("createUser", "Test"); map.put("createTime", 1576206360000L); ProcessInstance instance = runtimeService.startProcessInstanceByKey(instanceKey, map); return instance.getId(); }
調用runtimeService.startProcessInstanceByKey(),根據部署的流程key來啟動一個流程,RuntimeService里面也有很多根據其他標識啟動流程的方法,具體還需要研究。
其中instanceKey對應項目啟動時日志中部署的流程key,也就是bpmn文件中該行的id。
<process id="myFirstBpmn" name="myFirstBpmn" isExecutable="true">
根據方法返回的id觀察數據庫,可以發現很多表里面都會新建以該id為主鍵的數據,該條id也可以用來標識一條流程實例。
2.3 查詢流程
流程的最基礎的查詢也需要用到RuntimeService這個類:
@PostMapping(value = "/list") @ResponseBody @ApiOperation(value = "查詢某個流程實例") public List<String> list(@RequestParam String definitionKey) { // 創建查詢條件 ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); // 根據流程實例key來查詢,即查詢該流程有多少個正在進行的實例 List<ProcessInstance> runningList = processInstanceQuery.processDefinitionKey(definitionKey).list(); // 返回實例的id,這邊需要包裝成自己需要的業務數據返回 List<String> ids = new ArrayList<>(); runningList.forEach(list -> ids.add(list.getId())); return ids; }
這邊是根據2.2中的key來查詢實例,實際觀察該類里面的方法,可以發現很多的其他查詢條件。
這邊如果直接返回List<ProcessInstance>會報懶加載的一些錯誤,所以還是自己封裝一遍比較好,里面不需要的字段也比較多。