scan_2months.mjs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import Miaoguo from '../src/model/miaoguo.js';
  2. const startDate = new Date(Date.now() - 60 * 86400000).toISOString().slice(0, 10);
  3. console.log('统计区间: >=', startDate);
  4. // 1) DayNumber 异常(全时段,限定近两个月有任务的用户)
  5. const bad = await Miaoguo.RunSql([startDate], `
  6. SELECT UserID, COUNT(DISTINCT DATE(CreateTime)) days, MAX(DayNumber) maxDay,
  7. SUM(CASE WHEN DayNumber=0 THEN 1 ELSE 0 END) zeroCnt
  8. FROM MiaoguoTask
  9. WHERE CardTask>0 AND UserID IN (SELECT DISTINCT UserID FROM MiaoguoTask WHERE CardTask>0 AND CreateTime>=?)
  10. GROUP BY UserID
  11. HAVING zeroCnt>0 OR maxDay<>days
  12. ORDER BY UserID;`);
  13. console.log('\n[1] DayNumber 异常用户数:', bad.length);
  14. if (bad.length) console.log(' ', bad.map(r => `U${r.UserID}(z=${r.zeroCnt},max=${r.maxDay},days=${r.days})`).join(', '));
  15. // 2) 近两个月:有学习记录但没有 MiaoguoTask 记录的天(需要补齐)
  16. const missing = await Miaoguo.RunSql([startDate], `
  17. SELECT mc.UserID, DATE_FORMAT(r.CreateTime,'%Y-%m-%d') d,
  18. COUNT(DISTINCT r.CardID) CardCount, SUM(r.Duration) Duration
  19. FROM MiaoguoLearningRecord r
  20. INNER JOIN MiaoguoCard mc ON mc.MiaoguoCardID = r.CardID
  21. LEFT JOIN MiaoguoTask t ON t.UserID = mc.UserID AND DATE(t.CreateTime) = DATE(r.CreateTime)
  22. WHERE r.Flag=0 AND r.CreateTime >= ? AND t.ID IS NULL
  23. GROUP BY mc.UserID, DATE_FORMAT(r.CreateTime,'%Y-%m-%d')
  24. ORDER BY mc.UserID, d;`);
  25. const mUsers = [...new Set(missing.map(r => r.UserID))];
  26. console.log('\n[2] 缺 MiaoguoTask 记录: 受影响用户数:', mUsers.length, ' 缺失天数合计:', missing.length);
  27. console.log(' 用户:', mUsers.join(','));
  28. if (missing.length) {
  29. console.log(' 明细(前30):');
  30. for (const r of missing.slice(0, 30))
  31. console.log(` U${r.UserID} ${r.d} Card=${r.CardCount} Dur=${r.Duration}`);
  32. }
  33. // 3) 近两个月同一天多条 MiaoguoTask 记录
  34. const dup = await Miaoguo.RunSql([startDate], `
  35. SELECT UserID, DATE_FORMAT(CreateTime,'%Y-%m-%d') d, COUNT(*) c
  36. FROM MiaoguoTask
  37. WHERE CardTask>0 AND CreateTime>=?
  38. GROUP BY UserID, DATE_FORMAT(CreateTime,'%Y-%m-%d')
  39. HAVING c>1
  40. ORDER BY UserID, d;`);
  41. console.log('\n[3] 同一天多条记录: 天数:', dup.length);
  42. if (dup.length) {
  43. const dUsers = [...new Set(dup.map(r => r.UserID))];
  44. console.log(' 用户:', dUsers.join(','));
  45. console.log(' 明细:', dup.map(r => `U${r.UserID}@${r.d}x${r.c}`).join(', '));
  46. }
  47. process.exit(0);