需求
一个任务节点需要多个人审批签字,其中都同意进入到下一个节点,如果有一个不同意就回到上一个节点或者直接结束(我这里是回到上一个节点)
流程图
流程图详情
任务1参数配置
会签任务参数配置
参数解释:
sequential:代表是否按顺序;
collection:会签任务的办理人,是一个list列表,在流程变量中用List做为参数,我这里是设置为assigneeList;
element variable:属于collection里面的元素,相当于元素的别名 在办理人那里设置值我这里取名叫assignee(在下图中设置下面的一个图中设置办理人就是${assignee}设置的);
completion condition:是指该节点任务完成的条件即进入到下一个节点的条件;nrOfInstances和nrOfCompletedInstances都是流程变量里面的值;nrOfInstances是代表有多少个对象,即上面collection里面有多少个元素就有多少个对象;nrOfCompletedInstances是指完成了任务的对象,比如collection里面有三个元素,小明属于一个,小明完成了会签任务那么nrOfCompletedInstances就会加1,nrOfActiveInstances指的就是还没有完成会签任务对象的个数,这三个参数存在的关系nrOfInstances=nrOfCompletedInstances+nrOfActiveInstances;这些参数在到达会签任务时在表act_ru_variable中会出现
Assignee:办理人,取的collection中的元素
我这里的任务逻辑就是在启动流程实例时设置一个参数signCount,起始值为0,办理人完成会签任务的时候如果同意该值加1,不同意不做处理;最后如果signCount的值大于等于3就进入下一个节点,小于3就返回上一个节点具体见图
代码
// 流程定义部署
@Test
public void definion() {
Deployment deploy = repositoryService.createDeployment().addClasspathResource("HQProcess.bpmn")
.addClasspathResource("HQProcess.png").name("会签流程测试4").deploy();
System.out.println("部署key==" + deploy.getKey());
System.out.println("部署Name==" + deploy.getName());
System.out.println("部署Id==" + deploy.getId());
}
// 启动流程实例
@Test
public void startIncetence() {
HashMap<String, Object> map = new HashMap<>();
map.put("task1", "施工项目部");
ArrayList<String> list = new ArrayList<>();
list.add("王明4");
list.add("小李4");
list.add("红红4");
// 必须是List
map.put("assigneeList", list);
map.put("signCount", 0);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HQProcess4", map);
System.out.println("流程实例id==" + processInstance.getId());
System.out.println("流程实例Name==" + processInstance.getName());
System.out.println("流程实例开始时间==" + processInstance.getStartTime());
}
/** 查询当前人的个人任务 */
@Test
public void findMyPersonalTask() {
String assignee = "施工项目部";
List<Task> list = taskService// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assignee)// 指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
/** 排序 */
.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
/** 返回结果集 */
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.list();// 返回列表
if (list != null && list.size() > 0) {
for (Task task : list) {
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("########################################################");
}
}
}
// 个人完成任务
@Test
public void completeMyPersonalTask() {
// 任务ID
String taskId = "任务id";
taskService.complete(taskId);// 与正在执行的任务管理相关的Service
System.out.println("完成任务:任务ID:" + taskId);
}
进入到会签任务节点
/** 查询当前人的个人任务 */
@Test
public void findMyPersonalTask2() {
String assignee = "小李4";
List<Task> list = taskService// 与正在执行的任务管理相关的Service
.createTaskQuery()// 创建任务查询对象
/** 查询条件(where部分) */
.taskAssignee(assignee)// 指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
/** 排序 */
.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
/** 返回结果集 */
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.list();// 返回列表
if (list != null && list.size() > 0) {
for (Task task : list) {
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("########################################################");
}
}
}
再根据id办理任务如果同意代码为
// 个人完成任务
@Test
public void completeMyPersonalTask3() {
// 任务ID
String taskId = "任务id";
List<Task> taskResultList = taskService.createTaskQuery().taskId(taskId).list();
//当前executionId
System.out.println(taskResultList);
//当前executionId
String currentExecutionId = taskResultList.get(0).getExecutionId();
//当前签署总数
String currentSignCount = StringUtils
.defaultString(runtimeService.getVariable(currentExecutionId, "signCount").toString(), "0");
//签署数+1
runtimeService.setVariable(currentExecutionId, "signCount", Integer.parseInt(currentSignCount) + 1);
//完成
taskService.complete(taskId);
}
不同意
// 个人完成任务
@Test
public void completeMyPersonalTask() {
// 任务ID
String taskId = "任务id";
taskService.complete(taskId);// 与正在执行的任务管理相关的Service
System.out.println("完成任务:任务ID:" + taskId);
}
List中的其他会签人办理完成之后就会进入到下一个排他网关节点,这时候会根据signCount的值进行判断走哪里