From bd95b9bd83a1dcba29b709e65fa55591a0efff06 Mon Sep 17 00:00:00 2001 From: panda Date: Tue, 4 Jul 2023 17:28:50 +0800 Subject: [PATCH] core: fix strictioi stat (#605) --- packages/hydrooj/src/model/contest.ts | 12 ++++++------ packages/hydrooj/src/upgrade.ts | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index abac04d1..cd419d6c 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -386,15 +386,15 @@ const strictioi = buildContestRule({ stat(tdoc, journal) { const detail = {}; let score = 0; - const subtasks: Record = {}; + const subtasks: Record> = {}; for (const j of journal.filter((i) => tdoc.pids.includes(i.pid))) { + subtasks[j.pid] ||= {}; for (const i in j.subtasks) { - if (!subtasks[i] || subtasks[i].score < j.subtasks[i].score) subtasks[i] = j.subtasks[i]; + if (!subtasks[j.pid][i] || subtasks[j.pid][i].score < j.subtasks[i].score) subtasks[j.pid][i] = j.subtasks[i]; } - j.score = sumBy(Object.values(subtasks), 'score'); - j.status = Math.max(...Object.values(subtasks).map((i) => i.status)); - j.subtasks = subtasks; - if (!detail[j.pid] || detail[j.pid].score < j.score) detail[j.pid] = j; + j.score = sumBy(Object.values(subtasks[j.pid]), 'score'); + j.status = Math.max(...Object.values(subtasks[j.pid]).map((i) => i.status)); + if (!detail[j.pid] || detail[j.pid].score < j.score) detail[j.pid] = { ...j, subtasks: subtasks[j.pid] }; } for (const i in detail) score += detail[i].score; return { score, detail }; diff --git a/packages/hydrooj/src/upgrade.ts b/packages/hydrooj/src/upgrade.ts index 8a029d56..bbcbcccb 100644 --- a/packages/hydrooj/src/upgrade.ts +++ b/packages/hydrooj/src/upgrade.ts @@ -602,6 +602,20 @@ const scripts: UpgradeScript[] = [ await document.coll.updateMany({ docType: document.TYPE_CONTEST, assign: null }, { $set: { assign: [] } }); return true; }, + async function _83_84() { + const tdocs = await document.coll.find({ docType: document.TYPE_CONTEST, rule: 'strictioi' }).toArray(); + for (const tdoc of tdocs) { + logger.info(tdoc.domainId, tdoc.title); + const rdocs = await RecordModel.coll.find({ domainId: tdoc.domainId, contest: tdoc.docId }).toArray(); + for (const rdoc of rdocs) { + await document.revPushStatus(tdoc.domainId, document.TYPE_CONTEST, tdoc.docId, rdoc.uid, 'journal', { + rid: rdoc._id, pid: rdoc.pid, status: rdoc.status, score: rdoc.score, subtasks: rdoc.subtasks, + }, 'rid'); + } + await contest.recalcStatus(tdoc.domainId, tdoc.docId); + } + return true; + }, ]; export default scripts;