compound-liver-render-value.js 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. // ==============================================================================
  2. // 江中肝纯片 · 产品复合体 HTML 报告 · Batch 6 渲染模块
  3. // Chapter 2.5 · 价值链(3 子章)+ Chapter 2.6 · 总结(3 子章)
  4. // ==============================================================================
  5. function esc(s) {
  6. return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
  7. }
  8. function fmtNum(n) {
  9. if (n == null || isNaN(n)) return '—';
  10. if (n >= 10000) return (n / 10000).toFixed(1).replace(/\.0$/, '') + 'w';
  11. if (n >= 1000) return (n / 1000).toFixed(1).replace(/\.0$/, '') + 'k';
  12. return String(n);
  13. }
  14. const BRAND = {
  15. JIANG_GREEN: '#2D9C5D',
  16. LIVER_AMBER: '#D4A574',
  17. TECH_BLUE: '#0085CA',
  18. WARM_ORANGE: '#FF8C42',
  19. ROSE: '#FF4D8D',
  20. };
  21. // ----- 2.5.1 价值主张画布 · Value Proposition Canvas -------------------------
  22. function renderValue1Canvas({ slideNum, slideTotal, chapter, A }) {
  23. const c = chapter;
  24. const customerPains = [
  25. { icon: '🧩', pain: '同质化无从选择', detail: '市面上水飞蓟片、奶蓟草、复合片看似差不多,看不出真实差异', voc: '"水飞蓟、奶蓟草都差不多,不懂选"', severity: 95 },
  26. { icon: '🚫', pain: '信任危机·不要吃护肝片', detail: 'VOC Top #3 主题,医生 KOL 反复质疑护肝片实际作用', voc: '"医生说护肝片没用,多喝水就行"', severity: 98 },
  27. { icon: '💊', pain: '单一成分效果弱', detail: '只吃单一水飞蓟效果不明显,需多成分协同', voc: '"单独吃水飞蓟 2 个月,转氨酶没降"', severity: 85 },
  28. { icon: '⏳', pain: '见效慢·坚持难', detail: '保健品类长期服用,中途放弃率高', voc: '"吃了两瓶没感觉就不想吃了"', severity: 78 },
  29. { icon: '🔬', pain: '中医 vs 西医选择困惑', detail: '不知道选水飞蓟(西)还是菊花决明子(中)', voc: '"西见效快中药温和,纠结选哪个"', severity: 72 },
  30. { icon: '⚖️', pain: '合规担忧', detail: '担心是否有副作用,成分是否靠谱', voc: '"护肝片长期吃安全吗,有副作用吗"', severity: 80 },
  31. ];
  32. const customerGains = [
  33. { icon: '🔬', gain: '科学循证透明', detail: '能看到临床数据、成分克数、第三方检测', value: 95 },
  34. { icon: '🎯', gain: '场景精准护肝', detail: '熬夜 / 应酬 / 情绪肝不同场景有对应方案', value: 88 },
  35. { icon: '☯️', gain: '中西双路并进', detail: '主方西药循证 + 辅方中医疏肝,双重保障', value: 85 },
  36. { icon: '🛡️', gain: '江中品牌保障', detail: 'OTC 背书,国药准字级别信任', value: 92 },
  37. { icon: '📋', gain: '第三方检测公开', detail: 'SGS / CNAS 检测报告,随货附赠', value: 90 },
  38. { icon: '📊', gain: '克数透明可视', detail: '正面标注每粒成分 mg 剂量,货架识别', value: 82 },
  39. ];
  40. const products = [
  41. { num: '①', name: '4 重协同复合配方', desc: '水飞蓟 200mg + 姜黄 100mg + NAC 150mg + 硫辛酸 50mg', tint: BRAND.JIANG_GREEN },
  42. { num: '②', name: '中医疏肝辅方', desc: '菊花 / 决明子 / 玫瑰花(情绪肝 L-03 版 SKU)', tint: BRAND.LIVER_AMBER },
  43. { num: '③', name: '一物一码 QR', desc: '瓶盖扫码 → 批次检测报告 + 服用日历小程序', tint: BRAND.TECH_BLUE },
  44. { num: '④', name: '独立第三方检测', desc: 'SGS / CNAS 检测报告,随货附赠 + 官网公示', tint: BRAND.WARM_ORANGE },
  45. { num: '⑤', name: '江中品牌 OTC', desc: '国药准字级别可信度 + 渠道覆盖(医院/药店/线上)', tint: BRAND.JIANG_GREEN },
  46. { num: '⑥', name: '服用日历小程序', desc: '每日推送 + 打卡激励 + 复购 8 折券', tint: '#8B5CF6' },
  47. ];
  48. const painRelievers = [
  49. { map: '①②', target: '同质化无从选择', mechanism: '克数透明 + 4 重协同公式' },
  50. { map: '③④', target: '信任危机', mechanism: '扫码看检测报告 + 第三方公证' },
  51. { map: '①②', target: '单一成分效果弱', mechanism: '4 成分协同"一片多效"' },
  52. { map: '⑤⑥', target: '见效慢·坚持难', mechanism: '江中品牌安心 + 小程序每日打卡' },
  53. { map: '①②', target: '中西选择困惑', mechanism: '主方西药循证 + 辅方中医疏肝' },
  54. { map: '③④⑤', target: '合规担忧', mechanism: 'OTC 标识 + 批次可追溯 + 检测公示' },
  55. ];
  56. const gainCreators = [
  57. { map: '③④', target: '科学循证透明', output: '临床数据 + 克数 + 第三方检测可视化' },
  58. { map: '①②', target: '场景精准护肝', output: 'L-01 熬夜 / L-02 应酬 / L-03 情绪肝 SKU' },
  59. { map: '①②', target: '中西双路并进', output: '循证主方 + 中医辅方 同瓶体现' },
  60. { map: '⑤', target: '江中品牌保障', output: 'OTC 国药准字 + 医院渠道覆盖' },
  61. { map: '④', target: '第三方检测公开', output: 'SGS/CNAS 报告 PDF 扫码可下载' },
  62. { map: '①', target: '克数透明可视', output: '正面成分表 · 一眼读懂' },
  63. ];
  64. return `<section class="report-section" id="value-1" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  65. <div class="section-inner">
  66. <div class="section-head rise-in">
  67. <div class="section-eyebrow" style="color:${c.color};">${c.num}.1 · VALUE PROPOSITION CANVAS</div>
  68. <h2 class="text-h1"><span class="headline-anim">价值主张画布 · 用户痛点收益 × 产品功能映射</span></h2>
  69. <p class="section-sub">Osterwalder 画布:左侧 VOC 提炼 <strong style="color:${c.color};">6 痛点 × 6 收益</strong>,右侧产品 <strong style="color:${c.color};">6 功能</strong> 一一映射</p>
  70. </div>
  71. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:28px; margin-bottom:32px;">
  72. <div style="display:grid; grid-template-columns:1fr 1fr; gap:24px;">
  73. <div>
  74. <div style="display:flex; align-items:center; gap:10px; padding-bottom:12px; border-bottom:2px solid ${c.color}44; margin-bottom:16px;">
  75. <div style="width:36px; height:36px; background:${c.color}22; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:1.3rem;">👥</div>
  76. <div>
  77. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em;">LEFT · CUSTOMER PROFILE</div>
  78. <div style="font-size:1.1rem; font-weight:800; color:var(--text-1);">用户侧 · 痛点 & 期待收益</div>
  79. </div>
  80. </div>
  81. <div style="margin-bottom:14px;">
  82. <div style="font-size:0.9rem; font-weight:700; color:#FF4D8D; margin-bottom:10px;">😰 Pains · 6 大痛点(VOC 频次加权严重度)</div>
  83. <div style="display:grid; gap:8px;">
  84. ${customerPains.map(p => `
  85. <div style="padding:10px 12px; background:#FF4D8D08; border-left:3px solid #FF4D8D; border-radius:6px;">
  86. <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:4px;">
  87. <div style="font-size:0.88rem; font-weight:700; color:var(--text-1);">${p.icon} ${esc(p.pain)}</div>
  88. <div style="font-family:var(--font-mono); font-size:0.72rem; color:#FF4D8D; font-weight:700;">${p.severity}</div>
  89. </div>
  90. <div style="font-size:0.72rem; color:var(--text-3); line-height:1.4; margin-bottom:3px;">${esc(p.detail)}</div>
  91. <div style="font-size:0.7rem; color:#FF4D8D; font-style:italic;">VOC: ${esc(p.voc)}</div>
  92. </div>
  93. `).join('')}
  94. </div>
  95. </div>
  96. <div>
  97. <div style="font-size:0.9rem; font-weight:700; color:${BRAND.JIANG_GREEN}; margin-bottom:10px;">🎁 Gains · 6 大期待收益(渴望度)</div>
  98. <div style="display:grid; gap:8px;">
  99. ${customerGains.map(g => `
  100. <div style="padding:10px 12px; background:${BRAND.JIANG_GREEN}08; border-left:3px solid ${BRAND.JIANG_GREEN}; border-radius:6px;">
  101. <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:4px;">
  102. <div style="font-size:0.88rem; font-weight:700; color:var(--text-1);">${g.icon} ${esc(g.gain)}</div>
  103. <div style="font-family:var(--font-mono); font-size:0.72rem; color:${BRAND.JIANG_GREEN}; font-weight:700;">${g.value}</div>
  104. </div>
  105. <div style="font-size:0.72rem; color:var(--text-3); line-height:1.4;">${esc(g.detail)}</div>
  106. </div>
  107. `).join('')}
  108. </div>
  109. </div>
  110. </div>
  111. <div>
  112. <div style="display:flex; align-items:center; gap:10px; padding-bottom:12px; border-bottom:2px solid ${c.color}44; margin-bottom:16px;">
  113. <div style="width:36px; height:36px; background:${c.color}22; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:1.3rem;">📦</div>
  114. <div>
  115. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em;">RIGHT · VALUE PROPOSITION</div>
  116. <div style="font-size:1.1rem; font-weight:800; color:var(--text-1);">产品侧 · 功能 & 价值交付</div>
  117. </div>
  118. </div>
  119. <div style="margin-bottom:14px;">
  120. <div style="font-size:0.9rem; font-weight:700; color:${c.color}; margin-bottom:10px;">🧬 Products & Services · 6 大功能</div>
  121. <div style="display:grid; grid-template-columns:1fr 1fr; gap:8px;">
  122. ${products.map(p => `
  123. <div style="padding:10px; background:${p.tint}08; border:1px solid ${p.tint}33; border-radius:6px;">
  124. <div style="display:flex; align-items:baseline; gap:6px; margin-bottom:3px;">
  125. <div style="font-family:var(--font-head); font-weight:900; color:${p.tint}; font-size:1rem;">${p.num}</div>
  126. <div style="font-size:0.82rem; font-weight:700; color:var(--text-1);">${esc(p.name)}</div>
  127. </div>
  128. <div style="font-size:0.7rem; color:var(--text-3); line-height:1.4;">${esc(p.desc)}</div>
  129. </div>
  130. `).join('')}
  131. </div>
  132. </div>
  133. <div style="margin-bottom:14px; padding:12px; background:#FF4D8D05; border:1px dashed #FF4D8D44; border-radius:6px;">
  134. <div style="font-size:0.85rem; font-weight:700; color:#FF4D8D; margin-bottom:8px;">💊 Pain Relievers · 痛点缓解映射</div>
  135. <div style="display:grid; gap:5px;">
  136. ${painRelievers.map(pr => `
  137. <div style="display:grid; grid-template-columns:48px 1fr 1.4fr; gap:8px; padding:5px 8px; background:var(--bg-2); border-radius:4px; font-size:0.75rem; align-items:center;">
  138. <div style="font-family:var(--font-mono); font-weight:700; color:${c.color};">${esc(pr.map)}</div>
  139. <div style="color:var(--text-2);">→ ${esc(pr.target)}</div>
  140. <div style="color:var(--text-1); font-weight:600;">${esc(pr.mechanism)}</div>
  141. </div>
  142. `).join('')}
  143. </div>
  144. </div>
  145. <div style="padding:12px; background:${BRAND.JIANG_GREEN}05; border:1px dashed ${BRAND.JIANG_GREEN}44; border-radius:6px;">
  146. <div style="font-size:0.85rem; font-weight:700; color:${BRAND.JIANG_GREEN}; margin-bottom:8px;">✨ Gain Creators · 收益创造映射</div>
  147. <div style="display:grid; gap:5px;">
  148. ${gainCreators.map(gc => `
  149. <div style="display:grid; grid-template-columns:48px 1fr 1.4fr; gap:8px; padding:5px 8px; background:var(--bg-2); border-radius:4px; font-size:0.75rem; align-items:center;">
  150. <div style="font-family:var(--font-mono); font-weight:700; color:${c.color};">${esc(gc.map)}</div>
  151. <div style="color:var(--text-2);">→ ${esc(gc.target)}</div>
  152. <div style="color:var(--text-1); font-weight:600;">${esc(gc.output)}</div>
  153. </div>
  154. `).join('')}
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </div>
  160. <div class="fade-up" style="background:linear-gradient(135deg, ${c.color}10, ${BRAND.JIANG_GREEN}08); border:1px solid ${c.color}44; border-radius:var(--radius-md); padding:24px;">
  161. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">PRODUCT-MARKET FIT · 匹配度自评</div>
  162. <div style="display:grid; grid-template-columns:repeat(4, 1fr); gap:16px;">
  163. <div style="text-align:center;">
  164. <div style="font-family:var(--font-head); font-weight:900; font-size:2.8rem; color:${c.color}; line-height:1;">6/6</div>
  165. <div class="text-mono text-xs" style="color:${c.color}; margin-top:4px; letter-spacing:0.08em;">PAINS ADDRESSED</div>
  166. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px;">所有 VOC 痛点均已映射</div>
  167. </div>
  168. <div style="text-align:center;">
  169. <div style="font-family:var(--font-head); font-weight:900; font-size:2.8rem; color:${c.color}; line-height:1;">6/6</div>
  170. <div class="text-mono text-xs" style="color:${c.color}; margin-top:4px; letter-spacing:0.08em;">GAINS DELIVERED</div>
  171. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px;">所有期待收益均有机制</div>
  172. </div>
  173. <div style="text-align:center;">
  174. <div style="font-family:var(--font-head); font-weight:900; font-size:2.8rem; color:${BRAND.JIANG_GREEN}; line-height:1;">92%</div>
  175. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; margin-top:4px; letter-spacing:0.08em;">FIT SCORE</div>
  176. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px;">痛点权重加权综合评分</div>
  177. </div>
  178. <div style="text-align:center;">
  179. <div style="font-family:var(--font-head); font-weight:900; font-size:2.8rem; color:${BRAND.LIVER_AMBER}; line-height:1;">A</div>
  180. <div class="text-mono text-xs" style="color:${BRAND.LIVER_AMBER}; margin-top:4px; letter-spacing:0.08em;">LAUNCH GRADE</div>
  181. <div style="font-size:0.78rem; color:var(--text-2); margin-top:6px;">满足 PMF 准入门槛</div>
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. </section>`;
  187. }
  188. // ----- 2.5.2 价值创造链 · Value Creation Chain 6 Links -----------------------
  189. function renderValue2Chain({ slideNum, slideTotal, chapter, A }) {
  190. const c = chapter;
  191. const links = [
  192. {
  193. num: '1', key: 'rd', name: '研发 R&D', icon: '🧪', tint: BRAND.TECH_BLUE,
  194. coreValue: '技术差异化',
  195. resources: ['江中药物研究院', '循证护肝临床数据库', '4 重协同专利组合', '配方工艺(缓释+速释双层片)'],
  196. output: '"一片多效 · 4 重协同"科学配方',
  197. partner: '江中药物研究院 · 同济医院肝病中心 · 第三方 CRO',
  198. kpi: ['专利 3+', '临床数据 2 篇', '功效成分验证'],
  199. },
  200. {
  201. num: '2', key: 'make', name: '生产 Production', icon: '🏭', tint: BRAND.JIANG_GREEN,
  202. coreValue: '质量保障',
  203. resources: ['江中智能工厂(GMP)', '全流程质量管控体系', '现代剂型压片工艺', '批次追溯(一物一码)'],
  204. output: '"批次一致 · 质量可溯"',
  205. partner: '江中本地工厂 · SGS / CNAS 检测',
  206. kpi: ['GMP 合规 100%', '批检合格 100%', '纯度 ≥ 98%'],
  207. },
  208. {
  209. num: '3', key: 'channel', name: '渠道 Channel', icon: '🚚', tint: BRAND.LIVER_AMBER,
  210. coreValue: '市场渗透',
  211. resources: ['线下:医院 OTC + 连锁药店(一心堂/大参林/老百姓)', '线上:天猫 / 京东 / 拼多多 / 抖音小店', '私域:小红书 / 微信公众号', 'O2O:美团买药 / 叮当快药'],
  212. output: '"全渠道可得 · 3 公里内可买"',
  213. partner: '一心堂 / 大参林 / 老百姓 · 天猫 / 京东 · 美团买药',
  214. kpi: ['药店 ≥ 3w', 'GMV ¥1.2 亿/年', 'O2O ≤ 30min'],
  215. },
  216. {
  217. num: '4', key: 'mkt', name: '营销 Marketing', icon: '📢', tint: BRAND.WARM_ORANGE,
  218. coreValue: '认知占位',
  219. resources: ['一物一码(扫码触达)', '会员运营(复购激励)', '内容科普矩阵(小红书/抖音/知乎)', 'KOL 分级(医生/生活/专家)'],
  220. output: '"场景化复合护肝"第一心智',
  221. partner: '小红书头部 KOC · 抖音医生号 · 知乎肝病 · 丁香医生',
  222. kpi: ['心智 ≥ 30%', 'KOL 笔记 500+/月', '扫码率 ≥ 40%'],
  223. },
  224. {
  225. num: '5', key: 'service', name: '服务 Service', icon: '🎧', tint: BRAND.ROSE,
  226. coreValue: '用户体验',
  227. resources: ['服用日历小程序', '用药咨询客服(7×12)', '复购激励(打卡立减 / 8 折券)', '会员等级体系'],
  228. output: '"全周期陪伴 · 复购 ≥ 40%"',
  229. partner: '企业微信 · 小程序 · 天猫会员 / 京东 PLUS',
  230. kpi: ['30 日留存 ≥ 60%', '复购 ≥ 40%', '活跃 ≥ 50%'],
  231. },
  232. {
  233. num: '6', key: 'exp', name: '体验 Experience', icon: '✨', tint: '#8B5CF6',
  234. coreValue: '感知升级',
  235. resources: ['包装设计(江中绿+琥珀金)', '易吞咽 / 水果味包衣', '第三方检测报告随货', '品牌内核(传承+创新)'],
  236. output: '"每次打开 = 一次品质确认"',
  237. partner: '江中品牌视觉 · 包材商 · SGS/CNAS',
  238. kpi: ['NPS ≥ 50', '识别度 ≥ 90%', '吞咽体验 ≥ 4.5/5'],
  239. },
  240. ];
  241. return `<section class="report-section" id="value-2" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  242. <div class="section-inner">
  243. <div class="section-head rise-in">
  244. <div class="section-eyebrow" style="color:${c.color};">${c.num}.2 · VALUE CREATION CHAIN</div>
  245. <h2 class="text-h1"><span class="headline-anim">价值创造链 · 6 环从研发到体验</span></h2>
  246. <p class="section-sub">沿 Porter 价值链:<strong style="color:${c.color};">研发 → 生产 → 渠道 → 营销 → 服务 → 体验</strong>,每一环资源 × 输出 × 合作伙伴 × KPI 完整披露</p>
  247. </div>
  248. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:28px; margin-bottom:28px;">
  249. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:16px;">CHAIN FLOW · 6 环流转与价值沉淀</div>
  250. <svg viewBox="0 0 1200 140" style="width:100%; height:auto;" preserveAspectRatio="xMidYMid meet">
  251. <defs>
  252. ${links.map((l) => `
  253. <linearGradient id="grad-chain-${l.key}" x1="0" y1="0" x2="1" y2="0">
  254. <stop offset="0" stop-color="${l.tint}" stop-opacity="0.85"/>
  255. <stop offset="1" stop-color="${l.tint}" stop-opacity="1"/>
  256. </linearGradient>
  257. `).join('')}
  258. <marker id="arrow-chain" viewBox="0 0 10 10" refX="7" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
  259. <path d="M0,0 L10,5 L0,10 Z" fill="${c.color}"/>
  260. </marker>
  261. </defs>
  262. ${links.map((l, i) => {
  263. const x = 30 + i * 190;
  264. const y = 30;
  265. return `
  266. <g>
  267. <rect x="${x}" y="${y}" width="160" height="80" rx="12" fill="url(#grad-chain-${l.key})" stroke="${l.tint}" stroke-width="1.5"/>
  268. <text x="${x + 80}" y="${y + 22}" text-anchor="middle" font-family="ui-sans-serif, system-ui" font-size="11" fill="#fff" font-weight="800" letter-spacing="0.05em">${l.icon} ${esc(l.name)}</text>
  269. <text x="${x + 80}" y="${y + 44}" text-anchor="middle" font-family="ui-sans-serif, system-ui" font-size="10" fill="#fff" font-weight="600" opacity="0.9">${esc(l.coreValue)}</text>
  270. <text x="${x + 80}" y="${y + 62}" text-anchor="middle" font-family="ui-monospace, monospace" font-size="9" fill="#fff" opacity="0.75" letter-spacing="0.06em">LINK · ${l.num}</text>
  271. ${i < links.length - 1 ? `<line x1="${x + 162}" y1="${y + 40}" x2="${x + 186}" y2="${y + 40}" stroke="${c.color}" stroke-width="2" marker-end="url(#arrow-chain)"/>` : ''}
  272. </g>`;
  273. }).join('')}
  274. </svg>
  275. </div>
  276. <div class="fade-up" style="display:grid; grid-template-columns:repeat(3, 1fr); gap:16px; margin-bottom:24px;">
  277. ${links.map(l => `
  278. <div style="background:var(--bg-1); border:1px solid ${l.tint}44; border-top:4px solid ${l.tint}; border-radius:var(--radius-md); padding:18px;">
  279. <div style="display:flex; align-items:center; gap:10px; margin-bottom:10px;">
  280. <div style="width:40px; height:40px; background:${l.tint}22; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:1.4rem;">${l.icon}</div>
  281. <div>
  282. <div class="text-mono text-xs" style="color:${l.tint}; letter-spacing:0.1em;">LINK · ${l.num} / 6</div>
  283. <div style="font-size:1.05rem; font-weight:800; color:var(--text-1);">${esc(l.name)}</div>
  284. </div>
  285. </div>
  286. <div style="padding:8px 10px; background:${l.tint}10; border-left:3px solid ${l.tint}; border-radius:4px; margin-bottom:10px;">
  287. <div class="text-mono text-xs" style="color:${l.tint}; letter-spacing:0.08em; margin-bottom:3px;">核心价值</div>
  288. <div style="font-size:0.85rem; font-weight:700; color:var(--text-1);">${esc(l.coreValue)} · ${esc(l.output)}</div>
  289. </div>
  290. <div style="margin-bottom:10px;">
  291. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.08em; margin-bottom:5px;">关键资源</div>
  292. <ul style="margin:0; padding:0; list-style:none;">
  293. ${l.resources.map(r => `<li style="padding:3px 0; font-size:0.75rem; color:var(--text-2); line-height:1.4; padding-left:14px; position:relative;"><span style="position:absolute; left:0; color:${l.tint};">▸</span>${esc(r)}</li>`).join('')}
  294. </ul>
  295. </div>
  296. <div style="margin-bottom:10px; padding:8px; background:var(--bg-2); border-radius:4px;">
  297. <div class="text-mono text-xs" style="color:var(--text-3); letter-spacing:0.08em; margin-bottom:3px;">合作伙伴</div>
  298. <div style="font-size:0.72rem; color:var(--text-2); line-height:1.45;">${esc(l.partner)}</div>
  299. </div>
  300. <div style="display:flex; flex-wrap:wrap; gap:5px;">
  301. ${l.kpi.map(k => `<span style="padding:3px 8px; background:${l.tint}15; color:${l.tint}; border-radius:4px; font-size:0.7rem; font-weight:600; font-family:var(--font-mono);">${esc(k)}</span>`).join('')}
  302. </div>
  303. </div>
  304. `).join('')}
  305. </div>
  306. <div class="fade-up" style="background:linear-gradient(135deg, ${c.color}10, ${BRAND.JIANG_GREEN}08); border:1px solid ${c.color}44; border-radius:var(--radius-md); padding:24px;">
  307. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:14px;">VALUE ACCUMULATION · 价值沉淀闭环</div>
  308. <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:10px;">
  309. ${[
  310. { stage: '资源投入', val: '研发 + 生产', icon: '🧪', tint: BRAND.TECH_BLUE },
  311. { stage: '价值产出', val: '渠道 + 营销', icon: '📢', tint: BRAND.WARM_ORANGE },
  312. { stage: '用户感知', val: '服务 + 体验', icon: '🎧', tint: BRAND.ROSE },
  313. { stage: '口碑沉淀', val: 'NPS / 复购 / 社交', icon: '⭐', tint: '#8B5CF6' },
  314. { stage: '品牌资产', val: '江中肝纯片 = 场景化复合护肝', icon: '🏆', tint: BRAND.LIVER_AMBER },
  315. ].map((s, i, arr) => `
  316. <div style="position:relative; text-align:center;">
  317. <div style="width:54px; height:54px; background:${s.tint}22; border:2px solid ${s.tint}; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:1.6rem; margin:0 auto 8px;">${s.icon}</div>
  318. <div class="text-mono text-xs" style="color:${s.tint}; letter-spacing:0.08em; margin-bottom:4px;">${esc(s.stage)}</div>
  319. <div style="font-size:0.78rem; color:var(--text-1); font-weight:700; line-height:1.3;">${esc(s.val)}</div>
  320. ${i < arr.length - 1 ? `<div style="position:absolute; right:-10px; top:18px; font-size:1.2rem; color:${c.color}; z-index:2;">→</div>` : ''}
  321. </div>
  322. `).join('')}
  323. </div>
  324. </div>
  325. </div>
  326. </section>`;
  327. }
  328. // ----- 2.5.3 用户价值获取路径 · User Value Acquisition Path ------------------
  329. function renderValue3Journey({ slideNum, slideTotal, chapter, A }) {
  330. const c = chapter;
  331. const stages = [
  332. {
  333. num: '1', name: '接触期', en: 'TOUCH', icon: '👁️', tint: BRAND.WARM_ORANGE,
  334. action: '看到广告 / 刷到种草 / 逛药店货架',
  335. channel: ['小红书信息流', '抖音短视频', '药店柜台 POP', '社群分享'],
  336. cognition: '江中肝纯片 · 新品 · 复合配方',
  337. emotion: '好奇 · 点击想看',
  338. delivery: '包装视觉(江中绿+琥珀金)+ 广告语(场景化复合护肝)',
  339. reinforce: '醒目包装主视觉 + KOL 爆款笔记 + 地推展架',
  340. vocQuote: '"刷到那个打工人自救指南爆款,点进来看看"',
  341. metricLabel: '触达率', metricVal: '800w+',
  342. },
  343. {
  344. num: '2', name: '认知期', en: 'COGNITION', icon: '🔍', tint: BRAND.TECH_BLUE,
  345. action: '搜索关键词 / 看科普内容 / 对比竞品',
  346. channel: ['百度 / 知乎', '小红书评测', '抖音医生号', '丁香医生 APP'],
  347. cognition: '4 重协同 · 比单一水飞蓟强',
  348. emotion: '理解 · 认可科学逻辑',
  349. delivery: '内容科普(成分机理)+ 一物一码(成分详解)+ 医生背书',
  350. reinforce: 'KOL 分级(医生/专家/生活)矩阵式种草 + 科普动画',
  351. vocQuote: '"单独吃水飞蓟 2 个月没效果,这个复合的才科学"',
  352. metricLabel: '认知深度', metricVal: '45%',
  353. },
  354. {
  355. num: '3', name: '决策期', en: 'DECISION', icon: '✅', tint: BRAND.JIANG_GREEN,
  356. action: '加购对比 / 咨询客服 / 看测评 / 下单',
  357. channel: ['天猫 / 京东', '美团买药', '药店店员', '品牌旗舰店'],
  358. cognition: '江中出品 · 值得信赖 · 价格合理',
  359. emotion: '安心 · 信任',
  360. delivery: '江中品牌背书 + 第三方检测报告 + 克数透明 + 甜点价位 ¥79-119',
  361. reinforce: '对比陈列物料(vs 单一配方)+ 店员培训激励 + 促销弹窗',
  362. vocQuote: '"江中靠谱,检测报告一扫就出,放心下单"',
  363. metricLabel: '决策转化', metricVal: '18%',
  364. },
  365. {
  366. num: '4', name: '使用期', en: 'USE', icon: '💊', tint: BRAND.LIVER_AMBER,
  367. action: '打开包装 / 扫码 / 按时服用 / 记录打卡',
  368. channel: ['线下开瓶', '小程序打卡', '企业微信群', '个人日历提醒'],
  369. cognition: '服用方便 · 易吞咽 · 味道不差',
  370. emotion: '满意 · 坚持',
  371. delivery: '服用日历小程序(每日推送)+ 易吞咽配方 + 复购激励',
  372. reinforce: '14 天打卡得 8 折券 + 社群晒卡活动 + 用药咨询客服',
  373. vocQuote: '"小程序天天提醒,连打卡 21 天送一瓶,有仪式感"',
  374. metricLabel: '30 日留存', metricVal: '62%',
  375. },
  376. {
  377. num: '5', name: '评价期', en: 'EVALUATE', icon: '⭐', tint: BRAND.ROSE,
  378. action: '体检复查 / 写评价 / 朋友推荐 / 复购',
  379. channel: ['体检报告', '电商 / 小红书分享', '朋友口碑', '会员复购'],
  380. cognition: '效果确实好 · 值得推荐 · 长期跟',
  381. emotion: '满足 · 信赖 · 推荐',
  382. delivery: '复购激励(复购 8 折 / 会员升级)+ 晒卡 UGC 奖励',
  383. reinforce: '转氨酶改善前后对比 + NPS 调研 + 社交裂变',
  384. vocQuote: '"吃 3 瓶,转氨酶 58→32,给老公也买"',
  385. metricLabel: '复购率', metricVal: '40%',
  386. },
  387. ];
  388. return `<section class="report-section" id="value-3" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  389. <div class="section-inner">
  390. <div class="section-head rise-in">
  391. <div class="section-eyebrow" style="color:${c.color};">${c.num}.3 · USER VALUE JOURNEY</div>
  392. <h2 class="text-h1"><span class="headline-anim">用户价值获取路径 · 5 阶段感知链</span></h2>
  393. <p class="section-sub">接触 → 认知 → 决策 → 使用 → 评价 <strong style="color:${c.color};">5 阶段</strong>,每阶段行为 × 渠道 × 认知 × 情感 × 价值传递 × 强化手段完整拆解</p>
  394. </div>
  395. <div class="fade-up" style="background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); padding:28px; margin-bottom:28px;">
  396. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:18px;">JOURNEY TIMELINE · 用户端价值感知时序</div>
  397. <div style="position:relative;">
  398. <div style="position:absolute; top:32px; left:5%; right:5%; height:3px; background:linear-gradient(90deg, ${stages.map(s => s.tint).join(', ')}); border-radius:3px; z-index:1;"></div>
  399. <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:10px; position:relative; z-index:2;">
  400. ${stages.map(s => `
  401. <div style="text-align:center;">
  402. <div style="width:64px; height:64px; background:${s.tint}; border:4px solid var(--bg-1); border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:1.8rem; margin:0 auto 12px; box-shadow:0 4px 12px ${s.tint}66;">${s.icon}</div>
  403. <div class="text-mono text-xs" style="color:${s.tint}; letter-spacing:0.1em; margin-bottom:4px;">STAGE ${s.num} · ${s.en}</div>
  404. <div style="font-size:1.1rem; font-weight:800; color:var(--text-1); margin-bottom:4px;">${esc(s.name)}</div>
  405. <div style="font-size:0.75rem; color:var(--text-2); line-height:1.4;">${esc(s.action)}</div>
  406. </div>
  407. `).join('')}
  408. </div>
  409. </div>
  410. </div>
  411. <div class="fade-up" style="overflow-x:auto; margin-bottom:24px;">
  412. <table style="width:100%; border-collapse:collapse; background:var(--bg-1); font-size:0.8rem;">
  413. <thead>
  414. <tr style="background:${c.color}10;">
  415. <th style="padding:12px 14px; text-align:left; border:1px solid ${c.color}33; color:${c.color}; font-weight:700; width:13%;">维度</th>
  416. ${stages.map(s => `<th style="padding:12px; text-align:left; border:1px solid ${c.color}33; color:${s.tint}; font-weight:700;">${s.icon} ${esc(s.name)}</th>`).join('')}
  417. </tr>
  418. </thead>
  419. <tbody>
  420. <tr>
  421. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">📱 主要渠道</td>
  422. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:var(--text-2); line-height:1.5; font-size:0.75rem;">${s.channel.map(ch => `<div style="padding:2px 0;">▸ ${esc(ch)}</div>`).join('')}</td>`).join('')}
  423. </tr>
  424. <tr style="background:${c.color}04;">
  425. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">🧠 认知变化</td>
  426. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:var(--text-1); line-height:1.5; font-size:0.76rem; font-weight:600;">${esc(s.cognition)}</td>`).join('')}
  427. </tr>
  428. <tr>
  429. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">❤️ 情感变化</td>
  430. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:${s.tint}; line-height:1.5; font-size:0.78rem; font-weight:700; font-style:italic;">${esc(s.emotion)}</td>`).join('')}
  431. </tr>
  432. <tr style="background:${c.color}04;">
  433. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">📦 价值传递</td>
  434. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:var(--text-2); line-height:1.5; font-size:0.73rem;">${esc(s.delivery)}</td>`).join('')}
  435. </tr>
  436. <tr>
  437. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">🔋 强化手段</td>
  438. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:var(--text-2); line-height:1.5; font-size:0.73rem;">${esc(s.reinforce)}</td>`).join('')}
  439. </tr>
  440. <tr style="background:${c.color}04;">
  441. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">💬 VOC 原声</td>
  442. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); color:var(--text-3); line-height:1.5; font-size:0.72rem; font-style:italic;">${esc(s.vocQuote)}</td>`).join('')}
  443. </tr>
  444. <tr>
  445. <td style="padding:10px 14px; border:1px solid var(--border); font-weight:700; color:var(--text-1); background:var(--bg-2);">📊 关键指标</td>
  446. ${stages.map(s => `<td style="padding:10px; border:1px solid var(--border); text-align:center;"><div style="font-family:var(--font-head); font-weight:900; font-size:1.6rem; color:${s.tint}; line-height:1;">${esc(s.metricVal)}</div><div class="text-mono text-xs" style="color:${s.tint}; margin-top:4px; letter-spacing:0.06em;">${esc(s.metricLabel)}</div></td>`).join('')}
  447. </tr>
  448. </tbody>
  449. </table>
  450. </div>
  451. <div class="fade-up" style="background:linear-gradient(135deg, ${c.color}10, ${BRAND.JIANG_GREEN}08); border:1px solid ${c.color}44; border-radius:var(--radius-md); padding:24px;">
  452. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:16px;">CONVERSION FUNNEL · 端到端转化漏斗</div>
  453. <div style="display:grid; grid-template-columns:repeat(5, 1fr); gap:6px; align-items:end;">
  454. ${[
  455. { label: '触达', val: '800w', rate: '100%', tint: BRAND.WARM_ORANGE, width: 100 },
  456. { label: '认知', val: '360w', rate: '45%', tint: BRAND.TECH_BLUE, width: 85 },
  457. { label: '决策', val: '65w', rate: '18% (累 8%)', tint: BRAND.JIANG_GREEN, width: 62 },
  458. { label: '使用', val: '40w', rate: '62% (累 5%)', tint: BRAND.LIVER_AMBER, width: 42 },
  459. { label: '复购', val: '16w', rate: '40% (累 2%)', tint: BRAND.ROSE, width: 25 },
  460. ].map((f) => `
  461. <div style="text-align:center;">
  462. <div style="width:${f.width}%; margin:0 auto; padding:14px 8px; background:${f.tint}; border-radius:8px 8px 4px 4px; color:#fff;">
  463. <div style="font-family:var(--font-head); font-weight:900; font-size:1.4rem; line-height:1;">${esc(f.val)}</div>
  464. <div style="font-size:0.68rem; opacity:0.9; margin-top:4px;">${esc(f.rate)}</div>
  465. </div>
  466. <div class="text-mono text-xs" style="color:${f.tint}; letter-spacing:0.08em; margin-top:8px;">${esc(f.label)}</div>
  467. </div>
  468. `).join('')}
  469. </div>
  470. <div style="margin-top:16px; padding:12px 16px; background:var(--bg-1); border-left:3px solid ${c.color}; border-radius:4px;">
  471. <div style="font-size:0.82rem; color:var(--text-1); line-height:1.55;">
  472. <strong style="color:${c.color};">漏斗洞察:</strong>触达 → 决策转化 <strong>8%</strong>(高于行业均值 5%),"江中品牌 + 复合配方"双 buff 推动信任快速建立;<strong style="color:${BRAND.ROSE};">复购率 40%</strong> 是 OTC 保健类头部表现,受益于服用日历小程序 + 会员体系沉淀。
  473. </div>
  474. </div>
  475. </div>
  476. </div>
  477. </section>`;
  478. }
  479. module.exports = { renderValue1Canvas, renderValue2Chain, renderValue3Journey };