gen-houguyin-v2.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // 江中猴菇饮 OTC · VOC 深度洞察报告 v2 生成入口
  2. //
  3. // v2 核心变化:从"方法论展示"转为"用户决策路径追踪"
  4. // 新叙事结构:全景漏斗 → 嵌套洞察 → 痛声地图 → 产品适配 → 定位推导 → 行动蓝图
  5. //
  6. // 用法:node scripts/tools/gen-houguyin-v2.js
  7. // 输出:reports/jiangzhong-houguyin-voc-v2-report.html
  8. const fs = require('fs');
  9. const path = require('path');
  10. const { buildHTML, CHAPTERS, CHAPTER_SUBSECTIONS } = require('./houguyin-v2-render.js');
  11. const HGY = require('./houguyin-analyze.js');
  12. const ROOT = path.resolve(__dirname, '..', '..');
  13. const OUT_PATH = path.join(ROOT, 'reports', 'jiangzhong-houguyin-voc-v2-report.html');
  14. function main() {
  15. const t0 = Date.now();
  16. console.log('╔═══════════════════════════════════════════════════════════════╗');
  17. console.log('║ 江中猴菇饮 OTC · VOC 深度洞察报告 v2(用户决策路径追踪) ║');
  18. console.log('║ 叙事线:全景漏斗 → 嵌套洞察 → 痛声 → 适配 → 定位 → 行动 ║');
  19. console.log('╚═══════════════════════════════════════════════════════════════╝');
  20. const data = HGY.loadMerged();
  21. const meta = HGY.getMeta(data);
  22. console.log(` 数据阶段: ${meta.stage}`);
  23. console.log(` 输出: ${path.relative(ROOT, OUT_PATH)}`);
  24. // 计算 slide 总数
  25. let slideTotal = 2; // cover + agenda
  26. for (const c of CHAPTERS) {
  27. slideTotal += 1 + (CHAPTER_SUBSECTIONS[c.key] || []).length; // divider + subsections
  28. }
  29. console.log(` 章节: ${CHAPTERS.length} 章`);
  30. CHAPTERS.forEach(c => console.log(` Ch${c.num} ${c.title} (${(CHAPTER_SUBSECTIONS[c.key]||[]).length} 子章)`));
  31. console.log(` slide 总数: ${slideTotal}`);
  32. if (meta.comments > 0) {
  33. console.log(` VOC 数据: ${meta.comments} 条评论 / ${Object.keys(meta.platforms || {}).length} 平台`);
  34. } else {
  35. console.log(` ⚠ VOC 数据待采集`);
  36. }
  37. // 生成 HTML
  38. const html = buildHTML({
  39. product: '江中猴菇饮',
  40. collectedAt: meta.collectedAt,
  41. });
  42. // 写入
  43. fs.mkdirSync(path.dirname(OUT_PATH), { recursive: true });
  44. fs.writeFileSync(OUT_PATH, html, 'utf8');
  45. const sizeKB = (Buffer.byteLength(html, 'utf8') / 1024).toFixed(1);
  46. const ms = Date.now() - t0;
  47. console.log('');
  48. console.log(` ✅ v2 报告生成完成`);
  49. console.log(` 路径: ${path.relative(ROOT, OUT_PATH)}`);
  50. console.log(` 大小: ${sizeKB} KB`);
  51. console.log(` 耗时: ${ms} ms`);
  52. }
  53. if (require.main === module) {
  54. main();
  55. }
  56. module.exports = { main };