Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 

1178 рядки
29 KiB

  1. {
  2. "title": "实装人工事件与红蓝对抗正式 API 闭环",
  3. "status": "PASS",
  4. "startedAt": "2026-09-05T15:48:46.342Z",
  5. "baseURL": "http://127.0.0.1:6180",
  6. "method": "真实 Auth / Gateway / Tran API;新建隔离学生与开发测试任务;不连接设备、视觉推理或外部通知。",
  7. "references": {
  8. "PHYSICAL": {
  9. "projectId": "163",
  10. "versionId": "215"
  11. },
  12. "CONFRONTATION": {
  13. "projectId": "164",
  14. "versionId": "216"
  15. }
  16. },
  17. "checks": [
  18. {
  19. "title": "开始命令重放不会重复激活或递增次数",
  20. "status": "PASS",
  21. "details": {
  22. "runId": "44",
  23. "version": 2,
  24. "attemptCount": 1
  25. }
  26. },
  27. {
  28. "title": "实装任务固定发布版本、分配学员并开始",
  29. "status": "PASS",
  30. "details": {
  31. "assignmentId": "50",
  32. "run": {
  33. "id": "44",
  34. "assignmentId": "50",
  35. "status": "IN_PROGRESS",
  36. "version": 2,
  37. "progressPercent": 0,
  38. "currentStepCode": "PHYSICAL-S01",
  39. "score": null,
  40. "passed": null
  41. },
  42. "content": {
  43. "projectId": "163",
  44. "versionId": "215"
  45. },
  46. "rules": [
  47. {
  48. "stepCode": "PHYSICAL-S01",
  49. "source": "MANUAL",
  50. "eventType": "step.physical-s01.confirmed",
  51. "progressPercent": 33
  52. },
  53. {
  54. "stepCode": "PHYSICAL-S02",
  55. "source": "MANUAL",
  56. "eventType": "step.physical-s02.confirmed",
  57. "progressPercent": 67
  58. },
  59. {
  60. "stepCode": "PHYSICAL-S03",
  61. "source": "MANUAL",
  62. "eventType": "step.physical-s03.confirmed",
  63. "progressPercent": 100
  64. }
  65. ]
  66. }
  67. },
  68. {
  69. "title": "实装拒绝普通进度接口、抢跑、提前提交及错误事件身份",
  70. "status": "PASS",
  71. "details": {
  72. "runId": "44",
  73. "forbiddenProgress": {
  74. "status": 403,
  75. "message": "实装运行只能由设备、视觉或人工确认事件推进"
  76. },
  77. "prematureSubmit": {
  78. "status": 409,
  79. "message": "训练步骤尚未全部完成,不能提交"
  80. },
  81. "skipped": {
  82. "status": 409,
  83. "message": "物理事件必须匹配当前待完成步骤,不能跳步或回退"
  84. },
  85. "untrustedDevice": {
  86. "status": 403,
  87. "message": "无权执行此操作"
  88. },
  89. "managerManual": {
  90. "status": 403,
  91. "message": "当前学员不是该运行成员"
  92. },
  93. "progressUnchanged": 0
  94. }
  95. },
  96. {
  97. "title": "实装不匹配事件失败,必须重试后才可继续",
  98. "status": "PASS",
  99. "details": {
  100. "runId": "44",
  101. "outcome": "UNMATCHED",
  102. "beforeRetry": {
  103. "status": 409,
  104. "message": "实装步骤失败后必须先重试,完成后不能再次推进"
  105. },
  106. "facts": [
  107. {
  108. "stepCode": "PHYSICAL-S01",
  109. "status": "IN_PROGRESS",
  110. "targetProgressPercent": 33,
  111. "attemptCount": 2,
  112. "failureCount": 1,
  113. "evidenceSourceCode": "COMMAND"
  114. },
  115. {
  116. "stepCode": "PHYSICAL-S02",
  117. "status": "PENDING",
  118. "targetProgressPercent": 67,
  119. "attemptCount": 0,
  120. "failureCount": 0,
  121. "evidenceSourceCode": "NONE"
  122. },
  123. {
  124. "stepCode": "PHYSICAL-S03",
  125. "status": "PENDING",
  126. "targetProgressPercent": 100,
  127. "attemptCount": 0,
  128. "failureCount": 0,
  129. "evidenceSourceCode": "NONE"
  130. }
  131. ]
  132. }
  133. },
  134. {
  135. "title": "实装逐步人工确认、事件幂等与载荷冲突",
  136. "status": "PASS",
  137. "details": {
  138. "runId": "44",
  139. "progression": [
  140. {
  141. "stepCode": "PHYSICAL-S01",
  142. "eventId": "MANUAL-FF103EF3-B498-4EAC-8F06-42DE46CC9CE4",
  143. "progress": 33,
  144. "replayVersion": 5,
  145. "alteredEventStatus": 409
  146. },
  147. {
  148. "stepCode": "PHYSICAL-S02",
  149. "eventId": "MANUAL-9D8A36B7-C161-4736-A71E-D1700E55216B",
  150. "progress": 67,
  151. "replayVersion": 6,
  152. "alteredEventStatus": 409
  153. },
  154. {
  155. "stepCode": "PHYSICAL-S03",
  156. "eventId": "MANUAL-1D1ADE8F-D32B-434B-A7D8-A2571E502137",
  157. "progress": 100,
  158. "replayVersion": 7,
  159. "alteredEventStatus": 409
  160. }
  161. ],
  162. "facts": [
  163. {
  164. "stepCode": "PHYSICAL-S01",
  165. "status": "COMPLETED",
  166. "targetProgressPercent": 33,
  167. "attemptCount": 2,
  168. "failureCount": 1,
  169. "evidenceSourceCode": "MANUAL"
  170. },
  171. {
  172. "stepCode": "PHYSICAL-S02",
  173. "status": "COMPLETED",
  174. "targetProgressPercent": 67,
  175. "attemptCount": 1,
  176. "failureCount": 0,
  177. "evidenceSourceCode": "MANUAL"
  178. },
  179. {
  180. "stepCode": "PHYSICAL-S03",
  181. "status": "COMPLETED",
  182. "targetProgressPercent": 100,
  183. "attemptCount": 1,
  184. "failureCount": 0,
  185. "evidenceSourceCode": "MANUAL"
  186. }
  187. ]
  188. }
  189. },
  190. {
  191. "title": "PHYSICAL 提交、教员评定与结果回读",
  192. "status": "PASS",
  193. "details": {
  194. "run": {
  195. "id": "44",
  196. "assignmentId": "50",
  197. "status": "REVIEWED",
  198. "version": 9,
  199. "progressPercent": 100,
  200. "currentStepCode": "PHYSICAL-S03",
  201. "score": 100,
  202. "passed": true
  203. },
  204. "submitReplay": true,
  205. "reviewReplay": true,
  206. "facts": [
  207. {
  208. "stepCode": "PHYSICAL-S01",
  209. "status": "COMPLETED",
  210. "targetProgressPercent": 33,
  211. "attemptCount": 2,
  212. "failureCount": 1,
  213. "evidenceSourceCode": "MANUAL"
  214. },
  215. {
  216. "stepCode": "PHYSICAL-S02",
  217. "status": "COMPLETED",
  218. "targetProgressPercent": 67,
  219. "attemptCount": 1,
  220. "failureCount": 0,
  221. "evidenceSourceCode": "MANUAL"
  222. },
  223. {
  224. "stepCode": "PHYSICAL-S03",
  225. "status": "COMPLETED",
  226. "targetProgressPercent": 100,
  227. "attemptCount": 1,
  228. "failureCount": 0,
  229. "evidenceSourceCode": "MANUAL"
  230. }
  231. ]
  232. }
  233. },
  234. {
  235. "title": "对抗红蓝两队各两人,按队伍共享且运行互相独立",
  236. "status": "PASS",
  237. "details": {
  238. "assignmentId": "51",
  239. "content": {
  240. "projectId": "164",
  241. "versionId": "216"
  242. },
  243. "configuration": {
  244. "teamSize": 2,
  245. "roundDurationMinutes": 7,
  246. "submitPositions": [
  247. "COMMANDER"
  248. ]
  249. },
  250. "runs": [
  251. {
  252. "id": "46",
  253. "assignmentId": "51",
  254. "status": "ACCEPTED",
  255. "version": 1,
  256. "progressPercent": 0,
  257. "currentStepCode": "",
  258. "score": null,
  259. "passed": null
  260. },
  261. {
  262. "id": "45",
  263. "assignmentId": "51",
  264. "status": "ACCEPTED",
  265. "version": 1,
  266. "progressPercent": 0,
  267. "currentStepCode": "",
  268. "score": null,
  269. "passed": null
  270. }
  271. ]
  272. }
  273. },
  274. {
  275. "title": "对抗学员不能读取另一队运行明细",
  276. "status": "PASS",
  277. "details": {
  278. "requestingTeam": "RED",
  279. "otherRunId": "46",
  280. "response": {
  281. "status": 403,
  282. "message": "无权查看该训练运行"
  283. }
  284. }
  285. },
  286. {
  287. "title": "开始命令重放不会重复激活或递增次数",
  288. "status": "PASS",
  289. "details": {
  290. "runId": "45",
  291. "version": 2,
  292. "attemptCount": 1
  293. }
  294. },
  295. {
  296. "title": "RED 队岗位越权、跳步和提前提交均拒绝",
  297. "status": "PASS",
  298. "details": {
  299. "runId": "45",
  300. "wrongPosition": {
  301. "status": 403,
  302. "message": "当前岗位不能推进共享训练进度"
  303. },
  304. "skipped": {
  305. "status": 400,
  306. "message": "必须按发布顺序完成当前步骤,不能跳步或回退"
  307. },
  308. "earlySubmit": {
  309. "status": 409,
  310. "message": "训练步骤尚未全部完成,不能提交"
  311. },
  312. "deadlineAt": 1788623936,
  313. "serverNow": 1788623517
  314. }
  315. },
  316. {
  317. "title": "RED 队授权动作逐步推进、重放幂等、提交负责人限制",
  318. "status": "PASS",
  319. "details": {
  320. "runId": "45",
  321. "progression": [
  322. {
  323. "stepCode": "CONFRONTATION-S01",
  324. "progress": 50,
  325. "replayVersion": 3,
  326. "changedCommandStatus": 409
  327. },
  328. {
  329. "stepCode": "CONFRONTATION-S02",
  330. "progress": 100,
  331. "replayVersion": 4,
  332. "changedCommandStatus": 409
  333. }
  334. ],
  335. "wrongSubmitPosition": {
  336. "status": 403,
  337. "message": "共享训练仅允许任务声明的负责人岗位提交结果"
  338. }
  339. }
  340. },
  341. {
  342. "title": "CONFRONTATION 提交、教员评定与结果回读",
  343. "status": "PASS",
  344. "details": {
  345. "run": {
  346. "id": "45",
  347. "assignmentId": "51",
  348. "status": "REVIEWED",
  349. "version": 6,
  350. "progressPercent": 100,
  351. "currentStepCode": "CONFRONTATION-S02",
  352. "score": 100,
  353. "passed": true
  354. },
  355. "submitReplay": true,
  356. "reviewReplay": true,
  357. "facts": [
  358. {
  359. "stepCode": "CONFRONTATION-S01",
  360. "status": "COMPLETED",
  361. "targetProgressPercent": 50,
  362. "attemptCount": 1,
  363. "failureCount": 0,
  364. "evidenceSourceCode": "COMMAND"
  365. },
  366. {
  367. "stepCode": "CONFRONTATION-S02",
  368. "status": "COMPLETED",
  369. "targetProgressPercent": 100,
  370. "attemptCount": 1,
  371. "failureCount": 0,
  372. "evidenceSourceCode": "COMMAND"
  373. }
  374. ]
  375. }
  376. },
  377. {
  378. "title": "红队完成不会推进蓝队进度",
  379. "status": "PASS",
  380. "details": {
  381. "redRunId": "45",
  382. "blueRun": {
  383. "id": "46",
  384. "assignmentId": "51",
  385. "status": "ACCEPTED",
  386. "version": 1,
  387. "progressPercent": 0,
  388. "currentStepCode": "",
  389. "score": null,
  390. "passed": null
  391. }
  392. }
  393. },
  394. {
  395. "title": "开始命令重放不会重复激活或递增次数",
  396. "status": "PASS",
  397. "details": {
  398. "runId": "46",
  399. "version": 2,
  400. "attemptCount": 1
  401. }
  402. },
  403. {
  404. "title": "BLUE 队岗位越权、跳步和提前提交均拒绝",
  405. "status": "PASS",
  406. "details": {
  407. "runId": "46",
  408. "wrongPosition": {
  409. "status": 403,
  410. "message": "当前岗位不能推进共享训练进度"
  411. },
  412. "skipped": {
  413. "status": 400,
  414. "message": "必须按发布顺序完成当前步骤,不能跳步或回退"
  415. },
  416. "earlySubmit": {
  417. "status": 409,
  418. "message": "训练步骤尚未全部完成,不能提交"
  419. },
  420. "deadlineAt": 1788623942,
  421. "serverNow": 1788623523
  422. }
  423. },
  424. {
  425. "title": "BLUE 队授权动作逐步推进、重放幂等、提交负责人限制",
  426. "status": "PASS",
  427. "details": {
  428. "runId": "46",
  429. "progression": [
  430. {
  431. "stepCode": "CONFRONTATION-S01",
  432. "progress": 50,
  433. "replayVersion": 3,
  434. "changedCommandStatus": 409
  435. },
  436. {
  437. "stepCode": "CONFRONTATION-S02",
  438. "progress": 100,
  439. "replayVersion": 4,
  440. "changedCommandStatus": 409
  441. }
  442. ],
  443. "wrongSubmitPosition": {
  444. "status": 403,
  445. "message": "共享训练仅允许任务声明的负责人岗位提交结果"
  446. }
  447. }
  448. },
  449. {
  450. "title": "CONFRONTATION 提交、教员评定与结果回读",
  451. "status": "PASS",
  452. "details": {
  453. "run": {
  454. "id": "46",
  455. "assignmentId": "51",
  456. "status": "REVIEWED",
  457. "version": 6,
  458. "progressPercent": 100,
  459. "currentStepCode": "CONFRONTATION-S02",
  460. "score": 100,
  461. "passed": true
  462. },
  463. "submitReplay": true,
  464. "reviewReplay": true,
  465. "facts": [
  466. {
  467. "stepCode": "CONFRONTATION-S01",
  468. "status": "COMPLETED",
  469. "targetProgressPercent": 50,
  470. "attemptCount": 1,
  471. "failureCount": 0,
  472. "evidenceSourceCode": "COMMAND"
  473. },
  474. {
  475. "stepCode": "CONFRONTATION-S02",
  476. "status": "COMPLETED",
  477. "targetProgressPercent": 100,
  478. "attemptCount": 1,
  479. "failureCount": 0,
  480. "evidenceSourceCode": "COMMAND"
  481. }
  482. ]
  483. }
  484. },
  485. {
  486. "title": "正式任务快照固定训练、场景与模型发布版本",
  487. "status": "PASS",
  488. "details": {
  489. "snapshots": [
  490. {
  491. "assignmentId": "50",
  492. "channel": "PHYSICAL",
  493. "content": {
  494. "projectId": "163",
  495. "versionId": "215"
  496. },
  497. "frozenScene": {
  498. "projectId": "159",
  499. "versionId": "209",
  500. "models": [
  501. {
  502. "projectId": "156",
  503. "versionId": "204",
  504. "assetCode": "MODEL_MTO6WI6K_08-CESIUMMILKTRUCK"
  505. }
  506. ]
  507. }
  508. },
  509. {
  510. "assignmentId": "51",
  511. "channel": "CONFRONTATION",
  512. "content": {
  513. "projectId": "164",
  514. "versionId": "216"
  515. },
  516. "frozenScene": {
  517. "projectId": "160",
  518. "versionId": "210",
  519. "models": [
  520. {
  521. "projectId": "157",
  522. "versionId": "201",
  523. "assetCode": "MODEL_MTO6V5W6_09-FOX"
  524. }
  525. ]
  526. }
  527. }
  528. ]
  529. }
  530. }
  531. ],
  532. "assignments": [
  533. {
  534. "id": "50",
  535. "code": "UTE2E-MODES-MTOK5BBA-PHYSICAL",
  536. "channel": "PHYSICAL",
  537. "contentProjectId": "163",
  538. "contentVersionId": "215",
  539. "status": "PUBLISHED",
  540. "version": 1,
  541. "frozenScene": {
  542. "projectId": "159",
  543. "versionId": "209",
  544. "models": [
  545. {
  546. "projectId": "156",
  547. "versionId": "204",
  548. "assetCode": "MODEL_MTO6WI6K_08-CESIUMMILKTRUCK"
  549. }
  550. ]
  551. }
  552. },
  553. {
  554. "id": "51",
  555. "code": "UTE2E-MODES-MTOK5BBA-CONFRONTATION",
  556. "channel": "CONFRONTATION",
  557. "contentProjectId": "164",
  558. "contentVersionId": "216",
  559. "status": "PUBLISHED",
  560. "version": 1,
  561. "frozenScene": {
  562. "projectId": "160",
  563. "versionId": "210",
  564. "models": [
  565. {
  566. "projectId": "157",
  567. "versionId": "201",
  568. "assetCode": "MODEL_MTO6V5W6_09-FOX"
  569. }
  570. ]
  571. }
  572. }
  573. ],
  574. "runs": [
  575. {
  576. "id": "44",
  577. "assignmentId": "50",
  578. "status": "REVIEWED",
  579. "version": 9,
  580. "progressPercent": 100,
  581. "currentStepCode": "PHYSICAL-S03",
  582. "score": 100,
  583. "passed": true,
  584. "channel": "PHYSICAL",
  585. "team": "NEUTRAL",
  586. "stepFacts": [
  587. {
  588. "stepCode": "PHYSICAL-S01",
  589. "status": "COMPLETED",
  590. "targetProgressPercent": 33,
  591. "attemptCount": 2,
  592. "failureCount": 1,
  593. "evidenceSourceCode": "MANUAL"
  594. },
  595. {
  596. "stepCode": "PHYSICAL-S02",
  597. "status": "COMPLETED",
  598. "targetProgressPercent": 67,
  599. "attemptCount": 1,
  600. "failureCount": 0,
  601. "evidenceSourceCode": "MANUAL"
  602. },
  603. {
  604. "stepCode": "PHYSICAL-S03",
  605. "status": "COMPLETED",
  606. "targetProgressPercent": 100,
  607. "attemptCount": 1,
  608. "failureCount": 0,
  609. "evidenceSourceCode": "MANUAL"
  610. }
  611. ]
  612. },
  613. {
  614. "id": "45",
  615. "assignmentId": "51",
  616. "status": "REVIEWED",
  617. "version": 6,
  618. "progressPercent": 100,
  619. "currentStepCode": "CONFRONTATION-S02",
  620. "score": 100,
  621. "passed": true,
  622. "channel": "CONFRONTATION",
  623. "team": "RED",
  624. "stepFacts": [
  625. {
  626. "stepCode": "CONFRONTATION-S01",
  627. "status": "COMPLETED",
  628. "targetProgressPercent": 50,
  629. "attemptCount": 1,
  630. "failureCount": 0,
  631. "evidenceSourceCode": "COMMAND"
  632. },
  633. {
  634. "stepCode": "CONFRONTATION-S02",
  635. "status": "COMPLETED",
  636. "targetProgressPercent": 100,
  637. "attemptCount": 1,
  638. "failureCount": 0,
  639. "evidenceSourceCode": "COMMAND"
  640. }
  641. ]
  642. },
  643. {
  644. "id": "46",
  645. "assignmentId": "51",
  646. "status": "REVIEWED",
  647. "version": 6,
  648. "progressPercent": 100,
  649. "currentStepCode": "CONFRONTATION-S02",
  650. "score": 100,
  651. "passed": true,
  652. "channel": "CONFRONTATION",
  653. "team": "BLUE",
  654. "stepFacts": [
  655. {
  656. "stepCode": "CONFRONTATION-S01",
  657. "status": "COMPLETED",
  658. "targetProgressPercent": 50,
  659. "attemptCount": 1,
  660. "failureCount": 0,
  661. "evidenceSourceCode": "COMMAND"
  662. },
  663. {
  664. "stepCode": "CONFRONTATION-S02",
  665. "status": "COMPLETED",
  666. "targetProgressPercent": 100,
  667. "attemptCount": 1,
  668. "failureCount": 0,
  669. "evidenceSourceCode": "COMMAND"
  670. }
  671. ]
  672. }
  673. ],
  674. "actors": [
  675. {
  676. "userId": "95",
  677. "team": "RED",
  678. "position": "COMMANDER",
  679. "departmentId": "5"
  680. },
  681. {
  682. "userId": "96",
  683. "team": "RED",
  684. "position": "OPERATOR",
  685. "departmentId": "5"
  686. },
  687. {
  688. "userId": "97",
  689. "team": "BLUE",
  690. "position": "COMMANDER",
  691. "departmentId": "5"
  692. },
  693. {
  694. "userId": "98",
  695. "team": "BLUE",
  696. "position": "OPERATOR",
  697. "departmentId": "5"
  698. }
  699. ],
  700. "requests": [
  701. {
  702. "method": "POST",
  703. "path": "/api/tran/v1/teaching/assignments",
  704. "status": 200
  705. },
  706. {
  707. "method": "POST",
  708. "path": "/api/tran/v1/teaching/assignments/50/publish",
  709. "status": 200
  710. },
  711. {
  712. "method": "POST",
  713. "path": "/api/tran/v1/teaching/assignments/50/accept",
  714. "status": 200
  715. },
  716. {
  717. "method": "POST",
  718. "path": "/api/tran/v1/teaching/runs/44/start",
  719. "status": 200
  720. },
  721. {
  722. "method": "POST",
  723. "path": "/api/tran/v1/teaching/runs/44/start",
  724. "status": 200
  725. },
  726. {
  727. "method": "GET",
  728. "path": "/api/tran/v1/teaching/runs/44/steps",
  729. "status": 200
  730. },
  731. {
  732. "method": "PUT",
  733. "path": "/api/tran/v1/teaching/runs/44/progress",
  734. "status": 403
  735. },
  736. {
  737. "method": "POST",
  738. "path": "/api/tran/v1/teaching/runs/44/submit",
  739. "status": 409
  740. },
  741. {
  742. "method": "POST",
  743. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  744. "status": 409
  745. },
  746. {
  747. "method": "POST",
  748. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  749. "status": 403
  750. },
  751. {
  752. "method": "POST",
  753. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  754. "status": 403
  755. },
  756. {
  757. "method": "GET",
  758. "path": "/api/tran/v1/teaching/runs/44",
  759. "status": 200
  760. },
  761. {
  762. "method": "POST",
  763. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  764. "status": 200
  765. },
  766. {
  767. "method": "GET",
  768. "path": "/api/tran/v1/teaching/runs/44/steps",
  769. "status": 200
  770. },
  771. {
  772. "method": "GET",
  773. "path": "/api/tran/v1/teaching/runs/44",
  774. "status": 200
  775. },
  776. {
  777. "method": "POST",
  778. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  779. "status": 409
  780. },
  781. {
  782. "method": "POST",
  783. "path": "/api/tran/v1/teaching/runs/44/start",
  784. "status": 200
  785. },
  786. {
  787. "method": "GET",
  788. "path": "/api/tran/v1/teaching/runs/44/steps",
  789. "status": 200
  790. },
  791. {
  792. "method": "POST",
  793. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  794. "status": 200
  795. },
  796. {
  797. "method": "GET",
  798. "path": "/api/tran/v1/teaching/runs/44",
  799. "status": 200
  800. },
  801. {
  802. "method": "POST",
  803. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  804. "status": 200
  805. },
  806. {
  807. "method": "GET",
  808. "path": "/api/tran/v1/teaching/runs/44",
  809. "status": 200
  810. },
  811. {
  812. "method": "POST",
  813. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  814. "status": 409
  815. },
  816. {
  817. "method": "POST",
  818. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  819. "status": 200
  820. },
  821. {
  822. "method": "GET",
  823. "path": "/api/tran/v1/teaching/runs/44",
  824. "status": 200
  825. },
  826. {
  827. "method": "POST",
  828. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  829. "status": 200
  830. },
  831. {
  832. "method": "GET",
  833. "path": "/api/tran/v1/teaching/runs/44",
  834. "status": 200
  835. },
  836. {
  837. "method": "POST",
  838. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  839. "status": 409
  840. },
  841. {
  842. "method": "POST",
  843. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  844. "status": 200
  845. },
  846. {
  847. "method": "GET",
  848. "path": "/api/tran/v1/teaching/runs/44",
  849. "status": 200
  850. },
  851. {
  852. "method": "POST",
  853. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  854. "status": 200
  855. },
  856. {
  857. "method": "GET",
  858. "path": "/api/tran/v1/teaching/runs/44",
  859. "status": 200
  860. },
  861. {
  862. "method": "POST",
  863. "path": "/api/tran/v1/teaching/runs/44/physical-events",
  864. "status": 409
  865. },
  866. {
  867. "method": "GET",
  868. "path": "/api/tran/v1/teaching/runs/44/steps",
  869. "status": 200
  870. },
  871. {
  872. "method": "POST",
  873. "path": "/api/tran/v1/teaching/runs/44/submit",
  874. "status": 200
  875. },
  876. {
  877. "method": "POST",
  878. "path": "/api/tran/v1/teaching/runs/44/submit",
  879. "status": 200
  880. },
  881. {
  882. "method": "POST",
  883. "path": "/api/tran/v1/teaching/runs/44/review",
  884. "status": 200
  885. },
  886. {
  887. "method": "POST",
  888. "path": "/api/tran/v1/teaching/runs/44/review",
  889. "status": 200
  890. },
  891. {
  892. "method": "GET",
  893. "path": "/api/tran/v1/teaching/runs/44/steps",
  894. "status": 200
  895. },
  896. {
  897. "method": "POST",
  898. "path": "/api/tran/v1/teaching/assignments",
  899. "status": 200
  900. },
  901. {
  902. "method": "POST",
  903. "path": "/api/tran/v1/teaching/assignments/51/publish",
  904. "status": 200
  905. },
  906. {
  907. "method": "POST",
  908. "path": "/api/tran/v1/teaching/assignments/51/accept",
  909. "status": 200
  910. },
  911. {
  912. "method": "POST",
  913. "path": "/api/tran/v1/teaching/assignments/51/accept",
  914. "status": 200
  915. },
  916. {
  917. "method": "POST",
  918. "path": "/api/tran/v1/teaching/assignments/51/accept",
  919. "status": 200
  920. },
  921. {
  922. "method": "POST",
  923. "path": "/api/tran/v1/teaching/assignments/51/accept",
  924. "status": 200
  925. },
  926. {
  927. "method": "GET",
  928. "path": "/api/tran/v1/teaching/runs?assignmentId=51&size=100",
  929. "status": 200
  930. },
  931. {
  932. "method": "GET",
  933. "path": "/api/tran/v1/teaching/runs/46",
  934. "status": 403
  935. },
  936. {
  937. "method": "POST",
  938. "path": "/api/tran/v1/teaching/runs/45/start",
  939. "status": 200
  940. },
  941. {
  942. "method": "POST",
  943. "path": "/api/tran/v1/teaching/runs/45/start",
  944. "status": 200
  945. },
  946. {
  947. "method": "GET",
  948. "path": "/api/tran/v1/teaching/runs/45/steps",
  949. "status": 200
  950. },
  951. {
  952. "method": "GET",
  953. "path": "/api/tran/v1/teaching/runs/45/execution",
  954. "status": 200
  955. },
  956. {
  957. "method": "PUT",
  958. "path": "/api/tran/v1/teaching/runs/45/progress",
  959. "status": 403
  960. },
  961. {
  962. "method": "PUT",
  963. "path": "/api/tran/v1/teaching/runs/45/progress",
  964. "status": 400
  965. },
  966. {
  967. "method": "POST",
  968. "path": "/api/tran/v1/teaching/runs/45/submit",
  969. "status": 409
  970. },
  971. {
  972. "method": "GET",
  973. "path": "/api/tran/v1/teaching/runs/45",
  974. "status": 200
  975. },
  976. {
  977. "method": "PUT",
  978. "path": "/api/tran/v1/teaching/runs/45/progress",
  979. "status": 200
  980. },
  981. {
  982. "method": "PUT",
  983. "path": "/api/tran/v1/teaching/runs/45/progress",
  984. "status": 200
  985. },
  986. {
  987. "method": "PUT",
  988. "path": "/api/tran/v1/teaching/runs/45/progress",
  989. "status": 409
  990. },
  991. {
  992. "method": "PUT",
  993. "path": "/api/tran/v1/teaching/runs/45/progress",
  994. "status": 200
  995. },
  996. {
  997. "method": "PUT",
  998. "path": "/api/tran/v1/teaching/runs/45/progress",
  999. "status": 200
  1000. },
  1001. {
  1002. "method": "PUT",
  1003. "path": "/api/tran/v1/teaching/runs/45/progress",
  1004. "status": 409
  1005. },
  1006. {
  1007. "method": "POST",
  1008. "path": "/api/tran/v1/teaching/runs/45/submit",
  1009. "status": 403
  1010. },
  1011. {
  1012. "method": "POST",
  1013. "path": "/api/tran/v1/teaching/runs/45/submit",
  1014. "status": 200
  1015. },
  1016. {
  1017. "method": "POST",
  1018. "path": "/api/tran/v1/teaching/runs/45/submit",
  1019. "status": 200
  1020. },
  1021. {
  1022. "method": "POST",
  1023. "path": "/api/tran/v1/teaching/runs/45/review",
  1024. "status": 200
  1025. },
  1026. {
  1027. "method": "POST",
  1028. "path": "/api/tran/v1/teaching/runs/45/review",
  1029. "status": 200
  1030. },
  1031. {
  1032. "method": "GET",
  1033. "path": "/api/tran/v1/teaching/runs/45/steps",
  1034. "status": 200
  1035. },
  1036. {
  1037. "method": "GET",
  1038. "path": "/api/tran/v1/teaching/runs/46",
  1039. "status": 200
  1040. },
  1041. {
  1042. "method": "POST",
  1043. "path": "/api/tran/v1/teaching/runs/46/start",
  1044. "status": 200
  1045. },
  1046. {
  1047. "method": "POST",
  1048. "path": "/api/tran/v1/teaching/runs/46/start",
  1049. "status": 200
  1050. },
  1051. {
  1052. "method": "GET",
  1053. "path": "/api/tran/v1/teaching/runs/46/steps",
  1054. "status": 200
  1055. },
  1056. {
  1057. "method": "GET",
  1058. "path": "/api/tran/v1/teaching/runs/46/execution",
  1059. "status": 200
  1060. },
  1061. {
  1062. "method": "PUT",
  1063. "path": "/api/tran/v1/teaching/runs/46/progress",
  1064. "status": 403
  1065. },
  1066. {
  1067. "method": "PUT",
  1068. "path": "/api/tran/v1/teaching/runs/46/progress",
  1069. "status": 400
  1070. },
  1071. {
  1072. "method": "POST",
  1073. "path": "/api/tran/v1/teaching/runs/46/submit",
  1074. "status": 409
  1075. },
  1076. {
  1077. "method": "GET",
  1078. "path": "/api/tran/v1/teaching/runs/46",
  1079. "status": 200
  1080. },
  1081. {
  1082. "method": "PUT",
  1083. "path": "/api/tran/v1/teaching/runs/46/progress",
  1084. "status": 200
  1085. },
  1086. {
  1087. "method": "PUT",
  1088. "path": "/api/tran/v1/teaching/runs/46/progress",
  1089. "status": 200
  1090. },
  1091. {
  1092. "method": "PUT",
  1093. "path": "/api/tran/v1/teaching/runs/46/progress",
  1094. "status": 409
  1095. },
  1096. {
  1097. "method": "PUT",
  1098. "path": "/api/tran/v1/teaching/runs/46/progress",
  1099. "status": 200
  1100. },
  1101. {
  1102. "method": "PUT",
  1103. "path": "/api/tran/v1/teaching/runs/46/progress",
  1104. "status": 200
  1105. },
  1106. {
  1107. "method": "PUT",
  1108. "path": "/api/tran/v1/teaching/runs/46/progress",
  1109. "status": 409
  1110. },
  1111. {
  1112. "method": "POST",
  1113. "path": "/api/tran/v1/teaching/runs/46/submit",
  1114. "status": 403
  1115. },
  1116. {
  1117. "method": "POST",
  1118. "path": "/api/tran/v1/teaching/runs/46/submit",
  1119. "status": 200
  1120. },
  1121. {
  1122. "method": "POST",
  1123. "path": "/api/tran/v1/teaching/runs/46/submit",
  1124. "status": 200
  1125. },
  1126. {
  1127. "method": "POST",
  1128. "path": "/api/tran/v1/teaching/runs/46/review",
  1129. "status": 200
  1130. },
  1131. {
  1132. "method": "POST",
  1133. "path": "/api/tran/v1/teaching/runs/46/review",
  1134. "status": 200
  1135. },
  1136. {
  1137. "method": "GET",
  1138. "path": "/api/tran/v1/teaching/runs/46/steps",
  1139. "status": 200
  1140. },
  1141. {
  1142. "method": "GET",
  1143. "path": "/api/tran/v1/teaching/assignments/50",
  1144. "status": 200
  1145. },
  1146. {
  1147. "method": "GET",
  1148. "path": "/api/tran/v1/teaching/assignments/51",
  1149. "status": 200
  1150. }
  1151. ],
  1152. "limitations": [
  1153. "实装事件均为本次自动化提交的 MANUAL 人工确认或明确的权限拒绝测试,不代表真实设备、PLC、摄像机或视觉模型联调。",
  1154. "教学运行结果来自正式 API;默认实装离线回放和默认对抗本地工作台的显示另行记录,不混同为服务端运行闭环。",
  1155. "对抗按四名隔离学员的独立会话依次操作,检查服务端截止时间已生效;未等待整局自然超时,也不代表多人同时操作的压力或网络同步测试。",
  1156. "测试账号使用本次随机密码,密码与会话仅在运行内存中;报告只保留用户 ID、队伍和岗位以便追溯。"
  1157. ],
  1158. "finishedAt": "2026-09-05T15:58:56.293Z",
  1159. "retainedData": {
  1160. "assignments": [
  1161. "50",
  1162. "51"
  1163. ],
  1164. "runs": [
  1165. "44",
  1166. "45",
  1167. "46"
  1168. ],
  1169. "users": [
  1170. "95",
  1171. "96",
  1172. "97",
  1173. "98"
  1174. ],
  1175. "note": "仅新建本次开发测试数据,未修改或删除既有账号、任务与运行。"
  1176. }
  1177. }