Task模块
Task模块-任务管理业务理解
#tech / dev / pm
#type / howto
#status / growing
[!info] related notes
Task模块设计思路
Overview
- 支持重复任务、单次任务(比如 跑步任务,每天 8点到9点)
- 任务应该有起止时间,支持无期限任务
- 支持区分时间段任务(单天内的,不支持跨天)、时间点任务、全天任务,
- 支持提醒功能,任务开始前几分钟之类的预设值
- 支持与 goal 模块的 keyResult 绑定,完成时自动增加 keyResult 完成记录(即创建 goalRecord)
- 我个人认为应该使用 任务模板-任务实例 的形式
服务
基础服务
- 任务模板创建: 有任务的基础信息(名字、时间配置、重要性、信息)等,如果时绑定 goal 模块的关键结果,则 重要性、信息 可以直接从 goal 中继承。
- 任务模板创建获取: 文件夹的名字、图标、颜色;获取所有文件夹。
- 任务模板获取:根据生命周期筛选获取 (是直接进入页面就初始化获取所有目标,客户端筛选 还是 每次筛选都只从服务端 获取筛选结果? 筛选结果是不是可以缓存)
- 任务实例的创建: 通过任务模板生成
复杂业务服务
- 任务模板应该支持层级关系,支持生成依赖图谱
- 任务提醒: 用户可以设置任务提醒。应该需要和 schedule 和 reminder 模块联动。
- 每日总结功能: 提供 task 模块相关的当日统计信息
- goal 模块、task 模块、reminder 模块的提醒功能需要依赖 schedule 模块,记得统一一下时间配置,应该是使用 cron 表达式
- 其他的
领域实体对象
聚合根对象:
- task-template(任务模板): 定义任务的“元数据”和“生成规则”。
- task-instance(任务实例): 具体的某一天的一个代办事项
实体对象:
SubTask(子任务): 简单的 CheckList,隶属于 Instance。
关键值对象:
TaskRecurrence(重复规则): 核心 VO,封装 Cron 表达式或 RRule。TimeSlot(时间段): 包含startTime,endTime,isAllDay。LinkedKeyResult(关联目标): 包含goalId,keyResultId,contributionValue(完成该任务给 KR 贡献多少分)。
关键点
task 和 keyresult联动时的 完成 功能的业务问题
问题: 现在 complete 任务实例是默认根据 taskTemplate 创建时绑定的 关键结果值 来变化的,并且点击一下 按钮就生效,还支持 undo(还没准确实现)
我觉得当前的设计不好,因为关键结果是有多种计算方式,比如 普通的 累加,还有 取最大值、取平均值,完成时 比如当 绑定的关键结果为 考试最高分到达 90,每月进行一次考试 时,用户完成 考试任务,并标记完成,添加到新的 record 应该需要 用户根据本次的考试结果来确定,而非默认可以达到; 并且如果实现每次完成都需要弹窗确认并输入新的 record 的值,可以确保 用户不会误触,也就不需要 undo 功能(并不好实现)
解决方法: 所以应该取消默认的 record 值,改为用户点击 complete 时,弹窗显示相关信息,并让用户手动输入 新 record 的值 你觉得呢
功能
应该实现下面两种不同的功能: 还有 每个 instance 完成时,对应的 keyResult 记录增加 实现 template 完全完成时,对应的 keyresult 记录增加。
要支持顺序任务主任务: 比如一个 毕业 的 goal, 有 二课活动达到 50 分 的 keyResult。 二课则是需要我去寻找的, 即 我应该创建一个 任务模板,我可以在其中创建 子任务 这种情况下,我需要去抢二课,我需要