2026年1月1日 · 阅读 —

人工智能编程之方法调用结构样本(待办任务)

Agent 与 SkillsAI 工程实践

人工智能编程之方法调用结构样本(待办任务)

需求点0:任务管理

功能点0.1:创建与管理任务

客户端 (Android/iOS/Web - 以Android为例)

UI层
  • TaskListFragment:任务列表主界面,展示任务概要列表,支持滑动操作。
    • 操作:用户上下滑动浏览列表,点击“+”或“添加任务”按钮,点击任务项进入详情,在任务项左侧点击复选框。
  • CreateTaskActivity:创建新任务的全屏表单页面。
    • 操作:用户填写标题、描述、优先级、截止时间等信息,点击“保存”按钮。
  • TaskDetailActivity:任务详情页面,展示任务所有信息。
    • 操作:用户查看详情,点击“编辑”按钮,修改字段后点击“保存”。
ViewModel层
  • TaskListViewModel
    • fun loadTasks(viewType: TaskViewType, filters: TaskFilters?)
      • 作用:根据视图类型(如“今天”、“所有”)和可选筛选条件加载任务列表。调用LoadTasksUseCase。
      • 参数:
        • viewType: TaskViewType:枚举,指定列表视图类型。
        • filters: TaskFilters?:可选的筛选条件对象。
    • fun completeTask(taskId: String)
      • 作用:将指定任务标记为完成。调用CompleteTaskUseCase。
      • 参数:
        • taskId: String:要完成的任务ID。
  • CreateTaskViewModel
    • fun createTask(draft: TaskDraft)
      • 作用:提交新任务草稿,执行创建逻辑。调用CreateTaskUseCase。
      • 参数:
        • draft: TaskDraft:任务草稿对象,包含标题(title)、描述(description)、优先级(priority)、截止时间(dueTime)等字段。
  • TaskDetailViewModel
    • fun loadTaskDetail(taskId: String)
      • 作用:加载指定任务的完整详情。调用GetTaskDetailUseCase。
    • fun editTask(taskId: String, changes: TaskEditableFields)
      • 作用:提交对任务的编辑。调用EditTaskUseCase。
      • 参数:
        • changes: TaskEditableFields:封装了所有允许修改字段及其新值的对象。
UseCase层
  • LoadTasksUseCase (suspend fun execute(query: TaskQuery): Result<PagedData<TaskSummary>>)
    • 作用:封装加载任务列表的逻辑。构建查询条件,调用仓库。调用TaskRepository.getTasks。
  • CreateTaskUseCase (suspend fun execute(draft: TaskDraft): Result<TaskDetail>)
    • 作用:创建新任务。执行本地表单验证,调用仓库提交。逻辑:根据dueTime和用户设置,触发生成提醒的衍生逻辑。调用TaskRepository.createTask。
  • GetTaskDetailUseCase (suspend fun execute(taskId: String): Result<TaskDetail>)
    • 作用:获取单个任务的详情。调用TaskRepository.getTaskDetail。
  • EditTaskUseCase (suspend fun execute(taskId: String, changes: TaskEditableFields): Result<Unit>)
    • 作用:编辑任务。关键逻辑:如果修改了dueTime,需触发重新计算相对提醒。提交后需确保列表视图数据同步。调用TaskRepository.editTask。
  • CompleteTaskUseCase (suspend fun execute(taskId: String): Result<Unit>)
    • 作用:完成任务。核心逻辑:1. 更新任务状态为“已完成”。2. 若任务是周期性任务,则触发创建下一周期实例。3. 清理所有关联提醒。4. 根据配置决定是否自动归档。调用TaskRepository.completeTask。
Repository层 (接口)
  • TaskRepository
    • suspend fun getTasks(query: TaskQuery): PagedData<TaskSummary>
      • 作用:网络API调用,获取分页任务列表。
    • suspend fun createTask(draft: TaskDraft): TaskDetail
      • 作用:网络API调用,创建新任务。
    • suspend fun getTaskDetail(taskId: String): TaskDetail
      • 作用:网络API调用,获取任务详情。
    • suspend fun editTask(taskId: String, changes: TaskEditableFields)
      • 作用:网络API调用,提交任务编辑。
    • suspend fun completeTask(taskId: String)
      • 作用:网络API调用,标记任务完成。
数据源层 (实现)
  • TaskRepositoryImpl (实现 TaskRepository接口)
    • private val taskApi: TaskApiService:Retrofit定义的网络API接口。
    • suspend fun getTasks(query: TaskQuery): PagedData<TaskSummary>
      • 实现:调用taskApi.getTasks(query.toReq()),转换分页结果。
    • suspend fun createTask(draft: TaskDraft): TaskDetail
      • 实现:调用taskApi.createTask(CreateTaskReq.fromDraft(draft)),转换返回结果。
    • suspend fun getTaskDetail(taskId: String): TaskDetail
      • 实现:调用taskApi.getDetail(taskId),转换返回结果。
    • suspend fun editTask(taskId: String, changes: TaskEditableFields)
      • 实现:调用taskApi.editTask(taskId, EditTaskReq(changes))。
    • suspend fun completeTask(taskId: String)
      • 实现:调用taskApi.completeTask(taskId)。

服务器 (SpringBoot)

Controller层
  • TaskController
    • @GetMapping(“/v1/tasks”) fun getTasks(@ModelAttribute query: TaskQueryReq): Response<Page<TaskSummaryVO>>
      • 作用:处理获取任务列表的请求。调用TaskService.getPagedTasks。
    • @PostMapping(“/v1/tasks”) fun createTask(@RequestBody req: CreateTaskReq): Response<TaskDetailVO>
      • 作用:处理创建任务的请求。调用TaskService.createTask。
    • @GetMapping(“/v1/tasks/{taskId}”) fun getDetail(@PathVariable taskId: String): Response<TaskDetailVO>
      • 作用:处理获取任务详情的请求。调用TaskService.getTaskDetail。
    • @PutMapping(“/v1/tasks/{taskId}”) fun editTask(@PathVariable taskId: String, @RequestBody req: EditTaskReq): Response<Unit>
      • 作用:处理编辑任务的请求。调用TaskService.editTask。
    • @PostMapping(“/v1/tasks/{taskId}/complete”) fun completeTask(@PathVariable taskId: String): Response<Unit>
      • 作用:处理完成任务的状态。调用TaskService.completeTask。
Service层
  • TaskService
    • fun getPagedTasks(userId: Long, query: TaskQueryReq): Page<TaskSummaryVO>
      • 作用:根据查询条件(视图、筛选、排序)查询任务列表。调用TaskRepository.findByUserIdAnd…。
    • fun createTask(userId: Long, req: CreateTaskReq): Task
      • 作用:核心创建逻辑。1. 校验数据(标题非空、时间逻辑)。2. 创建Task实体并保存。3. 若请求中包含dueTime且用户开启了提醒,则调用ReminderService.scheduleReminder创建提醒记录。调用TaskRepository.save。
    • fun getTaskDetail(taskId: String, userId: Long): TaskDetailVO
      • 作用:查询任务详情,并关联查询子任务、附件等信息。校验任务属于当前用户。调用TaskRepository.findById。
    • fun editTask(taskId: String, userId: Long, req: EditTaskReq)
      • 作用:核心编辑与同步逻辑。1. 获取并校验任务。2. 更新字段。3. 关键点:若dueTime被修改,调用ReminderService.rescheduleRelativeReminders重新计算并更新所有基于旧时间的相对提醒。4. 保存任务。5. 通过消息队列或事件广播 TaskUpdatedEvent,以便通知其他在线客户端(如看板、日历视图)刷新数据。调用TaskRepository.save。
    • fun completeTask(taskId: String, userId: Long)
      • 作用:完成任务的状态流转与衍生操作。1. 校验任务状态(需为“未开始”或“进行中”)。2. 更新任务状态为“已完成”,记录完成时间。3. 顺序控制:调用RecurringTaskService.handleCompletion处理周期性任务生成下一个实例。4. 调用ReminderService.cancelAllRemindersForTask清理提醒。5. 若配置了自动归档,更新任务归档状态。调用TaskRepository.save。
Repository层 (接口 - JPA)
  • TaskRepository (extends JpaRepository<Task, String>)
    • fun findByIdAndUserId(taskId: String, userId: Long): Task?
      • 作用:根据任务ID和用户ID查找任务,用于权限校验。
    • fun findByUserIdAnd…(userId: Long, …): Page<Task>
      • 作用:根据用户ID和复杂查询条件(对应TaskQueryReq)分页查询任务列表。
    • fun save(task: Task): Task
      • 作用:保存或更新任务实体。
  • ReminderRepository (extends JpaRepository<Reminder, Long>)
    • fun findByTaskId(taskId: String): List<Reminder>
      • 作用:查找任务的所有提醒。
    • fun deleteByTaskId(taskId: String)
      • 作用:删除任务的所有提醒。
Entity层
  • Task (@Entity)
    • 作用:任务核心实体。字段:id(主键), userId, title, description, priority, dueTime, status, projectId, isArchived, completedAt, createdAt, updatedAt。
  • Reminder (@Entity)
    • 作用:任务提醒实体。字段:id, taskId, triggerTime, status。
Database层
  • MySQL 数据库:物理存储介质。
    • 表 task: 存储Task实体数据。
    • 表 reminder: 存储Reminder实体数据。
    • 操作:所有JPA Repository的操作转化为SQL执行。TaskService.editTask和completeTask中的多步骤操作需保证事务性。

功能点0.2:组织与筛选任务

客户端 (Android/iOS/Web - 以Android为例)

UI层
  • TaskListFragment (复用/扩展):列表页顶部的筛选器入口和搜索框。
    • 操作:用户点击“筛选”图标展开筛选面板,设置状态、优先级等条件后点击“应用”;在搜索框输入关键词。
  • TagManagementFragment:(可选) 专门的标签管理页面。
    • 操作:用户创建、编辑或删除全局标签。
ViewModel层
  • TaskOrganizationViewModel (可整合入TaskListViewModel或独立)
    • fun loadAvailableTags()
      • 作用:加载用户已创建和个人常用的标签列表,用于创建/编辑任务时的智能提示。调用GetAvailableTagsUseCase。
    • fun createOrUpdateTag(tagName: String)
      • 作用:创建新标签或更新现有标签。在标签管理页或创建任务时调用。调用ManageTagUseCase。
    • fun applyFilter(filter: TaskFilter)
      • 作用:应用用户设置的复合筛选条件,刷新任务列表。调用ApplyTaskFilterUseCase。
      • 参数:
        • filter: TaskFilter:筛选条件对象,包含状态(statuses)、优先级(priorities)、标签(tags)、日期范围(dateRange)等条件。
    • fun searchTasks(keyword: String)
      • 作用:根据关键词搜索任务,可与当前筛选条件组合。调用SearchTasksUseCase。
UseCase层
  • GetAvailableTagsUseCase (suspend fun execute(): Result<List<Tag>>)
    • 作用:获取用户的标签列表。调用TagRepository.getTags。
  • ManageTagUseCase (suspend fun execute(tagName: String): Result<Tag>)
    • 作用:管理标签(创建或更新)。调用TagRepository.saveTag。
  • ApplyTaskFilterUseCase (suspend fun execute(filter: TaskFilter): Result<PagedData<TaskSummary>>)
    • 作用:封装应用筛选的逻辑。核心:将筛选条件对象转换为后端的查询参数,确保不同条件间AND、同条件内多选OR的逻辑正确。调用TaskRepository.getTasksWithFilter。
  • SearchTasksUseCase (suspend fun execute(query: SearchQuery): Result<PagedData<TaskSummary>>)
    • 作用:封装搜索逻辑。处理关键词与筛选条件的组合查询。调用TaskRepository.searchTasks。
Repository层 (接口)
  • TagRepository
    • suspend fun getTags(): List<Tag>
      • 作用:网络API调用,获取用户的标签列表。
    • suspend fun saveTag(tagName: String): Tag
      • 作用:网络API调用,创建或更新标签。
  • TaskRepository (扩展)
    • suspend fun getTasksWithFilter(query: FilteredTaskQuery): PagedData<TaskSummary>
      • 作用:网络API调用,根据复杂的筛选条件获取任务列表。
    • suspend fun searchTasks(query: SearchTaskQuery): PagedData<TaskSummary>
      • 作用:网络API调用,执行搜索。
数据源层 (实现)
  • TagRepositoryImpl (实现 TagRepository接口)
    • private val tagApi: TagApiService
    • suspend fun getTags(): List<Tag>
      • 实现:调用tagApi.getTags(),转换结果。
    • suspend fun saveTag(tagName: String): Tag
      • 实现:调用tagApi.saveTag(SaveTagReq(tagName)),转换结果。
  • TaskRepositoryImpl (扩展实现)
    • suspend fun getTasksWithFilter(query: FilteredTaskQuery): PagedData<TaskSummary>
      • 实现:调用taskApi.getTasksWithFilter(query.toReq()),转换分页结果。
    • suspend fun searchTasks(query: SearchTaskQuery): PagedData<TaskSummary>
      • 实现:调用taskApi.searchTasks(query.toReq()),转换分页结果。

服务器 (SpringBoot)

Controller层
  • TagController
    • @GetMapping(“/v1/tags”) fun getTags(): Response<List<TagVO>>
      • 作用:处理获取用户标签列表的请求。调用TagService.getUserTags。
    • @PostMapping(“/v1/tags”) fun saveTag(@RequestBody req: SaveTagReq): Response<TagVO>
      • 作用:处理创建/更新标签的请求。调用TagService.saveTag。
  • TaskController (扩展)
    • @PostMapping(“/v1/tasks/filter”) fun getTasksWithFilter(@RequestBody req: TaskFilterReq): Response<Page<TaskSummaryVO>>
      • 作用:处理应用复杂筛选的请求。调用TaskService.getTasksWithFilter。
    • @GetMapping(“/v1/tasks/search”) fun searchTasks(@ModelAttribute query: SearchTaskQueryReq): Response<Page<TaskSummaryVO>>
      • 作用:处理搜索任务的请求。调用TaskService.searchTasks。
Service层
  • TagService
    • fun getUserTags(userId: Long): List<TagVO>
      • 作用:查询用户使用过的所有标签,可按使用频率排序。调用TaskRepository.findDistinctTagsByUserId。
    • fun saveTag(userId: Long, req: SaveTagReq): TagVO
      • 作用:保存标签。逻辑:标签在系统中可能是全局唯一的,但关联到用户。检查标签名称最大长度等约束。调用TagRepository.save。
  • TaskService (扩展)
    • fun getTasksWithFilter(userId: Long, req: TaskFilterReq): Page<TaskSummaryVO>
      • 作用:构建动态查询。根据请求中的多维度条件,使用Specification或QueryDSL构建复杂的JPA查询。核心:实现(状态 IN (…)) AND (优先级 IN (…)) AND (标签包含…)等逻辑。调用TaskRepository.findAll(带Specification)。
    • fun searchTasks(userId: Long, query: SearchTaskQueryReq): Page<TaskSummaryVO>
      • 作用:在getTasksWithFilter的查询基础上,增加对keyword在标题、描述等字段的模糊匹配(LIKE)或全文检索。
Repository层 (接口 - JPA)
  • TagRepository (extends JpaRepository<Tag, String>)
    • fun findByName(name: String): Tag?
      • 作用:根据标签名查找标签。
    • fun save(tag: Tag): Tag
      • 作用:保存标签。
  • TaskRepository (extends JpaRepository<Task, String>, JpaSpecificationExecutor) (扩展)
    • fun findDistinctTagsByUserId(userId: Long): List<String>
      • 作用:查询指定用户使用的所有不重复的标签名称。
    • (复杂筛选和搜索通过JpaSpecificationExecutor的findAll(Specification, Pageable)方法实现)
Entity层
  • Tag (@Entity)
    • 作用:标签实体。字段:id/name(主键), createdBy, createdAt。
  • Task (@Entity) (复用并扩展)
    • (增加标签字段,可能为@ElementCollection或关联表)
Database层
  • MySQL 数据库:物理存储介质。
    • 表 tag: 存储Tag实体数据。
    • 表 task: 存储Task实体数据(复用,可能包含tags字段或关联表)。
    • 操作:getTasksWithFilter服务会生成包含多个JOIN和WHERE条件的复杂SQL语句。

需求点1:任务协同

功能点1.1:共享任务与指派

客户端 (Android/iOS/Web - 以Android为例)

UI层
  • TaskDetailActivity (扩展):详情页的“共享”或“协作”按钮。
    • 操作:用户点击“共享”按钮,在弹出的面板中选择“通过链接分享”或“指定协作者”,并设置权限、有效期等信息。
  • TaskDetailActivity (扩展):“负责人”字段编辑区域。
    • 操作:用户点击“负责人”字段,从弹出的成员列表中选择一位协作者进行指派。
ViewModel层
  • TaskCollaborationViewModel
    • fun shareTask(taskId: String, shareConfig: ShareConfig)
      • 作用:执行共享任务的操作。根据shareConfig的shareType(LINK或SPECIFY_USER)调用不同逻辑。调用ShareTaskUseCase。
      • 参数:
        • shareConfig: ShareConfig:共享配置对象,包含类型(type)、权限(permission)、有效期(expiry)、指定的协作者列表(collaborators)等。
    • fun revokeShareLink(linkId: String)
      • 作用:撤销一个已生成的分享链接,使其立即失效。调用RevokeShareLinkUseCase。
    • fun assignTask(taskId: String, assigneeId: String)
      • 作用:将任务指派给指定用户。调用AssignTaskUseCase。
      • 参数:
        • assigneeId: String:被指派用户的ID。
    • fun loadAvailableAssignees(taskId: String)
      • 作用:加载当前任务可被指派的用户列表(通常为项目或团队成员)。调用GetAvailableAssigneesUseCase。
UseCase层
  • ShareTaskUseCase (suspend fun execute(taskId: String, config: ShareConfig): Result<ShareResult>)
    • 作用:封装共享任务的逻辑。分支逻辑:若为链接分享,生成分享信息;若为指定用户,则发送邀请。校验公开链接默认有效期、是否允许公开链接分享等全局配置。调用TaskCollaborationRepository.shareTask。
  • RevokeShareLinkUseCase (suspend fun execute(linkId: String): Result<Unit>)
    • 作用:撤销指定分享链接。调用TaskCollaborationRepository.revokeShareLink。
  • AssignTaskUseCase (suspend fun execute(taskId: String, assigneeId: String): Result<Unit>)
    • 作用:执行任务指派。校验当前用户是否有指派权限(创建者、项目管理员等)。调用TaskCollaborationRepository.assignTask。
  • GetAvailableAssigneesUseCase (suspend fun execute(taskId: String): Result<List<AssigneeCandidate>>)
    • 作用:获取可指派用户列表。逻辑:列表来源于任务所属项目或团队的成员,并排除当前用户自己。调用TaskCollaborationRepository.getAvailableAssignees。
Repository层 (接口)
  • TaskCollaborationRepository
    • suspend fun shareTask(taskId: String, config: ShareConfig): ShareResult
      • 作用:网络API调用,共享任务。
    • suspend fun revokeShareLink(linkId: String)
      • 作用:网络API调用,撤销分享链接。
    • suspend fun assignTask(taskId: String, assigneeId: String)
      • 作用:网络API调用,指派任务。
    • suspend fun getAvailableAssignees(taskId: String): List<AssigneeCandidate>
      • 作用:网络API调用,获取可指派成员列表。
数据源层 (实现)
  • TaskCollaborationRepositoryImpl (实现 TaskCollaborationRepository接口)
    • private val collabApi: TaskCollaborationApiService
    • suspend fun shareTask(taskId: String, config: ShareConfig): ShareResult
      • 实现:调用collabApi.shareTask(taskId, ShareTaskReq.fromConfig(config)),转换结果。
    • suspend fun revokeShareLink(linkId: String)
      • 实现:调用collabApi.revokeShareLink(linkId)。
    • suspend fun assignTask(taskId: String, assigneeId: String)
      • 实现:调用collabApi.assignTask(taskId, AssignTaskReq(assigneeId))。
    • suspend fun getAvailableAssignees(taskId: String): List<AssigneeCandidate>
      • 实现:调用collabApi.getAvailableAssignees(taskId),转换结果。

服务器 (SpringBoot)

Controller层
  • TaskCollaborationController
    • @PostMapping(“/v1/tasks/{taskId}/share”) fun shareTask(@PathVariable taskId: String, @RequestBody req: ShareTaskReq): Response<ShareResultVO>
      • 作用:处理共享任务的请求。调用TaskCollaborationService.shareTask。
    • @DeleteMapping(“/v1/share-links/{linkId}”) fun revokeShareLink(@PathVariable linkId: String): Response<Unit>
      • 作用:处理撤销分享链接的请求。调用TaskCollaborationService.revokeShareLink。
    • @PutMapping(“/v1/tasks/{taskId}/assignee”) fun assignTask(@PathVariable taskId: String, @RequestBody req: AssignTaskReq): Response<Unit>
      • 作用:处理指派任务的请求。调用TaskCollaborationService.assignTask。
    • @GetMapping(“/v1/tasks/{taskId}/assignable-users”) fun getAssignableUsers(@PathVariable taskId: String): Response<List<AssigneeCandidateVO>>
      • 作用:处理获取可指派用户列表的请求。调用TaskCollaborationService.getAssignableUsers。
Service层
  • TaskCollaborationService
    • fun shareTask(taskId: String, requesterId: Long, req: ShareTaskReq): ShareResult
      • 作用:核心共享逻辑。校验操作者权限。分支处理:
        • 链接分享:生成唯一的、不可猜测的分享链接(UUID),设置权限和有效期,保存至ShareLink表。返回链接信息。
        • 指定协作者:向被邀请者发送通知,在TaskCollaborator表中创建“待接受”状态的记录。调用ShareLinkRepository或TaskCollaboratorRepository。
    • fun revokeShareLink(linkId: String, requesterId: Long)
      • 作用:校验链接归属,将其状态标记为“已撤销”或直接删除,使其立即失效。调用ShareLinkRepository.updateStatus。
    • fun assignTask(taskId: String, requesterId: Long, req: AssignTaskReq)
      • 作用:指派逻辑。1. 校验操作者权限(任务创建者、项目管理员等)。2. 校验被指派者是否在任务可协作范围内(项目/团队成员)。3. 更新任务的assigneeId字段。4. 向被指派者发送任务指派通知。调用TaskRepository.updateAssignee, NotificationService.sendNotification。
    • fun getAssignableUsers(taskId: String, requesterId: Long): List<AssigneeCandidate>
      • 作用:确定可指派列表。根据任务ID找到其所属的项目或团队,查询其成员列表,并排除当前用户。调用ProjectRepository.findMembersByTaskId。
Repository层 (接口 - JPA)
  • ShareLinkRepository (extends JpaRepository<ShareLink, String>)
    • fun findByLinkId(linkId: String): ShareLink?
    • fun save(link: ShareLink): ShareLink
  • TaskCollaboratorRepository (extends JpaRepository<TaskCollaborator, Long>)
    • fun save(collaborator: TaskCollaborator): TaskCollaborator
  • TaskRepository (extends JpaRepository<Task, String>) (复用)
    • fun findById(taskId: String): Task? (复用,用于获取任务和更新负责人)
  • ProjectMemberRepository (extends JpaRepository<ProjectMember, Long>)
    • fun findByProjectId(projectId: String): List<ProjectMember>
      • 作用:查询项目的所有成员。
Entity层
  • ShareLink (@Entity)
    • 作用:任务分享链接实体。字段:linkId(主键), taskId, permission, expiryTime, status, createdBy, createdAt。
  • TaskCollaborator (@Entity)
    • 作用:任务协作者关系实体。字段:id, taskId, userId, permission, status(如PENDING, ACCEPTED), invitedBy。
  • ProjectMember (@Entity)
    • 作用:项目成员关系实体。字段:id, projectId, userId, role。
Database层
  • MySQL 数据库:物理存储介质。
    • 表 share_link: 存储ShareLink实体数据。
    • 表 task_collaborator: 存储TaskCollaborator实体数据。
    • 表 task: 存储Task实体数据(复用)。
    • 表 project_member: 存储ProjectMember实体数据。

需求点2:提醒与集成

功能点2.1:管理任务提醒

客户端 (Android/iOS/Web - 以Android为例)

UI层
  • CreateTaskActivity / TaskDetailActivity (扩展):任务表单中的“提醒”设置区域。
    • 操作:用户点击“添加提醒”,选择“绝对时间”或“相对时间”,设置具体时间点或基于截止时间的相对规则。
  • AppSettingsFragment:应用设置页面。
    • 操作:用户在“通知”设置中,统一配置默认提醒时间、允许的通知渠道等。
ViewModel层
  • TaskReminderViewModel (可整合入CreateTaskViewModel和TaskDetailViewModel)
    • fun addReminderToTask(taskId: String, reminderRule: ReminderRule)
      • 作用:为任务添加一个提醒规则。调用ManageTaskReminderUseCase。
      • 参数:
        • reminderRule: ReminderRule:提醒规则对象,包含type(ABSOLUTE/RELATIVE)、time(绝对时间点)、offset(相对截止时间的偏移量)等。
    • fun loadUserReminderSettings()
      • 作用:加载用户的全局提醒偏好设置。调用GetUserReminderSettingsUseCase。
    • fun updateUserReminderSettings(settings: ReminderSettings)
      • 作用:更新用户的全局提醒设置(如默认提前量)。调用UpdateUserReminderSettingsUseCase。
UseCase层
  • ManageTaskReminderUseCase (suspend fun execute(taskId: String, rule: ReminderRule): Result<Reminder>)
    • 作用:管理任务提醒。核心逻辑:对于RELATIVE类型,需结合任务的dueTime计算出具体的triggerTime。校验单个任务最大提醒数量。调用ReminderRepository.addReminder。
  • GetUserReminderSettingsUseCase (suspend fun execute(): Result<ReminderSettings>)
    • 作用:获取用户的全局提醒设置。调用UserSettingsRepository.getReminderSettings。
  • UpdateUserReminderSettingsUseCase (suspend fun execute(settings: ReminderSettings): Result<Unit>)
    • 作用:更新用户全局提醒设置。调用UserSettingsRepository.updateReminderSettings。
Repository层 (接口)
  • ReminderRepository
    • suspend fun addReminder(taskId: String, rule: ReminderRule): Reminder
      • 作用:网络API调用,为任务添加提醒。
    • suspend fun getRemindersForTask(taskId: String): List<Reminder>
      • 作用:网络API调用,获取任务的所有提醒。
    • suspend fun deleteReminder(reminderId: String)
      • 作用:网络API调用,删除指定提醒。
  • UserSettingsRepository
    • suspend fun getReminderSettings(): ReminderSettings
      • 作用:网络API调用,获取用户提醒设置。
    • suspend fun updateReminderSettings(settings: ReminderSettings)
      • 作用:网络API调用,更新用户提醒设置。
数据源层 (实现)
  • ReminderRepositoryImpl (实现 ReminderRepository接口)
    • private val reminderApi: ReminderApiService
    • suspend fun addReminder(taskId: String, rule: ReminderRule): Reminder
      • 实现:调用reminderApi.addReminder(taskId, AddReminderReq.fromRule(rule)),转换结果。
    • (其他方法实现类似)
  • UserSettingsRepositoryImpl (实现 UserSettingsRepository接口)
    • private val settingsApi: UserSettingsApiService
    • suspend fun getReminderSettings(): ReminderSettings
      • 实现:调用settingsApi.getReminderSettings(),转换结果。

服务器 (SpringBoot)

Controller层
  • ReminderController
    • @PostMapping(“/v1/tasks/{taskId}/reminders”) fun addReminder(@PathVariable taskId: String, @RequestBody req: AddReminderReq): Response<ReminderVO>
      • 作用:处理添加任务提醒的请求。调用ReminderService.addReminder。
    • @GetMapping(“/v1/tasks/{taskId}/reminders”) fun getReminders(@PathVariable taskId: String): Response<List<ReminderVO>>
      • 作用:处理获取任务提醒列表的请求。调用ReminderService.getRemindersForTask。
    • @DeleteMapping(“/v1/reminders/{reminderId}”) fun deleteReminder(@PathVariable reminderId: String): Response<Unit>
      • 作用:处理删除提醒的请求。调用ReminderService.deleteReminder。
  • UserSettingsController
    • @GetMapping(“/v1/user/settings/reminders”) fun getReminderSettings(): Response<ReminderSettingsVO>
      • 作用:处理获取用户提醒设置的请求。调用UserSettingsService.getReminderSettings。
    • @PutMapping(“/v1/user/settings/reminders”) fun updateReminderSettings(@RequestBody req: UpdateReminderSettingsReq): Response<Unit>
      • 作用:处理更新用户提醒设置的请求。调用UserSettingsService.updateReminderSettings。
Service层
  • ReminderService
    • fun addReminder(taskId: String, userId: Long, req: AddReminderReq): Reminder
      • 作用:提醒创建与时间计算。1. 校验任务归属及状态。2. 若为相对提醒(RELATIVE),基于任务的dueTime和偏移量(offset)计算出未来的绝对triggerTime。3. 校验单个任务最大提醒数量。4. 创建Reminder记录并保存。5. 调用SchedulingService.scheduleReminder 将提醒事件加入调度系统(如Quartz, ScheduledExecutorService)。调用ReminderRepository.save。
    • fun handleTaskDueTimeUpdate(taskId: String)
      • 作用:时间修改联动。当任务截止时间变更时被调用。查找该任务所有RELATIVE类型的提醒,基于新的dueTime重新计算triggerTime,并更新提醒记录和调度系统。调用ReminderRepository.findRelativeByTaskId和SchedulingService.rescheduleReminder。
    • fun handleTaskCompletion(taskId: String)
      • 作用:状态联动。当任务完成时被调用。查找该任务所有未触发的提醒,将其标记为取消,并从调度系统中移除。调用ReminderRepository.cancelByTaskId和SchedulingService.cancelReminders。
  • UserSettingsService
    • fun getReminderSettings(userId: Long): ReminderSettingsVO
    • fun updateReminderSettings(userId: Long, req: UpdateReminderSettingsReq)
      • 作用:更新用户提醒设置,如默认提醒时间、支持的通知渠道开关。
Repository层 (接口 - JPA)
  • ReminderRepository (extends JpaRepository<Reminder, String>)
    • fun findByTaskId(taskId: String): List<Reminder>
    • fun findByTaskIdAndType(taskId: String, type: ReminderType): List<Reminder>
    • fun save(reminder: Reminder): Reminder
    • fun deleteByTaskId(taskId: String)
  • UserSettingsRepository (extends JpaRepository<UserSettings, Long>)
    • fun findByUserId(userId: Long): UserSettings?
Entity层
  • Reminder (@Entity)
    • 作用:提醒实体。字段:id, taskId, type, triggerTime, offset(用于RELATIVE类型), status。
  • UserSettings (@Entity)
    • 作用:用户设置实体。字段:userId, defaultReminderOffset, notificationChannels。
Database层
  • MySQL 数据库:物理存储介质。
    • 表 reminder: 存储Reminder实体数据。
    • 表 user_settings: 存储UserSettings实体数据。

功能点2.2:集成日历视图

客户端 (Android/iOS/Web - 以Android为例)

UI层
  • CalendarActivity:日历视图主界面,支持月、周、日视图切换。
    • 操作:用户点击“日历”标签页进入,切换视图模式,点击日期或任务事件块查看详情,拖拽事件块以修改任务时间。
  • CalendarEventPopup:点击日历事件后弹出的浮层,显示任务概要。
    • 操作:用户点击浮层中的“查看详情”进入任务详情页。
ViewModel层
  • CalendarViewModel
    • fun loadCalendarEvents(viewType: CalendarViewType, focusDate: LocalDate)
      • 作用:根据当前日历视图类型和焦点日期,加载对应时间范围内的任务事件。调用LoadCalendarEventsUseCase。
      • 参数:
        • viewType: CalendarViewType:枚举,表示当前视图(MONTH, WEEK, DAY)。
        • focusDate: LocalDate:当前视图聚焦的日期,用于计算查询的起止范围。
    • fun updateTaskDueTimeViaDrag(taskId: String, newDueTime: Instant)
      • 作用:响应用户在日历视图上拖拽任务事件块的操作,更新任务的截止时间。调用UpdateTaskDueTimeUseCase。
      • 参数:
        • newDueTime: Instant:拖拽后事件块对应的新时间点。
UseCase层
  • LoadCalendarEventsUseCase (suspend fun execute(query: CalendarQuery): Result<List<CalendarEvent>>)
    • 作用:封装加载日历事件的逻辑。根据viewType和focusDate计算查询的起止时间(startTime, endTime),构建查询对象。调用CalendarRepository.getCalendarEvents。
  • UpdateTaskDueTimeUseCase (suspend fun execute(taskId: String, newDueTime: Instant): Result<Unit>)
    • 作用:通过拖拽更新任务截止时间。此用例内部会调用已有的EditTaskUseCase,但触发源和上下文(从日历视图拖拽)不同。注意:需确保此操作能触发时间修改联动,自动重新计算相对提醒。
Repository层 (接口)
  • CalendarRepository
    • suspend fun getCalendarEvents(query: CalendarQuery): List<CalendarEvent>
      • 作用:网络API调用,获取指定时间范围内的日历事件。
    • suspend fun updateTaskDueTime(taskId: String, newDueTime: Instant)
      • 作用:网络API调用,更新任务截止时间。(可复用TaskRepository.editTask,但为保持职责清晰可单独定义)。
数据源层 (实现)
  • CalendarRepositoryImpl (实现 CalendarRepository接口)
    • private val calendarApi: CalendarApiService
    • suspend fun getCalendarEvents(query: CalendarQuery): List<CalendarEvent>
      • 实现:调用calendarApi.getEvents(query.toReq()),将List<CalendarEventVO>转换为List<CalendarEvent>。
    • suspend fun updateTaskDueTime(taskId: String, newDueTime: Instant)
      • 实现:调用taskApi.editTask(taskId, EditTaskReq(dueTime = newDueTime))。(或直接调用CalendarApiService的特定端点)

服务器 (SpringBoot)

Controller层
  • CalendarController
    • @GetMapping(“/v1/calendar/events”) fun getEvents(@ModelAttribute query: CalendarQueryReq): Response<List<CalendarEventVO>>
      • 作用:处理获取日历事件的请求。调用CalendarService.getCalendarEvents。
    • @PutMapping(“/v1/calendar/tasks/{taskId}/due-time”) fun updateDueTimeViaCalendar(@PathVariable taskId: String, @RequestBody req: UpdateDueTimeReq): Response<Unit>
      • 作用:处理通过日历拖拽更新截止时间的请求。调用TaskService.updateDueTime(或复用editTask)。
Service层
  • CalendarService
    • fun getCalendarEvents(userId: Long, query: CalendarQueryReq): List<CalendarEventVO>
      • 作用:日历事件聚合与渲染策略。1. 查询用户所有未完成(status 为“未开始”、“进行中”)且设有dueTime的任务。2. 对于同时设置了startTime和dueTime的任务,在时间轴上绘制从开始到结束的时间块。3. 对于只有dueTime的任务,采用仅含截止时间的任务渲染策略配置。常见策略有:a) 视为“全天事件”显示在日期顶部;b) 以dueTime为锚点,向前延伸一个默认时长(如2小时)绘制时间块。4. 将任务转换为CalendarEventVO,并附上用于前端渲染的displayStartTime和displayEndTime。调用TaskRepository.findByUserIdAndDueTimeBetweenAndStatusIn。
  • TaskService (扩展)
    • fun updateDueTime(taskId: String, userId: Long, newDueTime: Instant)
      • 作用:更新任务截止时间。此方法内部应调用editTask的核心逻辑,确保触发提醒重新计算和客户端数据同步事件。
Repository层 (接口 - JPA)
  • TaskRepository (extends JpaRepository<Task, String>) (复用)
    • fun findByUserIdAndDueTimeBetweenAndStatusIn(userId: Long, start: Instant, end: Instant, statuses: List<TaskStatus>): List<Task>
      • 作用:根据用户ID、截止时间范围和状态列表查询任务,用于日历数据获取。
Entity层
  • Task (@Entity) (复用)
    • 作用:任务实体。字段:id, userId, title, dueTime, startTime(可选), status, priority等。
Database层
  • MySQL 数据库:物理存储介质。
    • 表 task: 存储Task实体数据(复用)。
    • 操作:getCalendarEvents服务会执行对task表基于dueTime和status的索引查询。