上一篇activiti实现投票机制(1)已经讲解了流程图投票节点的配置信息,下面就来进行代码实现。
1.在副组长审批这一环节设置组长审批的处理人数
List idList = new ArrayList();
idList.add("张三");
idList.add("李四");
idList.add("王五");
variables.put(“task_assignee_list”, idList);
taskService.complete(taskId, variables);
2.这里配置了三个人处理,在
activiti实现投票机制(1)中组长审批环节配置为${nrOfCompletedInstances/nrOfInstances == 1},根据这个配置条件得出,这里需要这三个人都出完后流程才继续向下。
3.当着三人各自点击完成时调用此方法
4.自定义ProcessConstants
5.会签joinSignService中的
.joinSignJudgeForRate方法实现
public boolean joinSignJudgeForRate(String linkId, Execution execution, float rate) {
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processInstanceId(execution.getProcessInstanceId()).singleResult();
ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(pi.getProcessDefinitionId());
List activitiList = def.getActivities(); // rs是指RepositoryService的实例
String taskId = null;
a: for (ActivityImpl activityImpl : activitiList) {
List ptList = activityImpl.getOutgoingTransitions();
for (PvmTransition pt : ptList) {
if (linkId.equals(pt.getId())) {
List inPtList = activityImpl.getIncomingTransitions();
PvmActivity pa = inPtList.get(0).getSource();
taskId = pa.getId();
break a;
}
}
}
Map> map = (Map>) runtimeService.getVariable(execution.getId(),
ProcessConstants.KEY_JOIN_SIGN_CONDITION_LIST + "_" + taskId);
List list = map.get(taskId);
int totalCount = list.size();
int isSameCount = 0;
for (String value : list) {
if (value.equals(linkId)) {
isSameCount++;
}
}
//此处判断比率根据传入的rate
if ((float) ((float) isSameCount / (float) totalCount) >= rate) {
return true;
}
return false;
}
6.在activiti.conf.xml中配置 会签
joinSignService
7.三个人完成时分别调用完成会签方法(第三部中的方法)可以参考http://blog.sina.com.cn/s/blog_12e5bc2590102x8l2.html配置用户节点创建前和完成后的监听处理器,将完成方法配置在完成后的监听处理器中。