# 绩效管理模块 全量测试报告

## 概要

- **日期**: 2026-03-20
- **分支**: feature/performance-module-refactor
- **环境**: 测试后端 3011 / 测试前端 3010 / 测试数据库 ffoa-test-postgres:35432
- **测试范围**: 14 个页面、98 个前端 API 函数、109 条后端路由、9 个控制器

## 环境就绪矩阵

| 检查项 | 状态 | 详情 |
|--------|------|------|
| 测试数据库 | ✅ | ffoa-test-postgres:35432, running |
| Schema 迁移 | ✅ | 表结构完整 |
| 基础种子 | ✅ | 605 orgs, 5 测试用户, 76 权限码 |
| 模块种子 | ✅ | 24 周期(5种状态), 1 等级配置 |
| 测试后端 | ✅ | HTTP 200, 登录正常 |
| 测试前端 | ✅ | HTTP 200 |

## 七层执行结果

| 层 | 状态 | 详情 |
|----|------|------|
| L0 | ✅ 通过 | 14 页面、98 API 函数、109 后端路由已清点 |
| L0a/L0b | ⚠️ 有问题 | 发现 9 个严重契约不匹配 + 2 个中等问题 |
| L0c | ⚠️ 确认3个严重 | 360 PATCH→404、KPI annualTargetValue 不匹配、战略目标无分页 |
| L1 | ✅ 通过 | 108/110 通过(98.2%)，1 失败(L1b-003 权限)，1 跳过 |
| L1.5 | ✅ 通过 | 76 权限码、15 FK 约束、0 孤儿记录 |
| L2 | ❌ 未通过 | 6 个 Bug，2 Critical 阻断，仅 1/13 流程部分通过 |
| L3 | 待执行 | 验收清单已输出 |

## 阻断问题（必须修复）

### BUG-005 [Critical] 后端模块初始化异常

`performance.module.ts` 引用已删除的 `InterviewController`/`FeedbackController` 等，导致 KPI/360/Result/Calibration/Analytics 路由注册失败，全部返回 404。

**影响**: L2 中 11/13 流程无法执行。
**修复**: 清理 `performance.module.ts` 中已删除控制器/服务的引用。

### BUG-004 [Critical] 前端 Demo 模式硬编码

`performance.ts` 第 1139 行 `ENABLE_PERFORMANCE_DEMO = true` 导致所有 API 走内存假数据，前端完全不连接后端。

**影响**: 前端看到的数据全部是假数据，无法验证真实后端行为。
**修复**: 改为 `process.env.NEXT_PUBLIC_PERFORMANCE_DEMO === 'true'`。

### 契约不匹配 — 360 评估 Update（PATCH vs PUT）

前端发 PATCH，后端只接受 PUT，返回 404。

**修复**: 后端 `Evaluation360Controller.update` 的 `@Put` 改为 `@Patch`，或前端改为 PUT。

### 契约不匹配 — KPI 字段名

前端使用 `annualTargetValue`，后端返回 `targetValue`。前端永远读到 `undefined`。

**修复**: 前端统一使用 `targetValue`。

## 非阻断问题

### BUG-003 [High] Employee 可直接访问 /performance/admin

普通员工直接访问 `/performance/admin` 可看到管理页面，权限隔离失效。

**修复**: 前端添加路由守卫或权限检查。

### BUG-002 [High] 360 评估页面 Employee 角色崩溃

`tasks.filter is not a function` — 当 API 返回非数组时前端未做防御处理。

### BUG-001 [Medium] AdminOverview 发布周期后崩溃

`charAt on undefined` — 某个字段为 undefined 时调用了字符串方法。

### BUG-006 [Low] 评估进度显示 NaN%

进度计算时分母为 0 未处理。

### 战略目标 findAll 缺分页元数据

后端只返回 `{ items }`，前端期望 PaginatedData 结构（total, page, totalPages）。

### Calibration gradeDistribution 字段名差异

后端用 `code`，前端可能期望 `grade`。

### L1b-003 360 评估自动完成

evaluator2 提交反馈时返回 403，权限配置不完整。可能是测试环境问题也可能是业务逻辑 bug。

### 数据质量注意项

- 等级配置 1 个但未标记为默认（isDefault=false）
- 360 评估模板为空，L2 的 360 流程需要先创建模板
- Manager 链路扁平（test.dev1→itadmin），缺少 test.dev1→test.lead1 的上下级关系

## 修复内容（本次测试过程中已修复）

1. **cleanup.helper.ts**: 添加绩效模块表的清理（strategicObjectiveAssignment 等），解决 FK 约束导致的清理失败
2. **performance.api.test.ts**: 添加 `ensureDefaultGradeConfig()` 辅助函数，修复 publish 依赖 gradeConfig 的问题
3. **performance-new-apis.test.ts**: 修复结果确认/申诉测试的周期状态（COMPLETED → CONFIRMING）
4. **jest-backend-integration.json**: 更新 transformIgnorePatterns 支持 @exodus/bytes ESM 模块

## 修复优先级建议

| 优先级 | 问题 | 估计影响范围 |
|--------|------|------------|
| P0 | BUG-005 后端模块初始化（清理删除的引用） | 阻断所有 E2E |
| P0 | BUG-004 前端 Demo 模式硬编码 | 阻断所有真实 API 调用 |
| P0 | 360 PATCH/PUT 不匹配 | 360 评估更新功能完全不可用 |
| P0 | KPI annualTargetValue 字段名 | KPI 目标值显示为空 |
| P1 | BUG-003 Admin 页面权限隔离 | 安全问题 |
| P1 | BUG-002 360 页面崩溃 | Employee 角色体验 |
| P1 | 战略目标分页 | 数据多时前端分页失效 |
| P2 | BUG-001 AdminOverview 崩溃 | 发布后管理页面异常 |
| P2 | BUG-006 NaN% | 视觉问题 |

## 子报告链接

- E2E 详细报告: [performance-2026-03-20-e2e-report.md](performance-2026-03-20-e2e-report.md)

## 后续行动

1. **修复 P0 阻断问题**（BUG-004、BUG-005、契约不匹配）
2. **修复后从 L2 重跑**（不需要从 L0 重新开始）
3. **补充 360 评估模板种子数据**
4. **修复 manager 链路**（test.dev1 的 manager 应为 test.lead1 而非 itadmin）
