# 绩效管理模块 - 用户场景文档

> **module**: performance
> **doc_type**: UserJourney
> **status**: Active
> **owner**: FFOA 开发团队
> **upstream_docs**: 01-prd.md
> **last_verified**: 2026-03-19

---

## 用户角色

| 角色 | 描述 | 典型操作 |
|------|------|---------|
| 员工 | 普通员工 | 填写 KPI、自评、配置 360 评估人、确认/申诉结果 |
| 经理 | 带团队的管理者（manager_id 关系） | 审批下属 KPI、评估下属、查看团队 KPI |
| HR | 人力资源管理员 | 管理周期、校准、发布结果、管理配置、查看报表 |

---

## 场景总览

| 场景ID | 场景名称 | 角色 | 触发条件 | 目标 |
|--------|---------|------|---------|------|
| UJ-001 | 创建并发布周期 | HR | 新一轮绩效开始 | 创建周期、选择等级配置、发布 |
| UJ-002 | 填写并提交 KPI | 员工 | 周期处于 GOAL_SETTING | 创建 KPI、设置权重、提交审批 |
| UJ-003 | 确认跨部门依赖 | 员工/经理 | 他人向自己发起 KPI 依赖 | 确认或拒绝依赖请求 |
| UJ-004 | 审批下属 KPI | 经理 | 下属已提交 KPI | 审批通过或驳回 |
| UJ-005a | 员工完成自评 | 员工 | 周期处于 EVALUATING | 自评 + 整体评语 |
| UJ-005b | 经理完成评估 | 经理 | 员工已完成自评 | 经理评分 + 整体评语 + 建议等级 |
| UJ-006a | 员工配置 360 评估人 | 员工 | 周期处于 EVALUATING | 添加评估人、指定关系类型 |
| UJ-006b | 评估人填写 360 评估 | 评估人 | 收到待评估任务 | 按维度打分并填写评语 |
| UJ-007 | 校准等级 | HR | 周期处于 CALIBRATING | 查看分布、调整等级 |
| UJ-008a | HR 发布结果 | HR | 校准完成 | 发布绩效结果 |
| UJ-008b | 员工确认/申诉结果 | 员工 | 结果已发布 | 确认结果或提出申诉 |
| UJ-009 | 查看统计报表 | HR | 已有已完成周期 | 查看部门/公司报表 |
| UJ-010a | 管理等级配置 | HR | 日常维护 | CRUD 等级方案 |
| UJ-010b | 管理 360 模板 | HR | 日常维护 | CRUD 评估模板 |
| UJ-010c | 管理战略目标 | HR | 日常维护 | CRUD 战略目标 + 分配 |

---

## 场景详情

### UJ-001: 创建并发布周期

**角色**: HR
**触发条件**: 新一轮绩效考核开始
**前置条件**: 已有等级配置（F8）

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/cycles`，点击"创建周期" | 弹出创建表单 |
| 2 | 填写名称、类型（季度/年度）、时间范围、选择组织 | 表单校验必填项 |
| 3 | 选择等级配置 | 下拉展示已有配置列表 |
| 4 | 保存 | 周期创建成功，状态为 DRAFT，出现在列表中 |
| 5 | 点击"发布" | 确认对话框 |
| 6 | 确认发布 | 状态变为 GOAL_SETTING，员工可见该周期 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 必填字段为空 | 步骤 4 | 阻止保存，高亮空字段 |
| 未选择等级配置 | 步骤 5 | 阻止发布，提示需选择等级配置 |
| 同组织已有同时段活跃周期 | 步骤 4 | 提示时间范围冲突 |

**结束状态**: 周期状态为 GOAL_SETTING，周期列表可见该周期且状态标签为"目标设定中"

---

### UJ-002: 填写并提交 KPI

**角色**: 员工
**触发条件**: 周期处于 GOAL_SETTING
**前置条件**: 员工属于该周期的组织范围

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi` | 显示当前周期，可见"新增 KPI"按钮 |
| 2 | 点击"新增 KPI"，填写名称、描述、权重、目标值 | 行内表单展开 |
| 3 | 保存 KPI | 列表新增一行，实时显示权重累计 |
| 4 | 重复步骤 2-3 直到权重总和 100% | 权重总和显示为绿色（100%） |
| 5 | 如需跨部门依赖，在 KPI 上设置依赖人 | 依赖状态显示为 PENDING |
| 6 | 等待所有依赖方确认 | 依赖状态变为 CONFIRMED |
| 7 | 点击"提交全部" | 确认对话框 |
| 8 | 确认提交 | 所有 KPI 状态变为 SUBMITTED，提交按钮消失 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 权重总和不等于 100% | 步骤 7 | 阻止提交，提示权重不满 100% |
| 存在未确认的跨部门依赖 | 步骤 7 | 阻止提交，提示有待确认依赖 |
| 周期不在 GOAL_SETTING 阶段 | 步骤 1 | 页面只读，无"新增"按钮 |
| 无权限访问该页面 | 步骤 1 | 重定向或显示 403 提示 |

**结束状态**: KPI 状态为 SUBMITTED，团队 KPI 页面可见该员工 KPI 待审批

---

### UJ-003: 确认跨部门依赖

**角色**: 被指定为依赖方的员工或经理
**触发条件**: 他人 KPI 指定自己为跨部门依赖人
**前置条件**: 依赖状态为 PENDING

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi`，看到待确认依赖提示 | 展示依赖详情（发起人、KPI 名称、描述） |
| 2 | 选择"确认"或"拒绝" | 确认→状态变 CONFIRMED；拒绝→弹出原因输入 |
| 3 | （拒绝时）填写拒绝原因并提交 | 依赖状态变为 REJECTED，发起人可见拒绝原因 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 拒绝但未填写原因 | 步骤 3 | 阻止提交，提示需填写原因 |
| 依赖已被处理（他人或自己重复操作） | 步骤 2 | 提示"该依赖已处理"，刷新状态 |

**结束状态**: 依赖状态为 CONFIRMED 或 REJECTED，发起人 KPI 页面依赖状态实时更新

---

### UJ-004: 审批下属 KPI

**角色**: 经理
**触发条件**: 下属已提交 KPI（状态为 SUBMITTED）
**前置条件**: 当前用户是下属的直接经理（manager_id 关系）

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi/team` | 展示团队成员列表及 KPI 提交状态 |
| 2 | 选择一个员工查看其 KPI | 展示该员工全部 KPI 详情 |
| 3 | 点击"审批通过"或"驳回" | 通过→KPI 状态变 APPROVED；驳回→弹出原因输入 |
| 4 | （驳回时）填写驳回原因并提交 | KPI 状态变为 REJECTED，员工可修改后重新提交 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 驳回但未填写原因 | 步骤 4 | 阻止提交，提示需填写原因 |
| 当前用户不是该员工的经理 | 步骤 1 | 团队列表不展示该员工 |
| 周期不在 GOAL_SETTING 阶段 | 步骤 3 | 审批按钮不可见 |

**结束状态**: KPI 状态为 APPROVED 或 REJECTED，员工 KPI 页面状态标签更新

---

### UJ-005a: 员工完成自评

**角色**: 员工
**触发条件**: 周期处于 EVALUATING
**前置条件**: KPI 已审批通过（APPROVED）

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi`，点击自评入口 | 展示 KPI 列表，每条可输入分数和完成情况 |
| 2 | 对每条 KPI 填写分数（0-100）和完成情况 | 实时保存 |
| 3 | 填写整体自评评语 | 保存成功 |
| 4 | 提交自评 | 考核状态变为 SELF_EVALUATED |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 周期不在 EVALUATING 阶段 | 步骤 1 | 自评入口不可见或只读 |
| 评分超出 0-100 范围 | 步骤 2 | 字段级校验，阻止保存 |
| 自评已提交（重复操作） | 步骤 4 | 提示"自评已提交"，按钮置灰 |

**结束状态**: 考核状态为 SELF_EVALUATED，经理可在团队页面看到该员工自评已完成

---

### UJ-005b: 经理完成评估

**角色**: 经理
**触发条件**: 员工已完成自评（SELF_EVALUATED）
**前置条件**: 当前用户是该员工的直接经理

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi/team`，选择已自评的员工 | 展示员工自评结果和 KPI 详情 |
| 2 | 对每条 KPI 评分（0-100）和填写评语 | 实时保存 |
| 3 | 填写整体经理评语 | 保存成功 |
| 4 | 评定建议等级（proposedGrade）并提交 | 考核状态变为 MANAGER_EVALUATED |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 员工未完成自评 | 步骤 1 | 可查看但评估入口置灰，提示"等待员工自评" |
| 当前用户不是该员工的经理 | 步骤 1 | 团队列表不展示该员工 |
| 评分超出 0-100 范围 | 步骤 2 | 字段级校验，阻止保存 |

**结束状态**: 考核状态为 MANAGER_EVALUATED，proposedGrade 已记录

---

### UJ-006a: 员工配置 360 评估人

**角色**: 员工
**触发条件**: 周期处于 EVALUATING
**前置条件**: 已有 360 模板

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/kpi` 或 `/performance/360` | 可见"配置 360 评估人"入口 |
| 2 | 点击添加评估人 | 弹出人员选择器 |
| 3 | 选择评估人并指定关系类型（上级/同级/下级/跨部门） | 评估人列表更新 |
| 4 | 确认配置完成 | 评估人收到待评估任务 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 未配置 360 模板 | 步骤 1 | 提示"请联系 HR 配置评估模板" |
| 周期不在 EVALUATING 阶段 | 步骤 1 | 配置入口不可见 |

**结束状态**: 评估人列表已配置，评估人在 360 页面可见待评估任务

---

### UJ-006b: 评估人填写 360 评估

**角色**: 评估人（任何被指定的员工或经理）
**触发条件**: 被他人指定为 360 评估人
**前置条件**: 评估任务状态为 PENDING

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/360`，看到待评估任务 | 展示被评估人信息和评估维度 |
| 2 | 按模板维度逐项打分 | 分数输入校验 |
| 3 | 填写评语 | 保存成功 |
| 4 | 提交评估 | 任务状态变为 COMPLETED |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 同一评估人重复提交 | 步骤 4 | 提示"已提交，不可重复操作" |
| 维度分数未全部填写 | 步骤 4 | 阻止提交，高亮未填维度 |

**结束状态**: 评估任务完成，结果匿名自动汇总可见（被评估人可在 360 页面查看汇总得分）

---

### UJ-007: 校准等级

**角色**: HR
**触发条件**: 周期处于 CALIBRATING
**前置条件**: 评估数据已就绪

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/calibration` | 展示校准看板，按部门筛选 |
| 2 | 查看当前等级分布 | 展示分布图和员工列表 |
| 3 | 选择需要调整的员工，修改等级 | 弹出调整表单 |
| 4 | 填写调整原因并确认 | 等级更新，调整日志生成 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 未填写调整原因 | 步骤 4 | 阻止提交，提示原因必填 |
| 周期不在 CALIBRATING 阶段 | 步骤 1 | 页面只读，调整按钮不可见 |
| 两人同时调整同一员工 | 步骤 4 | 后提交者覆盖（last-write-wins），两条调整日志均保留 |

**结束状态**: 等级调整完成，调整日志页面可查看调整记录和原因

---

### UJ-008a: HR 发布结果

**角色**: HR
**触发条件**: 校准完成，HR 将周期推进到 CONFIRMING
**前置条件**: 周期处于 CONFIRMING 阶段

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/results/admin` | 展示结果列表（员工、等级、状态） |
| 2 | 点击"发布"（可批量或单个） | 确认对话框 |
| 3 | 确认发布 | 结果发布成功，员工可查看 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 周期不在 CONFIRMING 阶段 | 步骤 1 | 发布按钮不可见 |

**结束状态**: 结果已发布，员工在 `/performance` 个人概览可见最终等级

---

### UJ-008b: 员工确认/申诉结果

**角色**: 员工
**触发条件**: 绩效结果已发布
**前置条件**: 结果状态为 PENDING（已发布未确认）

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance` 查看绩效结果 | 展示最终等级和评语 |
| 2 | 点击"确认"或"申诉" | 确认→状态变 CONFIRMED；申诉→弹出原因输入 |
| 3 | （申诉时）填写申诉原因（≥10 字符）并提交 | 状态变为 APPEALED |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 申诉原因为空或过短（<10 字符） | 步骤 3 | 阻止提交，提示需填写详细原因 |
| 结果未发布 | 步骤 1 | 结果区域不展示或提示"结果尚未发布" |
| 已确认/已申诉（重复操作） | 步骤 2 | 按钮置灰，显示已操作状态 |

**结束状态**: 结果状态为 CONFIRMED 或 APPEALED，HR 在结果管理页可见状态变化

---

### UJ-009: 查看统计报表

**角色**: HR
**触发条件**: 已有已完成周期
**前置条件**: 用户具有统计分析权限

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/analytics` | 展示报表页面 |
| 2 | 选择周期和部门 | 加载对应数据 |
| 3 | 查看部门等级分布和统计指标 | 展示分布图和数据表 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 无已完成周期 | 步骤 1 | 展示空数据态"暂无统计数据，请先完成至少一个绩效周期" |
| 无权限 | 步骤 1 | 侧边栏不展示统计分析入口 |

**结束状态**: 报表已按所选周期/部门加载完成，页面展示等级分布图和统计指标

---

### UJ-010a: 管理等级配置

**角色**: HR
**触发条件**: 日常维护
**前置条件**: 用户具有等级配置管理权限

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/settings/grades` | 展示等级配置列表 |
| 2 | 点击"创建配置" | 弹出表单 |
| 3 | 填写配置名称、各等级（代码/名称/分数区间/颜色） | 表单校验 |
| 4 | 保存 | 配置出现在列表中 |
| 5 | （可选）设为默认 | 默认标记更新 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 等级代码重复 | 步骤 4 | 阻止保存，提示代码唯一 |
| 分数区间重叠或未覆盖 0-100 | 步骤 4 | 阻止保存，提示分数区间错误 |
| 删除已被周期引用的配置 | 删除操作 | 阻止删除，提示已被引用 |

**结束状态**: 配置列表更新，新配置可在创建周期时选择

---

### UJ-010b: 管理 360 模板

**角色**: HR
**触发条件**: 日常维护
**前置条件**: 用户具有 360 模板管理权限

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/settings/360-templates` | 展示模板列表 |
| 2 | 点击"创建模板" | 弹出表单 |
| 3 | 定义模板名称、评估维度（中英文名称和描述）、可用关系类型 | 表单校验 |
| 4 | 保存 | 模板出现在列表中 |
| 5 | （可选）设为默认 | 默认标记更新 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 删除已被使用的模板 | 删除操作 | 阻止删除，提示已被引用 |

**结束状态**: 模板列表更新，员工配置 360 评估人时可选该模板

---

### UJ-010c: 管理战略目标

**角色**: HR
**触发条件**: 日常维护
**前置条件**: 用户具有战略目标管理权限

**正常路径**:

| 步骤 | 用户操作 | 系统响应 |
|------|---------|---------|
| 1 | 进入 `/performance/strategic-objectives` | 展示目标列表（按周期筛选） |
| 2 | 点击"创建目标" | 弹出表单 |
| 3 | 填写名称、描述、排序 | 表单校验 |
| 4 | 保存 | 目标出现在列表中 |
| 5 | 行内编辑目标信息 | 实时保存 |
| 6 | 分配到部门和员工 | 分配关系更新 |

**异常分支**:

| 条件 | 触发时机 | 系统行为 |
|------|---------|---------|
| 名称为空 | 步骤 4 | 阻止保存，提示必填 |

**结束状态**: 目标列表更新，HR 可在战略目标页面查看和管理所有目标
