Files
GPA_Monitoring/docs/BUG修复_邮件课程列表不正确.md
ChuXun 2e0e4ea8c6 1
2026-01-29 04:44:49 +08:00

5.3 KiB
Raw Blame History

BUG修复邮件通知课程列表不正确

问题描述

症状:

  • 日志显示检测到2门新增课程

    • 马克思主义基本原理 (A3505000018)
    • 软件需求分析与设计 (A0801050220)
  • 但邮件通知显示的是3门完全不同的课程:

    • C++程序设计
    • 体育(三) 乒乓球
    • 概率论与数理统计

根本原因

代码逻辑错误:

# 错误的实现
if self.check_grade_changes(grade_info, grade_html):
    courses_file = self.script_dir / '.last_courses.txt'
    if courses_file.exists():
        # ❌ 发送的是当前所有课程的前3门而不是新增课程
        self.send_email_notification(current_courses[:3])

问题分析

  1. check_grade_changes 函数内部计算了新增课程列表 new_courses
  2. 但函数只返回 True/False没有返回新增课程列表
  3. 主循环中使用了 current_courses[:3]当前所有课程的前3门
  4. 导致邮件中显示的课程与实际新增的课程不一致

举例说明

场景:

  • 之前有6门课程A、B、C、D、E、F
  • 新增2门课程G、H
  • 当前总共8门课程A、B、C、D、E、F、G、H

错误行为:

  • 日志显示新增2门G、H✓ 正确
  • 邮件显示A、B、C前3门 错误

期望行为:

  • 邮件显示G、H ✓ 正确

修复方案

1. 修改 check_grade_changes 函数签名

# 修改前
def check_grade_changes(self, current_content: str, current_html: str = None) -> bool:

# 修改后
def check_grade_changes(self, current_content: str, current_html: str = None) -> tuple:
    """检查成绩是否有变化
    
    Returns:
        tuple: (是否有变化: bool, 新增课程列表: list)
    """

2. 返回新增课程列表

# 修改前
if new_courses:
    # ... 记录日志 ...
    return True

# 修改后
if new_courses:
    # ... 记录日志 ...
    return (True, new_courses)  # 返回元组

# 其他情况
return (False, [])  # 无变化
return (True, [])   # 有变化但无新增课程(成绩更新)

3. 更新调用代码

# 修改前
if self.check_grade_changes(grade_info, grade_html):
    self.send_email_notification(current_courses[:3])  # ❌ 错误

# 修改后
has_changes, new_courses = self.check_grade_changes(grade_info, grade_html)

if has_changes:
    if new_courses:
        # 有新增课程,发送真正的新增课程列表
        self.send_email_notification(new_courses)  # ✅ 正确
    else:
        # 没有新增课程但内容变化(成绩更新),发送通用通知
        self.send_email_notification()

修复效果

修复前

日志:
[INFO] ✓ 检测到新增课程成绩!共 2 门
[INFO]   1. [2025-2026 秋季] 马克思主义基本原理 (A3505000018)
[INFO]   2. [2025-2026 秋季] 软件需求分析与设计 (A0801050220)

邮件:
新增课程共3门
  - 2025-2026 秋季 C++程序设计          ❌ 错误!
  - 2025-2026 秋季 体育(三) 乒乓球      ❌ 错误!
  - 2025-2026 秋季 概率论与数理统计     ❌ 错误!

修复后

日志:
[INFO] ✓ 检测到新增课程成绩!共 2 门
[INFO]   1. [2025-2026 秋季] 马克思主义基本原理 (A3505000018)
[INFO]   2. [2025-2026 秋季] 软件需求分析与设计 (A0801050220)

邮件:
新增课程共2门
  - 2025-2026 秋季 马克思主义基本原理   ✅ 正确!
  - 2025-2026 秋季 软件需求分析与设计   ✅ 正确!

测试建议

1. 单元测试场景

场景1新增课程

  • 之前3门课程
  • 现在5门课程新增2门
  • 期望邮件显示新增的2门

场景2成绩更新

  • 之前5门课程
  • 现在5门课程某门成绩变化
  • 期望:邮件显示通用通知

场景3无变化

  • 之前5门课程
  • 现在5门课程完全相同
  • 期望:不发送邮件

2. 集成测试

# 1. 删除历史记录(模拟首次运行)
cd ~/grade_monitor
rm .last_*

# 2. 运行测试
python3 monitor.py --test

# 3. 再次运行(模拟检测到变化)
# 手动编辑 .last_courses.txt删除几行
python3 monitor.py --test

# 4. 检查邮件内容是否正确

影响评估

向后兼容性

  • 完全兼容函数返回元组Python 会自动解包
  • 不影响测试模式test_fetch 不调用此函数
  • 不影响旧版数据:历史文件格式不变

风险等级

  • 🟢 低风险:仅修改返回值类型
  • 🟢 所有调用点已更新
  • 🟢 已通过语法检查

部署步骤

# 1. 本地打包
cd /mnt/e/50425/Documents/Github/GPA_Monitoring
./打包.sh

# 2. 上传到服务器
scp gpa_monitor.tar.gz user@server:~/

# 3. 服务器上更新
systemctl stop grade-monitor
cd ~/grade_monitor
cp monitor.py monitor.py.backup.$(date +%Y%m%d_%H%M%S)
tar -xzf ~/gpa_monitor.tar.gz
systemctl restart grade-monitor

# 4. 验证
tail -f monitor.log

后续优化建议

  1. 添加单元测试 - 测试 check_grade_changes 函数
  2. 记录邮件内容 - 在日志中记录发送的课程列表
  3. 邮件确认机制 - 发送成功后记录一份副本

BUG编号 #001
严重程度: 高(数据不一致)
修复日期: 2026-01-21
修复人员: GitHub Copilot
测试状态: 待用户验证