1 创建流程
首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录),点击菜单: New-BpmnFile,如
下图所示:
起完名字 holiday 后(默认扩展名为 bpmn),就可以看到进入了流程设计页面,如图所示
绘制流程 :
图形绘制好后会生成两个文件:
指定流程定义 key
流程定义 key 即流程定义的标识,在 eclipse 中通过 properties 视图查看流程的 key
建议:相同的业务流程,流程定义的 key 名字定义一样,比如,如果需要创建新的业务流程,请假
流程则使用新的 key。
指定任务负责人
在 properties 视图指定每个任务结点的负责人,
比如下边是填写请假单的负责人为 zhangsan
2 部署流程定义
部署流程定义
//流程定义部署 public static void main(String[] args) { //1.创建ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到RepositoryService实例 RepositoryService repositoryService = processEngine.getRepositoryService(); //3.进行部署 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源 .addClasspathResource("diagram/holiday.png") .name("请假申请单流程") .deploy(); //4.输出部署的一些信息 System.out.println(deployment.getName()); System.out.println(deployment.getId()); }
执行此操作后 activiti 会将上边代码中指定的 bpm 文件和图片文件保存在 activiti 数据库。
3 流程实例
启动一个流程实例
流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流
程可以使用了。
针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关
系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象。对于请假申请流程,张三发
起一个请假申请单需要启动一个流程实例, 请假申请单发起一个请假单也需要启动一个流程实例。
代码如下
/** * @author WGR * @create 2019/11/13 -- 19:35 */ public class ActivitiInstance { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday"); System.out.println(holiday.getDeploymentId()); System.out.println(holiday.getId()); System.out.println(holiday.getActivityId()); } }
4 任务查询
流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户
的待办任务
/** * 查询当前用户的任务列表 */ public class ActivitiTaskQuery { //wangwu完成自己任务列表的查询 public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询 Task task = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("wangwu") .singleResult(); //4.任务列表的展示 System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("任务ID:"+task.getId()); //5002 System.out.println("任务负责人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); } //lishi完成自己任务列表的查询 // public static void main(String[] args) { // //1.得到ProcessEngine对象 // ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // // //2.得到TaskService对象 // TaskService taskService = processEngine.getTaskService(); // // //3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询 // Task task = taskService.createTaskQuery() // .processDefinitionKey("holiday") // .taskAssignee("lisi") // .singleResult(); // // //4.任务列表的展示 // System.out.println("流程实例ID:"+task.getProcessInstanceId()); // System.out.println("任务ID:"+task.getId()); //5002 // System.out.println("任务负责人:"+task.getAssignee()); // System.out.println("任务名称:"+task.getName()); // //// 流程实例ID:2501 //// 任务ID:5002 //// 任务负责人:lisi //// 任务名称:部门经理审批 // // // } //zhangsan任务列表的查询 /* public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询 List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("zhangsan") .list(); //4.任务列表的展示 for(Task task :taskList){ System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("任务ID:"+task.getId()); System.out.println("任务负责人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); } // 流程实例ID:2501 // 任务ID:2505 // 任务负责人:zhangsan // 任务名称:填写请假申请单 } */ }
5 任务处理
任务负责人查询待办任务,选择任务进行处理,完成任务。
/** * 处理当前用户的任务 * 背后操作的表: * act_hi_actinst act_hi_identitylink act_hi_taskinst act_ru_identitylink act_ru_task */ public class ActivitiCompleteTask { //查询当前用户wangwu的任务并处理掉 public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.查询当前用户的任务 Task task = taskService.createTaskQuery() .processDefinitionKey("holiday") .taskAssignee("wangwu") .singleResult(); //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId() taskService.complete(task.getId()); //5.输出任务的id //7502 System.out.println(task.getId()); } //lishi完成自己的任务 /* public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.处理任务,结合当前用户任务列表的查询操作的话,任务ID:5002 taskService.complete("5002"); } */ //zhangsan完成自己的任务 /*public static void main(String[] args) { //1.得到ProcessEngine对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //2.得到TaskService对象 TaskService taskService = processEngine.getTaskService(); //3.处理任务,结合当前用户任务列表的查询操作的话,任务ID:2505 taskService.complete("2505"); }*/ }
整个流程走完以后: