#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const ROOT = path.resolve(__dirname, '..', '..', '..');
const OUT_FILE = path.join(ROOT, 'reports', 'ks-lanlingqiuzhi', 'ks-voc-insight-report-v7.html');
const COVER_STATS = [
{ num: '7,902', lbl: 'VOC总量' },
{ num: '380', lbl: '视频数' },
{ num: '19', lbl: '关键词数' },
{ num: '9,455万', lbl: '总播放量' },
];
const KPIS = [
{ label: 'VOC总量', value: '7,902', sub: '高质量评论', color: 'var(--amber)' },
{ label: '视频覆盖', value: '380', sub: '条视频内容', color: 'var(--green)' },
{ label: '情绪方向', value: '负向主导', sub: '风险焦虑最强', color: 'var(--rose)' },
{ label: '核心关键词', value: '骗/坑/黑中介', sub: '热度最高', color: 'var(--amber)' },
];
const KUAIKUAI_DATA = [
{ label: '月度服务求职者', value: '超2.5亿人次', note: '截至2024年底' },
{ label: '平台蓝领用户规模', value: '约2.5亿人', note: '2024年快聘峰会' },
{ label: '全年直播带岗场次', value: '超500万场', note: '2024年全年' },
{ label: '日收简历峰值', value: '突破5万份', note: '2025年2月' },
{ label: '带动就业机会', value: '4,320万个', note: '截至2024年底' },
];
const COMPETITORS = [
{ name: '快手快聘', type: '直播带岗', users: '2.5亿', trend: '快速增长', color: 'var(--green)', strength: '用户渗透率极高', weak: '信息审核薄弱', barColor: '#00DC82' },
{ name: 'BOSS直聘', type: '算法匹配', users: '约3000万', trend: '稳步增长', color: 'var(--blue)', strength: '匹配准确率高', weak: '情绪获得感弱', barColor: '#3B82F6' },
{ name: '58同城', type: '分类信息', users: '规模下滑', trend: '持续萎缩', color: 'var(--text-3)', strength: '传统市场份额', weak: '虚假信息泛滥', barColor: '#6B6B6B' },
];
const RADAR_DATA = [
{ label: '信息真实度', ks: 3, boss: 4, wu: 2 },
{ label: '薪资透明度', ks: 4, boss: 4, wu: 2 },
{ label: '权益保障', ks: 2, boss: 3, wu: 2 },
{ label: '匹配准确率', ks: 3, boss: 5, wu: 3 },
{ label: '求职低门槛', ks: 5, boss: 4, wu: 3 },
{ label: '沟通即时性', ks: 5, boss: 4, wu: 1 },
{ label: '信任建立', ks: 4, boss: 3, wu: 1 },
{ label: '职业发展', ks: 2, boss: 3, wu: 1 },
{ label: '平台审核', ks: 2, boss: 4, wu: 3 },
{ label: '情绪获得感', ks: 5, boss: 2, wu: 0 },
];
const RISK_SIGNALS = [
{ label: '骗', value: 252, heat: 514788, color: 'var(--rose)' },
{ label: '黑中介', value: 109, heat: 393762, color: 'var(--rose)' },
{ label: '坑', value: 92, heat: 375264, color: 'var(--rose)' },
{ label: '套路', value: 45, heat: 144842, color: 'var(--orange)' },
{ label: '黑厂', value: 43, heat: 123531, color: 'var(--rose)' },
{ label: '押金', value: 105, heat: 95543, color: 'var(--amber)' },
{ label: '不退', value: 70, heat: 84106, color: 'var(--amber)' },
{ label: '陷阱', value: 21, heat: 74090, color: 'var(--orange)' },
];
const CARE_FACTORS = [
{ label: '包吃包住', value: 31, heat: 89190, color: 'var(--green)' },
{ label: '工资', value: 186, heat: 89081, color: 'var(--green)' },
{ label: '加班费', value: 20, heat: 43986, color: 'var(--blue)' },
{ label: '吃住', value: 21, heat: 34060, color: 'var(--green)' },
{ label: '住宿', value: 15, heat: 25224, color: 'var(--blue)' },
{ label: '当天入职', value: 7, heat: 19264, color: 'var(--purple)' },
{ label: '日结', value: 30, heat: 12651, color: 'var(--purple)' },
{ label: '发工资', value: 29, heat: 4773, color: 'var(--amber)' },
];
const CARE_SIGNALS = [
{ label: '信息真实不被骗', pct: 85, color: 'var(--rose)' },
{ label: '工资按时发放', pct: 72, color: 'var(--green)' },
{ label: '包吃包住', pct: 65, color: 'var(--green)' },
{ label: '当天入职', pct: 55, color: 'var(--purple)' },
{ label: '眼见为实', pct: 48, color: 'var(--blue)' },
];
const HIGH_LIKED = [
{ rank: 1, likes: 6276, expr: '22年差点被骗去当咯咯哒 说什么模特走台下面的人送花就有提成', kw: '入职被坑', hot: true },
{ rank: 2, likes: 2209, expr: '去买几个鸡蛋,打碎,放在沙发下面...', kw: '押金不退', hot: true },
{ rank: 3, likes: 808, expr: '我在广西就遇到过房东死活不退押金...', kw: '押金不退', hot: false },
{ rank: 4, likes: 533, expr: '做的不错,就该那样!有些房东太不像话了!押金不退,还有理由了!', kw: '押金不退', hot: false },
{ rank: 5, likes: 491, expr: '无论怎么样,反正黑中介是赚了', kw: '黑中介', hot: false },
{ rank: 6, likes: 422, expr: '那暑假工能做什么啊', kw: '入职被坑', hot: false },
{ rank: 7, likes: 403, expr: '干的漂亮,支持小伙子不应该判刑...', kw: '黑中介', hot: false },
{ rank: 8, likes: 312, expr: '都绑起来了,都投降了,那人还要去喷那个喷雾', kw: '黑中介', hot: false },
{ rank: 9, likes: 311, expr: '为什么南方的房东都不退押金', kw: '押金不退', hot: false },
{ rank: 10, likes: 228, expr: '只要收身份证的都是,正常的面试只需要填表就行', kw: '黑中介', hot: false },
];
const SALARY_VOC = [
{ likes: 38195, expr: '不给加班费就不加班合理吗?#记录餐饮人生活每一天 #餐饮创业 #现场实拍', kw: '加班费' },
{ likes: 21817, expr: '#打工妹 #工资条 #打工妹的日常生活 #电子厂', kw: '发工资' },
{ likes: 51, expr: '确实是像你这样说的,跑外卖只要多劳多得,工资不会少发。我坚持了两个月,第3个月的时候我已经摆烂了', kw: '工资靠谱' },
];
const FOOD_VOC = [
{ likes: 84, expr: '我年前就是在洗碗又累又脏,基本上10个小时没得休息,只有吃销10多分钟,我都不想干了', kw: '包吃包住' },
{ likes: 17397, expr: '#不体检不收费当天安排 #当天来当天入职安排住宿 #岗位轻松干活不累想工作就来 #包吃包住当天安排住宿', kw: '当天入职' },
{ likes: 15768, expr: '距你0.9km #找工作 #包吃包住 #勤杂工 #大龄工', kw: '包吃包住' },
];
const HYPOTHESES = [
{ h: 'H1', title: '快聘是蓝领求职主阵地', count: 596, color: '#F5A623' },
{ h: 'H2', title: '直播带岗降低信息不对称', count: 1930, color: '#00DC82' },
{ h: 'H3', title: '薪资透明度是核心关切', count: 1842, color: '#8B5CF6' },
{ h: 'H4', title: '食宿条件影响求职决策', count: 2194, color: '#FF4D8D' },
{ h: 'H5', title: '入职流程便捷性', count: 595, color: '#3B82F6' },
{ h: 'H6', title: '求职被骗是普遍焦虑', count: 4435, color: '#EF4444' },
{ h: 'H7', title: '黑中介是核心痛点', count: 3705, color: '#F97316' },
{ h: 'H8', title: '工资结算方式差异', count: 2417, color: '#6B6B6B' },
];
const EMOTION_KEYWORDS = [
{ word: '"眼见为实"', desc: '消解信息不对称带来的不安全感', emoji: '👁️', color: 'var(--amber)' },
{ word: '"老铁推荐"', desc: '以熟人身份降低求职者心理防备', emoji: '🤝', color: 'var(--green)' },
{ word: '"来了就是兄弟"', desc: '强调归属感和人情味', emoji: '🏠', color: 'var(--purple)' },
{ word: '"有尊严地赚钱"', desc: '回应蓝领的身份焦虑与社会认同诉求', emoji: '💪', color: 'var(--blue)' },
{ word: '"不骗人、不套路"', desc: '针对虚假宣传痛点', emoji: '🛡️', color: 'var(--rose)' },
{ word: '"独门绝技"', desc: '放大蓝领专业技能价值', emoji: '⚡', color: 'var(--orange)' },
];
const STRATEGY_RECS = [
{ num: '1', title: '建立分级审核体系', desc: '对招聘主播实行分级管理,对粉丝量级大的头部主播实行更审慎的审核标准', color: 'var(--amber)' },
{ num: '2', title: '强化"信任基建"投入', desc: '将信息审核能力作为快聘业务的核心基建来建设,建立招聘方信用评级和黑名单机制', color: 'var(--green)' },
{ num: '3', title: '深化企业直招占比', desc: '减少对中介端的依赖,提高B端企业直招占比,从根本上降低信息失真风险', color: 'var(--blue)' },
{ num: '4', title: '放大"眼见为实"差异化优势', desc: '继续强化直播展示真实工作环境的核心卖点,将车间、宿舍、食堂直播打造为标准化招聘流程', color: 'var(--purple)' },
{ num: '5', title: '差异化提升情绪价值', desc: '利用"老铁信任"和"眼见为实"的天然优势,将情绪价值从"内容传播手段"升级为"用户留存壁垒"', color: 'var(--orange)' },
];
const RISKS = [
{ type: '信任透支', desc: '虚假招聘信息泛滥,透支"老铁信任"', prob: '高', impact: '高', strategy: '审核体系升级+信用评级', color: 'var(--rose)' },
{ type: '监管压力', desc: '五部门行政指导要求强化审核', prob: '高', impact: '高', strategy: '主动对标"五个到位"', color: 'var(--rose)' },
{ type: '竞争跟进', desc: 'BOSS直聘加码蓝领,58同城转型', prob: '中', impact: '中', strategy: '差异化壁垒+效率提升', color: 'var(--amber)' },
{ type: '匹配效率低', desc: '流量大但精准度不如算法平台', prob: '中', impact: '中', strategy: '引入精准匹配算法', color: 'var(--amber)' },
];
const FOUR_P = {
product: {
title: '产品策略:直播带岗 × 信任基建',
points: ['核心产品:快手快聘直播带岗服务', '差异化卖点:眼见为实 / 老铁信任 / 零门槛求职', '产品升级方向:标准化直播带岗流程(车间+宿舍+食堂三景展示)'],
tags: ['直播带岗', '老铁信任', '零门槛求职'],
},
price: {
title: '价格策略:求职者免费 × 企业端付费',
points: ['求职者端:完全免费(零门槛核心优势)', '企业端:按效果付费(CPM/CPC/简历投递量)', '主播端:带岗主播抽佣机制'],
tags: ['零门槛', '效果付费', 'C端免费'],
},
place: {
title: '渠道策略:B端入驻 + C端自然渗透',
points: ['B端:24万家入驻用人单位,提高企业直招占比', '知名企业合作(创维/顺丰/伯恩光学)', 'C端:2.5亿蓝领月活用户自然覆盖', '40万+专职带岗主播'],
tags: ['24万企业', '2.5亿用户', '40万主播'],
},
promotion: {
title: '促销策略:情绪价值 × 信任传播',
points: ['品牌传播:"10个蓝领9个用快手" / "直播带岗,眼见为实"', '内容营销:《来活了老铁!》综艺IP+短剧营销', '政策背书:直播招聘师认证+人社部认可', '老铁文化:"来了就是兄弟"+"有尊严地赚钱"'],
tags: ['综艺IP', '老铁文化', '政策背书'],
},
};
function esc(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); }
function fmtLikes(n) { if (n == null) return '0'; 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 barChart(rows, accent, maxW = 900) {
const max = Math.max(...rows.map(r => r.heat), 1);
const barH = 36, gap = 14, padL = 120, padR = 120, padV = 16, W = maxW;
const totalH = rows.length * (barH + gap) + padV * 2;
return `
`;
}
function careBarChart(rows, maxW = 800) {
const max = Math.max(...rows.map(r => r.pct), 1);
const barH = 36, gap = 14, padL = 140, padR = 100, padV = 16, W = maxW;
const totalH = rows.length * (barH + gap) + padV * 2;
return `
`;
}
function competitorBarChart() {
const W = 800, barH = 48, gap = 20, padV = 20;
const rows = COMPETITORS;
const max = 25000;
const totalH = rows.length * (barH + gap) + padV * 2;
return `
`;
}
function radarChart() {
const cx = 200, cy = 190, r = 130;
const labels = RADAR_DATA.map(d => d.label);
const ksVals = RADAR_DATA.map(d => d.ks);
const bossVals = RADAR_DATA.map(d => d.boss);
const wuVals = RADAR_DATA.map(d => d.wu);
const n = labels.length;
const step = 2 * Math.PI / n;
const toXY = (v, i, R = r) => ({ x: cx + R * v * Math.cos(i * step - Math.PI / 2), y: cy + R * v * Math.sin(i * step - Math.PI / 2) });
const ksPath = ksVals.map((v, i) => toXY(v / 5, i)).map((p, i) => (i === 0 ? 'M' : 'L') + p.x + ',' + p.y).join('') + 'Z';
const bossPath = bossVals.map((v, i) => toXY(v / 5, i)).map((p, i) => (i === 0 ? 'M' : 'L') + p.x + ',' + p.y).join('') + 'Z';
const wuPath = wuVals.map((v, i) => toXY(v / 5, i)).map((p, i) => (i === 0 ? 'M' : 'L') + p.x + ',' + p.y).join('') + 'Z';
const gridPath = [1, 0.5, 0.25].map(s => [0, 1, 2, 3, 4].map(i => toXY(s, i)).map((p, i) => (i === 0 ? 'M' : 'L') + p.x + ',' + p.y).join('') + 'Z').join('');
let labelHTML = labels.map((l, i) => {
const p = toXY(1.15, i);
return `${esc(l)}`;
}).join('');
return `
`;
}
function voiceCard(comment, isHot = false) {
const borderColor = isHot ? 'var(--amber)' : 'var(--rose)';
const tagBg = isHot ? 'rgba(245,166,35,0.1)' : 'rgba(255,77,141,0.1)';
const tagColor = isHot ? 'var(--amber)' : 'var(--rose)';
return `
快
快手用户
♥ ${fmtLikes(comment.likes)}
"${esc(comment.expr)}"
${esc(comment.kw)}
`;}
function insightBanner(num, title, body, dataPoints) {
const dps = dataPoints.map(dp => `${esc(dp.num)}
${esc(dp.lbl)}
`).join('');
return ``;
}
function hypothesisBarChart() {
const max = Math.max(...HYPOTHESES.map(h => h.count));
const barH = 28, gap = 12, padL = 100, padR = 100, padV = 16, W = 800;
const totalH = HYPOTHESES.length * (barH + gap) + padV * 2;
return `
`;
}
function fourPGrid() {
const p = FOUR_P;
const items = [
{ title: p.product.title, points: p.product.points, tags: p.product.tags, color: 'var(--blue)' },
{ title: p.price.title, points: p.price.points, tags: p.price.tags, color: 'var(--green)' },
{ title: p.place.title, points: p.place.points, tags: p.place.tags, color: 'var(--amber)' },
{ title: p.promotion.title, points: p.promotion.points, tags: p.promotion.tags, color: 'var(--purple)' },
];
return `${items.map(item => `
${esc(item.title)}
${item.points.map(pt => `
• ${esc(pt)}
`).join('')}
${item.tags.map(t => `${esc(t)}`).join('')}
`).join('')}
`;
}
const html = `
快手快聘 · VOC 深度洞察报告 v7
↓↑ 滚动切换
VOC 深度洞察报告 · v7
"10个蓝领,9个都用快手"——蓝领求职生态与快聘战略洞察
${COVER_STATS.map(s => `
${esc(s.num)}
${esc(s.lbl)}
`).join('')}
CHAPTER 01
执行摘要
核心问题与机会分析
${KPIS.map(k => `
${esc(k.label)}
${esc(k.value)}
${esc(k.sub)}
`).join('')}
核心洞察
蓝领求职最担心什么?最看重什么?
最强焦虑不是"工资低",而是"怕被骗"——信息不真实、被坑、黑中介、押金不退、工资被克扣
🛡️
最强焦虑:被骗
"骗/黑中介/坑"相关风险词热度突破100万,VOC占比最高
💰
最强诉求:确定性
工资真实、发薪稳定、包吃包住、当天入职、能快速安顿
🤝
情绪核心:信任
"老铁文化"+"眼见为实"是快聘最难被竞品复制的竞争壁垒
CHAPTER 02
快聘生态现状
市场规模、竞争格局与战略位势
${KUAIKUAI_DATA.map(d => `
${esc(d.label)}
${esc(d.value)}
${esc(d.note)}
`).join('')}
战略定位
"10个蓝领9个用快手——直播带岗,眼见为实"
快聘日活几十万简历,内部仅次于电商;2.5亿蓝领月活是最大壁垒;但信息审核弱是最大短板
${COMPETITORS.map(c => `
${esc(c.name)}
✓ ${esc(c.strength)}
✓ 用户:${esc(c.users)} · ${esc(c.type)}
⚠ ${esc(c.weak)}
`).join('')}
📊 平台竞争要素雷达图
${radarChart()}
CHAPTER 03
蓝领求职心理洞察
最担心什么?最看重什么?
TOP 焦虑来源(按热度)
${barChart(RISK_SIGNALS.slice(0, 6), 'var(--rose)')}
TOP 诉求来源(按热度)
${barChart(CARE_FACTORS.slice(0, 6), 'var(--green)')}
${insightBanner('01', '蓝领求职者最需要的是
确定性——确定工作是真的、
工资会发、
不会被坑、能快速安顿下来', '情绪价值的核心不是娱乐,而是"确定性":靠谱、真实、放心、少踩坑。', [
{ num: '85%', lbl: '担心信息不真实' },
{ num: '72%', lbl: '关注工资按时发放' },
{ num: '65%', lbl: '关注包吃包住' },
])}
🛡️
焦虑1:信息虚假
承诺月薪近万,实际到手4000多;薪资货不对版是头号痛点
💰
焦虑2:押金陷阱
预缴押金/培训费后失联,押金不退是高频次焦虑
🤝
焦虑3:权益保障
不签合同、不上保险,维权举证难、责任界定难
CHAPTER 04
核心关切:薪资与权益
工资、食宿、入职便捷性
薪资权益关键词热度
${barChart(CARE_FACTORS, 'var(--amber)')}
高赞薪资VOC
${SALARY_VOC.map(v => voiceCard(v, false)).join('\n')}
${insightBanner('02', '薪资透明度是
核心关切,但最核心的购买点是"确定性"——
包吃包住+当天入职+不发愁', '蓝领求职者决策链极短,追求"今天看、明天就上班"。快聘能快速集结大批求职者,春节高峰期效果尤为显著。', [
{ num: '89,190', lbl: '"包吃包住"热度' },
{ num: '89,081', lbl: '"工资"热度' },
{ num: '19,264', lbl: '"当天入职"热度' },
])}
食宿条件VOC
${FOOD_VOC.map(v => voiceCard(v, false)).join('\n')}
TOP10 高赞评论
${HIGH_LIKED.slice(0, 5).map(v => voiceCard(v, v.hot)).join('\n')}
CHAPTER 05
风险感知:被骗焦虑
黑中介、押金陷阱、入职被套路
黑中介 · 最强风险信号
热度 393,762 · 109条命中
- "万恶之源 #黑中介的噩梦,只要我不努力,你就过不上你想要的生活" 热度203,219
- "#严厉打击黑中介 #黑中介骗了多少中国同胞" 热度61,984
- "第一次进厂是通过直播,就是黑中介..." ♥226
押金陷阱 · 高频次焦虑
热度 95,543 · 105条命中
- "不退租客押金你是心高气傲,被租客报复你是生死难料" 热度55,223
- "去买几个鸡蛋,打碎,放在沙发下面..." ♥2,209(TOP2高赞)
- "我在广西就遇到过房东死活不退押金" ♥808
入职被坑 · 薪资货不对版
热度 375,264 · 92条命中
- "刚开始签18块/时,干了1个月只拿6块/时,只拿了1200" 热度42,121
- "只要收身份证的都是,正常的面试只需要填表就行" ♥228
- "地铁安检我知道,找中介还不如直接去地铁口问" ♥224
TOP10 高赞风险评论
${HIGH_LIKED.map(v => voiceCard(v, v.hot)).join('\n')}
风险关键词完整排行
${barChart(RISK_SIGNALS, 'var(--rose)')}
CHAPTER 06
平台信任机制
老铁文化、直播带岗、情绪关键词体系
${EMOTION_KEYWORDS.map(e => `
${e.emoji}
${esc(e.word)}
${esc(e.desc)}
`).join('')}
${insightBanner('06', '情绪价值是
双刃剑——真实故事获得关注,但
虚假摆拍正在侵蚀信任基础', '外卖骑手、快递小哥、网约车司机因"接地气""高共鸣"属性,成为短视频平台虚假摆拍重灾区。平台算法无差别推荐,使虚假内容获得杠杆式传播。', [
{ num: '★★★★★', lbl: '情绪获得感优势' },
{ num: '⚠️高风险', lbl: '虚假摆拍泛滥' },
{ num: '五部门', lbl: '行政指导监管' },
])}
标杆案例 · 快手《来活了老铁!》
快手联合山东卫视推出的首档蓝领求职综艺IP
25个热搜榜单(微博主榜6个),最高总榜TOP21,完成度625%。站外曝光量原定2.5亿,实际完成3.26亿,完成度130%。围绕"技能向+娱乐向+社会向"三个维度展开。
技能向
娱乐向
社会向
老铁信任体系
• 熟人推荐式信任
• 主播与粉丝长期关系积累
• 评论区实时互动答疑
• "来了就是兄弟"文化
直播带岗信任机制
• 车间直播展示
• 宿舍直播展示
• 食堂直播展示
• 眼见为实消除信息不对称
CHAPTER 07
机会与建议
快聘优势强化、风险应对、战略方向
${STRATEGY_RECS.slice(0, 4).map(r => `
${esc(r.num)}
${esc(r.title)}
${esc(r.desc)}
`).join('')}
⚠️ 风险矩阵
| 风险类型 | 描述 | 概率 | 影响 | 应对策略 |
${RISKS.map(r => `
| ${esc(r.type)} |
${esc(r.desc)} |
${esc(r.prob)} |
${esc(r.impact)} |
${esc(r.strategy)} |
`).join('')}
📋 五部门行政指导要求
① 资质审核到位 — 对招聘方资质进行核验
② 信息明示到位 — 招聘信息完整透明
③ 内容审核到位 — 虚假信息严格过滤
④ 风险防范到位 — 建立风险预警机制
⑤ 处置管控到位 — 违规内容快速处置
CHAPTER 08
快聘 4P 营销策略
产品 / 价格 / 渠道 / 促销
${fourPGrid()}
${insightBanner('08', '基于VOC的内容策略:围绕
"确定性"构建传播矩阵', '最强购买点:工资真实、发薪稳定、包吃包住,当天入职。最强焦虑:被骗、被坑、黑中介、押金不退。内容方向应围绕"真实岗位展示+主播真实推荐+快速入职承诺"。', [
{ num: '20+', lbl: '情绪关键词体系' },
{ num: '3', lbl: '核心传播维度' },
{ num: '1个', lbl: '综艺IP标杆' },
])}
📊 H1-H8 假设验证
${hypothesisBarChart()}
CHAPTER 09
VOC 证据锚点
可直接引用的用户原声
🔥 薪资焦虑类高赞VOC
${SALARY_VOC.map(v => voiceCard(v, false)).join('\n')}
🔥 风险担忧类高赞VOC TOP10
${HIGH_LIKED.map(v => voiceCard(v, v.hot)).join('\n')}
💡 核心洞察
情绪价值的核心不是娱乐,而是"确定性"
快手在蓝领求职场景中的优势,来自内容触达、直播解释、即时互动和高频决策场景的天然匹配。需求高频、风险敏感、决策链短、转化诉求强。
`;
fs.writeFileSync(OUT_FILE, html, 'utf-8');
console.log('HTML report generated:', OUT_FILE);
console.log('File size:', (fs.statSync(OUT_FILE).size / 1024).toFixed(1), 'KB');