# OKR 绩效系统 · 前端去 AI 味改造 v2 — 进展交接文档

**日期**：2026-06-27
**原执行者**：ZCode
**目标读者**：接手此工作的其他 AI Coding 工具

---

## 0. 一句话概括

正在把 OKR 绩效系统前端的 5 个样板页从「卡片堆叠式 AI 生成风格」重构为「AI 科研外壳 + 临床数据内核」的 D 风格。已完 4/10 任务，第 5 个任务（MyOkrView，最复杂的页面）template + script 已重写但尚未 commit，style 部分清理不彻底，需收尾后继续推进剩余 5 个任务。

---

## 1. 关键文档路径

所有文档均在 `/Users/destiny/dev/emoon/projects/okr-performance/` 下：

| 文档 | 路径 | 用途 |
|------|------|------|
| 设计规格 v2 | `docs/superpowers/specs/2026-06-20-medtech-ui-revamp-v2-design.md` | 5 页改造蓝图、token 增量、验收标准 |
| 实现计划 v2 | `docs/superpowers/plans/2026-06-20-medtech-ui-revamp-v2.md` | 10 任务详细分解，含代码片段 |
| v1 规格 | `docs/superpowers/specs/2026-06-18-flow-audit-and-medtech-ui-design.md` | v1 已完成（token 化、去 emoji），v2 是第二阶段 |

**设计语言方向（已确认）**：D 风格 = AI 科研外壳（留白克制、下划线输入、大写小字标签）+ 临床数据内核（表格化、高密度、三列对照式）。

---

## 2. 当前分支

```
feat/medtech-ui-v2
```

基于 `master` 创建。`master` 分支有大量未提交的工作区改动（v1 之前的遗留脏状态），**与本 v2 任务无关**。在 v2 分支上只 commit 了本任务的改动。

---

## 3. 已完成任务（4/10）

| 任务 | 内容 | Commit SHA | 文件 |
|------|------|-----------|------|
| 1 | theme.css 增量 token | `29c2d8b` | `frontend/src/styles/theme.css`（在 `:root` 块末尾追加 v2 token：表格/工具栏/状态点/区段带/侧边栏/登录渐变） |
| 2 | components.css 新增通用类 | `0e4546d` | `frontend/src/styles/components.css`（末尾追加 `.data-toolbar`/`.data-table`/`.compare-grid-3`/`.section-band`/`.metric-bar`/`.review-summary-bar`/`.underline-input`/`.history-trend` 等） |
| 3 | MainLayout 侧边栏改造 | `62ff5db` | `frontend/src/components/MainLayout.vue`（el-icon 改几何字符 ▦◎⬡⇄⊞▱◠⌧⬢⊟⌗≣、背景从渐变改纯色 `var(--color-sidebar-bg)`、选中态底色更淡、分组标题改大写小字、品牌副标题改 `OKR · 绩效`、角色 tag 去 round） |
| 4 | LoginView 全屏分栏 | `16d12b3` | `frontend/src/views/auth/LoginView.vue`（居中两栏 → 全屏左右分栏、左深色品牌区 + 右白表单、输入框从填充式改下划线式 `underline-input`、按钮 radius 收窄、文案改功能直述） |

---

## 4. 当前进行中：任务 5 — MyOkrView 表格化（⚠️ 未 commit）

**文件**：`frontend/src/views/okr/MyOkrView.vue`  
**文件行数**：约 790 行（原 820 行）  
**当前状态**：template 和 script 已重写，style 部分清理不彻底，**尚未 commit**

### 4.1 已完成的部分

**Template 重写**：
- ✅ `page-hero` / `hero-info` 已删除，改为 `.data-toolbar` 顶栏（标题 + 周期名 + 状态 + 操作按钮）
- ✅ `rules-card` (okr-standard-panel) 已删除
- ✅ `section-head` + `section-badge` 胶囊徽章全部删除
- ✅ `hint-card` 大图标引导卡全部删除（"等待上级" / "最高层级"），改为 `.state-banner` 简洁提示
- ✅ `okr-card` / `okr-grid` 卡片容器全部删除
- ✅ OKR 展示区改为 `.data-table` 表格视图（KR 列表，grid-template-columns 36px 1fr 56px 72px 120px 80px）
- ✅ 上级 OKR 对齐区改为 `.section-band` + `.data-table` 表格化
- ✅ 待审核 KR 区改为 `.section-band` + `.data-table` 表格化
- ✅ 侧边抽屉 `<el-drawer>` 已添加（KR 详情 + EXECUTING 阶段进度更新）
- ✅ Dialog（OKR 制定/编辑表单）保留原样未动

**Script 新增**：
- ✅ `drawerVisible` / `drawerKr` 响应式状态
- ✅ `openKrDrawer(kr)` — 初始化 `_newValue`/`_newStatus` 后打开抽屉
- ✅ `submitDrawerProgress()` — 调用现有 `updateProgress()` 后关闭抽屉
- ✅ `periodStatusLabel` / `periodStatusDotClass` / `daysLeft` computed
- ✅ `krStatusDotClass(kr)` 函数

**保留的现有方法（未改动）**：
- ✅ `krPercent(kr)`、`krColor(status)`、`krStatusLabel(status)`、`updateProgress(kr)`、`doReview(id, approved)`、`handleSubmit()`、`startEdit()`、`openCreateForm()`、`load()` 等

### 4.2 ⚠️ 需要修复的遗留问题

**问题 1：Style 区废弃类删除不彻底（sed 误删了 `}` 闭合，已手动修复但可能有残留）**

删除范围 718-800 行时，sed 多删了 `kr-source-tag--mine` 的闭合 `}`，已手动补回。但可能有其他边界问题。建议接手后先跑 `npm run build` 确认 CSS 解析无错误。

**问题 2：Dialog 内仍有若干 `effect="dark" round` 和 `round` 属性**

位置：`frontend/src/views/okr/MyOkrView.vue` 约第 187、202、229、292、303 行。这些在 dialog（OKR 制定/编辑弹窗）内：
- 第 187 行：`<el-tag ... effect="plain" round>`（岗位指标参考标签）
- 第 202 行：`<el-tag ... effect="dark" round>`（"X 项指派给我"）
- 第 229 行：`<el-tag ... effect="dark" round>`（"指派给我"）
- 第 292 行：`<el-button ... round>`（"新增 KR"）
- 第 303 行：`<el-button ... round>`（"提交审核"/"保存修改"）

**处理建议**：Dialog 是填写态表单，可酌情保留（不与结果展示态同等严格）。但若要彻底去 AI 味，去掉 `effect="dark"` 和 `round`，tag 改 `effect="plain"`。

**问题 3：废弃 computed `stateIcon`/`stateBanner` 在 script 中残留**

约第 500-501 行。无害（computed 是惰性求值），但若 linter 报警可删除。

**问题 4：verify 脚本检查 `okr-standard-panel` 会失败**

当前 verify 脚本要求 MyOkrView 包含 `okr-standard-panel` 类（v1 遗留断言）。任务 5 删除了该类，verify 会报：
```
MyOkrView must use okr-standard-panel
```
这是**预期的**——任务 8 才会更新 verify 脚本移除此断言。不要在任务 5 中修改 verify 脚本。

**问题 5：注释中避免 `page-hero` 字符串**

第 3 行注释 `<!-- 工具栏顶栏（替代 page-hero）-->` 已改为 `<!-- v2 工具栏顶栏（替代旧版标题区）-->`，避免任务 8 的禁用模式 `/page-hero/` 正则误报。

### 4.3 提交建议

修复上述问题 1-3 后（问题 4 留给任务 8），建议 commit message：

```
feat(frontend): MyOkrView 表格化重构（工具栏 + O/KR 表格 + 侧边抽屉）

- page-hero/hero-info/section-badge/hint-card/okr-card 全部删除
- 改为 data-toolbar 顶栏 + data-table 表格视图
- KR 更新走侧边抽屉（复用现有 updateProgress 机制）
- 保留 dialog 编辑表单不变
```

---

## 5. 待完成任务（5/10 剩余）

| 任务 | 内容 | 预计复杂度 | 涉及文件 |
|------|------|-----------|---------|
| **5（收尾）** | MyOkrView 修复 + commit | 低 | `frontend/src/views/okr/MyOkrView.vue` |
| **6** | ScoringEditView 三列对照 + 底部总览栏 | 中 | `frontend/src/views/scoring/ScoringEditView.vue` |
| **7** | MyResultView 删圆环 + 数据条 + 历史趋势 | 中 | `frontend/src/views/scoring/MyResultView.vue` |
| **8** | 更新 verify-medtech-theme.mjs 断言 | 低 | `frontend/scripts/verify-medtech-theme.mjs` |
| **9** | 构建 + 部署同步 backend/static | 低 | 构建产物 |
| **10** | 验收对照清单（人工核对） | 低 | 无代码 |

> **任务 6-7 的详细代码级步骤见**：`docs/superpowers/plans/2026-06-20-medtech-ui-revamp-v2.md`（每个任务有完整的 template/html 代码块、字段名、注意事项）。

---

## 6. 关键技术细节（给接手工具）

### 6.1 数据结构（重要！避免 v1 错误）

| 页面 | 关键变量 | 数据结构 |
|------|---------|---------|
| MyOkrView | `myOkr.keyResults[]` | **扁平 KR 列表**，每条 `{id, title, currentValue, targetValue, weight, status, _newValue, _newStatus, sourceKrId, assignedToName}` |
| MyOkrView | 现有方法 | `krPercent(kr)`、`krColor(status)`、`krStatusLabel(status)`、`updateProgress(kr)`（内部用 `kr._newValue`/`kr._newStatus`，调用 `okrApi.updateProgress(kr.id, {newValue, status, remark})`） |
| ScoringEditView | `krScores` | `ref([])` — 元素 `{title, score}`，绑定 `krScores[i].score` |
| ScoringEditView | `dimScores` | `ref([])` — 元素 `{id, name, maxScore, score}`，绑定 `dimScores[i].score` |
| ScoringEditView | `computedTotal` | 预览总分（**不是** computedPreviewTotal） |
| ScoringEditView | `computedGrade` | 预览等级 S/A/B/C（已有） |
| ScoringEditView | 加减分 | `form.bonus` / `form.penalty`（reactive form，不是独立的 bonusScore ref） |
| MyResultView | `data.finalScore.total/grade/okrScore/kpiScore/bonus/penalty/confirmedAt` | 已确认的字段名 |
| MyResultView | 历史数据 | **无现成接口**，需前端轮询 `scoreApi.getMyResult(periodId)`，取最近 4 个归档周期 |

### 6.2 verify 脚本

- `frontend/scripts/verify-medtech-theme.mjs`：检查 vue/css 文件是否符合规范
- `frontend/scripts/verify-scoring-contract.mjs`：检查评分口径（OKR 60 + 绩效 40，**本次不改**）
- 当前验证命令：`cd frontend && node scripts/verify-medtech-theme.mjs`
- 任务 5 未 commit 状态下运行会报 `MyOkrView must use okr-standard-panel`——这会在任务 8 修复

### 6.3 新增的 CSS 全局类（components.css，任务 2 已添加）

| 类名 | 用途 |
|------|------|
| `.data-toolbar` | 顶栏（替代 page-hero） |
| `.data-table` / `.data-table__header` / `.data-table__row` | 表格化数据容器 |
| `.compare-grid-3` | 三列对照网格 |
| `.section-band` | 区段色带标题 |
| `.metric-bar` | 水平数据条 |
| `.review-summary-bar` | 底部固定总览栏 |
| `.underline-input` | 下划线式输入框 |
| `.history-trend` | 历史趋势小柱状图 |
| `.uppercase-label` | 大写小字标签 |
| `.status-label` | 色点 + 文字状态标签 |
| `.side-drawer__content` | 抽屉内容区 |

### 6.4 新增的 theme.css token（任务 1 已添加）

参见 `frontend/src/styles/theme.css` 末尾 `/* ===== v2 增量 token ===== */` 注释块。关键 token：
- `--color-sidebar-bg: #1d166b`
- `--color-login-brand-from: #1d166b` / `--color-login-brand-to: #120d4a`
- `--toolbar-height: 48px`
- `--table-row-height: 40px` / `--table-row-height-compact: 32px`
- `--dot-size: 6px`
- `--label-font-size: 10px` / `--label-letter-spacing: 0.5px`

### 6.5 components.css 中已有的 status-dot 命名

`components.css` 中已有 `.status-dot` + `.is-active` / `.is-success` / `.is-warning` / `.is-danger` 修饰符（BEM 风格，用 `is-` 前缀）。MyOkrView style 中新增了 `.status-dot--active` / `.status-dot--warn` / `.status-dot--info`（BEM modifier 风格，用 `--` 前缀）。**两种风格共存但不会冲突**，因为修饰符写法不同（`.is-active` vs `--active`）。使用时注意选择一种风格。

---

## 7. 环境信息

| 项目 | 值 |
|------|-----|
| 项目根目录 | `/Users/destiny/dev/emoon/projects/okr-performance/` |
| 前端目录 | `frontend/` |
| 后端目录 | `backend/` |
| 前端技术栈 | Vue 3 + Vite + Element Plus + Pinia |
| 后端技术栈 | Spring Boot 3.2 + Maven + SQLite |
| 运行端口 | 前端 dev :5173，后端 :18080 |
| 前端构建 | `cd frontend && npm run build` |
| 后端启动 | `cd backend && mvn spring-boot:run` |
| 验证脚本 1 | `cd frontend && node scripts/verify-medtech-theme.mjs` |
| 验证脚本 2 | `cd frontend && node scripts/verify-scoring-contract.mjs` |
| 构建产物复制 | `rm -rf backend/src/main/resources/static/assets && cp -r frontend/dist/* backend/src/main/resources/static/` |

---

## 8. 任务 6 快速参考（ScoringEditView）

涉及文件：`frontend/src/views/scoring/ScoringEditView.vue`（约 450 行）

核心改动（详见计划文档）：
1. `page-hero` → `data-toolbar`
2. 左侧 `evidence-panel` + 右侧 `decision-panel` → `compare-grid-3` 三列对照
3. 区段用 `section-band`（"OKR 目标达成 · 满分 60" / "绩效维度 · 满分 40"）
4. KR 行绑定 `krScores[i].score`，维度行绑定 `dimScores[i].score`
5. 加减分绑定 `form.bonus` / `form.penalty`
6. 底部 `review-summary-bar`：`computedTotal` + `computedGrade` + 自评差异提示
7. 差异 |scoreDiff| ≥ 10 时变红 + tooltip "打分偏差较大，建议复核"
8. 响应式降级 <1280px 改为单列堆叠
9. 删除 `effect="dark" round`

## 9. 任务 7 快速参考（MyResultView）

涉及文件：`frontend/src/views/scoring/MyResultView.vue`（约 400 行）

核心改动（详见计划文档）：
1. `page-hero` → `data-toolbar`
2. `score-hero`（grade-ring conic-gradient + 渐变背景）→ `result-grid`（左大数字 + 右 metric-bar 构成条）
3. 新增「较上期 ▲+5.2」纵向对比（需前端轮询历史数据，无历史时显示"首次考评"）
4. 新增自评 vs 终评对照行
5. 操作按钮扁平化（去 emoji ✓ 💬）
6. 底部历史趋势小柱状图（最近 4 期，本期高亮）
7. 历史数据兜底：前端轮询 `scoreApi.getMyResult(periodId)` × 最近 4 个归档周期，失败则隐藏趋势区
8. **自评表单态（showSelfForm=true）保持现状不动**

---

## 10. 实施顺序建议

```
任务5收尾 → commit → 任务6(ScoringEditView) → commit → 任务7(MyResultView) → commit
→ 任务8(更新verify脚本，移除evidence-panel/decision-panel/okr-standard-panel断言，新增v2类断言+禁用模式)
→ verify两个脚本全部PASS → 任务9(build+复制static) → 任务10(验收)
```

**重要规则**：
- 每任务一 commit，便于回退
- 任务 8 之前不要动 verify 脚本（部分 legacy 断言会 FAIL 是预期的）
- 评分口径 OKR 60 + 绩效 40 绝对不能改
- `okr-workbench` / `review-workbench` / `result-workbench` / `clinical-shell` / `clinical-sidebar` / `internal-login` 这些 verify 依赖的类名必须保留
