Files
TurboHR/docs/20260730-功能补齐方案.md
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

14 KiB
Raw Permalink Blame History

企业用工专家 — 功能补齐方案

日期: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 数据模型设计

// 用工办理流程
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 数据模型设计

// 企业自建文本模板
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.tsrenderTemplate 函数
  • 内容编辑器:使用 textarea + 变量插入按钮(点击插入 {{变量名}}
  • 权限:ADMIN/HR 可增删改,VIEWER 只读

三、考勤/工资条发布流程 🟡

3.1 考勤发布

目标

HR 在考勤管理页面将月度考勤数据"发布"给员工,员工在员工端查看并确认。

数据模型

// 考勤发布记录
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 模型,新增发布状态字段:

// 在 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 文本:

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 提示转换

完整审查流程

// 1. 上传文件 → 提取文本
POST /ai/review/upload  { text }

// 2. 前端将文本填入输入框(用户可编辑)

// 3. 点击审查 → 调用现有 /ai/review 接口
POST /ai/review { contractText }  审查结果

4.4 依赖安装

cd backend && npm install mammoth

4.5 安全考虑

  • 文件大小限制:100MBmulter 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 已有保障)