From e1838a2493f59f86787d656bc228333e5df8a3f6 Mon Sep 17 00:00:00 2001 From: panda Date: Sun, 2 Apr 2023 01:12:36 +0800 Subject: [PATCH] core: fix acm lock stat (#547) --- packages/hydrooj/src/model/contest.ts | 28 +++++++++++++-------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index e476e9c49..ea09fa402 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -58,7 +58,7 @@ const acm = buildContestRule({ stat(tdoc, journal: AcmJournal[]) { const naccept = Counter(); const npending = Counter(); - const display: Record = {}; + const display: Record = {}; const detail: Record = {}; let accept = 0; let time = 0; @@ -66,24 +66,22 @@ const acm = buildContestRule({ const lockAt = isLocked(tdoc) ? tdoc.lockAt : null; for (const j of journal) { if (!this.submitAfterAccept && display[j.pid]?.status === STATUS.STATUS_ACCEPTED) continue; - if (lockAt && j.rid.getTimestamp() > lockAt) { - npending[j.pid]++; - continue; - } - display[j.pid] = j; + const real = Math.floor((j.rid.getTimestamp().getTime() - tdoc.beginAt.getTime()) / 1000); + const penalty = 20 * 60 * naccept[j.pid]; + detail[j.pid] = { + ...j, naccept: naccept[j.pid], time: real + penalty, real, penalty, + }; if (![STATUS.STATUS_ACCEPTED, STATUS.STATUS_COMPILE_ERROR, STATUS.STATUS_FORMAT_ERROR].includes(j.status)) { naccept[j.pid]++; } + if (lockAt && j.rid.getTimestamp() > lockAt) { + npending[j.pid]++; + display[j.pid].npending = npending[j.pid]; + continue; + } + display[j.pid] = detail[j.pid]; } - for (const pid in display) { - const j = display[pid]; - const real = Math.floor((j.rid.getTimestamp().getTime() - tdoc.beginAt.getTime()) / 1000); - const penalty = 20 * 60 * naccept[j.pid]; - detail[pid] = { - ...j, naccept: naccept[j.pid], time: real + penalty, real, penalty, npending: npending[j.pid], - }; - } - for (const d of Object.values(detail).filter((i) => i.status === STATUS.STATUS_ACCEPTED)) { + for (const d of Object.values(display).filter((i) => i.status === STATUS.STATUS_ACCEPTED)) { accept++; time += d.time; }