# 用户使用流程图 — 任务模板市场 > **端口说明**: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动 > > **分层说明**: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体 ```mermaid 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 %% ============ 角色 ============ ROLE_PARENT(("👤 家长")):::actor ROLE_TEACHER(("📋 规划师")):::actor ROLE_ADMIN(("🖥 管理员")):::actor ROLE_WX(("💳 微信支付")):::actor %% ================================================================ %% 阶段一:市场浏览 %% ================================================================ subgraph 阶段一[阶段一:市场浏览] P1["🏠 小程序:模板市场页"]:::page P1 -->|"查看公开模板"| A1["🔗 POST /api/market/packages"]:::api A1 -->|"筛选条件: category"| S1["⚙️ TaskTemplatePackageService.getPublicPackages()"]:::service S1 -->|"查询已审核+公开的模板"| D1["📦 task_template_packages 表"]:::data P1 -->|"查看模板详情"| P1a["🏠 模板详情页"]:::page P1a -->|"模板ID"| A2["🔗 POST /api/market/packages/{id}"]:::api A2 -->|"模板ID"| S2["⚙️ TaskTemplatePackageService.getPackageById()"]:::service S2 -->|"模板完整信息"| D1 P1a -->|"查看任务项"| A3["🔗 POST /api/market/packages/{id}/items"]:::api A3 -->|"模板ID"| S3["⚙️ TaskTemplatePackageService.getPackageItems()"]:::service S3 -->|"该模板下的所有任务项"| D2["📦 task_template_items 表"]:::data P1 -->|"通过分享码进入"| P1b["🏠 分享落地页"]:::page P1b -->|"分享码"| A4["🔗 POST /api/market/share/{code}"]:::api A4 -->|"分享码"| S4["⚙️ TaskTemplatePackageService.getPackageByShareCode()"]:::service S4 -->|"匹配的模板"| D1 end %% ================================================================ %% 阶段二:购买流程 %% ================================================================ subgraph 阶段二[阶段二:购买流程] D1 -->|"选定模板, 孩子ID, 指导师"| P2["🏠 小程序:确认订单页"]:::page P2 -->|"创建订单"| A5["🔗 POST /api/payment/create"]:::api A5 -->|"userId, familyId, packageId, payMethod, couponId"| S5["⚙️ PackagePaymentService.createOrder()"]:::service S5 -->|"写入订单, 状态=pending"| D3["📦 package_orders 表"]:::data D3 -->|"订单ID"| P2a["🏠 小程序:支付页"]:::page P2a -->|"获取微信支付参数"| A6["🔗 POST /api/payment/wechat params"]:::api A6 -->|"orderId, openid"| S6["⚙️ PackagePaymentService.createWechatPayOrder()"]:::service S6 -->|"JSAPI调起支付参数"| D_WX["📦 微信支付预支付单"]:::data D_WX -->|"用户确认支付"| P2b["⚙️ 微信支付弹窗"]:::page P2b -->|"支付结果通知"| A7["🔗 POST /api/payment/notify"]:::api A7 -->|"微信XML回调数据"| S7["⚙️ PackagePaymentService.handlePayNotify()"]:::service S7 -->|"更新订单状态=paid"| D3 D3 -->|"订单状态=paid"| P2c["🏠 小程序:应用模板页"]:::page P2c -->|"选择任务项, 确认孩子"| A8["🔗 POST /api/payment/apply"]:::api A8 -->|"orderId, childId, selectedItemIds"| S8["⚙️ TaskPlanService.applyPackage()"]:::service S8 -->|"复制模板项→计划项, 写入实例"| D5["📦 task_plan_instances + task_plan_items"]:::data end %% ================================================================ %% 阶段三:我的计划 %% ================================================================ subgraph 阶段三[阶段三:我的计划] D5 -->|"家庭ID"| P3["🏠 小程序:我的计划列表页"]:::page P3 -->|"查看所有计划"| A9["🔗 POST /api/market/plans"]:::api A9 -->|"userId(提取familyId)"| S9["⚙️ TaskPlanService.getFamilyPlans()"]:::service S9 -->|"该家庭的所有计划实例"| D5 P3 -->|"查看计划详情"| P3a["🏠 计划详情页"]:::page P3a -->|"计划ID"| A10["🔗 POST /api/market/plans/{id}"]:::api A10 -->|"计划ID"| S10["⚙️ TaskPlanService.getPlanById()"]:::service S10 -->|"计划实例详情"| D5 P3a -->|"查看计划任务项"| A11["🔗 POST /api/market/plans/{id}/items"]:::api A11 -->|"实例ID"| S11["⚙️ TaskPlanService.getPlanItems()"]:::service S11 -->|"该计划的每日任务项"| D6["📦 task_plan_items 表"]:::data P3 -->|"取消计划"| P3b["🏠 取消确认弹窗"]:::page P3b -->|"计划ID"| A12["🔗 POST /api/market/plans/{id}/cancel"]:::api A12 -->|"计划ID"| S12["⚙️ TaskPlanService.cancelPlan()"]:::service S12 -->|"状态→cancelled"| D5 end %% ================================================================ %% 阶段四:模板创建(规划师) %% ================================================================ subgraph 阶段四[阶段四:模板创建与发布] P4["📋 规划师端:创建模板页"]:::page P4 -->|"填写模板信息"| A13["🔗 POST /api/packages/create"]:::api A13 -->|"creatorId, 名称, 描述, 周期, 价格, 分类, 标签, 封面"| S13["⚙️ TaskTemplatePackageService.createPackage()"]:::service S13 -->|"写入模板, 状态=draft"| D1 D1 -->|"模板ID"| P4a["📋 规划师端:编辑模板页"]:::page P4a -->|"添加任务项"| A14["🔗 POST /api/packages/{id}/items"]:::api A14 -->|"packageId, 任务名称, 描述, 积分, 频率, 时长, 必选"| S14["⚙️ TaskTemplatePackageService.addItem()"]:::service S14 -->|"写入一条任务项"| D2 P4a -->|"更新模板信息"| A15["🔗 POST /api/packages/{id}/update"]:::api A15 -->|"模板ID, 更新字段"| S15["⚙️ TaskTemplatePackageService.updatePackage()"]:::service S15 -->|"更新模板记录"| D1 P4a -->|"提交审核"| A16["🔗 POST /api/packages/{id}/submit"]:::api A16 -->|"模板ID"| S16["⚙️ TaskTemplatePackageService.submitForReview()"]:::service S16 -->|"状态→pending"| D1 end %% ================================================================ %% 阶段五:审核管理(管理员) %% ================================================================ subgraph 阶段五[阶段五:审核与上架] D1 -->|"status=pending"| P5["🖥 管理后台:待审核列表"]:::page P5 -->|"查看待审核"| A17["🔗 POST /api/admin/packages/pending"]:::api A17 -->|"无参数"| S17["⚙️ TaskTemplatePackageService.getPendingPackages()"]:::service S17 -->|"所有pending状态的模板"| D1 P5 -->|"审核通过"| A18["🔗 POST /api/admin/packages/{id}/approve"]:::api A18 -->|"模板ID, reviewerId"| S18["⚙️ TaskTemplatePackageService.approvePackage()"]:::service S18 -->|"状态→approved, 记录审核人"| D1 P5 -->|"审核拒绝"| A19["🔗 POST /api/admin/packages/{id}/reject"]:::api A19 -->|"模板ID, reviewerId, reason"| S19["⚙️ TaskTemplatePackageService.rejectPackage()"]:::service S19 -->|"状态→rejected, 记录原因"| D1 D1 -->|"status=approved"| P5a["🖥 管理后台:发布操作"]:::page P5a -->|"上架/下架"| A20["🔗 POST /api/packages/{id}/publish"]:::api A20 -->|"模板ID, publish=true/false"| S20["⚙️ TaskTemplatePackageService.publishPackage()"]:::service S20 -->|"isPublic标记+状态变更"| D1 end %% ================================================================ %% 角色关联 %% ================================================================ ROLE_PARENT -.- P1 ROLE_PARENT -.- P2 ROLE_PARENT -.- P3 ROLE_TEACHER -.- P4 ROLE_ADMIN -.- P5 ROLE_ADMIN -.- P5a ROLE_WX -.- P2b ``` ## 端点明细 ### 市场浏览 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/market/packages` | 获取公开模板列表 | 📱小程序 | `{category(可选)}` | `List` | | `POST /api/market/packages/{id}` | 获取模板详情 | 📱小程序 | path: `id` | `TaskTemplatePackage` | | `POST /api/market/packages/{id}/items` | 获取模板任务项 | 📱小程序 | path: `id` | `List` | | `POST /api/market/share/{code}` | 通过分享码获取模板 | 📱小程序 | path: `code` | `TaskTemplatePackage` | ### 购买流程 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/payment/create` | 创建支付订单 | 📱小程序 | `{packageId, payMethod, couponId(可选)}` | `PackageOrder` | | `POST /api/payment/wechat params` | 获取微信支付参数 | ⚙️系统自动 | `{orderId, openid}` | `JSAPI调起支付参数` | | `POST /api/payment/notify` | 微信支付回调 | ⚙️系统自动 | XML回调数据 | XML响应(SUCCESS/FAIL) | | `POST /api/payment/orders/{orderId}` | 查询订单状态 | 📱小程序 | path: `orderId` | `PackageOrder` | | `POST /api/payment/apply` | 支付后应用模板 | 📱小程序 | `{orderId, childId, selectedItemIds}` | `TaskPlanInstance` | | `POST /api/payment/orders/{orderId}/cancel` | 取消订单 | 📱小程序 | path: `orderId` | `boolean` | ### 我的计划 | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/market/plans` | 获取我的计划列表 | 📱小程序 | —(从token提取userId) | `List` | | `POST /api/market/plans/{id}` | 获取计划详情 | 📱小程序 | path: `id` | `TaskPlanInstance` | | `POST /api/market/plans/{id}/items` | 获取计划任务项 | 📱小程序 | path: `id` | `List` | | `POST /api/market/plans/{id}/cancel` | 取消计划 | 📱小程序 | path: `id` | `boolean` | ### 模板创建(规划师) | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/packages/create` | 创建任务模板 | 📋规划师端 | `{name, description, cycleDays, category, price, coverImage, isPublic, tags}` | `模板ID` | | `POST /api/packages/{id}/update` | 更新任务模板 | 📋规划师端 | path: `id`, body: 同create的可选字段 | `boolean` | | `POST /api/packages/{id}` | 获取模板详情 | 📋规划师端 | path: `id` | `TaskTemplatePackage` | | `POST /api/packages/my` | 获取我的模板列表 | 📋规划师端 | —(从token提取creatorId) | `List` | | `POST /api/packages/{id}/submit` | 提交审核 | 📋规划师端 | path: `id` | `boolean` | | `POST /api/packages/{id}/publish` | 发布/下架 | 📋规划师端 | path: `id`, body: `{publish: true/false}` | `boolean` | | `POST /api/packages/{id}/items` | 添加任务项 | 📋规划师端 | path: `id`, body: `{taskName, description, points, frequency, duration, isRequired}` | `任务项ID` | | `POST /api/packages/items/{itemId}` | 更新任务项 | 📋规划师端 | path: `itemId`, body: 更新字段 | `boolean` | | `POST /api/packages/items/{itemId}/delete` | 删除任务项 | 📋规划师端 | path: `itemId` | `boolean` | | `POST /api/packages/{id}/item-list` | 获取模板任务项列表 | 📋规划师端 | path: `id` | `List` | ### 审核管理(管理员) | 端点 | 说明 | 端口 | 请求数据 | 响应数据 | |------|------|------|---------|---------| | `POST /api/admin/packages/pending` | 获取待审核模板列表 | 🖥管理后台 | — | `List` | | `POST /api/admin/packages/{id}/approve` | 审核通过 | 🖥管理后台 | path: `id` | `boolean` | | `POST /api/admin/packages/{id}/reject` | 审核拒绝 | 🖥管理后台 | path: `id`, query: `reason` | `boolean` | ## 数据实体关系 ```mermaid erDiagram TaskTemplatePackage ||--o{ TaskTemplateItem : "一个模板多个任务项" TaskTemplatePackage ||--o{ PackageOrder : "一个模板多个订单" TaskTemplatePackage ||--o{ TaskPlanInstance : "一个模板多次被应用" TaskPlanInstance ||--o{ TaskPlanItem : "一个实例多个计划项" TaskTemplateItem ||--o{ TaskPlanItem : "模板项被复制为计划项" TaskTemplatePackage { Long id PK Long creatorId FK "规划师ID" string name "任务模板名称" string description "详细介绍" int cycleDays "周期天数" string category "分类" string tags "标签JSON" int price "售价(分)" int platformFee "平台服务费(分)" int isPublic "是否公开到市场" string shareCode "分享码" string status "draft/pending/approved/rejected/offline" } TaskTemplateItem { Long id PK Long packageId FK string taskName "任务名称" string description "任务描述" int points "基础积分" string frequency "执行频率" int duration "预计时长(分钟)" int isRequired "是否必选" } PackageOrder { Long id PK string orderNo Long userId FK "购买者" Long familyId FK Long packageId FK int price "支付金额(分)" string status "pending/paid/cancelled/refunded" } TaskPlanInstance { Long id PK Long packageId FK Long familyId FK Long childId FK string name "实例名称" string status "active/completed/cancelled" int totalDays int completedDays } TaskPlanItem { Long id PK Long instanceId FK Long templateItemId FK string taskName string description int points string frequency } ``` ## 完整性分析 | # | 维度 | 评估 | 说明 | |---|------|------|------| | 1 | **流程完整性** | ✅ 完整 | 覆盖市场浏览→购买支付→应用计划→计划管理→模板创建→审核上架6个阶段,路径完整 | | 2 | **异常路径** | ⚠️ 部分覆盖 | 订单支付失败/取消、审核拒绝已覆盖;模板创建后编辑、草稿状态管理等在图中有体现;价格计算逻辑、优惠券使用等Service层内部处理未画入 | | 3 | **端点覆盖** | ✅ 完整 | 26个端点全部映射到流程图中,覆盖MarketController(9)、PackagePaymentController(6)、TaskTemplatePackageController(10)、AdminPackageController(3) | | 4 | **角色覆盖** | ✅ 完整 | 家长(市场浏览/购买/计划管理)、规划师(模板创建)、管理员(审核上架)三种角色全覆盖;微信支付作为外部系统调用 | | 5 | **数据实体** | ✅ 完整 | task_template_packages、task_template_items、package_orders、task_plan_instances、task_plan_items五张表均在图中映射 | | 6 | **一致性** | ✅ 与代码一致 | 所有端点路径与实际Controller中的`@PostMapping`匹配,Service方法名与源码一致 |