面向 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。
文件:
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,确认通过。
文件:
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] 重新运行迁移测试,确认通过。
文件:
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,确认通过。
文件:
frontend/src/views/okr/MyOkrView.vuefrontend/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] 重新运行前端测试,确认通过。
文件:
更新: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 立即返回新值。