# data-ana 对接契约

> 负责人：ai11
> 关联：[matrix.md](./matrix.md)、[analytics.proto](../../../packages/shared-proto/proto/analytics.proto)、[events.proto](../../../packages/shared-proto/proto/events.proto)

---

## §1 我提供什么（对外接口）

### 1.1 gRPC 接口（如有）

| Service          | RPC                    | 请求                          | 响应                      | 端口  |
| ---------------- | ---------------------- | ----------------------------- | ------------------------- | ----- |
| AnalyticsService | GetClassPerformance    | GetClassPerformanceRequest    | ClassPerformance          | 50055 |
| AnalyticsService | GetStudentWeakness     | GetStudentWeaknessRequest     | StudentWeakness           | 50055 |
| AnalyticsService | GetLearningTrend       | GetLearningTrendRequest       | LearningTrend             | 50055 |
| AnalyticsService | GetTeacherDashboard    | GetTeacherDashboardRequest    | TeacherDashboard          | 50055 |
| AnalyticsService | GetStudentDashboard    | GetStudentDashboardRequest    | StudentDashboard          | 50055 |
| AnalyticsService | GetParentDashboard     | GetParentDashboardRequest     | ParentDashboard           | 50055 |
| AnalyticsService | GetAdminDashboard      | GetAdminDashboardRequest      | AdminDashboard            | 50055 |
| AnalyticsService | GetWarningList         | GetWarningListRequest         | WarningListResponse       | 50055 |
| AnalyticsService | TriggerWarning         | TriggerWarningRequest         | TriggerWarningResponse    | 50055 |
| AnalyticsService | GetMasteryDistribution | GetMasteryDistributionRequest | MasteryDistribution       | 50055 |
| AnalyticsService | GetStudentMastery      | GetStudentMasteryRequest      | StudentMastery            | 50055 |
| AnalyticsService | SubscribeMasteryUpdate | SubscribeMasteryUpdateRequest | stream MasteryUpdateEvent | 50055 |

### 1.2 HTTP 端点（如有）

无对外 HTTP 端点，仅 gRPC（含 1 个 Server Streaming RPC）。

### 1.3 GraphQL schema（如 BFF）

不适用。

### 1.4 Kafka 事件发布（如有）

| Topic                       | Event                                                     | 消费方         |
| --------------------------- | --------------------------------------------------------- | -------------- |
| edu.data_ana.mastery.events | MasteryEvent（action: mastery.updated/warning.triggered） | core-edu / msg |

> 注：MasteryEvent 豁免 Outbox 模式（派生数据事件，见 004 §12.2 + §15.3 #6）。

### 1.5 错误码前缀

`DATA_ANA_`（如 DATA_ANA_DASHBOARD_UNAVAILABLE、DATA_ANA_MASTERY_NOT_COMPUTED）

---

## §2 我消费什么（依赖上游）

### 2.1 gRPC 调用（同步）

无主动 gRPC 调用上游。data-ana 通过 CDC + Kafka 事件接收数据，计算后发布 MasteryEvent。

### 2.2 Kafka 事件订阅（异步）

| Topic                              | Event               | 发布方          | mock 策略                                         |
| ---------------------------------- | ------------------- | --------------- | ------------------------------------------------- |
| edu.exam.events                    | ExamEvent           | core-edu (ai08) | core-edu 就绪前使用 CDC 模拟数据 + 本地 stub 事件 |
| edu.homework.events                | HomeworkEvent       | core-edu (ai08) | 同上                                              |
| edu.grade.events                   | GradeEvent          | core-edu (ai08) | 同上                                              |
| edu.class.events                   | ClassEvent          | core-edu (ai08) | 同上                                              |
| edu.content.knowledge_point.events | KnowledgePointEvent | content (ai09)  | content 就绪前使用内置知识点维度表                |
| edu.content.question.events        | QuestionEvent       | content (ai09)  | content 就绪前忽略                                |
| edu.ai.usage.events                | AIUsageEvent        | ai (ai12)       | ai 就绪前忽略，AI 用量统计为空                    |

### 2.3 HTTP 调用（如有）

无。

### 2.4 CDC 数据源（补充）

| 数据源                                                | 用途                            | mock 策略                                                                   |
| ----------------------------------------------------- | ------------------------------- | --------------------------------------------------------------------------- |
| core-edu MySQL（exams/homework/grades/attendance 表） | Debezium CDC → Kafka 同步读模型 | core-edu 就绪前使用 ClickHouse 内置模拟数据集（30 学生 × 5 考试 × 10 作业） |

---

## §3 就绪信号

### 3.1 我依赖的上游就绪标志

- [ ] core-edu gRPC 50053 启用（ai08）—— 业务事件 + CDC 数据源
- [ ] edu.exam.events / edu.homework.events / edu.grade.events / edu.class.events topic 有事件发布（ai08）
- [ ] content gRPC 50054 启用（ai09）—— 知识点维度
- [ ] edu.content.knowledge_point.events topic 有事件发布（ai09）
- [ ] ai gRPC 50057 启用（ai12）—— AI 用量统计（可选，仪表盘补全）

### 3.2 我的就绪标志（供下游消费）

- [ ] data-ana gRPC 50055 启用（HealthService.Check 返回 SERVING）
- [ ] AnalyticsService 12 RPC 可调用（含 4 端 Dashboard + Server Streaming SubscribeMasteryUpdate）
- [ ] GetTeacherDashboard / GetStudentDashboard / GetParentDashboard / GetAdminDashboard 返回结构化数据
- [ ] edu.data_ana.mastery.events topic 可发布（mastery.updated / warning.triggered）

---

## §4 Mock 策略

### 4.1 我提供的 mock

在 data-ana 真实服务就绪前，为下游（teacher-bff / student-bff / parent-bff / admin-portal / msg）提供以下 mock：

- **gRPC mock**：使用 grpc-mock 拦截 50055 端口
  - GetTeacherDashboard 返回固定仪表盘（total_classes=3, class_avg_score=82.5, top_students 5 个, pending_homework_count=8）
  - GetStudentDashboard 返回固定仪表盘（avg_score=85.0, class_rank=5, weak_points 3 个）
  - GetParentDashboard 返回固定仪表盘（child_avg_score=85.0, child_class_rank=5）
  - GetAdminDashboard 返回固定仪表盘（total_teachers=50, total_students=1200, school_avg_score=80.0）
  - GetWarningList 返回固定 5 条预警（severity: warning/critical）
  - GetMasteryDistribution 返回固定分布（mastered=20, progressing=7, weak=3）
  - SubscribeMasteryUpdate 返回固定流（每 5 秒推 1 个 MasteryUpdateEvent）
- **Kafka mock**：data-ana 就绪前不发布真实 MasteryEvent，msg 使用本地 stub 预警

### 4.2 我消费的 mock

在真实上游就绪前，data-ana 使用以下 mock：

- 业务数据：ClickHouse 内置模拟数据集（30 学生 × 5 考试 × 10 作业 × 30 天出勤），不依赖 core-edu CDC
- 知识点维度：内置固定知识点表（数学 50 个知识点），不依赖 content 事件
- AI 用量：AIUsageEvent 为空，仪表盘 AI 用量区块显示"暂无数据"
- CDC 通道：core-edu 就绪前 Debezium 不启动，使用 ClickHouse 批量导入模拟数据
