|
- <!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>reference-review · Code Review</title><style>*{box-sizing:border-box}body{margin:0;background:#edf2f7;color:#203248;font:16px/1.75 "Microsoft YaHei","Segoe UI",sans-serif}header{background:#0c2b47;color:white;padding:22px max(24px,calc((100vw - 1160px)/2))}header a{color:#c1e6ff;margin-right:24px}main{max-width:1200px;margin:24px auto 60px;padding:36px;background:white;border-radius:12px;box-shadow:0 6px 24px #1028400c}h1{font-size:30px;line-height:1.4;margin-top:0}h2{font-size:22px;margin:36px 0 14px;border-bottom:2px solid #dbe8f2;padding-bottom:8px}h3{font-size:18px}p{margin:13px 0}a{color:#126fba;text-decoration:none}a:hover{text-decoration:underline}table{border-collapse:collapse;width:100%;margin:18px 0;font-size:14px;table-layout:auto}th,td{padding:11px 13px;border:1px solid #dce5ed;text-align:left;vertical-align:top;overflow-wrap:anywhere}th{background:#edf5fc}tr:nth-child(even){background:#f9fbfd}code{font:13px/1.5 Consolas,monospace;background:#edf2f7;padding:2px 5px;border-radius:4px;overflow-wrap:anywhere}pre{padding:18px;overflow:auto;background:#edf2f7;border-radius:8px}pre code{padding:0}img{max-width:100%;height:auto}details{padding:12px;background:#f7f9fc;margin:12px 0}.gallery{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}figure{margin:0;border:1px solid #dce5ed;border-radius:8px;overflow:hidden;background:#f8fafc}figure img{display:block;width:100%;height:300px;object-fit:contain;background:#e8eef3}figcaption{padding:12px;font-size:14px;color:#37526b}footer{color:#657c91;font-size:13px;margin-top:36px}li{margin:8px 0}@media(max-width:760px){main{margin:0;padding:20px;border-radius:0}.gallery{grid-template-columns:1fr}table{display:block;overflow:auto}h1{font-size:25px}header{padding:16px}}@media print{body{background:white}main{margin:0;box-shadow:none;max-width:none}header{display:none}figure{break-inside:avoid}h2{break-after:avoid}}</style></head><body><header><a href="index.html">审查总报告</a><a href="live/html/index.html">真实 E2E</a><a href="frontend-e2e/html/index.html">模拟接口回归</a></header><main><h1 id="资料-产品原型-设计追溯审查">资料 → 产品原型 → 设计追溯审查</h1>
- <p>审查日期:2026-09-05。范围:后端 <code>3307c23 → b683bb7</code>,前端 <code>0aac918 → 1576728</code>。本附录为资料、原型和静态代码证据;运行测试结果以同目录主报告为准。</p>
- <h2 id="结论">结论</h2>
- <p>本次多渠道定义、命令幂等和逐步骤留痕与资料的“同一任务贯穿训练、错误可重试、全过程留痕”方向一致。应按现有正式设计修复可复现缺陷,不把资料中尚未接入的功能直接补成新业务。</p>
- <p>有四项需要产品确认:默认实装页面仍是离线识别回放;混合现实与现有三渠道的关系尚无直接映射;“全部步骤完成才可提交”与电气脚本的“未收尾提交后扣分”口径不同;脚本的自动评分、分级和训练后复盘是否应成为此次交付范围。以下均没有作为 bug 自动修改。</p>
- <h2 id="1-原始资料与阅读证据">1. 原始资料与阅读证据</h2>
- <p>实际工作区为 <code>E:/work/edit_3d</code>,用户文本中的 <code>edit\_3d</code> 按该目录解释。两份 PDF 都没有可提取的文本层,已用 Poppler 将全部 11 页渲染为 PNG 并逐页查看。页码指 PDF 文件页序。</p>
- <table>
- <thead>
- <tr>
- <th>来源</th>
- <th style="text-align: right;">页数</th>
- <th>SHA-256</th>
- <th>本次采用的产品要求</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><a href="../../../../文档/维修训练内容设计.pdf">维修训练内容设计.pdf</a></td>
- <td style="text-align: right;">6</td>
- <td><code>8B5B0730D82CB6285A678584869B0B8E26C3C5A76817A7A52ABAD4BEBE46F2E8</code></td>
- <td>P1-2:虚拟、混合现实、AI 指导实装三种方式;同任务贯穿;教员构建场景/任务、分组、下达,学员训练,数据记录分析。P3-6为具体案例,本次不扩展其中的维修操作内容。</td>
- </tr>
- <tr>
- <td><a href="../../../../文档/电器控制系统故障维修脚本.pdf">电器控制系统故障维修脚本.pdf</a></td>
- <td style="text-align: right;">5</td>
- <td><code>A68BEB52E14FC6A39D6F81064B986DC00A868F695B30E9FBD5A309F30E60FD33</code></td>
- <td>P1:15分钟、分步计分、容错、操作留痕、AI助教。P2-4:五阶段;P5:计分、成绩等级、重试、复盘及知识拓展。</td>
- </tr>
- </tbody>
- </table>
- <p><code>references/training-design-1.png</code> 至 <code>training-design-6.png</code>、<code>references/electrical-script-1.png</code> 至 <code>electrical-script-5.png</code> 保存了原始页面渲染。它们是资料截图,不是应用 E2E 截图。维修设计 P6 下半页流程图的扫描原件过淡,不能可靠逐字识别,未据此推导执行规则。</p>
- <p>关键页预览:</p>
- <details>
- <summary>维修设计 P1:训练方式与全流程</summary>
- <p><img alt="维修设计P1" src="references/training-design-1.png" /></p>
- </details>
- <details>
- <summary>电气脚本 P5:评分、重试和复盘</summary>
- <p><img alt="电气脚本P5" src="references/electrical-script-5.png" /></p>
- </details>
- <h2 id="2-产品原型的实际来源">2. 产品原型的实际来源</h2>
- <p><code>unreal_tran_web/AGENTS.md:7</code> 指定相邻 <code>unreal_tran_demo</code> 为当前交互参考,同时明确 <code>unreal_tran</code> 已废弃。本工作区没有 <code>unreal_tran_demo</code>,不能把现存旧目录默认为最新产品定稿。本次以正式代码中的已移植原型、适配层、当前路由和 API wiki 的已确认决策追溯。</p>
- <table>
- <thead>
- <tr>
- <th>实际来源</th>
- <th>证据与解释</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><code>unreal_tran_web/src/features/guide-legacy/demo-src/</code></td>
- <td>原型源码的整树副本,不只包含作业指导书。<code>physical-training-runtime.js:152-339,492-501</code> 含电气训练五阶段,参考时长15分钟,阶段分值15/20/30/20/15。与电气脚本的结构相符,证明同事已经实现过相关原型。</td>
- </tr>
- <tr>
- <td><code>unreal_tran_web/src/features/virtual-training-legacy/upstream/</code></td>
- <td>虚拟训练兼容原型副本。<code>adapter/runtime.ts:22-25,97-101</code> 明确本地演示数据不入正式库。其页面成功不能单独证明正式 API 训练闭环。</td>
- </tr>
- <tr>
- <td><code>unreal_tran_web/src/router/index.ts:275-326</code></td>
- <td>本次虚拟训练主入口已改为正式 <code>TeachingTaskCenterView/TeachingRunView/TeachingPreviewView</code>;旧 <code>/api</code> 入口重定向;本地版保留于显式 <code>/legacy</code>。应优先验收正式主入口与旧链接重定向。</td>
- </tr>
- <tr>
- <td><code>unreal_tran_web/src/features/physical-legacy/runtime.ts:12-21,64-85</code></td>
- <td>当前实装宿主固定注入离线回放:45秒左右的视频,零分值,不写正式训练事件、不自动完成步骤。</td>
- </tr>
- <tr>
- <td><code>unreal_tran_web/src/views/teaching/LegacyPhysicalTrainingPageView.vue:137-150</code></td>
- <td>实际传入 <code>legacyPhysicalOfflineReplay.task</code>、<code>formalExam: false</code>、空 <code>edgeUrl</code>,而非将已发布任务完整步骤交给真实训练运行域。</td>
- </tr>
- <tr>
- <td><code>unreal_tran_api/wiki/11-内容制作模块.md:35-44</code></td>
- <td>训练编排默认本地原型工作台;正式可入库发布的接口工作台并存。这是既有产品取舍,不能在本轮顺手合并两个工作台。</td>
- </tr>
- </tbody>
- </table>
- <h2 id="3-资料设计实现和测试映射">3. 资料、设计、实现和测试映射</h2>
- <table>
- <thead>
- <tr>
- <th>资料目标</th>
- <th>产品/设计依据</th>
- <th>当前实现证据</th>
- <th>审查判断与验收重点</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>同一任务贯穿多种训练方式(维修设计 P1-2)</td>
- <td>wiki19 第1-5节:公共步骤及场景依赖唯一,各渠道 profile 分开,旧单渠道兼容,任务固定快照</td>
- <td><code>src/features/training/trainingDocument.ts</code>、<code>TrainingChannelContract.java</code>、<code>TeachingSceneSnapshotService.java</code></td>
- <td>方向一致。E2E需检查多渠道保存/重开和任务渠道选择;创建任务后修改草稿不能改变已运行快照。不能将“混合现实”直接替换成“对抗”。</td>
- </tr>
- <tr>
- <td>教员建任务/分组,学员执行(维修设计 P1)</td>
- <td>wiki14 第1、2节;本次角色合同收敛为教员、学员、管理员;内容写入需有效教员身份</td>
- <td><code>CoreRoleContract.java</code>、<code>ContentAuthorizer.java</code>、<code>src/config/roles.ts</code>、<code>src/stores/auth.ts</code></td>
- <td>资料不定义管理员可绕过教员身份。按当前权限合同测试教员写入、学员拒绝、管理员纯管理身份不冒充教员;不自行放宽权限。</td>
- </tr>
- <tr>
- <td>逐步骤计时、错误容错、全程留痕(电气脚本 P1-5)</td>
- <td>wiki21:PENDING/IN_PROGRESS/FAILED/COMPLETED事实;尝试、失败、时间、证据;历史不补假数据</td>
- <td><code>TeachingStepRunService.java</code>、<code>TeachingAssignmentService.java</code>、<code>src/views/teaching/TeachingRunView.vue</code></td>
- <td>新事实表支持这一需求。验收应覆盖首次开始、逐步推进、失败/重试、完成后提交、历史空事实纯读取、越权读取。</td>
- </tr>
- <tr>
- <td>正确操作只推进一次,重试不重复加分/留痕(电气脚本 P2-5的容错目标)</td>
- <td>wiki20:开始/推进/提交/评定四命令;同一意图复用 commandId,同载荷重放,异载荷409</td>
- <td><code>src/api/teaching.ts:120-148</code>、<code>TeachingCommandReceiptService.java</code>、<code>TeachingController.java</code></td>
- <td>幂等是实现该目标的技术约束,PDF没有直接规定 commandId。验收需有断网/超时重试证据和服务端事件/事实不重复证据;不能只看按钮禁用。</td>
- </tr>
- <tr>
- <td>五阶段15分钟、阶段分值15/20/30/20/15(电气脚本 P1-5)</td>
- <td>已移植原型 <code>physical-training-runtime.js:152-339,492-501</code></td>
- <td>该模板存在,但默认实装宿主用离线45秒回放;本次032是前泵互救的另一份五步任务,见 wiki14:610-617</td>
- <td>模板存在不等于正式任务已接通;前泵五步不等于电气五阶段。测试报告应明确所测任务,避免把不同课目覆盖率合并。</td>
- </tr>
- <tr>
- <td>AI全程提示、错误预警、成绩与报告(电气脚本 P1、P5)</td>
- <td>wiki14:101-106普通虚拟训练可配置数字教员;正式考核/非虚拟通道限制不同;wiki14:228-229客户端自动结果不是权威成绩</td>
- <td>AI Person绑定、正式考核投影和现有教员评定接口;实装离线候选需教员复核</td>
- <td>不能通过恢复前端本地打分来补“自动评分”。应分别验收普通训练提示和正式考核隔离;是否扩大实装AI、自动结算、复盘范围需产品确认。</td>
- </tr>
- <tr>
- <td>任务状态和结果可解释(维修设计 P1、电气脚本 P5)</td>
- <td>wiki14 第8节:中文状态、真实成员、考场/对抗监控、结束/归档前置</td>
- <td><code>TeachingTaskCenterView.vue</code>、<code>TeachingConfrontationMonitorView.vue</code>、<code>TeachingExamMonitorView.vue</code></td>
- <td>E2E需检查已接收记录详情与进行中观察的不同入口,结束/未开始记录不请求只允许进行中的execution投影。</td>
- </tr>
- </tbody>
- </table>
- <h2 id="4-需要用户确认的功能差异">4. 需要用户确认的功能差异</h2>
- <p>下表列的是资料与当前产品边界的差异,不是已经认定的本轮回归 bug。本附录没有修改业务代码、状态机、种子数据或 DDL。</p>
- <table>
- <thead>
- <tr>
- <th>编号</th>
- <th>现状与证据</th>
- <th>需要确认的具体选择</th>
- <th>确认前的处理</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>F1</td>
- <td>电气脚本要求完整训练;现默认实装运行/预览固定离线回放(<code>physical-legacy/runtime.ts:12-21</code>;<code>LegacyPhysicalTrainingPageView.vue:137-150</code>)。原型电气模板已有五阶段。</td>
- <td>此次交付继续保留售前回放,还是另立功能任务将电气模板发布为正式内容、接入真实事件/步骤事实、提交与评定?若接入,需要明确所选训练版本与设备/人工证据来源。</td>
- <td>只验收回放明确标识及现有API合同,不把候选视频当真实训练完成。</td>
- </tr>
- <tr>
- <td>F2</td>
- <td>维修设计 P1-2的方式为虚拟/混合现实/AI实装;wiki19渠道为虚拟/实装/对抗。现有 WebXR 能力见 wiki14:392-405;设备面板明确健康检查不等于现场硬件已连接。</td>
- <td>混合现实是否作为VIRTUAL渠道下的呈现能力/独立沉浸入口,还是需要新渠道?对抗是否是另一维度的组织形式?</td>
- <td>保留现有渠道,单独列硬件未验收边界,不新增枚举/菜单/表。</td>
- </tr>
- <tr>
- <td>F3</td>
- <td>电气脚本 P5允许未完成收尾时提交并扣分;wiki21:26要求新运行全部COMPLETED。实现 <code>TeachingAssignmentService.java:734-735</code> 明确拒绝未完成提交。</td>
- <td>是否保持全部完成的强制流程,或新增“提前交卷/放弃并结算”语义?若允许提前结算,需要定义未完成、失败、超时各自的成绩及审计规则。</td>
- <td>按当前设计测试“未完成提交被拒绝”;不伪造完成事实,不放开现有submit。</td>
- </tr>
- <tr>
- <td>F4</td>
- <td>电气脚本 P5规定自动结算、四档成绩(90/80/70门槛)、全过程复盘与知识拓展;现有正式权威结果依服务端规则/教员评定,当前实装回放明确不自动计分。</td>
- <td>这些是否属于此次交付的必验功能?若纳入,需要确认自动评分规则、等级文案、复盘证据与知识资源来源。</td>
- <td>不把旧原型评分直接恢复为正式成绩;列为后续功能任务,与F1一并评审可减少重复工作。</td>
- </tr>
- </tbody>
- </table>
- <h2 id="5-主测试报告应保留的证据">5. 主测试报告应保留的证据</h2>
- <ol>
- <li>真实登录进入正式虚拟入口、任务详情/预览、学员运行;保留带任务标题的截图。</li>
- <li>多渠道编辑保存与重开;确认默认渠道仍在启用集合内,停用渠道配置不会被任务误用。</li>
- <li>首次开始和一次推进前后步骤表/界面;重试同命令不重复创建事件或递增次数;异载荷重用命令被拒绝。</li>
- <li>未完成提交被拒绝,完成全部步骤后提交成功;教员评定可见且刷新一致。</li>
- <li>正式考核不暴露提示、故障答案、评分私有规则与数字教员;他人运行/步骤访问被拒绝。</li>
- <li>实装页截图必须包含“离线识别回放/需教员复核/不自动计分”边界;不能将其写成现场AI或实装闭环验收通过。</li>
- <li>本轮数据库实际采用 <strong>033 → 新增035</strong>:035针对当前KingbaseES以真正的UNIQUE约束满足步骤事实表组合外键要求,历史034保留,同步更新全量DDL。执行、重跑、恢复快照和一致性核对见<a href="database-review.html">数据库审查</a>及<a href="database-migration.json">迁移执行记录</a>。本附录的资料审查过程只读设计,未直接连接或执行数据库。</li>
- </ol>
- <p>浏览器截图、HTTP结果、自动化测试结果由主审查任务补入主报告;本资料审查不宣称任何尚未执行的 E2E 已通过。</p>
- <h2 id="6-补充素材选择待确认f5">6. 补充素材选择待确认(F5)</h2>
- <p>F5来自本轮视频素材合同检查,与上文四项PDF资料差异分开记录。原默认回放视频被替换为约31.974秒的新片,但页面的12条候选及抓拍仍对应原约45秒视频。仓库中的 <code>china-military-repair-workshop-hd-45s-system-pose1.mp4</code> 与原验收素材SHA一致,实测约45.422秒;本轮最小修复已将默认映射恢复到匹配素材,约32秒新片保留。</p>
- <p>需要确认:后续继续采用匹配现有阶段、候选和抓拍的原视频,还是采用新片并重新标定阶段时间、识别候选与抓拍?这不是PDF提出的新要求,也不表示视频回放已成为现场AI或正式实装训练。修复证据、视频就绪验收及最终素材确认项以<a href="review-report.html">主报告</a>和<a href="frontend-review.html">前端审查</a>为准。</p><footer>2026-09-05 · 开发环境审查 · 图片可点击查看原尺寸</footer></main></body></html>
|