目录
1、多实例/会签(Multi-instance)
在流程业务管理中,任务通常是由一个人去处理的,而多个人同时处理一个任务,称之为会签任务。
一个多实例活动被执行多次,对于给定集合的每个元素执行一次。Camunda工作流多实例包括三种类型:
1、Sequential(顺序或串行)
2、Parallel(并行)
3、Loop(循环)
A multi-instance activity is executed either sequentially or in parallel (default). In the BPMN, a sequential multi-instance activity is displayed with three horizontal lines at the bottom. A parallel multi-instance activity is represented by three vertical lines.
多实例活动按顺序或并行执行(默认)。在BPMN中,一个连续的多实例活动显示为底部有三条水平线。并行的多实例活动由三条垂直线表示。
(1)Sequential(顺序/串行)
In case of a sequential multi-instance activity, the instances are executed one at a time. When one instance is completed, a new instance is created for the next element in the inputCollection.
如果是连续的多实例活动,则一次执行一个实例。当一个实例完成时,会为inputCollection中的下一个元素创建一个新实例。
串行流程图配置
后台java代码
@ResponseBody
@RequestMapping("/startFlow")
public Object startFlow(Yslc yslc, HttpServletRequest request) {
try {
tylcService.saveData(yslc);
Map<String,Object> map = new HashMap<>();
//对应流程图Collection
List<String> xmjlList = staffService.getStaffIdsByRoleName("项目经理");
map.put("xmjlList",xmjlList);
String businessKey = String.valueOf(yslc.getYslcId());
identityService.setAuthenticatedUserId(yslc.getCreatedStaffId().toString());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(yslc.getProcessDefinitionKey(),businessKey, map);
yslc.setProcinstId(processInstance.getId());
tylcService.updateData(yslc);
return renderSuccess("保存成功");
} catch (Exception e) {
e.printStackTrace();
return renderError("保存失败");
}
}
流程结果
需要两个人同时办理完后,流程才能继续往下走,一次只能有一个人收到代办,办理流程有先后顺序。
(2)Parallel(并行)
In case of a parallel multi-instance activity, all instances are created when the multi-instance body is activated. The instances are executed concurrently and independently from each other.
如果是并行的多实例活动,则在激活多实例主体时会创建所有实例。这些实例是同时执行的,并且彼此独立。
并行流程图配置
后台代码
@ResponseBody
@RequestMapping("/startFlow")
public Object startFlow(Yslc yslc, HttpServletRequest request) {
try {
yslc.setCreatedStaffId(this.getCurrentStaffId());
yslc.setCreatedTime(DateUtil.format(new Date(), DateUtil.DATE_FORMAT));
yslc.setDeletedFlag(0);
tylcService.saveData(yslc);
Map<String,Object> map = new HashMap<>();
map.put("bmzrapprover",yslc.getBmzrApprover());
//对应流程图Collection
List<String> hqxzzgList = staffService.getStaffIdsByRoleName("后勤行政主管");
map.put("hqxzzgList",hqxzzgList);
map.put("zhbapprover",tylc.getZhbApprover());
map.put("hqxzzgapprover",tylc.getHqzgApprover());
map.put("hrapprover",tylc.getHqzgApprover());
String businessKey = String.valueOf(yslc.getYslcId());
identityService.setAuthenticatedUserId(yslc.getCreatedStaffId().toString());
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(yslc.getProcessDefinitionKey(),businessKey, map);
yslc.setProcinstId(processInstance.getId());
yslc.setModifiedStaffId(this.getCurrentStaffId());
yslc.setModifiedTime(DateUtil.format(new Date(), DateUtil.DATE_FORMAT));
tylcService.updateData(yslc);
return renderSuccess("保存成功");
} catch (Exception e) {
e.printStackTrace();
return renderError("保存失败");
}
}
流程结果
需要两个人同时办理完后,流程才能继续往下走,两个人都会收到代办,办理流程没有先后顺序。
2、Multil instance:(多实例)有以下几个属性
Loop cardinality:循环基数(实例数量),可选项。可填整数,表示会签的人数。
Completion condition:完成条件(结合条件表达式),可选项。
Collection:集合,可选项。会签人数的集合list,与loop cardinality二选一。
Element variable:元素变量。选择Collection时必选,为collection集合每次遍历的元素。
3、会签环节中设计的几个默认流程变量
(1) nrOfInstances(numberOfInstances):会签中总共的实例数
(2) nrOfCompletedInstances:已经完成的实例数量
(3) nrOfActiviteInstances:当前还没有完成的实例数量
4、Completion condition,完成条件表达式
${nrOfInstances == nrOfCompletedInstances} 表示所有人员审批完成后会签结束。
${ nrOfCompletedInstances == 1}表示一个人完成审批,该会签就结束。
设置一个人完成后会签结束,那么其他人的代办任务都会消失。