2026-05-13-priority-groups-sfms-migration-parent-tasks.md 12 KB

优先级调整实施计划: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 当前:

@ConfigurationProperties(prefix = "sfms.datasource.hikari")
public DataSource sfmsDataSource() { ... }

application.yml 中实际配置:

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() 即可

修改后代码:

  @Bean(name = "sfmsDataSource")
  @ConfigurationProperties(prefix = "sfms.datasource")
  public DataSource sfmsDataSource() {
      return DataSourceBuilder.create().build();
  }

同时需要添加 import org.springframework.boot.jdbc.DataSourceBuilder;(已有)。

  • [ ] Step 2: 编译验证

    cd zxyj-backend && mvn clean compile
    

预期: BUILD SUCCESS

  • [ ] Step 3: 启动后端验证 sfms 数据源初始化成功

    mvn spring-boot:run
    

预期: 控制台无 DataSource 相关报错,Spring 启动成功。

注意:sfms 的阿里云RDS地址 bianwoyou.mysql.rds.aliyuncs.com:3305 可能需要网络可达。如无法连接,迁移端点会返回错误但不应影响主应用启动。

  • [ ] Step 4: 提交

    git add zxyj-backend/src/main/java/com/zxyj/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: 启动后端后调用迁移端点

    curl -X POST http://localhost:8080/api/migration/run
    

预期返回:

  {
    "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: 提交

    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 缓存去重

如果幂等性不足(例如二次迁移会重复创建家庭),添加基于手机号的查重:

  // 在 migrateFamilies 方法开头添加
  if (familyMapper.selectCount(new LambdaQueryWrapper<Family>()
      .eq(Family::getName, familyName)) > 0) continue;
  • Step 2: 添加迁移进度日志

在每个迁移步骤的关键节点添加日志输出,便于排查问题。

  • [ ] Step 3: 提交

    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: 提交评估报告

    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: 提交

    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 中添加:

  /** 审核方式: auto/manual */
  private String reviewType;
  
  /** 完成方式: photo/video/text/auto */
  private String completeType;
  • Step 2: 更新 create-task.vue 添加审核方式和完成方式选择

在创建任务表单中添加:

  • 审核方式选择: 自动通过 / 家长审核
  • 完成方式选择: 拍照 / 视频 / 文字描述 / 自动完成

  • [ ] Step 3: 更新 TaskService 审核逻辑

    • auto 模式: 提交后自动标记为已完成
    • manual 模式: 提交后进入待审核列表
  • [ ] Step 4: 提交

    git add -A && git commit -m "feat: 添加任务审核方式和完成方式设置"
    

Task 2.4: 批量操作功能(TASK-016)

  • Step 1: 后端批量操作 API

TaskController.java 中添加批量操作端点:

  @PostMapping("/batch-complete")
  public Result<Boolean> batchComplete(@RequestBody List<Long> taskIds) {
      // 批量完成任务
  }
  
  @PostMapping("/batch-delete")
  public Result<Boolean> batchDelete(@RequestBody List<Long> taskIds) {
      // 批量删除任务
  }
  • Step 2: 前端批量操作 UI

tasks.vue 的列表中添加复选框选择和批量操作按钮:

  • 全选/取消全选
  • 批量完成
  • 批量删除
  • 批量拒审

  • [ ] Step 3: 提交

    git add -A && git commit -m "feat: 实现任务批量操作功能"
    

Task 2.5: 任务时长设置(TASK-011)

  • [ ] Step 1: 在 Task 实体中添加 duration 字段

    /** 预计时长(分钟) */
    private Integer duration;
    
  • [ ] Step 2: 更新 create-task.vue 添加时长输入

    <view class="form-item">
    <text class="label">预计时长(分钟)</text>
    <input class="input" type="number" v-model="form.duration" placeholder="请输入预计完成时长" />
    </view>
    
  • [ ] Step 3: 提交

    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"或"待完善"等占位词(评估项除外)