# 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 -- --run`、`npm run verify:theme`、`npm run verify:scoring`、`npm run build`。 - [x] 将 `frontend/dist/` 同步到 `backend/src/main/resources/static/`。 - [x] 运行 `mvn test` 和 `mvn clean package -DskipTests`。 - [x] 使用临时 SQLite 数据库验证:本人待审核列表为空、直属上级可见、无上级自动通过、执行阶段 KR 更新后 GET 立即返回新值。