ソースを参照

docs: 新增手术观测台全链路重构设计

wangkangyjy 2 週間 前
コミット
7efa94e522

+ 663 - 0
docs/superpowers/specs/2026-07-06-surgical-observatory-fullstack-redesign.md

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

BIN
docs/superpowers/specs/assets/2026-07-06-surgical-observatory.png