# TurboHR / 白话用工侠 系统功能详细分析报告

> 项目路径：`/Users/freedak/Documents/AIDashboard/UTMS/TurboHR/`
> 分析日期：2026-07-26
> 版本：v1.0

---

## 一、系统总体架构

### 1.1 技术栈

| 层级 | 技术选型 | 版本/说明 |
|------|---------|----------|
| 前端框架 | React 18 + TypeScript | Vite 构建，懒加载 + Suspense |
| 前端路由 | React Router v6 | 嵌套路由 + 认证守卫 |
| 状态管理 | Zustand + persist | localStorage 持久化 auth 状态 |
| 数据获取 | TanStack React Query | 缓存 + 自动刷新 + Mutation |
| UI 组件 | 自建组件库 | Card/Button/Input/Modal/Pagination/EmptyState/Skeleton/Signal/ConfirmDialog |
| 图标 | lucide-react | — |
| 图表 | recharts | 饼图等 |
| Markdown | react-markdown + remark-gfm + rehype-raw | AI 回复渲染 |
| 通知 | sonner | Toast 消息 |
| 后端框架 | Express 4 + TypeScript | tsx watch 热重载 |
| ORM | Prisma 5 | PostgreSQL |
| 数据库 | PostgreSQL | pgvector 扩展（RAG 向量检索） |
| 认证 | JWT（jsonwebtoken） | accessToken + refreshToken |
| 加密 | AES-256-CBC | 薪资/身份证/银行账号加密存储 |
| AI | OpenAI SDK → 阿里云 DashScope | qwen-plus / qwen-max 模型 |
| 文件上传 | multer | 内存/磁盘存储 |
| 数据导出 | ExcelJS + JSON | 支持 gzip 压缩 |
| 数据导入 | xlsx (SheetJS) | Excel 解析 + 身份证校验 |
| 安全 | helmet + cors + express-rate-limit | API 限流 |
| 日志 | morgan | HTTP 请求日志 |
| 压缩 | compression | SSE 流式响应排除压缩 |

### 1.2 项目目录结构

```
TurboHR/
├── backend/                    # 后端（Express + Prisma）
│   ├── prisma/
│   │   ├── schema.prisma       # 数据模型定义（879 行，30+ 表/模型）
│   │   ├── seed.ts             # 种子数据
│   │   ├── seed-wufang.ts      # 五方科技演示数据
│   │   └── migrations/         # 数据库迁移
│   ├── src/
│   │   ├── app.ts              # Express 应用配置 + 路由挂载
│   │   ├── index.ts            # 启动入口
│   │   ├── routes/             # 15 个路由模块
│   │   ├── services/           # 8 个业务服务
│   │   ├── middleware/         # 5 个中间件
│   │   ├── schemas/            # 4 个 Zod 校验 schema
│   │   └── lib/                # 5 个工具库
│   └── package.json
├── frontend/                   # 前端（React + Vite）
│   ├── src/
│   │   ├── App.tsx             # 路由定义 + 布局
│   │   ├── pages/              # 17 个页面组件
│   │   │   ├── auth/           # 认证页面（登录/注册/忘记密码）
│   │   │   └── portal/         # 员工端页面（5 个）
│   │   ├── components/         # 组件
│   │   │   ├── layout/         # 布局组件（TopNav/MobileTabBar/PageContainer）
│   │   │   └── ui/             # UI 基础组件（9 个）
│   │   ├── hooks/              # 自定义 Hooks（3 个）
│   │   ├── store/              # Zustand 状态管理
│   │   ├── lib/                # API 客户端
│   │   └── types/              # TypeScript 类型定义
│   └── package.json
├── docs/                       # 文档
├── 0-req.md                    # 需求文档
├── 1-prd.md                    # 产品需求文档
├── 2-task.md                   # 任务拆解
└── 白话用工侠_测试页面.html      # HTML 原型（6370 行）
```

### 1.3 系统角色

| 角色 | 端 | 说明 |
|------|-----|------|
| ADMIN | 管理端 | 系统管理员，全部权限 + 数据导出 |
| HR | 管理端 | HR 操作员，业务操作权限 |
| VIEWER | 管理端 | 只读查看者 |
| EMPLOYEE | 员工端 | 普通员工，查看工资条/合同/入职填报 |

### 1.4 套餐体系

| 套餐 | AI 问答 | 合同审查 | 案例匹配 | 最大员工数 |
|------|---------|---------|---------|-----------|
| FREE | 10 次/月 | 3 次/月 | 3 次/月 | 20 |
| PRO | 100 次/月 | 20 次/月 | 20 次/月 | 更多 |
| ENTERPRISE | 无限 | 无限 | 无限 | 无限 |

---

## 二、数据库模型详解（Prisma Schema）

### 2.1 枚举定义（15 个）

| 枚举 | 值 | 用途 |
|------|-----|------|
| `Plan` | FREE / PRO / ENTERPRISE | 组织套餐等级 |
| `Role` | ADMIN / HR / VIEWER | 管理端用户角色 |
| `EmployeeStatus` | ACTIVE / RESIGNED | 员工状态 |
| `FemaleWorkerType` | CADRE / WORKER | 女性岗位类型（影响退休年龄） |
| `ContractType` | FIXED / UNFIXED / UNSIGNED / LABOR / INTERNSHIP | 合同类型 |
| `SignMethod` | PAPER / ELECTRONIC | 签署方式 |
| `RiskType` | CONTRACT / SALARY / TERMINATION / MONTHLY / ONBOARDING | 风险类型 |
| `RiskLevel` | HIGH / MEDIUM / LOW | 风险等级 |
| `RiskStatus` | PENDING / RESOLVED / IGNORED | 风险处理状态 |
| `PayrollBatchType` | REGULAR / TERMINATION / BONUS / SEVERANCE | 工资批次类型 |
| `PayrollBatchStatus` | DRAFT / ARCHIVED | 批次状态 |
| `PayslipItemType` | INPUT / CALCULATED | 工资条项类型 |
| `PayslipStatus` | PENDING / PUBLISHED | 工资条发布状态 |
| `TerminationReason` | NEGOTIATED / FAULT / NONFAULT / LAYOFF / EXPIRED / RESIGNATION | 解聘原因 |
| `RiskAssessment` | SAFE / WARNING / DANGER | 风险评估结果 |
| `OnboardingStatus` | PENDING / APPROVED / REJECTED / CANCELLED | 入职链接状态 |
| `ContractConfirmStatus` | UNCONFIRMED / CONFIRMED / EXPIRED | 合同确认状态 |

### 2.2 数据模型总览（30+ 个模型）

```
核心组织
├── Organization          # 企业组织（套餐/城市/发薪频率/退休提醒）
├── User                  # 管理端用户（手机号/角色/禁用状态）
│
员工管理
├── Employee              # 员工（AES 加密薪资/身份证/银行账号）
├── LaborContract         # 劳动合同（类型/期限/试用期/续签/电子签）
├── OvertimeRecord        # 加班记录（工作日/休息日/节假日）
├── DisciplinaryRecord    # 违纪记录（类型/严重度/处理/签字确认）
├── AttendanceRecord      # 考勤记录（打卡/迟到/早退/缺勤/加班）
├── TrainingRecord        # 培训记录（制度培训/签收确认）
├── PerformanceRecord     # 绩效记录（考核周期/得分/等级/改进计划）
├── EmployeeAttachment    # 员工附件（身份证/银行卡/合同扫描件等）
├── SalaryChangeRecord    # 薪酬变更记录（版本化，effectiveMonth/endMonth）
├── EmployeeDepartmentRecord  # 部门变更记录（版本化）
│
薪税管理
├── PayrollBatch          # 工资批次（月/序号/类型/状态/汇总金额）
├── BatchEntry            # 批次明细（每员工薪酬项 + 自动计算项 + 风险提示）
├── Payslip               # 工资条（薪酬构成 + 累计预扣法 + 确认状态）
├── PayslipItem           # 工资条模版项（预置 + 自定义，公式计算）
├── OvertimeConfig        # 加班费配置（倍率/月计薪天数）
│
社保公积金
├── SocialInsuranceConfig     # 社保配置（版本化，按城市，比例/基数上下限）
├── HousingFundConfig         # 公积金配置（版本化，按城市）
├── EmployeeSocialInsRecord   # 员工社保记录（版本化，startMonth/endMonth）
├── EmployeeHousingFundRecord # 员工公积金记录（版本化）
├── SocialMonthlyProcess      # 月度社保/公积金办理记录（快照）
│
解聘管理
├── TerminationRecord     # 解聘/离职记录（状态机/补偿金明细/交接清单/审批）
│
风险管理
├── RiskItem              # 风险待办（自动检测 + 手动创建）
├── AuditLog              # 审计日志（操作/实体/详情/IP）
│
通知管理
├── NotificationSetting   # 通知设置（合同到期/未签/加班/工资条/月度提醒日）
├── NotificationLog       # 通知发送记录
│
员工端
├── OnboardingLink        # 入职填报链接（token/状态/表单数据/过期时间）
├── ContractConfirmLink   # 合同确认链接（token/验证码/签署证据链）
│
AI 能力
├── AIConversation        # AI 会话记录（标题/消息列表）
├── AIReviewRecord        # AI 审查/案例匹配记录
├── RagKnowledge          # RAG 知识库（pgvector 向量检索）
├── RetirementPolicy      # 退休政策版本管理（AI 解析/用户确认）
```

### 2.3 关键数据设计模式

| 模式 | 实现 | 涉及模型 |
|------|------|---------|
| **版本化快照** | `effectiveMonth` + `endMonth` + `isCurrent` | SocialInsuranceConfig, HousingFundConfig, SalaryChangeRecord, EmployeeSocialInsRecord, EmployeeHousingFundRecord, EmployeeDepartmentRecord |
| **敏感字段加密** | AES-256-CBC 对称加密 | Employee.monthlySalary, idCardNumber, bankAccount |
| **身份证哈希索引** | SHA-256 哈希用于去重查询 | Employee.idCardHash |
| **状态机** | status + currentStep 字段 | TerminationRecord (DRAFT→PENDING_APPROVAL→APPROVED→EXECUTING→COMPLETED) |
| **补偿金明细** | JSON 字段存储分项 + 调整记录 | TerminationRecord.compensationBreakdown |
| **合规检查覆盖** | JSON 字段记录人工覆盖原因 | TerminationRecord.checklistOverrides |
| **工作交接清单** | JSON 数组，每项含 done/remark | TerminationRecord.handoverItems |
| **月度办理快照** | JSON 存储办理时全量数据 | SocialMonthlyProcess.snapshot |
| **AI 消息历史** | JSON 数组 [{role, content}] | AIConversation.messages |
| **RAG 向量检索** | pgvector vector(1536) + ivfflat 索引 | RagKnowledge.embedding |

---

## 三、后端 API 详细分析

### 3.1 API 路由总览（15 个路由模块）

| 路由前缀 | 文件 | 行数 | 功能 |
|---------|------|------|------|
| `/api/v1/auth` | auth.routes.ts | 3445B | 注册/登录/刷新令牌 |
| `/api/v1/dashboard` | dashboard.routes.ts | 2865B | 仪表盘数据 + 待办操作 |
| `/api/v1/employees` | employee.routes.ts | 7334B | 员工 CRUD |
| `/api/v1/roster` | roster.routes.ts | 38878B | 花名册聚合 API（最大路由） |
| `/api/v1/termination` | termination.routes.ts | 10689B | 解聘/离职全流程 |
| `/api/v1/ai` | ai.routes.ts | 24384B | AI 问答/审查/案例/预测 |
| `/api/v1/portal` | portal.routes.ts | 16433B | 员工端全部接口 |
| `/api/v1/settings` | settings.routes.ts | 8574B | 企业/用户/退休政策 |
| `/api/v1/payroll` | payroll.routes.ts | 19655B | 加班费 + 工资条 |
| `/api/v1/payroll2` | payroll2.routes.ts | 26958B | 工资批次 + 薪酬模版 |
| `/api/v1/social` | social.routes.ts | 44930B | 社保公积金配置/记录/月度办理 |
| `/api/v1/notifications` | notification.routes.ts | 6436B | 通知设置/日志 |
| `/api/v1/attachments` | attachment.routes.ts | 1926B | 文件附件 |
| `/api/v1/export` | export.routes.ts | 10238B | 数据导出（JSON/Excel + 脱敏） |
| `/api/v1/import` | import.routes.ts | 34981B | Excel 批量导入 |

### 3.2 认证与安全

#### JWT 双 Token 机制
- **accessToken**：短期令牌，API 请求携带
- **refreshToken**：长期令牌，accessToken 过期后自动刷新
- **前端自动刷新**：axios 拦截器 401 → 用 refreshToken 换新 accessToken → 重放原请求

#### 加密体系
```
AES-256-CBC 对称加密
├── Employee.monthlySalary    → 月薪加密存储
├── Employee.idCardNumber     → 身份证号加密存储
├── Employee.bankAccount      → 银行账号加密存储
└── SHA-256 哈希
    └── Employee.idCardHash   → 身份证哈希（用于查重/匹配）
```

#### 中间件链
| 中间件 | 用途 |
|--------|------|
| `helmet` | 安全 HTTP 头 |
| `compression` | Gzip 压缩（排除 SSE） |
| `cors` | 跨域（credentials: true） |
| `express.json` | JSON 解析（10MB 限制） |
| `morgan` | HTTP 日志 |
| `apiLimiter` | API 限流 |
| `authMiddleware` | JWT 验证 |
| `requireAdmin` | ADMIN 角色校验 |
| `auditLog` | 操作审计日志 |

#### 员工端认证
- **密码登录**：手机号 + 密码（bcrypt 比对）
- **验证码登录**：手机号 + 验证码（60 秒频率限制，5 次错误锁定）
- **portalAuth 中间件**：验证 token role === 'EMPLOYEE'

### 3.3 核心业务服务（8 个 Service）

#### 3.3.1 risk.service.ts（568 行）— 风险自动检测引擎

| 函数 | 检测内容 |
|------|---------|
| `detectContractRisks()` | 合同风险：未签合同（>30天 HIGH / >365天 视为无固定期限）/ 即将到期（≤30天 MEDIUM）/ 已到期（HIGH）/ 试用期超限（MEDIUM） |
| `detectOnboardingRisks()` | 入职风险：入职未签合同（>30天 HIGH） |
| `detectTerminationRisks()` | 解聘风险：孕期/哺乳期（HIGH）/ 医疗期（MEDIUM）/ 工伤（HIGH） |
| `detectMonthlyTasks()` | 月度任务：发薪日/社保日/公积金日/个税日 + 工资条生成提醒 |
| `runRiskDetection()` | 执行全量检测 + 去重写入 RiskItem |
| `getDashboardData()` | 仪表盘聚合：员工数/风险数/待办/人力成本/合同/解聘/违纪/考勤等 |

**风险检测触发时机**：每次请求 `/dashboard` 时自动执行 `runRiskDetection()`

#### 3.3.2 termination.service.ts（811 行）— 解聘全流程

**6 步向导**：
1. 选择员工
2. 解聘方式（7 种原因）
3. 合规检查（按原因动态生成 checklist + 系统自动判断）
4. 费用结算（补偿金计算 + 分项明细 + 调整记录）
5. 工作交接（6 项默认清单）
6. 确认提交

**状态机**：
```
DRAFT → PENDING_APPROVAL → APPROVED → EXECUTING → COMPLETED
                ↓
            REJECTED
DRAFT/CANCELLED ← 撤回
```

**合规检查清单**（按解聘原因动态生成）：
| 原因 | 检查项 |
|------|--------|
| 协商解除 | 支付补偿金 / 签署协议 / 结清工资 |
| 过错辞退 | 规章制度依据 / 违纪证据 / 通知工会 / 书面通知 |
| 非过错解除 | 医疗期满（系统自动判断）/ 培训或调岗（系统查记录）/ 支付补偿金 / 提前30天通知 |
| 经济性裁员 | 提前30天说明 / 听取意见 / 报告劳动部门 / 支付补偿金 |
| 合同到期 | 支付补偿金 / 提前通知 |

**系统自动判断能力**：
- 医疗期状态 → 自动标记 `autoChecked: false`
- 培训记录 → 自动查 `trainingRecords` 判断是否经过培训
- 风险评估 → 孕期/工伤/医疗期 → DANGER 级别

**事务处理**：解聘创建在事务中执行 → 创建记录 + 关闭社保/公积金 + 更新员工状态 + 解决风险待办

#### 3.3.3 ai.service.ts（237 行）— AI 核心服务

| 函数 | 模型 | 用途 |
|------|------|------|
| `chat()` | qwen-plus | 普通对话（含 RAG 检索 + 企业上下文） |
| `chatStream()` | qwen-plus | SSE 流式对话 |
| `reviewContract()` | qwen-max | 合同审查（结构化解析风险项 + 合规评分） |
| `matchCase()` | qwen-max | 案例匹配（相似案例 + 败诉风险 + 建议） |
| `predictRisks()` | qwen-plus | 风险预测（未来30天 + 优先级建议） |
| `predictRisksStream()` | qwen-plus | SSE 流式风险预测（Markdown 表格输出） |

**AI 上下文注入**：
- `buildOrgContext()` 函数构建企业数据概览
- 包含：员工列表（姓名/部门/入职日期/工龄/合同状态/特殊状态）+ 当前风险项
- 支持按员工/部门/riskType 范围筛选

**RAG 知识库**：
- 15 条预置法律条文（劳动合同法/劳动法/社会保险法）
- pgvector 向量检索（cosine 距离，ivfflat 索引）
- `searchKnowledge()` 检索 top-K 相关条文注入 system prompt

**用量控制**：
- `checkUsageLimit()` 按套餐限制月度 AI 调用次数
- `recordUsage()` 写入 AuditLog 记录

#### 3.3.4 rag.service.ts（98 行）— RAG 知识库

- 启动时自动初始化（`seedKnowledgeBase()`）
- 自动建表 + 创建向量索引
- 首次启动注入 15 条法律条文种子数据
- 使用 `text-embedding-v2` 模型生成 1536 维向量

#### 3.3.5 retirement.service.ts（260 行）— 退休计算

- 从身份证号提取出生日期 + 性别
- 渐进式延迟退休算法（2025-01-01 起改革）
  - 男性：60→63 岁，每 4 个月延迟 1 个月
  - 女性干部：55→58 岁，每 4 个月延迟 1 个月
  - 女性工人：50→55 岁，每 2 个月延迟 1 个月
- AI 解析最新退休政策 + 用户确认 + 版本管理

#### 3.3.6 contract.service.ts（23861B）— 合同服务

- 合同状态计算（`getContractStatus`）
- 合同 CRUD + 续签

#### 3.3.7 payroll.service.ts（15131B）— 薪酬计算

- 薪酬模版管理
- 批次明细计算（`calcBatchEntry`）
- 社保/公积金/个税自动计算
- 工资条生成（`generatePayslipFromBatches`）
- 风险提示（`getPayrollRiskWarnings`）

#### 3.3.8 auth.service.ts（3012B）— 认证服务

- 注册（创建 Organization + User）
- 登录（bcrypt 验证 + JWT 签发）
- Token 刷新

### 3.4 员工端 API（portal.routes.ts）

| 端点 | 方法 | 功能 |
|------|------|------|
| `/portal/login` | POST | 密码登录 |
| `/portal/send-code` | POST | 发送验证码（60s 频率限制） |
| `/portal/verify-code` | POST | 验证码登录（5 次错误锁定） |
| `/portal/payslip` | GET | 查看当月工资条 |
| `/portal/payslip/history` | GET | 最近 6 个月工资条 |
| `/portal/payslip/:id/confirm` | POST | 工资条确认已阅（记录 IP） |
| `/portal/contract` | GET | 查看我的合同 |
| `/portal/onboarding/:token` | GET | 获取入职填报信息 |
| `/portal/onboarding` | POST | 入职填报提交 |
| `/portal/onboarding/:token/upload` | POST | 入职文件上传（JPG/PNG/PDF/BMP，10MB 限制） |
| `/portal/onboarding/:id/revoke` | POST | 撤回入职链接（HR 端） |
| `/portal/contract-confirm/:token` | GET | 获取合同确认信息 |
| `/portal/contract-confirm/send-code` | POST | 合同签署验证码 |
| `/portal/contract-confirm` | POST | 合同签署确认（验证码 + IP + UserAgent 证据链） |
| `/portal/contract-confirm/:id/resend` | POST | 重发合同确认链接（7 天有效期） |

### 3.5 数据导入导出

#### 导入（import.routes.ts，614 行）
- Excel 上传（multer memoryStorage，10MB 限制）
- 身份证号校验（18 位校验位算法 + 15 位自动升级 18 位）
- 社保基数范围校验（北京/上海/广州/深圳/杭州 上下限）
- 批量创建员工 + 合同 + 社保记录

#### 导出（export.routes.ts，246 行）
- 格式：JSON / Excel
- 模块选择：employees/contracts/terminations/payrollBatches/payslips/socialRecords/housingRecords/riskItems
- 敏感字段脱敏：身份证 `138****1234` / 银行账号 `****1234`
- 非 ADMIN 角色强制脱敏
- 支持 gzip 压缩

---

## 四、前端页面详细分析

### 4.1 路由结构

```
管理端（ProtectedRoute + AdminLayout）
├── /                 → Dashboard    （总览）
├── /roster           → Roster       （员工花名册）
├── /money            → Money        （薪税管理）
├── /social           → SocialInsurance（社保公积金）
├── /termination      → Termination  （解聘补偿）
├── /ai-assistant     → AIAssistant  （AI 顾问）
└── /settings         → Settings     （系统设置）

员工端（PortalLayout，无认证守卫）
├── /portal/login         → PortalLogin      （员工登录）
├── /portal/payslip       → Payslip          （工资条）
├── /portal/contract      → MyContract       （我的合同）
├── /portal/onboarding    → Onboarding       （入职填报）
└── /portal/contract-confirm → ContractConfirm（合同签署确认）

认证页（PublicRoute）
├── /login            → Login
├── /register         → Register
└── /forgot-password  → ForgotPassword
```

### 4.2 布局组件

#### TopNav.tsx（桌面端顶部导航）
- 6 个导航 Tab：总览 / 员工管理 / 薪税 / 社保公积金 / 解聘补偿 / AI 顾问
- React Query 拉取 `/dashboard` 数据，60 秒自动刷新
- 风险计数 Badge（总览 Tab + 通知铃铛）
- 用户下拉菜单（设置 / 退出）

#### MobileTabBar.tsx（移动端底部 Tab）
- 6 个 Tab：总览 / 员工 / 薪税 / 社保 / 解聘 / AI
- `md:hidden` 仅移动端显示
- 固定底部 `fixed bottom-0`

#### PageContainer.tsx
- 内容容器包装

#### OnboardingGuide.tsx
- 新手引导组件

### 4.3 各页面功能详解

---

#### 4.3.1 Dashboard.tsx（654 行）— 总览仪表盘

**4 个 Tab**：概览 / 风险提醒 / 月度任务 / 薪酬

**概览 Tab**：
- 4 统计卡片：在管员工数 / 高风险数 / 待办数 / 本月人力成本
- 当月人力成本卡片（应发/社保企业/公积金企业/实发）
- 年度人力成本卡片
- 合同到期预警列表
- 月度活动统计（合同签订/解聘/违纪/考勤/补偿金）
- 工资条明细

**风险提醒 Tab**：
- 风险待办列表（按类型图标 + 级别排序）
- 单条 resolve / ignore
- 批量 resolve / ignore
- 分页处理

**月度任务 Tab**：
- 月度任务列表（发薪/社保/公积金/个税/工资条）

**数据获取**：
- `useQuery(['dashboard'])` → `/dashboard`（含风险检测 + 全量聚合数据）
- `useQuery(['expiring-contracts'])` → `/roster/contracts/expiring`

---

#### 4.3.2 Roster.tsx（3840 行）— 员工花名册（最大页面）

**列表视图**：
- 搜索（防抖 `useDebouncedValue`）+ 状态筛选（在职/预入职/离职）+ 合同状态筛选
- 表格列：姓名/部门/状态/合同/工龄/月薪/操作
- 分页
- 未保存变更检测（`useUnsavedChanges`）

**详情面板（Tab 分组）**：
| Tab | 内容 |
|-----|------|
| 人事信息 | 基本信息 / 合同信息（类型/期限/试用期/签署方式/续签） |
| 薪酬 | 薪酬记录 / 社保公积金记录（版本化时间轴） |
| 考勤绩效 | 考勤记录 / 培训记录 / 绩效记录 |
| 风险合规 | 违纪记录（类型/严重度/处理/签字） / 离职解聘 |
| 变更历史 | 薪酬变更 / 部门变更 |

**关键功能**：
- 员工 CRUD + 身份证自动提取出生日期/性别
- 合同管理（签订/续签/电子签链接）
- 违纪记录管理
- 考勤记录管理
- 培训记录管理
- 绩效记录管理
- 附件上传
- 入职链接生成（token + 过期时间）
- 合同确认链接生成（token + 验证码签署）
- QR 码分享

---

#### 4.3.3 Money.tsx（1671 行）— 薪税管理

**4 个 Tab**：

| Tab | 组件 | 功能 |
|-----|------|------|
| 发薪批次 | BatchManager | 批次创建（常规/离职结算/奖金/补偿金）/ 复制上月 / 审批流 / 工资条明细 / 归档锁定 |
| 薪酬模版 | TemplateManager | 模版项管理（预置项 + 自定义项）/ 公式计算 / 排序 / 编辑 |
| 加班费计算 | OvertimeCalculator | 按月计算（工作日 1.5x / 休息日 2x / 节假日 3x）/ 关联批次 |
| 工资条管理 | PayslipManager | 从批次生成工资条 / 发布到员工端 / 确认状态追踪 |

**批次流程**：
```
创建批次（DRAFT）→ 添加员工 → 编辑薪酬项 → 自动计算社保/公积金/个税
→ 风险提示 → 审批 → 归档（ARCHIVED，锁定）→ 生成工资条 → 发布到员工端
```

---

#### 4.3.4 SocialInsurance.tsx（983 行）— 社保公积金

**3 个 Tab**：

| Tab | 功能 |
|-----|------|
| 月度办理 | 按月查看社保/公积金办理状态 + 增减员 + 在保人员 + 缴费明细 + 办理记录快照 |
| 社保配置 | 按城市配置社保比例 + 基数上下限 + 版本管理 + 基数调整 |
| 公积金配置 | 按城市配置公积金比例 + 基数上下限 + 版本管理 + 基数调整 |

**版本管理**：
- 新版本创建时旧版本自动 `isCurrent: false`
- 支持查看历史版本
- 基数调整（批量更新员工社保/公积金基数）

---

#### 4.3.5 Termination.tsx（1778 行）— 解聘补偿

**3 个视图**：

| 视图 | 功能 |
|------|------|
| 列表 | 解聘/离职记录列表 + 状态筛选 + 操作 |
| 向导 | 6 步解聘向导（选择员工 → 解聘方式 → 合规检查 → 费用结算 → 工作交接 → 确认提交） |
| 详情 | 解聘记录详情 + PDF 导出 |

**7 种解聘原因**：
- 协商解除（第 36 条）
- 过错辞退（第 39 条）
- 非过错解除（第 40 条）
- 经济性裁员（第 41 条）
- 合同到期不续签（第 44 条/第 46 条）
- 违法解除（赔偿金 ×2，第 87 条）
- 员工主动离职（第 37 条）

**合规检查**：
- 系统自动判断（医疗期/培训记录）
- 人工勾选 + 覆盖原因
- 风险评估（SAFE/WARNING/DANGER）

**费用结算**：
- 经济补偿金计算（N / N+1 / 2N）
- 补偿金分项明细（severance / noticePay / doublePay / other）
- 调整记录（field / from / to / reason）

**PDF 导出**：使用 jsPDF 生成解聘通知书

---

#### 4.3.6 AIAssistant.tsx（1149 行）— AI 顾问

**5 个 Tab**：

| Tab | 功能 | AI 模型 |
|-----|------|---------|
| 智能问答 | SSE 流式对话 + Markdown 渲染 + 快捷问题 + 历史会话 | qwen-plus |
| 风险预测 | 按员工/部门/风险类型筛选 + SSE 流式 + Markdown 表格输出 | qwen-plus |
| 合同审查 | 粘贴合同文本 → AI 逐条审查 + 风险分级 + 合规评分 | qwen-max |
| 案例匹配 | 输入争议情形 → AI 匹配相似案例 + 败诉风险 + 建议 | qwen-max |
| 知识库 | RAG 法律条文浏览 | — |

**通用功能**：
- `useAIHistory` Hook：历史记录 CRUD（`/ai/conversations`）
- `HistoryBar` 组件：历史记录加载/删除
- 流式渲染：SSE 逐 token 输出
- 快捷问题按钮

---

#### 4.3.7 Settings.tsx（1190 行）— 系统设置

**6 个 Section**：

| Section | 功能 |
|---------|------|
| 企业信息 | 企业名称/城市/联系人/发薪频率/退休提醒开关 |
| 用户管理 | 管理端用户 CRUD + 角色分配（ADMIN/HR/VIEWER） |
| 套餐 | 当前套餐 + 升级 |
| 通知设置 | 合同到期/未签/加班/工资条提醒 + 月度提醒日 + 微信 Webhook + 邮件 |
| 数据导入 | Excel 上传 + 身份证校验 + 社保基数校验 |
| 数据导出 | 模块选择 + 格式选择 + 脱敏选项 |

---

### 4.4 员工端页面（5 个）

| 页面 | 行数 | 功能 |
|------|------|------|
| PortalLogin.tsx | 5276B | 密码登录 + 验证码登录 |
| Payslip.tsx | 7714B | 当月工资条 + 6 个月历史 + 确认已阅 |
| MyContract.tsx | 5769B | 查看合同详情 + 电子签确认 |
| Onboarding.tsx | 8461B | 入职信息填报 + 文件上传（身份证/银行卡/学历等） |
| ContractConfirm.tsx | 6570B | 合同电子签署确认（验证码 + 证据链） |

### 4.5 自定义 Hooks

| Hook | 用途 |
|------|------|
| `useDebouncedValue` | 搜索防抖（300ms） |
| `useUnsavedChanges` | 未保存变更检测 + 离开提示 |
| `useConfirm` | 二次确认对话框 |

### 4.6 UI 组件库（9 个）

| 组件 | 说明 |
|------|------|
| Button | 按钮组件（variant: primary/secondary/danger/ghost） |
| Card | 卡片容器 |
| Input | 输入框 + Label + Select |
| Modal | 模态对话框 |
| Pagination | 分页组件 |
| EmptyState | 空状态占位 |
| Skeleton | 骨架屏加载 |
| Signal | 信号指示器 |
| ConfirmDialog | 确认对话框 |

---

## 五、已实现功能清单

### 5.1 核心业务功能

| 模块 | 功能点 | 实现状态 |
|------|--------|---------|
| **认证** | 手机号注册/登录/JWT 双 Token/自动刷新 | ✅ |
| **认证** | 员工端密码登录 + 验证码登录 | ✅ |
| **仪表盘** | 风险自动检测 + 待办列表 + 批量操作 | ✅ |
| **仪表盘** | 人力成本统计（月度/年度） | ✅ |
| **仪表盘** | 合同到期预警 | ✅ |
| **仪表盘** | 月度活动统计 | ✅ |
| **花名册** | 员工 CRUD + AES 加密敏感字段 | ✅ |
| **花名册** | 身份证号校验 + 自动提取出生日期/性别 | ✅ |
| **花名册** | 合同管理（签订/续签/电子签链接） | ✅ |
| **花名册** | 违纪记录 + 考勤记录 + 培训记录 + 绩效记录 | ✅ |
| **花名册** | 薪酬变更记录（版本化） | ✅ |
| **花名册** | 部门变更记录（版本化） | ✅ |
| **花名册** | 附件管理 | ✅ |
| **花名册** | 入职链接生成 + 员工自助填报 | ✅ |
| **花名册** | 合同确认链接 + 验证码签署 + 证据链 | ✅ |
| **薪税** | 工资批次管理（4 种类型） | ✅ |
| **薪税** | 批次复制上月 / 空白 / 指定批次 | ✅ |
| **薪税** | 薪酬模版（预置 + 自定义 + 公式计算） | ✅ |
| **薪税** | 加班费计算（3 种倍率） | ✅ |
| **薪税** | 社保/公积金/个税自动计算 | ✅ |
| **薪税** | 工资条生成 + 发布到员工端 | ✅ |
| **薪税** | 工资条确认追踪（IP + 时间戳） | ✅ |
| **薪税** | 累计预扣法个税计算 | ✅ |
| **薪税** | 批次归档锁定 | ✅ |
| **薪税** | 薪酬风险提示 | ✅ |
| **社保** | 社保配置（按城市 + 版本化） | ✅ |
| **社保** | 公积金配置（按城市 + 版本化） | ✅ |
| **社保** | 员工社保/公积金记录（版本化时间轴） | ✅ |
| **社保** | 月度办理（增减员 + 在保人员 + 缴费明细 + 快照） | ✅ |
| **社保** | 基数调整（批量更新） | ✅ |
| **解聘** | 6 步解聘向导 | ✅ |
| **解聘** | 7 种解聘原因 + 动态合规检查清单 | ✅ |
| **解聘** | 系统自动判断（医疗期/培训记录） | ✅ |
| **解聘** | 风险评估（孕期/工伤/医疗期） | ✅ |
| **解聘** | 补偿金计算（N/N+1/2N）+ 分项明细 | ✅ |
| **解聘** | 工作交接清单 | ✅ |
| **解聘** | 审批流（草稿→待审批→审批→执行→完成） | ✅ |
| **解聘** | 撤回（未到日期可撤回） | ✅ |
| **解聘** | PDF 解聘通知书导出 | ✅ |
| **解聘** | 员工主动离职流程 | ✅ |
| **AI** | 智能问答（SSE 流式 + RAG 检索 + 企业上下文） | ✅ |
| **AI** | 合同审查（结构化风险项 + 合规评分） | ✅ |
| **AI** | 案例匹配（相似案例 + 败诉风险） | ✅ |
| **AI** | 风险预测（SSE 流式 + Markdown 表格） | ✅ |
| **AI** | 历史会话管理 | ✅ |
| **AI** | 用量控制（按套餐限制） | ✅ |
| **AI** | 案例转待办 | ✅ |
| **设置** | 企业信息管理 | ✅ |
| **设置** | 用户管理（CRUD + 角色） | ✅ |
| **设置** | 通知设置（多渠道 + 月度提醒日） | ✅ |
| **设置** | 退休政策管理（AI 解析 + 用户确认 + 版本管理） | ✅ |
| **设置** | 退休提醒（渐进式延迟退休计算） | ✅ |
| **数据** | Excel 批量导入（身份证校验 + 社保基数校验） | ✅ |
| **数据** | 数据导出（JSON/Excel + 脱敏 + gzip） | ✅ |
| **员工端** | 工资条查看 + 确认 | ✅ |
| **员工端** | 合同查看 + 电子签确认 | ✅ |
| **员工端** | 入职自助填报 + 文件上传 | ✅ |

### 5.2 技术能力清单

| 能力 | 实现 |
|------|------|
| 多租户隔离 | orgId 贯穿所有查询 |
| JWT 双 Token | accessToken + refreshToken + 自动刷新 |
| AES-256 加密 | 薪资/身份证/银行账号 |
| SHA-256 哈希 | 身份证号查重 |
| API 限流 | express-rate-limit |
| 安全 HTTP 头 | helmet |
| SSE 流式 | AI 对话 + 风险预测 |
| RAG 向量检索 | pgvector + ivfflat + cosine 距离 |
| 审计日志 | AuditLog（操作/实体/详情/IP） |
| 操作确认 | useConfirm Hook + ConfirmDialog |
| 搜索防抖 | useDebouncedValue |
| 未保存检测 | useUnsavedChanges |
| 懒加载 | React.lazy + Suspense |
| 骨架屏 | Skeleton 组件 |
| 响应式 | md:hidden 移动端 Tab |
| 批量操作 | 待办批量 resolve/ignore |
| 版本化数据 | 社保/公积金/薪酬/部门变更 |
| 状态机 | 解聘流程 7 状态 |
| 事务处理 | 解聘创建事务 |
| 数据脱敏 | 导出时身份证/银行账号脱敏 |
| 身份证校验 | 18 位校验位算法 + 15 位升级 |
| 渐进式延迟退休 | 2025 改革算法 |

---

## 六、与 HTML 原型的功能差距分析

| 原型页面 | React 实现 | 差距说明 |
|---------|-----------|---------|
| 风险驾驶舱 | Dashboard.tsx | 原型有 SVG 环形评分 + AI 建议卡片流 + 业务流程入口，React 版偏重统计卡片 |
| 白小侠 AI 对话 | AIAssistant (chat) | ✅ 基本对应，原型有转专家/约律师功能未实现 |
| 判赔预测器 | AIAssistant (predict) | 原型有 12 场景选择 + 三档方案卡片，React 版为 AI 自由文本输出 |
| 文件 AI 审查 | AIAssistant (review) | 原型有左右分栏 + 原文高亮 + 一键采纳，React 版为文本输入 + AI 文本输出 |
| 全员风险地图 | Roster.tsx | ✅ 花名册已实现，但无 7 维仲裁风险评分 + 风险标签 |
| 个人风险档案 | Roster.tsx (详情) | ✅ 员工详情已实现，但无 7 维评分趋势图 + 修复路径 |
| 年度 AI 价值报告 | — | ❌ 未实现 |
| 合规中心 | — | ❌ 未独立实现（功能分散在各页面） |
| 电子签中心 | — | ❌ 未独立实现（合同确认链接已实现，但无独立管理页） |
| 申请草稿/已发申请 | — | ❌ 未实现 |
| 入职管理 | Roster.tsx | ✅ 通过入职链接实现 |
| 合同管理 | Roster.tsx (合同 Tab) | ✅ 集成在花名册 |
| 考勤确认 | Roster.tsx (考勤 Tab) | ✅ 考勤记录已实现，但无员工端确认流程 |
| 工资条发布 | Money.tsx (payslip) | ✅ 已实现 |
| 规章制度民主程序 | — | ❌ 未实现 |
| 企业文本库 | — | ❌ 未实现 |
| 用工文本模板库 | — | ❌ 未实现 |
| 用工体检诊断 | — | ❌ 未实现 |
| 背景调查 | — | ❌ 未实现 |
| 视频中心 | — | ❌ 未实现 |
| 五险一金计算器 | SocialInsurance.tsx | ✅ 社保配置已实现，但无独立计算器工具 |
| 医疗期计算器 | — | ❌ 未实现 |
| 通知管理 | Settings.tsx (通知设置) | ✅ 通知设置已实现，但无独立通知管理页 |
| 用户管理 | Settings.tsx (用户管理) | ✅ 已实现 |
| 系统日志 | — | ❌ 未实现（AuditLog 有数据但无前端页面） |

---

## 七、系统架构亮点与不足

### 7.1 亮点

1. **AI 深度集成**：RAG 知识库 + 企业上下文注入 + SSE 流式输出，AI 不是简单聊天而是结合企业实际数据
2. **风险自动检测引擎**：每次访问 Dashboard 自动检测合同/入职/解聘/月度任务风险，去重写入待办
3. **版本化数据设计**：社保/公积金/薪酬/部门变更全部版本化，支持时间轴追溯
4. **解联合规引擎**：7 种解聘原因 × 动态合规清单 × 系统自动判断 × 风险评估 × 状态机审批流
5. **敏感数据加密**：AES-256-CBC 加密薪资/身份证/银行账号 + SHA-256 哈希索引
6. **员工端自助**：入职填报 + 合同电子签 + 工资条查看，token 链接 + 验证码 + 证据链
7. **渐进式延迟退休**：精确实现 2025 年改革算法（男 60→63 / 女干部 55→58 / 女工人 50→55）

### 7.2 不足

1. **原型差距大**：26 个页面模块仅实现约 60%，合规中心/电子签中心/民主程序/文本库/背景调查/视频中心等未实现
2. **AI 审查交互弱**：原型有左右分栏 + 原文高亮 + 一键采纳，React 版仅为文本输入输出
3. **判赔预测简化**：原型有 12 场景选择 + 三档方案卡片 + 金额区间，React 版为 AI 自由文本
4. **无风险评分体系**：原型有 78 分健康度 + 5 维评分 + 7 维员工风险评分，React 版仅有高/中/低三级
5. **AuditLog 无前端**：有审计日志数据模型但无系统日志查看页面
6. **通知无独立管理**：通知设置已实现但通知列表/已读管理未独立建页
7. **Roster.tsx 过大**：3840 行单文件，应拆分为子组件
8. **验证码内存存储**：`codeStore = new Map()` 生产环境应使用 Redis
