No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

171 líneas
15 KiB

  1. import fs from 'node:fs';
  2. import assert from 'node:assert/strict';
  3. const dir='reports/bridge-workbook-review-20260917';
  4. const sheets=JSON.parse(fs.readFileSync(dir+'/source.json','utf8'));
  5. const tasks=JSON.parse(fs.readFileSync(dir+'/current-tasks.json','utf8'));
  6. const notes={
  7. 30:['005 第1步','部分对应','能确认预设故障泵;没有双泵对照或根据不同故障现象选择故障泵的诊断分支。'],
  8. 31:['005 第2步','动作对应','断开取力器;实物开关外形仍受模型准确度限制。'],
  9. 32:['005 第3步','动作对应','球阀打开动作已有;文档要求垂直到平行,几何正确性应以实际管轴为准,不能仅用固定90°证明。'],
  10. 33:['005 第4步','动作对应','按相反方向重新接通取力器。'],
  11. 34:['005 第5步','动作对应','开盖后操作互救开关;新模型验证入口已修复准备保存后的盖子状态恢复。'],
  12. 35:['005 末尾','缺项','没有单泵继续驱动支腿、移动架、架设架或吊机的联动结果演示。'],
  13. 37:['006 导入','缺项','现有任务从具体操作开始,没有独立的替代概念讲解段。'],
  14. 38:['006 导入','部分对应','新模型已经有双车场景,但缺独立的互救原理讲解和供动力过程演示。'],
  15. 39:['006 第1步','部分对应','顺序对应;发动机运行仅点击着色,不是发动机运行状态或动力联动。'],
  16. 40:['006 第2步','部分对应','双车和原形软管已接入;操作实际是移动两个接口盖并显示已成形软管,缺接头插接/锁紧过程。'],
  17. 41:['006 第3步','动作对应','使用保障车回油截止阀节点并旋转;位置准确性仍需按文档待确认项核定。'],
  18. 42:['006 第4步','动作对应','开盒盖、开互救开关已实现;与005是否同一开关仍是原稿待确认项。'],
  19. 43:['006 第5步','动作对应','现在是两个独立球阀,分别完成操作,不再只操作一个。'],
  20. 44:['006 第6步','部分对应','保障车取力器开关仍为补充示意件;供油用软管颜色提示,未呈现真实液压泵和动力传递。'],
  21. 45:['006 第7步','部分对应','仅移动示意手柄,未完成双车供油后的整机作业演示。'],
  22. 47:['007 第1步','部分对应','有停机着色和初裁纸片缩放;没有依结合面轮廓裁剪的工具动作。'],
  23. 48:['007 第2步','待确认','有旋转关闭动作;当前将2_07球阀开关02和3-02球阀开关复用为1号球阀,文档要求确认编号对应。'],
  24. 49:['007 第3步','部分对应','真实接头和封口袋已绑定;接头仅位移,没有大活动扳手旋松过程或工具规格约束。'],
  25. 50:['007 第4步','部分对应','已逐个拆4颗真实螺栓,原模型5颗的问题已处理;未展示开口扳手操作,螺栓半圈是示意行程。'],
  26. 51:['007 第5步','动作对应','使用新模型原位前泵执行取下;工程配合尺寸不由流程通关证明。'],
  27. 52:['007 第6步','部分对应','切换精裁纸垫模型,没有实际沿安装轮廓裁剪过程。'],
  28. 53:['007 第7步','部分对应','纸垫移动到推定结合面位置,未按文档要求取得法兰轮廓与尺寸核验。'],
  29. 54:['007 第8步','动作对应','新泵归位并逐个安装4颗螺栓;未推定拧紧扭矩。'],
  30. 55:['007 第9步','部分对应','新泵注油口盖随泵移动并可打开;加油壶和油流为示意。后续没有关盖动作(文档也未列,属流程闭合建议)。'],
  31. 56:['007 第10步','部分对应','取袋、接头归位顺序对应;“并拧紧”没有接头旋转或扳手动作。'],
  32. 57:['007 第11步','部分对应','只启动着色并移动示意试验手柄;未接整机试车,也没有泄漏、压力等合格判据,文档明确需甲方补充。'],
  33. 59:['008 第1步','部分对应','仅布块擦拭和阀体变色;没有油污到洁净贴图,也没有各管接头的清洗覆盖。'],
  34. 60:['008 第2步','部分对应','接头移开、袋子封口已有;缺19号开口扳手及旋松动作。'],
  35. 61:['008 第3步','部分对应','4颗螺栓逐件旋转拆下并取阀;缺8号内六角工具动作与规格约束。'],
  36. 62:['008 第4步','部分对应','2个真实油堵逐件封堵;擦阀座是点击变色的示意平面。'],
  37. 64:['008 第5步','部分对应','同小腔:无油污贴图和接头清洗覆盖。'],
  38. 65:['008 第6步','部分对应','同小腔:有接头/封袋位移,缺19号扳手旋松。'],
  39. 66:['008 第7步','部分对应','同小腔:4颗螺栓与阀体已有,缺8号内六角工具。'],
  40. 67:['008 第8步','部分对应','2个真实油堵已有;阀座仍是补充接触平面示意。'],
  41. 69:['008 第9步','部分对应','取下2油堵已有;只对阀座着色,没有阀体和阀座两者的擦拭去污过程。'],
  42. 70:['008 第10步','部分对应','小腔来源阀体换装到大腔安装面,按四螺栓安装面校准姿态;有4颗螺栓,无8号工具。文案未清楚区分阀体来源与安装位置。'],
  43. 71:['008 第11步','待确认','当前执行取袋、接管,并要求填写依据交教员核对。与C列装配方向一致,但D列及第三表仍明确指出原稿反向拆卸矛盾;不能认作已澄清。'],
  44. 72:['008 第12步','待确认','当前复用第10步同一组4颗螺栓再次旋转;原稿未确认固定螺栓与阀体连接螺栓是否同一组。'],
  45. 74:['008 第13步','部分对应','同第9步:取油堵已有,缺阀体/阀座擦拭全流程。'],
  46. 75:['008 第14步','部分对应','大腔来源阀体换装到小腔安装面,姿态已校准;工具和来源/目的地提示仍需完善。'],
  47. 76:['008 第15步','待确认','同第11步:取袋接管并记录依据;原稿相反动作仍待确认。'],
  48. 77:['008 第16步','待确认','同第12步:复用第14步同一组4颗螺栓,需确认是否应有另一组。'],
  49. };
  50. const animationRows=sheets[0].rows.filter(r=>Object.keys(r).some(k=>/^C\d+$/.test(k)) && !r.C3);
  51. assert.equal(animationRows.length,65);
  52. const introRows=new Set([...Array.from({length:13},(_,i)=>i+5),...Array.from({length:10},(_,i)=>i+19)]);
  53. const escape=s=>String(s??'').replaceAll('|','/').replaceAll('\n',' ');
  54. const lines=animationRows.map(r=>{
  55. const row=Number(Object.keys(r)[0].slice(1));const n=notes[row]||(introRows.has(row)?['005 导入/原理','缺项',([12,13,...Array.from({length:10},(_,i)=>i+19)].includes(row)?'没有原理图及回路演示,文档明确要求提供液压原理图。':row===17?'没有双泵定位讲解;新模型没有可按名称确认的独立后泵节点。':row>=8&&row<=10?'没有此独立环境素材段;训练场地背景不能替代三类画面。':'未编排成文档要求的独立字幕/画面/讲解段;通用任务标题或步骤语音不算该段。')]:null);
  56. assert.ok(n,'missing row '+row);
  57. const serial=row>=39&&row<=44?`2-${String(row-36).padStart(2,'0')}`:row===47?'3-01':row===49?'3-03':row===59?'4-01':row===64?'4-05':r['A'+row];
  58. return [serial,`1-动画!B${row}:F${row}`,r['B'+row],n[0],n[1],n[2]].map(escape).join(' | ');
  59. });
  60. const modelNotes=[
  61. '已按0916模型在原位绑定旧泵、新泵与取力器面;纸垫贴合仍是推定位置,不能用新模型存在替代装配尺寸验收。',
  62. '已分离为4颗真实螺栓;旧的5颗不再用于007操作。',
  63. '006~008已用统一0916架桥车坐标,附件保留共同导出坐标;005原发布入口仍旧模型,新模型在独立编排验证入口。',
  64. '保障车整车、接口盖和回油阀已有;独立取力器/液压泵未完整绑定,开关仍补充示意。',
  65. '未找到可按节点名称确认的独立后泵,也没有双泵定位步骤。',
  66. '双车连接油管.glb已使用;符合给定成形软管的交付方式,接头连接过程仍简化。',
  67. '当前操作件绑定接口盖,不等同于快速接头插接与锁紧。实装位置仍需确认。',
  68. '两个独立球阀已绑定,006第5步分别操作。',
  69. '模型节点注明2_07与3-02复用;编号与工况仍需按第三表确认。',
  70. '两个管接头已有且可分开;动作只有位移,未实现扳手旋松/旋紧。',
  71. '已使用牛皮纸附件的初裁/精裁形态;与建议单片贴图方案不同,但可表现状态;裁切轮廓未核定。',
  72. '007和008已用新封口袋附件;袋口包扎动作简化为移动就位。',
  73. '008每侧两个油堵已由实际模型分离使用。',
  74. '未实现带油污贴图到洁净贴图切换,当前为颜色变化。',
  75. '已用真实注油口盖并随新泵移动;开盖有动作。',
  76. '已按4_01/4_05等不同来源名和稳定交互ID区分,螺栓按独立几何拆分。',
  77. '已接两侧真实阀体与四螺栓;阀座接触面仍为示意平面。',
  78. '005五步已有,新模型验证入口也可运行;006复用同一辅助控制盒开关。',
  79. '当前新GLB无内嵌动画,三个任务未绑定整机联动轨道。文档所说12条/12秒旧演示尚未接到末步,需定位可迁移来源。',
  80. ];
  81. const clientNotes=[
  82. '当前未接入;缺原理图会阻挡005原理演示,不阻挡现有五步操作。',
  83. '当前未接三类独立素材段。',
  84. '按新模型命名绑定大小腔阀;未获得实装位置指认确认,不能称已工程核定。',
  85. '按新模型给定坐标放置;仍需实装位置确认。',
  86. '纸垫位置可演示,但形状尺寸未取得可验收依据。',
  87. '当前采用模型合并命名的同一球阀;需确认编号与功能。',
  88. '尚缺;目前试验手柄动作不能代表试车合格。',
  89. '005没有额外手动自救阀步骤;保持原5步,不能擅加或认为互救开关必然等同该阀。',
  90. '当前005和006确实复用同一互救开关;对应关系尚待甲方确认。',
  91. '现有006展示外部供油操作;未区分前泵故障和液压系统完全失效情景。',
  92. '当前按同一组4颗处理两次紧固;是实现假设,需确认后决定是否增加另一组。',
  93. '当前008第11/15步取袋接管并要求人工核对,不自动宣告管路处置正确;文档仍未解决相反动作。',
  94. '当前统一写大活动扳手;属于合理文字归一,最终仍可按原稿确认。',
  95. '目前未设具体规格;不应凭空指定开口尺寸。',
  96. ];
  97. function supporting(sheet,arr){const rows=sheet.rows.filter(r=>Object.keys(r).some(k=>/^B\d+$/.test(k))&&!r.B3);assert.equal(rows.length,arr.length);return rows.map((r,i)=>{const row=Object.keys(r)[0].slice(1);return `| ${sheet.name}!B${row}:D${row} | ${escape(r['B'+row])} | ${arr[i]} |`;}).join('\n');}
  98. const md=`# 四个桥梁脚本与说明文本核对
  99. 核对时间:2026-09-17。源文件:E:/work/edit_3d/模型/重型支援桥四份脚本说明文本.xlsx。读取三个工作表全部非空内容;只读核对,没有修改原表、已发布任务或业务代码。
  100. ## 结论
  101. 当前流程可走通,但不能据此认定已完整满足65条动画/讲解要求。文档包含005的29条、006的9条、007的11条、008的16条;系统操作步骤为5/7/11/16,共39步,二者统计口径不同。005缺23条导入/原理条目及最后单泵联动作业,006缺独立概念讲解,三套末尾的整机作业/试验仍有缺口。
  102. 此前34步、89项交互通过,指006~008当前已配置动作的可执行性,不是这份文档的内容完整性或实装准确性验收。
  103. 核验了实时任务接口:005=任务86/内容533;006=87/553;007=88/554;008=89/555。005新模型编排验证另为任务116/内容552,未替换原列表005。
  104. ## 优先处理
  105. 1. 补005末尾单泵联动、006双车供油联动、007起动试车结果;旧12条动画需要先找来源再适配新节点。新GLB没有内嵌动画,当前步骤也未绑定整机动画。
  106. 2. 接头旋松/旋紧目前只有位移;007/008需补工具动作。步骤toolId均为空,19号开口扳手、8号内六角未形成精确工具约束。
  107. 3. 008清洗补脏净材质、管接头清洗和阀体/阀座擦拭;目前只有布块移动或变色。
  108. 4. 明确008同一组还是两组螺栓、接管方向;明确自救阀、互救开关及球阀编号。这些文档已列待确认,不应凭代码猜定。
  109. 5. 补005导入与原理讲解;原理图、三类环境画面需要对应资料。不得用当前步骤视频充当未制作的原理动画。
  110. 6. 已发布006第7步、007第8/9/11步的屏幕说明仍有“原图/原稿未展开”字样。语音有覆盖文案不代表屏幕说明已清理;008矛盾说明宜放教师审核说明,不当作正常操作口播。
  111. 本报告的“动作对应”只表示目标与顺序已有实现,不表示模型尺寸、维修安全条件、扭矩或压力判据已实装核验。“部分对应”表示代码实现与文字目标之间仍有可见差距。
  112. ## 65条逐项核对
  113. 原表部分编号被Excel储存为日期序列值(如46056);下表按所在脚本和顺序恢复展示编号,原文件未改。
  114. | 编号 | 原表位置 | 内容 | 当前位置 | 判断 | 差异与说明 |
  115. |---|---|---|---|---|---|
  116. ${lines.map(l=>'| '+l+' |').join('\n')}
  117. ## 建模需求19项复核
  118. 此表的“缺模型”包含旧交付状态,不能直接视为0916新模型仍然全部缺失。
  119. | 原表位置 | 需求 | 当前情况 |
  120. |---|---|---|
  121. ${supporting(sheets[1],modelNotes)}
  122. ## 甲方资料与待澄清14项
  123. | 原表位置 | 事项 | 对当前实现的影响 |
  124. |---|---|---|
  125. ${supporting(sheets[2],clientNotes)}
  126. ## 实现依据
  127. - src/features/virtual-training-scripts/bridge-pump-switch.js:005操作五步。
  128. - bridge-pump-substitute.js:006软管显示、供油着色、末步示意手柄。
  129. - bridge-pump-replace.js:007接头位移、纸片状态、新泵安装与试验手柄。
  130. - bridge-balance-valve-swap.js:008同一组螺栓复用、清洗着色、未决接管步骤。
  131. - bridge-new-model-definition.js:006两独立球阀和新模型来源。
  132. - bridge-new-model-runtime.js:真实部件映射、示意件、阀体互换安装面校准。
  133. - bridge-3d-definition.js:工具ID为空,动作与顺序为主要评定维度。
  134. - 实时任务接口返回的步骤与模型路径;0916三个主要GLB的animations数组为空。
  135. 本次没有再运行全套浏览器回归;依据为工作簿原文、实时接口定义、动作代码和模型结构。先前通关截图属于前一轮执行验证,不能替代本次发现的内容差异。
  136. `;
  137. fs.writeFileSync(dir+'/核对报告.md',md);
  138. let table=false;const blocks=[];
  139. for(const line of md.split('\n')){
  140. const s=line.replaceAll('&','&amp;').replaceAll('<','&lt;').replaceAll('>','&gt;');
  141. if(s.startsWith('|')){
  142. if(/^\|[\s|:-]+$/.test(s))continue;
  143. const tag=table?'td':'th';if(!table){blocks.push('<div class="table"><table>');table=true;}
  144. blocks.push('<tr>'+s.split('|').slice(1,-1).map(c=>`<${tag}>${c.trim()}</${tag}>`).join('')+'</tr>');continue;
  145. }
  146. if(table){blocks.push('</table></div>');table=false;}
  147. blocks.push(s.startsWith('# ')?'<h1>'+s.slice(2)+'</h1>':s.startsWith('## ')?'<h2>'+s.slice(3)+'</h2>':s?'<p>'+s+'</p>':'');
  148. }
  149. if(table)blocks.push('</table></div>');
  150. fs.writeFileSync(dir+'/index.html',`<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>四个桥梁脚本核对</title><style>body{font:15px/1.8 system-ui;max-width:1500px;margin:32px auto;padding:20px;color:#183c37}p{margin:10px 0}h2{margin-top:32px}.table{overflow:auto}table{width:100%;border-collapse:collapse;font-size:14px}td,th{border:1px solid #bdd3cc;padding:9px;text-align:left;vertical-align:top}th{background:#e8f4ef}td:first-child{white-space:nowrap}tr:nth-child(even){background:#f7faf9}</style>${blocks.join('\n')}</html>`);
  151. console.log(JSON.stringify({animationRows:lines.length,modelRequirements:modelNotes.length,clientRequirements:clientNotes.length,currentTasks:tasks.map(t=>({code:t.code,steps:t.steps.length})),report:dir+'/核对报告.md'}));