把课表提醒做成可重复的通知,核心在于把课程、日期、单双周和发送渠道之间的关系写清楚。提醒一旦进入日常,最需要防的是重复、错发或在配置改变以后仍然沿用旧内容。
先把课表变成数据
课程可以用一个小而明确的结构表示:星期、开始时间、结束时间、单双周、教室和课程名称。JSON 或数据库记录只保存事实,推送文案放在发送层生成。这样修改文案不会影响判断逻辑,调整一门课也不用重写定时任务。
生成当天课表时,先确定时区和日期,再判断当前周次。周次基准必须写进配置,并提供一个可以手工覆盖的选项,因为学期临时调课、补课和节假日会让简单的“第几周”算法失效。遇到无法判断的日期,宁可不发,也不要猜。
渠道要有自己的边界
通知渠道不是业务逻辑的一部分。课程服务只返回“今天需要提醒的内容”,发送适配器负责把它转换成某个平台的请求格式。这样以后更换渠道时,数据库和周次判断不需要一起修改。
使用官方接口时,凭据放在运行环境或密钥管理系统里,日志里只记录请求 ID 和结果,不记录完整令牌。测试环境应使用测试账号和固定样本,不能用真实账号反复试发。平台接口返回成功,也不代表用户一定看到了消息,所以发送记录和失败重试需要单独保存。
重试不能制造重复提醒
网络超时以后,程序不知道请求到底有没有到达。直接重试可能让同一条通知出现两次。可以为“用户、日期、课程、渠道”生成幂等键,发送前检查记录,成功以后再落库;如果平台提供消息 ID,则把它和本地状态关联起来。
定时任务也需要可观察。每次运行记录计算出的课程数量、跳过原因、发送结果和耗时。监控看到“任务成功”时,应该能进一步知道是发了三条,还是因为今天没有课程而正常结束。对于单双周或调课这种易错点,最好提供一个只读预览命令,让我在真正发送前先看结果。
温情不是靠随机句子
以前我觉得晚上再发一句问候,会让工具更像一个陪伴。现在更在意的是它是否打扰。固定的发送时间、明确的关闭入口和可见的配置,比随机文案更能让人放心。提醒工具的价值是帮人少记一件事,不是占据更多注意力。
这个小项目最后留下的经验很朴素:把时间判断、内容生成、渠道发送和状态记录拆开;把凭据和日志隔离;把重试设计成幂等;在发出之前提供预览。功能不复杂,边界却要认真写。以后再做类似的自动化,我仍然会先从这几条开始。
跨周测试是这个项目最容易漏掉的地方。可以准备一个固定学期样本,分别验证单周、双周、学期第一周、跨月日期和临时调课;预览输出与发送适配器分开测试,避免为了检查一门课而真的发出消息。
当任务没有课程时,也应该有明确的结果记录。空结果、配置错误、渠道拒绝和网络超时是四种不同状态,不能都写成“执行成功”。状态越细,下一次排查越不需要翻聊天记录。