lactic-v2-ch5-action.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. // ==============================================================================
  2. // 乳酸菌 v2 · Ch5 落地行动
  3. // ==============================================================================
  4. // 5.1 产品策略 · 包装/剂型/话术
  5. // 5.2 渠道策略 · 分年龄段打法
  6. // 5.3 P0/P1 行动清单 × 时间线
  7. // ==============================================================================
  8. const LA = require('./lactic-analyze.js');
  9. const C = require('./lactic-components.js');
  10. const { BRAND, esc, renderSectionHead, renderVocGrid,
  11. renderStatStrip, renderCompareTable, renderInsightHero,
  12. renderFindingCard, renderDecisionList } = C;
  13. // ============================================================
  14. // 5.1 产品策略
  15. // ============================================================
  16. function renderSub1({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  17. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  18. <div class="section-inner">
  19. ${renderSectionHead({
  20. eyebrow: `${c.num}.${subIdx} · PRODUCT STRATEGY`,
  21. title: sub,
  22. subtitle: '基于 Ch0-Ch4 层层收敛,输出产品层面的具体策略。',
  23. color: c.color,
  24. })}
  25. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:18px; margin-top:24px;">
  26. <!-- 包装 -->
  27. <div style="padding:22px; background:${BRAND.BERRY_PINK}08; border:1px solid ${BRAND.BERRY_PINK}33; border-top:3px solid ${BRAND.BERRY_PINK}; border-radius:var(--radius-md);">
  28. <div class="text-mono text-xs" style="color:${BRAND.BERRY_PINK}; font-weight:700; margin-bottom:12px;">📦 包装策略</div>
  29. <ul style="margin:0; padding-left:18px; color:var(--text-1); font-size:0.84rem; line-height:1.7;">
  30. <li><strong>正面主视觉</strong>:突出"嚼着吃"+"儿童肠道调理"双信息</li>
  31. <li><strong>OTC 标识</strong>:蓝帽子显著位置,与食品级拉开距离</li>
  32. <li><strong>年龄分层</strong>:3-6 岁(小包装/低剂量)vs 6-12 岁(标准装)</li>
  33. <li><strong>卡通 IP</strong>:可考虑"肠道小卫士"形象,孩子指名要</li>
  34. <li><strong>便携设计</strong>:单片独立包装,幼儿园/出行场景</li>
  35. </ul>
  36. </div>
  37. <!-- 剂型 -->
  38. <div style="padding:22px; background:${BRAND.SKY_BLUE}08; border:1px solid ${BRAND.SKY_BLUE}33; border-top:3px solid ${BRAND.SKY_BLUE}; border-radius:var(--radius-md);">
  39. <div class="text-mono text-xs" style="color:${BRAND.SKY_BLUE}; font-weight:700; margin-bottom:12px;">💊 剂型策略</div>
  40. <ul style="margin:0; padding-left:18px; color:var(--text-1); font-size:0.84rem; line-height:1.7;">
  41. <li><strong>核心剂型</strong>:咀嚼片(奶片口感 × 多口味)</li>
  42. <li><strong>口味矩阵</strong>:原味奶香(经典)/ 草莓 / 酸奶味</li>
  43. <li><strong>片型优化</strong>:小熊/星星形状(孩子喜欢)</li>
  44. <li><strong>延伸储备</strong>:软糖剂型(食品级·营养赛道·新品)</li>
  45. <li><strong>不做</strong>:散剂/胶囊(竞品的弱点不要重复)</li>
  46. </ul>
  47. </div>
  48. <!-- 话术 -->
  49. <div style="padding:22px; background:${BRAND.JIANG_GREEN}08; border:1px solid ${BRAND.JIANG_GREEN}33; border-top:3px solid ${BRAND.JIANG_GREEN}; border-radius:var(--radius-md);">
  50. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; font-weight:700; margin-bottom:12px;">💬 话术策略</div>
  51. <ul style="margin:0; padding-left:18px; color:var(--text-1); font-size:0.84rem; line-height:1.7;">
  52. <li><strong>核心定位句</strong>:"嚼着吃的儿童肠道调理药"</li>
  53. <li><strong>药店话术</strong>:"孩子拉肚子/便秘/消化不好?嚼一片就行"</li>
  54. <li><strong>种草话术</strong>:"OTC 药品级效果 + 奶片一样好吃"</li>
  55. <li><strong>对比话术</strong>:"比妈咪爱好喂,比合生元有保障"</li>
  56. <li><strong>场景话术</strong>:"入园必备/换季必备/出行必备"</li>
  57. </ul>
  58. </div>
  59. </div>
  60. ${renderFindingCard({
  61. icon: '💡',
  62. title: '产品策略核心逻辑',
  63. body: '所有产品决策围绕一个核心:<strong style="color:' + c.color + ';">"让家长信任(OTC)+ 让孩子爱吃(咀嚼片)"</strong>。包装要让家长一眼看出"这是正规药品",剂型要让孩子主动要,话术要让药店店员一句话说清楚。',
  64. accent: c.color,
  65. })}
  66. </div>
  67. </section>`;
  68. }
  69. // ============================================================
  70. // 5.2 渠道策略 · 分年龄段
  71. // ============================================================
  72. function renderSub2({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  73. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  74. <div class="section-inner">
  75. ${renderSectionHead({
  76. eyebrow: `${c.num}.${subIdx} · CHANNEL STRATEGY`,
  77. title: sub,
  78. subtitle: '年龄段锁定 3-12 岁(咀嚼片),0-3 岁无法覆盖(王总确认)。',
  79. color: c.color,
  80. })}
  81. ${renderCompareTable({
  82. title: '分年龄段 × 渠道 × 打法矩阵',
  83. headers: ['年龄段', '核心场景', '主力渠道', '话术重点', '竞品空位'],
  84. rows: [
  85. [
  86. { html: '<strong style="color:' + BRAND.BABY_PEACH + ';">3-6 岁</strong>', color: BRAND.BABY_PEACH },
  87. '入园适应/换季生病/积食',
  88. '药店 + 母婴店',
  89. '"入园必备·孩子爱吃的肠道药"',
  90. '妈咪爱喂药难,合生元非药品',
  91. ],
  92. [
  93. { html: '<strong style="color:' + BRAND.PRESCHOOL_LIME + ';">6-9 岁</strong>', color: BRAND.PRESCHOOL_LIME },
  94. '挑食/消化不良/便秘',
  95. '药店 + 电商',
  96. '"调肠道促吸收·不用逼着吃"',
  97. '营养补剂"瓶瓶罐罐"替代',
  98. ],
  99. [
  100. { html: '<strong style="color:' + BRAND.SCHOOL_LAVENDER + ';">9-12 岁</strong>', color: BRAND.SCHOOL_LAVENDER },
  101. '课业压力/饮食不规律',
  102. '电商 + 药店',
  103. '"像零食一样的肠道调理"',
  104. '该年龄段几乎无专属产品',
  105. ],
  106. ],
  107. accent: c.color,
  108. })}
  109. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:14px; margin-top:24px;">
  110. <div style="padding:18px; background:${BRAND.CORAL}08; border:1px solid ${BRAND.CORAL}33; border-radius:var(--radius-sm);">
  111. <div class="text-mono text-xs" style="color:${BRAND.CORAL}; font-weight:700; margin-bottom:8px;">药店渠道(主力)</div>
  112. <div style="color:var(--text-1); font-size:0.82rem; line-height:1.6;">
  113. OTC 药品天然渠道<br/>
  114. 店员推荐 = 核心转化<br/>
  115. 目标:<strong>一心堂/大参林 3w 门店</strong><br/>
  116. 话术培训 → 店员"一句话推荐"
  117. </div>
  118. </div>
  119. <div style="padding:18px; background:${BRAND.LACTIC_MINT}08; border:1px solid ${BRAND.LACTIC_MINT}33; border-radius:var(--radius-sm);">
  120. <div class="text-mono text-xs" style="color:${BRAND.LACTIC_MINT}; font-weight:700; margin-bottom:8px;">电商渠道(增量)</div>
  121. <div style="color:var(--text-1); font-size:0.82rem; line-height:1.6;">
  122. 种草(小红书/抖音)→ 搜索 → 转化<br/>
  123. 核心内容:真实妈妈分享<br/>
  124. 关键词矩阵:宝宝便秘/积食/入园<br/>
  125. vs 食品级竞品:突出 OTC 身份
  126. </div>
  127. </div>
  128. <div style="padding:18px; background:${BRAND.WARM_ORANGE}08; border:1px solid ${BRAND.WARM_ORANGE}33; border-radius:var(--radius-sm);">
  129. <div class="text-mono text-xs" style="color:${BRAND.WARM_ORANGE}; font-weight:700; margin-bottom:8px;">母婴渠道(补充)</div>
  130. <div style="color:var(--text-1); font-size:0.82rem; line-height:1.6;">
  131. 孩子王/爱婴室等<br/>
  132. 与食品级益生菌同台竞争<br/>
  133. 优势:OTC 身份差异化<br/>
  134. 风险:母婴店偏好食品级毛利
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </section>`;
  140. }
  141. // ============================================================
  142. // 5.3 P0/P1 行动清单
  143. // ============================================================
  144. function renderSub3({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  145. const actions = [
  146. { priority: 'P0', action: '确认品类定位:"嚼着吃的儿童肠道调理药"', owner: '品牌部', timeline: '1 周内', status: '待确认' },
  147. { priority: 'P0', action: '包装设计修改:突出 OTC + "嚼着吃" + 年龄分层', owner: '设计部', timeline: '2 周', status: '待启动' },
  148. { priority: 'P0', action: '药店店员话术培训方案', owner: '渠道部', timeline: '2 周', status: '待启动' },
  149. { priority: 'P0', action: '补充成人乳酸菌素片 VOC 数据(当前以儿童为主)', owner: '数据团队', timeline: '1 周', status: '数据缺口' },
  150. { priority: 'P1', action: '口味矩阵测试(原味/草莓/酸奶)', owner: '研发部', timeline: '1 月', status: '待排期' },
  151. { priority: 'P1', action: '电商种草内容矩阵搭建', owner: '电商部', timeline: '1 月', status: '待启动' },
  152. { priority: 'P1', action: '3-6 岁低剂量小包装开发', owner: '研发部', timeline: '2 月', status: '待排期' },
  153. { priority: 'P1', action: '"调肠道促吸收"延伸方向 VOC 深度验证', owner: '数据团队', timeline: '1 月', status: '待启动' },
  154. { priority: 'P2', action: '软糖新品(食品级·营养赛道)可行性研究', owner: '研发部', timeline: '3 月', status: '远期储备' },
  155. { priority: 'P2', action: '卡通 IP "肠道小卫士" 设计', owner: '品牌部', timeline: '3 月', status: '远期储备' },
  156. ];
  157. const p0 = actions.filter(a => a.priority === 'P0');
  158. const p1 = actions.filter(a => a.priority === 'P1');
  159. const p2 = actions.filter(a => a.priority === 'P2');
  160. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  161. <div class="section-inner">
  162. ${renderSectionHead({
  163. eyebrow: `${c.num}.${subIdx} · ACTION PLAN`,
  164. title: sub,
  165. subtitle: '从 6000 万到 10 亿的三年路径:P0 立即执行 / P1 一个月内 / P2 远期储备',
  166. color: c.color,
  167. })}
  168. ${renderStatStrip([
  169. { num: p0.length, label: 'P0 · 立即', color: BRAND.CORAL },
  170. { num: p1.length, label: 'P1 · 1月内', color: BRAND.WARM_ORANGE },
  171. { num: p2.length, label: 'P2 · 远期', color: 'var(--text-3)' },
  172. { num: actions.length, label: '总行动项', color: c.color },
  173. ])}
  174. ${renderCompareTable({
  175. title: 'P0 · 立即执行(本周-2周)',
  176. headers: ['行动', '负责方', '时间线', '状态'],
  177. rows: p0.map(a => [
  178. { html: `<strong>${esc(a.action)}</strong>`, bold: true },
  179. a.owner,
  180. a.timeline,
  181. { html: `<span style="color:${BRAND.CORAL}; font-weight:700;">${esc(a.status)}</span>`, color: BRAND.CORAL },
  182. ]),
  183. accent: BRAND.CORAL,
  184. })}
  185. <div style="margin-top:18px;">
  186. ${renderCompareTable({
  187. title: 'P1 · 1 月内启动',
  188. headers: ['行动', '负责方', '时间线', '状态'],
  189. rows: p1.map(a => [
  190. a.action,
  191. a.owner,
  192. a.timeline,
  193. { html: `<span style="color:${BRAND.WARM_ORANGE};">${esc(a.status)}</span>`, color: BRAND.WARM_ORANGE },
  194. ]),
  195. accent: BRAND.WARM_ORANGE,
  196. })}
  197. </div>
  198. <div style="margin-top:18px;">
  199. ${renderCompareTable({
  200. title: 'P2 · 远期储备',
  201. headers: ['行动', '负责方', '时间线', '状态'],
  202. rows: p2.map(a => [
  203. a.action,
  204. a.owner,
  205. a.timeline,
  206. a.status,
  207. ]),
  208. accent: 'var(--text-3)',
  209. })}
  210. </div>
  211. ${renderInsightHero({
  212. eyebrow: 'CLOSING',
  213. title: '从 6000 万到 10 亿:品类重定位是第一步',
  214. subtitle: `
  215. 本报告严格遵循王总 5 步分析路径,从品类全景出发,经过成人机会分析、儿童迁移、交叉验证,最终收敛到<strong style="color:${BRAND.JIANG_GREEN};">"嚼着吃的儿童肠道调理药"</strong>这个品类定位。<br/>
  216. 下一步:<strong>对齐定位方向 → 包装设计 → 话术培训 → 渠道铺货</strong>,启动从 6000 万到 10 亿的三年路径。
  217. `,
  218. color: c.color,
  219. })}
  220. </div>
  221. </section>`;
  222. }
  223. module.exports = { renderSub1, renderSub2, renderSub3 };