// 修复全库所有 DayNumber 异常用户:去重(每天保留最完整一条) + 按天连续重编号。 import moment from 'moment'; import Miaoguo from '../src/model/miaoguo.js'; import constantClass from '../src/util/constant/index.js'; import { stringUtils } from '../src/util/stringClass.js'; const dayKey = (x) => moment(x.CreateTime).format('YYYY-MM-DD'); const score = (x) => (x.IsShare > 0 ? 4 : 0) + (x.MilestoneDayNumber > 0 ? 2 : 0) + (x.AphorismID > 0 ? 1 : 0); async function fixUser(userID) { const tasks = await Miaoguo.RunSql([userID], "SELECT * FROM MiaoguoTask where CardTask>0 and UserID=? order by CreateTime, ID desc;"); if (!tasks || tasks.length === 0) return `User ${userID}: 无记录`; const dayBest = new Map(); for (const t of tasks) { const key = dayKey(t); const best = dayBest.get(key); if (!best) dayBest.set(key, t); else if (score(t) > score(best) || (score(t) === score(best) && t.ID > best.ID)) dayBest.set(key, t); } let deleted = 0; for (const t of tasks) { if (dayBest.get(dayKey(t)).ID !== t.ID) { await Miaoguo.RunSql([t.ID], "delete from MiaoguoTask where ID=?;"); deleted++; } } const dayTasks = [...dayBest.values()].sort((a, b) => a.CreateTime < b.CreateTime ? -1 : a.CreateTime > b.CreateTime ? 1 : a.ID - b.ID); const milestone = constantClass.GetMilestone(); let milestoneIDs = []; for (let i = 0; i < 40; i++) milestoneIDs.push(i + 1); milestoneIDs = stringUtils.RandomArray(milestoneIDs); let milestoneIndex = 0, hardworkingIndex = 0; for (let i = 0; i < dayTasks.length; i++) { const t = dayTasks[i]; const update = { ID: t.ID, DayNumber: i + 1 }; const milestoneItem = milestone.find(item => item.DayNumber == i + 1); if (milestoneItem) { update.MilestoneDayNumber = milestoneItem.DayNumber; update.MilestoneID = milestoneIDs[milestoneIndex++]; } if (t.IsShare > 0 || update.MilestoneDayNumber > 0 || t.AphorismID > 0) update.HardworkingNumber = ++hardworkingIndex; await Miaoguo.UpdateMiaoguoTask(update); } return `User ${userID}: 删除重复 ${deleted} 条,重编号 ${dayTasks.length} 天 (1..${dayTasks.length})`; } const rows = await Miaoguo.RunSql([], ` SELECT UserID, COUNT(DISTINCT DATE(CreateTime)) as days, MAX(DayNumber) as maxDay, SUM(CASE WHEN DayNumber=0 THEN 1 ELSE 0 END) as zeroCnt FROM MiaoguoTask WHERE CardTask>0 GROUP BY UserID HAVING zeroCnt>0 OR maxDay<>days ORDER BY UserID;`); console.log('待修复用户数:', rows.length); for (const r of rows) console.log(await fixUser(r.UserID)); console.log('\n全部完成。'); process.exit(0);