# OKR 绩效系统全链路重构设计

**日期**：2026-07-06
**状态**：已确认
**视觉方向**：Surgical Observatory / 手术观测台
**适用范围**：全部 Web 页面、必要的后端接口与 SQLite 数据迁移

![手术观测台视觉方向](./assets/2026-07-06-surgical-observatory.png)

## 1. 目标

本轮重构不只统一视觉，而是以前端体验为出发点，重新梳理 OKR 制定、审核、执行、绩效评审、面谈、确认与申诉的完整闭环。

完成后系统应具备以下特征：

- 呈现高端科技公司、AI 智慧医疗、优雅克制的产品气质。
- 使用深色科技外壳和冷白临床数据工作区。
- 保持高信息密度，同时通过网格、留白、字重和分隔线建立秩序。
- 用户始终知道当前周期、当前阶段、待办事项和下一步操作。
- 前端不再重复拼装周期、权限和流程状态。
- 后端接口直接支持页面工作流，必要时允许新增接口、字段和表。
- 现有 SQLite 数据必须无损保留。
- 保持单 JAR 部署方式。

## 2. 硬性约束

### 2.1 业务约束

- 周期主状态机保持：

  `DRAFT → OKR_ALIGN → EXECUTING → ASSESSING → ARCHIVED`

- OKR 评分满分 60。
- 绩效维度评分满分 40。
- 加分、扣分和等级规则保持当前实现。
- 权限继续以组织上下级关系为主，`SUPER_ADMIN` 保留绕过能力。
- 历史归档数据不可因模板、组织或目标后续变更而失真。
- 评分修正必须进入 `audit_correction`，不得覆盖审计历史。

### 2.2 技术约束

- 前端继续使用 Vue 3、Vite、Pinia、Element Plus。
- 后端继续使用 Spring Boot、MyBatis-Plus、SQLite。
- 不使用外部 CDN。
- 字体、图标和静态资源必须打包进单 JAR。
- 新接口优先以增量方式加入；旧接口在前端迁移完成前继续可用。
- 数据库变化必须通过 `schema_migration` 前向迁移。

## 3. 视觉系统

### 3.1 核心气质

设计关键词：

- 临床仪器般精确
- 科研工作台
- 冷静、可信、可追溯
- AI 辅助而非 AI 炫技
- 数据优先

禁止以下表现：

- 紫蓝大渐变铺满内容区
- 营销式大标题和口号
- 卡片套卡片
- 大量胶囊标签
- 霓虹发光和模糊光斑
- 无业务含义的装饰图形
- Unicode 几何字符和 emoji 充当图标
- 无数据支持的“AI 诊断”文案

### 3.2 色彩

| 用途 | 建议值 | 规则 |
|---|---:|---|
| 外壳最深色 | `#120d4a` | 主导航轨、底部账户区 |
| 外壳基础色 | `#1d166b` | 上下文导航 |
| 品牌主色 | `#2b1f99` | 主要操作、关键选中态 |
| 医疗青 | `#3ad4d8` | 流程连线、实时状态、聚焦 |
| 页面背景 | `#f5f8fa` | 冷白微蓝灰 |
| 主表面 | `#ffffff` | 表格和主要工作区 |
| 次级表面 | `#f8fafc` | 表头、分组、只读区 |
| 主文字 | `#18212f` | 标题、主要数据 |
| 次级文字 | `#5f6b7a` | 说明和次要数据 |
| 边界 | `#dfe7ee` | 控件、区段和表格边界 |

品牌主色只承担关键动作和选中态；医疗青只承担流程、实时状态和交互焦点。警告、危险、成功继续使用语义色，不使用品牌色替代业务状态。

### 3.3 字体与图标

- 中文：本地子集化的思源黑体。
- 英文和数字：IBM Plex Sans。
- UI 最多使用两套字体。
- 正文基准 14px。
- 表头、状态和字段标签为 10–11px。
- 页面标题控制在 18–22px，不使用营销式超大标题。
- 图标优先复用 `@element-plus/icons-vue`。
- 若现有图标缺失，只补充一个风格统一、可本地打包的成熟图标库。

### 3.4 间距、圆角和层级

- 间距阶梯：4、8、12、16、24、32px。
- 控件圆角：4px。
- 普通面板圆角：6px。
- 抽屉、弹窗圆角上限：8px。
- 状态默认使用色点加文字，不默认使用胶囊。
- 普通内容区不使用阴影。
- 阴影只用于弹窗、抽屉、下拉和确实发生遮挡关系的浮层。

### 3.5 动效

- 时长控制在 140–180ms。
- 只使用淡入、轻微位移、尺寸和透明度变化。
- 禁止弹跳、弹性和持续循环动画。
- 支持 `prefers-reduced-motion`。
- 页面加载采用骨架屏，不使用通用旋转加载图标占据主视觉。

## 4. 全局壳层与信息架构

### 4.1 双层导航

桌面端采用选中视觉稿中的双层导航：

- 64px 主导航轨：只展示产品一级模块和图标。
- 176px 上下文导航：展示当前一级模块内的页面。
- 上下文导航允许折叠。

一级模块：

1. 工作台
2. 目标与对齐
3. 绩效评审
4. 系统管理

二级页面映射：

| 一级模块 | 二级页面 |
|---|---|
| 工作台 | 当前周期、我的待办、团队风险 |
| 目标与对齐 | 我的 OKR、团队 OKR、OKR 对齐、执行进度 |
| 绩效评审 | 我的绩效、待我评审、绩效沟通、绩效申诉、历史绩效 |
| 系统管理 | 考核周期、组织架构、绩效模板、考核维度、操作日志 |

通知从独立主导航项调整为系统状态线入口，保留原有通知页面和深链接。

### 4.2 系统状态线

页面顶部使用 36px 状态线，展示：

- 当前周期和阶段
- 系统状态
- 未读通知
- 当前用户和账户菜单

### 4.3 页面上下文栏

每个页面使用统一的 `PageContextBar`：

- 页面标题
- 当前对象
- 当前周期
- 筛选条件
- 主要操作

标题、周期、状态和主要操作不再散落于独立 hero、横幅或卡片中。

### 4.4 响应式

- `≥1280px`：完整双层导航。
- `1024–1279px`：主导航轨常驻，上下文导航收起为弹出面板。
- `<1024px`：导航使用抽屉，工作台矩阵降级为纵向分组。
- 表格优先保留关键列，次要字段进入行详情，不直接压缩到不可读。

## 5. 统一工作台

登录后默认进入新增的工作台页面，不再直接进入周期列表。

工作台包含：

- 当前周期阶段轨道
- 周期剩余时间
- 我的待办
- 团队完成率
- 待审核事项
- 阻塞和风险项
- 近期截止节点

待办类型：

- 制定或修改 OKR
- 审核下属 OKR
- 更新 KR 进度
- 提交自评
- 完成终评
- 发布结果
- 记录或回复面谈
- 确认结果
- 处理申诉

点击待办必须直接进入具体周期、人员和业务对象，不允许只跳到泛列表页。

## 6. 全局周期上下文

新增 Pinia `workspace` store，统一维护：

- 当前周期
- 可选周期
- 当前阶段
- 当前用户在该阶段的待办
- 当前页面允许执行的动作

规则：

- URL 中的 `periodId` 是可分享、可刷新的最终来源。
- URL 未提供 `periodId` 时，使用 store 中最近选择的有效周期。
- store 也无有效值时，使用后端返回的推荐周期。
- 切换周期时同步更新 URL，并刷新当前页面业务数据。
- 页面不得自行重复实现“过滤非归档周期”“默认选择第一个周期”等逻辑。

## 7. OKR 全链路设计

统一流程：

`周期发布 → 上级目标 → 我的制定 → 上级审核 → 执行更新 → 进入考评`

### 7.1 我的 OKR

采用三段式工作台：

- 左侧：上级目标和必须承接的 KR。
- 中央：我的 O/KR 编辑与结果表格。
- 右侧检查器：权重、对齐关系、字段问题和提交条件。

能力：

- 保存草稿
- 继续编辑
- 正式提交
- 查看驳回原因
- 重新提交
- 执行阶段更新 KR

提交前检查：

- O 标题有效
- KR 数量符合规则
- KR 权重合计为 100
- 必须承接的 KR 已建立来源关系
- 所有 KR 具备目标值

### 7.2 团队 OKR

使用列表和详情分栏：

- 左侧按“待审核、未提交、已驳回、阻塞、正常”排序。
- 中央展示选中人员的 O/KR。
- 右侧展示对齐、权重、阻塞和审核上下文。

驳回必须填写原因。通过操作需要明确展示被审核的人员和目标数量。

### 7.3 OKR 对齐

使用树形矩阵：

- 层级编号
- 目标类型
- 对齐度
- KR 进度
- 负责人
- 状态

右侧检查器展示：

- 目标详情
- 负责人
- 关键结果
- 来源和下游承接关系
- 孤立状态
- 风险项
- 当前可执行操作

### 7.4 执行进度

个人和团队 KR 使用统一数据矩阵。

点击 KR 行打开详情抽屉：

- 当前值和目标值
- 状态
- 更新备注
- 完整进度历史
- 来源 KR
- 下游承接目标

## 8. 绩效评审闭环

统一流程：

`员工自评 → 上级终评 → 发布结果 → 面谈反馈 → 员工确认或申诉 → 归档`

### 8.1 我的绩效

同一页面承载：

- 自评表单
- 自评已提交状态
- 终评结果
- 面谈反馈
- 结果确认
- 申诉入口

页面根据 `workflowState` 只突出当前主操作，其他历史阶段以只读方式折叠展示。

### 8.2 评审中心

采用选中视觉稿的核心布局：

- 左侧：员工评审队列。
- 中央：证据、自评、终评三列矩阵。
- 右侧：偏差和缺失证据检查器。
- 底部：固定总分、差异、评语和提交操作。

诊断规则必须基于真实数据，例如：

- 自评和终评差异超过阈值
- KR 完成率与评分明显不匹配
- 缺少绩效说明
- 存在阻塞 KR
- 加减分没有说明

### 8.3 绩效沟通

面谈记录必须绑定：

- 周期
- 员工
- 上级
- 对应终评分

上级记录亮点、问题、改进建议和面谈纪要；员工提交回复后，上级可以关闭面谈。

### 8.4 申诉与修正

申诉详情同时展示：

- 原始终评分
- 终评明细
- 面谈记录
- 申诉理由
- 处理回复
- 修正记录

任何修正都必须填写原因并写入 `audit_correction`。

### 8.5 历史绩效

提供正式历史接口，一次返回最近周期结果，不再由前端逐周期调用单期结果接口。

## 9. 页面组件体系

新增或重构以下通用组件：

| 组件 | 职责 |
|---|---|
| `AppShell` | 双层导航、状态线和响应式外壳 |
| `ModuleRail` | 一级模块图标导航 |
| `ContextNav` | 模块内二级页面导航 |
| `PageContextBar` | 标题、周期、筛选和主操作 |
| `WorkflowRail` | OKR—绩效阶段轨道 |
| `SplitWorkbench` | 列表、主区、详情检查器布局 |
| `DataMatrix` | 表格、树表、评分矩阵基础 |
| `InspectorPanel` | 右侧上下文详情 |
| `StickyActionBar` | 总分、差异、状态和提交 |
| `StatusLabel` | 色点与状态文字 |
| `MetricBar` | 进度和分数构成 |
| `EmptyState` | 无数据和下一步指引 |
| `ErrorState` | 可恢复错误 |
| `SkeletonState` | 页面加载状态 |

页面归入四类：

1. 数据浏览：周期、历史、日志、通知。
2. 分栏工作台：对齐、团队 OKR、评审、沟通、组织。
3. 编辑配置：个人 OKR、绩效模板、考核维度。
4. 结果详情：我的绩效、申诉、归档结果。

## 10. 接口设计

### 10.1 工作台概览

新增：

`GET /api/workspace/overview?periodId={id}`

响应包含：

- 推荐周期和可选周期
- 当前阶段
- 我的待办
- 团队汇总
- 风险汇总
- 近期节点
- `allowedActions`

### 10.2 OKR 工作台

新增：

`GET /api/okr/workbench?periodId={id}`

响应包含：

- 我的目标
- 上级目标
- 待审核目标
- 必须承接项
- 提交检查结果
- `workflowState`
- `allowedActions`
- `version`

新增或扩展写接口：

- 保存草稿
- 正式提交
- 审核通过
- 驳回并记录原因
- 更新 KR 进度

所有写接口使用明确 DTO，并校验版本号。

### 10.3 评审工作台

新增：

- `GET /api/scores/review-queue?periodId={id}`
- `GET /api/scores/history`

扩展现有评分详情响应，一次返回：

- OKR 证据
- 自评分
- 终评分
- 评分明细
- 面谈
- 申诉
- 诊断
- `workflowState`
- `allowedActions`
- `version`

### 10.4 错误协议

业务错误继续使用统一响应结构，并补充：

- `code`
- `message`
- `fieldErrors`
- `details`
- `conflictVersion`

版本冲突返回 HTTP 409。

## 11. 数据模型

### 11.1 评分明细表

新增 `performance_score_item`：

| 字段 | 说明 |
|---|---|
| `id` | 主键 |
| `score_id` | 对应 `performance_score` |
| `item_type` | `KR` 或 `DIMENSION` |
| `reference_id` | KR 或维度 ID |
| `name` | 提交时名称快照 |
| `max_score` | 满分或权重基准 |
| `score` | 实际评分 |
| `description` | 说明或评语 |
| `sort_order` | 展示顺序 |
| `snapshot_json` | 必要的证据快照 |
| `created_at` | 创建时间 |
| `updated_at` | 更新时间 |

`comments_json` 继续保留，作为兼容字段和历史快照。

### 11.2 状态

终评分状态明确为：

`SUBMITTED → PUBLISHED → CONFIRMED`

面谈和申诉继续独立维护状态，但通过周期、用户和终评分建立可靠关联。

### 11.3 索引

补充高频查询索引：

- 周期 + 用户 + 类型
- 周期 + 评分状态
- 评分明细 + 评分 ID
- OKR 周期 + 用户
- KR 来源关系
- 通知用户 + 未读状态

## 12. 数据迁移

迁移延续现有 `schema_migration`。

要求：

1. 启动时检测待执行迁移。
2. 执行前将数据库备份到 `data/backups/`。
3. 每个迁移在独立事务内运行。
4. 失败时整体回滚并阻止应用继续启动。
5. 迁移只新增表、字段、索引或安全回填。
6. 不删除历史字段。
7. 将可解析的 `comments_json` 回填到 `performance_score_item`。
8. 无法解析的 JSON 原样保留并记录迁移日志。
9. 回填后校验记录数量和评分总分。

迁移必须使用包含旧结构和历史数据的数据库副本进行测试。

## 13. 前端状态与数据流

数据流分三层：

1. API 层负责请求和响应规范化。
2. Pinia store 负责全局周期、用户、待办和权限上下文。
3. 页面只负责局部筛选、编辑状态和展示。

页面不得：

- 自行推断跨模块权限。
- 重复实现周期默认选择。
- 直接解析多个版本的后端返回结构。
- 用多个接口拼装同一工作台首屏。

写操作完成后，优先局部更新当前对象；涉及阶段、待办或权限变化时刷新工作台上下文。

## 14. 错误和边界状态

- 字段错误在控件附近显示。
- 全局消息只用于跨页面结果或不可定位错误。
- 409 版本冲突展示新旧版本差异和刷新入口。
- 403 展示权限状态，不显示空白页面。
- 无数据状态明确说明原因和下一步。
- 接口失败提供重试。
- 危险操作展示受影响周期、人员和数据数量。
- 归档状态全部只读。

## 15. 验证策略

### 15.1 后端

- 服务单元测试
- 周期状态机测试
- 权限测试
- 接口契约测试
- 评分口径测试
- 历史数据库迁移测试
- 迁移失败回滚测试

### 15.2 前端

- Vitest 组件测试
- Pinia 状态测试
- API 响应规范化测试
- 主题 token 守卫
- 评分契约守卫
- 响应式布局检查

### 15.3 端到端

使用 Playwright 覆盖：

1. 周期发布
2. 上级制定和下级承接
3. OKR 提交、驳回、修改和通过
4. KR 进度更新
5. 员工自评
6. 上级终评和发布
7. 面谈和员工回复
8. 结果确认
9. 申诉和审计修正
10. 历史归档查看

### 15.4 交付验证

- 前端生产构建成功。
- 后端测试通过。
- 单 JAR 构建成功。
- 静态资源与前端构建产物一致。
- 新数据库可初始化。
- 历史数据库可无损迁移并启动。

## 16. 实施阶段

### 阶段 1：基础壳层

- 字体和设计 token
- 双层导航
- 页面上下文栏
- 全局周期 store
- 工作台概览接口和页面

### 阶段 2：OKR 链路

- 我的 OKR
- 团队 OKR
- OKR 对齐
- 执行进度
- OKR 聚合接口和版本控制

### 阶段 3：绩效链路

- 我的绩效
- 评审中心
- 绩效沟通
- 申诉
- 历史绩效
- 评分明细表和迁移

### 阶段 4：管理页面

- 周期管理
- 组织架构
- 绩效模板
- 考核维度
- 通知
- 操作日志

### 阶段 5：全链路验收

- 端到端测试
- 历史数据迁移
- 响应式检查
- 单 JAR 部署验证

每个阶段独立提交并保持可回退。

## 17. 完成标准

- 全部页面使用统一壳层、组件和视觉 token。
- 所有页面能明确展示当前周期和阶段。
- 所有关键操作可以从工作台待办直达。
- OKR 和绩效链路不存在依赖用户手动跨页面寻找下一步的断点。
- 前端不再通过多次串行请求拼装工作台首屏。
- 前后端评分口径一致。
- 历史绩效通过正式接口查询。
- 评分明细结构化存储并兼容旧 JSON。
- 历史 SQLite 数据迁移前有备份，迁移失败可回滚。
- 关键业务链路具备自动化测试。
- 最终产物可作为单 JAR 运行。

## 18. 非目标

- 不引入与当前业务无关的 AI 聊天功能。
- 不新增没有数据来源的预测和诊断。
- 不修改评分口径。
- 不切换数据库或部署架构。
- 不在本轮引入深色内容主题。
- 不重写与目标无关的后端模块。
