Activiti参与人扩展
来源:互联网 发布:南昌怎么样 知乎 编辑:程序博客网 时间:2024/04/29 17:53
1、制单人
String userId = null;if(ParticipantContext.getProcessInstance()!=null){ HistoricProcessInstance historicProcessInstance = bpmEngineConfiguration.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(ParticipantContext.getProcessInstance().getId()).singleResult(); if(historicProcessInstance != null){ userId = historicProcessInstance.getStartUserId(); }}if(userId==null){ userId = BpmAuthentication.getAuthenticatedUserId();}
Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以进行参与人扩展,实现多任务。
<process id="process9728" name="mgr" isExecutable="true"> <sequenceFlow id="SequenceFlow3008" sourceRef="startEvent6770" targetRef="approveUserTask5586"/> <startEvent id="startEvent6770" name="启动"/> <approveUserTask id="approveUserTask5586" name="发起人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="true" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50"> <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser("{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'CURUSER','userfilter':''}]}")}" activiti:elementVariable="assignee"/> </approveUserTask> <approveUserTask id="ApproveUserTask2" name="部门负责人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="false" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50"> <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser("{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'ORGMGR','userfilter':''},{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'extend_role1','userfilter':''}]}")}" activiti:elementVariable="assignee"/> </approveUserTask> <sequenceFlow id="sid-615A1782-727D-4761-A879-C6DBCBCF92FD" sourceRef="approveUserTask5586" targetRef="ApproveUserTask2"/> <approveUserTask id="ApproveUserTask3" name="上级部门负责人" activiti:assignAble="false" activiti:addsignAble="false" activiti:rejectAble="false" activiti:delegateAble="false" activiti:samepostApprove="false" activiti:extendAttributes="[]" activiti:priority="50"> <multiInstanceLoopCharacteristics isSequential="true" activiti:collection="${bpmBean.getUser("{'filters':[],'processParticipantItems':[{'details':[],'filters':[],'others':null,'samedept':false,'sameorg':false,'type':'HIGHERORGMGR','userfilter':''}]}")}" activiti:elementVariable="assignee"/> </approveUserTask> <sequenceFlow id="sid-7CD77926-8149-4127-8F05-74B63B271E7D" sourceRef="ApproveUserTask2" targetRef="ApproveUserTask3"/> <endEvent id="EndNoneEvent2" name="结束"/> <sequenceFlow id="sid-64F34D7E-2762-4A4B-B519-54FDB341CEBE" sourceRef="ApproveUserTask3" targetRef="EndNoneEvent2"/> </process>
要把一个节点设置为多实例,节点xml元素必须设置一个multiInstanceLoopCharacteristics子元素。
- <multiInstanceLoopCharacteristics isSequential="false|true">
- ...
- </multiInstanceLoopCharacteristics>
isSequential属性表示节点是进行 顺序执行还是并行执行。
实例的数量会在进入节点时计算一次。 有一些方法配置它。一种方法是使用loopCardinality子元素直接指定一个数字。
- <multiInstanceLoopCharacteristics isSequential="false|true">
- <loopCardinality>5</loopCardinality>
- </multiInstanceLoopCharacteristics>
也可以使用结果为整数的表达式:
- <multiInstanceLoopCharacteristics isSequential="false|true">
- <loopCardinality>${nrOfOrders-nrOfCancellations}</loopCardinality>
- </multiInstanceLoopCharacteristics>
另一个定义实例数目的方法是,通过loopDataInputRef子元素,设置一个类型为集合的流程变量名。 对于集合中的每个元
素,都会创建一个实例。 也可以通过inputDataItem子元素指定集合。 下面的代码演示了这些配置:
- <userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}">
- <multiInstanceLoopCharacteristics isSequential="false">
- <loopDataInputRef>assigneeList</loopDataInputRef>
- <inputDataItem name="assignee" />
- </multiInstanceLoopCharacteristics>
- </userTask>
假设assigneeList变量包含这些值[kermit, gonzo, foziee]。 在上面代码中,三个用户任务会同时创建。每个分支都会拥
有一个用名为assignee的流程变量, 这个变量会包含集合中的对应元素,在例子中会用来设置用户任务的分配者。
loopDataInputRef和inputDataItem的缺点是1)名字不好记, 2)根据BPMN 2.0格式定义,它们不能包含表达式。activiti
通过在 multiInstanceCharacteristics中设置 collection和 elementVariable属性解决了这个问题:
- <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>
在这里例子中,会为assigneeList集合的每个元素创建一个并行的实例。 当60%的任务完成时,其他任务就会删除,流程
继续执行。
阅读全文
0 0
- Activiti参与人扩展
- activiti 扩展专题
- Activiti扩展组织结构
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- 浅谈Activiti Modeler 的扩展
- Activiti 5.17 Activiti与restlet的继承关系和扩展
- 参与
- 扩展activiti原表增加新字段
- 扩展activiti-userTask分配多个角色
- openwebflow----基于Activiti的工作流引擎扩展
- 扩展Activiti工作流任务和属性
- PHP7扩展开发之传参与返回值
- activiti
- jquery中的attr函数attr(name)、attr(key,value)、attr(properties)、attr(key,fn)、removeAttr
- 日期字段的显示
- android中Dialog和PopupWindow的区别
- 图片浏览器加载情况
- Linux 安装 ActiveMQ 详解
- Activiti参与人扩展
- Mysql 慢查寻
- xutils导入到Android studio中
- poj3723
- IAR查看代码所占SRAM和FLASH
- jquery中的class函数addClass,removeClass,toggle,hasClass
- jQuery学习笔记——复选框的操作
- 会编程序的软件,一款实现“零”代码编程序的软件
- hdu 5969 最大的位或(找规律)