1.引擎自動創建23張表
@Test
public void createTable(){
//創建引擎配置類
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUrl("jdbc:mysql://192.168.27.xx:3306/activiti");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("root");
//不自動創建表,需要表存在 DB_SCHEMA_UPDATE_FALSE = "false";
//先刪除表,再創建表 DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";
//如果表不存在,先創建表 DB_SCHEMA_UPDATE_TRUE = "true";
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//創建工作流核心對象
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
2.部署和定義.png:通過processEngine.getRepositoryService()
2.1流程部署:依據兩張圖片,通過RepositoryService實現部署(插入act_ge_bytearray二進制數據表;act_re_deployment部署信息表;act_re_procdef流程定義數據表)
//xxx.bpmn和xxx.png壓縮成xxx.zip
//先使用processEngine.getRepositoryService()獲取RepositoryService類
repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("xxx")
.deploy();
2.2流程定義:通過RepositoryService獲取流程定義,三種方式:
//先使用processEngine.getRepositoryService()獲取RepositoryService類
//1依據畫bpmn時的自定義Id查詢一個流程定義
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("key");
//2依據畫bpmn時的Name查詢一個流程定義
repositoryService.createProcessDefinitionQuery()
.processDefinitionName("name");
//3遍歷獲取全部流程定義
List<ProcessDefinition> pds = repositoryService.createProcessDefinitionQuery().list()
for (ProcessDefinition pd : pds) {
System.out.println("數字ID=流程定義的key+版本+隨機生成數"+pd.getId()+",KEY:"+pd.getKey()+",NAME:"+pd.getName())
}
3.啓動流程實例:通過processEngine.getRuntimeService()
3.1在這一步通過RuntimeService啓動請假單流程,使用流程定義的Key(act_ru_task運行時任務節點表 ,act_ru_execution運行時流程執行實例表, act_ru_identitylink運行時節點人員參與表)
//先使用processEngine.getRuntimeService()獲取RuntimeService類
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("key");
System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());
3.2流程執行的過程中,創建的流程實例ID在整個過程中都不會變
4.查詢流程實例狀態(判斷流程是正在執行還是結束)
/**查詢流程狀態(依據庫中有沒這個實例,判斷流程正在執行,還是結束)*/
@Test
public void isProcessEnd(){
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()//創建流程實例查詢
.processInstanceId("processInstanceId")//使用流程實例ID查詢
.singleResult();
if(processInstance ==null){
System.out.println("流程已經結束");
}
else{
System.out.println("流程沒有結束");
}
}
5.任務:實例與任務是一對多
5.1先查詢個人任務:通過"用戶ID",查詢該用戶的個人任務
//先使用processEngine.getTaskService()獲取TaskService類
List<Task> tasks = taskService.createTaskQuery().taskAssignee("loginName").list()
for (Task task : tasks) {
System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee();
}
5.2.後辦結個人任務:只能通過5.1查出任務ID,再辦結個人任務(辦結後,將從act_ru_task中刪除)
//先使用processEngine.getTaskService()獲取TaskService類
taskService.complete("act_ru_task表裏的任務id")
6.歷史節點表
6.1流程完畢,可以再act_hi_actinst歷史節點表中看到整個請假流程
6.2查詢歷史任務:通過"用戶ID",查詢該用戶的歷史個人任務
/**查詢歷史任務*/
@Test
public void findHistoryTask(){
List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service
.createHistoricTaskInstanceQuery()//創建歷史任務實例查詢
.taskAssignee("用戶ID")
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime();
}
}
}