岗位
参照设置
"oryx-posts-complex": { "readModeTemplateUrl": "editor-app/configuration/properties/reference/treegrid/reference-display-template.html", "writeModeTemplateUrl": "editor-app/configuration/properties/reference/treegrid/reference-write-template.html", "isReference": true, "referenceType": "treegrid", "treeMultiSelect": false, "multiSelect": true, "treeDataUrl": "/reference/post_view/tree", "dataUrl": "/reference/post_view/grid", "fields": [ {id:'pk', i18n:'REFERENCE.BASE.PK', pkField:true, visible:false}, {id:'code', i18n:'REFERENCE.BASE.ID', resultField:true, width:100}, {id:'name', i18n:'REFERENCE.BASE.NAME', returnField:true, resultField:true, width:100} ] }
参照API
制单人
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%的任务完成时,其他任务就会删除,流程
继续执行。