# 绩效管理系统 PRD（Performance Management System）

> **module**: performance
> **doc_type**: PRD
> **status**: Active
> **owner**: FFOA 开发团队
> **upstream_docs**: 无（PRD 是依赖链起点）
> **last_verified**: 2026-03-19
>
> **事实源**: 本文档定义当前版本业务范围与验收边界；内容已按当前实现校准

---

## 目标与问题

### 要解决的问题

- 绩效考核流程依赖线下表格和邮件，HR 每个周期要花 2-3 周手工汇总
- 经理无法实时看到团队 KPI 进度，只能等季度末才了解情况
- 绩效校准全靠会议口头讨论，缺乏数据支撑和调整记录
- 360 评估依赖纸质问卷，结果汇总繁琐且容易出错

### 成功指标

- 绩效周期全流程线上化，HR 手工汇总时间从 2-3 周降到 1 天内
- 经理可随时查看团队 KPI 填写和审批进度
- 校准记录 100% 线上留痕，可追溯
- 360 评估全流程线上完成，结果自动汇总

## 功能边界

**In-scope（当前版本，前端已有入口）**：

- 绩效周期管理（含父子周期）
- KPI 目标设定、审批、跨部门依赖
- KPI 评估（自评 + 经理评 + 整体评语）
- 360 评估（含模板管理）
- 绩效校准（校准看板 + 等级调整 + 分布展示）
- 结果发布、确认、申诉
- 战略目标管理
- 统计分析（部门/公司报表）
- 等级配置管理

**Out-of-scope（后续版本规划）**：

- KPI 从模板导入（当前不支持，KPI 仅支持行内手动创建）
- KPI 目标对齐（当前不支持，无上级目标关联功能）
- 年度 KPI 分解为季度目标（当前不支持，父子周期仅作为组织维度）
- 持续反馈：表扬/建议/关注反馈、1:1 沟通记录
- 绩效面谈：面谈安排、面谈记录、员工确认
- 独立 KPI 指标库页面（当前 KPI 在我的 KPI 页面行内创建）
- 独立员工结果页（当前结果在个人概览页和管理页展示）
- 个人/团队绩效报表（当前仅有部门/公司报表）
- 绩效与薪酬/晋升的自动关联
- 外部系统绩效数据导入
- 移动端原生 App

## 术语表

| 术语 | 说明 |
|------|------|
| 周期（Cycle） | 一次绩效考核的完整生命周期，有 8 个阶段 |
| 父子周期 | 年度周期下可包含季度子周期，当前仅作为组织维度 |
| KPI | 员工的关键绩效指标，包含名称、描述、权重、目标值 |
| 权重 | KPI 的重要程度占比，同一员工同一周期内所有 KPI 权重总和必须为 100% |
| 跨部门依赖 | 员工 KPI 依赖其他部门的人员配合，依赖方需确认或拒绝 |
| 自评 | 员工对自己每个 KPI 的完成情况打分和说明 |
| 经理评 | 经理对下属每个 KPI 的评分和评语 |
| 整体评语 | 对员工整体表现的文字评价（区别于单个 KPI 的评语） |
| proposedGrade | 经理评估后建议的绩效等级，校准阶段可调整 |
| 校准（Calibration） | HR 统一审视和调整各部门员工等级，确保公平性 |
| 360 评估 | 多维度匿名评估，评估关系包括上级/同级/下级/跨部门 |
| 360 模板 | 定义 360 评估的维度（如领导力、协作、专业能力）和可用关系类型 |
| 等级配置（Grade Config） | 可自定义的绩效等级方案（如 S/A/B/C/D），绑定分数区间和颜色 |
| 战略目标 | 公司/部门级的战略方向，可分配给员工作为 KPI 对齐参考 |

## 版本口径

本文档按当前实现校准。若代码与本文冲突，以本文为准；若本文显式标注"按当前实现校准"，则实现差异不视为缺陷，应更新文档对齐。

## 功能依赖链

```
等级配置（F8）──前置──→ 周期管理（F1）──→ KPI 目标设定（F2）──→ 绩效评估（F3）──→ 绩效校准（F4）──→ 结果发布（F6）
                                                    │                        ↑
                                                    └── 360 评估（F7）────────┘
战略目标（F9）──可选关联──→ KPI 目标设定（F2）
统计分析（F5）──依赖──→ 已完成周期数据
```

> AI agent 实现时应按此依赖关系安排顺序，不得跨阶段实现下游功能。

## 核心业务约束

- 同一员工在同一周期内只能有一组有效 KPI 集
- 同一员工在同一周期内只能有一份有效绩效结果
- KPI 权重总和必须为 100% 才能提交审批
- 存在未确认的跨部门依赖时，KPI 提交审批被阻断
- 360 评估必须基于已配置的模板，不能无模板发起
- 同一评估者对同一 360 评估任务只能有一份有效提交
- 同一状态推进操作重复提交时，不得生成重复副作用（幂等性）

## 功能清单

### F1: 绩效周期管理


| 功能点       | 优先级 | 说明                     |
| --------- | --- | ---------------------- |
| F1.1 创建周期 | P0  | 创建新的绩效考核周期，可选择全公司或指定组织 |
| F1.2 周期列表 | P0  | 查看所有周期，支持按组织筛选         |
| F1.3 周期详情 | P0  | 查看周期配置和完成进度            |
| F1.4 阶段流转 | P0  | 手动推进阶段                 |
| F1.5 周期归档 | P1  | 归档已完成周期                |


**周期阶段（8 个）**


| 阶段                | 说明          | 可执行操作                    |
| ----------------- | ----------- | ------------------------ |
| DRAFT 草稿          | 周期创建中，未发布   | 编辑配置、等级配置、删除             |
| GOAL_SETTING 目标设定 | 员工填写 KPI 目标 | 填写/编辑 KPI、提交审批、审批操作、设定依赖 |
| IN_PROGRESS 执行中   | 目标执行与跟踪     | KPI 只读                   |
| EVALUATING 评估中    | 评估打分阶段      | 自评、经理评分、配置 360 评估人、填写 360 评估 |
| CALIBRATING 校准中   | 绩效校准阶段      | 校准调整等级                   |
| CONFIRMING 结果确认   | 员工确认绩效结果    | 确认结果或提出申诉                |
| COMPLETED 已完成     | 结果已确认       | 查看历史结果、可归档               |
| ARCHIVED 已归档      | 历史数据归档      | 仅查看                      |


阶段流转：HR 手动推进阶段，每次推进需确认操作。

### F2: 目标设定（KPI）

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F2.1 填写 KPI | P0 | 员工行内创建/编辑 KPI（名称、描述、权重、基本目标、挑战目标） |
| F2.2 权重分配 | P0 | 设置指标权重（总和 100%） |
| F2.3 提交审批 | P0 | 提交全部 KPI 给上级审批 |
| F2.4 审批操作 | P0 | 上级审批通过或驳回（驳回需原因） |
| F2.5 跨部门依赖 | P0 | KPI 可设置跨部门依赖人，依赖方需确认或拒绝 |
| F2.6 KPI 指南 | P1 | KPI 填写指南侧边栏，展示最佳实践和示例 |

### F3: 绩效评估

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F3.1 自评 | P0 | 员工自评每个 KPI（分数 + 完成情况） |
| F3.2 整体自评评语 | P0 | 员工填写整体自评评语 |
| F3.3 经理评估 | P0 | 经理对下属每个 KPI 评分和评语 |
| F3.4 整体经理评语 | P0 | 经理填写整体经理评语 |
| F3.5 360 评估 | P0 | 评估者按维度打分并填写评语（详见 F7） |
| F3.6 评定等级 | P0 | 评定建议等级（proposedGrade） |

评分规则：各 KPI 按权重加权计算总分，根据总分映射到等级（按当前等级配置）。

### F4: 绩效校准

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F4.1 校准看板 | P0 | 展示人员等级分布，支持按部门筛选 |
| F4.2 调整等级 | P0 | 校准过程中调整等级，调整原因必填 |
| F4.3 分布展示 | P0 | 展示当前等级分布情况（建议性，不强制） |

### F5: 统计分析

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F5.1 部门绩效报表 | P0 | 按周期和部门筛选，部门等级分布与统计指标 |
| F5.2 公司绩效报表 | P0 | 公司整体等级分布，各部门对比 |

> 个人/团队报表、跨周期对比为后续版本规划。

### F6: 结果发布与确认

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F6.1 结果发布 | P0 | HR 在结果管理页统一发布（可批量/单个），周期进入 CONFIRMING 阶段 |
| F6.2 结果确认 | P0 | 员工在个人概览页查看并确认绩效结果 |
| F6.3 申诉机制 | P0 | 员工对结果提出申诉（需填写原因） |
| F6.4 结果管理 | P0 | HR 在结果管理页查看、发布、导出结果 |
| F6.5 历史记录 | P1 | 查看历史绩效记录（个人概览页） |

### F7: 360 评估

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F7.1 发起评估 | P0 | 员工在我的 KPI 页面配置 360 评估人 |
| F7.2 评估关系 | P0 | 定义评估者关系（自评/上级/同级/下级/跨部门） |
| F7.3 问卷填写 | P0 | 评估者按维度打分并填写评语 |
| F7.4 匿名机制 | P0 | 所有 360 评估匿名，评完即可见结果 |
| F7.5 结果汇总 | P0 | 按关系类型和维度汇总得分，评估完成后自动可见 |
| F7.6 评估管理 | P0 | HR 查看评估全局视图（谁发起、评估人列表、完成状态、汇总打分） |
| F7.7 模板列表 | P0 | 查看 360 评估模板列表 |
| F7.8 创建模板 | P0 | 定义评估维度（中英文名称和描述）和可用关系类型 |
| F7.9 设为默认 | P0 | 设置默认模板 |
| F7.10 模板删除 | P1 | 删除未使用的模板 |

### F8: 等级配置管理

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F8.1 配置列表 | P0 | 查看所有等级配置 |
| F8.2 创建配置 | P0 | 自定义等级方案（代码、名称、分数区间、颜色、描述） |
| F8.3 设为默认 | P0 | 设置默认等级配置 |
| F8.4 配置删除 | P1 | 删除未被引用的配置 |

绩效等级支持**可配置化**，系统提供默认五级制：

| 等级代码 | 名称 | 分数区间 | 颜色 |
|----------|------|----------|------|
| S | 卓越 | 90-100 | #8B5CF6 |
| A | 优秀 | 80-89 | #3B82F6 |
| B | 良好 | 70-79 | #10B981 |
| C | 达标 | 60-69 | #F97316 |
| D | 待提升 | 0-59 | #EF4444 |

配置规则：等级代码在同一配置内唯一，分数区间不能重叠且必须覆盖 0-100，每个绩效周期可选择不同的等级配置。

### F9: 战略目标管理

| 功能点 | 优先级 | 说明 |
|--------|--------|------|
| F9.1 目标列表 | P0 | 按周期查看战略目标列表 |
| F9.2 创建目标 | P0 | 创建战略目标（名称、描述、排序） |
| F9.3 行内编辑 | P0 | 行内编辑目标信息 |
| F9.4 分配目标 | P0 | 分配到部门和员工 |
| F9.5 删除目标 | P1 | 删除战略目标 |

## 角色权限矩阵

> 权限码定义：`backend/src/modules/performance/constants/permissions.ts`
> 种子分配：`backend/prisma/seeds/roles.seed.ts`
> 经理权限仅在其管理链路下生效，不是全局权限。
> Administrator / HR Manager 拥有全部绩效权限（`performance:*`）。

### 员工（Employee）

| 功能 | 权限码 | 涉及 API |
|------|--------|----------|
| 查看周期列表/详情 | `cycle:view`, `cycle:read` | GET /cycles, /cycles/:id, /cycles/active |
| 查看自己的 KPI | `kpi:view` | GET /kpi/assignments, /kpi/assignments/my |
| 填写/提交 KPI | `kpi:self-evaluate`, `kpi:evaluate:self` | POST /kpi/assignments, PUT /kpi/assignments/:id, POST /kpi/assessments/:id/self-evaluate |
| 确认 KPI 评估结果 | `kpi:confirm` | POST /kpi/assessments/:id/confirm |
| 设置 KPI 跨部门依赖 | `kpi:view` | PUT /kpi/assignments/:id（dependentUserId 字段） |
| 确认/拒绝 KPI 依赖 | `kpi:confirm` | POST /kpi/dependencies/:id/confirm, /reject |
| 配置 360 评估人 | `360:create`, `360:update` | POST /360/evaluations, POST /360/evaluations/:id/evaluators |
| 填写 360 评估 | `360:submit` | POST /360/tasks/:id/submit |
| 查看 360 任务/结果 | `360:view`, `360:view:own` | GET /360/tasks/my, /360/my-evaluation, /360/my-tasks |
| 查看绩效结果 | `result:view`, `result:view:own` | GET /results/my, /results/my/:cycleId |
| 确认/申诉绩效结果 | `result:view:own` | POST /results/my/:id/confirm, /results/my/:id/appeal |
| 查看等级配置 | `grade:view` | GET /grade-configs |

### 经理（Leader / Department Manager）

> 包含员工全部权限，额外增加以下权限。

| 功能 | 权限码 | 涉及 API |
|------|--------|----------|
| 查看团队 KPI | `kpi:view:team` | GET /kpi/assignments/team |
| 分配 KPI 给下属 | `kpi:assign` | POST /kpi/assignments/batch |
| 审批/驳回下属 KPI | `kpi:manager-evaluate` | POST /kpi/assignments/:id/approve, /reject |
| 评估下属 KPI | `kpi:manager-evaluate` | POST /kpi/assessments/:id/manager-evaluate |
| 查看团队 360 | `360:view:team` | GET /360/evaluations（team 过滤） |
| 查看 360 结果详情 | `360:view:results`（仅 Dept Manager） | GET /360/evaluations/:id/results |
| 参与校准会议 | `calibration:view`, `calibration:participate` | GET /calibration/overview |
| 查看校准详情 | `calibration:read`（仅 Dept Manager） | GET /calibration/overview |
| 管理 KPI | `kpi:manage`（仅 Dept Manager） | KPI 批量操作 |
| 查看全部结果 | `result:view:all`（仅 Dept Manager） | GET /results |
| 查看统计分析 | `analytics:read`（仅 Dept Manager） | GET /analytics/* |

### HR / Administrator

> 拥有全部绩效权限（`performance:*`），额外说明管理类功能。

| 功能 | 权限码 | 涉及 API |
|------|--------|----------|
| 创建/编辑/删除周期 | `cycle:create`, `cycle:update`, `cycle:delete` | POST/PUT/DELETE /cycles |
| 发布周期 | `cycle:publish` | POST /cycles/:id/publish |
| 推进周期阶段 | `cycle:update` | POST /cycles/:id/start-execution, start-evaluation, start-calibration, start-confirming, complete, archive |
| 管理战略目标 | `strategic-objective:view/create/update/delete/assign` | /strategic-objectives/* |
| 校准调整 | `calibration:manage`, `calibration:adjust` | POST /calibration/adjust |
| 计算绩效结果 | `result:calculate` | POST /results/calculate |
| 发布绩效结果 | `result:publish` | POST /cycles/:id/publish-results |
| 处理申诉 | `result:publish` | POST /results/:id/resolve-appeal |
| 导出报告 | `report:export`, `result:export` | POST /results/export |
| 管理等级配置 | `grade-config:manage`, `grade:create/update/delete` | /grade-configs/* |
| 管理 360 模板 | `360-template:view/create/update/delete` | /360-templates/* |
| 查看全部统计 | `result:view:all` | GET /analytics/* |


## 边界规则

> 本节定义 AI agent 在实现本模块时的行为边界。

### Always Do（始终执行，无需确认）

- 所有查询必须带 organizationId 过滤（组织隔离）
- 数据库写操作使用事务
- KPI 权重变更后自动校验总和是否为 100%
- 状态转换必须校验当前阶段是否允许该操作
- 绩效数据（分数、等级、评语）变更必须记录审计日志

### Ask First（需确认后执行）

- 修改 perf_* 数据库表结构
- 新增或修改周期状态流转规则
- 修改权限码定义（constants/permissions.ts）
- 新增第三方依赖

### Never Do（硬性禁止）

- 不得跳过权限校验（所有 API 必须有 @RequirePermissions 或 @RequireRole）
- 不得未经确认删除已有 API 端点
- 不得在非 GOAL_SETTING 阶段允许编辑 KPI
- 不得在非 EVALUATING 阶段允许自评或经理评分
- 不得允许员工查看其他员工的绩效分数（除非是经理或 HR）

## 风险与假设

### 假设

> AI agent 应基于这些假设做设计决策，不应自行推断。

- 组织架构模块已就绪，汇报关系数据（manager_id）准确
- 每个员工在一个绩效周期内只属于一个主部门（用于 KPI 审批链路和校准分组）
- 权限体系基于 RBAC，权限码以 `backend/src/constants/permissions.ts` 为准
- 360 评估的评估关系（evaluator ↔ evaluatee）由员工自行配置，不由系统自动生成

### 风险

- 跨部门 KPI 依赖可能因依赖方不响应导致流程阻塞（当前无超时自动处理）
- 校准阶段如果参与人数过多（>100 人），看板渲染性能可能下降
- 父子周期当前仅作为组织维度，年度 KPI 分解为后续版本规划

## 关键依赖


| 依赖模块 | 集成点 |
|----------|--------|
| IAM（身份认证） | 用户身份、角色权限 |
| 组织架构 | 汇报关系、部门结构 |



