<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
flowable-6.6.0 執行 官方demo
參考檔案:
https://flowable.com/open-source/docs/bpmn/ch14-Applications/
1、從官網下載flowable-6.6.0 :https://github.com/flowable/flowable-engine/releases/download/flowable-6.6.0/flowable-6.6.0.zip
2、將壓縮包中的flowable-6.6.0warsflowable-ui.war
丟到Tomcat中跑起來
3、開啟http://localhost:8080/flowable-ui
用賬戶:admin/test 登入
4、進入APP.MODELER建立流程,之後可以匯出流程到專案中使用,或者設定apache-tomcat-9.0.37webappsflowable-uiWEB-INFclassesflowable-default.properties
連線本地資料庫
注意:需要將java驅動jar(mysql-connector-java-5.1.45.jar
)複製到apache-tomcat-9.0.37webappsflowable-restWEB-INFlib
這樣建立的流程後端程式就能直接使用
根據業務需要在 flowable-ui>APP.MODELER裡面繪製流程圖,範例如上圖。先解釋一些概念。
使用者任務(user task)用於對需要人工執行的任務進行建模。圖裡是【矩形】。
簡單的工作流大概就這些元素(還有很多這裡就不擴充套件了)。下面描述一下工作流是如何流動的。
首先啟動了工作流後,由【開始】節點自動流向【學生】節點,等待該任務執行。任務被分配的學生使用者執行後流向 【老師】節點,再次等待該任務執行。被分配的老師使用者執行後流向 【閘道器】,閘道器以此檢查每個出口,流向符合條件的任務,比如這裡老師執行任務時是同意,就流向【校長】節點,等待該任務執行。執行後跟老師類似,同意後就流向【結束】節點,整個流程到此結束。
繪圖細節:
1、保留流程模型
2、順序流可以設定流條件來限制流動,比如上面的閘道器出口就設定了條件
3、任務需要分配任務的執行使用者,可以分配到候選組,也可以直接分配到候選人
最後匯出工作流檔案
檔案內容
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insmtece" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef"> <process id="leave_approval" name="請假審批" isExecutable="true"> <startEvent id="start" name="開始" flowable:initiator="startuser" flowable:formFieldValidation="true"></startEvent> <userTask id="stu_task" name="學生" flowable:candidateGroups="stu_group" flowable:formFieldValidation="true"></userTask> <sequenceFlow id="flow1" sourceRef="start" targetRef="stu_task"></sequenceFlow> <userTask id="te_task" name="老師" flowable:candidateGroups="te_group" flowable:formFieldValidation="true"></userTask> <exclusiveGateway id="getway1" name="閘道器1"></exclusiveGateway> <userTask id="mte_task" name="校長" flowable:candidateGroups="mte_group" flowable:formFieldValidation="true"></userTask> <exclusiveGateway id="getway2" name="閘道器2"></exclusiveGateway> <endEvent id="end" name="結束"></endEvent> <sequenceFlow id="flow1" name="請假" sourceRef="stu_task" targetRef="te_task" skipExpression="${command=='agree'}"></sequenceFlow> <sequenceFlow id="flow3_1" name="同意" sourceRef="getway1" targetRef="mte_task"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow2" name="審批" sourceRef="te_task" targetRef="getway1"></sequenceFlow> <sequenceFlow id="flow3_2" name="拒絕" sourceRef="getway1" targetRef="stu_task"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow4" name="審批" sourceRef="mte_task" targetRef="getway2"></sequenceFlow> <sequenceFlow id="flow4_1" name="同意" sourceRef="getway2" targetRef="end" skipExpression="${command=='free'}"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='agree'}]]></conditionExpression> </sequenceFlow> <sequenceFlow id="flow4_2" name="拒絕" sourceRef="getway2" targetRef="stu_task"> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${command=='refuse'}]]></conditionExpression> </sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_leave_approval"> 這裡先省略 </bpmndi:BPMNDiagram> </definitions>
4、bpmn檔案匯入
如果需要,可以把這個流程檔案下載下來,直接匯入使用
後臺專案基於jdk8,使用springboot框架
spring 版本
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
專案依賴pom.xml
<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.6.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency>
專案設定application.yml
spring: datasource: url: jdbc:mysql://localhost:3306/flowable?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 driver-class-name: com.mysql.jdbc.Driver username: root password: 123456
1、Flowable的所有資料庫表都以ACT_開頭。第二部分是說明表用途的兩字元標示符。服務API的命名也大略符合這個規則。
2、ACT_RE_
: 'RE’代表repository。帶有這個字首的表包含“靜態”資訊,例如流程定義與流程資源(圖片、規則等)。
3、ACT_RU_
: 'RU’代表runtime。這些表儲存執行時資訊,例如流程範例(process instance)、使用者任務(user task)、變數(variable)、作業(job)等。Flowable只在流程範例執行中儲存執行時資料,並在流程範例結束時刪除記錄。這樣保證執行時表小和快。
4、ACT_HI_
: 'HI’代表history。這些表儲存歷史資料,例如已完成的流程範例、變數、任務等。
5、ACT_GE_
: 通用資料。在多處使用。
1)通用資料表(2個)
2)歷史表(8個,HistoryService介面操作的表)
3)使用者相關表(4個,IdentityService介面操作的表)
4)流程定義、流程模板相關表(3個,RepositoryService介面操作的表)
5)流程執行時表(6個,RuntimeService介面操作的表)
1、RepositoryService很可能是使用Flowable引擎要用的第一個服務。這個服務提供了管理與控制部署(deployments)與流程定義(process definitions)的操作。管理靜態資訊,
2、RuntimeService用於啟動流程定義的新流程範例。
3、IdentityService很簡單。它用於管理(建立,更新,刪除,查詢……)組與使用者。
4、FormService是可選服務。也就是說Flowable沒有它也能很好地執行,而不必犧牲任何功能。
5、HistoryService暴露Flowable引擎收集的所有歷史資料。要提供查詢歷史資料的能力。
6、ManagementService通常在用Flowable編寫使用者應用時不需要使用。它可以讀取資料庫表與表原始資料的資訊,也提供了對作業(job)的查詢與管理操作。
7、DynamicBpmnService可用於修改流程定義中的部分內容,而不需要重新部署它。例如可以修改流程定義中一個使用者任務的辦理人設定,或者修改一個服務任務中的類名。
接下來使用之前的請假流程圖,上程式碼
程式碼
import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.idm.api.Group; import org.flowable.idm.api.User; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipInputStream; /** * TestFlowable * * @Author * @Date: 2021/10/17 23:35 * @Version 1.0 */ @Slf4j public class TestFlowable { @Autowired private RepositoryService repositoryService; private RuntimeService runtimeService; private HistoryService historyService; private org.flowable.engine.TaskService taskService; private org.flowable.engine.IdentityService identityService; public void createDeploymentZip() { /* * @Date: 2021/10/17 23:38 * Step 1: 部署xml(壓縮到zip形式,直接xml需要設定相對路徑,麻煩,暫不用) */ try { File zipTemp = new File("f:/leave_approval.bpmn20.zip"); ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipTemp)); Deployment deployment = repositoryService .createDeployment() .addZipInputStream(zipInputStream) .deploy(); log.info("部署成功:{}", deployment.getId()); } catch (FileNotFoundException e) { e.printStackTrace(); } * @Date: 2021/10/17 23:40 * Step 2: 查詢部署的流程定義 List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").list(); List<ProcessDefinition> pages = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").listPage(1, 30); * Step 3: 啟動流程,建立範例 String processDefinitionKey = "leave_approval";//流程定義的key,對應請假的流程圖 String businessKey = "schoolleave";//業務程式碼,根據自己的業務用 Map<String, Object> variablesDefinition = new HashMap<>();//流程變數,可以自定義擴充 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variablesDefinition); log.info("啟動成功:{}", processInstance.getId()); * Step 4: 查詢指定流程所有啟動的範例列表 * 列表,或 分頁 刪除 List<Execution> executions = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").list(); List<Execution> executionPages = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").listPage(1, 30); // runtimeService.deleteProcessInstance(processInstanceId, deleteReason); //刪除範例 * Step 5: 學生查詢可以操作的任務,並完成任務 String candidateGroup = "stu_group"; //候選組 xml檔案裡面的 flowable:candidateGroups="stu_group" List<Task> taskList = taskService.createTaskQuery().taskCandidateGroup(candidateGroup).orderByTaskCreateTime().desc().list(); for (Task task : taskList) { // 申領任務 taskService.claim(task.getId(), "my"); // 完成 taskService.complete(task.getId()); * Step 6: 老師查詢可以操作的任務,並完成任務 String candidateGroupTe = "te_group"; //候選組 xml檔案裡面的 flowable:candidateGroups="te_group" List<Task> taskListTe = taskService.createTaskQuery().taskCandidateGroup(candidateGroupTe).orderByTaskCreateTime().desc().list(); for (Task task : taskListTe) { taskService.claim(task.getId(), "myte"); Map<String, Object> variables = new HashMap<>(); variables.put("command","agree"); //攜帶變數,用於閘道器流程的條件判定,這裡的條件是同意 taskService.complete(task.getId(), variables); * @Date: 2021/10/18 0:17 * Step 7: 歷史查詢,因為一旦流程執行完畢,活動的資料都會被清空,上面查詢的介面都查不到資料,但是提供歷史查詢介面 // 歷史流程範例 List<HistoricProcessInstance> historicProcessList = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave_approval").list(); // 歷史任務 List<HistoricTaskInstance> historicTaskList = historyService.createHistoricTaskInstanceQuery().processDefinitionKey("leave_approval").list(); // 範例歷史變數 , 任務歷史變數 // historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId); // historyService.createHistoricVariableInstanceQuery().taskId(taskId); // *****************************************************分隔符******************************************************************** // 可能還需要的API // 移動任務,人為跳轉任務 // runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId) // .moveActivityIdTo(currentActivityTaskId, newActivityTaskId).changeState(); // 如果在資料庫設定了分組和使用者,還會用到 List<User> users = identityService.createUserQuery().list(); //使用者查詢,使用者id對應xml 裡面設定的使用者 List<Group> groups = identityService.createGroupQuery().list(); //分組查詢,分組id對應xml 裡面設定的分組 如 stu_group,te_group 在表裡是id的值 // 另外,每個查詢後面都可以拼條件,內建恁多查詢,包括模糊查詢,大小比較都有 } }
到此這篇關於Springboot+Flowable 快速實現工作流的文章就介紹到這了,更多相關Springboot Flowable 工作流內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45