activity会签功能的实现

来源:互联网 发布:矩阵的初等变换 编辑:程序博客网 时间:2024/06/07 09:44

1,利用activity的多实例节点方法实现会签功能

根据bpmn规范的要求,每个上级流程为每个实例创建分支时都要提供如下变量:

  • nrOfInstances:实例总数

  • nrOfActiveInstances:当前活动的,比如,还没完成的,实例数量。 对于顺序执行的多实例,值一直为1。

  • nrOfCompletedInstances:已经完成实例的数目。

可以通过execution.getVariable(x)方法获得这些变量。

2,多实例节点实现方式

多实例节点实现方式分为并行(三个横线),顺序执行(三个竖线)两种方式。

3,XML

<userTask id="usertask2" name="总经理/副总经理/主管批准" activiti:assignee="${workUser}">
      <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="workUsers" activiti:elementVariable="workUser"><!--isSequential="true"顺序执行 isSequential="false" 并行执行  建议并行执行-->
        <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition> <!-- 当任务完成量比例大于0.6的时候删除所有未执行的任务,通过当前节点继续执行流程 -->

 </multiInstanceLoopCharacteristics>

    </userTask>

4,java代码

public class TestMultiInstance {
@Test
public void testProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
TaskService taskService = processEngine.getTaskService();
Deployment deploy = repositoryService.createDeployment()//
.name("会签测试")//添加部署的名称
.addClasspathResource("com/boxhill/safemanage/bpmn/activititest2.bpmn")//从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("com/boxhill/safemanage/bpmn/activititest2.bpmn")//从classpath的资源中加载,一次只能加载一个文件
.deploy();
System.out.println(deploy.getId() + " " + deploy.getName());
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("mulitiInstance", new MulitiInstanceCompleteTask());

List<String> workUsers = new ArrayList<String>();
workUsers.add("A");
workUsers.add("B");
workUsers.add("C");
variables.put("workUsers", workUsers);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("activititest2",variables);
//ProcessInstance pi = runtimeService.startProcessInstanceByKey("activititest2");


ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(pi.getId()).singleResult();
if (null == processInstance) {
System.out.println("流程完成.");
}
}

0 0