fix(统计): 按班级列的时候零星一两个人补做的班排在最前,改成交过的人多的在前
Deploy / deploy (push) Canceled after 0s

题目页「各班做得怎样」和数据统计「按班级汇总」一起改,两边顺序一致。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-09-30 00:59:41 +08:00
1 parent 50d8e072ac
commit 13051926cf
4 files changed
+20 -7

No files matched your search

+8 -2
View File
@@ -203,7 +203,8 @@ async function classRows(problemId: number): Promise<NonNullable<ProblemStats["c
) )
.groupBy(schema.user.className) .groupBy(schema.user.className)
: [] : []
return rows return (
rows
.map((row) => { .map((row) => {
const classSize = const classSize =
(row.class_name && sizes.find((item) => item.className === row.class_name)?.value) || (row.class_name && sizes.find((item) => item.className === row.class_name)?.value) ||
@@ -218,5 +219,10 @@ async function classRows(problemId: number): Promise<NonNullable<ProblemStats["c
lastTime: row.last_time, 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,7 +30,8 @@ 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 (
[...groups.entries()]
.map(([className, rows]) => { .map(([className, rows]) => {
let submissions = 0 let submissions = 0
let accepted = 0 let accepted = 0
@@ -38,7 +39,9 @@ const classes = computed(() => {
let done = 0 let done = 0
for (const row of rows) { for (const row of rows) {
const solved = new Set( const solved = new Set(
row.submissions.filter((item) => isAc(item.result)).map((item) => item.problemDisplayId), row.submissions
.filter((item) => isAc(item.result))
.map((item) => item.problemDisplayId),
) )
if (props.explicit ? need.every((pid) => solved.has(pid)) : solved.size > 0) done++ if (props.explicit ? need.every((pid) => solved.has(pid)) : solved.size > 0) done++
// 正确率的分母不算还在判的,和数字行一个口径 // 正确率的分母不算还在判的,和数字行一个口径
@@ -60,9 +63,13 @@ const classes = computed(() => {
none: Math.max(0, size - rows.length), none: Math.max(0, size - rows.length),
rate: submissions ? `${Math.round((accepted / submissions) * 100)}%` : "—", rate: submissions ? `${Math.round((accepted / submissions) * 100)}%` : "—",
last, last,
triedUsers: rows.length,
} }
}) })
.sort((a, b) => b.last.localeCompare(a.last)) // 交过的人多的在前(和题目页「各班做得怎样」一个顺序):按最近一次排的话,
// 零星一两个人补做的班会压在全班做过的班上面
.sort((a, b) => b.triedUsers - a.triedUsers || b.last.localeCompare(a.last))
)
}) })
</script> </script>
+1 -1
View File
@@ -474,7 +474,7 @@ export const problemStatsSchema = z.object({
.nullable(), .nullable(),
/** /**
* 老师:各班做这道题的情况,和数据统计「按班级汇总」**同一个口径**(只算学生的提交; * 老师:各班做这道题的情况,和数据统计「按班级汇总」**同一个口径**(只算学生的提交;
* 做完 / 班级人数、交了没对、没交、正确率、最近一次),按最近一次倒序。 * 做完 / 班级人数、交了没对、没交、正确率、最近一次),交过的人多的在前。
* 两边数字要一模一样 —— 老师从这里点过去,看到的数「变了」就不会再信任何一边。 * 两边数字要一模一样 —— 老师从这里点过去,看到的数「变了」就不会再信任何一边。
* 学生、比赛里为 null * 学生、比赛里为 null
*/ */