feat: 看板每组显示考试成员榜(排名/姓名/成绩,成绩降序) + 防溢出
This commit is contained in:
@@ -171,11 +171,42 @@ try {
|
||||
];
|
||||
};
|
||||
|
||||
// 已提交成员榜:按成绩从高到低,缺成绩者排最后,并给出排名
|
||||
$membersOf = static function (array $rs): array {
|
||||
$ms = [];
|
||||
foreach ($rs as $r) {
|
||||
$ms[] = [
|
||||
'sid' => (string)($r['sid'] ?? ''),
|
||||
'name' => (string)($r['name'] ?? ''),
|
||||
'score' => ($r['score'] ?? null),
|
||||
];
|
||||
}
|
||||
usort($ms, static function (array $a, array $b): int {
|
||||
$as = $a['score'];
|
||||
$bs = $b['score'];
|
||||
if ($as === null && $bs === null) {
|
||||
return 0;
|
||||
}
|
||||
if ($as === null) {
|
||||
return 1; // 无成绩排最后
|
||||
}
|
||||
if ($bs === null) {
|
||||
return -1;
|
||||
}
|
||||
return $bs <=> $as; // 成绩降序
|
||||
});
|
||||
foreach ($ms as $i => $m) {
|
||||
$ms[$i]['rank'] = $i + 1;
|
||||
}
|
||||
return $ms;
|
||||
};
|
||||
|
||||
$classes = [];
|
||||
foreach ($byCls as $k => $stu) {
|
||||
$rs = $rowsByCls[$k] ?? [];
|
||||
$row = $statOf($stu, $rs, $fs);
|
||||
$row['class'] = $k;
|
||||
$row['class'] = $k;
|
||||
$row['members'] = $membersOf($rs);
|
||||
|
||||
// 班级内按组别(A/B 等)再聚合,用于看板下钻对比
|
||||
$stuByGrp = [];
|
||||
@@ -191,7 +222,8 @@ try {
|
||||
$groups = [];
|
||||
foreach ($stuByGrp as $g => $gstu) {
|
||||
$gs = $statOf($gstu, $rowsByGrp[$g] ?? [], $fs);
|
||||
$gs['group'] = $g;
|
||||
$gs['group'] = $g;
|
||||
$gs['members'] = $membersOf($rowsByGrp[$g] ?? []);
|
||||
$groups[] = $gs;
|
||||
}
|
||||
usort($groups, static fn(array $a, array $b): int => strcmp((string)$a['group'], (string)$b['group']));
|
||||
|
||||
Reference in New Issue
Block a user