# E10 流程详情 JS API

## 入口与实例

PC 使用 `FPMainTabWillMount`，移动端使用 `MFPMainTabWillMount`。回调中先限定业务范围，再获取当前流程详情实例。

```javascript
import { regHook } from "@weapp/utils";

const onWorkflowPage = (params) => {
  const { workflowId, requestId } = params.baseParam || {};
  if (workflowId !== "目标流程ID") return;

  const flowSdk = window.weappWorkflow.getFlowPageSDK();
  flowSdk.onceReady(() => {
    // 在实例就绪后注册能力。
  });
};

regHook("weappWorkflow", "FPMainTabWillMount", onWorkflowPage);
regHook("weappWorkflow", "MFPMainTabWillMount", onWorkflowPage);
```

常用读取：

```javascript
flowSdk.getBaseParam();
flowSdk.getCommonParam();
flowSdk.getWfSymbol();
flowSdk.getNodeSymbol();
```

页面可能同时存在多个流程弹窗。不得长期缓存可能失效或指向其他页面的实例。

## 拦截事件

```javascript
flowSdk.registerInterceptEvent(types, callback, order, uniqueName);
```

回调形式为 `(successFn, failFn, params) => void`。所有分支必须放行或阻断，避免等待超时。

常见类型：

| 类型 | 时机 |
|---|---|
| `BeforeSubmit` | 保存完成后、提交前 |
| `BeforeClickOperBtn\|{menutype}` | 操作按钮点击前 |
| `BeforeOperate\|{menutype}` | 操作弹框确认前 |
| `ClosePageIntercept` | 页面关闭前 |
| `SwitchTabIntercept` | 页签切换前 |

```javascript
flowSdk.registerInterceptEvent(
  "BeforeSubmit",
  (successFn, failFn) => {
    const valid = true;
    valid ? successFn() : failFn();
  },
  0,
  "custom_before_submit",
);
```

## 钩子事件

```javascript
flowSdk.registerHookEvent(types, callback, autoJudgeExecute, order, uniqueName);
```

常见类型：

| 类型 | 时机 |
|---|---|
| `LoadRenderComplete` | 表单加载完成 |
| `AfterLoadOperMenuHook` | 操作菜单加载完成 |
| `AfterOperateHook` | 操作成功后 |
| `AfterSubmitHook` | 提交类操作完成 |
| `SwitchTabHook` | 页签切换后 |
| `ChangeSysFieldEvent` | 系统字段变化 |
| `DestroyPage` | 页面销毁 |

重复进入页面时应使用稳定 `uniqueName` 防止重复注册。页面级资源需要在销毁阶段清理。

## 操作菜单

新增按钮：

```javascript
flowSdk.addOperMenu(
  {
    id: "-101",
    menutype: "CUSTOM_VALIDATE",
    title: "自定义校验",
    istop: true,
  },
  "Last",
);
```

按钮点击逻辑使用 `BeforeClickOperBtn|CUSTOM_VALIDATE` 注册。修改、隐藏或置灰标准菜单前，应在菜单加载完成后读取当前菜单，并保留非目标菜单行为。

## 页签扩展

```javascript
flowSdk.appendTab("custom_statistics", "统计结果", "Last");
```

用 `SwitchTabIntercept` 控制是否允许切换，用 `SwitchTabHook` 响应切换结果。页签内容应按需加载，避免入口执行重型渲染。

## 系统字段

系统字段操作前先确认字段名称、节点权限及当前流程状态。读取、修改和属性控制应使用目标基线文档明确提供的方法；变化监听使用 `ChangeSysFieldEvent`。

必须验证：

1. 新建与已办流程差异。
2. 当前节点是否允许编辑。
3. 非目标流程和节点不受影响。

## 签字意见

```javascript
flowSdk.changeRemark("同意");
flowSdk.changeRemark("补充意见", false, false, false);
const plainRemark = flowSdk.getSignRemark();
const rawRemark = flowSdk.getSignRemark(false);
```

读取原始 HTML 时不得直接拼入不可信 DOM。覆盖意见前需确认业务是否允许替换用户已有内容。
