【Activiti工作流】Activiti 并行子流程
- 业务场景
流程发起后需要多个部门同时处理,部门数根据业务数据来定。一笔业务申请涉及到多个部门,发起岗提交给各个部门处理人,处理人处理后由各个部门的负责人审核,等待所有部门处理完提交给汇总岗汇总,最后交给汇总岗负责人确认,流程结束。 - 流程图绘制
子流程绘制
部门处理人,取传入的list中的元素 - 部署流程
@Testpublic void deploy() {
// 获取仓库服务 :管理流程定义RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment()// 创建一个部署的构建器.addClasspathResource("diagrams/WorkPlan.bpmn")// 从类路径中添加资源,一次只能添加一个资源.name("WorkPlan")// 设置部署的名称.category("办公类别")// 设置部署的类别.deploy();System.out.println("部署的id" + deploy.getId());System.out.println("部署的名称" + deploy.getName());}
- 启动流程
流程正常启动,activiti 会根据传入的集合大小,创建对应个数的子流程。
@Testpublic void startProcess() {
// 指定执行我们刚才部署的工作流程String processDefiKey = "WorkPlan";// 业务流水号String businessKey = "SQ20191109052000001";// 取运行时服务RuntimeService runtimeService = processEngine.getRuntimeService();// 流程变量Map<String, Object> variables = new HashMap<>();List<String> list = new ArrayList<String>();list.add("张三");list.add("李四");variables.put("userList", list);// 取得流程实例ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey, businessKey, variables);// 通过流程定义的key来执行流程System.out.println("流程实例id:" + pi.getId());// 流程实例idSystem.out.println("流程定义id:" + pi.getProcessDefinitionId());// 输出流程定义的id// 查询所有的子流程List<Task> taskList = processEngine.getTaskService().createTaskQuery().processInstanceId(pi.getProcessInstanceId()).list();variables.clear();variables.put("approve_status", "111");// 完成当前节点for (Task task : taskList) {
// 设置当前办理人为发起人processEngine.getTaskService().setAssignee(task.getId(), "发起人");// 完成当前子流程第一个节点processEngine.getTaskService().complete(task.getId(), variables);}}
这里list传入两个值,启动流程后,成功提交到两个节点。
至此可以正常走流程,等待所有子流程处理完,流程才会提交到汇总岗。
- 其他代码
流程提交的方法
// 完成任务@Testpublic void compileTask() {
String taskId = "47532";Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();// taskId:任务idMap<String, Object> variables = new HashMap<>();variables.put("approve_status", "111");processEngine.getTaskService().complete(taskId, variables);Task nexttask = processEngine.getTaskService().createTaskQuery().processInstanceBusinessKey("SQ20191109052000001")//业务流水号.executionId(task.getExecutionId())//当前执行ID.singleResult();if (nexttask != null) {
switch (nexttask.getName()) {
case "部门负责人":processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "负责人");break;case "发起岗":processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "发起岗");break;}}System.out.println(nexttask.getId());System.out.println("当前任务执行完毕" + taskId);}
查询处理人任务的方法
/** 查询当前的个人任务(实际就是查询act_ru_task表) */@Testpublic void findMyPersonalTask() {
String assignee = "张三";// 获取事务ServiceTaskService taskService = processEngine.getTaskService();List<Task> taskList = taskService.createTaskQuery()// 创建任务查询对象.taskAssignee(assignee)// 指定个人任务查询,指定办理人.list();// 获取该办理人下的事务列表if (taskList != null && taskList.size() > 0) {
for (Task task : taskList) {
System.out.println("#############################################");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());System.out.println("执行对象ID:" + task.getExecutionId());System.out.println("流程定义ID:" + task.getProcessDefinitionId());System.out.println("#############################################");}} else {
System.out.println(assignee + "没有正在处理的任务");}}
yusys