# 绩效管理模块 MCP 连通性测试报告

## 概要

- **日期**: 2026-03-21
- **分支**: feature/performance-module-refactor
- **前端**: http://localhost:3010 (Next.js 16.0.7, 源码: ffworkspace-develop-integration)
- **后端**: http://localhost:3011 (NestJS, 源码: ffworkspace-develop-integration)
- **测试数据库**: postgresql://ffws_test@127.0.0.1:35432/ffws_integration_test
- **流程总数**: 13
- **通过**: 1 (Flow 1 部分通过)
- **失败**: 1 (Flow 5 部分失败)
- **阻断**: 11 (Flows 2-4, 6-13 因后端路由缺失阻断)

### 关键阻断问题

**后端 KPI/360/Result/Calibration/Analytics 路由全部返回 404**。仅 Cycles 和 GradeConfig 两个 Controller 正常注册。根因是 `performance.module.ts` 引用了已删除的 `InterviewController`/`FeedbackController`/`InterviewService`/`FeedbackService`，导致模块初始化时 `TypeError: Cannot convert undefined or null to object`，部分 Controller 未能注册。

**前端 Demo 模式硬编码为 true**。`frontend/src/services/api/performance.ts` 第 1139 行 `const ENABLE_PERFORMANCE_DEMO = true;` 强制使用内存 demo 数据，忽略 `NEXT_PUBLIC_PERFORMANCE_DEMO=false` 环境变量。测试期间已手动修改为读取环境变量。

## 流程执行结果

### Flow 1: 初始化周期 (P0) — 部分通过

| 步骤 | 操作 | 断言 | 结果 |
|------|------|------|------|
| 1.1 | 登录 itadmin，导航到 /performance/admin | 侧栏"管理"分组可见 | ✅ 可见：配置概览、周期管理、战略目标、结果管理、校准、统计分析、等级配置、360 模板 |
| 1.2 | 进入等级配置，创建"E2E等级" | 列表出现"E2E等级"，5 个等级行 | ✅ 创建成功，S/A/B/C/D 五个等级，Toast "配置已创建" |
| 1.3 | 创建周期"E2E测试Q3" | 列表出现周期，状态为"草稿" | ✅ 创建成功（注：需使用不与现有周期冲突的日期），等级配置自动关联 |
| 1.4 | 发布周期 | 状态变为"目标设定中" | ⚠️ 发布成功，但 AdminOverview 页面崩溃（BUG-001）。刷新后在周期列表确认状态已变为"目标设定中" |

### Flow 2: 员工填写并提交 KPI (P0) — 阻断

| 步骤 | 操作 | 断言 | 结果 |
|------|------|------|------|
| 2.1 | 登录 test.dev1，进入 /performance/kpi | 页面显示当前周期 | ✅ 页面加载正常，"E2E测试Q3"自动选中，可见"添加 KPI"按钮 |
| 2.2a | 点击"添加 KPI"，填写第 1 条 | 列表新增一行 | ❌ POST /performance/kpi/indicators 返回 404（后端路由未注册） |
| 2.2b-2.3 | 后续步骤 | — | ⏭ 因 2.2a 失败跳过 |

### Flow 3: 依赖确认 (P1) — 阻断

因 KPI 路由不可用，全部跳过。

### Flow 4: 经理审批 KPI (P0) — 阻断

因 KPI 路由不可用，全部跳过。

### Flow 5: 空数据与组织隔离 (P0) — 部分通过

| 步骤 | 操作 | 断言 | 结果 |
|------|------|------|------|
| 5.1 | 登录 test.robot1，进入 /performance | 页面正常加载 | ✅ 显示"FF Robotics"组织数据（正确隔离，不显示"车辆研发销售"数据） |
| 5.2 | 进入 /performance/kpi | 页面正常加载 | ✅ 加载正常，显示 FF Robotics 组织的 KPI 数据，不显示 Vehicle R&D 数据 |
| 5.3 | 进入 /performance/360 | 显示空态提示 | ❌ 页面崩溃：`tasks.filter is not a function`（BUG-002） |
| 5.4 | 检查侧栏 | 不可见"管理"分组 | ✅ Employee 侧栏仅显示：绩效概览、我的 KPI、团队 KPI、360 评估 |
| 5.5 | 直接访问 /performance/admin | 被拒绝或重定向 | ❌ 页面可正常访问，显示完整管理内容（BUG-003） |

### Flow 6-13 — 全部阻断

所有依赖 KPI/Result/Calibration/360/Analytics API 的流程因后端路由 404 而无法执行。

## 发现的 Bug

### BUG-001: AdminOverview 发布周期后崩溃 (Medium)

- **复现步骤**: Flow 1, Step 1.4 — 在配置概览页点击"发布周期"并确认
- **期望**: 页面刷新显示新状态"目标设定中"
- **实际**: `TypeError: Cannot read properties of undefined (reading 'charAt')` 导致 AdminOverview 白屏
- **影响**: 不阻断（刷新或访问周期列表页可确认发布成功）
- **根因**: AdminOverview 组件在处理 cycle publish 响应时，某字段为 undefined 但代码调用了 `.charAt()`

### BUG-002: 360 评估页面 Employee 角色崩溃 (High)

- **复现步骤**: Flow 5, Step 5.3 — 以 test.robot1 (Employee) 访问 /performance/360
- **期望**: 显示"暂无待完成的评估任务"或类似空态
- **实际**: `TypeError: tasks.filter is not a function` 导致白屏
- **影响**: 阻断 Employee 访问 360 评估页面
- **根因**: GET /performance/360-templates 返回 403（Employee 无权限），前端未处理错误响应，将错误对象当数组使用

### BUG-003: Employee 可访问 /performance/admin (High)

- **复现步骤**: Flow 5, Step 5.5 — 以 test.robot1 (Employee) 直接访问 /performance/admin
- **期望**: 被拒绝或重定向到概览页
- **实际**: 显示完整管理配置概览（周期详情、评估进度、部门进度）
- **影响**: 权限隔离失效，Employee 可看到管理信息
- **根因**: 前端路由未做权限守卫，/performance/admin 页面无角色检查

### BUG-004: 前端 Demo 模式硬编码 (Critical — 环境问题)

- **位置**: `frontend/src/services/api/performance.ts:1139`
- **代码**: `const ENABLE_PERFORMANCE_DEMO = true;`
- **影响**: 忽略 `NEXT_PUBLIC_PERFORMANCE_DEMO=false` 环境变量，所有 performance API 调用使用内存 demo 数据
- **修复**: 测试期间已改为 `process.env.NEXT_PUBLIC_PERFORMANCE_DEMO === 'true'`

### BUG-005: 后端 KPI 等路由未注册 (Critical — 环境问题)

- **位置**: `backend/src/modules/performance/performance.module.ts`
- **现象**: POST/GET /performance/kpi/* 全部返回 404
- **影响**: 阻断 11/13 流程（所有涉及 KPI/Result/Calibration/360/Analytics 的操作）
- **根因**: performance.module.ts 导入了已删除的 InterviewController/FeedbackController 等，模块初始化异常导致部分 Controller 未注册

### BUG-006: 评估进度显示 NaN% (Low)

- **复现步骤**: 在 /performance/admin 查看评估进度
- **期望**: 显示正确的百分比
- **实际**: 显示 "NaN%"
- **影响**: 视觉问题，不阻断功能

## 未执行的流程

| 流程 | 优先级 | 原因 |
|------|--------|------|
| 2 员工填写并提交 KPI | P0 | 后端 KPI 路由 404 |
| 3 依赖确认 | P1 | 后端 KPI 路由 404 |
| 4 经理审批 KPI | P0 | 后端 KPI 路由 404 |
| 6 KPI 自评与经理评分 | P0 | 后端 KPI 路由 404 |
| 7 360 评估 | P1 | 后端 360 路由 404 |
| 8 校准 | P0 | 后端 Calibration 路由 404 |
| 9 发布结果并员工确认 | P0 | 后端 Result 路由 404 |
| 10 统计分析与权限 | P1 | 后端 Analytics 路由 404 |
| 11 KPI 驳回与修改 | P1 | 后端 KPI 路由 404 |
| 12 结果申诉 | P1 | 后端 Result 路由 404 |
| 13 战略目标 | P1 | 未测试（后端路由状态未知） |

## 环境信息

- **前端**: Next.js 16.0.7 (Turbopack), 源码来自 ffworkspace-develop-integration
- **后端**: NestJS, ts-node --transpile-only, 源码来自 ffworkspace-develop-integration
- **数据库**: PostgreSQL 测试实例 (port 35432), 含种子数据
- **测试账号**:
  - itadmin / Admin@2024 — Administrator, 全部组织
  - test.dev1 / Test1234! — Employee, 车辆研发销售
  - test.robot1 / Test1234! — Employee, 机器人研发销售
  - test.lead1 — 未使用（因 KPI 流程阻断）

## 后续建议

1. **优先修复 BUG-005（后端模块初始化）**: 清理 performance.module.ts 中对已删除 Controller/Service 的引用，确保所有路由正常注册
2. **修复 BUG-004（Demo 模式硬编码）**: 将 `const ENABLE_PERFORMANCE_DEMO = true` 改为读取环境变量
3. **修复 BUG-003（权限隔离）**: /performance/admin 页面添加前端路由守卫，Employee 角色应重定向到概览
4. **修复 BUG-002（360 错误处理）**: 对 API 403 响应做防御性处理，显示友好空态而非崩溃
5. 环境修复后重新执行全部 13 个流程
