11 KiB
11 KiB
RailwaySystem Phase 2 Contract Review Round 1 审查报告
审查日期: 2026-09-14 审查基线: PRD V1.0 + Database V2 (21张表) + generator-v2-ready-20260914 审查对象:
docs/api-v2/目录全套 API 契约、DTO/VO、Service 边界与架构设计规范 最终评审结论: Contract Review Round 1 Final = A (完全通过,达到架构冻结准入标准)
1. 本轮审查发现的核心问题与偏离项
在初版 API 契约完成设计后,经过技术架构与业务基线严审,识别出以下 5 处需要规范化收敛的问题:
- “及格/合格判定”存在需求越界: 初版将 60 分及格线和
passStatus作为【确认】规则固化在成绩台账及统计中,偏离了 PRD V-07/V-08 明确标注的“是否存在及格线待现场确认”基线; - 学员画像模型过早冻结: 初版将四维雷达图、固定指标名称与规则标签直接写死,与 PRD V-10“一期存在简单画像,具体指标与标签待现场确认”存在超前假设;
- Report Deadline 误定为硬物理 Invariant: 初版将
report_time <= report_deadline误列为与跨班串签同等级别的硬一致性拓扑不变量,忽略了业务上超期补录或管理员特批放行的生命周期弹性需求; - 外部异步调用存在过度设计隐患与语义模糊: 文字表述中将
afterCommit误表达为本身就是异步,且提到了 Outbox 等重型方案,容易误导后续开发引入不必要的 MQ/事件总线中间件; - 91 个 API 缺乏实施优先级分级与 Command 统计口径模糊: 未明确区分核心验收闭环与辅助运维接口,Command API 与普通更新混淆。
2. 本轮修订与收敛内容
针对上述问题,本轮评审进行了系统性修订并同步更新了 docs/api-v2/ 下的全部相关文档:
| 修订项 | 涉及文档 | 调整前 | 调整后 |
|---|---|---|---|
| 及格判定解耦 | 01, 05, 06, 10, 11 |
compositeScore + 硬编码 passStatus 判定 |
weightedTotalScore 作为核心【确认】业务结果;passStatus 降级为【默认/建议方案(待现场确认)】;移除固定合格率 |
| 画像模型弹性化 | 05, 06, 11 |
固定四维雷达图 + 固定标签枚举 | 【确认】简单画像数据;采用弹性指标集 metrics + 标签集 tags;具体计算维度与标签标记为待现场确认 |
| 时效规则归位 | 03, 08, 10, 11 |
6 项硬业务不变量 (含 Report Deadline) | 5 项跨表硬业务不变量 + 1 项报到生命周期策略 (Report Lifecycle Policy);支持 BLOCK / WARNING / OVERRIDE 三种模式 |
| 外部调用解耦规范 | 04, 07, 08, 09 |
误表达 afterCommit 本身为异步,提及 Outbox/MQ | 严禁引入 MQ / Kafka / Outbox【扩展】;明确为事务提交后通过 afterCommit 触发后续调用,一期建议经轻量异步执行器或事务外调用,外部失败绝不回滚已提交事务 |
| 全面优先级划分 | 00, 01, 02, 03, 04, 05, 06 |
91 个 API 未分级 (V1.0原统计) | 全面划分:P0 (53个)、P1 (34个)、P2 (2个),物理总数 89 个;新增 Phase 1 Minimal Contract 视图 |
| 业务Command口径统一 | 00, 01, 06 |
19个与20个数字模糊混淆 | 明确 P0 核心 Command API 共 20 个(包含 19 个核心业务流程 Command + 1 个 P0 计划管理更新 PUT /train/plans/{planId}),P1 辅助 Command 4 个 |
| 消除数据库绝对承诺 | 11, 12 |
100%无需修改数据库 | 修正为客观评估:当前评估预计无需改 DB,采用“预计无/可能有/需重新评估”,若引入新持久化业务对象重新进入 DB Change Review |
3. PRD 越界项的裁定与处理
- 及格线与合格结业 (PRD V-07, V-08):
- 裁定:一期不做及格门槛硬拦截,不设“考核不合格退学/无法结业”状态机。培训班到达结束时间,所有正常参训学员状态一律置为“已完成”,完整保留其各科成绩与加权总分供后续查阅。
- 学员画像规则引擎 (PRD V-10):
- 裁定:严禁在一期引入 Drools 或复杂规则引擎;采用极简统计数值与轻量 JSON 存储,前端动态适配渲染。
- 复杂课程版本/审批/证书:
- 裁定:彻底剔除,契约中不设立任何审批流和证书接口。
4. API 优先级分级 (P0 / P1 / P2) 统计裁定
- P0 API (共 53 个): 一期核心闭环必须实现,包含:
- Module A 基础主数据核心 CRUD (20个);
- Module B 开班、本期课程、参训名单导入、排课、冲突预检、完整课表、学员报到 (17个);
- Module C 批量宿舍预分配、调房、走读、住宿查看、门禁重试、签到、签退、考勤修正、课次考勤 (9个);
- Module D 成绩配置、打分录入、成绩台账大表、学员成绩单、外部学习记录接入、综合统计概览 (7个)。
- P1 API (共 34 个): 一期辅助管理能力(如主档启停用、教学资源独立管理、班牌注册管理、房态看板、门禁流水、人工补录考勤、成绩Excel导入、学习记录流水、学员训练详情、学员画像等)。
- P2 API (共 2 个): 依赖现场确认或面向学员端的次要门户接口(
GET /train/student/my-training学员端门户、GET /train/plans/{id}/statistics/score-distribution成绩区间下钻分析)。
5. 核心业务用例 (UC-01 ~ UC-29) 的 P0 主链映射
经核对 PRD V1.0 业务验收场景,一期主流程由以下 17 个 P0 用例构成闭环:
UC-01 创建培训计划 (P0)
UC-02 编辑培训计划 (P0)
UC-03 配置本期课程 (P0)
UC-04 添加参训人员 (P0)
UC-05 Excel批量导入参训人员 (P0)
UC-06 查看本期参训名单 (P0)
UC-07 新增课次 (P0)
UC-08 修改课次 (P0)
UC-10 排课冲突检查 (P0)
UC-11 获取计划完整课表 (P0)
UC-12 批量住宿预分配 (P0)
UC-13 单人住宿调整 (P0)
UC-14 查看住宿安排 (P0)
UC-15 学员报到确认 (P0)
UC-16 创建/同步门禁授权 (P0)
UC-17 课次签到 (P0)
UC-18 课次签退 (P0)
UC-19 人工修正考勤 (P0)
UC-20 配置成绩项目及权重 (P0)
UC-21 录入成绩 (P0)
UC-23 获取学员本期成绩 (P0)
UC-24 接收外部学习记录 (P0)
UC-26 计划统计概览 (P0)
UC-29 结束培训计划 (P0)
(注:UC-09 删除课次、UC-22 Excel导入成绩、UC-25 查询学习记录、UC-27 学员训练详情、UC-28 学员画像划入 P1 辅助能力)
6. Report Deadline 时效生命周期策略
- 确认事实:
report_deadline作为时间戳字段保存在train_class_plan表中; - 执行规则: 学员报到时系统检查当前时间;
- 兼容策略:
- 默认行为:若超时且
forceOverride = false,接口返回警告提醒REPORT_DEADLINE_WARNING;若由管理员代办或forceOverride = true,允许完成报到并在报到流水中标记is_overdue = true; - 完美兼容现场最终确认的严格阻断、提示警告或特批覆盖,预计无需修改数据库字段。
- 默认行为:若超时且
7. 学员画像 (Student Portrait) 策略
- 确认事实: 数据持久化保存在
train_student_portrait表; - 弹性契约: API 返回结构抽象为
metrics(指标数值数组) +tags(能力标签字符串数组) +summary(简短文字摘要); - 实现策略: 后端一期默认基于考勤率、理论成绩、实操成绩与自主学习时长进行四维归一化打分;现场若对指标名称或标签有微调,仅需在
PortraitAppService中微调权重与打标文案,前端自适应渲染,彻底杜绝数据模型硬编码。
8. 及格判定 (Pass / Qualified) 策略
- 确认事实: 成绩核心计算依据为
train_score_item中的weight与full_score; - 业务输出: 各科成绩根据权重汇总计算出的加权总分
weightedTotalScore是唯一【确认】输出结果; - 及格解耦: API 默认不对学员进行“及格/不及格”判定,全班台账中的
passStatus设为可选参数;若现场需要及格线,通过入参传递阈值(如60)动态判定,不污染数据库与主干业务流。
9. 外部调用最小实现策略与技术语义修正
- 铁律: 本地短事务严禁包裹外部第三方 HTTP 长请求;
- 技术语义规范:
afterCommit本身不代表异步,其本质是数据库事务提交成功后的回调钩子;- 一期默认建议:
afterCommit→ 轻量异步执行器 → Adapter;若未引入异步执行器,则为afterCommit→ 当前线程事务外调用 Adapter; - 两者都必须保证:外部调用失败不得回滚已经提交的本地数据库事务,而是保留/更新同步状态并支持手工重试;
- 明确:MQ / Outbox / 分布式事务 = 一期不引入【扩展】。
10. V-01 ~ V-14 数据库影响客观评估原则
- 删除绝对承诺: 严禁使用“100%无需修改数据库”等绝对化承诺;
- 规范表述口径:
当前评估:大多数 V-01~V-14 的不同答案可由 API / Service / DTO / Adapter 策略吸收,预计无需修改 Database V2。但若现场确认引入新的持久化业务对象、一期范围变化、新的硬件持久化要求或审计要求,必须重新进入 Database Change Review。
- 各 V 项评估采用三态分类:
预计无(如V-01V-07, V-10V-13)、可能有(如V-08结业审批状态)、需重新评估(如V-09证书持久化、V-14外部数据交换审计)。
11. 最终收口修订记录与评审裁定
经过本轮全面复查与最终收口修订:
afterCommit技术语义已全面纠正,杜绝“afterCommit本身是异步”的误读,明确外部失败不回滚已提交本地事务;- 彻底删除了“100%不改DB”绝对化承诺,建立了客观科学的三态评估与变更控制原则;
- 统计口径完全统一并消除歧义:
- API 总数:89 个 (P0: 53, P1: 34, P2: 2);
- 核心业务 Command API:共 24 个 (P0 核心 Command API 20 个 [包含 19 个核心业务流程 Command + 1 个 P0 计划管理更新
PUT /train/plans/{planId}],P1 辅助 Command 4 个); - P0 业务编排 Service:10 个 P0 Application Service;
- 领域核心标识
enrollment_id,plan_course_id,lesson_id稳固落实,5 大跨表硬 Invariant 与 1 项 Lifecycle Policy 界限分明; - 未修改任何一行 Java/Vue 代码或数据库表结构。
评审最终裁定:【Contract Review Round 1 Final = A】(完全通过,允许进入 API Contract 最终冻结)。