# Elink消息模板审批流程 PRD

## 1. 文档信息

| 属性 | 值 |
|------|-----|
| 文档名称 | Elink消息模板审批流程 PRD |
| 所属模块 | 全知平台 / 风控模块 / 风控运营管理 / 消息模板管理 |
| 文档版本 | v2.1 |
| 编写日期 | 2026-07-06 |
| 前置依赖 | Elink消息通知功能第一期、消息模板管理-开放普通用户访问 |

### 版本更新记录

| 版本 | 日期 | 更新内容 |
|------|------|----------|
| v2.1 | 2026-07-06 | 1. 新增「已驳回」状态，驳回后不回到草稿而是进入已驳回状态，创建人可查看驳回原因、编辑后重新提交<br>2. 可见性和合规承诺从编辑弹窗移至提交审核确认弹窗，编辑阶段不再设置可见性<br>3. 去掉「创建新版本」概念，统一使用「复制」按钮，已发布/停用模板均可复制<br>4. 已停用模板新增「删除」权限<br>5. 操作按钮规则按 TAB × 状态 × 角色 三维定义：「撤回」只在全部模板/我创建的Tab显示，「审批」只在全部模板/待审核Tab显示 |
| v2.0 | 2026-07-06 | 初版。建立模板审批流程、已发布模板内容锁定、复制为新模板、可见性控制、变量验证、提交审核确认弹窗 |

---

## 2. 背景与需求

### 2.1 现状

平台已具备以下能力：

| 能力 | 状态 | 说明 |
|------|------|------|
| 消息模板CRUD | 已实现 | 管理员可创建、编辑、删除模板 |
| 模板启用/停用 | 已实现 | 管理员可控制模板的启用状态 |
| 模板变量插入 | 已实现 | 支持 {ruleName}、{sceneName} 等变量 |
| 普通用户访问 | 已实现 | 普通用户可查看和复制模板 |

### 2.2 问题

- **无审批流程**：模板创建后直接启用，无质量把关环节，任何人都可以让模板生效并开始对外发送消息
- **创建权限未开放**：因无审批流程，普通用户无法创建消息模板，只有管理员能创建。但最了解"处置人需要看到什么信息"的人是配置规则的业务人员，不是管理员
- **无审批记录**：出了问题无法追溯"谁批准了这个模板"
- **编辑即生效风险**：修改已启用的模板时，如果直接生效，可能导致正在发送的消息内容出错

### 2.3 目标

建立**模板审批**机制：
- **开放创建权限**：普通用户可创建消息模板，通过审批流程保证质量
- 模板发布（启用）需经管理员审批
- 已发布的模板内容锁定，不可直接修改（参照短信平台模板管理规范）
- 更新模板内容需创建新模板，独立走审批流程，旧模板保留可用
- 完整的审批记录，支持审计追溯

---

## 3. 设计原则

### 3.1 发布触发审批

模板的创建和编辑过程不触发审批，只有在用户点击"提交审核"时才触发审批流程。编辑阶段是自由的，用户可以反复修改。

### 3.2 管理员审批

由管理员角色负责审批。管理员自己创建的模板允许自审（当前平台管理员数量有限，互审容易造成流程卡死）。

### 3.3 已发布模板内容锁定

已审核通过的模板，内容不可直接修改。原因：
- 运营商侧已备案模板内容，直接改正文会导致备案内容与下发内容不一致，触发拦截、封号、罚款
- 参照阿里云、腾讯云、移动阅信等短信平台的模板管理规范

### 3.4 唯一合规更新方式：复制为新模板

更新模板内容的唯一方式是**复制为新模板**：
- 基于已有模板内容创建一个全新的独立模板（新编号）
- 新模板走独立的审批流程
- 旧模板保留可用，不受影响
- 如需停用旧模板，由管理员手动操作

### 3.5 存量兼容

功能上线时，所有已启用的模板自动标记为"已发布"状态，无需重新审批。

---

## 4. 功能范围

| ID | 功能 | 说明 |
|----|------|------|
| F1 | 开放普通用户创建权限 | 普通用户可创建消息模板，通过审批保证质量 |
| F2 | 模板状态与流转 | 草稿→待审核→已发布（启用），驳回到已驳回 |
| F3 | 审批流程 | 管理员审核通过/驳回，驳回需填写原因 |
| F4 | 审批历史 | 完整的审批记录，支持审计追溯 |
| F5 | 可见性控制 | 创建人可选择模板公开或私有，公开对所有用户可见，私有仅创建人和管理员可见 |
| F6 | 模板停用校验 | 停用正被场景使用的模板时，提示使用数量并确认 |
| F7 | 复制模板 | 基于已发布模板内容复制为新模板，独立走审批 |
| F8 | 变量验证 | 提交审核前验证模板变量是否与关联规则匹配 |
| F9 | 存量数据处理 | 已有模板自动标记为已发布 |
| F10 | 页面改动 | 模板列表页、审批弹窗、Tab切换 |

### 不在范围内

- 模板版本对比（Diff）功能
- 模板草稿自动保存
- 审批消息通知（如站内信提醒有待审核模板）
- 模板批量审批
- 模板导入/导出
- 模板版本号管理（新旧模板完全独立，无版本关联）

---

## 5. 用户角色与权限

### 5.1 角色定义

| 角色 | 说明 |
|------|------|
| 管理员 | 系统管理员，负责模板审批和全局管理 |
| 普通用户（创建人） | 模板的创建者，通常是场景创建人或规则配置者 |
| 普通用户（非创建人） | 其他普通用户，可查看和使用共享模板 |

### 5.2 模板可见性

#### 5.2.1 可见性选项

创建人提交审核时（或编辑时）可选择模板的可见性：

| 可见性 | 含义 | 谁能看见 |
|--------|------|----------|
| 公开 | 所有用户可见 | 所有已登录用户 |
| 私有 | 仅创建人和管理员可见 | 创建人 + 管理员 |

> **默认值**：公开。创建人可根据需要选择"私有"。

#### 5.2.2 可见范围规则

模板的实际可见性 = **审批状态** × **可见性设置** × **用户角色**

| 审批状态 | 可见性 | 管理员 | 创建人 | 非创建人 |
|----------|--------|--------|--------|----------|
| 草稿 | — | 可见 | 可见 | 不可见 |
| 待审核 | — | 可见 | 可见 | 不可见 |
| 已驳回 | — | 可见 | 可见 | 不可见 |
| 已发布 | 公开 | 可见 | 可见 | 可见 |
| 已发布 | 私有 | 可见 | 可见 | 不可见 |
| 已发布(停用) | 公开 | 可见 | 可见 | 不可见 |
| 已发布(停用) | 私有 | 可见 | 可见 | 不可见 |

### 5.3 操作权限

| 操作 | 管理员 | 普通用户（创建人） | 普通用户（非创建人） |
|------|--------|-------------------|---------------------|
| 创建 | 可 | 可 | 可 |
| 编辑 | 草稿/已驳回 | 自己的草稿/已驳回 | 不可 |
| 删除 | 草稿/已驳回/已停用 | 自己的草稿/已驳回/已停用 | 不可 |
| 提交审核 | 可（自己的草稿） | 可（自己的草稿） | 不可 |
| 撤回 | 可（自己的待审核） | 可（自己的待审核） | 不可 |
| 查看驳回原因 | 可 | 可（自己的已驳回） | 不可 |
| 审批（通过/驳回） | 可（所有待审核） | 不可 | 不可 |
| 复制 | 可（已发布/停用） | 可（已发布公开或自己的） | 可（已发布公开） |
| 停用 | 可（已发布） | 仅自己的已发布 | 不可 |
| 重新启用 | 可（已发布-停用） | 仅自己的已发布-停用 | 不可 |
| 复制 | 可 | 可（已发布公开模板） | 可（已发布公开模板） |
| 预览 | 全部 | 全部可见 | 仅已发布 |
| 停用 | 可（已发布） | 仅自己的已发布 | 不可 |
| 重新启用 | 可（已发布-停用） | 仅自己的已发布-停用 | 不可 |
| 复制 | 可 | 可（已发布公开模板） | 可（已发布公开模板） |
| 预览 | 全部 | 全部可见 | 仅已发布 |

---

## 6. 详细方案

### 6.1 F2：模板状态与流转

#### 6.1.1 状态定义

| 状态 | 含义 | 可编辑 | 可删除 |
|------|------|--------|--------|
| 草稿 | 新建模板的初始状态，或从已驳回状态编辑保存后 | 是 | 是 |
| 待审核 | 已提交审核，等待管理员审批 | 否 | 否 |
| 已驳回 | 管理员审核驳回，需修改后重新提交 | 是（编辑后变为草稿） | 是 |
| 已发布 | 审批通过，已生效，对外可用 | 否（内容锁定） | 否 |
| 已发布(停用) | 已发布但暂停使用 | 否 | 是 |

> **关键**：
> - 已发布模板内容锁定，不可直接编辑。更新内容需通过"复制"生成新模板。
> - 已驳回模板可编辑和删除。编辑保存后状态变为「草稿」，可重新提交审核。
> - 已停用模板可删除。停用后不再被规则使用，可安全清理。

#### 6.1.2 状态流转图

```
                    ┌─────────────────────────────────────────┐
                    │                                         │
                    ↓                                         │
新建 ──→ 草稿 ──→ 提交审核 ──→ 待审核 ──→ 审核通过 ──→ 已发布
  ↑       ↑  ↑        │           │                    │
  │       │  │        │           │                    │
  │       │  │        │           ↓                    │
  │       │  │        │      审核驳回                   │
  │       │  │        │           │                    │
  │       │  │        │           ↓                    │
  │       │  │        │       已驳回 ──→ 编辑保存 ──→ 草稿
  │       │  │        │           │                    │
  │       │  └────────┼─── 撤回 ──→ 草稿               │
  │       │           │                                │
  │       │           复制 ──→ 草稿（新模板）              │
  │       │                                            │
  │       └────────────── 删除 ←── 已驳回               │
  │                                                    │
  └──────────────────── 停用 ←─────────────────────────┘
                                        (已发布可停用/重新启用)
```

#### 6.1.3 状态转换规则

| 当前状态 | 触发操作 | 目标状态 | 说明 |
|----------|----------|----------|------|
| — | 新建模板 | 草稿 | 初始创建 |
| 草稿 | 提交审核 | 待审核 | 校验：名称、内容、关联规则不能为空，变量验证通过。提交时选择可见性和勾选合规承诺 |
| 待审核 | 审核通过 | 已发布 | 模板生效，内容锁定 |
| 待审核 | 审核驳回 | 已驳回 | 需填写驳回原因，创建人可查看 |
| 待审核 | 撤回 | 草稿 | 提交人在管理员审核前主动撤回 |
| 已驳回 | 编辑保存 | 草稿 | 修改内容后保存，状态回到草稿 |
| 已驳回 | 删除 | — | 创建人或管理员可删除 |
| 已发布 | 停用 | 已发布(停用) | 模板暂停使用，规则配置下拉中不可选 |
| 已发布(停用) | 重新启用 | 已发布 | 无需重新审核 |
| 已发布(停用) | 删除 | — | 创建人或管理员可删除 |
| 已发布/停用 | 复制 | 草稿（新模板） | 克隆内容到新模板，独立编号，独立审批 |

#### 6.1.4 复制模板的流程

```
已发布模板（TPL001，正在生效）
    │
    ↓ 点击"复制"
系统克隆模板内容，生成新模板（TPL006，草稿状态）
    │
    ↓
用户在新模板上编辑（原TPL001继续生效，业务无感知）
    │
    ↓ 编辑完成，点击"提交审核"
新模板 → 待审核
    │
    ↓ 管理员审核通过
新模板 → 已发布（TPL006独立生效）
原TPL001 → 保持已发布状态（如需停用请手动操作）
```

> **关键**：复制 = 克隆内容到全新模板。新旧模板完全独立，无版本关联关系。旧模板不受影响。

---

### 6.2 F3：审批流程

#### 6.2.1 提交审核

用户（管理员或普通用户）编辑完模板后，点击"提交审核"。

**提交流程**：

1. **先校验**（在编辑弹窗中）：
   - 模板名称不能为空
   - 必须关联至少一条规则
   - 模板内容不能为空
   - 变量验证必须通过

2. **校验通过后弹出确认弹窗**：
   - 选择可见性：公开（默认）/ 私有
   - 勾选内容合规承诺："我确认模板内容不含反动、粗俗、淫秽等违规用语"（必勾选）

3. **确认提交后**：
   - 模板状态变为"待审核"
   - 可见性设置生效
   - 记录提交人、提交时间

> **设计说明**：可见性和合规承诺在提交确认时选择，而非编辑阶段。编辑弹窗专注于内容本身（名称、规则、变量、内容），降低保存草稿的门槛。两个提交入口（编辑弹窗内、列表直接提交）都走确认弹窗。

#### 6.2.2 管理员审批

管理员在模板列表中可筛选"待审核"状态的模板，逐条审批：

**审批重点检查**：
- 模板内容是否完整、变量使用是否正确
- 模板内容是否包含反动、粗俗、淫秽等违规用语（内容合规性审查）
- 模板关联的规则是否正确

**审批操作**：
- **审核通过**：模板状态变为"已发布"，模板立即生效，内容锁定
- **审核驳回**：需填写驳回原因（必填），模板状态变为"已驳回"

**驳回原因快捷选项**：
- 内容包含违规用语
- 模板内容不完整
- 变量使用有误
- 其他（需手动填写）

#### 6.2.3 驳回后处理

管理员驳回模板后，模板状态变为「已驳回」：

- **查看驳回原因**：创建人在列表中可查看驳回原因（红色「已驳回」标签 + 「查看驳回原因」操作）
- **编辑修改**：点击「编辑」后可修改模板内容，编辑弹窗顶部显示驳回原因提示条
- **保存后回到草稿**：编辑保存后，模板状态自动从「已驳回」变为「草稿」，驳回原因清空
- **重新提交**：回到草稿后可正常提交审核
- **删除**：已驳回模板可直接删除

#### 6.2.4 审批权限

| 操作 | 管理员 | 普通用户（创建人） | 普通用户（非创建人） |
|------|--------|-------------------|---------------------|
| 提交审核 | 可（自己的草稿） | 可（自己的草稿） | 不可 |
| 审核通过 | 可（所有待审核） | 不可 | 不可 |
| 审核驳回 | 可（所有待审核） | 不可 | 不可 |
| 查看审批历史 | 可（所有模板） | 可（自己的模板） | 不可 |

---

### 6.3 F4：审批历史

#### 6.3.1 审批记录

每次审批操作（通过或驳回）都记录一条审批历史：

| 字段 | 说明 |
|------|------|
| 模板ID | 关联的模板 |
| 可见性 | 公开/私有（提交时选择） |
| 操作类型 | 审核通过 / 审核驳回 |
| 审批人 | 执行审批的管理员 |
| 审批时间 | 审批操作的时间 |
| 审批意见 | 审批时填写的意见 |
| 提交人 | 本次提交审核的人 |
| 提交时间 | 本次提交审核的时间 |

---

### 6.4 F6：模板停用校验

#### 6.4.1 校验时机

创建人或管理员点击已发布模板的"停用"按钮时，系统校验该模板是否正被场景中的规则使用。

#### 6.4.2 校验结果处理

| 场景 | 处理方式 |
|------|----------|
| 模板未被任何场景使用 | 直接停用，无提示 |
| 模板正被N个场景使用 | 弹窗提示："该模板正被{N}个场景使用，停用后这些场景中的对应规则将无法发送Elink消息。确认停用？" 用户确认后停用 |

#### 6.4.3 停用后影响

- 停用的模板从规则配置的模板下拉中移除
- 已关联该模板的规则，下次派发时无法发送Elink消息（需由规则管理员更换模板）
- 已发送的历史消息不受影响

---

### 6.5 F7：复制模板

#### 6.5.1 入口

已发布或已停用模板的操作菜单中，提供"复制"按钮。所有用户可复制已发布且公开的模板，创建人和管理员可复制自己的已发布/停用模板。

#### 6.5.2 复制逻辑

1. 克隆原模板的名称、关联规则、模板内容（不含可见性）
2. 生成新模板编号（如 TPL006）
3. 新模板状态为"草稿"
4. 新模板与原模板完全独立，无关联关系

#### 6.5.3 弹窗提示

弹窗标题："新增消息模板（复制自：TPL001）"

---

### 6.6 F8：变量验证

#### 6.6.1 验证时机

用户在编辑弹窗中点击"立即验证"按钮，或提交审核时自动校验。

#### 6.6.2 验证逻辑

1. 提取模板内容中所有 `{variableName}` 格式的变量
2. 根据关联规则，获取系统支持的变量列表
3. 检查模板中的变量是否都在支持列表中
4. 验证通过 → 可提交审核；验证失败 → 显示不匹配的变量列表

#### 6.6.3 提交审核强制校验

提交审核时，如果变量验证未通过，拦截提交并提示："请先通过变量验证再提交审核"。

---

### 6.7 F9：存量数据处理

#### 6.7.1 回填规则

功能上线时执行一次性处理：

1. 所有已启用的模板 → 状态标记为"已发布"
2. 所有停用的模板 → 状态标记为"已发布(停用)"
3. 所有草稿状态的模板 → 保持"草稿"状态

---

### 6.8 F10：页面改动

#### 6.8.1 模板列表页

**页面顶部**：
- 新增"新增模板"按钮（所有用户可见）

**新增列**：

| 列名 | 宽度 | 说明 |
|------|------|------|
| 审批状态 | 100px | 草稿/待审核/已发布/已发布(停用) |
| 可见性 | 80px | 公开/私有（已发布模板显示） |
| 创建人 | 100px | 模板创建人姓名 |
| 最近审批人 | 100px | 最近一次审批的管理员姓名 |
| 最近审批时间 | 160px | 最近一次审批的时间 |

**Tab切换**：
- 管理员：「全部模板」「我创建的」「待审核 N」（红色数字角标）
- 普通用户：「全部模板」「我创建的」

**操作列按钮规则**：

操作按钮根据 **TAB × 模板状态 × 用户角色** 三个维度决定显示哪些。

**管理员视图：**

| TAB | 模板状态 | 操作按钮 |
|-----|---------|---------|
| 全部模板 | 草稿 | 提交审核、编辑、删除 |
| 全部模板 | 已驳回 | 查看驳回原因、编辑、删除 |
| 全部模板 | 待审核 | 审批、预览 |
| 全部模板 | 已发布 | 复制、停用、预览 |
| 全部模板 | 已发布(停用) | 复制、启用、删除、预览 |
| 我创建的 | 草稿 | 提交审核、编辑、删除 |
| 我创建的 | 已驳回 | 查看驳回原因、编辑、删除 |
| 我创建的 | 待审核 | 撤回、预览 |
| 我创建的 | 已发布 | 复制、停用、预览 |
| 我创建的 | 已发布(停用) | 复制、启用、删除、预览 |
| 待审核 | 待审核（所有） | 审批、预览 |

**普通用户视图：**

| TAB | 模板状态 | 操作按钮 |
|-----|---------|---------|
| 全部模板 | 自己的草稿 | 提交审核、编辑、删除 |
| 全部模板 | 自己的已驳回 | 查看驳回原因、编辑、删除 |
| 全部模板 | 自己的待审核 | 撤回、预览 |
| 全部模板 | 自己的已发布 | 复制、停用、预览 |
| 全部模板 | 自己的已停用 | 复制、启用、删除、预览 |
| 全部模板 | 别人的已发布(公开) | 复制、预览 |
| 我创建的 | 同上"自己的"部分 | — |

> **关键规则**：
> - 「撤回」只在「全部模板」和「我创建的」Tab中显示，「待审核」Tab不显示
> - 「审批」只在「全部模板」和「待审核」Tab中显示，「我创建的」Tab不显示
> - 已发布模板不可编辑，只能通过"复制"生成新模板

---

## 7. 数据库设计

### 7.1 模板表新增字段

| 字段名 | 类型 | 说明 |
|--------|------|------|
| `AUDIT_STATUS` | VARCHAR(20) | 审批状态：DRAFT/PENDING/PUBLISHED/DISABLED |
| `VISIBILITY` | VARCHAR(10) | 可见性：PUBLIC/PRIVATE |
| `SUBMITTER_ID` | VARCHAR(32) | 最近一次提交审核的用户ID |
| `SUBMIT_TIME` | DATETIME | 最近一次提交审核的时间 |
| `APPROVER_ID` | VARCHAR(32) | 最近一次审批的管理员ID |
| `APPROVE_TIME` | DATETIME | 最近一次审批的时间 |

### 7.2 存量数据回填SQL

```sql
-- 已启用模板标记为"已发布"
UPDATE MSG_TEMPLATE
SET AUDIT_STATUS = 'PUBLISHED'
WHERE STATUS = 'ENABLED';

-- 停用模板标记为"已发布(停用)"
UPDATE MSG_TEMPLATE
SET AUDIT_STATUS = 'DISABLED'
WHERE STATUS = 'DISABLED';
```

---

## 8. 非功能需求

### 8.1 性能要求

- 模板列表页加载时间 < 2秒
- 审批操作响应时间 < 1秒

### 8.2 兼容性要求

- 支持 Chrome、Firefox、Edge 最新版
- 支持 1366×768 及以上分辨率

---

## 9. 附录

### 9.1 术语表

| 术语 | 含义 |
|------|------|
| 模板 | Elink消息模板，定义消息的格式和内容 |
| 变量 | 模板中用 `{variableName}` 格式表示的动态内容 |
| 已发布 | 模板审批通过并生效的状态 |
| 复制模板 | 基于已发布模板内容复制为新模板的操作 |
| 可见性 | 控制模板对哪些用户可见的属性 |
