Skip to content

feat(MYSY): 新增「实际上课时间」时间表(上午 4 节),导入时可与教务课表时间二选一 - #9

Merged
Mutx163 merged 2 commits into
Mutx163:mainfrom
Guzheng3:feat/mysy-timeslot-choice
Sep 9, 2026
Merged

feat(MYSY): 新增「实际上课时间」时间表(上午 4 节),导入时可与教务课表时间二选一#9
Mutx163 merged 2 commits into
Mutx163:mainfrom
Guzheng3:feat/mysy-timeslot-choice

Conversation

@Guzheng3

@Guzheng3 Guzheng3 commented Sep 9, 2026

Copy link
Copy Markdown

背景

绵阳师范学院实际上课时间与教务系统课表时间不一致,脚本此前只能把教务课表的时间直接交给 App,课表显示的上课时间与实际作息对不上。本 PR 新增「实际上课时间」时间表,导入时让用户二选一。

教务系统课表时间(13 小节)

大节 时间 小节
第一大节 08:00-09:35 第 1、2 节
第二大节 09:55-12:20 第 3、4、5 节
第三大节 14:00-15:35 第 6、7 节
第四大节 15:55-18:20 第 8、9、10 节
第五大节 19:00-21:25 第 11、12、13 节

实际上课时间(11 节,本 PR 新增)

上午只有 4 节 —— 教务第 5 节(11:35-12:20)实际无课;晚上 2 节。

节次 时间 节次 时间
1 08:15-09:00 7 16:05-16:50
2 09:05-09:50 8 16:55-17:40
3 10:20-11:05 9 17:45-18:30
4 11:10-11:55 10 19:00-19:45
5 14:00-14:45 11 19:50-20:35
6 14:50-15:35

与教务口径的差异:上午 4 节 vs 5 节;下午第 1 节 14:00(教务第 6 节);晚上 2 节 vs 3 节;上午第 1 节晚 15 分钟(08:15 vs 08:00)。

改动

导入时弹窗二选一(默认「教务系统课表时间」,不改变现有行为):

选择课表使用的时间表
  ● 教务系统课表时间(13 节)
  ○ 实际上课时间(11 节,上午 4 节)
  1. 新增 ACTUAL_TIME_SLOTS:上表的 11 节实际作息
  2. 新增 JWC_TO_ACTUAL_SECTION + remapCoursesToActualSections():选择「实际上课时间」时把课程节次由教务口径换算为实际作息口径(教务 6→实际 5、7→6…),避免只换时间表导致的节次错位
  3. chooseTimeSlots() 返回 {useActual, slots}runImportFlow() 据此决定是否换算节次
  4. 位于教务第 5/13 节(实际作息无对应节次)的课程保留原节次并 toast 提示
  5. 取消 / 越界 / 旧版 App 无 showSingleSelection → 回落「教务系统课表时间」,不阻断导入
  6. JWC_FALLBACK_TIME_SLOTS 仍为教务口径兜底(#kbtable 存在但读不到时间块时)

验证

jsdom 加载真实课表页(jw.mtc.edu.cn/jsxsd/xskb/xskb_list.do#kbtable,14 门课程),22 项断言全部通过:

用例 结果
选「实际上课时间」→ 11 节,上午 4 节(08:15 / 09:05 / 10:20 / 11:10),不含 11:35
14 门课程节次全部换算,且落在 1-11 范围内
教务 6-7 节 → 实际 5-6 节,时间 14:00-15:35
教务第 5/13 节课程保留原节次 + 提示用户
选「教务系统课表时间」→ 13 节、首节 08:00-08:45、课程节次不变
取消 / 回传 -1 / 越界 9 / 旧桥接层 → 回落教务口径且不抛错

兼容性

  • 默认选项是「教务系统课表时间」,老用户导入行为完全不变
  • 只调用 showSingleSelection / saveImportedCourses / savePresetTimeSlots,均已在 docs/SCRIPT_API.md 定义
  • App 端 _decodeImportedSections() 只取 startTime/endTime(忽略 number),两套表均按数组顺序生效

绵阳师范学院教务课表页(#kbtable 的 th[rowspan] 时间块)给出的是教务口径的
13 小节(08:00-21:25),而学校作息表是 11 节(08:15 起,上午 2+2、
下午 2+2+1、晚上 2)。两套作息节数不同、编号也错位(作息表第 5 节
14:00 = 教务第 6 节 14:00),此前脚本固定使用页面推导结果,
想按学校作息显示课表的用户没有选择权。

改动:
- 把 generateTimeSlots() 内的内联 fallback 数组提为 PRESET_TIME_SLOTS 常量
  (内容不变,仍是学校作息表 11 节),避免同一份作息表在文件里出现两次
- 新增 chooseTimeSlots():通过 bridgePromise.showSingleSelection 弹单选,
  让用户在「教务系统时间表(13 节)」与「预设作息时间表(11 节)」间二选一
- 默认选中「教务系统时间表」,与课表节次编号保持一致
- 桥接层回传 number / 字符串 / null 都归一化;取消、越界、
  旧桥接层没有 showSingleSelection 时一律回落教务系统时间表,不阻断导入
- generateTimeSlots() 的页面推导逻辑保持不变

验证:jsdom 加载真实课表页面,7 项用例全通过(选 0/1、字符串回传、
取消 null/-1、越界、旧桥接层回落),端到端 runImportFlow 分别保存
13 节与 11 节,均导入 14 门课程。
页面存在 #kbtable 但读不到 th[rowspan] 时间块时,fallback 原指向预设作息表,
会让「教务系统时间表」和「预设作息时间表」两个选项都是 11 节。
新增 JWC_FALLBACK_TIME_SLOTS(13 小节,与页面推导口径一致)作为兜底。
@Mutx163
Mutx163 merged commit 216e86b into Mutx163:main Sep 9, 2026
1 check passed
@Guzheng3 Guzheng3 changed the title feat(MYSY): 导入时可选「教务系统时间表」或「预设作息时间表」 feat(MYSY): 新增「实际上课时间」时间表(上午 4 节),导入时可与教务课表时间二选一 Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants