# OKR 绩效系统 · 前端去 AI 味改造 v2（信息架构重构）

**日期**：2026-06-20
**作者**：ZCode（基于与产品负责人 wangkangyjy 的头脑风暴）
**状态**：待审查
**前置规格**：`2026-06-18-flow-audit-and-medtech-ui-design.md`（v1，已完成 token 化与反模式清理）

---

## 0. 背景与任务范围

v1 已完成「表面反模式清理」（去 emoji、去硬编码色、token 化、verify 脚本守卫），两轮 GPT 迭代后验收脚本全部通过。但**用户反馈「AI 味基本没改掉」**。

**根因诊断**：AI 味不在代码规范层（那层已经干净），而在**信息架构层**——营销式 hero 标题区、彩色胶囊徽章、情感化引导卡、低密度卡片堆叠。GPT 迭代只动了视觉层（style），没动信息架构（template 结构），所以效果等于没改。

本规格（v2）是 v1 之后的**第二阶段**：在已干净的 token 基础上，**重构 5 个样板页的信息架构**，从「讲故事」转向「看数据」，达成用户选定的 **D 风格 = AI 科研外壳 + 临床数据内核**。

**已确认的决策**（来自头脑风暴）：
- 风格：D = AI 科研外壳（留白克制、下划线式输入、大写小字标签）+ 临床数据内核（表格化、高密度、对照式）
- 力度：B = 中度重构（重排信息架构，视觉 token 只增不改，更新 verify 脚本断言）
- 范围：v1 的 5 个样板页（LoginView / MainLayout / MyOkrView / ScoringEditView / MyResultView）
- MyOkrView 进度更新入口：侧边抽屉（保持表格干净）
- ScoringEditView：三列对照（证据 · 自评分 · 终评），保留「自评 vs 终评差异」提示
- MyResultView：删等级圆环，改数据条构成 + 历史趋势；自评表单态保持现状（只改结果态）
- LoginView：全屏左右分栏（左深色品牌区 + 右白表单），下划线式输入框

**不在本次范围（YAGNI）**：
- 不动其余 ~10 个页面（视觉可能与新样板页有轻微脱节，待样板页验收后再决定是否套用）
- 不改业务逻辑、API、数据库
- 不引入图标库依赖（几何图标用内联 SVG 或 unicode 几何字符）
- 不做深色模式

---

## 1. 设计语言定义（D 风格的具体化）

### 1.1 信息架构原则

| 原则 | 含义 | 反模式（禁止） |
|---|---|---|
| **工具栏顶栏** | 标题降级进顶部工具栏，和周期/状态/操作挤一行 | ❌ 独立的大标题 hero 区 |
| **表格化数据** | O/KR、评分项用表格/网格行展示，一屏看全 | ❌ 大卡片纵向堆叠 |
| **对照式布局** | 评分页三列对照（证据·自评·终评），结果页自评vs终评 | ❌ 左右两栏各说各话 |
| **数字优先** | 进度用 `72%` + `21600/30000`，状态用色点 | ❌ 渐变进度条、彩色胶囊 tag |
| **区段用色带标题** | OKR/绩效区段用 1 行医疗青小标题分隔 | ❌ 大卡片包裹 + section 胶囊徽章 |
| **大写小字标签** | 表头、字段名用 uppercase + letter-spacing 0.5px | ❌ 营销式副标题口号 |

### 1.2 theme.css 增量 token（只增不改）

```css
:root {
  /* 已有 token 全部保留，以下为 v2 新增 */

  /* 数据表格系统 */
  --table-row-height: 40px;
  --table-row-height-compact: 32px;
  --table-header-bg: var(--color-surface-subtle);
  --table-row-hover: var(--color-surface-muted);
  --table-row-group-bg: var(--color-surface-tint-brand);  /* O 分组行浅底 */
  --table-border: var(--color-border-soft);

  /* 工具栏顶栏 */
  --toolbar-height: 48px;
  --toolbar-bg: var(--color-surface-subtle);
  --toolbar-border: var(--color-border);

  /* 状态色点（6px 圆点，替代彩色 tag） */
  --dot-size: 6px;

  /* 区段色带标题 */
  --section-band-bg: var(--color-surface-tint-info);
  --section-band-color: var(--color-medical);
  --section-band-font-size: 11px;
  --section-band-letter-spacing: 0.3px;

  /* 大写小字标签（表头/字段名） */
  --label-uppercase: uppercase;
  --label-letter-spacing: 0.5px;
  --label-font-size: 10px;

  /* 侧边栏 v2 加深 */
  --color-sidebar-bg: #1d166b;   /* 从 #2b1f99 加深 */

  /* 登录页品牌区渐变 */
  --color-login-brand-from: #1d166b;
  --color-login-brand-to: #120d4a;
}
```

### 1.3 新增通用组件（在 components.css 注册）

- `.data-toolbar` — 工具栏顶栏容器（替代 page-hero）
- `.data-table` — 表格化数据容器（O 分组行 + KR 缩进子行）
- `.section-band` — 区段色带标题（替代 section-head 胶囊）
- `.status-dot` — 6px 状态色点（替代 effect="dark" round tag）
- `.metric-bar` — 水平数据条（构成展示，如 OKR 81%）
- `.uppercase-label` — 大写小字标签
- `.side-drawer` — 侧边抽屉（KR 详情/进度更新）
- `.compare-grid-3` — 三列对照网格（评分页）

---

## 2. 五个样板页改造蓝图

### 页面 1：MyOkrView（我的 OKR）— 改动最大

**核心**：从「卡片堆叠」改为「工具栏 + 表格化 O/KR 视图」。

#### 结构变更

```
当前：page-hero → state-banner → rules-card → section-head(胶囊) → okr-card × N
目标：data-toolbar(标题+周期+状态+操作) → data-table(O分组行+KR缩进行)
      → 空态用工具栏按钮引导（不用大引导卡）
```

#### data-toolbar 顶栏（替代 hero）
- 左：页面标题（13px 600）+ 分隔符 + 周期名 + 状态色点标签
- 右：距周期结束天数 + 主操作按钮（"制定 OKR" / "更新进度"）

#### data-table 表格列定义

| 列 | 内容 | 宽度 |
|---|---|---|
| 标识 | O1/O2（分组行，accent 色）或 `└`（KR 缩进行） | 28px |
| 标题 | O 标题（加粗）/ KR 标题（次要色） | flex |
| 权重 | 仅 KR 行（40/35/25） | 44px |
| 进度 | 仅 KR 行，百分比（brand 色 600） | 60px |
| 当前/目标 | 仅 KR 行，`21600/30000` | 90px |
| 状态 | 色点（●进行中/●阻塞/●完成） | 56px |

- O 行：浅底（`--table-row-group-bg`），显示 O 标题 + 整体进度 + 整体状态点
- KR 行：缩进 28px，前缀 `└`，次要文字色
- 点击 O 行：展开/折叠 KR（默认展开）
- 点击 KR 行：打开**侧边抽屉**（KR 详情 + 进度历史 + 更新进度表单）

#### 四个状态分支的处理

| 周期状态 | 表格内容 | 特殊处理 |
|---|---|---|
| OKR_ALIGN（有 myOkr） | 表格只读展示 | 顶部工具栏「编辑 OKR」按钮 → 现有 dialog |
| OKR_ALIGN（无 myOkr） | 空态 | 工具栏「制定 OKR」按钮，表格区显示极简空态文案（不用大引导卡） |
| EXECUTING | 表格 + KR 可更新进度 | 点 KR 行 → 抽屉内 input-number 更新 |
| ASSESSING | 表格只读 | 工具栏提示「去完成绩效自评」按钮 |

#### 删除清单
- `page-hero` / `hero-info`
- `section-badge.personal/.superior/.review`（胶囊徽章）
- `section-head` 整个结构
- `hint-card`（大图标引导卡）→ 改工具栏按钮 + 表格空态
- `okr-card` / `okr-grid`（卡片容器）
- KR 行内联的 input-number + el-select + 更新按钮 → 移入抽屉
- 所有 `effect="dark" round` 的 el-tag

#### 上级 OKR 对齐区（OKR_ALIGN 且无 myOkr 时）
- 上级 OKR 也表格化展示，KR 行标注「指派给我」（用 accent 淡底小标签，非胶囊）
- 待审核 OKR（pendingReviews）同样表格化，「操作」列放通过/驳回

---

### 页面 2：ScoringEditView（绩效评分）— 三列对照

**核心**：从「左右两栏分散卡片」改为「三列对照表：证据 · 自评分 · 终评」。

#### 结构变更

```
当前：page-hero → review-workbench(evidence-panel | decision-panel)
目标：data-toolbar(考评+员工+周期+提交) → compare-grid-3(证据 | 自评分 | 终评)
      → 区段色带分隔 OKR/绩效/加减分 → 底部固定总览栏
```

#### 三列对照网格（compare-grid-3）

| 左列（证据·员工自评） | 中列（自评分） | 右列（你的终评） |
|---|---|---|
| KR 标题 + 实际进度 + 完成率 + 阻塞天数 | 员工自评分数（13px 700） | 终评下拉（卓越/良好/达标分级） |

- 列宽：`1.4fr 70px 1fr`
- OKR 区段：每条 KR 一行三列对照
- 绩效区段：每个维度一行三列对照
- 加减分行：对照展示

#### 区段色带标题（section-band）
- 医疗青底（`--section-band-bg`）+ 医疗青字（`--color-medical`）
- 文案：「OKR 目标达成 · 满分 60」「绩效维度 · 满分 40」
- 替代当前的大卡片 panel-head

#### OKR 进度日志
- 当前左侧的「更新记录」列表 → 移入点击 KR 行展开的折叠区（或抽屉）
- 表格主区只保留 KR 摘要 + 完成率，保持高密度

#### 底部固定总览栏
- 吸附在底部（`position: sticky; bottom: 0`）
- 内容：终评总分（20px 700）+ 等级标签（色点+字母）+ **「自评 83.5 · 差异 −2.3」**
- 替代当前右上角的 result-preview 渐变卡

#### 自评 vs 终评差异提示（新功能）
- 差异 = 终评总分 − 自评总分
- |差异| ≥ 10 时：总览栏差异文字变 warning 色 + tooltip「打分偏差较大，建议复核」
- 联动诊断报告严重-3（自评与终评一致性校验）的 UI 解法

#### 响应式降级
- ≥1280px：三列对照
- <1280px：降级为「证据在上 + 打分在下」堆叠，但每行仍保留「自评 X → 终评 Y」对照信息

#### 删除清单
- `page-hero` / `hero-info`
- `evidence-panel` / `decision-panel` 大卡片容器（改为 compare-grid-3 网格）
- `okr-record-card` / `orr-kr-card` 嵌套卡片
- `self-block` / `self-total-bar` 分散块（合并进对照表）
- `result-preview` 渐变卡（改底部总览栏）
- 所有 `effect="dark" round` 的 el-tag

---

### 页面 3：MyResultView（我的绩效结果）— 删圆环，建数据视图

**核心**：删 conic-gradient 等级圆环，改为「数据卡 + 构成条 + 历史趋势」。

**注意**：自评表单态（showSelfForm 为 true 时）**保持现状不动**，本规格只改结果展示态。

#### 结构变更（结果态）

```
当前：page-hero → score-hero(grade-ring + 渐变) → score-breakdown 卡片 → 操作按钮(✓💬)
目标：data-toolbar → result-grid(左大数字+等级 | 右构成条)
      → 自评vs终评对照行 → 操作栏 → 历史趋势条形图
```

#### result-grid 主结果区（两栏）
- 左栏（200px 固定）：
  - 「本期终评」大写小字标签
  - 总分大数字（40px 700）
  - 等级标签（色点 + 字母 A + 描述）
  - 「较上期 ▲+5.2 分」（需历史数据，无历史时显示「首次考评」）
- 右栏（flex）：
  - 「得分构成」大写小字标签
  - 4 行 metric-bar：OKR / 绩效 / 加分 / 扣分
  - 每行：标签 + 分数（48.5 / 60）+ 水平进度条（81% 填充）

#### 自评 vs 终评对照行
- 三列网格：OKR / 绩效 / 总分
- 每列：「自评 50.0 → 终评 48.5」

#### 历史趋势条形图（底部）
- 展示最近 4 期成绩，本期高亮（brand 色），其余灰色
- 高度 48px 的 mini bar chart
- **数据源已确认缺失**：当前 API 仅有 `scoreApi.getMyResult(periodId)`（单期）和 `getKrHistory`（KR 进度历史），**无「我的历史绩效列表」接口**。
- **实施方案（前端兜底，不新增后端接口）**：
  - 方案一（推荐）：前端轮询 `scoreApi.getMyResult(periodId)`，需要历史周期 ID 列表 → 由 `periodApi.list()` 取最近 4 个已归档周期，逐个查 `getMyResult`。N+1 查询但数据量小（最多 4 次），可接受。
  - 方案二：若轮询成本过高或数据缺失，**隐藏趋势区**，显示空态文案「暂无历史成绩」，不阻塞页面。
  - 实现时优先尝试方案一，失败回退方案二。**本规格不新增后端接口**（保持「不动后端」边界）。

#### 操作栏
- 三个等宽按钮：「确认结果」「提起申诉」「查看面谈记录」
- 扁平化：边框 + 文字，确认态用 brand 淡底高亮
- 删除 ✓ 💬 emoji

#### 删除清单
- `page-hero` / `hero-info`
- `score-hero` 整个区（含 conic-gradient grade-ring + linear-gradient 背景）
- `grade-ring` / `grade-letter` 圆环组件
- `score-breakdown` 卡片（改 metric-bar）
- emoji 按钮文案
- `effect="dark" round` 的 el-tag

---

### 页面 4：MainLayout（主架）— 侧边栏微调

**核心**：去 emoji、细化选中态、加深背景、强化分组标签。

#### 侧边栏改动
- 背景深度：`#2b1f99` → `#1d166b`（`--color-sidebar-bg`）
- 菜单图标：删 emoji（📅🎯👥✏️💬），改单色几何字符（▦ ◎ ⬡ ⇄ ▱ ◠）或 el-icon
- 选中态：左边框 3px → 2px，底色 rgba(58,212,216,0.1) → 0.08
- 分组标题（考评管理/系统管理）：改极淡大写小字（letter-spacing 0.8px，opacity 0.35）
- 品牌区副标题：「OKR 绩效管理」→ 大写小字「OKR · 绩效」
- 心电波形装饰线保留，opacity 保持 0.5

#### 顶栏改动
- 面包屑保留
- 角色 tag：`round` → 方角（radius 4px）
- 通知 badge 颜色对齐 brand

---

### 页面 5：LoginView（登录页）— 全屏分栏 + 下划线输入

**核心**：从「浅底居中两栏」改为「全屏左深色品牌区 + 右白表单」，输入框改下划线式。

#### 结构变更

```
当前：浅底 grid(品牌区 | 表单卡) 居中
目标：全屏 grid(左深色品牌区 1.2fr | 右白表单 1fr) 撑满
```

#### 左侧深色品牌区
- 背景：`linear-gradient(135deg, #1d166b, #120d4a)`
- 顶部：logo + 「医梦AI」（小字 600）
- 中下部：
  - 主文案「绩效运营工作台」（18px 600）
  - 功能直述（替代营销口号）：「目标对齐 · 进度可追溯 · 结果可解释 · 医疗级数据严谨」
  - 心电波形装饰线（保留，opacity 0.6）
- 分子节点 SVG：右下角，opacity 0.08（更淡）

#### 右侧表单区（纯白科研感）
- 「Internal Access」大写小字 eyebrow（letter-spacing 1.5px）
- 「账号登录」标题（14px 500，letter-spacing 0.3px）
- **下划线式输入框**（自定义 Element Plus）：
  - 字段名用大写小字标签（用户名/密码，letter-spacing 0.5px）
  - 输入区只有底部 1px 边框（`border-bottom: 1px solid var(--color-border)`）
  - focus 时下边框变 accent 色
  - 去掉 Element Plus 默认的填充背景和圆角
- 登录按钮：radius 6px → 4px，letter-spacing 0.5px，文字「登 录」
- 底部辅助文案：「账号由 HR 管理员创建」

#### 下划线式输入框实现（自定义 .underline-input）
```css
.underline-input :deep(.el-input__wrapper) {
  background: transparent;
  box-shadow: none;
  border-radius: 0;
  border-bottom: 1px solid var(--color-border);
  padding: 4px 0;
}
.underline-input :deep(.el-input__wrapper.is-focus) {
  border-bottom-color: var(--color-accent);
  box-shadow: none;
}
.underline-input :deep(.el-input__wrapper:hover) {
  border-bottom-color: var(--color-accent);
}
```

---

## 3. verify 脚本更新

### 3.1 `verify-medtech-theme.mjs` 新增断言

```js
// 新增工具栏/表格/对照类检查
const layoutChecks = new Map([
  ['src/views/okr/MyOkrView.vue', 'data-toolbar'],      // 替代 page-hero
  ['src/views/okr/MyOkrView.vue', 'data-table'],        // 新增表格
  ['src/views/scoring/ScoringEditView.vue', 'compare-grid-3'],  // 三列对照
  ['src/views/scoring/ScoringEditView.vue', 'section-band'],    // 区段色带
  ['src/views/scoring/MyResultView.vue', 'metric-bar'],         // 数据条
  ['src/components/MainLayout.vue', 'clinical-sidebar'],        // 已有，保留
])

// 禁用类检查（新增）
const bannedPatterns = [
  { pattern: /page-hero/, message: '禁止 page-hero（改用 data-toolbar）' },
  { pattern: /section-badge/, message: '禁止 section-badge 胶囊徽章' },
  { pattern: /grade-ring/, message: '禁止 grade-ring 圆环' },
  { pattern: /score-hero/, message: '禁止 score-hero 渐变区' },
  { pattern: /hint-card/, message: '禁止 hint-card 大引导卡' },
  { pattern: /conic-gradient/, message: '禁止 conic-gradient' },
]
```

### 3.2 `verify-scoring-contract.mjs` 保留不动
评分口径（OKR 60 + 绩效 40）已在 v1 确认正确，本次不改口径，契约脚本无需动。

---

## 4. 实施顺序

1. **theme.css 增量 token**（第 1.2 节，只增不改）
2. **components.css 新增通用组件类**（第 1.3 节）
3. **改造 MainLayout 侧边栏**（最简单，建立视觉基调）
4. **改造 LoginView**（独立页面，验证 D 风格）
5. **改造 MyOkrView**（最复杂，建立表格化范式 + 抽屉）
6. **改造 ScoringEditView**（复用表格范式，三列对照）
7. **改造 MyResultView**（复用数据条范式）
8. **更新 verify 脚本**（第 3 节）
9. **`npm run build` + 复制到 backend/static**

---

## 5. 验收标准

### 信息架构
- [ ] 5 个样板页无 `page-hero` / `section-badge` / `grade-ring` / `score-hero` / `hint-card` / `conic-gradient`
- [ ] MyOkrView 用 `data-toolbar` + `data-table`，KR 进度更新走侧边抽屉
- [ ] ScoringEditView 用 `compare-grid-3` 三列对照 + `section-band` 区段 + 底部总览栏（含自评差异）
- [ ] MyResultView 用 `metric-bar` 构成条 + 历史趋势，无圆环
- [ ] MainLayout 侧边栏无 emoji，选中态 2px 边框
- [ ] LoginView 全屏分栏 + 下划线式输入框

### 视觉规范
- [ ] 无硬编码十六进制色值（除 SVG 内描边色）
- [ ] 无 emoji、无渐变发光胶囊、无营销口号
- [ ] 状态用色点（status-dot），不用 effect="dark" round tag
- [ ] 区段标题用色带（section-band），不用大卡片

### 数据契约（保持 v1）
- [ ] 评分口径 OKR 60 + 绩效 40 不变（`verify-scoring-contract.mjs` 通过）
- [ ] 自评/终评/结果展示统一口径

### 构建部署
- [ ] `verify-medtech-theme.mjs` 通过（含新增断言）
- [ ] `verify-scoring-contract.mjs` 通过
- [ ] `npm run build` 成功
- [ ] 产物已复制到 `backend/src/main/resources/static/`

---

## 6. 风险与回退

| 风险 | 影响 | 缓解 |
|---|---|---|
| 表格化后小屏（<1280px）挤压 | 评分页三列对照降级 | 预设响应式降级方案（第 2 节页面 2） |
| 历史趋势数据接口不存在 | MyResultView 趋势图空 | 隐藏趋势区 + 显示空态文案，不阻塞 |
| 侧边抽屉与现有 dialog 冲突 | MyOkrView 编辑流程 | 抽屉只承载进度更新，编辑 OKR 仍走现有 dialog |
| 其余 ~10 页视觉脱节 | 全站一致性 | 本次不处理，样板页验收后再评估套用 |

**回退**：所有改动在 5 个样板页 + theme.css + components.css + verify 脚本范围内，git revert 对应 commit 即可完整回退，不影响后端与业务逻辑。
