您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

37 行
8.0 KiB

  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import assert from 'node:assert/strict';
  4. const root=path.resolve('reports/animation-capabilities-20260912');
  5. const sections=[['model','模型编辑与发布'],['guide','指导书在线使用与交付'],['offline','离线播放'],['teaching','正式教学视口'],['training-editor','训练编辑器绑定']];
  6. const escape=value=>String(value??'').replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]));
  7. const results=sections.map(([key,name])=>({key,name,...JSON.parse(fs.readFileSync(path.join(root,key+'-checks.json'),'utf8'))}));
  8. for(const result of results){assert.ok(result.checks.every(c=>c.pass),result.key);assert.equal(result.errors.length,0,result.key);}
  9. const f=JSON.parse(fs.readFileSync(path.join(root,'fixture.json'),'utf8'));
  10. const shots=[['01-animation-settings','动作与轨道设置:范围、结束处理、路径和阀门联动'],['02-editor-end-pose','模型编辑器中的组合动作'],['03-model-reopened','刷新重开后恢复动画配置'],['05-guide-model-animation','正式指导书模型视口'],['07-offline-before','离线包加载模型'],['08-offline-animation','离线片段播放及暂停'],['09-teaching-animation','教学步骤:保持末帧、清洁状态和流向开通'],['10-teaching-reset','教学步骤:播放结束复位并关闭流向'],['11-training-action-library','训练编辑器读取正式动作目录'],['12-training-action-bound','通过页面绑定并保存动作']];
  11. const total=results.reduce((n,r)=>n+r.checks.length,0);
  12. const html=`<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>动画能力实施与测试报告 · 2026-09-12</title>
  13. <style>body{margin:0;background:#edf3f3;color:#173c40;font:15px/1.8 "Microsoft YaHei",sans-serif}main{max-width:1200px;margin:32px auto;padding:0 24px 60px}header,section{background:white;border:1px solid #cddede;border-radius:12px;padding:26px;margin:20px 0}h1{font-size:28px;margin:0}h2{font-size:21px;margin:0 0 14px}h3{font-size:17px;margin:12px 0}p{margin:10px 0}a{color:#087d6c}table{border-collapse:collapse;width:100%}th,td{padding:12px;text-align:left;border:1px solid #d8e6e5;vertical-align:top}th{background:#eff6f5}.pass{color:#087954;font-weight:bold}.meta{color:#567677}.grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.grid figure{margin:0;border:1px solid #cddede;border-radius:8px;overflow:hidden}.grid img{display:block;width:100%}.grid figcaption{padding:12px}.badge{display:inline-block;background:#e4f6ed;border-radius:6px;padding:5px 12px;color:#087954}code{background:#f1f5f5;padding:2px 5px;overflow-wrap:anywhere}@media(max-width:800px){.grid{grid-template-columns:1fr}main{padding:0 12px}section{padding:18px}}</style>
  14. <main><header><p class="meta">数字车间 · 功能实施 / 真实接口 / 浏览器端到端</p><h1>模型动画能力实施与测试报告</h1><p>2026-09-12 · <span class="badge">${total} 项端到端检查通过</span></p><p>按已确认范围补齐命名动作、组合运动、材质状态、流向讲解和跨模块复用。使用独立的牛奶卡车测试工程验证,不修改原始模型和既有业务任务。</p></header>
  15. <section><h2>已实施能力</h2><table><tr><th>能力</th><th>实现与使用</th></tr>
  16. <tr><td>动作片段与机械组合运动</td><td>时间轴设置命名起止范围;旋转中心使用部件局部坐标;位移与 XYZ 旋转叠加,关键帧错开形成顺序动作;支持保持末帧和回到起点。蓝图按名称播放片段。</td></tr>
  17. <tr><td>状态与材质</td><td>新增缩放、显隐、不透明度、颜色、材质状态轨道;材质副本隔离,不污染其他实例。录制与保存保留中性基准,旋转中心偏移不会被重复写入位移关键帧。</td></tr>
  18. <tr><td>回路流向</td><td>配置路径点、颜色、速度、流点数量、正向/反向/停止;可关联标量轨道控制开通。用于工作原理讲解。</td></tr>
  19. <tr><td>跨模块复用</td><td>训练编辑器从正式目录选动作,保存步骤绑定;教学任务固定模型/场景/训练版本;指导书在线模型与离线 ZIP 使用同一动画求值规则。原生 GLB 动画仍可选择。</td></tr></table></section>
  20. <section><h2>实测结果</h2>${results.map(r=>`<h3>${escape(r.name)}</h3><table><tr><th>检查</th><th>结果</th></tr>${r.checks.map(c=>`<tr><td>${escape(c.name)}</td><td class="pass">通过</td></tr>`).join('')}</table><p class="meta"><a href="${r.key}-checks.json">查看原始检查记录</a> · 浏览器脚本异常 ${r.errors.length} 条</p>`).join('')}
  21. <p>补充验证:前端类型检查及生产构建通过;生成的模型编辑器 public/dist 文件哈希一致。后端 18 条校验、快照与考试提示隔离用例通过;原型 5 项合同测试、Web 4 项场景/缓存/落地测试通过。构建仅有现有的大分块提示。</p>
  22. <p class="meta">测试采用真实登录、GLB、保存/发布/下载接口。部分配置和视口内部状态由 Playwright 调用页面模块核对;教学原生 GLB 切换为浏览器运行时兼容检查。离线用例阻断业务接口及公网请求,外部请求数为 0。</p></section>
  23. <section><h2>可继续使用的测试数据</h2><table><tr><th>数据</th><th>标识</th><th>入口</th></tr>
  24. <tr><td>组合动作模型</td><td>${f.modelId} · 固定模型版本 ${f.modelVersionId}</td><td><a href="http://127.0.0.1:6180/content/models/${f.modelId}/edit">打开模型编辑器</a></td></tr>
  25. <tr><td>测试场景</td><td>${f.animationSceneId} · 版本 ${f.animationSceneVersionId}</td><td><a href="http://127.0.0.1:6180/content/scenes/${f.animationSceneId}/edit">打开场景</a></td></tr>
  26. <tr><td>两步骤测试训练</td><td>${f.animationTrainingId}</td><td><a href="http://127.0.0.1:6180/content/training-projects/${f.animationTrainingId}/legacy">打开训练编排</a></td></tr>
  27. <tr><td>固定快照教学任务</td><td>${f.animationAssignmentId} · 训练版本 482</td><td><a href="http://127.0.0.1:6180/teaching/virtual-training/preview/${f.animationAssignmentId}">打开教学预览</a></td></tr>
  28. <tr><td>动画指导书</td><td>${f.guideId}</td><td><a href="http://127.0.0.1:6180/content/ofd/${f.guideId}/studio?view=editor">打开指导书</a> · <a href="animation-guide.zip">下载实测离线包</a></td></tr></table>
  29. <p>训练当前保留实测保存的草稿;已有任务仍使用旧发布快照,这正是版本隔离测试验证的行为。试验性教学任务未产生学员成绩。</p></section>
  30. <section><h2>使用顺序与边界</h2><ol><li>模型编辑器时间轴添加轨道,选择部件、属性及关键帧;进入「动作与轨道设置」配置片段、枢轴、材质状态或流向。</li><li>保存并发布模型,在场景选择固定版本;训练的「步骤动画」选择正式动作并保存。</li><li>发布训练、下发新任务后在教学端使用;指导书关联模型片段后可在线播放或导出离线 ZIP。</li></ol>
  31. <p>本次没有数据库表改动。未加入新的密钥文件、独立服务或认证方式。代码尚未提交 Git。</p>
  32. <p>污渍/清洁通过颜色和粗糙度等 PBR 参数表达;贴图擦除、软管/密封圈弹性变形、真实流体压力计算、整片视频导出不在本次实施范围。表格中的具体装备动作仍需配置部件、路径和时序,本报告不代表已经制作完成全部动画素材。</p></section>
  33. <section><h2>浏览器截图</h2><p class="meta">点击图片查看原图。</p><div class="grid">${shots.map(([file,title])=>`<figure><a href="${file}.png"><img loading="lazy" src="${file}.png" alt="${escape(title)}"></a><figcaption>${escape(title)}</figcaption></figure>`).join('')}</div></section></main></html>`;
  34. fs.writeFileSync(path.join(root,'index.html'),html);
  35. fs.writeFileSync(path.join(root,'summary.json'),JSON.stringify({date:'2026-09-12',passed:total,failed:0,backendTests:18,prototypeContractTests:5,webTests:4,build:'passed',ddlChanges:false},null,2));
  36. console.log(`Report generated: ${total} checks passed`);