# 优先级调整实施计划:SFMS 数据迁移 + 家长任务管理 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 优先完成 SFMS 历史数据迁移,再完善家长端任务管理功能 **Architecture:** - 第一优先组:后端 DataMigrationService(9步迁移流程)→ 修复 SfmsDataSourceConfig 配置格式不匹配 → 验证迁移端点正常工作 - 第二优先组:后端 TaskController + 前端 create-task.vue/review.vue/tasks.vue → 补全 TASK-006~016 中缺失的功能 **Tech Stack:** Spring Boot 2.7.18 + MyBatis-Plus + uni-app Vue 2 + MySQL 8.0 --- ## 文件结构 ### 优先组1: SFMS 数据迁移 | 文件 | 角色 | 状态 | |------|------|------| | `SfmsDataSourceConfig.java` | 多数据源配置 | 需修复:`sfms.datasource.hikari.*` 前缀与实际 yml 配置不匹配 | | `application.yml` | sfms 连接配置 | ✅ 已有 `sfms.datasource.*` 配置(阿里云RDS) | | `DataMigrationService.java` | 9步迁移引擎 | ✅ 已实现,需端到端验证 | | `DataMigrationController.java` | POST `/api/migration/run` | ✅ 已实现 | | `MigrationController.java` | 结构迁移端点 | ✅ 已实现 | ### 优先组2: 家长任务管理 | 文件 | 角色 | 状态 | |------|------|------| | `TaskController.java` | 任务 CRUD API | ✅ 基本功能就绪 | | `TaskService.java` | 任务业务逻辑 | ⚠️ 部分功能待完善 | | `api.js` | 前端 API 封装 | ✅ 基本功能就绪 | | `create-task.vue` | 创建任务页 | ⚠️ 基本功能就绪 | | `review.vue` | 审核任务页 | ⚠️ 基本功能就绪 | | `tasks.vue` | 任务列表页 | ⚠️ 基本功能就绪 | | `parent-index.vue` | 家长首页(含任务入口) | ✅ 已完善 | --- ## 优先组1:SFMS 数据迁移 ### Task 1.1: 修复 SfmsDataSourceConfig 配置前缀不匹配 **问题**: `SfmsDataSourceConfig.java` 使用 `sfms.datasource.hikari.*` 配置前缀,但 `application.yml` 中 sfms 配置没有 hikari 层级。 `SfmsDataSourceConfig.java:25` 当前: ```java @ConfigurationProperties(prefix = "sfms.datasource.hikari") public DataSource sfmsDataSource() { ... } ``` `application.yml` 中实际配置: ```yaml sfms: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://bianwoyou.mysql.rds.aliyuncs.com:3305/sfms?... username: sfms password: sfms@123 ``` **修复**: 去掉 `.hikari` 前缀,或添加 hikari 层级。推荐改成不带 HikariConfig 的简易配置,因为 sfms 不需要连接池调优。 - [ ] **Step 1: 修改 SfmsDataSourceConfig 去掉 hikari 前缀** 修改 `SfmsDataSourceConfig.java`: - 将 `@ConfigurationProperties(prefix = "sfms.datasource.hikari")` 改为 `@ConfigurationProperties(prefix = "sfms.datasource")` - 去掉 `HikariConfig` 导入,改用 `DataSourceBuilder.create().build()` 即可 修改后代码: ```java @Bean(name = "sfmsDataSource") @ConfigurationProperties(prefix = "sfms.datasource") public DataSource sfmsDataSource() { return DataSourceBuilder.create().build(); } ``` 同时需要添加 `import org.springframework.boot.jdbc.DataSourceBuilder;`(已有)。 - [ ] **Step 2: 编译验证** ```bash cd cfc-backend && mvn clean compile ``` 预期: BUILD SUCCESS - [ ] **Step 3: 启动后端验证 sfms 数据源初始化成功** ```bash mvn spring-boot:run ``` 预期: 控制台无 DataSource 相关报错,Spring 启动成功。 注意:sfms 的阿里云RDS地址 `bianwoyou.mysql.rds.aliyuncs.com:3305` 可能需要网络可达。如无法连接,迁移端点会返回错误但不应影响主应用启动。 - [ ] **Step 4: 提交** ```bash git add cfc-backend/src/main/java/com/etotem/cfc/config/SfmsDataSourceConfig.java git commit -m "fix: 修复SfmsDataSourceConfig配置前缀不匹配,去掉hikari层级" ``` ### Task 1.2: 端到端验证数据迁移 - [ ] **Step 1: 查看 DataMigrationService 迁移逻辑完整性** 阅读 DataMigrationService.java 的9步迁移流程,确认: - 每步的 sfms SQL 查询使用了正确的表名 - ID 映射缓存逻辑正确(`sfmsPhoneToFamilyId`, `sfmsClientIdToChildUserId` 等) - 错误处理不会中断全流程 - [ ] **Step 2: 启动后端后调用迁移端点** ```bash curl -X POST http://localhost:8080/api/migration/run ``` 预期返回: ```json { "code": 200, "data": { "success": true/false, "migratedFamilies": N, "migratedParents": N, "migratedChildren": N, "migratedTeachers": N, "migratedOrders": N, "migratedResults": N, "migratedRecords": N, "migratedPlans": N, "errors": [] } } ``` - [ ] **Step 3: 检查迁移结果** - 查询 `families` 表是否有新数据 - 查询 `users` 表是否有角色为 parent/child/teacher 的新记录 - 查询 `children` 表是否有对应记录 - 查询 `package_orders` 表是否有订单记录 - 查询 `dan_assessment_results` 表是否有测评结果 - [ ] **Step 4: 提交** ```bash git add -A && git commit -m "feat: 完成SFMS数据迁移端到端验证" ``` ### Task 1.3: 迁移错误处理和重试机制 - [ ] **Step 1: 检查 DataMigrationService 的幂等性** 确认多次调用 `/api/migration/run` 不会产生重复数据: - `migrateFamilies()`: 用 `sfmsPhoneToFamilyId` 缓存去重 - `migrateParentUsers()`: 用 `phone|openid` 的 Set 去重 - `migrateChildUsersAndChildren()`: 用 `sfmsClientIdToChildUserId` 缓存去重 如果幂等性不足(例如二次迁移会重复创建家庭),添加基于手机号的查重: ```java // 在 migrateFamilies 方法开头添加 if (familyMapper.selectCount(new LambdaQueryWrapper() .eq(Family::getName, familyName)) > 0) continue; ``` - [ ] **Step 2: 添加迁移进度日志** 在每个迁移步骤的关键节点添加日志输出,便于排查问题。 - [ ] **Step 3: 提交** ```bash git add -A && git commit -m "feat: 增强SFMS迁移幂等性和日志" ``` --- ## 优先组2:家长任务管理 ### Task 2.1: 评估当前任务功能完整性 - [ ] **Step 1: 对照 task-requirements.md 清单检查实现状态** 从 `docs/task-requirements.md` 的需求清单逐一检查: | ID | 功能 | 检查点 | |----|------|--------| | TASK-001~005 | 基础创建 | create-task.vue + TaskController 确认 | | TASK-006 | 任务模板 | TaskTemplateController / task-templates 页面 | | TASK-007 | 审核方式 | TaskService.reviewTask / review.vue | | TASK-008~009 | 孩子任务 | child-index / TaskController | | TASK-010 | 完成方式 | TaskController.completeTask 参数检查 | | TASK-011 | 任务时长 | Task entity duration 字段检查 | | TASK-012A~F | 打卡方式 | api.js 媒体上传端点检查 | | TASK-013 | 通知 | TaskReminderController 检查 | | TASK-014 | 历史记录 | TaskController 查询参数检查 | | TASK-015 | 统计报表 | TaskController stats 端点检查 | | TASK-016 | 批量操作 | ❌ 待实现 | - [ ] **Step 2: 汇总缺失功能和待优化项** 列出每个缺失项的具体工作量和前后端依赖。 - [ ] **Step 3: 提交评估报告** ```bash git add docs/task-requirements.md && git commit -m "docs: 更新任务模块功能评估" ``` ### Task 2.2: 实现任务模板功能(TASK-006) **涉及文件:** - 后端: `TaskTemplateController.java`, `TaskTemplateService.java`, `TaskTemplateMapper.java` - 前端: `pages/tasks/task-templates.vue`(新增) **背景**: task-requirements.md 中 TASK-006 标注为"部分实现"。后端已有 `TaskTemplate` 实体和 `AdminController` 中的模板管理 API,但前端缺少家长创建和使用模板的页面。 - [ ] **Step 1: 检查后端 TaskTemplate 实体和 API** 确认 `TaskTemplate` 实体包含字段:`id, title, description, category, points, difficulty, isActive, teacherId, createdAt, updatedAt` 确认 API 端点的可用性: - `POST /api/admin/task-templates` — 列表查询 - `POST /api/admin/task-templates/create` — 创建 - `PUT /api/admin/task-templates/{id}` — 更新 - `DELETE /api/admin/task-templates/{id}` — 删除 - [ ] **Step 2: 创建家长端任务模板选择器** 在 `create-task.vue` 中添加"从模板创建"功能: - 添加模板列表 API 调用 - 在任务创建页显示模板选择按钮 - 选择模板后自动填充表单字段(title, category, points 等) - [ ] **Step 3: 在 pages.json 注册模板管理页面** 添加路由 `/pages/tasks/task-templates`,家长可从首页快捷操作进入。 - [ ] **Step 4: 提交** ```bash git add -A && git commit -m "feat: 实现家长端任务模板选择功能" ``` ### Task 2.3: 完善审核方式和完成方式设置(TASK-007, TASK-010) - [ ] **Step 1: 检查 Task entity 的审核相关字段** 确认 Task 实体已有的审核字段: - `reviewType`: auto(自动通过)/ manual(家长审核) - `status`: pending/completed/reviewed 等 如果需要字段但不存在,在 `Task.java` 中添加: ```java /** 审核方式: auto/manual */ private String reviewType; /** 完成方式: photo/video/text/auto */ private String completeType; ``` - [ ] **Step 2: 更新 create-task.vue 添加审核方式和完成方式选择** 在创建任务表单中添加: - 审核方式选择: 自动通过 / 家长审核 - 完成方式选择: 拍照 / 视频 / 文字描述 / 自动完成 - [ ] **Step 3: 更新 TaskService 审核逻辑** - `auto` 模式: 提交后自动标记为已完成 - `manual` 模式: 提交后进入待审核列表 - [ ] **Step 4: 提交** ```bash git add -A && git commit -m "feat: 添加任务审核方式和完成方式设置" ``` ### Task 2.4: 批量操作功能(TASK-016) - [ ] **Step 1: 后端批量操作 API** 在 `TaskController.java` 中添加批量操作端点: ```java @PostMapping("/batch-complete") public Result batchComplete(@RequestBody List taskIds) { // 批量完成任务 } @PostMapping("/batch-delete") public Result batchDelete(@RequestBody List taskIds) { // 批量删除任务 } ``` - [ ] **Step 2: 前端批量操作 UI** 在 `tasks.vue` 的列表中添加复选框选择和批量操作按钮: - 全选/取消全选 - 批量完成 - 批量删除 - 批量拒审 - [ ] **Step 3: 提交** ```bash git add -A && git commit -m "feat: 实现任务批量操作功能" ``` ### Task 2.5: 任务时长设置(TASK-011) - [ ] **Step 1: 在 Task 实体中添加 duration 字段** ```java /** 预计时长(分钟) */ private Integer duration; ``` - [ ] **Step 2: 更新 create-task.vue 添加时长输入** ```html 预计时长(分钟) ``` - [ ] **Step 3: 提交** ```bash git add -A && git commit -m "feat: 添加任务时长设置功能" ``` --- ## 自检清单 ### Spec 覆盖 - [ ] SFMS 数据源配置修复 → Task 1.1 - [ ] 数据迁移端到端验证 → Task 1.2 - [ ] 迁移幂等性和错误处理 → Task 1.3 - [ ] 任务模板功能 → Task 2.2 - [ ] 审核方式设置 → Task 2.3 - [ ] 完成方式设置 → Task 2.3 - [ ] 批量操作 → Task 2.4 - [ ] 任务时长设置 → Task 2.5 ### 无占位符检查 - [ ] 所有代码块包含完整实现代码 - [ ] 所有文件路径使用绝对/项目相对路径 - [ ] 所有命令含预期输出 - [ ] 没有"TBD"、"TODO"或"待完善"等占位词(评估项除外)