> 功能说明:主流程指定一组会签人员,多实例调用子流程进行会签处理 > 例如:指定用户A和B,并行会签模式,用户A和B同时调起子流程实例,子流程结束,返回主流程,进入主流程下一个节点;顺序会签模式,根据指定的用户顺序A、B, 用户A调起子流程实例,子流程结束,用户B再调起子流程实例,子流程结束,返回主流程,进入主流程下一个节点 下面讲解子流程会签的实现步骤: 一、创建主、子流程 ![](https://img.kancloud.cn/01/11/0111aff35fe53b74abe4c3dd66ece881_1516x117.png) ![](https://img.kancloud.cn/29/85/2985a2d7a384cdc210e2c686aedb5ef8_1919x636.png) ![](https://img.kancloud.cn/c0/20/c02085a3cb84c44ee3c71ba604b8df93_1917x643.png) ``` (1)主流程定义流程key:mainflow, 可以自行定义不能重复,也可使用自动生成的值 (2)子流程定义流程key:subflow, 可以自行定义不能重复,也可使用自动生成的值, 主流程调用子流程时需要该流程key ``` 二、主流程关联online表单 ![](https://img.kancloud.cn/44/3c/443cacb5102c713c02fe5aa5c7947225_1904x421.png) 三、主流程会签调用子流程 (1)子流程节点设置 ![](https://img.kancloud.cn/37/87/37872ebf8bbad80074dab971f2ee9d54_1918x643.png) 子流程节点配置: 调用子流程--名称:subflow 传入变量(主流程->子流程): 源变量assigneeUserId 目标变量assigneeUserId > 备注:主流程流程在调起子流程时把主流程的流程变量assigneeUserId的值传递给子流程的流程变量assigneeUserId (2)子流程节点会签属性设置 ![](https://img.kancloud.cn/86/3c/863c3fc0d08481673ca9dbf6590fed19_1916x748.png) 会签属性设置: 状态:并行/顺序,并行:指定会签用户同时调起子流程实例;顺序:根据指定会签用户顺序调起子流程实例,一个子流程实例完成后,调起下一个子流程实例 循环集合:${flowUtil.stringToList(assigneeUserIdList)} 获取上一个节点指定的会签人员 元素名:assigneeUserId 四、子流程配置 (1)增加流程开始监听 ![](https://img.kancloud.cn/1f/13/1f13e75e0973da3b1b4e5867d73be480_1917x681.png) 增加流程开始监听:子流程会签开始监听 org.jeecg.modules.extbpm.listener.execution.SubProcessHqStartListener ``` /** * 类名:SubProcessHqStartListener * 功能:流程实例结束监听器 * @author zhoujf * */ public class SubProcessHqStartListener implements ExecutionListener{ private static final long serialVersionUID = 1L; @Override public void notify(DelegateExecution execution) throws Exception { RuntimeService runtimeService = SpringContextUtils.getBean(RuntimeService.class); String mainProcessId = (String)execution.getVariable(WorkFlowGlobals.JG_SUB_MAIN_PROCESS_ID); String url = (String)execution.getVariable(WorkFlowGlobals.BPM_FORM_CONTENT_URL); String bizTitle = (String)runtimeService.getVariable(mainProcessId,WorkFlowGlobals.BPM_BIZ_TITLE); if(StringUtils.isEmpty(url)) { url = (String)runtimeService.getVariable(mainProcessId,WorkFlowGlobals.BPM_FORM_CONTENT_URL); execution.setVariable(WorkFlowGlobals.BPM_FORM_CONTENT_URL, url); } execution.setVariable(WorkFlowGlobals.BPM_BIZ_TITLE, bizTitle); //获取主表表名 String tableName = (String)runtimeService.getVariable(mainProcessId,WorkFlowGlobals.BPM_FORM_KEY); execution.setVariable(WorkFlowGlobals.BPM_FORM_KEY, tableName); //获取主表数据id String businessKey = (String)runtimeService.getVariable(mainProcessId, WorkFlowGlobals.BPM_DATA_ID); execution.setVariable(WorkFlowGlobals.BPM_DATA_ID, businessKey); //子流程实例set业务号和主流程保持一致 runtimeService.updateBusinessKey(execution.getProcessInstanceId(), businessKey); } } ``` > 备注:该监听主要作用是从主流程获取相关的流程变量传递给子流程,在子流程展示主流程表单和其他相关业务扩展是使用 (2)子流程任务节点人员配置 子流程任务节点配置主流程指定的会签人员 ![](https://img.kancloud.cn/fb/93/fb9370886a99a539de7b34a5dd1d011e_1912x686.png) 至此,主子流程,子流程会签配置完成,流程发布后,可进入online表单录入数据发起流程