审计日期:2026-07-13
审计范围:frontend/public/prototype.html、当前 Vue 路由与页面、Spring Boot 接口与业务服务、SQLite 实际库与迁移机制。
当前项目已经具备 18 个原型页面对应的路由,也具备周期、OKR、评分、申诉、沟通、归档的基础接口,但还不能认定为“完整支撑企业 OKR 闭环”。主要原因不是样式,而是以下结构性缺口:
parent_objective_id、aligned_objective_ids CSV 和 source_kr_id,没有统一的数据真相源。PRAGMA foreign_keys 当前为 0;多个业务唯一性只由服务层查询保护,并发或重复请求可能产生重复记录。因此,后续应按“闭环垂直切片”重构,而不是继续逐页替换 CSS。
| 页面 | 当前状态 | 核心差异 | 后端/数据影响 |
|---|---|---|---|
| 登录 | 部分一致 | 已删除医院统计,但品牌图资源有不透明底图,版式比例与原型不一致 | 无 |
| 工作台 | 部分一致 | 当前三张统计卡纵向过高,缺少原型的 4 指标组合、成员明细表和可执行风险入口 | workspace/overview 需返回对象链接、完整团队统计、阶段进度 |
| 我的 OKR | 结构不一致 | 当前只支持一个 O;原型有多个 O、O 权重、描述、来源关系表 | Objective 字段和提交契约必须重构 |
| 团队 OKR | 部分一致 | 只有直属下属卡片,缺少部门级 O、成员详情页和层级下钻 | 增加成员详情路由;接口返回部门目标与成员聚合 |
| OKR 对齐 | 部分一致 | 已有 graph,但单父级、CSV 多对齐、KR 来源三套关系并存 | 规范化 alignment 表与异常规则 |
| 执行进度 | 视觉占位 | 有进度历史,但 KR 没有计划起止日期,甘特位置不是真实计划 | KR 增加 start_date、due_date;timeline 返回真实区间 |
| 我的绩效 | 部分一致 | 自评和结果混在一页可用,但工作流动作与申诉/沟通状态没有统一展示 | 聚合返回当前申诉、沟通、允许动作 |
| 历史绩效 | 部分一致 | 通过逐周期请求详情,缺少稳定的归档快照读取契约 | 提供历史摘要/详情接口,读取归档快照 |
| 绩效打分 | 部分一致 | 仅直属下属;缺少队列筛选、申诉中状态、阶段截止信息 | review queue 返回状态、截止与申诉摘要 |
| 绩效考评 | 接近但有逻辑冲突 | OKR 60、绩效维度 40、默认 60%、加扣分上限 20 已体现;HR 被显示为可评分但服务只允许直属上级 | 统一评分授权规则;结构化评分 DTO |
| 绩效申诉 | P0 不完整 | 页面仅适用于 HR;普通员工访问会被接口 403,无法查看自己的申诉进度 | 增加“我的申诉”;接受申诉后进入待修正/待重发状态 |
| 绩效沟通 | P0 不完整 | 页面仅适用于主管;员工没有回复入口,已有 /feedback/reply 未接入 |
增加员工视图和“我的沟通”接口 |
| 考核周期 | 部分一致 | 有状态轨道和 readiness,但缺少各阶段截止日期;允许执行阶段直接归档 | 增加阶段日期;取消绕过考评的常规归档路径 |
| 绩效模板 | P0 不完整 | 模板只有 JSON 项;岗位靠“模板名等于岗位名”隐式匹配,没有分配和实例化流程 | 模板项规范化或稳定 JSON schema;增加 assignment/instance |
| 考核维度 | P0 数据风险 | 全局维度可改;增删改后再校验总分但服务未加事务,失败时可能留下非法总分 | 事务化;按周期快照维度配置 |
| 组织架构 | 部分一致 | 已有树和循环上级校验;角色与 CEO 业务身份混在一起,周期内组织变化未快照 | 周期参与人快照审批链;区分系统权限和业务层级 |
| 消息通知 | 部分一致 | 顶栏可跳转;侧栏缺少通知入口;通知没有统一可路由的目标契约 | ref_type/ref_id 映射为服务端 target_url |
| 操作日志 | 部分一致 | 筛选与备份已存在;缺少关键状态变更前后业务摘要 | 审批、对齐、评分修正、申诉处理必须完整留痕 |
目标流程如下:
flowchart LR
A["HR 创建草稿周期"] --> B["配置参与人、阶段日期、绩效模板与维度快照"]
B --> C["发布 OKR 对齐"]
C --> D["CEO 创建并发布公司级 OKR"]
D --> E["一级负责人承接并提交部门/个人 OKR"]
E --> F["直属上级逐级审核"]
F --> G{"全部参与人 OKR 与绩效配置就绪?"}
G -- 否 --> E
G -- 是 --> H["锁定并进入执行"]
H --> I["员工更新 KR,主管跟踪风险"]
I --> J["进入考评"]
J --> K["员工自评"]
K --> L["直属上级评分"]
L --> M["发布结果"]
M --> N{"员工确认还是申诉?"}
N -- 确认 --> O["绩效沟通与员工回复"]
N -- 申诉 --> P["HR 受理、必要时修正并重新发布"]
P --> N
O --> Q["关闭沟通"]
Q --> R{"所有参与人完成且无未结申诉?"}
R -- 否 --> J
R -- 是 --> S["生成完整快照并归档"]
submit-hierarchy 仅按 HR 及以上角色判断,前端没有入口;CEO 作为组织树顶级负责人不是稳定规则。CLOSED。OPEN 申诉。EXECUTING -> ARCHIVED,与“必须完成逐级评定后归档”的目标冲突。POST /api/periods:包含阶段截止日期和参与范围。GET /api/periods/{id}/readiness:返回结构化 blocker(code、count、userIds、targetUrl),不只返回文案。POST /api/periods/{id}/configuration/instantiate:把模板、维度和参与人审批链实例化到周期。PUT /api/periods/{id}/status:只允许顺序流转;生产流程不再允许执行期直接归档。parent_objective_id 作为主要层级,额外承接关系存 okr_alignment,不再写 CSV。APPEAL_ACCEPTED/REVISION_REQUIRED,修正后重新发布并重新确认。assessment_period:增加 okr_due_date、execution_end_date、self_review_due_date、manager_review_due_date、confirmation_due_date。period_participant:增加 department_id_snapshot、superior_id_snapshot、position_snapshot、role_snapshot、evaluator_id、template_id。okr_objective:增加 description、weight;删除业务对 aligned_objective_ids CSV 的依赖。kr_key_result:增加 start_date、due_date、unit、baseline_value。okr_alignment:objective_id、parent_objective_id、source_kr_id、relation_type。okr_review_record:保留每次提交、通过、驳回、备注和版本。period_dimension:周期级维度快照,不能直接读取可变的全局维度。kpi_template_assignment 或等价周期实例表:显式关联岗位/部门/用户,不再用模板名匹配岗位。performance_score(period_id, user_id, type, deleted) 业务唯一。performance_feedback(period_id, user_id) 唯一。kpi_config(period_id, user_id) 唯一。CHECK 约束或等价服务校验。建议采用闭环优先方案,而不是按页面目录施工:
每个切片都必须包含:失败测试、数据库增量迁移、后端契约测试、前端交互测试、浏览器截图对照和单 JAR 静态资源验证。
最终必须用独立测试数据完成以下 E2E:
reference-login-viewport.pngcurrent-login.pngreference-workspace.pngcurrent-workspace.pngPRAGMA foreign_keys = 0。