题目页「各班做得怎样」和数据统计「按班级汇总」一起改,两边顺序一致。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
50d8e072ac
commit
13051926cf
4 files changed
+64
-51
No files matched your search
@@ -203,20 +203,26 @@ async function classRows(problemId: number): Promise<NonNullable<ProblemStats["c
|
|||||||
)
|
)
|
||||||
.groupBy(schema.user.className)
|
.groupBy(schema.user.className)
|
||||||
: []
|
: []
|
||||||
return rows
|
return (
|
||||||
.map((row) => {
|
rows
|
||||||
const classSize =
|
.map((row) => {
|
||||||
(row.class_name && sizes.find((item) => item.className === row.class_name)?.value) ||
|
const classSize =
|
||||||
row.tried
|
(row.class_name && sizes.find((item) => item.className === row.class_name)?.value) ||
|
||||||
return {
|
row.tried
|
||||||
className: row.class_name,
|
return {
|
||||||
classSize,
|
className: row.class_name,
|
||||||
solved: row.solved,
|
classSize,
|
||||||
unsolved: row.tried - row.solved,
|
solved: row.solved,
|
||||||
untouched: Math.max(0, classSize - row.tried),
|
unsolved: row.tried - row.solved,
|
||||||
correctRate: row.judged ? Math.round((row.accepted / row.judged) * 100) : null,
|
untouched: Math.max(0, classSize - row.tried),
|
||||||
lastTime: row.last_time,
|
correctRate: row.judged ? Math.round((row.accepted / row.judged) * 100) : null,
|
||||||
}
|
lastTime: row.last_time,
|
||||||
})
|
}
|
||||||
.sort((a, b) => b.lastTime.localeCompare(a.lastTime))
|
})
|
||||||
|
// 交过的人多的在前:按最近一次排的话,零星一两个人补做的班会压在全班做过的班上面
|
||||||
|
.sort(
|
||||||
|
(a, b) =>
|
||||||
|
b.solved + b.unsolved - (a.solved + a.unsolved) || b.lastTime.localeCompare(a.lastTime),
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ const stuck = computed(() => {
|
|||||||
|
|
||||||
// ---------- 老师:各班的表 ----------
|
// ---------- 老师:各班的表 ----------
|
||||||
|
|
||||||
/** 班多的老题(1001 这种十几个班都做过)先给 6 个,最近做的在前 */
|
/** 班多的老题(1001 这种十几个班都做过)先给 6 个,交过的人多的在前 */
|
||||||
const allClasses = ref(false)
|
const allClasses = ref(false)
|
||||||
const shownClasses = computed(() =>
|
const shownClasses = computed(() =>
|
||||||
allClasses.value ? (stats.value?.classes ?? []) : (stats.value?.classes ?? []).slice(0, 6),
|
allClasses.value ? (stats.value?.classes ?? []) : (stats.value?.classes ?? []).slice(0, 6),
|
||||||
|
|||||||
@@ -30,39 +30,46 @@ const classes = computed(() => {
|
|||||||
const key = row.className ?? ""
|
const key = row.className ?? ""
|
||||||
groups.set(key, [...(groups.get(key) ?? []), row])
|
groups.set(key, [...(groups.get(key) ?? []), row])
|
||||||
}
|
}
|
||||||
return [...groups.entries()]
|
return (
|
||||||
.map(([className, rows]) => {
|
[...groups.entries()]
|
||||||
let submissions = 0
|
.map(([className, rows]) => {
|
||||||
let accepted = 0
|
let submissions = 0
|
||||||
let last = ""
|
let accepted = 0
|
||||||
let done = 0
|
let last = ""
|
||||||
for (const row of rows) {
|
let done = 0
|
||||||
const solved = new Set(
|
for (const row of rows) {
|
||||||
row.submissions.filter((item) => isAc(item.result)).map((item) => item.problemDisplayId),
|
const solved = new Set(
|
||||||
)
|
row.submissions
|
||||||
if (props.explicit ? need.every((pid) => solved.has(pid)) : solved.size > 0) done++
|
.filter((item) => isAc(item.result))
|
||||||
// 正确率的分母不算还在判的,和数字行一个口径
|
.map((item) => item.problemDisplayId),
|
||||||
submissions += row.submissions.filter(
|
)
|
||||||
(item) =>
|
if (props.explicit ? need.every((pid) => solved.has(pid)) : solved.size > 0) done++
|
||||||
item.result !== SubmissionStatus.pending && item.result !== SubmissionStatus.judging,
|
// 正确率的分母不算还在判的,和数字行一个口径
|
||||||
).length
|
submissions += row.submissions.filter(
|
||||||
accepted += row.submissions.filter((item) => isAc(item.result)).length
|
(item) =>
|
||||||
const lastTime = row.submissions.at(-1)?.createTime ?? ""
|
item.result !== SubmissionStatus.pending && item.result !== SubmissionStatus.judging,
|
||||||
if (lastTime > last) last = lastTime
|
).length
|
||||||
}
|
accepted += row.submissions.filter((item) => isAc(item.result)).length
|
||||||
const size = props.grid.classSizes[className] ?? rows.length
|
const lastTime = row.submissions.at(-1)?.createTime ?? ""
|
||||||
return {
|
if (lastTime > last) last = lastTime
|
||||||
className,
|
}
|
||||||
label: className ? classLabel(className) : "没有班级",
|
const size = props.grid.classSizes[className] ?? rows.length
|
||||||
size,
|
return {
|
||||||
done,
|
className,
|
||||||
tried: rows.length - done,
|
label: className ? classLabel(className) : "没有班级",
|
||||||
none: Math.max(0, size - rows.length),
|
size,
|
||||||
rate: submissions ? `${Math.round((accepted / submissions) * 100)}%` : "—",
|
done,
|
||||||
last,
|
tried: rows.length - done,
|
||||||
}
|
none: Math.max(0, size - rows.length),
|
||||||
})
|
rate: submissions ? `${Math.round((accepted / submissions) * 100)}%` : "—",
|
||||||
.sort((a, b) => b.last.localeCompare(a.last))
|
last,
|
||||||
|
triedUsers: rows.length,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 交过的人多的在前(和题目页「各班做得怎样」一个顺序):按最近一次排的话,
|
||||||
|
// 零星一两个人补做的班会压在全班做过的班上面
|
||||||
|
.sort((a, b) => b.triedUsers - a.triedUsers || b.last.localeCompare(a.last))
|
||||||
|
)
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -474,7 +474,7 @@ export const problemStatsSchema = z.object({
|
|||||||
.nullable(),
|
.nullable(),
|
||||||
/**
|
/**
|
||||||
* 老师:各班做这道题的情况,和数据统计「按班级汇总」**同一个口径**(只算学生的提交;
|
* 老师:各班做这道题的情况,和数据统计「按班级汇总」**同一个口径**(只算学生的提交;
|
||||||
* 做完 / 班级人数、交了没对、没交、正确率、最近一次),按最近一次倒序。
|
* 做完 / 班级人数、交了没对、没交、正确率、最近一次),交过的人多的在前。
|
||||||
* 两边数字要一模一样 —— 老师从这里点过去,看到的数「变了」就不会再信任何一边。
|
* 两边数字要一模一样 —— 老师从这里点过去,看到的数「变了」就不会再信任何一边。
|
||||||
* 学生、比赛里为 null
|
* 学生、比赛里为 null
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in new issue
Block a user