2026-07-14-okr-review-and-progress-fix.md 4.0 KB

OKR 审批关系与 KR 进度更新修复实现计划

面向 AI 代理的工作者: 必需子技能:使用 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(- [ ])语法来跟踪进度。

目标: 禁止本人审核自己的 OKR;有冻结直属上级时只交给该上级,无上级时自动通过;仅在执行阶段可靠更新并回显 KR 进度。

架构: 周期发布时冻结的 period_participant.evaluator_id 是审批关系的唯一来源,EXEMPT_NO_EVALUATOR 参与人无需审批。KR 更新由单个事务同时写入 KR 当前值、进度日志和目标聚合进度;前端只在 EXECUTING 阶段显示更新入口,并明确说明其他阶段不可更新。

技术栈: Spring Boot 3.2、MyBatis-Plus、SQLite、JUnit 5/Mockito、Vue 3、Vitest。


任务 1:冻结审批关系回归测试

文件:

  • 修改:backend/src/test/java/com/emoon/okr/service/OkrServiceTest.java
  • 修改:backend/src/main/java/com/emoon/okr/service/OkrService.java

  • [x] 编写失败测试:无冻结考评人的目标集提交后自动通过且本人不进入待审核列表。

  • [x] 编写失败测试:待审核列表只返回 evaluator_id 等于当前用户且属主不是当前用户的目标。

  • [x] 运行 mvn -Dtest=OkrServiceTest test,确认测试因现有部门负责人兜底逻辑而失败。

  • [x] 最小实现:提交状态由冻结考评人决定;待审核查询只使用冻结考评关系;审核权限移除部门负责人兜底。

  • [x] 重新运行 mvn -Dtest=OkrServiceTest test,确认通过。

任务 2:旧周期冻结关系数据迁移

文件:

  • 修改:backend/src/test/java/com/emoon/okr/config/DatabaseMigrationRunnerTest.java
  • 修改:backend/src/main/java/com/emoon/okr/config/DatabaseMigrationRunner.java

  • [x] 编写失败测试:旧的 ACTIVE 参与人应从 sys_user.superior_id 补齐冻结字段;无上级参与人应转为 EXEMPT_NO_EVALUATOR

  • [x] 运行 mvn -Dtest=DatabaseMigrationRunnerTest test,确认缺少迁移版本而失败。

  • [x] 新增幂等迁移,仅修复冻结字段为空的历史参与人,不覆盖已有快照。

  • [x] 重新运行迁移测试,确认通过。

任务 3:KR 进度持久化闭环

文件:

  • 修改:backend/src/test/java/com/emoon/okr/service/OkrServiceTest.java
  • 修改:backend/src/main/java/com/emoon/okr/service/OkrService.java

  • [x] 编写失败测试:执行阶段更新 KR 后必须更新 current_value/status、插入日志并持久化目标聚合进度。

  • [x] 运行单测确认失败原因与更新闭环缺口一致。

  • [x] 最小实现并补充 newValue/status 非空校验,目标进度按 baseline 到 target 的完成度聚合。

  • [x] 重新运行 mvn -Dtest=OkrServiceTest test,确认通过。

任务 4:前端可编辑状态与成功回显

文件:

  • 修改:frontend/src/views/okr/MyOkrView.vue
  • 修改:frontend/src/views/okr/OkrExecutionView.vue
  • 修改:frontend/src/__tests__/open-design-page-contract.test.js

  • [x] 编写失败测试:两个页面仅在 EXECUTING 显示更新入口,并发送 newValue/status/remark 后重新请求当前 OKR 和执行时间线。

  • [x] 运行 npm test -- --run,确认契约测试失败。

  • [x] 最小实现:保存期间禁用按钮、成功后等待刷新、失败保留表单并显示后端消息;非执行阶段显示锁定说明。

  • [x] 重新运行前端测试,确认通过。

任务 5:全量验证与静态资源同步

文件:

  • 更新:backend/src/main/resources/static/

  • [x] 运行 npm test -- --runnpm run verify:themenpm run verify:scoringnpm run build

  • [x] 将 frontend/dist/ 同步到 backend/src/main/resources/static/

  • [x] 运行 mvn testmvn clean package -DskipTests

  • [x] 使用临时 SQLite 数据库验证:本人待审核列表为空、直属上级可见、无上级自动通过、执行阶段 KR 更新后 GET 立即返回新值。