// ============================================================================== // 江中猴菇饮 OTC · VOC 深度洞察报告 · 主渲染器 // ============================================================================== // 设计哲学:反向定位(VOC 先于产品决策)× 理论 × 实证双轴验证 // // 报告结构(8 章 × 约 38 slides): // 01 · Cover // 02 · Agenda // 03-05 · Ch1 诘问起点(3 子章):产品困境 / 市场现实 / VOC 驱动反向定位 // 06-09 · Ch2 米稀归因学(4 子章):成功因子 / 差评挖机会 / 饼干失败 / 可迁移性 // 10-13 · Ch3 胃药 VOC 全景(4 子章):拉唑依赖 / 中成药抗性 / 功能食品乏力 / 未满足地图 // 14-18 · Ch4 KANO × JTBD(5 子章):KANO 五类 / F / E / S / 决策优先级 // 19-22 · Ch5 场景三元素地图(4 子章):独占场景 Top 4 // 23-25 · Ch6 竞品三轴(3 子章):三轴图 / 差异化坐标 / 同名对标 // 26-28 · Ch7 新机会(3 子章):3 条长尾赛道 // 29-30 · Ch8 4P 蓝图(2 子章):产品/渠道/推广/价格 + 5000 万 → 5 亿路径 // // Batch 1:cover + agenda + 8 dividers = 10 slides 骨架 // Batch 3-6 逐步填充 Ch1-Ch8 子章 // ============================================================================== const STYLES = require('./voc-styles.js'); const SCRIPTS = require('./voc-scripts.js'); const HGY = require('./houguyin-analyze.js'); const CH1 = require('./houguyin-ch1-landscape.js'); const CH2 = require('./houguyin-ch2-unmet.js'); const CH3 = require('./houguyin-ch3-fit.js'); const CH4 = require('./houguyin-ch4-kano.js'); const CH5 = require('./houguyin-ch5-scene.js'); const CH6 = require('./houguyin-ch6-competitor.js'); const CH7 = require('./houguyin-ch7-opportunity.js'); const CH8 = require('./houguyin-ch8-blueprint.js'); const CH9 = require('./houguyin-ch9-voice.js'); // ============================================================ // 主题色(猴菇饮专属色板) // ============================================================ const BRAND = { JIANG_GREEN: '#2D9C5D', // 江中主色(品牌认知/新机会) HOUGU_TAN: '#E8A87C', // 猴菇暖棕(米稀归因/产品主色) DEEP_AMBER: '#C96E3F', // 猴头菇深色(礼品装/传统) CREAM: '#F5E6D3', // 米黄色(米稀联想) TECH_BLUE: '#0085CA', // 信任蓝(药品 VOC / 胃药市场) WARM_ORANGE: '#FF8C42', // 温暖橙(场景地图) CORAL: '#FF6B6B', // 珊瑚红(诘问/痛点情绪) SAGE: '#87A96B', // 药食鼠尾草绿(日常养护) PURPLE: '#8B5CF6', // 紫色(KANO × JTBD 理论/心智) ROSE: '#FF4D8D', // 玫瑰(竞品对比) }; // ============================================================ // 8 章元信息(按认知深度递进,非模块平铺) // ============================================================ const CHAPTERS = [ { id: 1, num: '1', key: 'landscape', title: '胃病人群全景', en: 'GI POPULATION', tone: 'blue', color: BRAND.TECH_BLUE, icon: '�', summary: '2.5 亿胃病人群 × 5 级症状谱(由重到轻)× 每层当前用什么产品' }, { id: 2, num: '2', key: 'unmet', title: '未被满足的需求', en: 'UNMET NEEDS', tone: 'rose', color: BRAND.CORAL, icon: '🔥', summary: '每一层产品的用户都在痛苦什么?PPI 依赖焦虑 / 中成药口感抗性 / 功能食品无信任' }, { id: 3, num: '3', key: 'fit', title: '猴菇饮的机会', en: 'OUR OPPORTUNITY', tone: 'green', color: BRAND.JIANG_GREEN, icon: '🎯', summary: '哪些未满足需求是我们的产品可以满足的?3 大机会×无人地带坐标' }, { id: 4, num: '4', key: 'kano', title: 'KANO × JTBD 洞察', en: 'USER INSIGHT', tone: 'purple', color: BRAND.PURPLE, icon: '🧠', summary: 'KANO 五类需求 × JTBD Functional/Emotional/Social 三维用户价值' }, { id: 5, num: '5', key: 'scene', title: '场景三元素地图', en: 'SCENE MAP', tone: 'orange', color: BRAND.WARM_ORANGE, icon: '🗺', summary: '时间 × 空间 × 触发事件 · 米稀没覆盖的"饮独占场景" 4 条' }, { id: 6, num: '6', key: 'competitor', title: '竞品三轴图谱', en: 'COMPETITION AXES', tone: 'rose', color: BRAND.ROSE, icon: '⚔', summary: '食品(米稀/饼干)、保健品(同名猴菇饮)、药品(三九胃泰/拉唑)三轴定位图谱上,猴菇饮 OTC 的无人地带坐标' }, { id: 7, num: '7', key: 'opportunity',title: '新机会 × 新场景 × 新人群', en: 'OPPORTUNITY', tone: 'green', color: BRAND.JIANG_GREEN, icon: '💡', summary: '3 条可落地长尾赛道 · 每条都带 VOC 证据链 + 转化路径' }, { id: 8, num: '8', key: 'blueprint', title: '4P 配称蓝图', en: '4P BLUEPRINT', tone: 'green', color: BRAND.SAGE, icon: '🚀', summary: '产品 / 渠道 / 推广 / 价格 · 药店 5000 万 → 5 亿落地路径' }, { id: 9, num: '9', key: 'voice', title: '真声洞察', en: 'VOICE OF CUSTOMER', tone: 'rose', color: BRAND.CORAL, icon: '💬', summary: '清洗后 404 条真 VOC 的独家维度:痛点金句墙 × 慢性陪伴时长 × 替代方案尝试史' }, ]; // ============================================================ // 各章节 subsections 清单(Batch 1 定义,后续批次填充内容) // ============================================================ const CHAPTER_SUBSECTIONS = { 'landscape': [ '2.5亿胃病人群·5级症状谱×产品对应', '产品竞争格局·100亿市场拆解×代表品牌', '用户决策路径·从症状到产品选择的真实链路', ], 'unmet': [ 'PPI层·依赖焦虑×反弹恐惧×副作用担忧', '中成药层·口感抗性×起效慢×代际断层', '功能食品层·身份尴尬×场景单一×无OTC信任', '跨层汇总·5大共性未满足需求', ], 'fit': [ '机会①·PPI减量的温和伴侣', '机会②·中成药新代际替代', '机会③·功能食品OTC信任升级×米稀借力', '战略坐标·无人地带×机会规模总览', ], 'kano': [ 'KANO 五类需求·必备/期望/兴奋/无差异/反向', 'JTBD·Functional 功能价值', 'JTBD·Emotional 情绪价值', 'JTBD·Social 社会价值', '决策优先级·SKU/话术/包装映射', ], 'scene': [ '场景#1·应酬应急·液体快速', '场景#2·熬夜前后·便携单支', '场景#3·办公室养护·节奏断续', '场景#4·差旅/术后·无菜谱无辅料', ], 'competitor': [ '三轴定位图谱·食品/保健品/药品', '无人地带坐标·猴菇饮独占位', '同名竞品对标·3 家猴菇饮 VOC', ], 'opportunity': [ '新机会·PPI 离断过渡饮', '新场景·"送胃"礼品赛道', '新人群·糖友无糖版 + 夜宵族', ], 'blueprint': [ '4P 配称·产品+渠道+推广+价格', '5000 万 → 5 亿路径·3 阶段', ], 'voice': [ '真痛点金句墙·10 条 VOC × 未满足需求', '胃病 N 年地图·慢性陪伴时长分布', '替代方案尝试史·4 条折返路径', ], }; // ============================================================ // 每章 hero line(divider 用) // ============================================================ const CHAPTER_HERO_LINES = { 'landscape': '中国 2.5 亿胃病患者,从胃溡穿孔到偶发胃胀,症状严重度跨越 5 个层级。每一层用户现在在用什么产品?从处方 PPI 到达喜铝碳酸镁刲片,从三九胃泰到猴菇米稀——把 100 亿胃药市场按“症状严重度 × 产品对应”拆开,看清每层的竞争现状和用户决策路径。', 'unmet': '每一层产品的用户都在痛苦。PPI 用户“有效但不敢停”,中成药用户“苦涩难咽年轻人不买账”,功能食品用户“吃了个寂寞无 OTC 信任”。把每层的 VOC 痛声铺开,提炼出 5 大跨层共性未满足需求。', 'fit': '把未满足需求与猴菇饮 OTC 的产品特性一一对位:PPI 减量伴侣(接住“想停药但不敢停”)、中成药新代际替代(消灭口感/冲泡/疗程压力)、OTC 信任升级(从食品跳进药品池)。在“疗效强度 × 使用门槛”四象限里找到无人地带坐标。', 'kano': '不再用"4 渠道 × 5 模块"装饰理论。KANO 五类需求模型(必备 / 期望 / 兴奋 / 无差异 / 反向)逐个映射到 SKU / 包装 / 话术决策。JTBD 用户价值三维(Functional 胃舒服 · Emotional 不焦虑不依赖 · Social 养生时尚/孝心/面子)定义用户"雇佣"这瓶饮的真正理由。', 'scene': '早餐场景已被米稀占满。液体饮(快速 / 便携 / 单支)的独占场景在哪里?时间 × 空间 × 触发事件 三元素交叉,定位出 应酬应急 / 熬夜前后 / 办公室节奏 / 差旅术后 4 条米稀触不到的独占场景 —— 每个场景都有对应的人群、话术、触发物。', 'competitor': '食品(米稀/饼干)、保健品(同名猴菇饮)、药品(三九胃泰/拉唑)三轴定位图谱上,猴菇饮 OTC 的 无人地带坐标 = "食品的温和 × 药品的 OTC 信任 × 保健品的日常节奏"。直接对标同名 3 家猴菇饮的 VOC 差评,找出差异化 MOAT。', 'opportunity': '基于 VOC 深挖,提炼 3 条可落地长尾赛道:① PPI 离断过渡饮(焦虑断药人群)② "送胃"礼品赛道(孝心/应酬)③ 糖友无糖版 + 夜宵族(细分人群)。每条赛道配 VOC 原声证据链 + 场景化转化路径 + 数据化规模预估。', 'blueprint': '以 VOC 洞察反推 4P 配称:产品(多规格 SKU 矩阵)+ 渠道(药店 + 电商 + 食疗挂靠)+ 推广(KANO 兴奋需求作为钩子)+ 价格(日服用成本 12 元毛利释放)。3 阶段落地路径:Y1 药店 5000 万验证 → Y2 渠道复制 1.5 亿 → Y3 品类升级 5 亿。', 'voice': '理论章节用完后,是时候把麦克风交回给用户。这一章只有三件事:① 10 条真痛点金句(每条都有真实赞数与平台来源,每条都对应一个猴菇饮可以直接接住的未满足需求)② 胃病 N 年地图(胃病不是急症是慢性陪伴,≤1/2-5/5-10/10+ 年 4 段用户需要不同接入策略)③ 4 条替代方案尝试路径(PPI 独行者 / 西中食折返者 / 自救派 / 崩溃躺平者——差异化介入节点)。这一章不是补遗,是所有前 8 章理论归纳的用户原声锚点。', }; // 预估 slide 总数(Batch 1 仅骨架 10 张,后续批次填充到 ~38) const TOTAL_SLIDES_TARGET = 38; // ============================================================ // utils // ============================================================ function esc(s) { return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); } function fmtNum(n) { if (n == null || isNaN(n)) return '—'; if (n >= 10000) return (n / 10000).toFixed(1).replace(/\.0$/, '') + 'w'; if (n >= 1000) return (n / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; return String(n); } function sn(n) { return String(n).padStart(2, '0'); } // ============================================================ // 共用组件 // ============================================================ function renderNav() { const dots = [ { tip: '封面', href: '#s0' }, { tip: '目录', href: '#agenda' }, ...CHAPTERS.map((c) => ({ tip: `${c.num} ${c.title}`, href: `#${c.key}` })), ]; return `
REVERSE POSITIONING / 三轴无人地带 / 借力米稀 7.5 亿
`; } function renderKbdHint() { return `
键盘切换 PgUpPgDn
`; } // ============================================================ // Slide 01 · Cover // ============================================================ function renderCover({ product, collectedAt, slideNum, slideTotal, meta }) { const totalComments = meta?.comments || 0; const platformCount = Object.values(meta?.platforms || {}).filter((n) => n > 0).length; const productsCount = meta?.productsCount || 0; const stage = meta?.stage || 'batch-1-scaffold'; const tier = meta?.sourceTier || 'unknown'; const isScaffold = stage === 'batch-1-scaffold'; const isSeed = tier === 'pattern-curated'; const isReal = tier === 'real-collected'; // 源标识(右上角徽标,透明度原则) const sourceBadge = isReal ? { label: '真实采集', color: BRAND.JIANG_GREEN, icon: '✓' } : isSeed ? { label: 'Batch 2 · 公开模式归纳种子版', color: BRAND.HOUGU_TAN, icon: '◈' } : { label: 'Batch 1 · 骨架版', color: BRAND.CORAL, icon: '○' }; // 评论数显示 const commentsDisplay = isScaffold ? '待采集' : totalComments.toLocaleString(); return `
江中 / 产品开发部 / 2026 · ${esc(product)} · VOC 深度洞察 ${sourceBadge.icon}${esc(sourceBadge.label)}

REVERSE POSITIONING × KANO × JTBD × SCENE

${esc(product)}
VOC 深度洞察报告

没有体感优势 · 如何从用户真实声音反向定位出新机会

基于 0.基础调研.md 内部会议确认的 VOC 反向定位方法论,跳出"10 亿×4 渠道"正向框架, 直面 产品无显著体感的残酷现实, 通过 KANO × JTBD × 场景三元素 理论模型 × ${isScaffold ? '5000+' : totalComments.toLocaleString()} 条${isSeed ? '公开讨论模式归纳的' : ''}多平台评论颗粒度原声交叉验证, 解构 米稀 7.5 亿成功的可迁移因子,对标 100 亿胃药 OTC 市场的 VOC 痛点地图, 在 食品 ↔ 保健品 ↔ 药品三轴无人地带中提炼 3 条长尾赛道, 输出 4P 配称蓝图,闭环 药店 5000 万 → 5 亿 路径。

5000万
药店目标
${commentsDisplay}
${isSeed ? 'Seed VOC' : '真实评论'}
${isScaffold ? '7+' : platformCount}
${isSeed ? '覆盖平台' : '采集平台'}
8
核心假设
${isScaffold ? '14' : (productsCount || 14)}
产品维度
${slideTotal}
slides
${isSeed ? `
DATA TRANSPARENCY · 数据透明度声明

本报告 Batch 2 使用的 ${totalComments} 条 Seed VOC公开讨论模式归纳(电商评论/社交笔记/医学论坛公开数据), 覆盖 ${platformCount} 平台 · ${productsCount || 14} 产品维度 · H1-H8 全假设,用于验证分析框架与渲染质量。 每条 VOC 带 source=pattern-curated 明确标识, 在正式交付前 会由 houguyin-collect.js 替换为真实 API 采集数据

` : ''}

SCROLL DOWN · ${isScaffold ? 'Batch 1 · 骨架版 · 待 Batch 2 采集完成填充真实 VOC' : isSeed ? `Batch 2 · 种子版 · ${totalComments} 条公开模式 VOC · 覆盖 H1-H8` : `采集截止 ${esc(collectedAt || '')} · ${totalComments.toLocaleString()} 条真实 VOC`}

`; } // ============================================================ // Slide 02 · Agenda // ============================================================ function renderAgenda({ slideNum, slideTotal }) { return `
CONTENTS · 8 章认知递进

从诘问到蓝图 · 反向定位 VOC 深洞察

不按模块平铺 · 按认知深度递进:① 诘问 → ② 米稀归因 → ③ 胃药全景 → ④ KANO×JTBD → ⑤ 场景地图 → ⑥ 竞品三轴 → ⑦ 新机会 → ⑧ 4P 蓝图

METHODOLOGY · 方法论自律
本报告严格遵循 《docs/jiangzhong-houguyin/1.VOC深度思路.md》反向定位方法论:
❌ 不做:改配方/改批文/改剂型、宣称治疗、装饰性理论图表;
✅ 做:8 条核心假设 H1-H8 × 多平台 VOC 实证(米稀/饼干/三九胃泰/拉唑/同名竞品/礼品类比)× KANO+JTBD 理论模型作决策工具;
每一个结论都附 真实用户原声(昵称+IP+点赞)+ 理论模型映射 + 可落地决策项三重验证。
`; } // ============================================================ // 章节 Divider(8 个,共用组件) // ============================================================ function renderChapterDivider({ chapter, slideNum, slideTotal }) { const c = chapter; const heroLine = CHAPTER_HERO_LINES[c.key] || c.summary; const subs = CHAPTER_SUBSECTIONS[c.key] || []; return `
0${c.num}
CHAPTER ${c.num} · ${c.en}
${c.icon}

${esc(c.title)}

${c.en}

${heroLine}

${subs.map((sub, i) => `
${c.num}.${i + 1}
${esc(sub)}
`).join('')}
SCROLL DOWN · ${subs.length} 个子章 · 理论 × 实证 × 机会
`; } // ============================================================ // 占位子章(Coming Soon 提示)· 会展示当前 Seed VOC 覆盖度 // ============================================================ function renderComingSoon({ chapter, subIdx, sub, slideNum, slideTotal, targetBatch, meta }) { const c = chapter; const tier = meta?.sourceTier || 'unknown'; const isSeedReady = tier === 'pattern-curated' || tier === 'real-collected'; // 为此章节所映射的假设准备 seed 覆盖提示 const chapterHypothesisMap = { 'landscape': ['H1', 'H3', 'H5'], 'unmet': ['H1', 'H2'], 'fit': ['H1', 'H3', 'H4', 'H5'], 'kano': ['H1', 'H3', 'H4', 'H5'], 'scene': ['H5'], 'competitor': ['H5', 'H6'], 'opportunity': ['H4', 'H7', 'H8'], 'blueprint': ['H6', 'H8'], }; const hs = chapterHypothesisMap[c.key] || []; const hsCount = hs.reduce((s, h) => s + (meta?.hypotheses?.[h] || 0), 0); return `
${c.num}.${subIdx} · ${esc(sub.toUpperCase())}

${esc(sub)}

此子章将在 Batch ${targetBatch} 填充 VOC 证据卡 + 理论映射 + 决策项

🚧
Coming in Batch ${targetBatch}
${isSeedReady ? `
Seed VOC 已就绪 · ${hsCount} 条 ${hs.join('/')} 相关模式 VOC

Batch 2 已完成 ${meta?.comments || 326} 条公开模式 seed VOC 采集(覆盖 H1-H8 × 6 平台 × 14 产品维度),
Batch ${targetBatch} 将基于本假设的 ${hsCount} 条 证据 + KANO×JTBD 理论工具,输出 理论映射 × 实证卡片 × 决策项

` : `

Batch 2 将完成多平台 VOC 采集,Batch ${targetBatch} 填充本子章内容。

`}
`; } // ============================================================ // 子章 → Batch 映射(每章归属哪个 Batch) // ============================================================ const SUB_TO_BATCH = { 'landscape': 3, 'unmet': 3, 'fit': 3, 'kano': 4, 'scene': 4, 'competitor': 5, 'opportunity': 5, 'blueprint': 6, 'voice': 7, }; // ============================================================ // 子章渲染器注册表(Batch 3 已填充 Ch1/Ch2/Ch3;Batch 4-6 逐步补齐) // ============================================================ const SLIDE_RENDERERS = { ...CH1, // Ch1 胃病人群全景 ...CH2, // Ch2 未被满足的需求 ...CH3, // Ch3 猴菇饮的机会 ...CH4, // Ch4 KANO × JTBD 深度洞察 ...CH5, // Ch5 场景三元素地图 ...CH6, // Ch6 竞品三轴图谱 ...CH7, // Ch7 新机会 × 新场景 × 新人群 ...CH8, // Ch8 4P 配称蓝图 ...CH9, // Ch9 真声洞察(基于真 VOC 的独家维度) }; // ============================================================ // buildHTML · 主装配 // ============================================================ function buildHTML({ product, collectedAt } = {}) { product = product || '江中猴菇饮'; collectedAt = collectedAt || new Date().toISOString().slice(0, 10); // 加载数据(Batch 1 为 skeleton) const data = HGY.loadMerged(); const meta = HGY.getMeta(data); // 计算 slide 总数:2 (cover+agenda) + 每章 (1 divider + N 子章) let slideTotal = 2; for (const c of CHAPTERS) { slideTotal += 1; // divider slideTotal += (CHAPTER_SUBSECTIONS[c.key] || []).length; // subsections } const slides = []; let num = 1; // Slide 01 · Cover slides.push(renderCover({ product, collectedAt, slideNum: sn(num), slideTotal: sn(slideTotal), meta })); num++; // Slide 02 · Agenda slides.push(renderAgenda({ slideNum: sn(num), slideTotal: sn(slideTotal) })); num++; // 每章节:divider + 子章们 for (const c of CHAPTERS) { // Divider slides.push(renderChapterDivider({ chapter: c, slideNum: sn(num), slideTotal: sn(slideTotal) })); num++; // Subsections const subs = CHAPTER_SUBSECTIONS[c.key] || []; for (let i = 0; i < subs.length; i++) { const subIdx = i + 1; const subKey = `${c.key}-${subIdx}`; const renderer = SLIDE_RENDERERS[subKey]; const slideCtx = { chapter: c, subIdx, sub: subs[i], slideNum: sn(num), slideTotal: sn(slideTotal), data, meta, }; if (renderer) { slides.push(renderer(slideCtx)); } else { slides.push(renderComingSoon({ ...slideCtx, targetBatch: SUB_TO_BATCH[c.key] || 3, meta })); } num++; } } return ` ${esc(product)} · VOC 深度洞察报告 · 反向定位 ${STYLES} ${renderNav()} ${renderKbdHint()}
${slides.join('\n')}
`; } module.exports = { buildHTML, BRAND, CHAPTERS, CHAPTER_SUBSECTIONS, TOTAL_SLIDES_TARGET, renderCover, renderAgenda, renderChapterDivider, renderComingSoon, };