Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

39 rindas
5.8 KiB

  1. import fs from 'node:fs/promises';
  2. import path from 'node:path';
  3. import assert from 'node:assert/strict';
  4. import {pathToFileURL} from 'node:url';
  5. import {chromium} from '@playwright/test';
  6. const folder=path.resolve('reports/bridge-solid-view-20260915');
  7. const read=async file=>JSON.parse(await fs.readFile(path.join(folder,file),'utf8'));
  8. const before=await read('../bridge-solid-view-before-20260915/result.json');
  9. const after=await read('result.json'),lan=await read('../bridge-solid-view-lan-20260915/result.json');
  10. assert.equal(before.pass,false);assert.equal(after.pass,true);assert.equal(lan.pass,true);
  11. const flowFiles=['task-86.json','tasks-87-88.json','task-89.json'];
  12. const flows=[];
  13. for(const file of flowFiles){const result=await read('../bridge-solid-view-flow-20260915/'+file);assert.equal(result.pass,true);flows.push(result);}
  14. const summary={pass:true,generatedAt:new Date().toISOString(),
  15. rootCause:'聚焦/旋转视角时自动将遮挡网格 visible 设为 false。实际 GLB 的一块网格可能涵盖大片车身或地形,DoubleSide 无法显示已被隐藏的网格。',
  16. changes:['删除自动遮挡隐藏及其恢复/逐帧射线逻辑','保留物理材质 DoubleSide','校准液压泵和球阀的可见观察面','只允许步骤动画及主动查看工具改变显隐'],
  17. visibility:after.checks,lan:lan.checks,
  18. operations:flows.reduce((n,r)=>n+r.checks.filter(c=>c.target).length,0),
  19. serverValidations:flows.reduce((n,r)=>n+r.writes.length,0),
  20. explicitTools:flows.flatMap(r=>r.checks.filter(c=>c.targetId)),
  21. commands:[{command:'pnpm run build',pass:true},{command:'node scripts/virtual-training-formal-route.contract.test.mjs',pass:true},{command:'git diff --check',pass:true}],
  22. environment:['http://127.0.0.1:6180','http://192.168.31.168:6180'],
  23. account:'管理员 / 教员预览',data:'未新增任务、未写学员成绩;操作回归只使用现有任务的 preview/validate。',
  24. };
  25. assert.equal(summary.operations,94);assert.equal(summary.serverValidations,39);
  26. await fs.writeFile(path.join(folder,'summary.json'),JSON.stringify(summary,null,2));
  27. const titles={86:'005 液压泵应急切换',87:'006 液压泵应急替代',88:'007 前泵换件修复',89:'008 平衡阀拆拼互换'};
  28. const 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.7 system-ui,sans-serif;color:#164139;background:#eef5f2;margin:0}main{max-width:1150px;margin:auto;padding:28px}.card{background:white;border:1px solid #c8dcd5;border-radius:8px;padding:18px;margin:14px 0}.grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}h1{font-size:26px}h2{font-size:20px}img{width:100%;height:auto}a{color:#08785f}table{border-collapse:collapse;width:100%}td,th{padding:10px;border:1px solid #c8dcd5;text-align:left}@media(max-width:700px){.grid{grid-template-columns:1fr}}</style><main>
  29. <h1>双面材质与视角镂空修复</h1><p>2026-09-15 · 四套正式桥梁脚本 · 管理员 / 教员预览</p>
  30. <div class="card"><b>结论:双面材质已生效,镂空来自自动隐藏网格。</b><p>${summary.rootCause}</p><p>现已删除该逻辑。聚焦、旋转、增强辉光均不改变完整网格集合;显隐仅由实际步骤动画或用户主动操作控制。</p></div>
  31. <h2>复现与回归证据</h2><div class="card"><p>修复前 005 聚焦后可见网格由 ${before.checks[0].before} 块变成 ${before.checks[0].after} 块。修复后四个场景均保持数量和网格标识完全一致,检查双面材质、三个方向旋转、辉光切换、半透明、隐藏其他及恢复。</p><table><tr><th>任务</th><th>聚焦前</th><th>聚焦后</th><th>自动隐藏</th></tr>${after.checks.filter(c=>c.before!=null).map(c=>`<tr><td>${titles[c.id]}</td><td>${c.before}</td><td>${c.after}</td><td>${c.automaticHidden}</td></tr>`).join('')}</table></div>
  32. <h2>旋转视角后的实际画面</h2><div class="grid">${Object.entries(titles).map(([id,title])=>`<article class="card"><b>${title}</b><a href="task-${id}-orbit-1.png"><img src="task-${id}-orbit-1.png" alt="${title}旋转后完整模型"></a><p><a href="task-${id}-orbit-2.png">方向 2</a> · <a href="task-${id}-orbit-3.png">方向 3</a> · <a href="task-${id}-restored.png">工具恢复后</a></p></article>`).join('')}</div>
  33. <h2>实际操作回归</h2><div class="card"><p>39 个步骤、94 次真实模型点击/拖动、39 次服务端预览校验通过。液压泵与球阀的可见观察方向已重新校准。</p><p>取力器等位于车体内部的部件,按用户操作打开“其他半透明”后查看和操作;重叠的流程零件可主动使用“隐藏其他”隔离查看。测试记录这些工具使用,不再靠自动移除车身保证命中。</p><p>${flowFiles.map(f=>`<a href="../bridge-solid-view-flow-20260915/${f}">${f}</a>`).join(' · ')}</p></div>
  34. <p>环境:本机与局域网,经 6100 Gateway。${summary.data}</p><p>构建(含类型检查及模型发布包校验)、正式路由契约、Git 差异检查通过。</p><p><a href="result.json">四场景显隐回归</a> · <a href="../bridge-solid-view-lan-20260915/result.json">局域网记录</a> · <a href="../bridge-solid-view-before-20260915/result.json">修复前复现</a> · <a href="summary.json">汇总记录</a></p></main></html>`;
  35. await fs.writeFile(path.join(folder,'index.html'),html);
  36. const browser=await chromium.launch({channel:'msedge',headless:true});
  37. try{const page=await browser.newPage({viewport:{width:1400,height:1000}});await page.goto(pathToFileURL(path.join(folder,'index.html')).href);assert.ok(await page.locator('img').evaluateAll(imgs=>imgs.every(i=>i.complete&&i.naturalWidth>0)));await page.screenshot({path:path.join(folder,'report-overview.png')});}finally{await browser.close();}
  38. console.log(JSON.stringify({pass:true,operations:summary.operations,report:path.join(folder,'index.html')}));