2026年1月1日 · 阅读 —
人工智能编程之方法调用结构样本(待办任务)
人工智能编程之方法调用结构样本(待办任务)
需求点0:任务管理
功能点0.1:创建与管理任务
客户端 (Android/iOS/Web - 以Android为例)
UI层
TaskListFragment:任务列表主界面,展示任务概要列表,支持滑动操作。- 操作:用户上下滑动浏览列表,点击“+”或“添加任务”按钮,点击任务项进入详情,在任务项左侧点击复选框。
CreateTaskActivity:创建新任务的全屏表单页面。- 操作:用户填写标题、描述、优先级、截止时间等信息,点击“保存”按钮。
TaskDetailActivity:任务详情页面,展示任务所有信息。- 操作:用户查看详情,点击“编辑”按钮,修改字段后点击“保存”。
ViewModel层
TaskListViewModelfun loadTasks(viewType: TaskViewType, filters: TaskFilters?)- 作用:根据视图类型(如“今天”、“所有”)和可选筛选条件加载任务列表。调用
LoadTasksUseCase。 - 参数:
viewType: TaskViewType:枚举,指定列表视图类型。filters: TaskFilters?:可选的筛选条件对象。
- 作用:根据视图类型(如“今天”、“所有”)和可选筛选条件加载任务列表。调用
fun completeTask(taskId: String)- 作用:将指定任务标记为完成。调用
CompleteTaskUseCase。 - 参数:
taskId: String:要完成的任务ID。
- 作用:将指定任务标记为完成。调用
CreateTaskViewModelfun createTask(draft: TaskDraft)- 作用:提交新任务草稿,执行创建逻辑。调用
CreateTaskUseCase。 - 参数:
draft: TaskDraft:任务草稿对象,包含标题(title)、描述(description)、优先级(priority)、截止时间(dueTime)等字段。
- 作用:提交新任务草稿,执行创建逻辑。调用
TaskDetailViewModelfun 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。
- 作用:完成任务。核心逻辑:1. 更新任务状态为“已完成”。2. 若任务是
Repository层 (接口)
TaskRepositorysuspend 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层
TaskServicefun 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。
- 作用:核心创建逻辑。1. 校验数据(标题非空、时间逻辑)。2. 创建
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。
- 作用:核心编辑与同步逻辑。1. 获取并校验任务。2. 更新字段。3. 关键点:若
fun completeTask(taskId: String, userId: Long)- 作用:完成任务的状态流转与衍生操作。1. 校验任务状态(需为“未开始”或“进行中”)。2. 更新任务状态为“已完成”,记录完成时间。3. 顺序控制:调用
RecurringTaskService.handleCompletion处理周期性任务生成下一个实例。4. 调用ReminderService.cancelAllRemindersForTask清理提醒。5. 若配置了自动归档,更新任务归档状态。调用TaskRepository.save。
- 作用:完成任务的状态流转与衍生操作。1. 校验任务状态(需为“未开始”或“进行中”)。2. 更新任务状态为“已完成”,记录完成时间。3. 顺序控制:调用
Repository层 (接口 - JPA)
TaskRepository(extends JpaRepository<Task, String>)fun findByIdAndUserId(taskId: String, userId: Long): Task?- 作用:根据任务ID和用户ID查找任务,用于权限校验。
fun findByUserIdAnd…(userId: Long, …): Page<Task>- 作用:根据用户ID和复杂查询条件(对应
TaskQueryReq)分页查询任务列表。
- 作用:根据用户ID和复杂查询条件(对应
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层 (接口)
TagRepositorysuspend 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: TagApiServicesuspend 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层
TagServicefun 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层
TaskCollaborationViewModelfun 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层 (接口)
TaskCollaborationRepositorysuspend 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: TaskCollaborationApiServicesuspend 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层
TaskCollaborationServicefun shareTask(taskId: String, requesterId: Long, req: ShareTaskReq): ShareResult- 作用:核心共享逻辑。校验操作者权限。分支处理:
- 链接分享:生成唯一的、不可猜测的分享链接(UUID),设置权限和有效期,保存至
ShareLink表。返回链接信息。 - 指定协作者:向被邀请者发送通知,在
TaskCollaborator表中创建“待接受”状态的记录。调用ShareLinkRepository或TaskCollaboratorRepository。
- 链接分享:生成唯一的、不可猜测的分享链接(UUID),设置权限和有效期,保存至
- 作用:核心共享逻辑。校验操作者权限。分支处理:
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。
- 作用:指派逻辑。1. 校验操作者权限(任务创建者、项目管理员等)。2. 校验被指派者是否在任务可协作范围内(项目/团队成员)。3. 更新任务的
fun getAssignableUsers(taskId: String, requesterId: Long): List<AssigneeCandidate>- 作用:确定可指派列表。根据任务ID找到其所属的项目或团队,查询其成员列表,并排除当前用户。调用
ProjectRepository.findMembersByTaskId。
- 作用:确定可指派列表。根据任务ID找到其所属的项目或团队,查询其成员列表,并排除当前用户。调用
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层 (接口)
ReminderRepositorysuspend fun addReminder(taskId: String, rule: ReminderRule): Reminder- 作用:网络API调用,为任务添加提醒。
suspend fun getRemindersForTask(taskId: String): List<Reminder>- 作用:网络API调用,获取任务的所有提醒。
suspend fun deleteReminder(reminderId: String)- 作用:网络API调用,删除指定提醒。
UserSettingsRepositorysuspend fun getReminderSettings(): ReminderSettings- 作用:网络API调用,获取用户提醒设置。
suspend fun updateReminderSettings(settings: ReminderSettings)- 作用:网络API调用,更新用户提醒设置。
数据源层 (实现)
ReminderRepositoryImpl(实现ReminderRepository接口)private val reminderApi: ReminderApiServicesuspend fun addReminder(taskId: String, rule: ReminderRule): Reminder- 实现:调用
reminderApi.addReminder(taskId, AddReminderReq.fromRule(rule)),转换结果。
- 实现:调用
- (其他方法实现类似)
UserSettingsRepositoryImpl(实现UserSettingsRepository接口)private val settingsApi: UserSettingsApiServicesuspend 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层
ReminderServicefun addReminder(taskId: String, userId: Long, req: AddReminderReq): Reminder- 作用:提醒创建与时间计算。1. 校验任务归属及状态。2. 若为相对提醒(
RELATIVE),基于任务的dueTime和偏移量(offset)计算出未来的绝对triggerTime。3. 校验单个任务最大提醒数量。4. 创建Reminder记录并保存。5. 调用SchedulingService.scheduleReminder将提醒事件加入调度系统(如Quartz, ScheduledExecutorService)。调用ReminderRepository.save。
- 作用:提醒创建与时间计算。1. 校验任务归属及状态。2. 若为相对提醒(
fun handleTaskDueTimeUpdate(taskId: String)- 作用:时间修改联动。当任务截止时间变更时被调用。查找该任务所有
RELATIVE类型的提醒,基于新的dueTime重新计算triggerTime,并更新提醒记录和调度系统。调用ReminderRepository.findRelativeByTaskId和SchedulingService.rescheduleReminder。
- 作用:时间修改联动。当任务截止时间变更时被调用。查找该任务所有
fun handleTaskCompletion(taskId: String)- 作用:状态联动。当任务完成时被调用。查找该任务所有未触发的提醒,将其标记为取消,并从调度系统中移除。调用
ReminderRepository.cancelByTaskId和SchedulingService.cancelReminders。
- 作用:状态联动。当任务完成时被调用。查找该任务所有未触发的提醒,将其标记为取消,并从调度系统中移除。调用
UserSettingsServicefun getReminderSettings(userId: Long): ReminderSettingsVOfun 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): Reminderfun 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层
CalendarViewModelfun 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层 (接口)
CalendarRepositorysuspend fun getCalendarEvents(query: CalendarQuery): List<CalendarEvent>- 作用:网络API调用,获取指定时间范围内的日历事件。
suspend fun updateTaskDueTime(taskId: String, newDueTime: Instant)- 作用:网络API调用,更新任务截止时间。(可复用
TaskRepository.editTask,但为保持职责清晰可单独定义)。
- 作用:网络API调用,更新任务截止时间。(可复用
数据源层 (实现)
CalendarRepositoryImpl(实现CalendarRepository接口)private val calendarApi: CalendarApiServicesuspend 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层
CalendarServicefun 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。
- 作用:日历事件聚合与渲染策略。1. 查询用户所有未完成(
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的索引查询。
- 表