task-management-flow.md 18 KB

用户使用流程图 — 任务管理

端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动

分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体

flowchart TD
    %% ============ 颜色定义 ============
    classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px
    classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
    classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px
    classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2
    classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3

    %% ============ 角色 ============
    A0(("👤 家长/规划师")):::actor
    B0(("👶 孩子")):::actor

    %% ================================================================
    %% 阶段一:任务创建
    %% ================================================================
    subgraph 阶段一[阶段一:任务创建]
        P1["🏠 家长/规划师端:创建任务页"]:::page
        P1 -->|"选择创建方式"| P1_choice{"手动创建 / 模板 / AI推荐 / 训练方案"}:::page

        P1_choice -->|"手动创建"| P1a["🏠 填写任务表单"]:::page
        P1a -->|"标题, 描述, 执行人, 积分, 截止时间, 需审核, 分类"| A1["🔗 POST /api/tasks/create"]:::api
        A1 -->|"创建任务DTO"| S1["⚙️ TaskService.createTask()"]:::service
        S1 -->|"写入一条任务记录"| D1["📦 tasks 表"]:::data

        P1_choice -->|"从模板"| P1b["🏠 选择任务模板"]:::page
        P1b -->|"模板ID"| S1

        P1_choice -->|"AI推荐"| P1c["🏠 AI任务建议页"]:::page

        P1_choice -->|"训练方案下发"| P1d["📋 规划师端:选择训练方案"]:::page
        P1d -->|"方案ID, 孩子ID"| A1

        P1a -->|"获取可选小游戏"| A1a["🔗 POST /api/tasks/minigame-options"]:::api
        A1a -->|""| S1a["⚙️ MiniGameService.getEnabledGames()"]:::service
        S1a -->|"已启用小游戏列表"| D2["📦 mini_games 表"]:::data
    end

    %% ================================================================
    %% 阶段二:任务执行
    %% ================================================================
    subgraph 阶段二[阶段二:任务执行]
        D1 -->|"孩子ID"| P2["🏠 孩子端:今日任务页"]:::page
        P2 -->|"获取今日任务"| A2["🔗 POST /api/tasks/today"]:::api
        A2 -->|"childId, category(可选)"| S2["⚙️ TaskService.getTodayTasks()"]:::service
        S2 -->|"今日任务列表"| D1

        P2 -->|"选择任务"| P2_choice{"普通任务 / 小游戏 / 家长任务"}:::page

        P2_choice -->|"普通任务"| P2a["🏠 执行并提交"]:::page
        P2a -->|"任务ID, childId, 照片"| A3["🔗 POST /api/tasks/{id}/complete"]:::api
        A3 -->|"任务ID, childId, photoUrl"| S3["⚙️ TaskService.completeTask()"]:::service
        S3 -->|"更新任务状态=completed, 发放积分"| D1

        P2_choice -->|"小游戏"| P2b["🏠 玩小游戏并提交成绩"]:::page
        P2b -->|"任务ID, childId, 完成时间, 得分"| A4["🔗 POST /api/tasks/{id}/complete-minigame"]:::api
        A4 -->|"任务ID, childId, completionTime, score"| S4["⚙️ TaskService.completeMinigameTask()"]:::service
        S4 -->|"更新任务状态, 记录游戏成绩"| D1

        P2_choice -->|"家长任务"| P2c["📱 家长端:完成任务"]:::page
        P2c -->|"任务ID"| A5["🔗 POST /api/tasks/{id}/complete-parent"]:::api
        A5 -->|"任务ID, 用户ID"| S5["⚙️ TaskService.completeParentTask()"]:::service
        S5 -->|"更新任务状态"| D1

        P2a -->|"完成后判断"| CHECK{"需要审核?"}:::page
        CHECK -->|"是"| P2d["🏠 进入待审核列表"]:::page
        CHECK -->|"否"| P2e["🏠 任务完成(直接通过)"]:::page

        P2 -->|"获取家长今日任务"| A6["🔗 POST /api/tasks/today-parent"]:::api
        A6 -->|"用户ID"| S6["⚙️ TaskService.getTodayParentTasks()"]:::service
        S6 -->|"家长任务列表"| D1
    end

    %% ================================================================
    %% 阶段三:任务审核
    %% ================================================================
    subgraph 阶段三[阶段三:任务审核]
        D1 -->|"家长ID/需审核标记"| P3["🏠 家长/规划师端:待审核页"]:::page
        P3 -->|"获取待审核列表"| A7["🔗 POST /api/tasks/pending-review"]:::api
        A7 -->|"用户ID"| S7["⚙️ TaskService.getPendingReviewTasks()"]:::service
        S7 -->|"待审核任务列表"| D1

        P3 -->|"审核单个任务"| A8["🔗 POST /api/tasks/{id}/review"]:::api
        A8 -->|"任务ID, {approved, comment, points}"| S8["⚙️ TaskService.reviewTask()"]:::service
        S8 -->|"通过: 发放能量/积分; 驳回: 退回待修改"| D1

        P3 -->|"删除任务"| A9["🔗 POST /api/tasks/{id}"]:::api
        A9 -->|"任务ID, 用户ID"| S9["⚙️ TaskService.deleteTask()"]:::service
        S9 -->|"更新任务状态=已删除"| D1
    end

    %% ================================================================
    %% 阶段四:规划师批量管理
    %% ================================================================
    subgraph 阶段四[阶段四:规划师批量管理]
        D1 -->|"关联家庭"| P4["📋 规划师端:任务管理首页"]:::page
        P4 -->|"获取关联家庭"| A10["🔗 POST /api/guide/families/bound-families"]:::api
        A10 -->|"规划师ID, role"| S10["⚙️ GuideFamilyTaskController.getBoundFamilies()"]:::service
        S10 -->|"家庭列表(含待审核数)"| D3["📦 users(teacher_family_ids)"]:::data

        P4 -->|"家庭概览"| A11["🔗 POST /api/guide/families/{familyId}/overview"]:::api
        A11 -->|"规划师ID, familyId"| S11["⚙️ GuideFamilyTaskController.getFamilyTaskOverview()"]:::service
        S11 -->|"孩子任务概览(今日/待审核/总计)"| D1

        P4 -->|"孩子任务列表"| A12["🔗 POST /api/guide/families/{familyId}/children/{childId}/tasks"]:::api
        A12 -->|"familyId, childId, 分页, status"| S12["⚙️ TaskService.getTaskHistoryByFamilyMember()"]:::service
        S12 -->|"分页任务列表"| D1

        P4 -->|"待审核列表(孩子)"| A13["🔗 POST /api/guide/families/{familyId}/children/{childId}/pending-review"]:::api
        A13 -->|"familyId, childId"| S13["⚙️ TaskService.getPendingReviewTasksForFamilyMember()"]:::service
        S13 -->|"待审核任务列表"| D1

        P4 -->|"审核任务"| A14["🔗 POST /api/guide/families/{familyId}/tasks/{taskId}/review"]:::api
        A14 -->|"familyId, taskId, approved, comment"| S14["⚙️ TaskService.reviewTask()"]:::service
        S14 -->|"通过/驳回"| D1

        P4 -->|"批量审核"| A15["🔗 POST /api/guide/families/{familyId}/tasks/batch-review"]:::api
        A15 -->|"familyId, taskIds[], approved"| S15["⚙️ GuideFamilyTaskController.batchReviewTasks()"]:::service
        S15 -->|"逐条调用reviewTask"| D1

        P4 -->|"修改任务"| A16["🔗 POST /api/guide/families/{familyId}/tasks/{taskId}"]:::api
        A16 -->|"familyId, taskId, 标题/描述/积分/截止/状态"| S16["⚙️ GuideFamilyTaskController.updateTask()"]:::service
        S16 -->|"更新任务字段"| D1

        P4 -->|"删除任务"| A17["🔗 POST /api/guide/families/{familyId}/tasks/{taskId}/delete"]:::api
        A17 -->|"familyId, taskId"| S17["⚙️ GuideFamilyTaskController.deleteTask()"]:::service
        S17 -->|"任务状态=已取消"| D1

        P4 -->|"规划师首页统计"| A18["🔗 POST /api/guide/families/dashboard-stats"]:::api
        A18 -->|"规划师ID, role"| S18["⚙️ GuideFamilyTaskController.getDashboardStats()"]:::service
        S18 -->|"家庭数, 今日完成数, 待审核数"| D1
    end

    %% ================================================================
    %% 阶段五:任务历史与提醒
    %% ================================================================
    subgraph 阶段五[阶段五:任务历史与提醒]
        D1 -->|"孩子ID"| P5["🏠 孩子/家长端:历史与提醒页"]:::page
        P5 -->|"任务历史"| A19["🔗 POST /api/tasks/history"]:::api
        A19 -->|"childId, 分页, category"| S19["⚙️ TaskService.getTaskHistory()"]:::service
        S19 -->|"分页历史任务"| D1

        P5 -->|"批量完成"| A20["🔗 POST /api/tasks/batch-complete"]:::api
        A20 -->|"用户ID, taskIds[]"| S20["⚙️ TaskService.batchComplete()"]:::service
        S20 -->|"逐条完成任务"| D1

        P5 -->|"批量删除"| A21["🔗 POST /api/tasks/batch-delete"]:::api
        A21 -->|"用户ID, taskIds[]"| S21["⚙️ TaskService.batchDelete()"]:::service
        S21 -->|"逐条删除任务"| D1

        P5 -->|"即将到期"| A22["🔗 POST /api/task-reminders/upcoming/{childId}"]:::api
        A22 -->|"childId, minutes"| S22["⚙️ TaskReminderService.getUpcomingTasks()"]:::service
        S22 -->|"指定时间内到期的任务"| D1

        P5 -->|"逾期任务"| A23["🔗 POST /api/task-reminders/overdue/{childId}"]:::api
        A23 -->|"childId"| S23["⚙️ TaskReminderService.getOverdueTasks()"]:::service
        S23 -->|"已超时未完成的任务"| D1

        P5 -->|"需要提醒"| A24["🔗 POST /api/task-reminders/reminder/{childId}"]:::api
        A24 -->|"childId"| S24["⚙️ TaskReminderService.getTasksNeedReminder()"]:::service
        S24 -->|"30分钟内到期未完成的任务"| D1

        P5 -->|"历史筛选"| A25["🔗 POST /api/task-reminders/history/filter/{childId}"]:::api
        A25 -->|"childId, status, startDate, endDate, 分页"| S25["⚙️ TaskReminderService.getTaskHistoryWithFilter()"]:::service
        S25 -->|"按条件筛选的历史任务"| D1
    end

    %% ================================================================
    %% 阶段六:统计分析
    %% ================================================================
    subgraph 阶段六[阶段六:统计分析]
        D1 -->|"孩子ID"| P6["🏠 家长/规划师端:统计页"]:::page
        P6 -->|"任务统计概览"| A26["🔗 POST /api/task-reminders/statistics/{childId}"]:::api
        A26 -->|"childId, startDate, endDate"| S26["⚙️ TaskReminderService.getTaskStatistics()"]:::service
        S26 -->|"完成率, 逾期率, 积分统计"| D1

        P6 -->|"分类统计"| A27["🔗 POST /api/task-reminders/statistics/category/{childId}"]:::api
        A27 -->|"childId"| S27["⚙️ TaskReminderService.getTaskStatsByCategory()"]:::service
        S27 -->|"按维度的任务统计"| D1

        P6 -->|"日期统计"| A28["🔗 POST /api/task-reminders/statistics/date/{childId}"]:::api
        A28 -->|"childId, days"| S28["⚙️ TaskReminderService.getTaskStatsByDate()"]:::service
        S28 -->|"近N天每日完成数"| D1

        P6 -->|"家庭统计"| A29["🔗 POST /api/task-reminders/statistics/family/{familyId}"]:::api
        A29 -->|"familyId"| S29["⚙️ TaskReminderService.getFamilyTaskStatistics()"]:::service
        S29 -->|"整个家庭的任务统计"| D1
    end

    %% ================================================================
    %% 定时任务
    %% ================================================================
    subgraph 定时[⏰ 定时任务]
        S_T1["⚙️ RepeatTaskGenerator.generateDailyTasks()"]:::service
        S_T1 -->|"每天凌晨5点, 扫描repeat_type=daily/weekly的任务模板"| D1
        S_T1 -->|"从模板创建今日任务实例"| D1
    end

    %% ================================================================
    %% 角色关联
    %% ================================================================
    A0 -.- P1
    A0 -.- P3
    A0 -.- P4
    A0 -.- P5
    A0 -.- P6
    B0 -.- P2

端点明细

任务创建

端点 说明 端口 请求数据 响应数据
POST /api/tasks/create 创建任务 📱小程序 {childId, title, description, points, deadline, needReview, category, executorType, ...} taskId
POST /api/tasks/minigame-options 获取可选小游戏列表 📱小程序 List<MiniGame>
POST /api/tasks/{id} 删除任务 📱小程序 path: id, body: — boolean

任务执行

端点 说明 端口 请求数据 响应数据
POST /api/tasks/today 获取今日任务 📱小程序 {childId, category} List<Task>
POST /api/tasks/today-parent 获取家长今日任务 📱小程序 List<Task>
POST /api/tasks/{id}/complete 完成任务 📱小程序 path: id, body: {childId, photoUrl} {points, energy, ...}
POST /api/tasks/{id}/complete-parent 家长完成任务 📱小程序 path: id {points, ...}
POST /api/tasks/{id}/complete-minigame 完成小游戏任务 📱小程序 path: id, body: {childId, completionTime, score} {points, energy, score, ...}

任务审核

端点 说明 端口 请求数据 响应数据
POST /api/tasks/pending-review 获取待审核任务列表 📱小程序 — (从token取userId) List<Task>
POST /api/tasks/{id}/review 审核任务 📱小程序 path: id, body: {approved, comment, points} boolean

任务历史与批量操作

端点 说明 端口 请求数据 响应数据
POST /api/tasks/history 获取任务历史 📱小程序 {childId, page, size, category} Page<Task>
POST /api/tasks/batch-complete 批量完成任务 📱小程序 {taskIds[]} boolean
POST /api/tasks/batch-delete 批量删除任务 📱小程序 {taskIds[]} boolean

任务提醒与筛选

端点 说明 端口 请求数据 响应数据
POST /api/task-reminders/reminder/{childId} 获取需提醒任务(30分钟到期) 📱小程序 path: childId List<Task>
POST /api/task-reminders/upcoming/{childId} 即将到期任务 📱小程序 path: childId, body: {minutes} List<Task>
POST /api/task-reminders/overdue/{childId} 逾期任务 📱小程序 path: childId List<Task>
POST /api/task-reminders/history/filter/{childId} 带筛选的历史任务 📱小程序 path: childId, body: {status, startDate, endDate, page, size} {tasks, total, ...}

统计分析

端点 说明 端口 请求数据 响应数据
POST /api/task-reminders/statistics/{childId} 任务统计概览 📱小程序 path: childId, body: {startDate, endDate} {total, completed, overdue, completionRate, ...}
POST /api/task-reminders/statistics/category/{childId} 按分类统计 📱小程序 path: childId List<{category, count, completed, ...}>
POST /api/task-reminders/statistics/date/{childId} 按日期统计 📱小程序 path: childId, body: {days} List<{date, count, ...}>
POST /api/task-reminders/statistics/family/{familyId} 家庭任务统计 📱小程序 path: familyId {totalTasks, completedTasks, ...}

规划师批量管理

端点 说明 端口 请求数据 响应数据
POST /api/guide/families/bound-families 获取关联家庭列表 📋规划师端 — (从token取userId+role) List<{familyId, familyName, childrenCount, pendingReviewCount}>
POST /api/guide/families/{familyId}/overview 家庭任务概览 📋规划师端 path: familyId {children[], totalPendingReview, totalCompleted, totalOverdue}
POST /api/guide/families/{familyId}/children/{childId}/tasks 孩子任务列表(分页) 📋规划师端 path: familyId, childId, body: {page, size, status} Page<Task>
POST /api/guide/families/{familyId}/children/{childId}/pending-review 待审核任务列表 📋规划师端 path: familyId, childId List<Task>
POST /api/guide/families/{familyId}/tasks/{taskId}/review 审核任务 📋规划师端 path: familyId, taskId, body: {approved, comment} boolean
POST /api/guide/families/{familyId}/tasks/batch-review 批量审核 📋规划师端 path: familyId, body: {taskIds[], approved} {successCount, failCount}
POST /api/guide/families/{familyId}/tasks/{taskId} 修改任务 📋规划师端 path: familyId, taskId, body: {title, description, points, deadline, status} boolean
POST /api/guide/families/{familyId}/tasks/{taskId}/delete 删除任务 📋规划师端 path: familyId, taskId boolean
POST /api/guide/families/dashboard-stats 规划师首页统计 📋规划师端 {totalFamilies, todayCompletedTasks, pendingReviewTasks}

完整性分析

# 维度 评估 说明
1 流程完整性 ✅ 完整 覆盖任务创建(手动/模板/AI/训练方案)、执行(普通/小游戏/家长任务)、审核、规划师批量管理、历史与提醒、统计分析6个阶段,路径完整
2 异常路径 ⚠️ 部分覆盖 审核驳回退回待修改、逾期任务、小游戏成绩异常等已在图中体现;定时任务中模板不存在等错误由Service层处理
3 端点覆盖 ✅ 完整 29个端点全部映射到流程图中,与代码实际暴露的TaskController、TaskReminderController、GuideFamilyTaskController一致
4 角色覆盖 ✅ 完整 家长(parent)创建/审核任务、孩子(child)执行任务、规划师(teacher)批量管理/审核均已覆盖;定时任务(⚙️系统自动)生成重复任务包含在图中
5 数据实体 ✅ 完整 tasks表、mini_games表、users表(teacher_family_ids)均在图中映射
6 一致性 ✅ 与代码一致 所有端点路径与实际Controller(TaskController、TaskReminderController、GuideFamilyTaskController)中的@PostMapping匹配