gen-lactic.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env node
  2. // ==============================================================================
  3. // 江中乳酸菌素片儿童版 · VOC 深度洞察报告生成入口
  4. // ==============================================================================
  5. const fs = require('fs');
  6. const path = require('path');
  7. const { buildHTML } = require('./lactic-render.js');
  8. const LA = require('./lactic-analyze.js');
  9. const ROOT = path.resolve(__dirname, '..', '..');
  10. const OUT_DIR = path.join(ROOT, 'reports');
  11. const OUT_FILE = path.join(OUT_DIR, 'jiangzhong-lactic-children-voc-insight-report.html');
  12. if (!fs.existsSync(OUT_DIR)) fs.mkdirSync(OUT_DIR, { recursive: true });
  13. const data = LA.loadMerged();
  14. const meta = LA.getMeta(data);
  15. console.log('╔═══════════════════════════════════════════════════════════╗');
  16. console.log('║ 江中乳酸菌素片儿童版 · VOC 深度洞察报告生成(H1-H8 × 2 渠道)║');
  17. console.log('╚═══════════════════════════════════════════════════════════╝');
  18. console.log(` 采集阶段: ${meta.stage}`);
  19. console.log(` 输出: ${path.relative(ROOT, OUT_FILE)}`);
  20. const start = Date.now();
  21. const html = buildHTML({
  22. product: '江中乳酸菌素片儿童版',
  23. collectedAt: meta.collectedAt,
  24. });
  25. fs.writeFileSync(OUT_FILE, html, 'utf8');
  26. const elapsedMs = Date.now() - start;
  27. const sizeKB = (fs.statSync(OUT_FILE).size / 1024).toFixed(1);
  28. // slide 统计
  29. const SLIDES = (html.match(/<section class="report-section"/g) || []).length;
  30. const { CHAPTERS, CHAPTER_SUBSECTIONS } = require('./lactic-render.js');
  31. console.log(` 章节: ${CHAPTERS.length} 大章(诘问 / 药品VOC / 食品VOC / KANO×JTBD / 场景 / 三轴 / 新机会 / 4P)`);
  32. console.log(` slide 总数: ${SLIDES}`);
  33. console.log(` VOC 数据: ${meta.comments} 条评论 / ${Object.keys(meta.platforms).length} 平台 / ${meta.keywords} 关键词`);
  34. for (const [pf, n] of Object.entries(meta.platforms)) {
  35. const pfName = { xhs: '小红书', douyin: '抖音', unknown: '未知' }[pf] || pf;
  36. console.log(` · ${pfName}: ${n}`);
  37. }
  38. if (Object.keys(meta.hypotheses).length) {
  39. console.log(` · 假设覆盖: ${Object.entries(meta.hypotheses).map(([k, v]) => `${k}:${v}`).join(' / ')}`);
  40. }
  41. console.log(' ✅ 生成完成');
  42. console.log(` 路径: ${path.relative(ROOT, OUT_FILE)}`);
  43. console.log(` 大小: ${sizeKB} KB`);
  44. console.log(` 耗时: ${elapsedMs} ms`);
  45. console.log(` 阶段: ${meta.stage}`);