MemoFlow · Todo / Task 时间建模笔记
按版本记录任务时间、重复规则、模板实例与 TaskPlan / TaskOccurrence 设计。
Todo / Task 模块目标
准备给个人效率应用增加待办事项。普通 Todo 只需要标题和完成状态,但我还希望能够安排开始时间、结束时间、提醒以及每日或每周重复的行动。
所以数据结构不能只围绕一个 completed 布尔值设计。
V1.0.0
先把任务时间拆成不同情况。
- 时间点任务: 例如早上八点抢票,重点是某个具体时刻。
- 时间段任务: 例如八点到九点跑步,有开始与结束时间。
- 全天任务: 更关注哪一天完成,不一定有小时和分钟。
- 重复任务: 每日、每周、每月等,需要长期规则和结束条件。
时间类型还要考虑时区与跨天情况。一个“每天 08:00”的本地时间,和某个固定 UTC 时间戳不是同一件事;保存时不能只保留渲染层临时生成的字符串。
第一版先明确 TimePoint、TimeRange、RecurrenceRule 等值对象的表达能力,再决定数据库字段与表单如何对应。
v1.1.0
重复任务需要区分“行动规则”与“今天这一次”,所以采用 Template / Instance。
模板保存标题、重复时间、提醒规则等稳定定义;实例是根据模板生成的一次执行,可以独立标记完成或跳过。修改模板不应该未经确认就重写已完成的历史实例。
生成规则还需要结束条件:永不结束、到某个日期停止,或者执行指定次数。对于周重复,要能选择星期几;月重复还需要考虑每月具体日期以及不存在的日期如何处理。
这样安排一次任务、生成多次实例和保留执行历史可以明确分开。
V2.0.0
现在把 Template / Instance 收敛为 TaskPlan / TaskOccurrence,进一步强调计划状态与执行事实不同。
TaskPlan 定义行动和调度意图;Occurrence 保存这一次的时间快照、状态、执行时长与 Checklist。计划暂停或关闭,不意味着历史 Occurrence 应被删除。时间过去也只产生 Overdue 提示,不能擅自把待执行改成 Missed。
Task 的提醒时间由自己的规则产生调度意图,再交给 Scheduler 可靠唤醒;真正的日历展示属于 Schedule / Planner。这样 Todo 发展为任务系统时,不必把后台定时器和完整日历都写进 Task 内部。