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();
}
}
}