index.template.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>真味道香菜面|单 SKU 验证交接</title>
  7. <style>
  8. :root{font-family:"Microsoft YaHei",system-ui,sans-serif;color:#20312b;background:#f4f6f2;font-size:16px;line-height:1.7}*{box-sizing:border-box}body{margin:0}main{max-width:1080px;margin:auto;padding:36px 24px 64px}h1,h2,h3,p{margin:0 0 14px}h1{font-size:clamp(25px,4vw,38px);line-height:1.35}h2{font-size:23px}h3{font-size:18px}a{color:#176647}section,.hero{margin-bottom:22px;padding:26px;background:white;border:1px solid #d9e2da;border-radius:16px}.hero{background:#173f31;color:white}.hero .muted{color:#d3e2d9}.eyebrow{font-size:13px;letter-spacing:.08em;margin-bottom:10px}.status{display:inline-block;background:#f8e9bd;color:#654d05;border-radius:20px;padding:4px 13px;font-size:14px;margin-bottom:16px}.muted{color:#5e7165;font-size:14px}.callout{border-left:4px solid #b48a28;background:#fff9e9;padding:14px 18px;margin:18px 0}.cards,.gallery,.form-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.card{background:#f3f7f3;padding:16px;border-radius:10px}.card strong{display:block;font-size:24px}.card small{display:block;color:#5e7165}.facts{display:grid;grid-template-columns:170px minmax(0,1fr);margin:0}.facts dt,.facts dd{margin:0;padding:11px 0;border-bottom:1px solid #e4eae5}.facts dt{font-weight:600}.facts dd{padding-left:20px}.gallery{align-items:start}.gallery figure{margin:0}.gallery img{display:block;width:100%;height:auto;max-width:290px;border-radius:10px;background:#ecf0ea}.gallery figcaption{font-size:14px;padding-top:8px}.gallery details{margin-top:8px}.gallery details[open] img{max-width:none}.gallery summary{cursor:pointer;color:#176647}blockquote{margin:14px 0;padding:16px 20px;background:#f3f7f3;border-left:3px solid #6f917d}label{display:block;font-size:14px;font-weight:600}input,textarea{display:block;width:100%;font:inherit;font-size:15px;color:inherit;padding:10px;border:1px solid #aebdb1;border-radius:7px;margin:6px 0 13px;background:#fff}textarea{min-height:100px;resize:vertical}.form-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:0 20px}.wide{grid-column:1/-1}button,.button{font:inherit;border:0;border-radius:7px;padding:11px 18px;background:#176647;color:white;cursor:pointer;display:inline-block;text-decoration:none}button.secondary{background:#e5eee6;color:#20312b}.actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:16px 0}.actions a{font-size:14px}.steps{padding-left:24px}.steps li{margin-bottom:12px}.scroll{max-width:100%;overflow:auto}table{border-collapse:collapse;width:100%;font-size:14px}th,td{text-align:left;vertical-align:top;border-bottom:1px solid #dce5dd;padding:12px 10px;overflow-wrap:anywhere}th{background:#edf3ec}.source{overflow-wrap:anywhere;font-size:13px}details summary{font-weight:600}pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:12px}footer{font-size:13px;color:#5e7165}p,dd,li,figcaption{overflow-wrap:anywhere}:focus-visible{outline:3px solid #d09b24;outline-offset:3px}@media(max-width:680px){main{padding:18px 12px 36px}section,.hero{padding:20px 16px;border-radius:12px}.cards,.gallery,.form-grid{grid-template-columns:1fr}.gallery img{max-width:100%}.facts{grid-template-columns:1fr}.facts dt{border-bottom:0;padding-bottom:0}.facts dd{padding:3px 0 13px}.wide{grid-column:auto}.card strong{font-size:22px}}@media print{body{background:white}main{padding:0}.hero{background:white;color:#20312b}.hero .muted{color:#5e7165}section{break-inside:avoid;border-radius:0}.actions,.form-note{display:none}.gallery img{max-height:360px;object-fit:contain;object-position:left}.form-grid{display:none}}
  9. </style>
  10. </head>
  11. <body>
  12. <main>
  13. <header class="hero">
  14. <p class="eyebrow">产品资料核对 · 说明理解测试</p>
  15. <span class="status">等待现行包装资料</span>
  16. <h1>真味道香菜面:先确认说明,再验证理解</h1>
  17. <p>用一个 SKU 核实当前包装与消费者照片的关系,找出冲调与投料说明中可能的理解障碍。</p>
  18. <p class="muted">jd:100297147639 · 香辣牛肉 · 标题声明96g×24袋 · 2026-11-07</p>
  19. </header>
  20. <section aria-labelledby="handoff-title">
  21. <h2 id="handoff-title">01 · 产品部现在需要提供什么</h2>
  22. <div class="cards"><div class="card"><strong>1款</strong><small>本轮集中核对</small></div><div class="card"><strong>3张</strong><small>已有消费者包装照片</small></div><div class="card"><strong>0人</strong><small>用户测试尚未开展</small></div></div>
  23. <ol class="steps">
  24. <li><b>现行版本依据:</b>在售版本、生效日期、生产日期或批次示例,以及与WXFC-1A的对应关系。</li>
  25. <li><b>完整包装:</b>正背侧面或展开稿,覆盖配料表、营养表、全部冲调方法和脚注。可分多张提供。</li>
  26. <li><b>正式说明:</b>各方法的水量、时间、操作顺序,以及已有投料比例或按口味调整指引的原文。</li>
  27. <li><b>营养基准:</b>单袋净含量、每份定义、每袋份数、钠标示及计量单位,以当前正式资料为准。</li>
  28. </ol>
  29. <p class="muted">王刚001核对字段与来源,运维001归档原件。其余7款沿用既有缺件台账;本轮先核这一款。</p>
  30. <div class="actions"><a class="button" href="产品部资料需求.md" download>下载产品部资料需求</a><button class="secondary" type="button" onclick="window.print()">打印本页</button></div>
  31. </section>
  32. <section aria-labelledby="evidence-title">
  33. <h2 id="evidence-title">02 · 现有资料能确认什么</h2>
  34. <dl class="facts">
  35. <dt>原评价</dt><dd>2026-11-06 10:49:00;自述少放调料,顾虑盐摄入。默认状态、评分量表与购买身份核验状态保留未知或原值。</dd>
  36. <dt>包装标示</dt><dd><b>钠2414mg/每份96g,NRV121%</b>。这是历史照片中的标示值。</dd>
  37. <dt>换算值</dt><dd>2414÷96×100≈<b>2515mg/100g</b>,非包装原列、非检测值。</dd>
  38. <dt>冲调局部</dt><dd>可见“方法二:泡面”、460ml沸水、依次加入粉包/酱包/菜包;“静置4…”后文被裁切,完整时间与其他方法待核。</dd>
  39. <dt>包装信息</dt><dd><b>GB 17400、WXFC-1A</b>,保质期六个月;未见生产日期或批号。</dd>
  40. <dt>SKU对应程度</dt><dd>图示口味与评价相符,每份96g与标题数字相符;24袋箱规来自商品信息。单袋照片不能独立确认箱规、净含量或现售版本。</dd>
  41. <dt>投料说明范围</dt><dd>所附局部图未见“半包”或分次投料说明;完整包装是否另有说明仍待核。</dd>
  42. </dl>
  43. <div class="callout">“半包粉包”不能直接换算成整份食品钠减半;面饼、粉包与酱包均列有食用盐。NRV121%也不是产品违法或钠“超标”的判定。</div>
  44. <blockquote>%%REVIEW_QUOTE%%</blockquote>
  45. <p class="muted source">评价ID:jd:100297147639:106531290235443828。图片为消费者附图;原尺寸608×1080。</p>
  46. <div class="gallery">%%GALLERY%%</div>
  47. <details style="margin-top:20px"><summary>来源与校验记录</summary><p class="source">固定代际:82b104fc024b49a75d2f5376bf9778ced6f63a9433b5fc5a6daa3c458d05d5ea。沿用本地既存分页结果和用户附件。</p><p class="source">附件SHA-256:6292c2303a391a33a4e6f393527c433f46a82c31b12643c877acfc6a1114429a;8个条目,清单7/7通过。</p><p><a href="evidence.json">事实与待核字段</a> · <a href="sources/review.json">原评价摘录</a> · <a href="sources/archive-verification.json">附件校验记录</a></p></details>
  48. </section>
  49. <section aria-labelledby="response-title">
  50. <h2 id="response-title">03 · 收到资料后在这里回填</h2>
  51. <p>请注明来源文件和页/图号。未知项可留空;回填完成后仍需核对。历史照片数据不会自动填入现行版字段。</p>
  52. <form id="response-form">
  53. <div class="form-grid">
  54. <label>提供部门 / 联系人<input name="providedBy" autocomplete="off"></label>
  55. <label>资料日期<input name="providedAt" type="date"></label>
  56. <label>当前在售版本<input name="version"></label>
  57. <label>版本生效日期<input name="effectiveDate" type="date"></label>
  58. <label>生产日期 / 批次示例<input name="batchOrProductionDate"></label>
  59. <label>SKU / 口味 / 箱规对应依据<input name="skuMatchEvidence"></label>
  60. <label>单袋净含量(g)<input name="netWeightG" type="number" min="0" step="any"></label>
  61. <label>营养表每份克重(g)<input name="servingSizeG" type="number" min="0" step="any"></label>
  62. <label>每袋份数<input name="servingsPerPackage" type="number" min="0" step="any"></label>
  63. <label>钠标示值(mg)<input name="sodiumMg" type="number" min="0" step="any"></label>
  64. <label>钠计量基准(请照原文)<input name="sodiumBasis" placeholder="例如:每份96克;按当前包装填写"></label>
  65. <label>钠NRV(%)<input name="sodiumNrvPercent" type="number" min="0" step="any"></label>
  66. <label class="wide">所有冲调方法原文<textarea name="preparationMethodsVerbatim"></textarea></label>
  67. <label class="wide">投料比例 / 调整指引原文<textarea name="doseInstructionsVerbatim" placeholder="若完整资料中未列,请说明已核对哪些位置"></textarea></label>
  68. <label class="wide">完整包装及其他附件的文件名、页/图号<textarea name="completeLabelFileReferences"></textarea></label>
  69. <label class="wide">与历史照片的异同 / 尚未确认的事项<textarea name="differencesFromReviewPhotos"></textarea></label>
  70. </div>
  71. <div class="actions"><button type="submit">下载回填 JSON</button><a href="current-label-response.template.json" download>下载空白模板</a></div>
  72. <p class="muted form-note">回填仅在当前页面保留。关闭前请下载;附件请与JSON一起交接。此页不会上传资料或发送消息。</p>
  73. <p id="export-feedback" role="status" aria-live="polite"></p>
  74. </form>
  75. </section>
  76. <section aria-labelledby="protocol-title">
  77. <h2 id="protocol-title">04 · 资料核实后的最小验证</h2>
  78. <p><b>启动条件:</b>现售版本、完整标签与主持答案表已核对。当前状态仍为等待资料;访谈尚未启动。</p>
  79. <ol class="steps">
  80. <li><b>基线5人:</b>查看现行包装,口述方法、水量、时间、顺序,以及调料用法的依据。先记录首次回答,再解释。</li>
  81. <li><b>最后问营养基准:</b>钠数值对应多少克、多少份?仅凭标签能否知道半包粉包后总钠是多少?</li>
  82. <li><b>记录共同障碍:</b>同一关键点若至少2/5人出现同类错误,作为修订线索。标签未提供的信息单列,不算参与者答错。</li>
  83. <li><b>有线索再做稿:</b>先研究排版、步骤和表达。涉及投料方式变化时,先由产品部确认适用性;再用另外5人复测。</li>
  84. </ol>
  85. <p class="muted">便利样本、只看说明、无需试吃;结果仅支持说明理解线索。参与者未招募,结果表为空。</p>
  86. <div class="actions"><a class="button" href="说明理解测试方案.md" download>下载主持提纲与记录表</a><a href="README.md">查看完整交接说明</a></div>
  87. </section>
  88. <footer>新增付费调用0 · 生产写入0 · 已扣¥46.20 / 未决¥0 / 保留¥3.80 · 八店v3与机会排序保持现状</footer>
  89. </main>
  90. <script id="response-template" type="application/json">%%RESPONSE_TEMPLATE%%</script>
  91. <script>
  92. const responseForm = document.getElementById('response-form');
  93. const responseTemplate = JSON.parse(document.getElementById('response-template').textContent);
  94. function readResponse() {
  95. const result = structuredClone(responseTemplate);
  96. const fields = new FormData(responseForm);
  97. for (const key of ['providedBy', 'providedAt']) result[key] = String(fields.get(key) || '').trim() || null;
  98. for (const key of Object.keys(result.currentLabel)) {
  99. const raw = String(fields.get(key) || '').trim();
  100. const input = responseForm.elements.namedItem(key);
  101. result.currentLabel[key] = raw === '' ? null : input.type === 'number' ? Number(raw) : raw;
  102. }
  103. return result;
  104. }
  105. responseForm.addEventListener('submit', event => {
  106. event.preventDefault();
  107. const result = readResponse();
  108. const file = new Blob([JSON.stringify(result, null, 2) + '\n'], {type:'application/json;charset=utf-8'});
  109. const url = URL.createObjectURL(file);
  110. const link = document.createElement('a');
  111. link.href = url;
  112. link.download = 'jd-100297147639-current-label-response.json';
  113. document.body.append(link);
  114. link.click();
  115. link.remove();
  116. setTimeout(() => URL.revokeObjectURL(url), 1000);
  117. document.getElementById('export-feedback').textContent = '回填文件已生成;核验状态仍为待核,请连同来源附件一起交接。';
  118. });
  119. </script>
  120. </body>
  121. </html>