2026-07-06-surgical-observatory-fullstack-redesign.md 17 KB

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

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

手术观测台视觉方向

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