一个任务需要多个角色进行审批或者表决,根据这些审批结果来决定流程的走向。实现以上任务,activiti已经提供了支持,可以使用BPMN规范的多实例活动来实现。
1.Activiti多实例:
多实例节点是在业务流程中定义重复环节的一个方法。 从开发角度讲,多实例和循环是一样的: 它可以根据给定的集合,为每个元素执行一个环节甚至一个完整的子流程, 既可以顺序依次执行也可以并发同步执行。 多实例是在一个普通的节点上添加了额外的属性定义 (所以叫做'多实例特性'),这样运行时节点就会执行多次。 下面的节点都可以成为一个多实例节点: 根据规范的要求,每个上级流程为每个实例创建分支时都要提供如下变量:
可以通过 另外,每个创建的分支都会有分支级别的本地变量(比如,其他实例不可见, 不会保存到流程实例级别):
图形标记如果节点是多实例的,会在节点底部显示三条短线。 三条竖线表示实例会并行执行。 三条横线表示顺序执行。 ![]() Xml内容要把一个节点设置为多实例,节点xml元素必须设置一个 <multiInstanceLoopCharacteristics isSequential="false|true"> ... </multiInstanceLoopCharacteristics> isSequential属性表示节点是进行 顺序执行还是并行执行。 实例的数量会在进入节点时计算一次。 有一些方法配置它。一种方法是使用loopCardinality子元素直接指定一个数字。 <multiInstanceLoopCharacteristics isSequential="false|true"> <loopCardinality>5</loopCardinality> </multiInstanceLoopCharacteristics> 也可以使用结果为整数的表达式: <multiInstanceLoopCharacteristics isSequential="false|true"> <loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality> </multiInstanceLoopCharacteristics> 另一个定义实例数目的方法是,通过 <userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}"> <multiInstanceLoopCharacteristics isSequential="false"> <loopDataInputRef>assigneeList</loopDataInputRef> <inputDataItem name="assignee" /> </multiInstanceLoopCharacteristics> </userTask> 假设
<userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"> <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${myService.resolveUsersForTask()}" activiti:elementVariable="assignee"> </multiInstanceLoopCharacteristics> </userTask> 多实例节点在所有实例都完成时才会结束。也可以指定一个表达式在每个实例结束时执行。 如果表达式返回true,所有其他的实例都会销毁,多实例节点也会结束,流程会继续执行。 这个表达式必须定义在completionCondition子元素中。 <userTask id="miTasks" name="My Task" activiti:assignee="${assignee}"> <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee" > <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition> </multiInstanceLoopCharacteristics> </userTask> 在这里例子中,会为 <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${assigneeList}" activiti:elementVariable="assignee"> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition> </multiInstanceLoopCharacteristics> </userTask> 发布流程: Deployment deployment = repositoryService.createDeployment() .addClasspathResource("com/chq/ssh/test/activiti/deploy/huiqian.bpmn20.xml") .deploy(); 启动流程: List<String> assigneeList=new ArrayList<String>(); //分配任务的人员 assigneeList.add("tom"); assigneeList.add("jeck"); assigneeList.add("mary"); Map<String, Object> vars = new HashMap<String, Object>(); //参数 vars.put("assigneeList", assigneeList); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("huiqian",vars); 查询任务: 这时查询以上三个人的任务,都会显示有“会签”这个任务 List<Task> tasks = taskService.createTaskQuery().taskAssignee("mary").list(); 完成任务: 会签节点设置的:${nrOfCompletedInstances/nrOfInstances >= 0.6 } 所有任务完成超过60%,剩余的任务就会删除,表示会签通过。 上面一共设置了三个任务,当两个完成时,超过60%。流程结束来源:http://www./content-4-116901.html |
|