lactic-v2-ch4-position.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. // ==============================================================================
  2. // 乳酸菌 v2 · Ch4 品类定位 · 里斯×特劳特(Step 5)
  3. // ==============================================================================
  4. // 4.1 里斯品类战略 · 我们在哪个品类?
  5. // 4.2 特劳特定位 · 一句话定位方案
  6. // 4.3 三条细分机会 VOC 验证 · 肠道调理/免疫力/营养吸收
  7. // 4.4 风险评估 · 功效扩展 vs 原有心智冲突
  8. // ==============================================================================
  9. const LA = require('./lactic-analyze.js');
  10. const C = require('./lactic-components.js');
  11. const stripTags = s => String(s || '').replace(/#[^\s#]+/g, '').trim();
  12. const { BRAND, esc, renderSectionHead, renderVocCard, renderVocGrid,
  13. renderStatStrip, renderMatrix2x2, renderCompareTable, renderInsightHero,
  14. renderFindingCard, renderDecisionList, renderBarChart } = C;
  15. // ============================================================
  16. // 4.1 里斯品类战略
  17. // ============================================================
  18. function renderSub1({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  19. const items = data?.items || [];
  20. // 用户品类认知 VOC:家长如何看"药品 vs 保健品 vs 食品"
  21. const catCognRe = /药品|保健品|食品|智商税|处方|OTC|蓝帽|医生开|自己买|不放心|信任|到底.*选|药.*还是.*食|是药三分毒/i;
  22. const catCognItems = items.filter(it => catCognRe.test(it.content || ''));
  23. const substCatCogn = catCognItems.filter(it => stripTags(it.content).length >= 30);
  24. const catCognEvidence = LA.getEvidence(substCatCogn, { top: 3, seed: 411, minChars: 20, contentMatch: /益生菌|乳酸菌|肠|便秘|消化|菌|拉肚|药品|保健品|食品/i });
  25. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  26. <div class="section-inner">
  27. ${renderSectionHead({
  28. eyebrow: `${c.num}.${subIdx} · RIES CATEGORY STRATEGY`,
  29. title: sub,
  30. subtitle: '王总要求:"用里斯的品类战略来组织——我在哪个品类?"',
  31. color: c.color,
  32. })}
  33. ${renderInsightHero({
  34. eyebrow: '里斯品类战略 · 核心问题',
  35. title: '乳酸菌素片到底在哪个品类?',
  36. subtitle: '这个问题的答案决定了竞争对手是谁、目标人群是谁、渠道在哪里。品类选错,所有努力都在错误的战场上。',
  37. color: c.color,
  38. })}
  39. <!-- 品类进化树 -->
  40. <div style="padding:24px; background:var(--bg-1); border:1px solid var(--border); border-radius:var(--radius-md); margin-top:24px;">
  41. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.15em; margin-bottom:18px; font-weight:700;">品类进化树 · 从肠道大品类到细分定位</div>
  42. <div style="display:grid; grid-template-columns:1fr; gap:0;">
  43. <!-- Level 0 -->
  44. <div style="text-align:center; padding:14px; background:${BRAND.TECH_BLUE}12; border:2px solid ${BRAND.TECH_BLUE}55; border-radius:8px; font-weight:700; color:${BRAND.TECH_BLUE}; font-size:1.1rem;">
  45. 肠道健康大品类(~130 亿)
  46. </div>
  47. <div style="text-align:center; color:var(--text-3); font-size:1.2rem; padding:4px 0;">↓</div>
  48. <!-- Level 1: 3 branches -->
  49. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:12px;">
  50. <div style="padding:12px; background:${BRAND.CORAL}08; border:1px solid ${BRAND.CORAL}33; border-radius:6px; text-align:center;">
  51. <div style="font-weight:700; color:${BRAND.CORAL}; font-size:0.88rem;">药品微生态制剂</div>
  52. <div style="color:var(--text-3); font-size:0.72rem;">妈咪爱/亿活/宝乐安</div>
  53. </div>
  54. <div style="padding:12px; background:${c.color}12; border:2px solid ${c.color}55; border-radius:6px; text-align:center;">
  55. <div style="font-weight:700; color:${c.color}; font-size:0.88rem;">⭐ OTC 肠道调理</div>
  56. <div style="color:${c.color}; font-size:0.72rem; font-weight:600;">乳酸菌素片 = 这里</div>
  57. </div>
  58. <div style="padding:12px; background:${BRAND.WARM_ORANGE}08; border:1px solid ${BRAND.WARM_ORANGE}33; border-radius:6px; text-align:center;">
  59. <div style="font-weight:700; color:${BRAND.WARM_ORANGE}; font-size:0.88rem;">食品级益生菌</div>
  60. <div style="color:var(--text-3); font-size:0.72rem;">合生元/万益蓝/inne</div>
  61. </div>
  62. </div>
  63. <div style="text-align:center; color:var(--text-3); font-size:1.2rem; padding:4px 0;">↓ 品类分化方向</div>
  64. <!-- Level 2: 细分 -->
  65. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:12px;">
  66. ${[
  67. { title: '儿童肠道调理', desc: '便秘/腹泻/消化不良的日常调理', color: BRAND.JIANG_GREEN, star: true },
  68. { title: '儿童肠道免疫', desc: '入园/换季反复生病的预防', color: BRAND.SKY_BLUE, star: false },
  69. { title: '儿童营养吸收', desc: '"调肠道促吸收"替代瓶瓶罐罐', color: BRAND.LACTIC_MINT, star: false },
  70. ].map(item => `
  71. <div style="padding:14px; background:${item.color}08; border:1px solid ${item.color}33; border-radius:6px; text-align:center;">
  72. <div style="font-weight:700; color:${item.color}; font-size:0.84rem;">${item.star ? '★ ' : ''}${esc(item.title)}</div>
  73. <div style="color:var(--text-2); font-size:0.74rem; margin-top:4px;">${esc(item.desc)}</div>
  74. </div>`).join('')}
  75. </div>
  76. </div>
  77. </div>
  78. ${catCognEvidence.length > 0 ? `
  79. <div style="margin-top:20px; padding:16px; background:${c.color}06; border:1px solid ${c.color}30; border-radius:var(--radius-md);">
  80. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em; margin-bottom:10px; font-weight:700;">VOC 验证 · 家长的品类认知表达(${catCognItems.length} 条相关)</div>
  81. <div style="display:grid; grid-template-columns:repeat(${Math.min(catCognEvidence.length, 3)}, 1fr); gap:10px;">
  82. ${catCognEvidence.map(ev => `
  83. <div style="padding:10px 12px; background:var(--bg-1); border-left:3px solid ${c.color}; border-radius:4px;">
  84. <div style="font-size:0.74rem; color:var(--text-1); line-height:1.45;">"${esc((ev.content || '').slice(0, 90))}"</div>
  85. <div style="color:var(--text-3); font-size:0.6rem; margin-top:4px;">—${esc(ev.nickname || ev.platform)} · ❤️${ev.likes || 0}</div>
  86. </div>`).join('')}
  87. </div>
  88. </div>` : ''}
  89. ${renderFindingCard({
  90. icon: '🎯',
  91. title: '里斯品类战略结论',
  92. body: `乳酸菌素片应定位在 <strong style="color:${c.color};">"OTC 儿童肠道日常调理"</strong> 这个品类——<br/>
  93. · 不是"大益生菌"品类(太大,与食品级混战)<br/>
  94. · 不是"乳酸菌素片"品类(太窄,用户不认识)<br/>
  95. · 而是 <strong>"嚼着吃的儿童肠道调理药"</strong>——这个品类目前空白,我们可以成为品类代名词。`,
  96. accent: c.color,
  97. })}
  98. </div>
  99. </section>`;
  100. }
  101. // ============================================================
  102. // 4.2 特劳特定位 · 一句话
  103. // ============================================================
  104. function renderSub2({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  105. const positionOptions = [
  106. {
  107. slogan: '嚼着吃的儿童肠道调理药',
  108. strategy: '品类占位',
  109. troutMethod: '开创新品类',
  110. pros: '品类空白、直击"喂药难"痛点、OTC 身份背书',
  111. cons: '"药"字可能让部分家长犹豫',
  112. score: 92,
  113. },
  114. {
  115. slogan: '像奶片一样的肠道养护',
  116. strategy: '差异化定位',
  117. troutMethod: '重新定位竞品',
  118. pros: '降低"药"的距离感、孩子接受度高',
  119. cons: '模糊了 OTC 优势',
  120. score: 78,
  121. },
  122. {
  123. slogan: '调肠道,促吸收,一嚼搞定',
  124. strategy: '功效延伸',
  125. troutMethod: '聚焦法则',
  126. pros: '覆盖"调理+吸收"双需求、杨老师营养吸收洞察',
  127. cons: '功效扩展有风险(见 4.4)',
  128. score: 75,
  129. },
  130. ];
  131. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  132. <div class="section-inner">
  133. ${renderSectionHead({
  134. eyebrow: `${c.num}.${subIdx} · TROUT POSITIONING`,
  135. title: sub,
  136. subtitle: '王总要求:"容易传播的、能写在盒子上的一句话"',
  137. color: c.color,
  138. })}
  139. <div style="display:grid; grid-template-columns:repeat(1, 1fr); gap:18px; margin-top:24px;">
  140. ${positionOptions.map((opt, i) => `
  141. <div style="padding:24px; background:${i === 0 ? c.color + '10' : 'var(--bg-1)'}; border:${i === 0 ? '2px' : '1px'} solid ${i === 0 ? c.color + '55' : 'var(--border)'}; border-radius:var(--radius-md); position:relative;">
  142. ${i === 0 ? `<div style="position:absolute; top:12px; right:16px; padding:4px 12px; background:${c.color}; color:#fff; border-radius:12px; font-size:0.7rem; font-weight:700;">★ 推荐方案</div>` : ''}
  143. <div style="display:grid; grid-template-columns:1fr 1fr; gap:20px;">
  144. <div>
  145. <div class="text-mono text-xs" style="color:${c.color}; letter-spacing:0.12em; font-weight:700; margin-bottom:8px;">方案 ${i + 1} · ${esc(opt.strategy)}</div>
  146. <div style="font-family:var(--font-head); font-size:1.6rem; font-weight:800; color:var(--text-1); line-height:1.3; margin-bottom:12px;">"${esc(opt.slogan)}"</div>
  147. <div style="color:var(--text-2); font-size:0.82rem; line-height:1.6;">
  148. <strong>特劳特方法</strong>:${esc(opt.troutMethod)}<br/>
  149. <strong style="color:${BRAND.JIANG_GREEN};">优势</strong>:${esc(opt.pros)}<br/>
  150. <strong style="color:${BRAND.CORAL};">风险</strong>:${esc(opt.cons)}
  151. </div>
  152. </div>
  153. <div style="display:flex; align-items:center; justify-content:center;">
  154. <div style="width:120px; height:120px; border-radius:50%; background:${i === 0 ? c.color : 'var(--text-3)'}15; border:3px solid ${i === 0 ? c.color : 'var(--text-3)'}44; display:flex; align-items:center; justify-content:center; flex-direction:column;">
  155. <div style="font-family:var(--font-head); font-size:2.2rem; font-weight:900; color:${i === 0 ? c.color : 'var(--text-3)'};">${opt.score}</div>
  156. <div style="font-size:0.66rem; color:var(--text-3); font-family:var(--font-mono);">综合评分</div>
  157. </div>
  158. </div>
  159. </div>
  160. </div>`).join('')}
  161. </div>
  162. ${renderInsightHero({
  163. eyebrow: 'TROUT VERDICT',
  164. title: '推荐定位:"嚼着吃的儿童肠道调理药"',
  165. subtitle: `
  166. <strong>特劳特逻辑</strong>:开创"嚼着吃的儿童肠道调理"新品类,成为品类第一品牌。<br/>
  167. <strong>心智阶梯</strong>:家长想到"孩子肠道不好" → 第一反应"嚼着吃的那个" → 江中乳酸菌素片<br/>
  168. <strong>写在盒子上</strong>:<span style="padding:4px 12px; background:${c.color}15; border:1px solid ${c.color}44; border-radius:4px; font-weight:700; color:${c.color};">嚼着吃的儿童肠道调理药</span>
  169. `,
  170. color: c.color,
  171. })}
  172. </div>
  173. </section>`;
  174. }
  175. // ============================================================
  176. // 4.3 三条细分机会 VOC 验证
  177. // ============================================================
  178. function renderSub3({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  179. const items = data?.items || [];
  180. const opportunities = [
  181. {
  182. name: '肠道调理(便秘/腹泻/消化不良)',
  183. hypothesis: 'H3',
  184. keywords: /便秘|腹泻|拉肚子|消化|积食|闹肚子|大便/i,
  185. color: BRAND.JIANG_GREEN,
  186. verdict: '★★★ 需求最强·证据最多·直接可打',
  187. },
  188. {
  189. name: '提高肠道免疫力(入园/换季)',
  190. hypothesis: 'H7',
  191. keywords: /免疫|入园|换季|生病|反复|体质|抵抗力/i,
  192. color: BRAND.SKY_BLUE,
  193. verdict: '★★☆ 需求真实·但"免疫力"宣称需谨慎',
  194. },
  195. {
  196. name: '促进营养吸收(调肠道促吸收)',
  197. hypothesis: 'H5',
  198. keywords: /吸收|营养|不长|偏瘦|挑食|DHA|补钙|瓶瓶罐罐/i,
  199. color: BRAND.LACTIC_MINT,
  200. verdict: '★★☆ 杨老师洞察·需求延伸空间大·但非核心心智',
  201. },
  202. ];
  203. const oppStats = opportunities.map(opp => {
  204. const matched = items.filter(it => opp.keywords.test(it.content || ''));
  205. const substOpp = matched.filter(it => stripTags(it.content).length >= 25);
  206. const evidence = LA.getEvidence(substOpp, { top: 2, seed: 41 + opportunities.indexOf(opp), minChars: 20, contentMatch: /益生菌|乳酸菌|肠|便秘|消化|菌|拉肚|宝宝|孩子|喂药/i });
  207. return { ...opp, count: matched.length, evidence };
  208. });
  209. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  210. <div class="section-inner">
  211. ${renderSectionHead({
  212. eyebrow: `${c.num}.${subIdx} · OPPORTUNITY VOC VALIDATION`,
  213. title: sub,
  214. subtitle: '三条细分机会逐一用 VOC 数据验证需求真实性和强度。',
  215. color: c.color,
  216. })}
  217. ${oppStats.map(opp => `
  218. <div style="margin-bottom:28px; padding:22px; background:${opp.color}06; border:1px solid ${opp.color}33; border-left:4px solid ${opp.color}; border-radius:var(--radius-md);">
  219. <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:14px;">
  220. <div>
  221. <div class="text-mono text-xs" style="color:${opp.color}; font-weight:700; letter-spacing:0.12em;">${esc(opp.name)}</div>
  222. <div style="color:var(--text-3); font-size:0.72rem; margin-top:2px;">${opp.count} 条相关 VOC · ${esc(opp.hypothesis)} 假设</div>
  223. </div>
  224. <div style="padding:6px 14px; background:${opp.color}15; color:${opp.color}; border-radius:16px; font-size:0.78rem; font-weight:700;">${esc(opp.verdict)}</div>
  225. </div>
  226. ${opp.evidence.length > 0 ? renderVocGrid(opp.evidence, { columns: 2, accent: opp.color, compact: true }) : `<div style="color:var(--text-3); font-size:0.82rem; text-align:center; padding:12px;">VOC 证据待补充</div>`}
  227. </div>`).join('')}
  228. ${renderDecisionList([
  229. '<strong>主打方向</strong>:肠道调理(便秘/腹泻/消化不良)—— VOC 证据最强',
  230. '<strong>延伸方向</strong>:营养吸收("调肠道促吸收")—— 差异化空间最大',
  231. '<strong>谨慎方向</strong>:免疫力 —— 需求真实但宣称风险高(OTC 不可宣称免疫)',
  232. '三条机会不是互斥的:核心=调理,延伸=吸收,不碰=免疫宣称',
  233. ], { accent: c.color, title: 'VALIDATION VERDICT' })}
  234. </div>
  235. </section>`;
  236. }
  237. // ============================================================
  238. // 4.4 风险评估 · 功效扩展 vs 原有心智
  239. // ============================================================
  240. function renderSub4({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
  241. return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
  242. <div class="section-inner">
  243. ${renderSectionHead({
  244. eyebrow: `${c.num}.${subIdx} · RISK ASSESSMENT`,
  245. title: sub,
  246. subtitle: '杨老师(34:20)提出关键风险:"如果投放营养吸收,原有用药解决胃肠问题的人会不会减少购买?"',
  247. color: c.color,
  248. })}
  249. ${renderMatrix2x2({
  250. xLabel: '新定位吸引力',
  251. yLabel: '原有心智冲突',
  252. xLow: '吸引力弱',
  253. xHigh: '吸引力强',
  254. yLow: '冲突低',
  255. yHigh: '冲突高',
  256. quadrants: {
  257. q1: {
  258. title: '⚠️ 高收益·高风险',
  259. color: BRAND.WARM_ORANGE,
  260. items: [
  261. '<strong>"儿童营养吸收专家"</strong>',
  262. '新市场大但偏离药品心智',
  263. '可能被理解为"补营养的"',
  264. ],
  265. note: '→ 杨老师担心的风险所在',
  266. },
  267. q2: {
  268. title: '❌ 高风险·低收益',
  269. color: BRAND.CORAL,
  270. items: [
  271. '"提高免疫力"宣称',
  272. 'OTC 药品不可宣称',
  273. '监管风险 + 心智混乱',
  274. ],
  275. note: '→ 绝对避免',
  276. },
  277. q3: {
  278. title: '安全但无突破',
  279. color: '#888',
  280. items: [
  281. '"乳酸菌素片"原名延续',
  282. '维持 6000 万规模',
  283. '无法打开新市场',
  284. ],
  285. note: '→ 不做选择也是一种选择',
  286. },
  287. q4: {
  288. title: '★ 最优区间',
  289. color: BRAND.JIANG_GREEN,
  290. items: [
  291. '<strong>"嚼着吃的儿童肠道调理"</strong>',
  292. '延续药品心智 + 剂型创新',
  293. '自然延伸到"调肠道促吸收"',
  294. ],
  295. note: '→ 推荐路径',
  296. },
  297. },
  298. accent: c.color,
  299. })}
  300. <div style="margin-top:24px; padding:22px; background:${BRAND.JIANG_GREEN}08; border:1px solid ${BRAND.JIANG_GREEN}33; border-radius:var(--radius-md);">
  301. <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; letter-spacing:0.15em; margin-bottom:10px; font-weight:700;">王总的三种结果预判(35:53)</div>
  302. <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:14px;">
  303. <div style="padding:14px; background:var(--bg-1); border-radius:6px;">
  304. <div style="color:var(--text-3); font-size:0.72rem; margin-bottom:6px;">结果 A</div>
  305. <div style="color:var(--text-1); font-size:0.84rem; line-height:1.5;">继续按原来打,维持 6000 万</div>
  306. </div>
  307. <div style="padding:14px; background:var(--bg-1); border-radius:6px; border:1px solid ${BRAND.JIANG_GREEN}44;">
  308. <div style="color:${BRAND.JIANG_GREEN}; font-size:0.72rem; margin-bottom:6px; font-weight:700;">★ 结果 B</div>
  309. <div style="color:var(--text-1); font-size:0.84rem; line-height:1.5;">现有儿童中发现未关注到的机会可放大 → <strong>推荐路径</strong></div>
  310. </div>
  311. <div style="padding:14px; background:var(--bg-1); border-radius:6px;">
  312. <div style="color:var(--text-3); font-size:0.72rem; margin-bottom:6px;">结果 C</div>
  313. <div style="color:var(--text-1); font-size:0.84rem; line-height:1.5;">通过竞争对比发现心智空位 → 需要新品/新品牌</div>
  314. </div>
  315. </div>
  316. </div>
  317. ${renderDecisionList([
  318. '<strong>推荐路径</strong>:结果 B — 在"儿童肠道调理"品类内放大未被关注的机会(喂药难/日常养护)',
  319. '<strong>风险对冲</strong>:核心定位不变(肠道调理),营养吸收作为自然延伸而非主打',
  320. '<strong>避免</strong>:不做免疫力宣称(监管风险)、不做独立营养品牌(心智冲突)',
  321. '<strong>分品策略备选</strong>:若要打营养赛道,用新品(软糖/保健品)而非现有 OTC 品',
  322. ], { accent: c.color, title: 'RISK VERDICT · 风险结论' })}
  323. </div>
  324. </section>`;
  325. }
  326. module.exports = { renderSub1, renderSub2, renderSub3, renderSub4 };