【Activiti工作流】Activiti 并行子流程
- 业务场景
流程发起后需要多个部门同时处理,部门数根据业务数据来定。一笔业务申请涉及到多个部门,发起岗提交给各个部门处理人,处理人处理后由各个部门的负责人审核,等待所有部门处理完提交给汇总岗汇总,最后交给汇总岗负责人确认,流程结束。 - 流程图绘制
子流程绘制
部门处理人,取传入的list中的元素 - 部署流程
@Test
public 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 会根据传入的集合大小,创建对应个数的子流程。
@Test
public 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());// 流程实例id
System.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传入两个值,启动流程后,成功提交到两个节点。
至此可以正常走流程,等待所有子流程处理完,流程才会提交到汇总岗。
- 其他代码
流程提交的方法
// 完成任务
@Test
public void compileTask() {
String taskId = "47532";
Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();
// taskId:任务id
Map<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表) */
@Test
public void findMyPersonalTask() {
String assignee = "张三";
// 获取事务Service
TaskService 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