ID,Title,Description,Acceptance,Test_Method,Tools,Dev_Status,Review1_Status,Regression_Status,Files,Dependencies,Notes "A1","R46 执行合同与范围冻结","创建 R46 Issue CSV,冻结范围为绩效周期、评分、统计扩展与档案页绩效标签;锁定绩效路由独立于 employees.js,直属上级通过绩效专属 API 访问,不放宽完整档案敏感字段权限。","issues/2026-03-29_r46-performance-review.csv 列完整、依赖清晰、测试方法可复现;范围仅覆盖本轮绩效核心流程。","对照 AGENTS.md 与 issues/README.md 检查列完整、Dependencies 为 JSON 数组字符串、Test_Method 含命令与业务流程步骤;确认范围不包含 OKR/KPI、360 评估、申诉流、模板中心或自动提醒。","manual","DONE","DONE","DONE","issues/2026-03-29_r46-performance-review.csv","[]","none" "A2","R46 Prisma 模型与周期管理后端","新增 PerformanceReviewCycle、PerformanceReview、PerformanceReviewDimension 及相关 enum,注册独立 performance 路由,完成周期创建、草稿编辑、激活、关闭与单一 active 周期约束。","管理员可创建 draft 周期、编辑 draft、激活周期且全局同时仅 1 个 active、关闭 active 为 completed;completed 后不可再回到 active;周期操作写审计日志。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/performance.js && node --check src/app.js && npm test -- tests/unit/routes/performance.cycles.test.js。业务:1) system.users 创建 draft 周期成功;2) draft 周期修改名称/类型/日期成功;3) 激活第一个周期成功,再激活第二个周期返回冲突且原 active 不变;4) active 周期关闭为 completed 后不可再接收评分。","manual","DONE","DONE","DONE","server/prisma/schema.prisma|server/prisma/migrations|server/src/routes/performance.js|server/src/app.js|server/tests/unit/routes/performance.cycles.test.js","[""A1""]","回滚:先清理 performance_review_dimensions / performance_reviews / performance_review_cycles 数据,再回滚 Prisma migration 与 route 注册;本轮不提供周期删除。" "A3","R46 评分接口与三层权限后端","在 performance.js 实现按周期全员概览、按员工绩效时间线与评分 upsert;system.users 可评分任意员工,直属上级仅可评分直属下属 active 周期,本人仅可查看自己已完成结果,report.dashboard.view 不可访问个人明细。","评分接口校验 1-5 且步进 0.5;维度为可选多项且每项带分数;管理员可查看任意员工 active/completed 周期,直属上级可查看直属下属历史并编辑 active,本人仅能查看自己 completed 结果;completed 周期不可再修改。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/routes/performance.js && npm test -- tests/unit/routes/performance.reviews.test.js。业务:1) 直属上级为直属下属在 active 周期提交 4.5 分和多条维度分项成功;2) 非直属上级、普通员工为他人评分返回 403;3) system.users 可修改任意员工 active 周期评分;4) 自己查询仅返回 completed 结果,active 周期对本人不可见;5) completed 周期再次 PUT 评分返回冲突。","manual","DONE","DONE","DONE","server/src/routes/performance.js|server/tests/unit/routes/performance.reviews.test.js","[""A2""]","评分记录按 [cycle_id, employee_id] 唯一;每次更新在事务内全量替换维度明细;不放宽 /api/employees/:id/profile 的现有敏感字段权限。" "A4","R46 绩效统计后端扩展","扩展 employeeStats,在现有员工统计基础上追加 performanceSummary,返回当前 active 或最近 completed 周期的平均分、评分分布与已评分人数,继续保持只返回聚合数据。","GET /api/employees/stats 对 system.users 与 report.dashboard.view 返回聚合绩效统计;有 active 时取 active,无 active 时取最近 completed;无周期时返回空绩效态;不暴露员工级明细。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd server && npx prisma validate && node --check src/services/employeeStats.js && node --check src/routes/employees.js && npm test -- tests/unit/routes/employees.stats.test.js。业务:1) 存在 active 周期时返回该周期平均分与 0.5 档位分布;2) 无 active 但有 completed 周期时返回最近 completed;3) 无任何周期时页面可渲染空态;4) report.dashboard.view 只能看到聚合统计,不能通过绩效详情接口看到个人数据。","manual","DONE","DONE","DONE","server/src/services/employeeStats.js|server/src/routes/employees.js|server/tests/unit/routes/employees.stats.test.js","[""A2"",""A3""]","评分分布按 1.0-5.0、步进 0.5 共 9 档返回;本轮不新增独立绩效统计接口。" "A5","R46 绩效列表页与前端 API","新增 client 侧绩效 API 与独立 /performance 页面,支持管理员创建/激活/关闭周期、按周期查看全员评分概览,并从 PeoplePage 页头进入。","system.users 可访问 /performance 并完成周期管理;选中周期后可看到评分概览、平均分与深链到员工档案绩效 tab;非 system.users 直接访问路由被拦截。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) system.users 从 PeoplePage 进入 /performance 成功;2) 新建 draft 周期、激活、关闭流程与后端一致;3) 切换周期后全员概览刷新;4) 行内“查看绩效”跳转到 /people/:employeeId?tab=performance;5) 非管理员访问 /performance 进入 403。","manual","DONE","DONE","DOING","client/src/api/performance.ts|client/src/pages/PerformancePage.tsx|client/src/router/index.tsx|client/src/router/lazy/index.ts|client/src/router/lazy/PerformancePage.ts|client/src/pages/PeoplePage.tsx","[""A2"",""A3""]","/performance 为独立路由但不进入全局主导航;入口放 PeoplePage 页头,避免继续膨胀导航与 workspace settings。" "A6","R46 档案页绩效标签与直属上级评分","在 EmployeeProfilePage 增加绩效 tab、tab 深链与绩效专属降级视图;本人查看已完成结果,管理员查看并编辑 active,直属上级可从本人档案的直属下级卡片进入下属绩效页并编辑 active。","档案页支持 ?tab=performance 直达;本人仅见 completed 结果;管理员可见 active/completed 并编辑 active;直属上级在完整 profile 403 但绩效接口允许时,页面退化为精简头部 + 绩效 tab;report.dashboard.view 不显示绩效 tab。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) 员工本人打开 /people/:me?tab=performance,只看到自己 completed 周期结果;2) system.users 打开任意员工档案可编辑 active 周期评分;3) 直属上级从自己档案“直属下级”卡片进入下属 /people/:id?tab=performance,可提交或修改 active 周期评分;4) 非直属上级即使知道链接也不能查看该员工绩效;5) report.dashboard.view 仍仅能看统计页,不显示绩效 tab。","manual","DONE","DONE","DOING","client/src/pages/EmployeeProfilePage.tsx|client/src/api/performance.ts","[""A3"",""A5""]","不放宽完整档案敏感字段权限;直属上级看到的是绩效专属上下文,不包含生命周期、紧急联系人、资产等扩展信息。" "A7","R46 统计页前端扩展绩效概览","扩展 PeopleStatsPage 与员工统计类型,展示当前/最近周期平均分、已评分人数与评分分布,同时保持 report.dashboard.view 的只读聚合边界。","PeopleStatsPage 新增绩效概览且不暴露个人明细;system.users 与 report.dashboard.view 均可查看;原有员工统计卡片和列表不回归。","命令:export PATH=/home/shunli/.nvm/versions/node/v22.20.0/bin:$PATH && cd client && npm run typecheck && npm run build。业务:1) 进入 /people/stats 可看到当前/最近周期平均分与评分分布;2) 无绩效周期时显示空态文案;3) report.dashboard.view 访问统计页仍只见聚合数据;4) 原有合同到期、证书、雇用状态、部门分布统计继续正常。","manual","DONE","DONE","DOING","client/src/pages/PeopleStatsPage.tsx|client/src/api/employees.ts","[""A4""]","绩效分布按后端 0.5 档位展示为简单列表,不引入图表库。" "A8","Reviewer 与 QA 收口","按 AGENTS 编排启用 reviewer 与 qa,重点审查 Prisma 迁移回滚、三层权限边界、唯一 active 周期约束、completed 冻结与档案页降级视图,并回填 CSV 状态。","A2-A7 的 Review1_Status 与 Regression_Status 都有证据地回填;reviewer 风险项关闭;R43-R45 员工模块能力不回归。","Reviewer:审查 3 个新模型迁移回滚路径、评分权限边界、direct_manager_id 复用逻辑、completed 不可写与 active 唯一约束、是否误放宽完整员工档案权限。QA:运行 backend post-check、frontend post-check,并手工回归 4 条主线:周期创建/激活/关闭、直属上级评分、档案页绩效访问边界、统计页绩效聚合;同时确认 R43 头像/合同/培训证书、R44 高级筛选/批量操作/统计、现有 PeoplePage 与 EmployeeProfilePage 不回归。","manual","DOING","DONE","DOING","issues/2026-03-29_r46-performance-review.csv","[""A2"",""A3"",""A4"",""A5"",""A6"",""A7""]","reviewer 必启用:本轮涉及 3 个新模型、三层权限分级、completed 冻结规则与 profile 降级视图。"