跳到主要内容

待办事项

ToDo 子域提供当前用户的待办 CRUD、完成状态、批量操作、拖拽排序和一次性提醒。HTTP 接入位于 FreeKit.Platform.HttpApi/ToDo,核心实体与服务位于 FreeKit.Platform/ToDo

业务能力

  • 个人数据隔离:列表按 CreateUserId 过滤;详情、修改、删除、完成和排序都会调用 ToDo.CanBeAccessedBy
  • 完成态MarkDone(isDone) 维护 IsDone 与完成时间。
  • 拖拽排序SortAsync 按传入 Id 顺序写入 Sort
  • 提醒:更新待办且 NotificationTime 晚于当前时间时,登记 todo-notification-{todoId} 一次性任务。

当前实现中,CreateAsync 只写入待办,不会登记提醒;提醒调度发生在 UpdateAsync。调用方如需创建后提醒,应在创建成功后再执行一次带未来 NotificationTime 的更新,或先调整应用服务实现并补测试。

提醒链路

FreeSchedulerNotificationAdapter 自身会把过去时间转换为 delaySeconds = 0,但 ToDoService.UpdateAsync 当前只在时间大于 DateTime.Now 时调用它。因此通过现有 HTTP 更新提交过去时间不会创建任务。

Job 端处理器位于 src/Services/Host/FreeKit.Job.Host/Extensions/JobExtensions.cs。它在发送前把待办标记为已提醒,避免任务重放造成重复通知;最终调用的是 CmsKit INotificationService,不是 Platform 消息渠道服务。

API

基础路由:/api/plat/todo,Controller 继承 FreeKitController,默认需要认证。

方法路由用途
GET/api/plat/todo当前用户分页列表
GET/api/plat/todo/{id}详情(当前 Action 标记了 AllowAnonymous,服务仍检查资源所有者)
POST/api/plat/todo创建
PUT/api/plat/todo/{id}更新并可能登记提醒
DELETE/api/plat/todo/{id}软删除
PUT/api/plat/todo/done/{id}/{isDone}单条完成/取消完成
PUT/api/plat/todo/dones批量完成/取消完成
PUT/api/plat/todo/sort保存拖拽顺序

时间约定

仓库新代码约定数据库时间写入使用 DateTime.UtcNow。ToDo 现有 CreateAsync 和提醒延迟计算仍使用 DateTime.Now,属于存量行为;扩展时不要复制这一写法,修正时需要同时明确 API 输入时区和既有数据语义。

关键源码

  • src/Services/Platform/FreeKit.Platform/ToDo/Application/ToDoService.cs
  • src/Services/Platform/FreeKit.Platform/ToDo/Application/FreeSchedulerNotificationAdapter.cs
  • src/Services/Platform/FreeKit.Platform.HttpApi/ToDo/Controllers/ToDoController.cs
  • src/Services/Host/FreeKit.Job.Host/Extensions/JobExtensions.cs

相关文档