     1|# 子系统 03 — 额度与频控 (`quota`) v1.0
     2|
     3|## 子系统概述
     4|
     5|| 维度 | 说明 |
     6|| --- | --- |
     7|| 代号 | `quota` |
     8|| 核心职责 | 额度台账（测评4/免评4/累计12）、额度预占与释放、频控规则引擎、发送前终校 |
     9|| 数据所有权 | `person_quota_ledgers`, `quota_reservations`, `frequency_control_records` |
    10|| 启动依赖 | identity（软依赖，额度按真实人计算，未归并时按单一账号） |
    11|| 外部系统依赖 | 无直接外部依赖 |
    12|
    13|---
    14|
    15|## 1. 模块划分
    16|
    17|```
    18|┌─────────────────────────────────────────────────────────────┐
    19|│                      quota 子系统                            │
    20|│                                                             │
    21|│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
    22|│  │ M1: 额度台账 │  │ M2: 预占管理 │  │ M3: 频控引擎 │       │
    23|│  │  (Ledger)    │→│ (Reservation)│  │  (FreqCtrl)  │       │
    24|│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘       │
    25|│         │                 │                 │                │
    26|│         ▼                 ▼                 ▼                │
    27|│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
    28|│  │ M4: 终校服务 │  │ M5: 额度管理 │  │ M6: 对外 API │       │
    29|│  │  (FinalCheck)│  │    Admin     │  │    Gateway   │       │
    30|│  └──────────────┘  └──────────────┘  └──────────────┘       │
    31|│                                                             │
    32|└─────────────────────────────────────────────────────────────┘
    33|```
    34|
    35|| # | 模块 | 代号 | 职责 |
    36|| --- | --- | --- | --- |
    37|| M1 | 额度台账 | `quota-ledger` | 维护真实人三层额度（测评4/免评4/累计12）、已用/进行中/已预占计数 |
    38|| M2 | 预占管理 | `reservation-mgr` | 额度预占创建、确认占用、超时释放；跨计划重复入选检测 |
    39|| M3 | 频控引擎 | `freq-control` | 渠道频控（IM/EDM/APP/TEL 最近触达间隔）、单 ASIN 短期触达次数、退订/投诉屏蔽 |
    40|| M4 | 终校服务 | `final-check` | 发送前合并校验（最新额度 + 最新风险 + 最新未关闭工单），准入/撤出决策 |
    41|| M5 | 额度管理 Admin | `quota-admin` | 额度手动调整、额度重置、额度审计 |
    42|| M6 | 对外 API Gateway | `quota-api` | 供 planning（人群生成）、outreach（发送前校验）、review（提交后确认）调用 |
    43|
    44|---
    45|
    46|## 2. 各模块内外说明
    47|
    48|### 2.1 M1: 额度台账
    49|
    50|| 维度 | 说明 |
    51|| --- | --- |
    52|| **对内** | 按真实人维护三种额度：月度测评（已完成+进行中+已预占）、月度免评（同上）、累计真实提交评价（永久累计）；额度计数时点明确（提交评价立即计数12、不会因 Amazon 未展示回退）；接近上限时预警 |
    53|| **对外接口** | `GET /api/quota/ledger/{person_id}` — 读取当前台账 |
    54|| **数据写入** | `person_quota_ledgers` |
    55|| **依赖** | `GET /api/identity/person` — 获取真实人 ID |
    56|
    57|### 2.2 M2: 预占管理
    58|
    59|| 维度 | 说明 |
    60|| --- | --- |
    61|| **对内** | 人群生成时预占额度（测评/免评）；计算：已用+进行中+已预占+本次拟发送 > 上限 → 拦截；剩余不足但>0 → 预警池 → 发送前人工复核；预占有效期管理，超时自动释放；并发占用控制（同一真实人跨计划重复入选检测） |
    62|| **对外接口** | `POST /api/quota/reserve` — 创建预占；`POST /api/quota/commit` — 确认占用；`POST /api/quota/release` — 释放预占 |
    63|| **数据写入** | `quota_reservations` |
    64|
    65|### 2.3 M3: 频控引擎
    66|
    67|| 维度 | 说明 |
    68|| --- | --- |
    69|| **对内** | 四种频控维度：①渠道频控（IM/EDM/APP/TEL 最近触达间隔）②单 ASIN 短期内触达同一用户次数 ③用户反感度（投诉/退订状态）④用户在客服工单中暂不触达；频控规则可配置 |
    70|| **对外接口** | `GET /api/quota/freq-check/{person_id}?channel=IM&asin=xxx` — 频控检查 |
    71|| **数据写入** | `frequency_control_records` |
    72|| **依赖** | 触达历史来自 outreach（`GET /api/outreach/history/{person_id}`） |
    73|
    74|### 2.4 M4: 终校服务
    75|
    76|| 维度 | 说明 |
    77|| --- | --- |
    78|| **对内** | 发送前做最终校验：①重新读取最新额度（防止发送和预占之间额度变化）②重新读取最新风险状态 ③重新读取最新未关闭工单；三者全部通过→准入发送；任一新增超限/风险/工单→撤出本批次 |
    79|| **对外接口** | `POST /api/quota/final-check` — 批量终校（输入 person_ids + plan_id，返回每个的准入/撤出决策） |
    80|| **数据写入** | 终校结果写入审计日志 |
    81|| **依赖** | `GET /api/risk/check/{person_id}`；`GET /api/tickets?person_id=&status=open` |
    82|
    83|### 2.5 M5: 额度管理 Admin
    84|
    85|| 维度 | 说明 |
    86|| --- | --- |
    87|| **对内** | 额度手动调整（运营确认某次测评不计入额度等）；额度重置（新月份额度初始化）；额度审计（谁改了什么额度） |
    88|| **对外接口** | 管理 API |
    89|
    90|### 2.6 M6: 对外 API Gateway
    91|
    92|| 维度 | 说明 |
    93|| --- | --- |
    94|| **对外接口** | `GET /api/quota/check/{person_id}?type=测评` — 额度查询+可用判断；`POST /api/quota/reserve` — 预占；`POST /api/quota/commit` — 确认；`POST /api/quota/release` — 释放；`POST /api/quota/final-check` — 终校 |
    95|
    96|---
    97|
    98|## 3. 对外 API 契约（草案）
    99|
   100|| 接口 | 方法 | 输入 | 输出 | 消费者 |
   101|| --- | --- | --- | --- | --- |
   102|| 额度查询 | `GET /api/quota/check/{person_id}?type=REVIEW` | person_id + 额度类型 | `{used, in_progress, reserved, remaining, status(sufficient/warning/exceeded)}` | planning, outreach |
   103|| 批量预占 | `POST /api/quota/reserve` | `[{person_id, type, plan_id, count}]` | `[{person_id, success, reservation_id}]` | planning（人群生成时） |
   104|| 确认占用 | `POST /api/quota/commit` | `[{reservation_id}]` | `[{reservation_id, committed}]` | review（用户提交评价后） |
   105|| 释放预占 | `POST /api/quota/release` | `[{reservation_id}]` | `[{success}]` | planning（计划取消时） |
   106|| 频控检查 | `GET /api/quota/freq-check/{person_id}?channel=&asin=` | person_id + 渠道 + ASIN | `{allowed, reason, cooldown_until}` | outreach（发送前） |
   107|| 发送前终校 | `POST /api/quota/final-check` | `[{person_id, plan_id}]` | `[{person_id, decision: APPROVED/WITHDRAWN, reasons}]` | outreach（发送前最后一步） |
   108|
   109|---
   110|
   111|## 4. 数据对象
   112|
   113|| 对象 | 核心字段 | 说明 |
   114|| --- | --- | --- |
   115|| `person_quota_ledgers` | ledger_id, person_id, quota_type (MONTHLY_REVIEW/MONTHLY_EXEMPTION/LIFETIME_SUBMISSION), period, used, in_progress, reserved, limit_value, status | 三层额度台账 |
   116|| `quota_reservations` | reservation_id, person_id, ledger_id, plan_id, count, status (RESERVED/COMMITTED/RELEASED/EXPIRED), reserved_at, expires_at | 额度预占记录 |
   117|| `frequency_control_records` | freq_id, person_id, channel, asin, last_contact_at, contact_count_period, status | 频控记录 |
   118|
   119|---
   120|
   121|## 5. 业务澄清问题清单 — quota
   122|
   123|### 5.1 额度规则细化（5 项）
   124|
   125|| # | 问题 | 优先级 |
   126|| --- | --- | --- |
   127|| Q-01 | 月度额度按自然月还是 30 天滚动？如果是自然月：①预占在 1 月 31 日，2 月 1 日释放还是保留？②1 月 31 日晚 23:59 的预占跨月怎么处理？ | **P0** |
   128|| Q-02 | 「测评 4 次」中的「次」定义：是指参与 4 个不同的测评计划，还是提交 4 条评价？（如果 1 个计划要求用户提交 3 条评价，占 3 次还是 1 次？） | **P0** |
   129|| Q-03 | 「累计 12 个真实提交评价」是永久上限还是可以动态调整？（例如用户长期优质且评价质量高，是否可以人工放宽？放宽流程？） | P1 |
   130|| Q-04 | 测评和免评额度是否独立？（测评 4 次 + 免评 4 次 = 同一真实人一月最多参与 8 个计划？）还是测评和免评共享总额度？ | P1 |
   131|| Q-05 | 额度计算中「进行中」的定义——什么状态才算进行中？（已生成人群？已发送触达？用户已回应？已提交评价待核验？） | P1 |
   132|
   133|### 5.2 预占机制（4 项）
   134|
   135|| # | 问题 | 优先级 |
   136|| --- | --- | --- |
   137|| Q-06 | 预占有效期多长？（预占后用户始终未响应，多久释放？1 天？7 天？计划周期结束？） | **P0** |
   138|| Q-07 | 预占释放后是否可以自动重新分配给同一计划的其他用户？是否触发重新生成人群？ | P1 |
   139|| Q-08 | 跨计划并发占用检测——同一真实人在计划 A 和计划 B 同时被入选，谁先预占谁得？还是按计划优先级？ | P1 |
   140|| Q-09 | 预占是否可手动取消/释放？（运营发现某用户不应计入某计划时） | P2 |
   141|
   142|### 5.3 频控规则（4 项）
   143|
   144|| # | 问题 | 优先级 |
   145|| --- | --- | --- |
   146|| Q-10 | 各渠道频控的具体阈值是什么？（IM 每日最多 X 次？EDM 每周最多 Y 封？APP Push 每日最多 Z 条？TEL 每日最多 N 通？） | **P0** |
   147|| Q-11 | 频控规则是否区分计划类型？（紧急催评是否可以突破频控？） | P1 |
   148|| Q-12 | 频控是全局统一配置还是按用户层级可调整？（A 类和 C 类用户频控规则是否不同？） | P1 |
   149|| Q-13 | 「单 ASIN 短期触达次数」——多少天内触达多少次算超标？ | P2 |
   150|
   151|### 5.4 预警与异常（3 项）
   152|
   153|| # | 问题 | 优先级 |
   154|| --- | --- | --- |
   155|| Q-14 | 预警阈值如何设定？（剩余 1 次时预警？剩余 N% 时预警？不同类型额度预警阈值是否不同？） | P1 |
   156|| Q-15 | 终校中「新增风险」的判断——距离上次风险检查超过多少时间需重查？还是每次终校都实时查 risk？ | P1 |
   157|| Q-16 | 额度数据异常时的处理策略？（台账数据与预占记录不一致、预占未释放导致额度泄漏——系统如何自动发现和修复？） | P2 |
   158|
### 5.5 额度异常与纠错（4 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| Q-17 | 用户反馈「我明明只参与了 3 次测评，系统说我已用 4 次」——申诉流程？谁有权限查台账和修正？ | P1 |
| Q-18 | 额度台账的审计追踪——每次额度变更（预占/确认/释放/手动调整）是否记录完整操作人和原因？保留多久？ | P1 |
| Q-19 | 数据异常自动检测——台账数据与预占记录之和是否需要对账？系统是否定期自动化对账并报告差异？ | P1 |
| Q-20 | 如果发现「额度泄漏」（预占未释放导致额度永久被占），系统如何自动发现和修复？（定时扫描过期预占？手动触发对账？） | P2 |

### 5.6 紧急/例外处理（4 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| Q-21 | 大促期间（Prime Day/Black Friday）是否需要临时额度提升？（测评 4→8？）由谁审批？临时额度有效期？ | P1 |
| Q-22 | 高价值用户是否可以突破额度限制？（例如 KOC 级别的用户需要超额参与——人工审批流程？） | P1 |
| Q-23 | 「紧急计划」是否可以跳过频控？（例如 Listing 评分暴跌至 3.8 需要紧急大量催评——是否豁免部分频控规则？） | P1 |
| Q-24 | 额度手动调整是否需要审批？审批权限？（谁可以手动给某人加/减可用额度？） | P2 |

### 5.7 跨站点/跨平台额度（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| Q-25 | 额度是否跨 Amazon 站点？（.com 参与了 2 次测评 + .co.uk 参与了 3 次 → 全局算 5 次还是各自独立？） | P1 |
| Q-26 | 累计 12 个评价是否跨站点统计？（在 .com 提交了 8 个 + .co.uk 提交了 5 个 → 是否算 13 个超限？） | P1 |
| Q-27 | 未来扩展到非 Amazon 平台，额度体系是否独立？（eBay 的测评额度与 Amazon 的额度是否共享？） | P2 |

### 5.8 额度可见性（2 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| Q-28 | 用户是否能看到自己的额度状态？（APP 端显示「本月还可参与 2 次测评」——是否对用户可见？） | P2 |
| Q-29 | 运营视角的额度看板——能否看到「全局额度使用率」「各真实人的额度分布」「额度预警用户列表」？ | P1 |

### 5.9 实施层面（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| Q-30 | 终校服务的性能要求——批量终校（一次可能几百人）需要在多少 ms 内完成？（涉及跨子系统调用 risk + support） | P2 |
| Q-31 | 频控规则是否需要热更新（不重启服务即可调整阈值）？配置管理方案？ | P1 |
| Q-32 | 额度台账历史数据的初始化——旧系统的数据如何映射到三层额度模型？（无「真实人」概念的老数据如何归入？） | P1 |
