     1|# 子系统 09 — 审计与通知中心 (`audit`) v1.0
     2|
     3|## 子系统概述
     4|
     5|| 维度 | 说明 |
     6|| --- | --- |
     7|| 代号 | `audit` |
     8|| 核心职责 | 状态变更审计、敏感字段访问日志、多类型通知/告警 |
     9|| 数据所有权 | `interaction_audit_logs`, `notification_records`, `manual_review_tasks` |
    10|| 启动依赖 | 无硬依赖，完全独立 |
    11|| 外部系统依赖 | 通知可能通过 IM/EDM/APP Push 等通道（可复用 outreach 通道或独立） |
    12|
    13|---
    14|
    15|## 1. 模块划分
    16|
    17|```
    18|┌─────────────────────────────────────────────────────────────┐
    19|│                     audit 子系统                             │
    20|│                                                             │
    21|│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
    22|│  │ M1: 状态变更 │  │ M2: 敏感操作 │  │ M3: 通知分发 │       │
    23|│  │    审计      │  │    审计      │  │    引擎      │       │
    24|│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘       │
    25|│         │                 │                 │                │
    26|│         ▼                 ▼                 ▼                │
    27|│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐       │
    28|│  │ M4: 通知模板 │  │ M5: 人工复核 │  │ M6: 对外 API │       │
    29|│  │    管理      │  │    任务      │  │    Gateway   │       │
    30|│  └──────────────┘  └──────────────┘  └──────────────┘       │
    31|│                                                             │
    32|└─────────────────────────────────────────────────────────────┘
    33|```
    34|
    35|| # | 模块 | 职责 |
    36|| --- | --- | --- |
    37|| M1 | 状态变更审计 | 记录所有业务对象的状态流转（对象ID/旧状态/新状态/操作人/时间/原因） |
    38|| M2 | 敏感操作审计 | 敏感字段访问记录、数据导出记录、人工复核操作留痕 |
    39|| M3 | 通知分发引擎 | 按通知类型路由到不同通道（系统内通知/IM/EDM/APP Push）；通知优先级管理 |
    40|| M4 | 通知模板管理 | 各类通知的模板（额度预警/Listing 预警/超时提醒/审批通知/风险告警） |
    41|| M5 | 人工复核任务 | 管理需要人工复核的任务（弱关联风险/额度预警池/异常评价），供风险/运营人员消费 |
    42|| M6 | 对外 API Gateway | 接收所有子系统上报的审计事件和通知请求 |
    43|
    44|---
    45|
    46|## 2. 各模块内外说明
    47|
    48|### 2.1 M1: 状态变更审计
    49|
    50|| 维度 | 说明 |
    51|| --- | --- |
    52|| **对内** | 接收所有子系统的状态变更事件（fire-and-forget）；记录：对象类型（plan/ticket/risk_case/review…）、对象ID、旧状态、新状态、操作人、操作时间、操作原因；审计日志不可篡改（append-only）；支持按对象ID/操作人/时间范围检索 |
    53|| **对外接口** | `POST /api/audit/event` — 上报审计事件 |
    54|| **数据写入** | `interaction_audit_logs` |
    55|| **典型事件** | 计划状态变更（草稿→审批→执行→完成）、工单分配/关闭、风险事件确认/排除、额度手动调整、审批决策 |
    56|
    57|### 2.2 M2: 敏感操作审计
    58|
    59|| 维度 | 说明 |
    60|| --- | --- |
    61|| **对内** | 三类敏感操作：①敏感字段访问（用户上下文卡中的涉密字段→记录访问人/时间/字段/上下文）②数据导出操作（导出人/时间/范围/原因/是否含敏感字段）③人工复核操作（决策人/决策内容/决策依据/时间） |
    62|| **对外接口** | `POST /api/audit/sensitive-access` — 上报敏感访问 |
    63|| **数据写入** | `interaction_audit_logs`（带 sensitivity 标记） |
    64|
    65|### 2.3 M3: 通知分发引擎
    66|
    67|| 维度 | 说明 |
    68|| --- | --- |
    69|| **对内** | 接收通知请求→按通知类型路由：①系统内通知（Web 前端轮询/WebSocket）②IM 通知（通过 outreach）③EDM 通知 ④APP Push；优先级管理（紧急 Listing 预警 > 超时提醒 > 额度预警）；通知去重（同一用户同一类型短时间内不重复发） |
    70|| **对外接口** | `POST /api/notifications/send` — 发送通知 |
    71|| **依赖** | outreach（IM/EDM/APP Push 通道） |
    72|
    73|### 2.4 M4: 通知模板管理
    74|
    75|| 维度 | 说明 |
    76|| --- | --- |
    77|| **对内** | 通知类型与模板：①额度预警（「真实人 X 的测评额度仅剩 1 次」）②紧急 Listing 预警（「ASIN X 评分接近 4.2，建议紧急催评」）③客服超时提醒（「工单 #123 已超时 N 小时未回复」）④审批通知（「计划 X 等待您的审批」）⑤规则风控提醒（「ASIN X 频控过高」）⑥风险告警（「用户 X 命中强关联风险」） |
    78|| **对外接口** | 管理 API |
    79|| **数据写入** | `notification_records` |
    80|| **待确认** | 模板是否需要多语言（中文/英文/菲律宾语）？模板管理界面在 audit 内部还是独立？ |
    81|
    82|### 2.5 M5: 人工复核任务
    83|
    84|| 维度 | 说明 |
    85|| --- | --- |
    86|| **对内** | 统一管理需人工复核的任务：弱关联风险复核、额度预警池复核、异常评价复核、诈骗疑似复核；任务分配/认领/完成/超时 |
    87|| **对外接口** | `POST /api/audit/review-task` — 创建复核任务；`GET /api/audit/review-tasks?assignee=` — 查询待复核任务 |
    88|| **数据写入** | `manual_review_tasks` |
    89|
    90|---
    91|
    92|## 3. 对外 API 契约（草案）
    93|
    94|| 接口 | 方法 | 输入 | 输出 | 消费者 |
    95|| --- | --- | --- | --- | --- |
    96|| 上报审计事件 | `POST /api/audit/event` | `{object_type, object_id, old_status, new_status, operator, reason}` | `{event_id}` | 所有子系统（状态变更时调用） |
    97|| 上报敏感访问 | `POST /api/audit/sensitive-access` | `{operator, field, context, accessed_at}` | `{event_id}` | identity（上下文卡访问） |
    98|| 发送通知 | `POST /api/notifications/send` | `{recipient, type, template_id, params}` | `{notification_id}` | 所有子系统 |
    99|| 创建复核任务 | `POST /api/audit/review-task` | `{task_type, target_id, priority, description}` | `{task_id}` | risk, quota |
   100|
   101|---
   102|
   103|## 4. 数据对象
   104|
   105|| 对象 | 核心字段 | 说明 |
   106|| --- | --- | --- |
   107|| `interaction_audit_logs` | log_id, object_type, object_id, old_status, new_status, operator, operation, reason, sensitivity_level, logged_at | 审计日志（append-only） |
   108|| `notification_records` | notification_id, recipient, type, template_id, channel, sent_at, status(SENT/DELIVERED/READ/FAILED) | 通知记录 |
   109|| `manual_review_tasks` | task_id, task_type, target_id, status(PENDING/ASSIGNED/IN_REVIEW/RESOLVED/TIMEOUT), assignee, priority, created_at, resolved_at | 人工复核任务 |
   110|
   111|---
   112|
   113|## 5. 业务澄清问题清单 — audit
   114|
   115|### 5.1 审计范围与保留（4 项）
   116|
   117|| # | 问题 | 优先级 |
   118|| --- | --- | --- |
   119|| A-01 | 审计日志的保留策略？（保留多久？1 年？永久？到期后归档还是删除？） | **P0** |
   120|| A-02 | 审计日志的存储量预估？（日产生多少条？是否需要分库分表/冷热分离？） | P1 |
   121|| A-03 | 审计日志是否需要支持导出/报表？（合规审计时需要导出给外部审计？） | P1 |
   122|| A-04 | 「敏感字段」的定义范围？（订单号、收款信息、设备号——还有哪些？谁来确定完整清单？） | **P0** |
   123|
   124|### 5.2 通知策略（4 项）
   125|
   126|| # | 问题 | 优先级 |
   127|| --- | --- | --- |
   128|| A-05 | 通知发送通道的优先级？（紧急告警用什么通道？IM？系统内通知？邮件？） | P1 |
   129|| A-06 | 通知去重规则？（同一用户同一类型通知 N 分钟内不重复发？） | P1 |
   130|| A-07 | 通知是否需要用户偏好设置？（用户可以选择不接收某类通知？公告类通知是否强制发送？） | P2 |
   131|| A-08 | 通知模板是否需要多语言支持？（中文/英文/菲律宾语？）模板由谁来维护？ | P2 |
   132|
   133|### 5.3 人工复核任务（2 项）
   134|
   135|| # | 问题 | 优先级 |
   136|| --- | --- | --- |
   137|| A-09 | 人工复核任务的时效要求？（不同任务类型 SLA？弱关联风险 N 小时内复核？额度预警池 N 分钟内复核？） | P1 |
   138|| A-10 | 复核任务超时后的升级机制？（自动分配给上级？通知主管？） | P2 |
   139|
   140|### 5.4 与其他子系统的协作（2 项）
   141|
   142|| # | 问题 | 优先级 |
   143|| --- | --- | --- |
   144|| A-11 | 通知通道是否完全复用 outreach？（IM/EDM/APP Push）还是 audit 独立对接通知通道？（如果 outreach 不可用，audit 仍需要能发告警） | P1 |
   145|| A-12 | 审计事件是同步上报还是异步？（同步→影响业务链路性能 / 异步→可能丢失事件） | P1 |
   146|
### 5.5 合规与认证（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| A-13 | 系统是否需要通过合规认证？（SOC2 Type II / ISO 27001？）认证对审计日志的完整性、不可篡改性、保留期限有何具体要求？ | P1 |
| A-14 | 数据导出请求（DSR）——用户或监管机构要求导出所有个人数据时，系统如何响应？（需要哪些子系统的数据？导出格式？响应时限？） | P1 |
| A-15 | 审计日志是否需要对第三方审计开放？（外部审计师需要查看审计日志时——权限控制和数据脱敏？） | P2 |

### 5.6 日志保留与归档（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| A-16 | 审计日志的分级保留策略？（状态变更日志保留 X 年 / 敏感访问日志保留 Y 年 / 通知记录保留 Z 月？） | P1 |
| A-17 | 日志归档方案？（超过保留期的日志是删除还是归档到冷存储？归档后是否仍可检索？） | P2 |
| A-18 | 日志存储量预估？（日产生日志条数 × 保留天数 = 需要的存储空间——是否需要分库分表/分区？） | P2 |

### 5.7 敏感数据脱敏（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| A-19 | 审计日志中是否允许记录敏感字段的明文？（例如「谁在何时查看了用户 X 的收款信息」——收款信息是否脱敏存储？） | P1 |
| A-20 | 日志查询权限——谁可以查审计日志？（管理员？审计员？）是否需要限制只能查自己相关的日志？ | P1 |
| A-21 | 生产环境的日志是否可以包含 PII（个人可识别信息）？（邮箱/电话/地址——是否在写入日志时自动脱敏？） | P1 |

### 5.8 通知可靠性（3 项）

| # | 问题 | 优先级 |
| --- | --- | --- |
| A-22 | 通知的可靠性保证——紧急告警（如 Listing 评分暴跌）是否需要确保送达？（有送达确认机制吗？发送失败后重试？） | P1 |
| A-23 | 通知通道的优先级切换——IM 通知失败后是否自动切换到 EDM 或系统通知？ | P2 |
| A-24 | 通知的聚合/摘要——同一个用户短时间收到多条同类通知是否合并？（「您有 3 个待审批计划」而不是 3 条独立通知） | P2 |

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

| # | 问题 | 优先级 |
| --- | --- | --- |
| A-25 | 审计事件是同步写入还是异步写入？（同步→影响业务链路 RT / 异步→可能丢失事件——如何取舍？） | P1 |
| A-26 | 审计日志的查询性能——是否需要支持全文搜索？（按操作人/对象ID/时间范围检索是否需要在秒级返回？） | P2 |
| A-27 | 通知通道的可靠性——如果 audit 子系统本身宕机，其他子系统的通知请求是否丢失？（是否需要消息队列做缓冲？） | P1 |
| A-28 | audit 子系统是否需要独立的数据库？（与其他子系统共享数据库会在高峰期互相影响——是否独立部署数据库？） | P2 |
