Files
lislgosms/docs/phase-6-risk-review-plan.md
T

81 lines
6.0 KiB
Markdown

# 阶段 6:风控与审核实施计划
## 目标
发送前有规则、有原因、有闭环。阶段 6 聚焦短信任务进入发送链路前的风险评估与审核决策,不实现真实发送 worker。
## 实施范围
1. 风控规则配置。
- 建立租户级和平台级规则模型。
- 内置第一版默认阈值。
- 支持 `block``manual_review``allow` 动作。
2. 发送前风险评估。
- 单任务最大号码数。
- 重复号码比例。
- 非法号码比例。
- 黑名单命中比例。
- 非工作时间大批量营销发送。
- 短时间任务创建频控。
- 模板变量异常。
3. 风控命中记录。
- 记录规则编号、规则名称、阈值、实际值、处理动作、可读原因。
- 关联租户、应用、模板和短信任务。
4. 短信审核闭环。
- 风控直接拒绝时,任务进入 `rejected` 并返回拒绝原因。
- 风控要求人工审核时,任务进入 `pending_review` 并展示审核原因。
- 管理端可通过或拒绝审核,并记录审核原因。
## 目录结构建议
```text
api/src/risk-review/
risk-review.module.ts
risk-review.service.ts
client-risk-review.controller.ts
admin-risk-review.controller.ts
```
## API 边界
客户端:
- `POST /api/client/risk-review/tasks/evaluate`:创建短信发送预审任务并执行风控评估。
- `GET /api/client/risk-review/tasks`:查询短信任务与拒绝/审核原因。
管理端:
- `GET /api/admin/risk-review/rules`:查看风控规则。
- `POST /api/admin/risk-review/rules`:创建或调整风控规则。
- `GET /api/admin/risk-review/hits`:查看风控命中记录。
- `GET /api/admin/risk-review/tasks/pending`:查看待审核任务和审核原因。
- `POST /api/admin/risk-review/tasks/:id/approve`:审核通过。
- `POST /api/admin/risk-review/tasks/:id/reject`:审核拒绝。
## 验收标准
1. 命中风控规则时,必须记录规则编号、规则名称、阈值、实际值、处理动作。
2. 进入审核的任务必须展示审核原因。
3. 直接拒绝的任务必须向客户端返回可读原因。
4. `npm run verify:phase6` 通过。
## 2026-09-07 夜间累计发送量审核(替代营销单任务规则)
- 用户授权实现、提交、推送并发布测试与预生产。复用短信审核页面及其内容聚合、号码明细、通过/驳回/批量审核;不改版审核页面。旧规则编码保留兼容历史命中记录,名称改为“夜间累计发送量审核”,不再判断category、内容或任务名称。
- 所有企业应用默认开启,通用阈值5000,应用覆盖优先,停用覆盖回落通用。单位为每应用每夜业务短信数(一个业务消息×一个号码);CMPP、公开HTTP、客户端共用计数。同号码不同业务消息分别累计,长短信分片、重试、补发和重复消费不重复计数。超过阈值的消息待人工审核;其他规则直接拒绝和未进入发送阶段的消息不消耗额度。
- 夜间默认Asia/Shanghai 21:00至次日08:00,开始包含、结束不包含,跨午夜不清零。定时任务到期后执行。统一在发送Worker首次提交前拦截,覆盖CMPP批量快速入队和普通入口;HTTP/CMPP入口受理不等于已发送,异步消息状态为准。批量跨阈值按消息分流;失败/审核拒绝不归还夜间额度。
- PostgreSQL新增NightSendingWindow与NightSendingReservation,应用锁、消息幂等记录、累计量、审核关联与pending_review状态同事务提交。Redis仅沿用队列,不保存唯一风控计数;数据库失败不得放行。新窗口首次使用从已有首次Submit记录补齐本夜历史数,避免夜间发布或规则启用时额度重置;发布仍核对历史基线和执行计划。
- 审核按企业应用、相同原始内容及10秒窗口聚合(不混合不同内容),窗口关闭后沿用短信审核入口。计数维度不按内容拆分。已审核窗口不得再追加;审核批准仅释放该聚合任务绑定的消息,不豁免整晚;重复/相反审核须受控,续发失败可用同一决定重试。夜间结束仍不自动释放待审消息。
- 阈值修改不清空计数,不自动释放待审消息;时间配置在当前夜间结束后生效,界面说明延迟生效。批量任务已有部分正常发送时,保留部分发送进度并标记存在待审核,不覆盖整批消息状态。审核与入队失败不得吞错,续发使用消息ID幂等队列任务。
- 权限沿用管理员风控配置/短信审核入口;应用必须从真实消息与企业关联取得,不能信任客户端自报企业、时间或分类;应用覆盖必须验证对象存在。历史审核记录不重写、不自动重投。回退须先停发送Worker并保留新待审及计数事实,旧版本不能继续绕过新夜间门禁。
- 验收覆盖阈值边界、多入口/多实例并发、跨午夜、应用隔离、幂等、重启、配置覆盖/变更、历史初始化、相同内容聚合、审核范围与并发、定时任务和数据库失败;使用隔离PostgreSQL/Redis证明持久化,不发送真实短信。前后端全量测试、类型/构建/质量门禁、两环境真实API与三尺寸页面验收分别留证。
## 2026-09-10 引流资格门禁(待实施专项)
详细规则、源码差异、多目标通道交集、终态回执/费用、并发与迁移见[引流信息拦截与通道报备匹配方案](drainage-send-gating-plan-20260910.md)。这是新增硬性发送资格,审核通过不得豁免引流检查;沿用既有夜间风控等规则,旧“只识别不拦截”在新功能生效后被替代。当前仅完成设计。
## 2026-09-10 引流发送门禁实施
后续用户已授权实施、本地提交及测试部署。具体数据模型、最终分片复核、并发锁、CMPP回执恢复和非CMPP无推送行为见 drainage-send-gating-plan-20260910.md 第10节;取代此前本主题仅处于设计阶段的状态。旧批准配置不迁移;线上状态与未执行项以测试进度为准。