diff --git a/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md b/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md new file mode 100644 index 0000000..0a61257 --- /dev/null +++ b/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md @@ -0,0 +1,27 @@ +# 桥梁数字教员讲解修正验收 + +2026-09-15,开发、本机局域网及测试环境均通过。 + +- 四个任务默认视频讲解;场景加载完成且首帧显示后才播放。通过延迟真实模型/解码资源响应,确认 loading 可见时没有讲解播放调用。浏览器拒绝自动播放时保留视频模式,点击播放后正常继续。 +- 右上角场景信息和整车工具使用纵向布局;1920、1600、1366 三种宽度无重叠。“三维实时交互”角标已移除。数字人框保持 3:4。 +- 审核 39 段讲解及全部安全提示,重新生成 006 第 7 步、007 第 8/9/11 步、008 第 11/15 步。移除原稿、未展开、未给出参数等制作说明;008 保留记录依据并提交教员核对的要求。现用文件为 39 段 MP4、41 个 WAV,旧版本文件保留。 +- 浮窗按钮与展开面板无阴影,头像绿点已移除。原因是公开接口优先用了旧上传视频,测试环境文件不存在返回 404;已统一使用随项目发布的内置头像。验收检查了实际教员 PNG 地址和图片加载完成,避免把临时品牌图标当作头像通过。 +- 测试环境实际任务 86–89、固定内容版本 533–536 的全部 39 个步骤与新视频/讲解文字准确绑定;动作定义不变。 + +## 验证记录 + +- 前端两项目构建通过;桥梁脚本、媒体绑定及正式入口 14 项契约测试通过。 +- Java 17 `mvn test` 通过,Surefire 汇总 562 项,失败/错误为 0。 +- 公开头像接口回归 2 项通过,包含旧上传文件缺失的重现案例。 +- 四任务前两步的视频播放、语音切换、视频失败备用、切步停止、刷新和关闭通过,见 `playback/live-result.json`。 +- 本机、局域网、测试环境的 39 个 MP4 与 41 个 WAV HTTP SHA-256 均与发布文件一致;MP4 Range 返回 206。 +- 三个数字人在测试环境 `/human/viewer/{id}` 完成真实语音驱动,收到开始/结束事件并有持续嘴部运动,无浏览器错误。见 `ai_person/ape2e/reports/instructors-v2-test-20260915/stable-viewer-validation.json`。 + +## 测试发布 + +- 数字车间:http://1.14.103.234:6180 +- 数字人平台:http://1.14.103.234:7180 +- 镜像:`digital-human-service:lecture-v2-20260915`,运行摘要 `6d66dd620303ea162047d7a9713b30f0f36575750f1a9a03c4f44aaf58f7659d`,容器 healthy。 +- 五个源码仓库均已发布,提交及备份位置见 `deployment.json`。数据库无待执行的新变更;已有四任务及有效训练记录保留。 +- 测试环境原有 v2 素材修改与新提交逐文件核对一致后,保存在名为 `lecture-v2-20260915-pre-deploy` 的 Git stash 中,再快进更新源码。 +- 常规构建提示:前端部分包超过 500 kB;FastAPI 测试客户端有上游弃用提示。检查均成功。 diff --git a/reports/bridge-lecture-polish-20260915/index.html b/reports/bridge-lecture-polish-20260915/index.html index 4e6d847..2c95237 100644 --- a/reports/bridge-lecture-polish-20260915/index.html +++ b/reports/bridge-lecture-polish-20260915/index.html @@ -1 +1 @@ -桥梁数字教员讲解修正验收

桥梁数字教员讲解修正验收 · 2026-09-15

四套任务共39段讲解,6段重新生成。默认视频模式,等待场景加载完成后播放;保留语音切换与旧文件。右上角按内容自动排列,移除“三维实时交互”角标。公开浮窗显示真实教员头像,移除阴影和头像绿点。

验证:local 浏览器回归 文件校验 · lan 浏览器回归 文件校验。另通过前端构建、14项脚本契约测试、562项Java测试、2项公开头像接口测试。

本次重新生成的6段

TASK-VIRTUAL-006 · 第7步

第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。

4.88s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第8步

第8步,安装新液压泵。安装新的液压泵。

3.36s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第9步

第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。

4.96s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第11步

第11步,启动设备试验。启动设备进行试验。

3.28s · 已替换 · 原文件保留
TASK-VIRTUAL-008 · 第11步

第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。

8.48s · 已替换 · 原文件保留
TASK-VIRTUAL-008 · 第15步

第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。

8.24s · 已替换 · 原文件保留

当前39段讲解清单

TASK-VIRTUAL-005 · 重型支援桥液压泵应急切换

  1. 根据故障现象确定是哪一个液压泵发生故障:第1步,确定故障液压泵。根据故障现象确定发生故障的液压泵。
  2. 断开架桥车取力器:第2步,断开架桥车取力器。将架桥车取力器断开。
  3. 将架桥车备胎斜上方链接两个红色滤油器的球阀打开:第3步,打开互救球阀。打开备胎上方两个红色滤油器之间的连通球阀,手柄由垂直管道转为平行管道。
  4. 重新联通取力器:第4步,重新接通取力器。将架桥车取力器重新接通。
  5. 打开辅助控制盒内的“互救”开关:第5步,打开辅助控制盒互救开关。打开辅助控制盒盖,再打开互救开关,进入单泵作业状态。

TASK-VIRTUAL-006 · 重型支援桥液压泵应急替代

  1. 保持架桥车运行并断开取力器:第1步,保持架桥车运行并断开取力器。保持架桥车发动机运转,确保架桥车取力器处于断开状态。
  2. 连接两车液压软管:第2步,连接两车液压软管。连接支援车与架桥车液压软管。架桥车快接接头位于液压油箱右侧;支援车快接接头位于驾驶室外右下方。
  3. 打开支援车回油截止阀:第3步,打开支援车回油截止阀。打开支援车液压油箱快接接头处的回油截止阀。
  4. 打开互救作业开关:第4步,打开互救作业开关。打开辅助控制盒上的“互救作业”开关。
  5. 打开滤油器出口连通球阀:第5步,打开滤油器出口连通球阀。打开两个输油滤油器出口处的连通球阀。
  6. 接通支援车液压取力器:第6步,接通支援车液压取力器。接通支援车液压系统取力器,向架桥车供油。
  7. 按正常步骤操作架桥车:第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。

TASK-VIRTUAL-007 · 重型支援桥前泵换件修复

  1. 停机并初裁牛皮纸:第1步,停机并初裁牛皮纸。架桥车熄火;按液压泵与取力器结合面形状初步裁剪牛皮纸。
  2. 关闭液压油箱出油口一号球阀:第2步,关闭液压油箱出油口一号球阀。将一号球阀手柄从平行管道转到垂直管道。
  3. 拆开并包扎进出油管:第3步,拆开并包扎进出油管。用大活动扳手拆开液压泵进、出油管接头,用塑料袋包扎管口。
  4. 拆下四个安装螺栓:第4步,拆下四个安装螺栓。用开口扳手拆下液压泵与取力器之间的四个安装螺栓。
  5. 取下旧前泵:第5步,取下旧前泵。取下原前泵。
  6. 修裁牛皮纸:第6步,修裁牛皮纸。进一步裁剪牛皮纸,使其与液压泵安装面及取力器结合面吻合。
  7. 放置牛皮纸垫:第7步,放置牛皮纸垫。将裁好的牛皮纸放在取力器接口处。
  8. 安装新液压泵:第8步,安装新液压泵。安装新的液压泵。
  9. 向新泵加注液压油:第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
  10. 恢复进出油管连接:第10步,恢复进出油管连接。用大活动扳手连接并拧紧液压泵进、出油管。
  11. 启动设备试验:第11步,启动设备试验。启动设备进行试验。

TASK-VIRTUAL-008 · 重型支援桥平衡阀拆拼互换

  1. 清洗小腔平衡阀:第1步,清洗小腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
  2. 拆开小腔控制油口管路:第2步,拆开小腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
  3. 拆下小腔平衡阀:第3步,拆下小腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
  4. 封堵小腔油口:第4步,封堵小腔油口。用两个油堵封住两个油口,擦净阀座结合面。
  5. 清洗大腔平衡阀:第5步,清洗大腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
  6. 拆开大腔控制油口管路:第6步,拆开大腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
  7. 拆下大腔平衡阀:第7步,拆下大腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
  8. 封堵大腔油口:第8步,封堵大腔油口。用两个油堵封住两个油口,擦净阀座结合面。
  9. 准备安装大腔平衡阀:第9步,准备安装大腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
  10. 安装大腔平衡阀:第10步,安装大腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
  11. 核对大腔控制油口管路连接:第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
  12. 紧固大腔阀体连接螺栓:第12步,紧固大腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
  13. 准备安装小腔平衡阀:第13步,准备安装小腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
  14. 安装小腔平衡阀:第14步,安装小腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
  15. 核对小腔控制油口管路连接:第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
  16. 紧固小腔阀体连接螺栓:第16步,紧固小腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
\ No newline at end of file +桥梁数字教员讲解修正验收

桥梁数字教员讲解修正验收 · 2026-09-15

四套任务共39段讲解,6段重新生成。默认视频模式,等待场景加载完成后播放;保留语音切换与旧文件。右上角按内容自动排列,移除“三维实时交互”角标。公开浮窗显示真实教员头像,移除阴影和头像绿点。

验证:local 浏览器回归 文件校验 · lan 浏览器回归 文件校验 · test 浏览器回归 文件校验。另通过前端构建、14项脚本契约测试、562项Java测试、2项公开头像接口测试。

本次重新生成的6段

TASK-VIRTUAL-006 · 第7步

第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。

4.88s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第8步

第8步,安装新液压泵。安装新的液压泵。

3.36s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第9步

第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。

4.96s · 已替换 · 原文件保留
TASK-VIRTUAL-007 · 第11步

第11步,启动设备试验。启动设备进行试验。

3.28s · 已替换 · 原文件保留
TASK-VIRTUAL-008 · 第11步

第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。

8.48s · 已替换 · 原文件保留
TASK-VIRTUAL-008 · 第15步

第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。

8.24s · 已替换 · 原文件保留

当前39段讲解清单

TASK-VIRTUAL-005 · 重型支援桥液压泵应急切换

  1. 根据故障现象确定是哪一个液压泵发生故障:第1步,确定故障液压泵。根据故障现象确定发生故障的液压泵。
  2. 断开架桥车取力器:第2步,断开架桥车取力器。将架桥车取力器断开。
  3. 将架桥车备胎斜上方链接两个红色滤油器的球阀打开:第3步,打开互救球阀。打开备胎上方两个红色滤油器之间的连通球阀,手柄由垂直管道转为平行管道。
  4. 重新联通取力器:第4步,重新接通取力器。将架桥车取力器重新接通。
  5. 打开辅助控制盒内的“互救”开关:第5步,打开辅助控制盒互救开关。打开辅助控制盒盖,再打开互救开关,进入单泵作业状态。

TASK-VIRTUAL-006 · 重型支援桥液压泵应急替代

  1. 保持架桥车运行并断开取力器:第1步,保持架桥车运行并断开取力器。保持架桥车发动机运转,确保架桥车取力器处于断开状态。
  2. 连接两车液压软管:第2步,连接两车液压软管。连接支援车与架桥车液压软管。架桥车快接接头位于液压油箱右侧;支援车快接接头位于驾驶室外右下方。
  3. 打开支援车回油截止阀:第3步,打开支援车回油截止阀。打开支援车液压油箱快接接头处的回油截止阀。
  4. 打开互救作业开关:第4步,打开互救作业开关。打开辅助控制盒上的“互救作业”开关。
  5. 打开滤油器出口连通球阀:第5步,打开滤油器出口连通球阀。打开两个输油滤油器出口处的连通球阀。
  6. 接通支援车液压取力器:第6步,接通支援车液压取力器。接通支援车液压系统取力器,向架桥车供油。
  7. 按正常步骤操作架桥车:第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。

TASK-VIRTUAL-007 · 重型支援桥前泵换件修复

  1. 停机并初裁牛皮纸:第1步,停机并初裁牛皮纸。架桥车熄火;按液压泵与取力器结合面形状初步裁剪牛皮纸。
  2. 关闭液压油箱出油口一号球阀:第2步,关闭液压油箱出油口一号球阀。将一号球阀手柄从平行管道转到垂直管道。
  3. 拆开并包扎进出油管:第3步,拆开并包扎进出油管。用大活动扳手拆开液压泵进、出油管接头,用塑料袋包扎管口。
  4. 拆下四个安装螺栓:第4步,拆下四个安装螺栓。用开口扳手拆下液压泵与取力器之间的四个安装螺栓。
  5. 取下旧前泵:第5步,取下旧前泵。取下原前泵。
  6. 修裁牛皮纸:第6步,修裁牛皮纸。进一步裁剪牛皮纸,使其与液压泵安装面及取力器结合面吻合。
  7. 放置牛皮纸垫:第7步,放置牛皮纸垫。将裁好的牛皮纸放在取力器接口处。
  8. 安装新液压泵:第8步,安装新液压泵。安装新的液压泵。
  9. 向新泵加注液压油:第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
  10. 恢复进出油管连接:第10步,恢复进出油管连接。用大活动扳手连接并拧紧液压泵进、出油管。
  11. 启动设备试验:第11步,启动设备试验。启动设备进行试验。

TASK-VIRTUAL-008 · 重型支援桥平衡阀拆拼互换

  1. 清洗小腔平衡阀:第1步,清洗小腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
  2. 拆开小腔控制油口管路:第2步,拆开小腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
  3. 拆下小腔平衡阀:第3步,拆下小腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
  4. 封堵小腔油口:第4步,封堵小腔油口。用两个油堵封住两个油口,擦净阀座结合面。
  5. 清洗大腔平衡阀:第5步,清洗大腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
  6. 拆开大腔控制油口管路:第6步,拆开大腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
  7. 拆下大腔平衡阀:第7步,拆下大腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
  8. 封堵大腔油口:第8步,封堵大腔油口。用两个油堵封住两个油口,擦净阀座结合面。
  9. 准备安装大腔平衡阀:第9步,准备安装大腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
  10. 安装大腔平衡阀:第10步,安装大腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
  11. 核对大腔控制油口管路连接:第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
  12. 紧固大腔阀体连接螺栓:第12步,紧固大腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
  13. 准备安装小腔平衡阀:第13步,准备安装小腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
  14. 安装小腔平衡阀:第14步,安装小腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
  15. 核对小腔控制油口管路连接:第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
  16. 紧固小腔阀体连接螺栓:第16步,紧固小腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。

测试环境

\ No newline at end of file diff --git a/reports/bridge-lecture-polish-20260915/lan/delivery.json b/reports/bridge-lecture-polish-20260915/lan/delivery.json new file mode 100644 index 0000000..0de957c --- /dev/null +++ b/reports/bridge-lecture-polish-20260915/lan/delivery.json @@ -0,0 +1,9 @@ +{ + "origin": "http://192.168.31.168:6180", + "videos": 39, + "audio": 41, + "allTextsClean": true, + "exactFiles": true, + "buildCopiesMatch": true, + "rangeRequests": true +} \ No newline at end of file diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png new file mode 100644 index 0000000..2610a29 Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png differ diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png new file mode 100644 index 0000000..127d01a Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png differ diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png new file mode 100644 index 0000000..08b5c6f Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png differ diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png new file mode 100644 index 0000000..6700012 Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png differ diff --git a/reports/bridge-lecture-polish-20260915/test/bindings.json b/reports/bridge-lecture-polish-20260915/test/bindings.json new file mode 100644 index 0000000..c3a7f6d --- /dev/null +++ b/reports/bridge-lecture-polish-20260915/test/bindings.json @@ -0,0 +1,33 @@ +{ + "origin": "http://1.14.103.234:6180", + "result": [ + { + "task": "TASK-VIRTUAL-005", + "id": "86", + "version": "533", + "exactVideoAndTextBindings": 5, + "operationsUnchanged": true + }, + { + "task": "TASK-VIRTUAL-006", + "id": "87", + "version": "534", + "exactVideoAndTextBindings": 7, + "operationsUnchanged": true + }, + { + "task": "TASK-VIRTUAL-007", + "id": "88", + "version": "535", + "exactVideoAndTextBindings": 11, + "operationsUnchanged": true + }, + { + "task": "TASK-VIRTUAL-008", + "id": "89", + "version": "536", + "exactVideoAndTextBindings": 16, + "operationsUnchanged": true + } + ] +} \ No newline at end of file diff --git a/reports/bridge-lecture-polish-20260915/test/delivery.json b/reports/bridge-lecture-polish-20260915/test/delivery.json new file mode 100644 index 0000000..b5715c2 --- /dev/null +++ b/reports/bridge-lecture-polish-20260915/test/delivery.json @@ -0,0 +1,9 @@ +{ + "origin": "http://1.14.103.234:6180", + "videos": 39, + "audio": 41, + "allTextsClean": true, + "exactFiles": true, + "buildCopiesMatch": true, + "rangeRequests": true +} \ No newline at end of file diff --git a/reports/bridge-lecture-polish-20260915/test/result.json b/reports/bridge-lecture-polish-20260915/test/result.json new file mode 100644 index 0000000..37cc413 --- /dev/null +++ b/reports/bridge-lecture-polish-20260915/test/result.json @@ -0,0 +1,82 @@ +{ + "origin": "http://1.14.103.234:6180", + "delayed": 8, + "checks": [ + { + "task": "TASK-VIRTUAL-005", + "videoDefault": true, + "noPlaybackWhileLoading": true, + "autoplayRestrictionRetainsVideo": true, + "noHudOverlap": [ + 1920, + 1600, + 1366 + ], + "plays": [ + { + "loading": false, + "src": "/legacy/virtual-training/videos/narration/bridge-pump-switch/v2/instructor-1-v2/step-01-bd17dc16621458c4.mp4" + } + ] + }, + { + "task": "TASK-VIRTUAL-006", + "videoDefault": true, + "noPlaybackWhileLoading": true, + "autoplayRestrictionRetainsVideo": true, + "noHudOverlap": [ + 1920, + 1600, + 1366 + ], + "plays": [ + { + "loading": false, + "src": "/legacy/virtual-training/videos/narration/bridge-pump-substitute/v3/instructor-1-v2/step-01-053bd89d013ca8c2.mp4" + } + ] + }, + { + "task": "TASK-VIRTUAL-007", + "videoDefault": true, + "noPlaybackWhileLoading": true, + "autoplayRestrictionRetainsVideo": true, + "noHudOverlap": [ + 1920, + 1600, + 1366 + ], + "plays": [ + { + "loading": false, + "src": "/legacy/virtual-training/videos/narration/bridge-pump-replace/v3/instructor-1-v2/step-01-071874b4ec4b9e19.mp4" + } + ] + }, + { + "task": "TASK-VIRTUAL-008", + "videoDefault": true, + "noPlaybackWhileLoading": true, + "autoplayRestrictionRetainsVideo": true, + "noHudOverlap": [ + 1920, + 1600, + 1366 + ], + "plays": [ + { + "loading": false, + "src": "/legacy/virtual-training/videos/narration/bridge-balance-valve-swap/v3/instructor-1-v2/step-01-8540f64d275cd500.mp4" + } + ] + }, + { + "widget": "http://1.14.103.234:7180", + "avatarLoaded": true, + "avatar": "/avatars/builtin/equipment-instructor-1.png", + "greenDotRemoved": true, + "launcherAndPanelShadows": "none" + } + ], + "errors": [] +} \ No newline at end of file diff --git a/reports/bridge-lecture-polish-20260915/test/widget.png b/reports/bridge-lecture-polish-20260915/test/widget.png new file mode 100644 index 0000000..17976c9 Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/widget.png differ diff --git a/tools/bridge-lecture-bindings.mjs b/tools/bridge-lecture-bindings.mjs new file mode 100644 index 0000000..4f34c32 --- /dev/null +++ b/tools/bridge-lecture-bindings.mjs @@ -0,0 +1,23 @@ +import fs from 'node:fs'; +import assert from 'node:assert/strict'; +import {credentials} from './role-permissions-live.mjs'; +import videos from '../../unreal_tran_web/src/features/virtual-training-scripts/narration-video-manifest.js'; +import {scriptTrainingDefinition} from '../../unreal_tran_web/src/features/virtual-training-scripts/registry.js'; +const origin=process.env.BASE_URL || 'http://127.0.0.1:6180'; +const dir=process.env.REPORT_DIR || 'reports/bridge-lecture-polish-20260915/local'; +const login=await fetch(`${origin}/api/auth/v1/auth/login`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({...credentials('root'),roleCode:'admin',rememberMe:false})}).then(r=>r.json()); +assert.ok(login.data?.accessToken); +const tasks=await fetch(`${origin}/api/tran/v1/teaching/assignments?channel=VIRTUAL&assignmentKind=TRAINING&size=100`,{headers:{Authorization:`Bearer ${login.data.accessToken}`}}).then(r=>r.json()); +const result=[]; +for(const script of videos.scripts){ + const task=tasks.data.records.find(t=>t.code===script.code);assert.ok(task); + const definition=scriptTrainingDefinition(task); + assert.equal(definition.steps.length,script.steps.length); + for(const [i,clip] of script.steps.entries()){ + assert.equal(definition.steps[i].audio.narrationUrl,clip.url,script.code+' '+clip.number); + assert.equal(definition.steps[i].audio.narrationText,clip.text); + assert.deepEqual(definition.steps[i].action,task.definitionSnapshot.steps[i].action); + } + result.push({task:script.code,id:task.id,version:task.contentVersionId,exactVideoAndTextBindings:script.steps.length,operationsUnchanged:true}); +} +fs.mkdirSync(dir,{recursive:true});fs.writeFileSync(dir+'/bindings.json',JSON.stringify({origin,result},null,2));console.log(JSON.stringify(result));