IDEA創(chuàng)建Activiti工作流開發(fā)
一爸吮、 安裝Activiti插件
1. 首先打開FIle的setting功能低缩,搜索Plugins:?
2. 輸入actiBPM损俭,然后點(diǎn)擊搜索:
3. 點(diǎn)擊安裝音五、應(yīng)用:
安裝好之后點(diǎn)擊apply(應(yīng)用),之后重啟idea
二辣恋、 創(chuàng)建Activiti工作流并導(dǎo)出流程圖圖片
1. 重啟IDEA之后亮垫,點(diǎn)擊File文件中的New下的BpmnFile:
2. 給這個(gè)文件起好名字后拖動(dòng)右邊的圖標(biāo)到左邊:
3. 把鼠標(biāo)放到節(jié)點(diǎn)中心,中心會(huì)變成黑白扇形:
4. 拖拽連線到另一個(gè)圖標(biāo)進(jìn)行畫圖:
5. 左鍵單擊節(jié)點(diǎn)就會(huì)出現(xiàn)左邊的修改按鈕:
Id命名規(guī)范: 要以字母或下劃線 () 字符開頭伟骨,后接 XML 規(guī)范中允許的任意字母饮潦、數(shù)字、重音字符携狭、變音符號(hào)继蜡、句點(diǎn) (.)、連字符 (-) 和下劃線 () 的組合。
否則》》》(報(bào)org.activiti.bpmn.exceptions.XMLException: cvc-datatype-valid.1.2.1: '' 不是 'NCName' 異常)
6. 接著修改文件的后綴名為.xml:
打開該文件可以看到稀并,流程圖以xml代碼格式呈現(xiàn)(當(dāng)然也可以在重命名改回去)
7. 接著右鍵該文件:
如果沒有出現(xiàn)圖中的按鈕仅颇,可以按快捷鍵Ctrl+alt+Shift+U,按了以后,以后這個(gè)圖標(biāo)就會(huì)出現(xiàn)了
8. 導(dǎo)出圖片
可以點(diǎn)擊該按鈕保存這圖片稻轨,后綴名自己設(shè)置下.png
三灵莲、 解決圖片亂碼bug
如果圖片中有中文會(huì)出現(xiàn)亂碼,需要在這兩個(gè)文件下的后面都加上
-Dfile.encoding=UTF-8
然后重啟IDEA殴俱,把原來的PNG圖片刪掉政冻,再生成一次就不會(huì)出現(xiàn)亂碼了
四、 測(cè)試(test)工作流開發(fā)
1. 引入pom.xml依賴
<!--JUnit測(cè)試-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>junit</groupId>
? ? ? ? ? ? <artifactId>junit</artifactId>
? ? ? ? ? ? <version>4.12</version>
? ? ? ? </dependency>
<!--- Activiti依賴導(dǎo)入 -->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.activiti</groupId>
? ? ? ? ? ? <artifactId>activiti-spring</artifactId>
? ? ? ? ? ? <version>5.18.0</version>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.activiti</groupId>
? ? ? ? ? ? <artifactId>activiti-engine</artifactId>
? ? ? ? ? ? <version>5.18.0</version>
? ? ? ? ? ? <exclusions>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <artifactId>slf4j-api</artifactId>
? ? ? ? ? ? ? ? ? ? <groupId>org.slf4j</groupId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <artifactId>spring-eans</artifactId>
? ? ? ? ? ? <groupId>org.springframework</groupId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <artifactId>jackson-core-asl</artifactId>
? ? ? ? ? ? ? ? ? ? <groupId>org.codehaus.jackson</groupId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <artifactId>commons-lang3</artifactId>
? ? ? ? ? ? ? ? ? ? <groupId>org.apache.commons</groupId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? ? ? <artifactId>commons-lang3</artifactId>
? ? ? ? ? ? ? ? ? ? <groupId>org.apache.commons</groupId>
? ? ? ? ? ? ? ? </exclusion>
? ? ? ? ? ? </exclusions>
? ? ? ? </dependency>
2. 在src/main/resources下面新建一個(gè)BPMN文件
(同上文操作的創(chuàng)建工作流)
3. 畫完流程圖之后要更改對(duì)應(yīng)元素的name和assignee线欲,Id
然后點(diǎn)擊空白地方明场,把流程ID和名稱改掉,如下圖:
4. 之后把數(shù)據(jù)庫建好李丰,建一個(gè)activiti.cfg.xml在resource下面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
? ? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
? ? ? ? ? ? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
? ? ? ? ? ? <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
? ? <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
? ? ? ? ? ? ? <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8"></property>
? ? <property name="jdbcUsername" value="root"></property>
? ? <property name="jdbcPassword" value="root"></property>
? ? <property name="databaseSchemaUpdate" value="true"></property>
? </bean>
</beans>
5. 新建一個(gè)java類苦锨,用來生成表
@Test
public void crateTable(){
? ? ? ? ? ? ? ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
}
運(yùn)行這個(gè)類之后數(shù)據(jù)庫里面會(huì)生成24張表, 23-25張表都是有可能的趴泌,我這里是生成了24張表舟舒,多了一張act_evt_log,事件處理日志表嗜憔。最主要的還是那23張表
6. 之后就可以開始部署流程
代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
? ? //部署流程
? ? @Test
? ? public void deployProcess(){
? ? ? ? RepositoryService repositoryService=processEngine.getRepositoryService();
? ? ? ? DeploymentBuilder builder=repositoryService.createDeployment();
? ? ? ? builder.addClasspathResource("myWork.bpmn");
? ? ? ? builder.deploy();
}
部署之后就可以在act_re_procdef表中看到對(duì)相應(yīng)的流程信息
7. 啟動(dòng)流程
代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
? ? @Test
? ? public void startProcess(){
? ? ? ? RuntimeService runtimeService=processEngine.getRuntimeService();
? ? ? ? runtimeService.startProcessInstanceByKey("myProcess_1");
}
啟動(dòng)流程之后就會(huì)有相應(yīng)的任務(wù)產(chǎn)生秃励,存在act_ru_task表中,可以查看任務(wù)節(jié)點(diǎn)
代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
? ? @Test
? ? public void queryProcess(){
? ? ? ? TaskService taskService=processEngine.getTaskService();
? ? ? ? String assigne="student";
? ? ? ? List<Task> tasks=taskService.createTaskQuery().taskAssignee(assigne).list();
? ? ? ? int size=tasks.size();
? ? ? ? for(int i=0;i<size;i++){
? ? ? ? ? ? Task task=tasks.get(i);
? ? ? ? }
? ? ? ? for (Task task:tasks){
? ? ? ? ? ? System.out.println("taskId=" +"流程任務(wù)節(jié)點(diǎn)信息ID:"+ task.getId() +
? ? ? ? ? ? ? ? ? ? ",taskName:" +"流程任務(wù)節(jié)點(diǎn)名稱ID:" +task.getName() +
? ? ? ? ? ? ? ? ? ? ",assignee:" + "流程任務(wù)節(jié)點(diǎn)接受人:"+task.getAssignee() +
? ? ? ? ? ? ? ? ? ? ",createTime:" +"流程任務(wù)節(jié)點(diǎn)創(chuàng)建時(shí)間:"+ task.getCreateTime());
? ? ? ? }
? ? }
首次運(yùn)行的時(shí)候這個(gè)沒有輸出吉捶,因?yàn)榈谝淮芜\(yùn)行的時(shí)候掃描act_ru_task的表里面是空的夺鲜,但第一次運(yùn)行完成之后里面會(huì)添加一條記錄,之后每次運(yùn)行里面都會(huì)添加一條記錄
8. 查詢流程明細(xì)定義明細(xì)
代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
@Test
public void queryProcdef(){
? ? ? ? RepositoryService repositoryService=processEngine.getRepositoryService();
? ? ? ? ? ? ? ? ? ProcessDefinitionQuery query=repositoryService.createProcessDefinitionQuery();
? ? ? ? query.processDefinitionKey("myProcess_1");
? ? ? ? List<ProcessDefinition> pds=query.list();
? ? ? ? System.out.println(">>>>>>>>>>>>>>>>>>>>>");
? ? ? ? for (ProcessDefinition pd:pds){
? ? ? ? ? ? System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+
? ? ? ? ? ? ? ? ? ? ",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+
? ? ? ? ? ? ? ? ? ? ",RESOURCE_NAME:"+pd.getResourceName()+
? ? ? ? ? ? ? ? ? ? ",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
? ? ? ? }
}
9. 審核過程完成任務(wù)節(jié)點(diǎn)審批
代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
? ? @Test
? ? public void startProcessApproval(){
? ? ? ? TaskService taskService=processEngine.getTaskService();
? ? ? ? //taskId 就是查詢?nèi)蝿?wù)中的 ID
? ? ? ? String taskId="2504";
? ? ? ? //完成請(qǐng)假申請(qǐng)任務(wù)
? ? ? ? taskService.complete(taskId);
}
10. 流程詳細(xì)步驟:
部署流程》》》》》》啟動(dòng)流程》》》》》》查詢用戶id》》》》用戶完成任務(wù)》》》流程結(jié)束
五呐舔、 生成流程報(bào)表
流程部署表
SELECT * FROM `act_re_deployment`
流程定義表
SELECT * FROM `act_re_procdef`
資源文件表
SELECT * FROM `act_ge_bytearray`
系統(tǒng)配置表
SELECT * FROM `act_ge_property`
啟動(dòng)流程實(shí)例涉及到的表
流程實(shí)例運(yùn)行時(shí) 執(zhí)行對(duì)象表
SELECT * FROM `act_ru_execution`
流程實(shí)例運(yùn)行時(shí) 身份聯(lián)系表
SELECT * FROM `act_ru_identitylink`
流程實(shí)例運(yùn)行時(shí) 用戶任務(wù)表
SELECT * FROM `act_ru_task`
活動(dòng)節(jié)點(diǎn)歷史表
SELECT * FROM `act_hi_actinst`
身份聯(lián)系表 歷史
SELECT * FROM `act_hi_identitylink`
流程實(shí)例表 歷史
SELECT * FROM `act_hi_procinst`
歷史任務(wù)表
SELECT * FROM `act_hi_taskinst`