# 阶段 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与三尺寸页面验收分别留证。