fix_44_users.mjs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // 批量修复最近一个月存在 DayNumber 膨胀/断号的活跃用户(与 42792 相同的去重+按天连续重编号逻辑)。
  2. import Miaoguo from '../src/model/miaoguo.js';
  3. import constantClass from '../src/util/constant/index.js';
  4. import { stringUtils } from '../src/util/stringClass.js';
  5. const USER_IDS = [
  6. 1, 2, 321, 658, 699, 1586, 1631, 3232, 14845, 14916, 15220, 15278,
  7. 15360, 15362, 15387, 16297, 16791, 17315, 22192, 23093, 24084, 24142,
  8. 24149, 25310, 26887, 27170, 29864, 30393, 30894, 31436, 31917, 33746,
  9. 34777, 39733, 39769, 40981, 41301, 41496, 42666, 42668, 42702, 42792,
  10. 42860, 43485
  11. ];
  12. async function fixUser(userID) {
  13. const tasks = await Miaoguo.RunSql([userID],
  14. "SELECT * FROM MiaoguoTask where CardTask>0 and UserID=? order by CreateTime, ID desc;");
  15. if (!tasks || tasks.length === 0) return `User ${userID}: 无记录`;
  16. const dayBest = new Map();
  17. const score = (x) => (x.IsShare > 0 ? 4 : 0) + (x.MilestoneDayNumber > 0 ? 2 : 0) + (x.AphorismID > 0 ? 1 : 0);
  18. for (const t of tasks) {
  19. const best = dayBest.get(t.CreateTime);
  20. if (!best) dayBest.set(t.CreateTime, t);
  21. else if (score(t) > score(best) || (score(t) === score(best) && t.ID > best.ID))
  22. dayBest.set(t.CreateTime, t);
  23. }
  24. let deleted = 0;
  25. for (const t of tasks) {
  26. if (dayBest.get(t.CreateTime).ID !== t.ID) {
  27. await Miaoguo.RunSql([t.ID], "delete from MiaoguoTask where ID=?;");
  28. deleted++;
  29. }
  30. }
  31. const dayTasks = [...dayBest.values()].sort((a, b) =>
  32. a.CreateTime < b.CreateTime ? -1 : a.CreateTime > b.CreateTime ? 1 : a.ID - b.ID);
  33. const milestone = constantClass.GetMilestone();
  34. let milestoneIDs = [];
  35. for (let i = 0; i < 40; i++) milestoneIDs.push(i + 1);
  36. milestoneIDs = stringUtils.RandomArray(milestoneIDs);
  37. let milestoneIndex = 0, hardworkingIndex = 0;
  38. for (let i = 0; i < dayTasks.length; i++) {
  39. const t = dayTasks[i];
  40. const update = { ID: t.ID, DayNumber: i + 1 };
  41. const milestoneItem = milestone.find(item => item.DayNumber == i + 1);
  42. if (milestoneItem) {
  43. update.MilestoneDayNumber = milestoneItem.DayNumber;
  44. update.MilestoneID = milestoneIDs[milestoneIndex++];
  45. }
  46. if (t.IsShare > 0 || update.MilestoneDayNumber > 0 || t.AphorismID > 0)
  47. update.HardworkingNumber = ++hardworkingIndex;
  48. await Miaoguo.UpdateMiaoguoTask(update);
  49. }
  50. return `User ${userID}: 删除 ${deleted} 条重复,重编号 ${dayTasks.length} 天 (DayNumber 1..${dayTasks.length})`;
  51. }
  52. for (const id of USER_IDS) {
  53. const msg = await fixUser(id);
  54. console.log(msg);
  55. }
  56. console.log(`\n完成,共处理 ${USER_IDS.length} 个用户。`);
  57. process.exit(0);