d79e3baa34
- 面包屑导航组件,集成至TopNav header - 侧边栏菜单分组间距增大,分组间分隔线 - 制度公示员工阅读签收:PolicyReadRecord模型、portal路由、管理端阅读统计 - 修复Policies.tsx民主程序推进bug(字段名/API路径/参数) - 用工文本模板变量名英文转中文显示 - 通知类型TYPE_LABELS补全(RISK_ALERT/SOCIAL_INS/OVERTIME_ALERT/PAYSLIP_READY) - 通知示例数据补充 - h2标题统一为text-sm font-medium - 新增run.md
788 lines
35 KiB
Markdown
788 lines
35 KiB
Markdown
# 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
|