Activiti多人会签,1/3的人同意则审批通过的实现
第一步:配置流程
1. 配置审批通过的条件,如下,
线条上配置审批通过条件:${passCount/totalCount >=1/3}
线条上配置审批退回条件:${passCount/totalCount < 1/3}
2. 申请节点添加结束监听器
3. 配置该审批节点结束的条件
Sequential:false,false为并行执行,true为串行执行,此处要设置为并行
Collection: ${partyList},用于执行该会签环节的参与人,此处使用partyList的流程变量
Element variable: party,此处表示的是每一个分支都有一个叫party的流程变量,和上方的assignee结合使用就可以决定该分支应该由谁执行
Completion condition:该节点的结束条件(该条件一定要配置,否则要等所有人都执行完才会结束该节点)
4. 为该审批节点添加创建时的监听器
二:代码部分
1. 申请节点结束时,设置下个审批节点的参与人
监听器内容如下,主要用于设置下个审批节点的参与人
package com.ylkj.base.flow.listener;
import java.util.ArrayList;
import java.util.List;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MyCompeteistener implements TaskListener {
@Override
public void notify(DelegateTask arg0) {
List<String> userList = new ArrayList<String>();
userList.add("111");
userList.add("222");
userList.add("333");
arg0.setVariable("partyList", userList);
}
}
2. 审批节点创建时的监听器,主要用于分配任务执行人
监听器内容如下:
package com.ylkj.base.flow.listener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
/**
* 节点创建监听器
* 为节点设置处理人
*/
public class MutiGroupsListener implements TaskListener {
//节点完成的时候调用此监听器
@Override
public void notify(DelegateTask arg0) {
//将通过人数,未通过人数,总数,重新置为0,退回的时候才能重新计算
arg0.setVariable("passCount", "0");
arg0.setVariable("totalCount", "0");
arg0.setVariable("noPassCount", "0");
//为每一个任务设置处理人
String party = (String)arg0.getVariable("party");
arg0.setAssignee(party);
}
}
3. 审批节点有人执行任务时,需要统计执行情况
/* (非 Javadoc)
* <p>Title: completeTask1</p>
* <p>Description: </p>
* @param procInstId 流程实例id
* @param taskId 任务id
* @param variables 流程变量
* @param passflag 审批同意标志(yes/no)
* @see com.ylkj.base.activiti.service.ActivitiService#completeTask1(java.lang.String, java.lang.String, java.util.Map, java.lang.String)
*/
public void completeTask1(String procInstId,String taskId, Map<String, Object> variables,String passflag) {
//获取当前节点的task_def_key_,此段代码主要用于区分多个节点时,审批通过记录数与总数
Task taskQuery = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();
List<Task> tasks = processEngine.getTaskService().createTaskQuery().taskName(taskQuery.getName()).processInstanceId(procInstId).list();
int passCount = 0;//审批同意人数
int noPassCount = 0;//