子流程
本文列举几个常用的子流程示例,子流程介绍参考《流程环节》中的子流程环节
主子流程使用相同的业务数据
主流程和子流程使用同一个业务数据,需要传递主流程的业务主键。
在流程图中设置如下
- 子流程-业务主键:流程上下文中的业务主键
- 子流程-首环节-处理人:流程上下文中的处理人
主流程属性设置
在主流程定义中添加子流程环节
选中子流程环节,设置“子流程”属性
点击⚙打开流程列表并选择对应流程添加为子流程;
子流程启动方式属性设置为自动,当流程进入到子流程环节会自动启动子流程。
子流程属性设置
打开子流程流程定义页面,设置业务主键属性;
点击⚙打开业务主键设置对话框,选中“流程上下文中的业务主键”确定
选中流程首环节,并设置“处理人”为“流程上下文中的处理人”
点击⚙打开组织选择页面,在上下文环境中选中“流程上下文中的处理人”确定。
主子流程使用不同的业务数据(1 对 n)
主流程是一个主从表,到了某个子流程环节,需要针对从表记录启动子流程
每条从表记录启动一个流程
主流程从表的每条记录都启动一个子流程,即主流程从表和子流程是一对一的关系,因此子流程直接使用主流程从表的业务数据即可。这种场景需要传递子流程的业务主键,即从表的所有主键(逗号分隔)。
在流程图中设置如下
- 主流程-子流程环节-业务主键:通过表单字段返回从表的所有主键(逗号分隔),如下图所示
- 子流程-业务主键:流程上下文中的业务主键
- 子流程-首环节-处理人:流程上下文中的处理人
主流程属性设置
在主流程定义中添加子流程环节,设置子流程环节属性
- 子流程:选择一个流程作为子流程
- 子流程启动方式:设置为自动,表示当流程进入到子流程环节会自动启动子流程
子流程属性设置
在子流程定义中,设置流程和首环节属性
- 流程-业务主键:设置为“流程上下文中的业务主键”
- 首环节-处理人:设置为“流程上下文中的处理人”
多条从表记录启动一个流程
主流程从表的多条记录启动一个子流程,即主流程从表和子流程不是一对一的关系,因此子流程不能直接使用主流程从表的业务数据。
- 子流程需要有自己的主数据,主流程从表的数据也作为子流程从表的数据
- 在从表中,增加一个子流程主数据的外键字段
- 将数据进行分组,同一组的数据,外键字段赋值一个相同的 UUID
- 这列作为子流程业务主键,设置到子流程环节的业务主键中
这种场景需要传递子流程的业务主键,即从表的新加的外键列中,所有值去重,逗号分隔。
例如主流程的从表有3条记录,如下图所示
按照 werksname 列的值启动子流程,北京工厂和上海工厂各启动一个子流程,审批各自的数据
- 主流程的子流程环节的前一个环节的流转前事件,调用服务产生子流程数据
- 主流程的子流程环节,设置业务主键:去重的子表的子流程 ID
- 主流程的子流程环节,设置处理人:去重的子表的工厂 FID 的组织角色管理者
- 主流程的子流程环节,设置执行规则:执行人不允许修改
- 子流程,设置业务主键:上下文中的业务主键
- 如果子流程不需要单独启动,则子流程的第一个环节的处理人,为上下文中的处理人
- 如果子流程需要单独启动,则子流程的第一个环节的执行规则,设置3个规则,第一个规则的生效条件是:是否正在启动子流程,处理人是:上下文中的处理人
产生子流程数据
- 主流程的从表增加子流程 ID 列
- 定义一个服务,根据主流程的从表数据,产生子流程的数据
- 并将产生的子流程的主表数据的 ID,对应回写到主流程的从表数据子流程 ID 列中(上图中的 cflowID 列)
- 在子流程环节的前一个环节的流转前事件中,调用这个服务
设置子流程环节的业务主键
- 子流程的业务主键来自主流程的从表数据中的子流程 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'))
设置子流程环节的处理人
- 定义一个组织角色:名称:业务员,编码: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
设置子流程环节的处理人不能更改
子流程的处理人和子流程的个数一一对应,所以在流转对话框中不允许修改,如下图所示设置
设置子流程的业务主键
切换到子流程,设置业务主键为流程上下文中的业务主键
设置子流程第一个环节的处理人
- 如果子流程不需要单独启动,则子流程的第一个环节的处理人,为上下文中的处理人
- 如果子流程需要单独启动,则子流程的第一个环节的执行规则,设置3个规则,第一个规则的生效条件是: 是否正在启动子流程 isStartingSubProcess(),处理人是:上下文中的处理人
- 第二个规则和第三个规则是系统自动生成的,没有设置处理人时,系统会自动生成这两个规则,添加一个新的规则作为第三个规则,按照上面的方法修改第一个规则,保证3个规则的顺序
主子流程使用不同的业务数据(1 对 1)
主流程中间启动子流程
主流程关联一个业务数据,子流程关联另一个业务数据(包含存储主流程业务主键的字段),两个业务数据是一对一的关系。
这种场景需要传递主流程的业务主键,在流程图中设置如下
- 子流程-业务主键:根据流程上下文生成业务主键
- 主键字段:子流程数据的主键字段
- 存储流程上下文业务主键的字段:子流程数据中存储主流程业务主键的字段
- 子流程-首环节-处理人:流程上下文中的处理人
- 子流程页面-主数据
- 存储主流程业务主键的字段的默认值:设置为流程组件的"获取流程上下文中的业务主键"
主流程属性设置
在主流程定义中添加子流程环节,设置子流程环节属性
- 子流程:选择一个流程作为子流程
- 子流程启动方式:设置为自动,表示当流程进入到子流程环节会自动启动子流程
子流程属性设置
打开子流程流程定义页面,设置业务主键属性;
点击⚙打开业务主键设置对话框,选中“根据流程上下文生成业务主键”并设置两个参数:
- 主键字段:选择子流程主数据的主键字段
- 存储流程上下文业务主键的字段:选择子流程主数据上用来存储主流程业务主键的字段
如不允许子流程功能菜单在门户显示,则打开“高级设置”,勾选不在菜单上显示
选中流程首环节,并设置“处理人”为“流程上下文中的处理人”
点击⚙打开组织选择页面,在上下文环境中选中“流程上下文中的处理人”确定。
子流程页面设置
打开子流程的页面,将主数据上用来存储流程上下文业务主键的字段的默认值设置为:流程组件的"获取流程上下文中的业务主键"
子流程启动后,自动获取主流程的业务主键
主流程结束后启动子流程
在主流程结束时启动子流程,需要在主流程的结束前放子流程环节,如下图所示。主流程结束时启动子流程,设置主流程的子流程环节的“异步执行”属性为是即可。其它设置同上文
流程结转(n 对 1)
若干个主流程实例,在某个子流程环节需要合并为一个子流程,子流程业务数据是主从表,其中从表是主流程关联的业务数据。
这种场景无需传递业务主键,在流程图中设置如下
- 主流程-子流程环节-子流程启动方式:手工
- 子流程-流程启动后事件:绑定子流程,选择一个存储"主流程业务主键"的列,支持使用主表的 ID 列表字段,或从表的 ID 列(系统自动转换为 ID 列表),系统给这些主流程设置子流程
主流程属性设置
在主流程结束前添加子流程环节,设置子流程环节属性
- 子流程:选择一个流程作为子流程
- 子流程启动方式:设置为手工,将不自动启动子流程,由用户手工启动子流程
子流程属性设置
打开子流程流程定义页面,切换到“高级设置”设置,点击流程事件属性,设置流程启动后事件;
在流程启动后事件,处理事件中调用"绑定子流程",
参数为"主流程业务主键",本例为:[从表]结转子流程从表.结转主流程 ID
动态子流程
通过动态子流程的设置实现同一个主流程在运行时可以执行不同的子流程
子流程环节上提供了动态子流程的设置,通过函数获取到需要的子流程,如果没有获取到走设置的默认子流程。
动态子流程是需要通过函数获取的,平台默认提供4个函数,如下图所示,也可以自己定义函数,参考《自定义流程函数》
平台提供的获取子流程的函数,都是根据组织和流程标签查找对应的子流程
- 组织包括
- 当前人所在组织
- 流程发起人所在组织
- 环节发起人所在组织
- 使用业务数据中设置的组织
- 组织类型
- 组织类型:包括组织类型管理中定义的所有组织类型,例如:机构、部门
- 匹配模式:包括相等和包含
- 注意:要配对的子组织类型,如1dpt、2ogn类似这样的不是默认的ogn、dpt或pos时,匹配模式需要选择包含;相等是要组织类型完全匹配的
- 流程标签
- 是流程的属性,在流程图中设置,如下图所示,也可以在流程定义中设置
在流程定义中,设置流程的标签和拥有者(组织),使用上面的函数就可以根据拥有者(组织)和流程标签,计算出对应的流程
如下场景就可以实现不同的组织执行不同的子流程:
- 主流程定义:总部定义主流程,在某个子流程环节的动态子流程属性上配置表达式(比如设置为流程发起人所在机构下有"订单"标签的流程);
- 子流程定义:不同的分公司可以定义自己的子流程,只需要把子流程定义的流程标签上设置为“订单”。
- 当主流程运行到相应的子流程环节时,会根据配置的表达式获取相应的子流程标识启动子流程。
- 主流程和子流程的业务数据关系,参考上面4种方式设置