启动子流程
场景描述
在主流程中的某个环节流转后,根据主流程的从表数据启动子流程,子流程都结束后,回到主流程
子流程的数据来自主流程的从表,例如主流程的从表有3条记录,如下图所示
按照werksname列的值启动子流程,北京工厂和上海工厂各启动一个子流程,审批各自的数据
实现思路
- 主流程的子流程环节的前一个环节的流转前事件,调用服务产生子流程数据
- 主流程的子流程环节,设置业务主键:去重的子表的子流程ID
- 主流程的子流程环节,设置处理人:去重的子表的工厂FID的组织角色管理者
- 主流程的子流程环节,设置执行规则:执行人不允许修改
- 子流程,设置业务主键:上下文中的业务主键
- 如果子流程不需要单独启动,则子流程的第一个环节的处理人,为上下文中的执行者
- 如果子流程需要单独启动,则子流程的第一个环节的执行规则,设置3个规则,第一个规则的生效条件是:是否正在启动子流程,执行者是:上下文中的执行者
实现步骤
1、产生子流程数据
- 主流程的从表增加子流程ID列
- 定义一个服务,根据主流程的从表数据,产生子流程的数据
- 并将产生的子流程的主表数据的ID,对应回写到主流程的从表数据子流程ID列中(上图中的cflowID列)
- 在子流程环节的前一个环节的流转前事件中,调用这个服务
2、设置子流程环节的业务主键
- 子流程的业务主键来自主流程的从表数据中的子流程ID列,并且去重
- 找到列表去重函数 distinct()
- 找到获取从表子流程ID列的函数 rvs('/preb/main/dbrest/xiaoshouddmx', null, concat('xiaoshoudd', '=eq.', :sData1), null, 'cflowID')
- 将这两个函数嵌套,得到子流程的业务主键表达式 distinct(rvs('/preb/main/dbrest/xiaoshouddmx', null, concat('xiaoshoudd', '=eq.', :sData1), null, 'cflowID'))
3、设置子流程环节的处理人
定义一个组织角色:名称:业务员,编码:ywy
分配谁管理哪个工厂
找到根据组织角色获取组织列表(使用角色编码)函数 findOrgUnitsByBizRoleCodeWF(组织角色编码,被管理组织FID列表)
找到列表去重函数 distinct()
找到获取从表数据中的工厂FID列的函数 rvs('/preb/main/dbrest/xiaoshouddmx', null, concat('xiaoshoudd', '=eq.', :sData1), null, 'werks')
将这三个函数嵌套,得到子流程的处理人表达式 findOrgUnitsByBizRoleCodeWF('ywy', distinct(rvs('/preb/main/dbrest/xiaoshouddmx', null, concat('xiaoshoudd', '=eq.', :sData1), null, 'werks')))
本例中工厂来自组织机构,因此处理人使用了组织角色,如果实际数据中没有使用组织机构,可以通过定义一个服务来获取处理人,服务返回json数组[{fid: "", fname: ""}],json数组的长度和子流程环节设置的业务主键必须一一对应。子流程环节的处理人设置为通过URL获取值函数getValueByUrl获取处理人
4、设置子流程环节的处理人不能更改
子流程的处理人和子流程的个数一一对应,所以在流转对话框中不允许修改,如下图所示设置
5、设置子流程的业务主键
切换到子流程,设置业务主键为流程上下文中的业务主键
6、设置子流程第一个环节的处理人
如果子流程不需要单独启动,则子流程的第一个环节的处理人,为上下文中的执行者
如果子流程需要单独启动,则子流程的第一个环节的执行规则,设置3个规则,第一个规则的生效条件是: 是否正在启动子流程isStartingSubProcess(),执行者是:上下文中的执行者
第二个规则和第三个规则是系统自动生成的,没有设置处理人时,系统会自动生成这两个规则,添加一个新的规则作为第三个规则,按照上面的方法修改第一个规则,保证3个规则的顺序