Files
TurboHR/docs/20260730-功能补齐方案.md
T
freedakgmail 42e0c650a4 feat: 实现20260730优化方案全部功能
- AI文件审查:.docx上传提取文本,支持多种文档类型
- 用工办理工作流:WorkProcess页面+后端API,支持入职/续签/终止等流程
- 企业自建文本库:Templates页面Tab切换,企业模板CRUD+渲染+下载Word
- 考勤发布:Attendance发布/取消发布按钮,员工端MyAttendance页面
- 工资条发布:Money发布/定时发送按钮+弹窗,portal端publishStatus过滤
- 合同到期弹窗:Dashboard合同到期预警可点击打开弹窗,支持续签/终止操作
- Prisma schema新增WorkProcess/EnterpriseTemplate/AttendancePublish模型
- 前后端编译验证全部通过
2026-07-30 10:21:22 +08:00

405 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 企业用工专家 — 功能补齐方案
> 日期:2026-07-30
> 依据:白话用工侠完整运行测试报告对比分析
> 优先级:🔴 高 / 🟡 中
---
## 一、用工办理工作流系统(13类流程)🔴
### 1.1 目标
实现统一的用工办理工作流系统,覆盖员工从录用到离职的全生命周期办理事项。
### 1.2 13类流程定义
| 编号 | 流程名称 | 核心表单字段 | 关联模块 |
|------|---------|------------|---------|
| 1 | 员工录用 | 人员选择、入职时间、公司地址、部门、岗位、直属上级、联系方式、试用期薪酬、转正薪酬、携带材料 | 员工创建+合同起草 |
| 2 | 员工入职 | 入职日期、岗位确认、合同签署方式、材料提交清单 | 员工状态→ACTIVE |
| 3 | 自定义合同签署 | 合同模板选择、变量填充、签署方、期限 | 合同管理 |
| 4 | 员工信息提交 | 信息变更字段、证明材料 | 员工档案更新 |
| 5 | 员工转正 | 转正日期、转正薪资、考核结果 | 员工状态+薪资变更 |
| 6 | 合同变更 | 变更类型、变更内容、生效日期 | 合同管理 |
| 7 | 合同续签 | 续签次数、新期限、新薪资 | 合同管理 |
| 8 | 合同中止 | 中止原因、中止期限、预计恢复日期 | 合同状态 |
| 9 | 开具收入证明 | 用途、收入期间、接收方 | 文本模板渲染 |
| 10 | 合同终止 | 终止原因、终止日期、经济补偿 | 合同状态+离职 |
| 11 | 合同解除 | 解除原因、解除方式、协商/单方 | 已有 Termination 模块复用 |
| 12 | 开具离职证明 | 离职日期、离职原因、接收方 | 文本模板渲染 |
| 13 | 灵活用工 | 人员信息、用工类型、协议期限、计酬方式 | 合同管理(LABOR) |
### 1.3 数据模型设计
```prisma
// 用工办理流程
model WorkProcess {
id String @id @default(cuid())
orgId String
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
type String // HIRE/ONBOARD/CUSTOM_CONTRACT/INFO_SUBMIT/CONFIRM/CHANGE/RENEW/SUSPEND/INCOME_CERT/TERMINATE/RESCIND/LEAVING_CERT/FLEXIBLE
title String
employeeId String?
employee Employee? @relation(fields: [employeeId], references: [id])
status String @default("DRAFT") // DRAFT/PENDING_APPROVAL/APPROVED/REJECTED/EXECUTING/COMPLETED/CANCELLED
formData Json // 表单数据 JSON
documents Json? // 生成的文书列表 [{name, content, type}]
approverId String?
approvedAt DateTime?
remark String?
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([orgId, status])
@@index([orgId, type])
@@index([orgId, createdBy])
}
```
### 1.4 前端架构
**新增页面**`frontend/src/pages/WorkProcess.tsx`
```
页面结构:
├── 发起办理(13类流程卡片选择)
├── 办理记录(列表+筛选:类型/状态/日期)
├── 办理草稿(仅 DRAFT 状态)
└── 流程详情(步骤条+表单+预览+操作)
```
**流程详情组件**(通用 Wizard):
- 步骤条:填写信息 → 预览文书 → 存草稿/提交
- 表单根据 `type` 动态渲染字段
- 预览:调用文本模板渲染接口生成文书
- 提交后根据流程类型执行对应业务逻辑
**复用已有模块**
- 合同解除(#11)→ 复用 `Termination.tsx` 的 Wizard 逻辑
- 合同续签(#7)→ 复用 `Contracts.tsx` 的合同管理逻辑
- 收入证明(#9/ 离职证明(#12)→ 复用 `Templates.tsx` 的模板渲染
- 员工录用(#1)→ 复用 `roster/modals.tsx` 的添加员工逻辑
### 1.5 后端接口
```
POST /api/v1/work-processes # 创建办理(含草稿)
GET /api/v1/work-processes # 列表查询(支持type/status筛选)
GET /api/v1/work-processes/:id # 详情
PATCH /api/v1/work-processes/:id # 更新草稿
POST /api/v1/work-processes/:id/submit # 提交办理
POST /api/v1/work-processes/:id/approve # 审批通过
POST /api/v1/work-processes/:id/reject # 驳回
POST /api/v1/work-processes/:id/cancel # 撤销
DELETE /api/v1/work-processes/:id # 删除草稿
GET /api/v1/work-processes/:id/preview # 预览生成的文书
```
### 1.6 提交后业务联动
| 流程类型 | 提交后执行 |
|---------|-----------|
| HIRE | 创建员工记录 + 创建劳动合同 |
| ONBOARD | 更新员工状态为 ACTIVE + 记录入职日期 |
| CUSTOM_CONTRACT | 创建劳动合同 |
| INFO_SUBMIT | 更新员工档案字段 |
| CONFIRM | 更新试用期结束 + 调整薪资 |
| CHANGE | 更新合同字段 + 记录变更历史 |
| RENEW | 关闭旧合同 + 创建新合同 |
| SUSPEND | 合同状态改为 SUSPENDED |
| INCOME_CERT | 生成收入证明文书(不改变业务数据) |
| TERMINATE | 合同状态改为 TERMINATED + 触发离职流程 |
| RESCIND | 调用已有 Termination 逻辑 |
| LEAVING_CERT | 生成离职证明文书 |
| FLEXIBLE | 创建劳务协议合同 |
### 1.7 实现优先级
1. **Phase 1**:数据模型 + 基础 CRUD + 列表/草稿页面
2. **Phase 2**:员工录用、员工入职、合同续签、合同终止(4个高频流程)
3. **Phase 3**:剩余9类流程 + 文书预览生成
4. **Phase 4**:审批流程 + 办理记录导出
---
## 二、企业自建文本库 🟡
### 2.1 目标
允许企业创建、管理和复用自己的文本模板(合同、通知、协议等),与系统预置模板库并存。
### 2.2 数据模型设计
```prisma
// 企业自建文本模板
model EnterpriseTemplate {
id String @id @default(cuid())
orgId String
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
name String
category String // CONTRACT/RULES/NOTICE/AGREEMENT/OTHER
description String?
content String @db.Text
variables String[] // 变量名列表
status String @default("ACTIVE") // ACTIVE/ARCHIVED
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([orgId, category])
}
```
### 2.3 前端方案
**改造页面**`frontend/src/pages/Templates.tsx`
在现有模板库页面顶部新增 Tab 切换:
- **系统模板库**(现有功能不变)
- **企业文本库**(新增)
企业文本库 Tab 内容:
```
├── 查询栏(名称搜索 + 分类筛选)
├── 新建/编辑弹窗(名称、分类、变量配置、内容编辑)
├── 模板卡片列表(复用现有卡片样式)
├── 详情弹窗(变量填写 → 渲染 → 下载Word/复制)
└── 操作:编辑、复制、删除、归档
```
### 2.4 后端接口
```
# 现有模板路由:/api/v1/templates(系统预置,只读)
# 新增企业模板路由:/api/v1/enterprise-templates
GET /api/v1/enterprise-templates # 列表(支持category/search
POST /api/v1/enterprise-templates # 新建
GET /api/v1/enterprise-templates/:id # 详情
PUT /api/v1/enterprise-templates/:id # 更新
DELETE /api/v1/enterprise-templates/:id # 删除
POST /api/v1/enterprise-templates/:id/render # 渲染(复用现有 renderTemplate 逻辑)
GET /api/v1/enterprise-templates/:id/download # 下载Word
```
### 2.5 实现要点
- 变量提取:编辑内容时自动扫描 `{{变量名}}` 提取变量列表
- 渲染逻辑:复用 `template.service.ts``renderTemplate` 函数
- 内容编辑器:使用 textarea + 变量插入按钮(点击插入 `{{变量名}}`
- 权限:ADMIN/HR 可增删改,VIEWER 只读
---
## 三、考勤/工资条发布流程 🟡
### 3.1 考勤发布
#### 目标
HR 在考勤管理页面将月度考勤数据"发布"给员工,员工在员工端查看并确认。
#### 数据模型
```prisma
// 考勤发布记录
model AttendancePublish {
id String @id @default(cuid())
orgId String
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
month String // 2026-07
title String // 如"2026年7月考勤表"
status String @default("PUBLISHED") // PUBLISHED/CANCELLED
publishDate DateTime @default(now())
createdBy String
createdAt DateTime @default(now())
@@unique([orgId, month])
@@index([orgId, month])
}
```
#### 前端改造:`Attendance.tsx`
在「考勤确认」Tab 工具栏新增:
- **「发布考勤表」按钮**:弹窗确认 → 选择月份 → 发布
- **「发布记录」入口**:查看历史发布记录,可取消发布
#### 后端接口
```
POST /api/v1/attendance/publish # 发布考勤表
GET /api/v1/attendance/publish-records # 发布记录列表
POST /api/v1/attendance/publish/:id/cancel # 取消发布
```
#### 员工端:`portal/` 新增考勤查看页面
```
GET /api/v1/portal/attendance?month=2026-07 # 员工查看自己的月度考勤
```
### 3.2 工资条发布
#### 目标
HR 在薪税管理中将批次工资条"发布"给员工,员工在员工端查看并确认。支持定时发送。
#### 数据模型
复用已有 `Payslip` 模型,新增发布状态字段:
```prisma
// 在 Payslip 模型新增字段
model Payslip {
// ...已有字段
publishStatus String? // UNPUBLISHED/PUBLISHED/SCHEDULED
publishedAt DateTime?
scheduledAt DateTime? // 定时发送时间
confirmedAt DateTime? // 员工确认时间(已有)
}
```
#### 前端改造:`Money.tsx`
在批次详情页新增:
- **「发布工资条」按钮**:将批次内所有工资条标记为 PUBLISHED
- **「定时发送」选项**:选择发送时间,到点自动发布
- **「定时发送记录」入口**:查看定时发送列表,可取消
#### 后端接口
```
POST /api/v1/payroll/batches/:batchId/publish # 发布工资条
POST /api/v1/payroll/batches/:batchId/schedule # 定时发送
GET /api/v1/payroll/schedule-records # 定时发送记录
POST /api/v1/payroll/schedule/:id/cancel # 取消定时发送
```
#### 员工端:已有 `portal/Payslip.tsx`
- 发布前:员工端不显示该月工资条
- 发布后:员工端显示工资条,可查看和确认
- 定时发送:到点后状态从 SCHEDULED → PUBLISHED
#### 定时发送实现
- 使用 `node-cron` 或现有定时任务机制
- 每分钟检查 `scheduledAt <= now && publishStatus = SCHEDULED` 的记录
- 自动更新为 PUBLISHED 并发送通知
---
## 四、AI文件审查上传功能 🔴
### 4.1 目标
在现有合同审查功能基础上,支持上传 doc/docx 文件,自动提取文本后进行 AI 审查。
### 4.2 前端改造:`AIAssistant.tsx` ReviewTab
在现有粘贴文本输入框上方新增文件上传区域:
```
合同审查 Tab 改造:
├── 文件上传区(新增)
│ ├── 文书类型选择(劳动合同/协商解除/劳务协议/实习协议/保密协议)
│ ├── 拖拽或点击上传 .doc/.docx 文件
│ ├── 文件大小限制:100MB
│ └── 上传后自动提取文本并填入下方输入框
├── 文本输入框(现有)
├── 开始审查按钮(现有)
└── 审查结果展示(现有)
```
### 4.3 后端改造
#### 文件上传接口
```
POST /api/v1/ai/review/upload
- multipart/form-data
- 接收 doc/docx 文件
- 提取纯文本
- 返回 { text: "提取的文本内容" }
```
#### 文本提取方案
使用 `mammoth` 库提取 .docx 文本:
```typescript
import mammoth from 'mammoth'
// .docx 文件提取
const result = await mammoth.extractRawText({ buffer: req.file.buffer })
const text = result.value
// .doc 文件(旧格式)
// 方案1:使用 antiword 命令行工具
// 方案2:提示用户转换为 .docx
// 推荐:仅支持 .docx.doc 提示转换
```
#### 完整审查流程
```typescript
// 1. 上传文件 → 提取文本
POST /ai/review/upload { text }
// 2. 前端将文本填入输入框(用户可编辑)
// 3. 点击审查 → 调用现有 /ai/review 接口
POST /ai/review { contractText }
```
### 4.4 依赖安装
```bash
cd backend && npm install mammoth
```
### 4.5 安全考虑
- 文件大小限制:100MB`multer` limits
- 文件类型校验:仅 `.doc``.docx`
- 提取后不保存原文件,仅返回文本
- 文本长度截断:超过 50000 字符时截断并提示
---
## 五、实施计划
### 5.1 优先级排序
| 优先级 | 功能 | 预估工作量 | 建议时间 |
|--------|------|-----------|---------|
| 🔴 高 | AI文件审查上传 | 1-2天 | 立即 |
| 🔴 高 | 用工办理工作流 Phase 1-2 | 5-7天 | 本周 |
| 🟡 中 | 企业自建文本库 | 2-3天 | 下周 |
| 🟡 中 | 考勤发布 | 2天 | 下周 |
| 🟡 中 | 工资条发布 | 2-3天 | 下周 |
| 🔴 高 | 用工办理工作流 Phase 3-4 | 5-7天 | 第三周 |
### 5.2 总计
- **总工作量**:约 17-24 个工作日
- **建议分3周完成**
- 第1周:AI文件审查 + 用工办理Phase 1-2
- 第2周:企业文本库 + 考勤发布 + 工资条发布
- 第3周:用工办理Phase 3-4 + 联调测试
### 5.3 数据库迁移
所有新增模型需要执行 `npx prisma db push` 同步到数据库。
---
## 六、风险与注意事项
1. **用工办理工作流**是最复杂的功能,建议先实现4个高频流程(录用/入职/续签/终止),验证架构后再扩展
2. **企业文本库**的变量提取逻辑需与系统模板保持一致,复用 `renderTemplate` 函数
3. **工资条发布**涉及薪资敏感数据,需确保只有发布后员工端才能看到
4. **AI文件审查**的 .doc 旧格式支持有限,建议仅支持 .docx 并提示用户转换
5. **定时发送**需要确保服务器进程持续运行(PM2 已有保障)