gen-liver.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // ==============================================================================
  2. // 江中肝纯片 · VOC 深度洞察报告生成入口(参考 gen-houguyin.js)
  3. // ==============================================================================
  4. // 用法:node scripts/tools/gen-liver.js
  5. // 输出:reports/jiangzhong-liver-voc-insight-report.html
  6. const fs = require('fs');
  7. const path = require('path');
  8. const { buildHTML, CHAPTERS, CHAPTER_SUBSECTIONS } = require('./liver-render.js');
  9. const LA = require('./liver-analyze.js');
  10. const ROOT = path.resolve(__dirname, '..', '..');
  11. const OUT_PATH = path.join(ROOT, 'reports', 'jiangzhong-liver-voc-insight-report.html');
  12. function main() {
  13. const t0 = Date.now();
  14. console.log('╔═══════════════════════════════════════════════════════════╗');
  15. console.log('║ 江中肝纯片 · VOC 深度洞察报告生成(DMY × 4 渠道) ║');
  16. console.log('╚═══════════════════════════════════════════════════════════╝');
  17. const data = LA.loadMerged();
  18. const meta = LA.getMeta(data);
  19. const stage = meta.stage;
  20. console.log(` 采集阶段: ${stage}`);
  21. console.log(` 输出: ${path.relative(ROOT, OUT_PATH)}`);
  22. // 计算 slide 总数
  23. let slideTotal = 2;
  24. for (const c of CHAPTERS) {
  25. slideTotal += 1 + (CHAPTER_SUBSECTIONS[c.key] || []).length;
  26. }
  27. console.log(` 章节: 8 大章(诘问 / DMY 归因 / 市场 VOC / KANO×JTBD / 场景地图 / 竞品三轴 / 新机会 / 4P 蓝图)`);
  28. console.log(` slide 总数: ${slideTotal}`);
  29. if (meta.comments > 0) {
  30. console.log(` VOC 数据: ${meta.comments} 条评论 / ${Object.keys(meta.platforms || {}).length} 平台 / ${meta.keywords} 关键词`);
  31. console.log(` · 小红书: ${meta.platforms?.xhs || 0}`);
  32. console.log(` · 抖音: ${meta.platforms?.douyin || 0}`);
  33. console.log(` · Amazon: ${meta.platforms?.amazon || 0}`);
  34. console.log(` · 假设覆盖: ${Object.entries(meta.hypotheses || {}).map(([h, c]) => h + ':' + c).join(' / ')}`);
  35. } else {
  36. console.log(` ⚠ VOC 数据待加载`);
  37. }
  38. // 生成 HTML
  39. const html = buildHTML({
  40. product: '江中肝纯片',
  41. collectedAt: meta.collectedAt,
  42. });
  43. // 写入
  44. fs.mkdirSync(path.dirname(OUT_PATH), { recursive: true });
  45. fs.writeFileSync(OUT_PATH, html, 'utf8');
  46. const sizeKB = (Buffer.byteLength(html, 'utf8') / 1024).toFixed(1);
  47. const ms = Date.now() - t0;
  48. console.log('');
  49. console.log(` ✅ 生成完成`);
  50. console.log(` 路径: ${path.relative(ROOT, OUT_PATH)}`);
  51. console.log(` 大小: ${sizeKB} KB`);
  52. console.log(` 耗时: ${ms} ms`);
  53. console.log(` 阶段: ${stage}`);
  54. }
  55. if (require.main === module) {
  56. main();
  57. }
  58. module.exports = { main };