| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- // ==============================================================================
- // 肝纯片 v2 · Ch0 护肝人群全景 · VOC 分类归拢(会议 req B)
- // ==============================================================================
- // 0.1 护肝问题分类归拢 · 六大类 + 共性需求
- // 0.2 人群声量 × 平台分布 × 情感地图
- // 0.3 TAM → SAM → SOM · 10 亿目标漏斗
- // ==============================================================================
- const LA = require('./liver-analyze.js');
- const C = require('./liver-components.js');
- const { BRAND, esc, renderSectionHead, renderVocGrid, renderStatStrip,
- renderBarChart, renderCompareTable, renderInsightHero,
- renderFindingCard, renderDecisionList, isEnglish, getTranslation, LIVER_CONTEXT_RE } = C;
- // ============================================================
- // 0.1 护肝问题分类归拢
- // ============================================================
- function renderSub1({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
- const items = data?.items || [];
- // 六大类分类(regex 拧紧:避免否定匹配和无关内容)
- const categories = [
- { name: '酒精性肝损伤', desc: '应酬/酒局/宿醉后护肝需求', re: /应酬|酒局|宿醉|解酒|喝多了|不上头|酒后|酒精肝|喝酒伤肝|喝酒.*肝|酒.*护肝/i, color: BRAND.WINE_RED,
- needs: '快速解酒/长期护肝/不伤胃/便携应急', icon: '🍺' },
- { name: '脂肪肝/体检异常', desc: '体检发现脂肪肝、转氨酶偏高后的焦虑', re: /脂肪肝|转氨酶|肝功能|B超.*肝|体检.*肝|ALT|AST|谷丙/i, color: BRAND.WARM_ORANGE,
- needs: '降转氨酶/逆转脂肪肝/日常长期养护', icon: '📊' },
- { name: '熬夜/打工人', desc: '加班熬夜人群的肝脏养护诉求', re: /熬夜.*肝|通宵.*肝|加班.*肝|打工人.*肝|肝.*熬夜|护肝.*熬夜/i, color: BRAND.PURPLE,
- needs: '便携/快速/平价/日常化', icon: '🌙' },
- { name: '药物性肝损伤', desc: '长期服药(降压/降脂/抗生素)担心伤肝', re: /吃药.*肝|服药.*肝|药物.*肝|伤肝|保肝|药物性肝/i, color: BRAND.CORAL,
- needs: '安全护肝/不与药物冲突/医生认可', icon: '💊' },
- { name: '送礼/孝心', desc: '给父母/长辈买护肝产品的礼品需求', re: /送.*护肝|护肝.*礼|送.*肝片|礼盒.*肝|孝心.*肝|买给.*爸|买给.*父|送爸|送父|护肝.*送/i, color: BRAND.GOLD,
- needs: '包装好看/有面子/品牌信任/安全', icon: '🎁' },
- { name: '成分/智商税争议', desc: '对护肝保健品效果的质疑和成分研究', re: /智商税|有用吗|骗人|水飞蓟|奶蓟|DMY|藤茶|靠谱|成分.*肝|护肝.*成分/i, color: BRAND.TECH_BLUE,
- needs: '成分透明/科学证据/真实口碑', icon: '🔬' },
- ];
- const catStats = categories.map((cat, ci) => {
- // 双重过滤:类别 regex + 护肝上下文
- const matched = items.filter(it => {
- const txt = it.content || '';
- return cat.re.test(txt) && LIVER_CONTEXT_RE.test(txt);
- });
- const evidence = LA.getEvidence(matched, { top: 2, seed: 101 + ci, minChars: 15, contentMatch: cat.re });
- return { ...cat, count: matched.length, evidence };
- }).sort((a, b) => b.count - a.count);
- return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
- <div class="section-inner">
- ${renderSectionHead({
- eyebrow: `${c.num}.${subIdx} · VOC CLASSIFICATION`,
- title: sub,
- subtitle: '江旭要求:"让 AI 把这么多条整个梳理分类归拢一下,分为哪几大类,有哪些共性需求。"',
- color: c.color,
- })}
- ${renderStatStrip([
- { num: items.length, label: '全部 VOC', color: c.color },
- { num: catStats.length, label: '大类', color: BRAND.LIVER_AMBER },
- { num: Object.keys(meta.platforms).length, label: '平台', color: BRAND.WARM_ORANGE },
- { num: meta.keywords, label: '关键词', color: BRAND.PURPLE },
- ])}
- <div style="display:grid; grid-template-columns:repeat(3, 1fr); gap:16px; margin-top:24px;">
- ${catStats.map(cat => `
- <div style="padding:20px; background:${cat.color}08; border:1px solid ${cat.color}33; border-top:3px solid ${cat.color}; border-radius:var(--radius-md);">
- <div style="display:flex; align-items:center; gap:8px; margin-bottom:10px;">
- <span style="font-size:1.3rem;">${cat.icon}</span>
- <div>
- <div class="text-mono text-xs" style="color:${cat.color}; font-weight:700;">${esc(cat.name)}</div>
- <div style="color:var(--text-3); font-size:0.68rem;">${cat.count} 条 VOC</div>
- </div>
- </div>
- <div style="color:var(--text-2); font-size:0.82rem; line-height:1.5; margin-bottom:10px;">${esc(cat.desc)}</div>
- <div style="padding-top:10px; border-top:1px dashed ${cat.color}33;">
- <div style="color:${cat.color}; font-size:0.74rem; font-weight:700;">共性需求</div>
- <div style="color:var(--text-1); font-size:0.82rem; margin-top:4px;">${esc(cat.needs)}</div>
- </div>
- ${cat.evidence.length > 0 ? `
- <div style="margin-top:10px; padding-top:10px; border-top:1px dashed ${cat.color}33;">
- <div style="color:${cat.color}; font-size:0.68rem; font-weight:700; margin-bottom:6px;">代表性 VOC 原声</div>
- ${cat.evidence.map(ev => {
- const raw = (ev.content || '').slice(0, 80);
- const trans = isEnglish(raw) ? getTranslation(ev.content) : null;
- const display = trans || raw;
- const badge = trans ? ' <span style="color:' + BRAND.WARM_ORANGE + ';font-size:0.56rem;">🔄已翻译</span>' : (isEnglish(raw) ? ' <span style="color:' + BRAND.WARM_ORANGE + ';font-size:0.56rem;">EN</span>' : '');
- return `<div style="padding:6px 8px; background:${cat.color}06; border-left:2px solid ${cat.color}44; border-radius:3px; margin-bottom:5px; font-size:0.72rem; color:var(--text-1); line-height:1.45;">
- "${esc(display)}"${badge}
- <div style="color:var(--text-3); font-size:0.6rem; margin-top:2px;">—${esc(ev.nickname || ev.platform)} · ❤️${ev.likes || 0}</div>
- </div>`;
- }).join('')}
- </div>` : ''}
- </div>`).join('')}
- </div>
- ${renderFindingCard({
- icon: '💡',
- title: '分类归拢核心发现',
- body: '护肝人群的问题<strong>不是单一的</strong>——"酒精性"和"脂肪肝"经常重叠,"熬夜"和"药物性"人群高度交叉。但用户的<strong>心理动机</strong>只有两类:<strong style="color:' + BRAND.CORAL + ';">恐惧驱动</strong>(体检异常/医生警告)和 <strong style="color:' + BRAND.JIANG_GREEN + ';">预防驱动</strong>(熬夜/应酬后主动养护)。肝纯片需要同时应对两种心理。',
- accent: c.color,
- })}
- </div>
- </section>`;
- }
- // ============================================================
- // 0.2 人群声量 × 平台 × 情感
- // ============================================================
- function renderSub2({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
- const items = data?.items || [];
- // 平台分布
- const platformBars = Object.entries(meta.platforms).map(([pf, count]) => ({
- label: ({xhs:'小红书',douyin:'抖音',amazon:'Amazon'})[pf] || pf,
- value: count,
- color: ({xhs:'#FF2442',douyin:'#1A1A1A',amazon:'#FF9900'})[pf] || '#888',
- })).sort((a, b) => b.value - a.value);
- // 情感分布
- const sentBars = Object.entries(meta.sentiments || {}).map(([s, count]) => ({
- label: ({positive:'好评',negative:'差评',neutral:'中性',conflicted:'矛盾'})[s] || s,
- value: count,
- color: ({positive:BRAND.JIANG_GREEN,negative:BRAND.CORAL,neutral:'#888',conflicted:BRAND.WARM_ORANGE})[s] || '#888',
- })).sort((a, b) => b.value - a.value);
- // 假设覆盖
- const hypBars = Object.entries(meta.hypotheses || {}).map(([h, count]) => {
- const hyp = LA.HYPOTHESES[h] || {};
- return { label: `${h} ${(hyp.title || '').slice(0, 12)}`, value: count, color: BRAND.PURPLE };
- }).sort((a, b) => b.value - a.value);
- return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
- <div class="section-inner">
- ${renderSectionHead({
- eyebrow: `${c.num}.${subIdx} · DATA LANDSCAPE`,
- title: sub,
- subtitle: '7715 条 VOC 的平台、情感、假设标签全景分布。',
- color: c.color,
- })}
- <div style="display:grid; grid-template-columns:1fr 1fr; gap:24px; margin-top:24px;">
- <div>
- ${renderBarChart(platformBars, { accent: c.color, title: '平台分布', height: 180 })}
- </div>
- <div>
- ${renderBarChart(sentBars, { accent: c.color, title: '情感分布', height: 180 })}
- </div>
- </div>
- <div style="margin-top:24px;">
- ${renderBarChart(hypBars, { accent: BRAND.PURPLE, title: 'H1-H8 假设标签覆盖量', height: 260 })}
- </div>
- ${renderFindingCard({
- icon: '📊',
- title: '数据质量评估',
- body: `<strong>${items.length}</strong> 条真实 VOC,覆盖 <strong>${Object.keys(meta.platforms).length}</strong> 个平台 × <strong>${meta.keywords}</strong> 个关键词 × <strong>H1-H8</strong> 八条假设。小红书贡献最多声量(种草/分享场景),Amazon 提供国际对标(milk thistle 差评),抖音补充场景化内容。数据底座充足,可支撑结论。`,
- accent: c.color,
- })}
- </div>
- </section>`;
- }
- // ============================================================
- // 0.3 TAM → SAM → SOM
- // ============================================================
- function renderSub3({ chapter: c, subIdx, sub, slideNum, slideTotal, data, meta }) {
- return `<section class="report-section" id="${c.key}-${subIdx}" data-tone="${c.tone}" data-slide-num="${slideNum}/${slideTotal}">
- <div class="section-inner">
- ${renderSectionHead({
- eyebrow: `${c.num}.${subIdx} · TAM → SAM → SOM`,
- title: sub,
- subtitle: '总经理习惯框架:全中国多少人→发病率→转化率→吃什么。',
- color: c.color,
- })}
- <div style="max-width:800px; margin:0 auto;">
- <div style="background:${BRAND.TECH_BLUE}10; border:2px solid ${BRAND.TECH_BLUE}44; border-radius:var(--radius-md); padding:28px 32px; margin-bottom:16px;">
- <div class="text-mono text-xs" style="color:${BRAND.TECH_BLUE}; letter-spacing:0.2em; font-weight:700; margin-bottom:8px;">TAM · 品类全市场</div>
- <div style="font-family:var(--font-head); font-size:2.4rem; font-weight:800; color:${BRAND.TECH_BLUE};">~150 亿</div>
- <div style="color:var(--text-1); font-size:0.92rem; line-height:1.7; margin-top:8px;">
- 护肝保健品 <strong>~50 亿</strong>(Swisse/汤臣/葵花/片仔癀)+
- OTC 护肝药 <strong>~60 亿</strong>(易善复/水飞蓟片/熊胆粉)+
- 解酒品类 <strong>~20 亿</strong> + 护肝食品 <strong>~20 亿</strong>
- </div>
- </div>
- <div style="background:${BRAND.LIVER_AMBER}10; border:2px solid ${BRAND.LIVER_AMBER}44; border-radius:var(--radius-md); padding:28px 32px; margin-bottom:16px; margin-left:40px; margin-right:40px;">
- <div class="text-mono text-xs" style="color:${BRAND.LIVER_AMBER}; letter-spacing:0.2em; font-weight:700; margin-bottom:8px;">SAM · 可服务市场</div>
- <div style="font-family:var(--font-head); font-size:2.4rem; font-weight:800; color:${BRAND.LIVER_AMBER};">~40 亿</div>
- <div style="color:var(--text-1); font-size:0.92rem; line-height:1.7; margin-top:8px;">
- 药线护肝保健品 <strong>~12 亿</strong> +
- 电商自购护肝 <strong>~10 亿</strong> +
- 礼品孝心 <strong>~8 亿</strong> +
- 餐饮解酒 <strong>~10 亿</strong>
- </div>
- </div>
- <div style="background:${BRAND.JIANG_GREEN}10; border:2px solid ${BRAND.JIANG_GREEN}44; border-radius:var(--radius-md); padding:28px 32px; margin-left:80px; margin-right:80px;">
- <div class="text-mono text-xs" style="color:${BRAND.JIANG_GREEN}; letter-spacing:0.2em; font-weight:700; margin-bottom:8px;">SOM · 可获取市场</div>
- <div style="font-family:var(--font-head); font-size:2.4rem; font-weight:800; color:${BRAND.JIANG_GREEN};">10 亿 / 3 年</div>
- <div style="color:var(--text-1); font-size:0.92rem; line-height:1.7; margin-top:8px;">
- Y1:药线 + 电商 <strong>5 亿</strong>(大参林/一心堂 3w 门店 + 京东自营)<br/>
- Y2:礼品 + 餐饮 <strong>3 亿</strong>(新中式礼盒 + 锡纸分食)<br/>
- Y3:国际 + 品类升级 <strong>2 亿</strong>(DMY 出海 + 功能饮品)
- </div>
- </div>
- </div>
- ${renderFindingCard({
- icon: '🎯',
- title: '漏斗结论:10 亿目标 = SAM 的 25%,可行但需四渠道并进',
- body: '药线 3 亿(30%)+ 礼品 2.5 亿(25%)+ 餐饮 2.5 亿(25%)+ 电商 2 亿(20%)。<strong>藤茶 DMY 差异化</strong>是四渠道通吃的底层武器——药线靠"总黄酮 98%"说服药师,电商靠"千年食饮史"做种草,礼品靠"东方养生"做面子,餐饮靠"真解酒"做体感。',
- accent: BRAND.JIANG_GREEN,
- })}
- </div>
- </section>`;
- }
- module.exports = { renderSub1, renderSub2, renderSub3 };
|