activiti以及会签的相关知识不在这里详细介绍了,推荐一本书《Activiti实战》,
本文主要介绍activiti的会签过程中”选票”的统计;话不多说,直接上代码:
首先流程图如下:
1.给flow1绑定take事件,每当会签任务开始时,设置一个流程变量voteUserTask_Countor=0,该变量用于统计投“赞成”票的人数,流程xml代码如下:
<sequenceFlow id="flow1" name="flow1" sourceRef="startevent1" targetRef="voteUserTask">
<extensionElements>
<activiti:executionListener event="take" expression="${execution.setVariable("voteUserTask_Countor_",0)}"></activiti:executionListener>
</extensionElements>
</sequenceFlow>
2. 给投票任务voteUserTask绑定completionCondition,用来指定完成会签动作的条件,以及绑定complete-tasklistener用来保存投票结果:每当投赞成票时,就将voteUserTask_Countor++,流程xml代码如下:
<userTask id="voteUserTask" name="投票" activiti:assignee="${voter}">
<extensionElements>
<activiti:taskListener event="complete" delegateExpression="${voteTaskCompleteListener}"></activiti:taskListener>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="voterList" activiti:elementVariable="voter">
<completionCondition>${multiInstance.completeTask(execution)}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask>
completionCondition绑定的java代码如下:
@Service(value="multiInstance")
public class MultiInstanceCompleteTask implements Serializable {
private static final long serialVersionUID = 5754522101489239675L;
public boolean completeTask(DelegateExecution execution) {
int nrOfInstances = (Integer) execution.getVariable("nrOfInstances"); //总的会签任务数量
int nrOfActiveInstances = (Integer) execution.getVariable("nrOfActiveInstances"); //当前获取的会签任务数量 ---未执行的
int nrOfCompletedInstances = (Integer) execution.getVariable("nrOfCompletedInstances"); //总的会签任务数量---已执行的
System.out.println(execution.getVariables());
if(nrOfActiveInstances > 0) {
return false;
}
//TODO -- 统计票数
String nodeId = execution.getCurrentActivityId();
String actInstId = execution.getProcessInstanceId();
return true;
}
}
单个task-completelistener java代码如下:
@Service("voteTaskCompleteListener")
public class VoteTaskCompleteListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
long counter = (long) delegateTask.getExecution().getVariable("voteUserTask_Countor_");
String pass = (String) delegateTask.getVariable("pass");
if("10".equals(pass)){
//同意
counter++;
delegateTask.getExecution().setVariable("voteUserTask_Countor_", counter);
}
}
}
3. 计算投票结果ServiceTask
流程xml代码:
<serviceTask id="calculateTicketServiceTask" name="计算投票" activiti:delegateExpression="${calculateTicketDelegate}"></serviceTask>
java实现代码如下:
@Service("calculateTicketDelegate")
public class CalculateTicketDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
System.out.println("总投票人数:"+execution.getVariable("voterList"));
System.out.println("投票结果是:"+execution.getVariable("voteUserTask_Countor_"));
}
}
以上就可以实现一个会签,统计投票的过程啦。
上述的资源已经上传至:资源下载-csdn,
如果没有csdn下载积分的同学可以私聊我获取;