import fs from 'node:fs'; import path from 'node:path'; const root=path.resolve('reports/virtual-html-full-closure-20260912'); const read=name=>JSON.parse(fs.readFileSync(path.join(root,name),'utf8')); const exam=read('exam-checks.json'),workflow=read('workflow-checks.json'),backend=read('backend-tests.json'),cleanup=read('cleanup.json'); const regression=JSON.parse(fs.readFileSync('reports/virtual-html-workspace-20260912/checks.json','utf8')); const checks=[...exam.checks,...workflow.checks,...regression.checks]; if(checks.some(check=>!check.pass))throw new Error('Do not publish a passing report while a required live check is failing'); const escape=value=>String(value??'').replaceAll('&','&').replaceAll('<','<').replaceAll('>','>').replaceAll('"','"'); const fixture=read('exam-fixture.json'),flowFixture=read('workflow-fixture.json'); const screenshots=[['01-exam-current-step.png','正式考试:当前安全投影与实际三维选择'],['03-workflow-waiting.png','高级编排:等待外部事件,超时保持阻断'],['04-teacher-workflow-event.png','教员页面确认外部事件'],['05-workflow-submitted.png','高级编排路径完成并提交'],['06-teacher-exam-review.png','教员查看逐步考试证据并评分'],['07-exam-analytics.png','数据中心查询成绩与记录详情'],['08-exam-deadline.png','考试到期关闭工作区']]; const html=`JS+HTML 虚拟训练完整流程验收

JS+HTML 虚拟训练完整流程验收

${checks.length} 项实测检查通过 · 111 项前端契约测试通过 · 552 项后端测试通过

时间:${escape(new Date().toLocaleString('zh-CN'))} · 环境:本机 6180 Web → 6100 Gateway → Tran/Auth · Edge 无头浏览器真实交互

本轮覆盖虚拟训练高级编排、虚拟通道正式考试、教员评定与数据中心,并回归既有 JS+HTML 运行/预览。所有训练进度、交卷、评定及编排状态由真实接口处理。

迁移结果

环节实现与验证
高级编排服务端按发布连线执行开始、步骤、结束、条件、安全、事件等待、故障注入/清除、建议评分、相机及音频节点。等待与超时阻止推进;分支跳过记为 SKIPPED;刷新恢复;教员页面确认事件;相同命令重放不重复推进。
正式考试虚拟通道使用 JS+HTML 工作区,逐步获取 execution 安全投影;关闭帮助、数字人、答案高亮、爆炸和回放。三维选择后提交,交卷后关闭执行资源;到期关闭工作区并由服务端拒绝资源访问。非虚拟通道保留设备/岗位推进规则。
评分与统计服务端逐步保留考试操作证据;教员在评定弹窗查看并打分,学员不能自评或获取私有证据聚合。数据中心页面可查询成绩及详情。
普通训练回归桥梁结构树、聚焦、高亮、隐藏、标签、爆炸、复位、数字教员;卡车四类动画与复位;工具、安全和测量记录恢复;真实点击与拖动;网络失败不提前推进,恢复后重试;他人运行只读观察。

真实流程检查

${checks.map(c=>``).join('')}
检查结果
${escape(c.name)}通过

验证命令与证据

pnpm run build(含 vue-tsc 与正式资源构建校验);node --test 执行 teaching/virtual/training 的 *.test.mjs;Java 17 下 mvn test

${Object.entries(backend).map(([name,value])=>``).join('')}
后端模块测试数失败 / 错误
${name}${value.tests}${value.failures} / ${value.errors}

构建存在现有大分块提示。原型同步检查提示 upstream 与同步基线存在差异,本次未执行覆盖式原型同步。

脚本:virtual-html-exam-live.mjsvirtual-html-workflow-live.mjsvirtual-html-live.mjs。原始结果:考试编排普通训练回归

数据库与使用边界

已在开发库执行并重复验证两项增量:040 扩展 SKIPPED 步骤状态,041 扩展编排命令幂等回执类型。完整 SQL、数据库设计与接口文档同步更新;其他环境需先执行增量再更新服务。

040 执行记录与原约束 · 041 执行记录与原约束

外部事件本轮通过教员页面及授权 HTTP 接口验证,未连接现场真实设备;故障状态用于服务端流程判定,不能据此宣称已完成真实设备故障模拟。普通教员预览沿用连续步骤预演接口,高级分支验收在真实学员运行中完成。

保留的验收数据

最新正式考试:任务 ${fixture.assignmentId} / 运行 ${fixture.runId}(86 分);截止时间测试:任务 ${fixture.deadlineAssignmentId} / 运行 ${fixture.deadlineRunId};高级编排:任务 ${flowFixture.assignmentId} / 运行 ${flowFixture.runId}(91 分)。

已停用 ${cleanup.disabledTestUserIds.length} 个不用的临时测试账号,保留最新 ${cleanup.retainedTestUserIds.length} 个验收账号。过程记录、失败重试记录与历史任务保留供审计和复查,未为了清理而补造评定。

完整测试数据清单 · 账号清理结果

页面证据

${screenshots.map(([file,label])=>`
${escape(label)}
${escape(label)}
`).join('')}
`; fs.writeFileSync(path.join(root,'index.html'),html); console.log('Report written:',root,';',checks.length,'live checks passed');