# TurboHR 企业全流程端到端测试场景

> **场景背景**：模拟一家新企业「上海明远制造有限公司」从零开始使用 TurboHR 的完整过程。  
> 包括：平台创建租户 → 企业管理员首次登录 → 企业配置 → 线下数据导入 → 日常操作 → 月度闭环 → 员工端使用  
> **测试环境**: https://on.hr8ai.top  
> **日期范围**: 2026-08-01 ~ 2026-08-31

---

## 角色与账号

| 角色 | 手机号 | 密码 | 说明 |
|------|--------|------|------|
| 平台超管 | `superadmin` | （平台管理端密码） | SUPER_ADMIN，创建租户 |
| 企业管理员 | `13900005555` | `Init123456` | 新建租户的管理员 |
| HR 李萍 | `13900006666` | `Hr123456` | 企业内新增的 HR 用户 |
| 员工 张伟 | `13900007777` | （初始密码/验证码） | 生产车间，通过导入创建 |
| 员工 王芳 | `13900007888` | （初始密码/验证码） | 行政部，通过导入创建 |

---

## 阶段一：租户创建与初始化

### E2E-001 平台管理员创建新企业

| 项目 | 内容 |
|------|------|
| **角色** | 平台超管（SUPER_ADMIN） |
| **Input** | POST `/api/v1/auth/platform-login` `{ phone: "superadmin", password: "xxx" }` |
| **Process** | 1. 平台超管登录 → 2. 进入 `/platform/orgs` → 3. 点击「新建组织」→ 4. 填写企业信息并提交 |
| **Input（创建组织）** | POST `/api/v1/platform/orgs` `{ name: "上海明远制造有限公司", contactName: "刘明远", contactPhone: "13900005555", adminName: "刘明远", adminPhone: "13900005555", adminPassword: "Init123456", city: "上海", plan: "PRO", maxEmployees: 50, payrollFrequency: 1 }` |
| **Output** | HTTP 201，`{ success: true, data: { id: "org-new-id", name: "上海明远制造有限公司", plan: "PRO", maxEmployees: 50 } }` |
| **验证** | 组织列表中出现「上海明远制造有限公司」，套餐 PRO，员工上限 50 |

### E2E-002 企业管理员首次登录

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员（刘明远） |
| **Input** | POST `/api/v1/auth/login` `{ phone: "13900005555", password: "Init123456" }` |
| **Process** | 1. 访问登录页 → 2. 输入手机号和初始密码 → 3. 点击登录 |
| **Output** | HTTP 200，`{ success: true, data: { user: { id: "u-new", name: "刘明远", role: "ADMIN", phone: "13900005555" }, accessToken: "jwt-xxx", refreshToken: "jwt-refresh-xxx" } }` |
| **验证** | 跳转至 `/dashboard`，仪表盘显示空数据（0 员工、0 待办、0 风险） |

### E2E-003 完善企业信息

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员 |
| **Input** | PUT `/api/v1/settings/org` `{ name: "上海明远制造有限公司", contactName: "刘明远", contactPhone: "13900005555", city: "上海", payrollFrequency: 1, retirementReminderEnabled: true }` |
| **Process** | 进入 `/settings` → 企业信息 → 修改/完善信息 → 保存 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 设置页显示更新后的企业名称「上海明远制造有限公司」，城市「上海」，发薪次数 1 次/月 |

### E2E-004 添加 HR 用户

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员 |
| **Input** | POST `/api/v1/settings/users` `{ name: "李萍", phone: "13900006666", password: "Hr123456", role: "HR" }` |
| **Process** | 进入 `/settings` → 用户管理 → 点击「添加用户」→ 填写 HR 信息 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "u-hr", name: "李萍", phone: "13900006666", role: "HR" } }` |
| **验证** | 用户列表显示 2 人：刘明远（ADMIN）、李萍（HR） |

### E2E-005 HR 用户登录验证

| 项目 | 内容 |
|------|------|
| **角色** | HR（李萍） |
| **Input** | POST `/api/v1/auth/login` `{ phone: "13900006666", password: "Hr123456" }` |
| **Process** | 退出管理员账号 → 用 HR 账号登录 |
| **Output** | HTTP 200，`{ success: true, data: { user: { name: "李萍", role: "HR" } } }` |
| **验证** | 成功登录，跳转至 `/dashboard`，HR 角色可访问花名册、考勤、薪酬等模块 |

---

## 阶段二：线下数据导入

### E2E-006 批量导入员工花名册

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | `FormData { file: 明远制造_花名册.xlsx }` |
| **文件内容** | Excel 包含以下列：姓名、性别、身份证号、手机号、部门、岗位、入职日期、月薪、合同类型、合同开始、合同结束 |
| **示例数据** | 张伟, 男, 310101199001011234, 13900007777, 生产车间, 操作工, 2022-03-01, 8000, 固定期限, 2022-03-01, 2025-02-28 |
|  | 王芳, 女, 310102199505052345, 13900007888, 行政部, 行政专员, 2023-06-01, 9000, 固定期限, 2023-06-01, 2026-05-31 |
|  | 陈强, 男, 310103199207073456, 13900007999, 生产车间, 技术员, 2021-01-01, 10000, 无固定期限, 2021-01-01, |
|  | 赵敏, 女, 310104199808084567, 13900008000, 质检部, 质检员, 2024-01-01, 8500, 固定期限, 2024-01-01, 2027-12-31 |
| **Process** | 进入 `/roster` → 点击「批量导入」→ 上传 Excel 文件 → 确认导入 |
| **Output** | HTTP 200，`{ success: true, data: { total: 4, success: 4, failed: 0, errors: [] } }` |
| **验证** | 花名册列表显示 4 名员工，部门分布：生产车间 2 人、行政部 1 人、质检部 1 人 |

### E2E-007 验证导入数据完整性

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/employees?page=1&pageSize=10` |
| **Process** | 进入花名册 → 逐条检查员工信息 |
| **Output** | `{ data: [{ id: "e1", name: "张伟", gender: "男", phone: "13900007777", department: "生产车间", position: "操作工", hireDate: "2022-03-01", monthlySalary: 8000, contractType: "FIXED", contractStart: "2022-03-01", contractEnd: "2025-02-28", status: "ACTIVE" }, { id: "e2", name: "王芳", ... }, { id: "e3", name: "陈强", ... }, { id: "e4", name: "赵敏", ... }], pagination: { total: 4 } }` |
| **验证** | 4 名员工信息与导入文件一致，状态均为 ACTIVE |

### E2E-008 手动补充员工档案详情

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | PUT `/api/v1/employees/e1` `{ emergencyContact: "张父", emergencyPhone: "13800001111", bank: "工商银行", account: "6222020100011234", address: "上海市浦东新区测试路100号", education: "高中", nativePlace: "安徽合肥" }` |
| **Process** | 花名册 → 点击「张伟」→ 员工详情 → 编辑档案 → 补充紧急联系人、银行账户、地址等 → 保存 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 员工详情页显示完整的档案信息 |

### E2E-009 导入考勤数据

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | `FormData { file: 明远制造_考勤_2026-07.xlsx, month: "2026-07" }` |
| **文件内容** | Excel 包含：员工姓名、日期、上班打卡、下班打卡、状态 |
| **示例数据** | 张伟, 2026-07-01, 08:50, 18:10, 正常; 张伟, 2026-07-02, 09:05, 18:00, 迟到; 王芳, 2026-07-01, 08:45, 18:30, 正常; ... |
| **Process** | 进入 `/attendance` → 点击「导入考勤」→ 选择月份 2026-07 → 上传文件 → 确认 |
| **Output** | HTTP 200，`{ success: true, data: { total: 88, success: 86, failed: 2, errors: [{ row: 45, message: "2026-07-15 为周末，非排班日" }, { row: 88, message: "下班打卡时间早于上班打卡" }] } }` |
| **验证** | 考勤列表显示 2026-07 月数据，统计：张伟迟到 1 次，王芳全勤 |

### E2E-010 配置考勤班次

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/attendance/shifts` `{ name: "白班", startTime: "08:00", endTime: "17:00", restMinutes: 60, color: "#4CAF50" }` |
| **Process** | 进入 `/attendance` → 班次管理 → 新建班次 → 填写信息 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "shift1", name: "白班", startTime: "08:00", endTime: "17:00" } }` |
| **验证** | 班次列表显示「白班」 |

### E2E-011 分配班次

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/attendance/shift-assignments` `{ employeeId: "e1", shiftId: "shift1", startDate: "2026-08-01", endDate: "2026-08-31" }` |
| **Process** | 考勤 → 排班 → 选择员工张伟 → 分配白班 → 保存 |
| **Output** | HTTP 201，`{ success: true }` |
| **验证** | 排班表显示张伟 8 月全月白班 |

---

## 阶段三：社保与薪酬配置

### E2E-012 配置社保公积金

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/social/config` `{ city: "上海", effectiveFrom: "2026-07-01", type: "social", baseMin: 7384, baseMax: 36921, pension: { emp: 8, corp: 16 }, medical: { emp: 2, corp: 10 }, unemployment: { emp: 0.5, corp: 0.5 }, injury: { emp: 0, corp: 0.26 }, maternity: { emp: 0, corp: 1 } }` |
| **Process** | 进入 `/social-insurance` → 社保配置 → 新建配置 → 选择城市「上海」→ 填写基数和比例 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "sc1", city: "上海", isCurrent: true } }` |
| **验证** | 社保配置页显示上海当前生效配置，下限 7384，上限 36921 |

### E2E-013 配置公积金

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/social/config` `{ city: "上海", effectiveFrom: "2026-07-01", type: "housing", baseMin: 2800, baseMax: 36921, empRate: 7, corpRate: 7, supplementRate: 0 }` |
| **Process** | 社保公积金页 → 公积金配置 tab → 新建 → 填写 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "hc1", city: "上海", type: "housing", isCurrent: true } }` |
| **验证** | 公积金配置显示上海当前配置，个人 7%，企业 7% |

### E2E-014 创建薪酬模板

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/payroll/templates` `{ name: "明远制造标准模板", items: [{ name: "基本工资", type: "INCOME", formula: "monthlySalary", taxable: true }, { name: "岗位津贴", type: "INCOME", formula: "500", taxable: true }, { name: "交通补贴", type: "INCOME", formula: "200", taxable: false }, { name: "社保个人", type: "DEDUCT", formula: "socialEmp", taxable: false }, { name: "公积金个人", type: "DEDUCT", formula: "housingEmp", taxable: false }, { name: "个人所得税", type: "DEDUCT", formula: "tax", taxable: false }] }` |
| **Process** | 进入 `/money` → 薪酬模板 → 新建模板 → 添加薪资项 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "pt1", name: "明远制造标准模板" } }` |
| **验证** | 模板列表显示「明远制造标准模板」，包含 6 个薪资项 |

---

## 阶段四：制度发布与员工端启用

### E2E-015 创建考勤管理制度

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/policies` `{ title: "上海明远制造考勤管理制度", category: "考勤", content: "第一章 总则\n第一条 为规范公司考勤管理...\n第二章 工作时间\n第二条 工作时间为每日8:00-17:00，午休1小时...\n第三章 请假\n第三条 请假需提前1天通过系统提交..." }` |
| **Process** | 进入 `/policies` → 新建制度 → 填写标题、分类、正文 → 保存草稿 |
| **Output** | HTTP 201，`{ success: true, data: { id: "p1", title: "上海明远制造考勤管理制度", status: "DRAFT", currentStep: 1 } }` |
| **验证** | 制度列表显示草稿状态，当前步骤 1/4（起草） |

### E2E-016 推进民主程序

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | 依次调用：POST `/api/v1/policies/p1/advance-step` `{ step: 2, note: "已组织全体职工讨论" }` → POST `/api/v1/policies/p1/advance-step` `{ step: 3, note: "已与工会代表协商一致" }` → POST `/api/v1/policies/p1/advance-step` `{ step: 4, note: "已通过企业微信公示5个工作日" }` |
| **Process** | 制度详情 → 依次完成「讨论」「协商」「公示」三个步骤，每步添加备注 → 发布 |
| **Output** | 每步返回 HTTP 200 `{ success: true }`，最终 currentStep = 4，status = `PUBLISHED` |
| **验证** | 制度状态变为「已发布」，4 个步骤全部完成 |

### E2E-017 生成员工端自动登录令牌

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/portal/auto-login-token` `{ employeeId: "e1" }` |
| **Process** | 花名册 → 点击「张伟」→ 更多操作 → 「生成员工端登录链接」 |
| **Output** | HTTP 200，`{ success: true, data: { token: "auto-login-xxx-e1", url: "/portal/auto-login?token=auto-login-xxx-e1" } }` |
| **验证** | 生成可分享的员工端登录链接 |

### E2E-018 员工首次登录员工端

| 项目 | 内容 |
|------|------|
| **角色** | 员工（张伟） |
| **Input** | GET `/api/v1/portal/auto-login?token=auto-login-xxx-e1` |
| **Process** | 员工通过手机浏览器打开链接 → 自动登录 |
| **Output** | HTTP 200，`{ success: true, data: { employee: { id: "e1", name: "张伟", department: "生产车间" }, token: "portal-token-xxx" } }` |
| **验证** | 跳转至 `/portal/home`，首页显示张伟的个人信息概览 |

### E2E-019 员工查看并确认制度

| 项目 | 内容 |
|------|------|
| **角色** | 员工（张伟） |
| **Input** | 1. GET `/api/v1/portal/policies` → 2. GET `/api/v1/portal/policies/p1` → 3. POST `/api/v1/portal/policies/p1/read` |
| **Process** | 员工端 → 制度 tab → 查看考勤管理制度 → 阅读完毕 → 点击「已阅读」 |
| **Output** | 第一步：`[{ id: "p1", title: "上海明远制造考勤管理制度", read: false }]`；第三步：HTTP 200 `{ success: true }` |
| **验证** | 制度列表中该制度标记为已读，管理端阅读统计显示张伟已读 |

### E2E-020 员工查看合同

| 项目 | 内容 |
|------|------|
| **角色** | 员工（张伟） |
| **Input** | GET `/api/v1/portal/contract` |
| **Process** | 员工端 → 合同 tab → 查看合同信息 |
| **Output** | `{ contract: { id: "c1", type: "FIXED", startDate: "2022-03-01", endDate: "2025-02-28", status: "EXPIRED", monthlySalary: 8000 } }` |
| **验证** | 显示合同已过期（2025-02-28 到期），状态 EXPIRED |

---

## 阶段五：日常操作（8月）

### E2E-021 仪表盘风险检查

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/dashboard` |
| **Process** | 登录后查看仪表盘 |
| **Output** | `{ greeting: "上午好！今天有 2 件事需要处理", stats: { employeeCount: 4, highRiskCount: 1, todoCount: 2 }, todos: [{ id: "r1", type: "CONTRACT", priority: "URGENT", title: "张伟的合同已过期，请尽快续签", employeeName: "张伟", deadline: "2026-08-15" }, { id: "r2", type: "CONTRACT", priority: "MEDIUM", title: "王芳的合同将于2027-05-31到期", employeeName: "王芳" }] }` |
| **验证** | 仪表盘显示 4 名员工，1 条紧急待办（张伟合同过期），1 条中等待办（王芳合同即将到期） |

### E2E-022 处理合同续签待办

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | 1. PATCH `/api/v1/dashboard/todos/r1/resolve` → 2. PUT `/api/v1/employees/e1` `{ contractType: "FIXED", contractStart: "2025-03-01", contractEnd: "2028-02-28", monthlySalary: 9000 }` |
| **Process** | 1. 仪表盘 → 点击张伟的待办 → 标记已处理 → 2. 进入花名册 → 张伟详情 → 编辑合同信息 → 续签 3 年，月薪调整为 9000 → 保存 |
| **Output** | 第一步：HTTP 200 `{ success: true }`；第二步：HTTP 200 `{ success: true }` |
| **验证** | 待办消失，张伟合同状态更新为正常（2025-03-01 至 2028-02-28），月薪 9000 |

### E2E-023 录入考勤（8月每日）

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/attendance/daily` `{ employeeId: "e1", date: "2026-08-01", checkIn: "07:55", checkOut: "17:05", shiftId: "shift1", status: "NORMAL", overtime: 0 }` |
| **Process** | 考勤 → 每日考勤 → 逐日录入或批量导入 8 月考勤数据 |
| **Output** | HTTP 201，`{ success: true }` |
| **验证** | 考勤月报显示张伟 8 月出勤 22 天，迟到 0 次 |

### E2E-024 请假审批

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/attendance/leave` `{ employeeId: "e2", type: "事假", startDate: "2026-08-10", endDate: "2026-08-12", reason: "家中有事", days: 3 }` |
| **Process** | 考勤 → 请假记录 → 新建请假 → 选择王芳 → 事假 3 天 → 提交 |
| **Output** | HTTP 201，`{ success: true, data: { id: "lv1", status: "APPROVED" } }` |
| **验证** | 请假记录显示王芳 8 月 10-12 日事假，考勤统计扣除 3 天出勤 |

### E2E-025 发布考勤月报

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/attendance/monthly-report/publish` `{ month: "2026-08" }` |
| **Process** | 考勤 → 月度报表 → 选择 2026-08 → 确认数据无误 → 点击「发布」 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 考勤月报状态变为「已发布」，员工端可查看当月考勤 |

---

## 阶段六：月度薪酬闭环（8月发薪）

### E2E-026 创建发薪批次

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/payroll/batches` `{ month: "2026-08", templateId: "pt1", name: "2026年8月工资", payDate: "2026-09-10" }` |
| **Process** | 进入 `/money` → 发薪批次 → 新建批次 → 选择月份 8 月 → 选择模板「明远制造标准模板」→ 设置发薪日 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "b1", month: "2026-08", status: "DRAFT", employeeCount: 4 } }` |
| **验证** | 批次列表显示 8 月发薪批次，状态 DRAFT，包含 4 名员工 |

### E2E-027 计算工资

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/payroll/batches/b1/calculate` |
| **Process** | 发薪批次 → 选择 8 月批次 → 点击「计算」→ 系统自动计算所有员工工资 |
| **Output** | HTTP 200，`{ success: true, data: { results: [{ employeeId: "e1", employeeName: "张伟", baseSalary: 9000, allowance: 500, transport: 200, grossPay: 9700, socialEmp: 759.36, housingEmp: 630, tax: 421.32, netPay: 7889.32 }, { employeeId: "e2", employeeName: "王芳", baseSalary: 9000, allowance: 500, transport: 200, grossPay: 9700, socialEmp: 759.36, housingEmp: 630, tax: 421.32, netPay: 7889.32, leaveDeduction: 966.67, adjustedNetPay: 6922.65 }, { employeeId: "e3", employeeName: "陈强", baseSalary: 10000, allowance: 500, transport: 200, grossPay: 10700, socialEmp: 830.72, housingEmp: 700, tax: 533.28, netPay: 8636.00 }, { employeeId: "e4", employeeName: "赵敏", baseSalary: 8500, allowance: 500, transport: 200, grossPay: 9200, socialEmp: 712.64, housingEmp: 595, tax: 371.52, netPay: 7520.84 }] } }` |
| **验证** | 4 名员工工资计算完成，王芳因事假 3 天扣除 966.67 元，个税按累计预扣法计算 |

### E2E-028 个税试算

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/payroll/tax-trial` `{ employeeId: "e1", month: "2026-08", grossPay: 9700, socialEmp: 759.36, housingEmp: 630, specialDeduction: 0, accumulatedIncome: 67900, accumulatedTaxPaid: 2946.24 }` |
| **Process** | 薪酬 → 个税试算 → 选择张伟 → 输入累计数据 → 计算 |
| **Output** | `{ tax: 421.32, accumulatedIncome: 77600, accumulatedTax: 3367.56, accumulatedTaxPaid: 2946.24, thisMonthTax: 421.32 }` |
| **验证** | 个税计算结果与发薪批次中一致 |

### E2E-029 提交审批

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/payroll/batches/b1/submit` |
| **Process** | 发薪批次 → 确认数据 → 点击「提交审批」 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `PENDING_APPROVAL` |
| **验证** | 批次状态变为待审批 |

### E2E-030 管理员审批发薪

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员（刘明远） |
| **Input** | POST `/api/v1/payroll/batches/b1/approve` `{ comment: "核对无误，同意发放" }` |
| **Process** | 管理员登录 → 薪酬 → 发薪批次 → 查看 8 月批次 → 审批通过 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `APPROVED` |
| **验证** | 批次状态变为已审批，工资条生成 |

### E2E-031 员工查看工资条

| 项目 | 内容 |
|------|------|
| **角色** | 员工（张伟） |
| **Input** | GET `/api/v1/portal/payslip?month=2026-08` |
| **Process** | 员工端 → 工资条 tab → 选择 2026-08 |
| **Output** | `{ id: "ps1", month: "2026-08", baseSalary: 9000, allowance: 500, transport: 200, grossPay: 9700, socialEmp: 759.36, housingEmp: 630, tax: 421.32, netPay: 7889.32, confirmed: false }` |
| **验证** | 工资条显示完整明细，实发 7889.32 元，状态未确认 |

### E2E-032 员工确认工资条

| 项目 | 内容 |
|------|------|
| **角色** | 员工（张伟） |
| **Input** | POST `/api/v1/portal/payslip/ps1/confirm` |
| **Process** | 员工端 → 工资条 → 点击「确认无误」 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 工资条状态变为 CONFIRMED |

---

## 阶段七：社保月度办理

### E2E-033 查看社保月度变动

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/social/monthly-changes?month=2026-08` |
| **Process** | 进入 `/social-insurance` → 月度办理 → 选择 2026-08 |
| **Output** | `{ additions: [{ employeeId: "e1", employeeName: "张伟", reason: "已参保", base: 9000 }, { employeeId: "e2", employeeName: "王芳", reason: "已参保", base: 9000 }, { employeeId: "e3", employeeName: "陈强", reason: "已参保", base: 10000 }, { employeeId: "e4", employeeName: "赵敏", reason: "已参保", base: 8500 }], reductions: [], current: [...] }` |
| **验证** | 4 名员工均在参保列表中，无减员 |

### E2E-034 完成社保月度办理

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/social/monthly-process/complete` `{ month: "2026-08", type: "social" }` |
| **Process** | 社保页 → 月度办理 → 确认增减员无误 → 点击「完成社保办理」 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 社保办理状态变为已完成 |

### E2E-035 完成公积金月度办理

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/social/monthly-process/complete` `{ month: "2026-08", type: "housing" }` |
| **Process** | 社保页 → 公积金 tab → 月度办理 → 点击「完成公积金办理」 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 公积金办理状态变为已完成 |

---

## 阶段八：风险检查与合规

### E2E-036 用工体检诊断

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/dashboard/health-check` |
| **Process** | 进入 `/tools/health-check` → 点击「开始诊断」 |
| **Output** | `{ year: 2026, totalScore: 90, level: "healthy", dimensions: { contract: 100, salary_social: 100, attendance: 100, policy: 80, termination: 100, evidence: 60 }, summary: "整体用工合规状况良好，建议完善证据链管理" }` |
| **验证** | 6 维度评分显示，总分 90，等级 healthy，证据链维度较低（60 分） |

### E2E-037 保存体检诊断

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/dashboard/health-check/save` |
| **Process** | 诊断结果页 → 点击「保存诊断报告」 |
| **Output** | HTTP 200，`{ success: true, data: { id: "hc-new", year: 2026, totalScore: 90 } }` |
| **验证** | 诊断历史中出现 2026 年记录 |

### E2E-038 AI 顾问咨询

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/ai/consultation` `{ type: "CHAT", question: "我们公司有员工合同过期了未续签，有什么法律风险？" }` |
| **Process** | 进入 `/ai-assistant` → 输入问题 → 发送 |
| **Output** | `{ conversationId: "conv-e2e", answer: "根据《劳动合同法》第十条和第八十二条，已建立劳动关系未同时订立书面劳动合同的，应当自用工之日起一个月内订立。超过一个月未续签的，应当向劳动者每月支付二倍工资。建议您尽快为合同过期的员工续签劳动合同...", confidence: 0.92, sources: [{ title: "劳动合同法第十条", url: "" }, { title: "劳动合同法第八十二条", url: "" }] }` |
| **验证** | AI 回答包含法律依据和操作建议，置信度 > 0.9 |

---

## 阶段九：新员工入职流程

### E2E-039 创建入职工作流程

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/work-processes` `{ type: "ONBOARDING", title: "8月新员工入职-孙磊", data: { name: "孙磊", phone: "13900008888", department: "生产车间", position: "操作工", hireDate: "2026-08-15", salary: 8000, contractType: "FIXED", contractEnd: "2029-08-14" } }` |
| **Process** | 进入 `/work-process` → 新建 → 选择类型「入职」→ 填写新员工信息 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "wp1", title: "8月新员工入职-孙磊", type: "ONBOARDING", status: "DRAFT" } }` |
| **验证** | 工作流程列表显示新入职流程 |

### E2E-040 生成入职链接并发送

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/portal/auto-login-token` `{ employeeId: "e-new" }`（系统自动创建员工记录后） |
| **Process** | 工作流程详情 → 点击「生成入职链接」→ 将链接发送给新员工 |
| **Output** | `{ success: true, data: { token: "onboarding-token-sunlei", url: "/portal/onboarding?token=onboarding-token-sunlei" } }` |
| **验证** | 生成入职链接 |

### E2E-041 新员工填写入职信息

| 项目 | 内容 |
|------|------|
| **角色** | 新员工（孙磊） |
| **Input** | 1. GET `/api/v1/portal/onboarding/onboarding-token-sunlei` → 2. POST `/api/v1/portal/onboarding` `{ token: "onboarding-token-sunlei", name: "孙磊", gender: "男", idCard: "310105200001015678", phone: "13900008888", bank: "建设银行", account: "6227000100025678", emergencyContact: "孙母", emergencyPhone: "13800002222", address: "上海市闵行区测试路200号" }` |
| **Process** | 新员工打开链接 → 查看入职须知 → 填写个人信息 → 提交 |
| **Output** | 第一步：`{ orgName: "上海明远制造有限公司", position: "操作工", expectedHireDate: "2026-08-15" }`；第二步：HTTP 200 `{ success: true, message: "入职信息提交成功" }` |
| **验证** | 入职信息提交成功 |

### E2E-042 新员工上传入职文件

| 项目 | 内容 |
|------|------|
| **角色** | 新员工（孙磊） |
| **Input** | `FormData { file: 身份证正面.jpg }` → `FormData { file: 体检报告.pdf }` |
| **Process** | 入职页面 → 文件上传 → 上传身份证照片和体检报告 |
| **Output** | HTTP 200，`{ success: true, data: { url: "/uploads/onboarding/id-front.jpg" } }` |
| **验证** | 文件上传成功 |

### E2E-043 HR 审核入职

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/work-processes/wp1/submit` |
| **Process** | 工作流程 → 入职流程 → 检查新员工提交的信息和文件 → 确认无误 → 提交 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `SUBMITTED` |
| **验证** | 入职流程完成，花名册新增孙磊（5 名员工），合同自动创建 |

---

## 阶段十：解聘流程

### E2E-044 创建解聘草稿

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/termination/draft` `{ employeeId: "e3", reason: "协商解除", reasonDetail: "公司业务调整，岗位裁撤", lastDay: "2026-08-31" }` |
| **Process** | 进入 `/termination` → 新建解聘 → 选择陈强 → 选择原因「协商解除」→ 填写最后工作日 → 保存 |
| **Output** | HTTP 201，`{ success: true, data: { id: "td1", employeeId: "e3", employeeName: "陈强", reason: "协商解除", status: "DRAFT" } }` |
| **验证** | 解聘列表显示陈强的草稿 |

### E2E-045 解聘风险评估

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/termination/assess/e3?reason=协商解除` |
| **Process** | 解聘详情 → 点击「风险评估」 |
| **Output** | `{ riskLevel: "LOW", riskScore: 15, factors: [{ factor: "入职年限", description: "入职5.5年", impact: "medium" }, { factor: "合同状态", description: "无固定期限合同", impact: "medium" }, { factor: "协商解除", description: "双方协商一致", impact: "low" }], recommendations: ["建议支付N经济补偿（5.5个月）", "签署协商解除协议", "办理社保减员"] }` |
| **验证** | 风险等级 LOW，建议支付 5.5 个月补偿 |

### E2E-046 查看解聘清单

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/termination/checklist/协商解除?employeeId=e3` |
| **Process** | 解聘详情 → 查看「办理清单」 |
| **Output** | `{ items: [{ id: "cl1", title: "签署解除协议", required: true, completed: false }, { id: "cl2", title: "支付经济补偿（5.5个月×10000=55000元）", required: true, completed: false }, { id: "cl3", title: "工作交接", required: true, completed: false }, { id: "cl4", title: "社保公积金减员", required: true, completed: false }, { id: "cl5", title: "出具离职证明", required: true, completed: false }] }` |
| **验证** | 清单包含 5 项必须操作 |

### E2E-047 更新解聘草稿

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | PUT `/api/v1/termination/draft/td1` `{ compensation: 55000, compensationMonths: 5.5, lastDay: "2026-08-31", checklist: [{ id: "cl1", completed: true }, { id: "cl2", completed: true }, { id: "cl3", completed: true }] }` |
| **Process** | 解聘详情 → 填写补偿金额 55000 → 逐项勾选已完成清单项 → 保存 |
| **Output** | HTTP 200，`{ success: true }` |
| **验证** | 草稿更新成功，3/5 清单项已完成 |

### E2E-048 提交解聘审批

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/termination/draft/td1/submit` |
| **Process** | 解聘详情 → 确认信息 → 点击「提交审批」 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `PENDING_APPROVAL` |
| **验证** | 解聘状态变为待审批 |

### E2E-049 管理员审批解聘

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员（刘明远） |
| **Input** | POST `/api/v1/termination/draft/td1/approve` `{ comment: "同意协商解除，补偿金额合理" }` |
| **Process** | 管理员登录 → 解聘管理 → 查看陈强解聘申请 → 审批通过 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `APPROVED` |
| **验证** | 解聘状态变为已审批 |

### E2E-050 执行解聘

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | POST `/api/v1/termination/draft/td1/execute` |
| **Process** | 解聘详情 → 完成剩余清单项（社保减员、离职证明）→ 点击「执行解聘」 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `EXECUTED` |
| **验证** | 陈强员工状态变为 `RESIGNED`，社保公积金自动减员，花名册显示 4 名在职员工 |

---

## 阶段十一：月末检查与审计

### E2E-051 查看薪酬仪表盘

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/salary/dashboard?year=2026` |
| **Process** | 进入 `/money` → 薪酬分析 → 查看 2026 年数据 |
| **Output** | `{ year: 2026, monthly: [{ month: "2026-08", totalPay: 34200, avgPay: 8550, headcount: 4 }], departmentSalary: [{ department: "生产车间", avgSalary: 8500 }, { department: "行政部", avgSalary: 9000 }, { department: "质检部", avgSalary: 8500 }], salaryDistribution: [{ range: "8K-10K", count: 4 }], yoyChange: 0 }` |
| **验证** | 8 月总薪酬 34200 元，平均 8550 元，4 名员工 |

### E2E-052 查看审计日志

| 项目 | 内容 |
|------|------|
| **角色** | 企业管理员 |
| **Input** | GET `/api/v1/audit?page=1&pageSize=20` |
| **Process** | 进入 `/audit` → 查看操作日志 |
| **Output** | `{ data: [{ id: "al1", entity: "EMPLOYEE", action: "IMPORT", operator: "李萍", target: "批量导入4名员工", timestamp: "2026-08-01T09:30:00Z" }, { id: "al2", entity: "PAYROLL", action: "APPROVE", operator: "刘明远", target: "2026年8月工资批次", timestamp: "2026-08-28T14:00:00Z" }, { id: "al3", entity: "TERMINATION", action: "EXECUTE", operator: "李萍", target: "陈强协商解除", timestamp: "2026-08-31T16:00:00Z" }], pagination: { total: 25 } }` |
| **验证** | 审计日志完整记录了导入、审批、解聘等关键操作 |

### E2E-053 导出花名册

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/export/roster?status=ACTIVE` |
| **Process** | 花名册 → 点击「导出」→ 选择在职员工 → 下载 |
| **Output** | HTTP 200，下载 `花名册_2026-08-31.xlsx`，包含 4 条在职员工记录（陈强已离职） |
| **验证** | 导出文件包含 4 名在职员工，不含已离职的陈强 |

### E2E-054 导出工资条

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/export/payslip?batchId=b1` |
| **Process** | 薪酬 → 8 月批次 → 点击「导出工资条」→ 下载 |
| **Output** | HTTP 200，下载 `工资条_2026-08.xlsx`，包含 4 条工资明细 |
| **验证** | 导出文件包含 4 名员工的完整工资明细 |

---

## 阶段十二：员工离职申请（员工端发起）

### E2E-055 员工提交离职申请

| 项目 | 内容 |
|------|------|
| **角色** | 员工（王芳） |
| **Input** | POST `/api/v1/portal/resignation/submit` `{ reason: "个人发展", expectedLastDay: "2026-09-30", description: "感谢公司三年培养，因个人职业规划调整申请离职" }` |
| **Process** | 员工端 → 离职申请 → 填写离职原因和期望最后工作日 → 提交 |
| **Output** | HTTP 201，`{ success: true, data: { id: "rg1", status: "PENDING" } }` |
| **验证** | 离职申请提交成功，状态待处理 |

### E2E-056 HR 查看离职申请

| 项目 | 内容 |
|------|------|
| **角色** | HR |
| **Input** | GET `/api/v1/portal/resignation/status`（或管理端查看） |
| **Process** | 管理端 → 解聘管理 → 查看员工发起的离职申请 |
| **Output** | `[{ id: "rg1", employeeName: "王芳", reason: "个人发展", expectedLastDay: "2026-09-30", status: "PENDING", submittedAt: "2026-08-31T10:00:00Z" }]` |
| **验证** | 离职申请列表显示王芳的申请 |

### E2E-057 员工撤回离职申请

| 项目 | 内容 |
|------|------|
| **角色** | 员工（王芳） |
| **Input** | POST `/api/v1/portal/resignation/rg1/withdraw` |
| **Process** | 员工端 → 离职申请 → 点击「撤回」 |
| **Output** | HTTP 200，`{ success: true }`。状态变为 `WITHDRAWN` |
| **验证** | 离职申请状态变为已撤回 |

---

## 全流程验证检查清单

| # | 检查项 | 预期结果 | 实际结果 |
|---|--------|----------|----------|
| 1 | 租户创建成功 | 组织列表可见，管理员可登录 | ☐ |
| 2 | 企业信息配置完成 | 设置页显示完整企业信息 | ☐ |
| 3 | HR 子账号可登录 | HR 角色可访问各功能模块 | ☐ |
| 4 | 花名册导入成功 | 4 名员工数据完整 | ☐ |
| 5 | 考勤数据导入成功 | 考勤月报数据正确 | ☐ |
| 6 | 社保公积金配置生效 | 上海基数和比例正确 | ☐ |
| 7 | 薪酬模板创建成功 | 模板包含 6 个薪资项 | ☐ |
| 8 | 制度发布流程完整 | 4 步民主程序全部完成 | ☐ |
| 9 | 员工端可登录 | 自动登录成功，首页正常 | ☐ |
| 10 | 员工可查看制度并签收 | 制度标记为已读 | ☐ |
| 11 | 仪表盘风险提示正确 | 合同过期风险准确 | ☐ |
| 12 | 合同续签成功 | 员工合同状态更新 | ☐ |
| 13 | 考勤月报发布成功 | 员工端可查看当月考勤 | ☐ |
| 14 | 发薪批次计算正确 | 工资明细金额准确 | ☐ |
| 15 | 个税计算正确 | 累计预扣法计算无误 | ☐ |
| 16 | 发薪审批流程完整 | HR 提交 → 管理员审批 | ☐ |
| 17 | 员工可查看并确认工资条 | 工资条状态 CONFIRMED | ☐ |
| 18 | 社保月度办理完成 | 社保和公积金均已完成 | ☐ |
| 19 | 用工体检诊断正常 | 总分 ≥ 80，等级 healthy | ☐ |
| 20 | AI 顾问可咨询 | 回答包含法律依据 | ☐ |
| 21 | 新员工入职流程完整 | 入职 → 填信息 → 上传 → 审核 | ☐ |
| 22 | 解聘流程完整 | 草稿 → 风险评估 → 审批 → 执行 | ☐ |
| 23 | 解聘后员工状态正确 | 状态 RESIGNED，社保减员 | ☐ |
| 24 | 审计日志完整 | 关键操作均有记录 | ☐ |
| 25 | 数据导出正确 | 花名册和工资条导出无误 | ☐ |
| 26 | 员工离职申请流程 | 提交 → 查看 → 撤回 | ☐ |

---

## 流程时间线

| 日期 | 操作 | 角色 |
|------|------|------|
| 2026-08-01 09:00 | 平台超管创建租户 | SUPER_ADMIN |
| 2026-08-01 09:15 | 企业管理员首次登录，完善信息 | 刘明远 |
| 2026-08-01 09:30 | 添加 HR 用户 | 刘明远 |
| 2026-08-01 09:45 | HR 登录，批量导入花名册 | 李萍 |
| 2026-08-01 10:00 | 导入 7 月考勤数据 | 李萍 |
| 2026-08-01 10:15 | 配置考勤班次和排班 | 李萍 |
| 2026-08-01 10:30 | 配置社保公积金 | 李萍 |
| 2026-08-01 11:00 | 创建薪酬模板 | 李萍 |
| 2026-08-01 14:00 | 创建考勤管理制度并推进民主程序 | 李萍 |
| 2026-08-01 15:00 | 生成员工端登录链接，员工首次登录 | 李萍 → 张伟 |
| 2026-08-01 15:30 | 员工查看制度并签收 | 张伟 |
| 2026-08-02 09:00 | 查看仪表盘风险，处理合同续签 | 李萍 |
| 2026-08-04~08-30 | 每日录入考勤 | 李萍 |
| 2026-08-10 | 王芳请假 3 天 | 李萍 |
| 2026-08-15 | 新员工孙磊入职 | 李萍 → 孙磊 |
| 2026-08-28 | 创建发薪批次，计算工资，提交审批 | 李萍 |
| 2026-08-28 14:00 | 管理员审批发薪 | 刘明远 |
| 2026-08-29 | 员工查看并确认工资条 | 张伟 |
| 2026-08-30 | 社保公积金月度办理 | 李萍 |
| 2026-08-30 | 用工体检诊断 | 李萍 |
| 2026-08-31 | 陈强协商解除解聘执行 | 李萍 → 刘明远 |
| 2026-08-31 | 导出花名册和工资条 | 李萍 |
| 2026-08-31 17:00 | 王芳提交离职申请后撤回 | 王芳 |
