# 一、对外RPC接口
## 主子流程信息接口
**RPC接口：com.weaver.workflow.core.api.rest.subrequest.SubRequestRest**



### 1.根据主流程requestId，获取已触发的子流程信息


~~~java
    /**
     * 根据主流程ID，获取已触发的子流程ID
     *
     * @param mainRequestIds 主流程id集合
     * @param tenantKey
     * @param deleteType 0:仅查询未删除 1:查询所有
     * @return
     */
    WeaResult<List<SubRequestInfoEntity>> getSubRequestInfo(List<Long> mainRequestIds, String tenantKey, int deleteType);
~~~

### 2.根据子流程requestId查询主流程信息


~~~java
 /**
     * 通过子流程流程requestId查询主流程
     *
     * @param requestId
     * @param tenantKey
     * @param deleteType 0:仅查询未删除 1:查询所有
     * @return
     */
  WeaResult<RequestListDataVoEntity> getMainRequestBySubRequestId(long requestId, String tenantKey, int deleteType);
~~~

### 3.根据子流程requestId查询平行流程信息
~~~java
    /**
     * 通过子流程requestId查询平行流程
     *
     * @param requestId
     * @param tenantKey
     * @param deleteType
     * @return
     */
    WeaResult<List<RequestListDataVoEntity>> getParallelRequestBySubRequestId(long requestId, String tenantKey, int deleteType);
~~~






# 二、埋点二开钩子
## 子流程触发创建并同步赋值后埋点时机埋点钩子

### 1.钩子功能概述

子流程触发分为创建流程实例和同步数据两个步骤，支持主子流程数据同步完成后的时机钩子，便于二开人员灵活的切入进行开发实现下游自定义业务功能。

**最低支持基线版本250901**

### 2.逻辑调用说明

子流程创建成功并同步赋值完成后，标准逻辑会扫描执行此钩子中注册的自定义逻辑，主要用于二开逻辑需要在子流程赋值后执行的场景。



钩子标识参数：
module = "workflow", event = "WfcSubrequestCreateAndSynEnd"

**口子参数参考示例中的注释**



### 3.二开注册钩子示例
~~~java
package com.weaver.seconddev.subtest;

import com.alibaba.fastjson.JSONObject;
import com.weaver.loom.api.annotation.RegHook;
import com.weaver.loom.context.register.AbstractRegHookEvent;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;



@Slf4j
@RegHook(module = "workflow", event = "WfcSubrequestCreateAndSynEnd", order = 0)
public class DemoHandleTestHook extends AbstractRegHookEvent {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public DemoHandleTestHook() {
       System.out.println("DemoHandleTestHook ==init");
    }
    @Override
    public Object handle(Object[] args) throws Exception {
        try {
            logger.error("DemoHandleTestHook----->参数:{}", JSONObject.toJSONString(args));
            Map<String,Object> params = (Map<String,Object>)args[0];
            Long mainRequestId = (Long)params.get("mainRequestId");//主流程RequestId
            Long subRequestId = (Long)params.get("subRequestId");//子流程RequestId
            Long userId = (Long)params.get("userId");//用户id
            String tenantKey = (String)params.get("tenantKey");//租户key
            logger.error("mainRequestId:"+mainRequestId + " subRequestId:"+subRequestId +" userId:"+userId +" tenantKey:"+tenantKey );
        }catch (Exception e){
            e.printStackTrace();
            logger.error("DemoHandleTestHook-err:{}", JSONObject.toJSONString(e));
        }
        // 返回结果
        return null;
    }
}

~~~

