feat(统计): 没填班级的学生也能和班级一样看——班级下拉多一项「没填班级」,一起上的课能切出来、点进去看小方块;零散提交也能点了
- 班级筛选多一个取值 NO_CLASS("none"),统计、方块串、流程图、提交列表都认;只圈普通学生, 老师管理员的号本来就不填班级,不挡的话试题的提交会算进去 - 切课时没填班级的号合在一起当一个班切(原来 class_name is null 直接排除,7 月 4 日那两节课看不到) - 没填班级不是真班:不列「还没交」,课上只写几人不写几人之几 - 「另有零散提交」每一项可点,进那个班那一整天 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c2ef55b10b
commit
923f3efeca
10 files changed
+153
-66
No files matched your search
@@ -405,12 +405,20 @@ export const submissionStatisticsSchema = z.object({
|
||||
results: z.array(z.object({ result: judgeStatusSchema, count: z.number().int() })),
|
||||
})
|
||||
|
||||
/**
|
||||
* 班级筛选(统计、提交列表、流程图的 `className` 参数)里代表「没填班级」的取值:
|
||||
* 这批号(夏令营、兴趣班、自己注册的)`user.class_name` 是 null,当成一个班来看。
|
||||
* 真班名全是数字(`253`、`2511`),撞不上
|
||||
*/
|
||||
export const NO_CLASS = "none"
|
||||
|
||||
/**
|
||||
* 统计「一行一节课」的总览(GET /submissions/statistics/lessons,设计稿「统计合二为一」B)。
|
||||
* 没选班、没填学生、没填题号时用它;原来「今日统计」老师那一版并进来了,换成任意时间段。
|
||||
*
|
||||
* **一节课怎么切**:只算普通学生(和方块串同一个口径),按「班 + 东八区哪一天」分组,
|
||||
* 相邻两条提交隔 30 分钟以上就切开;切出来的一段里有一道题 5 人以上做过,才算一节课。
|
||||
* 没填班级的号合在一起当一个班切(`className` 为 null)。
|
||||
* 其余的是零散提交(补做、课后自己练)。这样 26计算机0班 9 月 29 日是 14:04–15:38,
|
||||
* 不会被 16:24、18:42 那两条课后提交拖成「14:04–18:42」。
|
||||
*/
|
||||
@@ -420,14 +428,15 @@ export const submissionLessonsSchema = z.object({
|
||||
/** 最近的 N 节课,按开始时间倒序(界面上按天分组,这节课在最上面) */
|
||||
lessons: z.array(
|
||||
z.object({
|
||||
className: z.string(),
|
||||
/** null = 没填班级的那批号,点进去按 NO_CLASS 筛 */
|
||||
className: z.string().nullable(),
|
||||
/** 东八区的日子,`2026-09-29` */
|
||||
day: z.string(),
|
||||
/** 这一段第一条、最后一条提交 */
|
||||
start: z.string(),
|
||||
end: z.string(),
|
||||
userCount: z.number().int(),
|
||||
/** 班里的学生数(未禁用的普通用户) */
|
||||
/** 班里的学生数(未禁用的普通用户)。没填班级的谈不上花名册,给 0 */
|
||||
classSize: z.number().int(),
|
||||
/** 这节课做的题(这一段里 5 人以上做过的),做的人多的在前,最多 20 道 —— 点进去就筛这几道 */
|
||||
problems: z.array(z.string()),
|
||||
|
||||
Reference in new issue
Block a user