core: fix strictioi stat (#605)

pull/610/head
panda 1 year ago committed by GitHub
parent 3e49c5bf7b
commit bd95b9bd83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -386,15 +386,15 @@ const strictioi = buildContestRule({
stat(tdoc, journal) {
const detail = {};
let score = 0;
const subtasks: Record<number, SubtaskResult> = {};
const subtasks: Record<number, Record<number, SubtaskResult>> = {};
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 };

@ -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;

Loading…
Cancel
Save