check-trend-data.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env tsx
  2. /**
  3. * 排查数据趋势无数据问题
  4. * 检查 user_day_statistics 表、platform_accounts 表的数据情况
  5. *
  6. * 运行: cd server && pnpm exec tsx src/scripts/check-trend-data.ts
  7. */
  8. import { initDatabase, AppDataSource } from '../models/index.js';
  9. async function main() {
  10. console.log('========== 数据趋势排查 ==========\n');
  11. try {
  12. await initDatabase();
  13. console.log('✓ 数据库连接成功\n');
  14. // 1. 检查 user_day_statistics 表
  15. const udsCount = await AppDataSource.query(
  16. 'SELECT COUNT(*) as cnt FROM user_day_statistics'
  17. );
  18. console.log('1. user_day_statistics 表:');
  19. console.log(` 总记录数: ${udsCount[0].cnt}`);
  20. if (Number(udsCount[0].cnt) === 0) {
  21. console.log('\n ⚠ 表为空!数据来自定时任务导入,需要执行以下操作之一:');
  22. console.log(' - 等待每天 12:00 定时任务自动导入');
  23. console.log(' - 在「发布」页面为小红书/抖音等账号执行「导入近30天数据」');
  24. console.log(' - 或运行: pnpm xhs:import (小红书)');
  25. } else {
  26. const byAccount = await AppDataSource.query(`
  27. SELECT account_id, COUNT(*) as cnt,
  28. MIN(record_date) as min_date, MAX(record_date) as max_date
  29. FROM user_day_statistics
  30. GROUP BY account_id
  31. `);
  32. console.log(` 按账号分布: ${JSON.stringify(byAccount, null, 2)}`);
  33. }
  34. // 2. 检查 platform_accounts 表
  35. const accounts = await AppDataSource.query(`
  36. SELECT pa.id, pa.user_id, pa.platform, pa.account_name
  37. FROM platform_accounts pa
  38. ORDER BY pa.user_id, pa.platform
  39. `);
  40. console.log('\n2. platform_accounts 表:');
  41. console.log(` 总账号数: ${accounts.length}`);
  42. if (accounts.length > 0) {
  43. accounts.forEach((a: any) => {
  44. console.log(` - id=${a.id} userId=${a.user_id} platform=${a.platform} name=${a.account_name}`);
  45. });
  46. } else {
  47. console.log(' ⚠ 没有账号!请先在「账号管理」添加平台账号');
  48. }
  49. // 3. 检查账号是否有对应的 user_day_statistics
  50. if (accounts.length > 0 && Number(udsCount[0].cnt) > 0) {
  51. const accountIds = accounts.map((a: any) => a.id);
  52. const hasData = await AppDataSource.query(
  53. `SELECT account_id FROM user_day_statistics WHERE account_id IN (?) GROUP BY account_id`,
  54. [accountIds]
  55. );
  56. const accountIdsWithData = new Set(hasData.map((r: any) => r.account_id));
  57. const missing = accounts.filter((a: any) => !accountIdsWithData.has(a.id));
  58. if (missing.length > 0) {
  59. console.log('\n3. 以下账号没有 user_day_statistics 数据:');
  60. missing.forEach((a: any) => {
  61. console.log(` - id=${a.id} platform=${a.platform} ${a.account_name}`);
  62. });
  63. }
  64. }
  65. console.log('\n========== 排查完成 ==========');
  66. } catch (err) {
  67. console.error('错误:', err);
  68. process.exit(1);
  69. } finally {
  70. await AppDataSource.destroy();
  71. }
  72. }
  73. main();