Files
Edu/services/core-edu/docs/nextstep.md

377 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# core-edu 下一步工作与上下游依赖
> 模块core-edu教学核心服务HTTP 3004 + gRPC 50053
> 负责人ai08
> 更新日期2026-07-13v3P3.13 12 个 RPC 补全完成 + 本地 Docker 24/24 smoke test 通过)
> 关联:[core-edu_contract.md](../../../docs/architecture/issues/contracts/core-edu_contract.md)、[core-edu_workline.md](../../../docs/architecture/issues/worklines/core-edu_workline.md)
---
## 1. 模块当前状态
core-edu 是教学核心服务,承载 exams / homework / grades / attendance / scheduling / classes 六个域,提供 HTTP REST + gRPC 双入口。
### 1.1 已完成
| 能力 | 状态 | 说明 |
| ----------------------------------------- | ---- | ---------------------------------------------------------------------------------------------- |
| P2 服务骨架 + Outbox + REST CRUD | ✅ | exams/homework/grades 三域 REST + Outbox 事件发布 |
| P3.2 TOPIC_MAP 重命名 edu.teaching.* | ✅ | 12 个 topic + payload 含 schema_version/event_id/occurred_at/metadata |
| P3.3 考试/作业状态机 + 成绩幂等 | ✅ | scheme Agraded 统一、cancelled 终态、not_submitted 初始态) |
| P3.4 gRPC server 50053 + 5 Service 27 RPC | ✅ | ExamService(8) + HomeworkService(5) + GradeService(6) + ClassService(4) + AttendanceService(4) |
| P3.5 排课考勤数据模型 + AttendanceService | ✅ | schedule-conflict 冲突检测 + 幂等 |
| P3.6 成绩计算配置化 | ✅ | GradeCalculatorweighted_average / sum / customscope 优先级 class > subject > school |
| P3.7 Redis 分布式锁 | ✅ | homework submit 接入 acquireLock/releaseLock |
| P3.8 DataScope 下推 | ✅ | datascope-injector.tsauth.middleware 解析 x-user-data-scope 头 |
| P3.9 IAM 事件消费 | ✅ | iam-consumer 订阅 teacher.assigned / class.created幂等 |
| P3.11 classes 合并到 core-edu | ✅ | classes/ 目录已迁入ClassesModule 已接入 AppModule |
| P3.12 单元测试 | ✅ | 4 个测试文件共 78 个测试用例(状态机/GradeCalculator/ScheduleConflict |
| 三支柱可观测性 | ✅ | pino 结构化日志 + Prometheus /metrics + OpenTelemetry tracer |
| Docker 多阶段构建 | ✅ | node:22-alpineEXPOSE 3004 50053 |
| **P3.13 下游缺失 RPC 补全13 个)** | ✅ | **9 Service / 40 RPC 全部就绪** |
### 1.2 待完成
| 任务 | 优先级 | 阻塞条件 |
| ------------------------------------ | ------ | ----------------------------- |
| P3.1 database.ts 改为 getDb() 函数式 | P3 | 无技术债14 个文件需重构) |
| P3.10 Temporal 工作流试点 | P3 | Temporal server 部署infra |
| P4.1 消费 data-ana mastery 事件 | P4 | data-ana gRPC 50055 就绪 |
| P4.2 content gRPC 调用(知识点关联) | P4 | content gRPC 50054 就绪 |
| P5.1 msg 事件消费联调 | P5 | msg gRPC 50056 就绪 |
| P6.1 /readyz 硬化(+Temporal 探针) | P6 | Temporal 部署 |
### 1.3 本地 Docker 验证结果2026-07-13 v3 - P3.13 完成)
测试环境edu-core-edu-test 容器接入 `edu-full_default` 网络,直连 edu-mysql / edu-redis / edu-kafka
```
镜像edu/core-edu:test单阶段构建node:22-alpine + tsc
容器edu-core-edu-testDEV_MODE=true, HTTP 13004→3004 + gRPC 50053
```
| 验证项 | 状态 | 说明 |
| ------------------- | ---- | ------------------------------------------------------------- |
| Docker 镜像构建 | ✅ | node:22-alpine + shared-proto + tsconfig.base.json + tsc 编译 |
| 容器启动 | ✅ | HTTP + gRPC 双启动成功,日志 "HTTP + gRPC" |
| HTTP /healthz | ✅ | 200`{"status":"ok","service":"core-edu"}` |
| HTTP /readyz | ✅ | 200checks: db=ok, redis=ok, kafka=ok |
| gRPC 9 Service 可达 | ✅ | **24/24 RPC smoke test 全部通过** |
| proto 路径解析 | ✅ | /app/proto/core_edu.proto运行时复制 |
| Redis 连接 | ✅ | 分布式锁就绪 |
| Kafka 连接 | ✅ | Outbox publisher + IAM consumer 已订阅 |
| gRPC smoke test | ✅ | `services/core-edu/test/grpc-smoke.mjs` 24/24 PASS |
#### 1.3.1 P3.13 新增 13 RPC smoke test 结果
| Service | RPC | 结果 | 说明 |
| ------------------- | -------------------------- | ---- | ---------------------------------------- |
| ExamService | SaveExamDraft | ✅ | upsert 成功exam_id + student_id 唯一) |
| ExamService | RecordExamViolation | ✅ | 违规记录写入 |
| GradeService | GetReportCard | ✅ | 成绩聚合,按学科计算 A/B/C/D/F |
| ScheduleService | GetScheduleByStudent | ✅ | 通过 attendance 反查 class_ids |
| LeaveRequestService | ListLeaveRequestsByStudent | ✅ | 列表为空(无数据) |
| LeaveRequestService | CreateLeaveRequest | ✅ | 返回 UUIDd5eeefba-... |
| LeaveRequestService | CancelLeaveRequest | ✅ | 状态机 pending→cancelled |
| DashboardService | GetDashboard | ✅ | 教师仪表盘聚合 |
| DashboardService | GetClassPerformance | ✅ | 班级绩效NotFound 为正常业务错误) |
| AdminService | ListSchools | ✅ | stub 返回空数组(待 IAM 集成) |
| AdminService | ListGradeLevels | ✅ | stub 返回空数组 |
| AdminService | ListDepartments | ✅ | stub 返回空数组 |
| AdminService | ListAcademicYears | ✅ | stub 返回空数组 |
---
## 2. 上游依赖core-edu 依赖谁)
### 2.1 MySQL基础设施— P0
| 项 | 内容 |
| -------- | ------------------------------------------------------------------------------ |
| 依赖内容 | 全部业务数据持久化exams/homework/grades/attendance/schedule/classes/outbox |
| 端点 | `mysql://edu-mysql:3306/next_edu_cloud` |
| 当前状态 | ✅ 本地 Docker edu-mysql 已就绪 |
### 2.2 Redis基础设施— P0
| 项 | 内容 |
| -------- | --------------------------------------------------- |
| 依赖内容 | 分布式锁homework/exam submit 幂等)+ /readyz 探针 |
| 端点 | `redis://edu-redis:6379` |
| 当前状态 | ✅ 本地 Docker edu-redis 已就绪 |
| 降级策略 | Redis 不可用时锁操作降级为 DB 唯一索引兜底 |
### 2.3 Kafka基础设施— P1
| 项 | 内容 |
| -------- | ------------------------------------------------------- |
| 依赖内容 | Outbox 事件发布到 `edu.teaching.*` topic12 个 topic |
| 端点 | `kafka:29092` |
| 当前状态 | ✅ 本地 Docker edu-kafka 已就绪 |
| 降级策略 | Kafka 不可用时事件暂存 outbox 表,服务不阻塞 |
### 2.4 iam 服务ai06 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | -------------------------------------------- | --------------------------------- | ------------------ |
| 1 | gRPC `GetUserInfo(userId)` :50052 | 考勤录入时校验教师身份 | ⏳ 待 iam 就绪 |
| 2 | gRPC `GetChildrenByParent(parentId)` :50052 | 家长端查询孩子成绩/考勤 | ⏳ 待 iam 就绪 |
| 3 | Kafka `edu.iam.user.created/updated/deleted` | IAM 事件消费P3.9 已实现消费者) | ⏳ 待 iam 发布事件 |
| 4 | `GET /healthz` :3002 | /readyz 下游健康检查 | ⏳ |
**环境变量**`IAM_GRPC_TARGET=iam:50052`
### 2.5 Temporal server基础设施— P3
| 项 | 内容 |
| -------- | -------------------------------- |
| 依赖内容 | 考试发布编排工作流P3.10 试点) |
| 端点 | `temporal:7233` |
| 当前状态 | ⏳ 未部署 |
---
## 3. 下游依赖(谁依赖 core-edu
### 3.1 teacher-bffai03 负责)— P0
| # | gRPC RPC :50053 | 用途 | 状态 |
| --- | ----------------------------------------- | ---------------------------- | --------- |
| 1 | `ExamService.ListExamsByClass` | `exams` 查询:考试列表 | ✅ 已实现 |
| 2 | `ExamService.CreateExam` | `createExam` mutation | ✅ 已实现 |
| 3 | `ExamService.GetExam` | 考试详情 | ✅ 已实现 |
| 4 | `HomeworkService.ListHomeworkByClass` | `homework` 查询:作业列表 | ✅ 已实现 |
| 5 | `HomeworkService.AssignHomework` | `assignHomework` mutation | ✅ 已实现 |
| 6 | `HomeworkService.GetHomework` | 作业详情 | ✅ 已实现 |
| 7 | `GradeService.RecordGrade` | `recordGrade` mutation | ✅ 已实现 |
| 8 | `GradeService.ListGradesByStudent` | `grades` 查询:成绩列表 | ✅ 已实现 |
| 9 | `ClassService.GetClass` | `class` 查询:班级详情 | ✅ 已实现 |
| 10 | `ClassService.GetClassesByTeacher` | `classes` 查询:教师班级列表 | ✅ 已实现 |
| 11 | `ClassService.ListStudentsByClass` | 班级学生列表 | ✅ 已实现 |
| 12 | `AttendanceService.ListAttendanceByClass` | 考勤列表 | ✅ 已实现 |
**环境变量teacher-bff 侧)**`CORE_EDU_GRPC_TARGET=core-edu:50053`
### 3.2 student-bffai04 负责)— P0
| # | gRPC RPC :50053 | 用途 | 状态 |
| --- | ------------------------------------------- | ------------------------- | --------- |
| 1 | `ExamService.GetExam` | `examDetail` Query | ✅ 已实现 |
| 2 | `ExamService.SubmitExam` | `submitExam` Mutation | ✅ 已实现 |
| 3 | `HomeworkService.GetHomework` | `homeworkDetail` Query | ✅ 已实现 |
| 4 | `HomeworkService.SubmitHomework` | `submitHomework` Mutation | ✅ 已实现 |
| 5 | `GradeService.ListGradesByStudent` | `myGrades` Query | ✅ 已实现 |
| 6 | `AttendanceService.ListAttendanceByStudent` | `myAttendance` Query | ✅ 已实现 |
**环境变量student-bff 侧)**`CORE_EDU_GRPC_TARGET=core-edu:50053`
### 3.3 parent-bffai05 负责)— P0
| # | gRPC RPC :50053 | 用途 | 状态 |
| --- | ------------------------------------------- | -------------------------------- | --------- |
| 1 | `GradeService.ListGradesByStudent` | `childGrades` / `childSummary` | ✅ 已实现 |
| 2 | `HomeworkService.ListHomeworkByClass` | `childHomework` / `childSummary` | ✅ 已实现 |
| 3 | `ExamService.ListExamsByClass` | `childExams` / `childSummary` | ✅ 已实现 |
| 4 | `ClassService.GetClass` | 班级信息 | ✅ 已实现 |
| 5 | `AttendanceService.ListAttendanceByStudent` | `childAttendance` | ✅ 已实现 |
**环境变量parent-bff 侧)**`CORE_EDU_GRPC_TARGET=core-edu:50053`
### 3.4 api-gatewayai01 负责)— P1
| # | 依赖项 | 用途 | 状态 |
| --- | ------------------------------------ | -------------------- | --------- |
| 1 | HTTP `GET /healthz` :3004 | /readyz 下游健康检查 | ✅ 已实现 |
| 2 | HTTP REST `/api/v1/exams/*` :3004 | 考试域 REST 代理 | ✅ 已实现 |
| 3 | HTTP REST `/api/v1/homework/*` :3004 | 作业域 REST 代理 | ✅ 已实现 |
| 4 | HTTP REST `/api/v1/grades/*` :3004 | 成绩域 REST 代理 | ✅ 已实现 |
| 5 | HTTP REST `/api/v1/classes/*` :3004 | 班级域 REST 代理 | ✅ 已实现 |
### 3.5 msg 服务ai10 负责)— P2
| # | 依赖项 | 用途 | 状态 |
| --- | ---------------------------------------- | ---------------- | --------- |
| 1 | Kafka `edu.teaching.exam.published` | 考试发布通知触发 | ✅ 已发布 |
| 2 | Kafka `edu.teaching.homework.assigned` | 作业布置通知触发 | ✅ 已发布 |
| 3 | Kafka `edu.teaching.grade.recorded` | 成绩录入通知触发 | ✅ 已发布 |
| 4 | Kafka `edu.teaching.attendance.recorded` | 考勤异常通知触发 | ✅ 已发布 |
### 3.6 data-ana 服务ai11 负责)— P2
| # | 依赖项 | 用途 | 状态 |
| --- | --------------------------------------- | ----------------------- | --------- |
| 1 | Kafka `edu.teaching.*`(全量 12 topic | CDC 数据分析消费 | ✅ 已发布 |
| 2 | gRPC `ExamService.GetExam` :50053 | 考试详情查询P4 联调) | ✅ 已实现 |
### 3.7 下游 9 模块缺失 RPC 清单v2 新增2026-07-13
> 来源4 个 portal + 2 个 gateway + 3 个 BFF 的 nextstep.md 依赖分析
#### 3.7.1 teacher-bffai03缺失 RPC7 个)
| # | RPC | 用途 | 当前状态 | 计划 |
| --- | ------------------------------------------------ | -------------------- | -------- | ----------------- |
| 1 | `ExamService.SaveExamDraft` | 学生考试草稿保存 | ❌ 缺失 | 新增 |
| 2 | `GradeService.GetReportCard` | 学生成绩报告卡 | ❌ 缺失 | 新增 |
| 3 | `ScheduleService.GetScheduleByStudent` | 学生课表 | ❌ 缺失 | 新增 |
| 4 | `LeaveRequestService.ListLeaveRequestsByStudent` | 学生请假列表 | ❌ 缺失 | 新增 |
| 5 | `LeaveRequestService.CreateLeaveRequest` | 创建请假 | ❌ 缺失 | 新增 |
| 6 | `LeaveRequestService.CancelLeaveRequest` | 取消请假 | ❌ 缺失 | 新增 |
| 7 | `DashboardService.GetDashboard(teacherId)` | 教师仪表盘聚合 | ❌ 缺失 | 新增 |
| 8 | `DashboardService.GetClassPerformance(classId)` | 班级绩效聚合 | ❌ 缺失 | 新增 |
| 9 | `AdminService.ListSchools` | 学校列表admin 域) | ❌ 缺失 | 新增(聚合 stub |
| 10 | `AdminService.ListGradeLevels(schoolId)` | 年级列表admin 域) | ❌ 缺失 | 新增(聚合 stub |
| 11 | `AdminService.ListDepartments(schoolId)` | 部门列表admin 域) | ❌ 缺失 | 新增(聚合 stub |
| 12 | `AdminService.ListAcademicYears` | 学年列表admin 域) | ❌ 缺失 | 新增(聚合 stub |
#### 3.7.2 student-bffai04缺失 RPC7 个)
| # | RPC | 用途 | 当前状态 |
| --- | ------------------------------------------------ | ------------------------------ | ------------------------- |
| 1 | `ExamService.SaveExamDraft` | `saveExamDraft` Mutation | ❌ 缺失(同 teacher-bff |
| 2 | `ExamService.RecordExamViolation` | `recordExamViolation` Mutation | ❌ 缺失(新增) |
| 3 | `ScheduleService.GetScheduleByStudent` | `mySchedule` Query | ❌ 缺失(同 teacher-bff |
| 4 | `LeaveRequestService.ListLeaveRequestsByStudent` | `myLeaveRequests` Query | ❌ 缺失(同 teacher-bff |
| 5 | `LeaveRequestService.CreateLeaveRequest` | `createLeaveRequest` Mutation | ❌ 缺失(同 teacher-bff |
| 6 | `LeaveRequestService.CancelLeaveRequest` | `cancelLeaveRequest` Mutation | ❌ 缺失(同 teacher-bff |
| 7 | `GradeService.GetReportCard` | `myReportCard` Query | ❌ 缺失(同 teacher-bff |
#### 3.7.3 parent-bffai05缺失 RPC5 个)
| # | RPC | 用途 | 当前状态 |
| --- | ------------------------------------------------ | ----------------------------- | --------------- |
| 1 | `AttendanceService.ListAttendanceByStudent` | `childAttendance` | ✅ 已实现 |
| 2 | `GradeService.GetReportCard` | `childReportCard` | ❌ 缺失(同上) |
| 3 | `LeaveRequestService.ListLeaveRequestsByStudent` | `childLeaveRequests` | ❌ 缺失(同上) |
| 4 | `LeaveRequestService.CreateLeaveRequest` | `createLeaveRequest` Mutation | ❌ 缺失(同上) |
| 5 | `AdminService.ListAcademicYears` | `academicYears` | ❌ 缺失(同上) |
#### 3.7.4 api-gatewayai01依赖
| 依赖项 | 状态 |
| ------------------------------------ | --------- |
| HTTP `GET /healthz` :3004 | ✅ 已实现 |
| HTTP REST `/api/v1/exams/*` :3004 | ✅ 已实现 |
| HTTP REST `/api/v1/homework/*` :3004 | ✅ 已实现 |
| HTTP REST `/api/v1/grades/*` :3004 | ✅ 已实现 |
| HTTP REST `/api/v1/classes/*` :3004 | ✅ 已实现 |
#### 3.7.5 4 个 portalai13/14/15/16间接依赖
portal 不直接调用 core-edu通过各自 BFF 转发。需求已在 §3.7.1-3.7.3 中体现。
#### 3.7.6 潜在缺口说明parent-bff/parent-portal 提及)
> parent-bff §4.6 降级查询清单和 parent-portal §4.2 提到 `ExamResultService` 和 `ExportService`,这两个 Service 在 core-edu 9 Service / 40 RPC 清单中不存在。
| 下游提及的能力 | core-edu 现状 | 归属判断 |
| --------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| 考试结果详情ExamResultService | GradeService.GetReportCard 可承接成绩报告卡ExamService.GetExam 返回考试基础信息 | 需 parent-bff 联调时确认是否需要独立 RPC或由现有 RPC 组合 |
| 成绩导出ExportService | 无对应 RPC导出属 BFF/Portal 层格式化能力) | 建议由 parent-bff 调用 GradeService.ListGradesByStudent + 本地格式化实现 |
**结论**这两项不阻塞下游联调core-edu 不新增 RPC待 parent-bff 联调时协商归属。
---
## 4. 就绪信号
| 阶段 | 就绪信号 | 消费方 | 状态 |
| ------------------- | ----------------------------------------------------------------- | ------------------------------------------- | ------ |
| P2已就绪 | HTTP 3004 可访问 + /healthz + /readyzDB 探针) | teacher-bffREST 调用) | ✅ |
| P3核心 | gRPC 50053 + 27 RPC + HealthService SERVING | teacher-bff / student-bff / parent-bff / ai | ✅ |
| P3 子信号 1 | ClassService 4 RPC 可调用 | teacher-bff班级列表 | ✅ |
| P3 子信号 2 | ExamService 10 RPC 可调用(含 SaveExamDraft/RecordExamViolation | teacher-bff / student-bff / ai | ✅ |
| P3 子信号 3 | HomeworkService 5 RPC 可调用 | teacher-bff / student-bff | ✅ |
| P3 子信号 4 | GradeService 7 RPC 可调用(含 GetReportCard | teacher-bff / student-bff / parent-bff | ✅ |
| P3 子信号 5 | AttendanceService 4 RPC 可调用 | parent-bff | ✅ |
| P3 子信号 6 | edu.teaching.* topic 可发布(含 attendance.recorded | msg / data-ana / push-gateway | ✅ |
| **P3.13(已就绪)** | **gRPC 50053 + 40 RPC9 Service+ 24/24 smoke test** | **teacher-bff / student-bff / parent-bff** | **✅** |
| P3.13 子信号 1 | ScheduleService.GetScheduleByStudent 可调用 | teacher-bff / student-bff | ✅ |
| P3.13 子信号 2 | LeaveRequestService 3 RPC 可调用 | teacher-bff / student-bff / parent-bff | ✅ |
| P3.13 子信号 3 | DashboardService 2 RPC 可调用 | teacher-bff | ✅ |
| P3.13 子信号 4 | AdminService 4 RPC 可调用stub | teacher-bff / parent-bff | ✅ |
---
## 5. Docker 部署
### 5.1 镜像构建
```bash
# 在仓库根目录执行(需要访问 packages/shared-proto + tsconfig.base.json
docker build -t edu/core-edu:test -f services/core-edu/Dockerfile .
```
### 5.2 容器启动
```bash
docker run -d \
--name edu-core-edu-test \
--network edu-full_default \
-p 13004:3004 -p 50053:50053 \
-e PORT=3004 \
-e GRPC_PORT=50053 \
-e DATABASE_URL=mysql://edu:changeme@edu-mysql:3306/next_edu_cloud \
-e REDIS_URL=redis://edu-redis:6379 \
-e KAFKA_BROKERS=kafka:29092 \
-e DEV_MODE=true \
edu/core-edu:test
```
### 5.3 健康检查验证
```bash
# HTTP liveness
curl http://localhost:13004/healthz
# HTTP readinessDB + Redis 探针)
curl -H "x-user-id: dev-teacher" -H "x-user-role: teacher" http://localhost:13004/readyz
# gRPC smoke test24 RPC
cd services/core-edu && node test/grpc-smoke.mjs
# 应输出PASS: 24 FAIL: 0 TOTAL: 24
```
### 5.4 环境变量清单
| 变量 | 必填 | 示例值 | 说明 |
| ----------------------------- | ---- | ------------------------------------------------ | --------------------------------------- |
| `PORT` | 是 | `3004` | HTTP 监听端口 |
| `GRPC_PORT` | 是 | `50053` | gRPC 监听端口 |
| `DATABASE_URL` | 是 | `mysql://edu:pass@edu-mysql:3306/next_edu_cloud` | MySQL 连接串 |
| `REDIS_URL` | 否 | `redis://edu-redis:6379` | Redis 连接地址(缺失时降级) |
| `KAFKA_BROKERS` | 否 | `kafka:29092` | Kafka broker 地址(缺失时 outbox 暂存) |
| `JWT_SECRET` | 否 | — | JWT 校验密钥(可选) |
| `DEV_MODE` | 否 | `false` | 开发模式(跳过部分校验) |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | 否 | `http://otel-collector:4318` | OTLP 上报端点 |
| `LOG_LEVEL` | 否 | `info` | 日志级别 |
---
## 6. 关键文件路径
| 文件 | 用途 |
| ---------------------------------------------------------------- | -------------------------------------------------- |
| `services/core-edu/src/main.ts` | 服务入口HTTP + gRPC 双启动,含 startGrpcServer |
| `services/core-edu/src/grpc/grpc.server.ts` | gRPC server9 Service / 40 RPC handler |
| `services/core-edu/src/app.module.ts` | NestJS 根模块 |
| `services/core-edu/src/exams/exam-state-machine.ts` | 考试状态机(纯函数) |
| `services/core-edu/src/homework/homework-state-machine.ts` | 作业状态机(纯函数) |
| `services/core-edu/src/grades/grade-calculator.ts` | 成绩计算器scope 优先级) |
| `services/core-edu/src/scheduling/schedule-conflict.ts` | 排课冲突检测(纯函数) |
| `services/core-edu/src/leave-requests/leave-requests.service.ts` | 请假服务P3.13 新增) |
| `services/core-edu/src/dashboard/dashboard.service.ts` | 仪表盘聚合P3.13 新增) |
| `services/core-edu/src/admin/admin.service.ts` | Admin 聚合 stubP3.13 新增) |
| `services/core-edu/src/shared/outbox/outbox.publisher.ts` | Outbox 事件发布TOPIC_MAP |
| `services/core-edu/src/shared/datascope/datascope-injector.ts` | DataScope WHERE 注入 |
| `services/core-edu/src/config/database.ts` | MySQL 连接池 |
| `services/core-edu/src/config/kafka.ts` | Kafka producer |
| `services/core-edu/src/config/redis.ts` | Redis 客户端 + 分布式锁 |
| `services/core-edu/Dockerfile` | Docker 构建单阶段node:22-alpine + tsc |
| `services/core-edu/test/grpc-smoke.mjs` | gRPC smoke test24 RPC |
| `packages/shared-proto/proto/core_edu.proto` | gRPC proto 契约9 Service / 40 RPC |
---
**本文件由 ai08 维护。core-edu P3 核心功能 + P3.13 下游缺失 RPC 补全已全部完成9 Service / 40 RPC 就绪),本地 Docker 24/24 smoke test 通过。下游 9 模块4 portal + 2 gateway + 3 BFF可基于此进行端到端联调。P4+ 任务等待 data-ana/content/msg 服务就绪。**