You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

635 rivejä
43 KiB

  1. {
  2. "title": "实装实训与对抗训练真实流程测试",
  3. "startedAt": "2026-09-05T15:37:32.805Z",
  4. "status": "PASS_WITH_LIMITATIONS",
  5. "checks": [
  6. {
  7. "title": "实装:创建、绑定牛奶卡车、3步配置、保存重开与发布",
  8. "status": "PASS",
  9. "screenshots": [
  10. "screenshots/physical-settings-reopen.png",
  11. "screenshots/physical-authoring.png",
  12. "screenshots/physical-preflight.png",
  13. "screenshots/physical-published.png"
  14. ],
  15. "details": {
  16. "id": "163",
  17. "version": "215",
  18. "progress": [
  19. 33,
  20. 67,
  21. 100
  22. ],
  23. "profile": {
  24. "type": "PHYSICAL",
  25. "stationName": "牛奶卡车测试工位 A",
  26. "equipmentCode": "E2E-TRUCK-163",
  27. "gatewayProtocol": "HTTP 测试网关",
  28. "sensorChannels": "人工外观确认;测试状态点位",
  29. "safetyInterlocks": "测试工位隔离确认"
  30. }
  31. }
  32. },
  33. {
  34. "title": "对抗:每队人数为小数时阻止发布",
  35. "status": "PASS",
  36. "screenshots": [
  37. "screenshots/confrontation-invalid-team-size.png"
  38. ],
  39. "details": {
  40. "input": 2.5,
  41. "message": "发布校验未通过\n×\n发现 1 个必须处理的问题\n\n2 个步骤 · 1 个目标 · 0 个故障 · 及格线 80 分\n\n!\n每队人数必须是 1 到 200 的整数\nmodeConfig.teamSize\ni\n本步骤尚未配置必选安全前置条件\nsteps[0].safetyRules\ni\n本步骤尚未配置必选安全前置条件\nsteps[1].safetyRules\ni\n尚未绑定离线讲解文件,运行时将保留字幕并使用默认本地语音\nsteps.audio\n关闭"
  42. }
  43. },
  44. {
  45. "title": "对抗:显式清空岗位后保存重开,不恢复默认授权",
  46. "status": "PASS",
  47. "screenshots": [
  48. "screenshots/confrontation-empty-positions.png"
  49. ],
  50. "details": {
  51. "allowedPositions": [
  52. ],
  53. "published": false
  54. }
  55. },
  56. {
  57. "title": "对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布",
  58. "status": "PASS",
  59. "screenshots": [
  60. "screenshots/confrontation-positions.png",
  61. "screenshots/confrontation-settings-reopen.png",
  62. "screenshots/confrontation-authoring.png",
  63. "screenshots/confrontation-preflight.png",
  64. "screenshots/confrontation-published.png"
  65. ],
  66. "details": {
  67. "id": "164",
  68. "version": "216",
  69. "profile": {
  70. "type": "CONFRONTATION",
  71. "redTeamName": "狐狸巡检红队",
  72. "blueTeamName": "狐狸巡检蓝队",
  73. "teamSize": 2,
  74. "roundDurationMinutes": 7,
  75. "objective": "两队分别完成狐狸模型巡检并确认状态",
  76. "winRule": "按已完成步骤与协同检查结果评分",
  77. "submitPositions": [
  78. "COMMANDER"
  79. ],
  80. "roundDuration": 7,
  81. "eventInjections": ""
  82. },
  83. "steps": [
  84. {
  85. "title": "识别狐狸巡检目标",
  86. "summary": "红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。",
  87. "allowedPositions": [
  88. "COMMANDER"
  89. ]
  90. },
  91. {
  92. "title": "完成狐狸状态检查",
  93. "summary": "由指挥员完成状态确认,操作员协同观察;提交团队检查结果。",
  94. "allowedPositions": [
  95. "COMMANDER"
  96. ]
  97. }
  98. ]
  99. }
  100. },
  101. {
  102. "title": "实装:说明兼容修复回写,重新截图封面及发布",
  103. "status": "PASS",
  104. "screenshots": [
  105. "screenshots/physical-final-published.png"
  106. ],
  107. "details": {
  108. "projectId": "163",
  109. "publishedVersionId": "217",
  110. "apiTestVersionId": "215",
  111. "note": "既有任务50固定215;本次仅回填说明与更新截图封面,未改写任务快照。",
  112. "steps": [
  113. {
  114. "stepCode": "PHYSICAL-S01",
  115. "actionCode": "PHYSICAL-A01",
  116. "summary": "核对测试工位与牛奶卡车编号。",
  117. "physicalEventRule": {
  118. "source": "MANUAL",
  119. "eventType": "step.physical-s01.confirmed",
  120. "progressPercent": 33,
  121. "manualConfirmAllowed": true
  122. }
  123. },
  124. {
  125. "stepCode": "PHYSICAL-S02",
  126. "actionCode": "PHYSICAL-A02",
  127. "summary": "人工确认卡车外观状态,使用受控事件记录检查。",
  128. "physicalEventRule": {
  129. "source": "MANUAL",
  130. "eventType": "step.physical-s02.confirmed",
  131. "progressPercent": 67,
  132. "manualConfirmAllowed": true
  133. }
  134. },
  135. {
  136. "stepCode": "PHYSICAL-S03",
  137. "actionCode": "PHYSICAL-A03",
  138. "summary": "核实步骤记录并提交检查结果。",
  139. "physicalEventRule": {
  140. "source": "MANUAL",
  141. "eventType": "step.physical-s03.confirmed",
  142. "progressPercent": 100,
  143. "manualConfirmAllowed": true
  144. }
  145. }
  146. ]
  147. }
  148. },
  149. {
  150. "title": "实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤",
  151. "status": "BLOCKED",
  152. "screenshots": [
  153. "screenshots/physical-teaching-list.png",
  154. "screenshots/physical-offline-preview.png",
  155. "screenshots/physical-offline-confirmed.png"
  156. ],
  157. "details": {
  158. "assignmentId": "50",
  159. "previewUrl": "/teaching/physical-training/preview/50",
  160. "observed": "进入任务后仍显示固定45秒维修识别录像,确认只改变本次页面候选,未加载卡车三步正式运行。",
  161. "businessWrites": [
  162. ],
  163. "required": "需将正式任务快照、场景、人工/设备事件及运行记录接入工作台。"
  164. }
  165. },
  166. {
  167. "title": "对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练",
  168. "status": "BLOCKED",
  169. "screenshots": [
  170. "screenshots/confrontation-final-entry.png",
  171. "screenshots/confrontation-final-local-create.png"
  172. ],
  173. "details": {
  174. "options": [
  175. "桥梁架设装备液压系统检测与维修训练"
  176. ],
  177. "formalAssignmentId": "51",
  178. "formalAssignmentExists": true,
  179. "required": "需将默认任务清单、创建表单和执行入口接入正式对抗任务服务,并确认通用巡检与五阶段排故的适用范围。"
  180. }
  181. },
  182. {
  183. "title": "训练列表两种模式展示各自真实截图封面",
  184. "status": "PASS",
  185. "screenshots": [
  186. "screenshots/physical-list-cover.png",
  187. "screenshots/confrontation-list-cover.png"
  188. ],
  189. "details": {
  190. "projects": [
  191. "163",
  192. "164"
  193. ],
  194. "authenticatedImagesLoaded": true
  195. }
  196. },
  197. {
  198. "title": "牛奶卡车实装检查:发布重开、模型实际可见、截图封面",
  199. "status": "PASS",
  200. "screenshots": [
  201. "screenshots/physical-independent-reopen.png",
  202. "screenshots/physical-independent-settings.png",
  203. "screenshots/physical-final-cover.jpg"
  204. ],
  205. "details": {
  206. "state": "ready",
  207. "meshes": 5,
  208. "visibleMeshes": 5,
  209. "skinnedMeshes": 0,
  210. "position": [
  211. 4.2,
  212. 0.20617168998977797,
  213. -0.4356763541543951
  214. ],
  215. "scale": [
  216. 1.2323086149245381,
  217. 1.2323086149245381,
  218. 1.2323086149245381
  219. ],
  220. "finiteBounds": true,
  221. "size": [
  222. 3.4406057210321332,
  223. 3.390913184034896,
  224. 6.000000000000001
  225. ],
  226. "camera": {
  227. "position": [
  228. 10.565439077211714,
  229. 5.0456876852867705,
  230. 7.37050840519251
  231. ],
  232. "target": [
  233. 4.2,
  234. 1.695456592017448,
  235. 0
  236. ]
  237. },
  238. "sample": {
  239. "width": 320,
  240. "height": 180,
  241. "changedPixels": 11669
  242. },
  243. "scene": {
  244. "projectId": "159",
  245. "versionId": "209"
  246. },
  247. "targets": [
  248. {
  249. "id": "scene:OBJ-1788605199171-2",
  250. "name": "牛奶卡车检验主装备",
  251. "source": "scene"
  252. },
  253. {
  254. "id": "scene:OBJ-1788605199171-2/part/interaction-1ba581e6",
  255. "name": "Yup2Zup",
  256. "source": "scene"
  257. },
  258. {
  259. "id": "scene:OBJ-1788605199171-2/part/interaction-004dec41",
  260. "name": "Cesium_Milk_Truck",
  261. "source": "scene"
  262. },
  263. {
  264. "id": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee",
  265. "name": "Cesium_Milk_Truck_1",
  266. "source": "scene"
  267. },
  268. {
  269. "id": "scene:OBJ-1788605199171-2/part/interaction-607e4d81",
  270. "name": "Cesium_Milk_Truck_2",
  271. "source": "scene"
  272. },
  273. {
  274. "id": "scene:OBJ-1788605199171-2/part/interaction-5d7e48c8",
  275. "name": "Cesium_Milk_Truck_3",
  276. "source": "scene"
  277. },
  278. {
  279. "id": "scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b",
  280. "name": "Node",
  281. "source": "scene"
  282. },
  283. {
  284. "id": "scene:OBJ-1788605199171-2/part/interaction-ce2feac4",
  285. "name": "Wheels",
  286. "source": "scene"
  287. },
  288. {
  289. "id": "scene:OBJ-1788605199171-2/part/interaction-637e523a",
  290. "name": "Node001",
  291. "source": "scene"
  292. },
  293. {
  294. "id": "scene:OBJ-1788605199171-2/part/interaction-f417f82d",
  295. "name": "Wheels001",
  296. "source": "scene"
  297. }
  298. ],
  299. "steps": [
  300. {
  301. "title": "核对卡车工位与装备",
  302. "targetId": "scene:OBJ-1788605199171-2",
  303. "weight": 30
  304. },
  305. {
  306. "title": "检查卡车外观状态",
  307. "targetId": "scene:OBJ-1788605199171-2",
  308. "weight": 30
  309. },
  310. {
  311. "title": "确认检查完成",
  312. "targetId": "scene:OBJ-1788605199171-2",
  313. "weight": 40
  314. }
  315. ],
  316. "cover": {
  317. "assetId": "2111",
  318. "bytes": 42163,
  319. "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4",
  320. "width": 628,
  321. "height": 640
  322. },
  323. "pageErrors": [
  324. ],
  325. "blockedWrites": [
  326. ]
  327. }
  328. },
  329. {
  330. "title": "狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面",
  331. "status": "PASS",
  332. "screenshots": [
  333. "screenshots/confrontation-independent-reopen.png",
  334. "screenshots/confrontation-independent-settings.png",
  335. "screenshots/confrontation-final-cover.jpg"
  336. ],
  337. "details": {
  338. "state": "ready",
  339. "meshes": 1,
  340. "visibleMeshes": 1,
  341. "skinnedMeshes": 1,
  342. "position": [
  343. -7.5,
  344. 0.10930174852949677,
  345. 0.3440109341705351
  346. ],
  347. "scale": [
  348. 0.03616375932570189,
  349. 0.03616375932570189,
  350. 0.03616375932570189
  351. ],
  352. "finiteBounds": true,
  353. "size": [
  354. 0.9658796100519353,
  355. 2.811899945787403,
  356. 6
  357. ],
  358. "camera": {
  359. "position": [
  360. -0.04179225073787585,
  361. 6.099634646023559,
  362. 17.355036987378313
  363. ],
  364. "target": [
  365. -7.512232860974557,
  366. 1.4059499759307126,
  367. -2.2204460492503126E-16
  368. ]
  369. },
  370. "sample": {
  371. "width": 320,
  372. "height": 180,
  373. "changedPixels": 827
  374. },
  375. "scene": {
  376. "projectId": "160",
  377. "versionId": "210"
  378. },
  379. "targets": [
  380. {
  381. "id": "scene:OBJ-1788605873329-2",
  382. "name": "维修装备主体 02",
  383. "source": "scene"
  384. },
  385. {
  386. "id": "scene:OBJ-1788605916565-6",
  387. "name": "狐狸野外巡检目标",
  388. "source": "scene"
  389. },
  390. {
  391. "id": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26",
  392. "name": "fox",
  393. "source": "scene"
  394. }
  395. ],
  396. "steps": [
  397. {
  398. "title": "识别狐狸巡检目标",
  399. "targetId": "scene:OBJ-1788605916565-6",
  400. "weight": 50
  401. },
  402. {
  403. "title": "完成狐狸状态检查",
  404. "targetId": "scene:OBJ-1788605916565-6",
  405. "weight": 50
  406. }
  407. ],
  408. "cover": {
  409. "assetId": "2108",
  410. "bytes": 51257,
  411. "sha256": "79779a9d1e40c0c160fa3dab25e83931639942f53e2ee3a5da12f9f86ad70081",
  412. "width": 628,
  413. "height": 640
  414. },
  415. "pageErrors": [
  416. ],
  417. "blockedWrites": [
  418. ]
  419. }
  420. }
  421. ],
  422. "projects": [
  423. {
  424. "id": "163",
  425. "name": "实测训练-牛奶卡车实装检查-20260905",
  426. "mode": "PHYSICAL",
  427. "status": "PUBLISHED",
  428. "currentVersionId": "217",
  429. "publishedVersionId": "217",
  430. "sceneProjectId": "159",
  431. "sceneVersionId": "209",
  432. "stepCount": 3,
  433. "totalScore": 100,
  434. "cover": {
  435. "assetId": "2111",
  436. "image": "screenshots/physical-final-cover.jpg"
  437. },
  438. "trainingMode": "PHYSICAL",
  439. "modeConfig": {
  440. "type": "PHYSICAL",
  441. "stationName": "牛奶卡车测试工位 A",
  442. "equipmentCode": "E2E-TRUCK-163",
  443. "gatewayProtocol": "HTTP 测试网关",
  444. "sensorChannels": "人工外观确认;测试状态点位",
  445. "safetyInterlocks": "测试工位隔离确认"
  446. },
  447. "steps": [
  448. {
  449. "stepCode": "PHYSICAL-S01",
  450. "actionCode": "PHYSICAL-A01",
  451. "title": "核对卡车工位与装备",
  452. "summary": "核对测试工位与牛奶卡车编号。",
  453. "targetId": "scene:OBJ-1788605199171-2",
  454. "allowedPositions": [
  455. ],
  456. "physicalEventRule": {
  457. "source": "MANUAL",
  458. "eventType": "step.physical-s01.confirmed",
  459. "progressPercent": 33,
  460. "manualConfirmAllowed": true
  461. },
  462. "score": 30
  463. },
  464. {
  465. "stepCode": "PHYSICAL-S02",
  466. "actionCode": "PHYSICAL-A02",
  467. "title": "检查卡车外观状态",
  468. "summary": "人工确认卡车外观状态,使用受控事件记录检查。",
  469. "targetId": "scene:OBJ-1788605199171-2",
  470. "allowedPositions": [
  471. ],
  472. "physicalEventRule": {
  473. "source": "MANUAL",
  474. "eventType": "step.physical-s02.confirmed",
  475. "progressPercent": 67,
  476. "manualConfirmAllowed": true
  477. },
  478. "score": 30
  479. },
  480. {
  481. "stepCode": "PHYSICAL-S03",
  482. "actionCode": "PHYSICAL-A03",
  483. "title": "确认检查完成",
  484. "summary": "核实步骤记录并提交检查结果。",
  485. "targetId": "scene:OBJ-1788605199171-2",
  486. "allowedPositions": [
  487. ],
  488. "physicalEventRule": {
  489. "source": "MANUAL",
  490. "eventType": "step.physical-s03.confirmed",
  491. "progressPercent": 100,
  492. "manualConfirmAllowed": true
  493. },
  494. "score": 40
  495. }
  496. ],
  497. "apiTestVersionId": "215",
  498. "apiVersionNote": "API任务50固定215;说明字段兼容修复后在217做UI及封面回归,未改写任务快照。"
  499. },
  500. {
  501. "id": "164",
  502. "name": "实测训练-狐狸红蓝协同巡检-20260905",
  503. "mode": "CONFRONTATION",
  504. "status": "PUBLISHED",
  505. "currentVersionId": "216",
  506. "publishedVersionId": "216",
  507. "sceneProjectId": "160",
  508. "sceneVersionId": "210",
  509. "stepCount": 2,
  510. "totalScore": 100,
  511. "cover": {
  512. "assetId": "2108",
  513. "image": "screenshots/confrontation-final-cover.jpg"
  514. },
  515. "trainingMode": "CONFRONTATION",
  516. "modeConfig": {
  517. "type": "CONFRONTATION",
  518. "redTeamName": "狐狸巡检红队",
  519. "blueTeamName": "狐狸巡检蓝队",
  520. "teamSize": 2,
  521. "roundDurationMinutes": 7,
  522. "objective": "两队分别完成狐狸模型巡检并确认状态",
  523. "winRule": "按已完成步骤与协同检查结果评分",
  524. "submitPositions": [
  525. "COMMANDER"
  526. ],
  527. "roundDuration": 7,
  528. "eventInjections": ""
  529. },
  530. "steps": [
  531. {
  532. "stepCode": "CONFRONTATION-S01",
  533. "actionCode": "CONFRONTATION-A01",
  534. "title": "识别狐狸巡检目标",
  535. "summary": "红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。",
  536. "targetId": "scene:OBJ-1788605916565-6",
  537. "allowedPositions": [
  538. "COMMANDER"
  539. ],
  540. "physicalEventRule": {
  541. },
  542. "score": 50
  543. },
  544. {
  545. "stepCode": "CONFRONTATION-S02",
  546. "actionCode": "CONFRONTATION-A02",
  547. "title": "完成狐狸状态检查",
  548. "summary": "由指挥员完成状态确认,操作员协同观察;提交团队检查结果。",
  549. "targetId": "scene:OBJ-1788605916565-6",
  550. "allowedPositions": [
  551. "COMMANDER"
  552. ],
  553. "physicalEventRule": {
  554. },
  555. "score": 50
  556. }
  557. ],
  558. "apiTestVersionId": "216"
  559. }
  560. ],
  561. "bugs": [
  562. ],
  563. "limitations": [
  564. "实装为MANUAL人工事件合同测试,没有接真实PLC、摄像头、视觉识别服务或安全联锁设备。",
  565. "两步狐狸巡检用于通用步骤与红蓝岗位合同,不是需要CONF-INSPECT等五个固定编码的完整排故作业;未宣称排故工作台阶段回写已打通。",
  566. "对抗验证服务端设置了7分钟截止时刻,未等待自然超时触发;未把API账号请求视为多人跨浏览器实时协同UI测试。",
  567. "牛奶卡车沿用原发布场景的视角,车间立柱遮挡部分车身;真实模型已渲染且封面来自该视口。",
  568. "实装当前发布217仅回填兼容说明并更新封面;已完成教学任务50仍固定不可变版本215。",
  569. "历史仅positionActions设置动作岗位的定义在教学读取侧与当前发布预检存在口径差异;本次按现有发布规则配置非空allowedPositions,未改后端岗位合同。",
  570. "开发环境列表切换曾出现一次15秒超时,刷新后恢复;独立复测两种模式共6次查询均HTTP 200、耗时247–403ms,未复现稳定慢查询。详见list-api-latency.json。"
  571. ],
  572. "pageErrors": [
  573. ],
  574. "development": [
  575. "修复模式配置被旧channelProfiles覆盖,保持默认profile与modeConfig一致;对抗分钟/秒及旧roundDuration兼容。",
  576. "保留显式空配置文本;每队人数范围与服务端1–200一致,无效数字阻止发布,不静默夹断。",
  577. "保留步骤设备事件、人工确认、岗位与运行编码;增删排序后重新计算严格递增进度。",
  578. "修复复制步骤编码冲突(含大小写),复制动作岗位映射随新动作编码迁移。",
  579. "显式清空allowedPositions不再补回默认三岗位,保持权限边界并交由正式发布校验阻断。",
  580. "修复instruction/summary双界面操作说明丢失及显式空提示恢复演示内容;用户实际编辑时同步。",
  581. "正式targetId优先,目标选择同步语义引用、节点与动作,防止旧targetRef把新目标回退。",
  582. "沿用上轮训练3D视口截图方案:受控TRAINING_COVER上传、同次保存资产与内容,保存/发布后列表正确显示截图。",
  583. "本次均为正式工程合同适配与bugfix,未新增数据库字段、执行DDL或更改原型业务流程;测试数据通过开发API创建。"
  584. ],
  585. "commands": [
  586. {
  587. "command": "pnpm run build",
  588. "status": "PASS",
  589. "details": "vue-tsc、Vite构建和legacy iframe分发校验均通过;仅已有包体积提示。"
  590. },
  591. {
  592. "command": "node --test tools/training-*.test.mjs(本次8个聚焦文件)",
  593. "status": "PASS",
  594. "details": "94/94通过,涵盖封面、场景、真实模型、目标、元数据、模式与步骤兼容。"
  595. },
  596. {
  597. "command": "pnpm run test:training-legacy",
  598. "status": "PASS",
  599. "details": "两项既有训练/地形合同检查通过。"
  600. },
  601. {
  602. "command": "content-training-studio.spec.ts / Edge",
  603. "status": "PASS",
  604. "details": "7/7通过(mock API的工作台回归),无跳过、无不稳定用例,独立报告studio-regression/html/index.html。"
  605. },
  606. {
  607. "command": "UTE2E_TRAINING_MODES=1 UTE2E_BASE_URL=http://192.168.31.168:6180 node tools/training-scene-visibility.e2e.mjs",
  608. "status": "PASS",
  609. "details": "独立Edge会话2/2通过,真实LAN服务、禁止业务写请求;模型可见像素差、固定场景依赖、JPEG尺寸与SHA-256全部通过。"
  610. },
  611. {
  612. "command": "node tools/training-modes-api-live.mjs(163:215;164:216)",
  613. "status": "PASS",
  614. "details": "18/18检查组通过,90次正式教学API请求;含训练/场景/模型固定快照只读复核,详见api-evidence.json。"
  615. }
  616. ],
  617. "confirmationItems": [
  618. "将实装工作台从固定离线识别回放扩展为读取正式任务、已发布场景和步骤,并接入人工/设备事件、提交与结果。",
  619. "将对抗默认入口从本地预设任务接入正式任务清单、创建和执行链路;确认通用巡检步骤与五阶段排故工作台的适用范围。"
  620. ],
  621. "finishedAt": "2026-09-05T15:58:39.239Z"
  622. }