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

28 KiB
Raw Blame History

core-edu 下一步工作与上下游依赖

模块core-edu教学核心服务HTTP 3004 + gRPC 50053 负责人ai08 更新日期2026-07-13v3P3.13 12 个 RPC 补全完成 + 本地 Docker 24/24 smoke test 通过) 关联:core-edu_contract.mdcore-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 提到 ExamResultServiceExportService,这两个 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 镜像构建

# 在仓库根目录执行(需要访问 packages/shared-proto + tsconfig.base.json
docker build -t edu/core-edu:test -f services/core-edu/Dockerfile .

5.2 容器启动

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 健康检查验证

# 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 服务就绪。