# OKR 绩效考核系统 — 设计文档 ## 概述 医梦AI 内部绩效考核系统。OKR(40%) + KPI(60%) 双轨模型,树形汇报权限,同屏联动展示。独立部署、本地 SQLite 存储、单 JAR 一键启动。 ## 技术栈 | 层 | 选型 | 版本 | |---|------|------| | 运行时 | JDK | 17 LTS | | 后端框架 | Spring Boot | 3.2.x | | ORM | MyBatis-Plus | 3.5.x | | 数据库 | SQLite (WAL 模式) | — | | 认证 | Spring Security + JWT | 6.x | | 前端框架 | Vue 3 + Composition API | 3.4+ | | UI 库 | Element Plus | 2.6+ | | 构建工具 | Vite + Maven | — | | 状态管理 | Pinia | 2.x | ## 部署架构 **单 JAR 部署**:Vue 打包产物放入 Spring Boot `static` 目录,`java -jar` 同时服务前端和后端 API。 - 默认端口:18080(可通过 `application.yml` 中 `server.port` 修改) - 部署物:1 个 jar + 1 个 `.db` 文件 - 迁移:拷贝上述两个文件 - 一键启动:`./start.sh`(内部执行 `npm build` → `mvn package` → `java -jar`) - 开发模式:前端 `:5173` 代理到后端 `:8080`,热更新 ## 项目结构 ``` okr-performance/ ├── backend/ # Spring Boot 3.x │ ├── pom.xml │ └── src/main/java/com/yimeng/okr/ │ ├── OkrApplication.java │ ├── config/ # Security, CORS, MyBatis-Plus │ ├── security/ # JWT Filter, TokenProvider │ ├── controller/ # REST 控制器 │ ├── service/ # 业务逻辑 │ ├── mapper/ # MyBatis-Plus Mapper │ ├── entity/ # 数据库实体 │ ├── dto/ # 请求/响应 DTO │ ├── enums/ # 枚举 │ ├── exception/ # 全局异常处理 │ └── schedule/ # 定时任务 ├── frontend/ # Vue 3 + Vite │ └── src/ │ ├── router/ # Vue Router │ ├── stores/ # Pinia │ ├── api/ # Axios + API 模块 │ ├── views/ # 页面组件 │ ├── components/ # 通用组件 │ ├── composables/ # 组合函数 │ └── assets/ # 静态资源(含 logo) ├── data/ # SQLite 数据库文件目录 ├── scripts/start.sh # 一键启动脚本 └── docs/ ``` ## 路由与菜单 **侧边栏三组菜单,基于角色动态显示:** | 分组 | 菜单项 | 路由 | 可见角色 | |------|--------|------|----------| | 工作台 | 考核周期 | /periods | 全部 | | | 我的 OKR | /okr/my | 全部 | | | 我的绩效 | /scores/my | 全部 | | 考评管理 | 绩效打分 | /scoring | 上级(有下属者) | | | 绩效沟通 | /feedback | 上级 | | 系统管理 | 组织架构 | /org | 超级管理员 | | | KPI 模板库 | /kpi/templates | 上级 + 管理员 | | | 操作日志 | /system/logs | 超级管理员 | | | 数据备份 | /system/backup | 超级管理员 | ## 数据模型(12 张核心表) 1. **sys_user** — 用户账号:id, username, password_hash, real_name, position, department_id, superior_id, role(EMPLOYEE/SUPER_ADMIN), created_at 2. **sys_department** — 部门:id, name, parent_id, leader_id, sort_order 3. **assessment_period** — 考核周期:id, name, start_date, end_date, status(DRAFT→OKR_ALIGN→EXECUTING→ASSESSING→ARCHIVED), created_by 4. **okr_objective** — 目标 O:id, period_id, user_id, dept_id, type(DEPT/PERSONAL), title, status, version, snapshot_json, reviewed_by, reviewed_at 5. **kr_key_result** — 关键结果 KR:id, objective_id, title, target_value, current_value, status(NOT_STARTED/IN_PROGRESS/COMPLETED/BLOCKED), weight 6. **kr_progress_log** — KR 进度更新:id, kr_id, old_value, new_value, old_status, new_status, remark, updated_by, created_at 7. **kpi_template** — KPI 模板:id, name, category, items_json, created_by 8. **kpi_config** — 个人 KPI 配置:id, period_id, user_id, items_json, version, snapshot_json, locked_at 9. **performance_score** — 绩效打分:id, period_id, user_id, evaluator_id, okr_score(0-40), kpi_score(0-60), bonus, penalty, total, grade(S/A/B/C), type(SELF/SUPERIOR/FINAL), comments_json 10. **performance_feedback** — 面谈反馈:id, period_id, user_id, superior_id, interview_notes, highlights, issues, improvements, employee_feedback 11. **operation_log** — 操作日志:id, operator_id, action, entity_type, entity_id, old_data_json, new_data_json, ip, created_at 12. **audit_correction** — 修正记录:id, performance_id, correction_type, old_values_json, new_values_json, reason, operated_by, created_at **关键设计决策:** - OKR 目标和 KPI 配置在归档时写入 `snapshot_json` 字段,历史周期数据不受后续修改影响 - 数据"不可修改"语义通过 `audit_correction` 表实现——原记录逻辑删除,修正写入新表,全程留痕 - `performance_score.type` 区分自评(SELF)、上级初审(SUPERIOR)、最终结果(FINAL) ## 状态机 ``` 待发布 → OKR对齐 → 执行中 → 考评中 → 已归档 ``` | 转换 | 触发方式 | 行为 | |------|----------|------| | 待发布→OKR对齐 | 管理员手动 | 为全员创建空白OKR记录,部门OKR可发布 | | OKR对齐→执行中 | 管理员手动(或周期开始日自动) | 员工OKR锁定,不可修改 | | 执行中→考评中 | 周期结束日自动(定时任务) | 员工可自评,上级可打分 | | 考评中→已归档 | 管理员手动 | 数据快照,锁定不可修改 | ## 权限模型 不预设固定角色。权限完全基于 `sys_user.superior_id` 树形汇报关系动态生效: - **普通员工**(无下属):个人 OKR/绩效/反馈 增改查,无打分权限 - **直属上级**(有下属):对 direct reports 拥有 OKR 审核、绩效打分、面谈记录、数据查看权限;权限代码 `WHERE evaluated_user.superior_id = current_user.id` - **超级管理员**(role=SUPER_ADMIN):全局最高权限,周期创建、组织架构维护、日志查看、备份恢复 ## API 设计(约 45 个端点) | 模块 | 前缀 | 核心端点 | |------|------|----------| | Auth | /api/auth | POST login, register; GET me; PUT password | | 组织架构 | /api/org | CRUD departments; PUT members, superior | | 考核周期 | /api/periods | CRUD periods; PUT status; GET progress | | OKR | /api/okr | CRUD objectives & krs; POST submit; PUT review, progress | | KPI | /api/kpi | CRUD templates, configs | | 绩效打分 | /api/scores | POST self, superior; GET my (含 OKR 联动) | | 绩效反馈 | /api/feedback | POST interview, reply; GET by id | | 系统 | /api/system | GET logs; POST backup, restore | 所有打分相关 GET 端点返回当期 OKR 完整记录,实现同屏联动。 ## UI 布局规则 - **主题色**:深 #2b1f99(侧边栏/强调),浅 #3ad4d8(高亮/操作唤醒) - **侧边栏**:220px 宽,深色渐变,三组菜单分区 - **同屏页面(打分/反馈)**:宽屏(≥1440px)左右分栏(OKR记录 48% + 打分区 52%),窄屏(<1440px)上下分区(OKR可折叠面板 + 打分区) - **Logo**:侧边栏顶部 + 登录页使用 ## 一期范围(核心闭环) 纳入:账号与组织 → 考核周期 → OKR 管理 → KPI 配置 → 绩效打分(同屏) → 绩效反馈(同屏) → 操作日志 预留:数据统计与分析、自动备份、KPI 模板库完善、历史趋势曲线