(六)Activiti之实现学生请假流程
一、实现学生请假流程
1.1 用activiti插件生成bpmn和png文件
1.2 部署流程定义
package com.shyroke.activiti.firstActiviti; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.repository.Deployment; import org.junit.Test; public class StudentLeaveProcess { /** * 获取默认流程引擎实例,会自动读取activiti.cfg.xml文件 */ private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); /** * 部署流程定义 */ @Test public void test_Deploy() { Deployment deployment = processEngine.getRepositoryService() // 获取部署相关Service .createDeployment() //// 创建部署 .addClasspathResource("diagrams/StudentLeaveProcess.bpmn") // 加载资源文件 .addClasspathResource("diagrams/StudentLeaveProcess.bpmn") // 加载资源文件 .name("学生请假流程") // 流程名称 .deploy(); // 部署 System.out.println("流程部署ID:" + deployment.getId()); System.out.println("流程部署Name:" + deployment.getName()); } }
- 结果:
- 更新流程部署表
- 更新流程定义表
- 更新资源文件表
- 更新系统配置表
1.2 启动流程实例
/** * 启动流程实例 */ @Test public void start() { ProcessInstance instance=processEngine.getRuntimeService() // 运行时Service .startProcessInstanceByKey("StudentLeaveProcess"); // 流程定义表act_re_procdef的KEY字段值 System.out.println("流程实例ID:"+instance.getId()); System.out.println("流程定义ID:"+instance.getProcessDefinitionId()); }
- 此时流程学生请假这个节点,等待张三完成任务。
-
- 结果
- 更新执行对象表
- 更新身份联系表,
- 更新 用户任务表,这里是张三的任务
- 更新活动节点历史表,如下图可知,张三的任务还没完成,所以END_TIME为空
- 更新历史身份联系表,流程走到这里暂时只有张三这个用户需要完成任务。
- 更新历史流程实例表,因为张三还没完成任务,所以END_TIME为空。
- 更新历史任务表,目前只有张三的任务
1.3 查看张三的任务
/** * 查看任务 */ @Test public void find_task() { List<Task> taskList=processEngine.getTaskService().createTaskQuery().taskAssignee("张三").list(); for(Task task:taskList){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务创建时间:"+task.getCreateTime()); System.out.println("任务委派人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } }
- 结果
1.4 张三完成学生请假任务
/** * 完成任务 */ @Test public void test_completeTask() { processEngine.getTaskService().complete("2504"); }
- 结果,张三完成任务之后,流程就从学生请假走到了班长审批这个节点,需要李四完成任务。
- 更新执行对象表
- 更新身份联系表 ,这个流程走到现在需要张三和李四两个用户,张三已经完成任务。
- 更新 用户任务表,这里是李四的任务
- 更新活动节点历史表,如下图可知,李四的任务还没完成,所以END_TIME为空
- 更新历史身份联系表
- 更新历史流程实例表
- 更新历史任务表
1.5 查看李四的任务
/** * 查看任务 */ @Test public void find_task() { List<Task> taskList=processEngine.getTaskService().createTaskQuery().taskAssignee("李四").list(); for(Task task:taskList){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务创建时间:"+task.getCreateTime()); System.out.println("任务委派人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } }
- 结果
1.6 李四完成班长审批任务
/** * 完成任务 */ @Test public void test_completeTask() { processEngine.getTaskService().complete("5002"); }
- 完成之后,流程就从李四的班长审批节点走到班主任审批节点,需要王五来完成
- 更新执行对象表
- 更新身份联系表
- 更新 用户任务表,这里是王五的任务
- 更新活动节点历史表,如下图可知,王五的任务还没完成,所以END_TIME为空
- 更新历史身份联系表
- 更新历史流程实例表
- 更新历史任务表
1.7 查看王五任务
/** * 查看任务 */ @Test public void find_task() { List<Task> taskList=processEngine.getTaskService().createTaskQuery().taskAssignee("王五").list(); for(Task task:taskList){ System.out.println("任务ID:"+task.getId()); System.out.println("任务名称:"+task.getName()); System.out.println("任务创建时间:"+task.getCreateTime()); System.out.println("任务委派人:"+task.getAssignee()); System.out.println("流程实例ID:"+task.getProcessInstanceId()); } }
- 结果
1.8 王五完成任务
/** * 完成任务 */ @Test public void test_completeTask() { processEngine.getTaskService().complete("7502"); }
- 结果
- 当王五完成任务的时候,流程就全部走完了。
- 当流程结束的时候,运行时的表(以act_ru开头的表)数据全部清空,历史表(以act_hi开头的表)数据修改 或者增加了数据