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
914 lines
35 KiB
Markdown
914 lines
35 KiB
Markdown
# TurboHR 20260726 优化方案
|
||
|
||
> 制定日期:2026-07-26
|
||
> 核心原则:**从企业 HR 真实痛点出发,不做功能堆砌**
|
||
> 每一项优化必须回答三个问题:企业为什么需要?解决了什么痛点?带来什么价值?
|
||
|
||
---
|
||
|
||
## 一、企业 HR 的 6 个核心痛点
|
||
|
||
### 痛点 1:怕被告 — 用工合规风险不可见
|
||
|
||
HR 最大的恐惧是劳动仲裁。但现在的系统只是"事后发现"——合同过期了才提醒,试用期超了才知道。企业需要的是**提前预警 + 量化风险**。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 合同到期才提醒 | 提前 60/30/15 天分级预警,附带续签/终止决策建议 |
|
||
| 风险只有高/中/低 | 每个风险附带预估损失金额(律师费 + 赔偿金 + 时间成本) |
|
||
| 风险列表平铺 | 按紧急程度 + 金额排序,一眼看到"今天必须处理什么" |
|
||
| 无风险趋势 | 本月风险数 vs 上月,是在变好还是变差? |
|
||
|
||
### 痛点 2:怕算错 — 薪税社保复杂易错
|
||
|
||
社保基数每年变、个税累计预扣、加班费三种倍率、经济补偿金 N/N+1/2N……算错一分钱都可能是投诉或处罚的导火索。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 工资批次已实现 | 增加算薪前 AI 校验:基数异常 / 累计税跳档 / 加班超限 |
|
||
| 社保配置已实现 | 增加跨年度基数对比 + 自动检测基数是否在上下限范围内 |
|
||
| 个税累计预扣已实现 | 增加年终汇算提醒 + 全年税负模拟 |
|
||
|
||
### 痛点 3:怕丢证据 — 仲裁时拿不出材料
|
||
|
||
劳动仲裁的核心是举证。企业败诉往往不是因为真的错了,而是**拿不出证据**。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 合同有签署记录 | 需要完整的签署证据链:时间 / IP / 设备 / 短信验证码 |
|
||
| 入职有链接 | 需要员工填报内容的留痕 + 时间戳 |
|
||
| 工资条有确认 | 需要员工确认记录作为已足额发放的证据 |
|
||
| 考勤无留痕 | 需要考勤确认记录(员工签字确认加班费/工时) |
|
||
| 违纪无证据 | 需要违纪记录附件管理(警告信签收 / 邮件记录 / 聊天截图) |
|
||
|
||
### 痛点 4:怕遗漏 — 离职流程漏步骤
|
||
|
||
解聘员工是高风险操作,漏一个步骤就可能从合法解除变成违法解除(2N 赔偿)。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 解聘 6 步向导已实现 | ✅ 已经很好,但缺少"步骤前置条件校验" |
|
||
| 合规清单已实现 | ✅ 需要增加"跳过此步的风险提示"——比如跳过"通知工会"步骤,提示违法风险 |
|
||
| 风险评估已实现 | ✅ 需要增加"三期/工伤/医疗期"的强制拦截——不是提示,是阻止 |
|
||
|
||
### 痛点 5:怕低效 — 重复性工作太多
|
||
|
||
HR 每月要做的事:算工资、缴社保、发工资条、查合同到期、做考勤、报个税……大量重复手工操作。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 工资批次已实现 | 增加"一键复制上月" + 差异对比 |
|
||
| 社保月度处理已实现 | 增加参保/停保自动提醒(入职 30 天 / 离职当月) |
|
||
| 合同到期提醒已实现 | 增加批量续签 + 模板自动填充 |
|
||
| 无月度任务看板 | 增加"本月 HR 日历"——哪天发工资、哪天缴社保、哪天报税一目了然 |
|
||
|
||
### 痛点 6:怕花冤枉钱 — 人力成本不透明
|
||
|
||
老板问"我们人力成本是多少",HR 要翻多个表格才能回答。更难的是"为什么比去年高"。
|
||
|
||
| 现状 | 企业需要 |
|
||
|------|---------|
|
||
| 月度薪酬汇总已实现 | 增加同比/环比对比 + 成本归因分析(加班多了?社保涨了?新人多了?) |
|
||
| 年度成本汇总已实现 | 增加人力成本占营收比(需手动输入营收) + 人均成本趋势 |
|
||
| 无离职成本统计 | 增加离职成本统计(补偿金 + 招聘成本 + 培训成本) |
|
||
| 无预算管理 | 增加部门人力预算 vs 实际对比 |
|
||
|
||
---
|
||
|
||
## 二、优化清单(按企业价值排序)
|
||
|
||
### T1 — 高价值 / 高紧迫(立即做)
|
||
|
||
#### 2.1 风险量化与优先级排序
|
||
|
||
**企业痛点**:风险列表是平铺的,HR 不知道先处理哪个,也不知道不处理会损失多少钱
|
||
**价值**:让 HR 一眼看到"今天必须处理什么" + "不处理最多损失多少钱"
|
||
|
||
**实现方案**:
|
||
|
||
后端 `risk.service.ts` 扩展:
|
||
|
||
```typescript
|
||
// 为每个 RiskItem 增加预估损失金额和截止日期
|
||
interface RiskWithCost {
|
||
// ... 现有字段
|
||
estimatedLoss: number // 预估损失金额(元)
|
||
lossRange: [number, number] // 损失区间 [最低, 最高]
|
||
deadline: Date // 建议处理截止日期
|
||
daysUntilDeadline: number // 距截止日期天数
|
||
priority: 'URGENT' | 'HIGH' | 'MEDIUM' | 'LOW'
|
||
}
|
||
|
||
// 风险金额估算逻辑:
|
||
// - 未签合同(>30天):双倍工资 × 月数
|
||
// - 合同到期未续签:经济补偿 N × 月薪
|
||
// - 违法解除风险:2N × 月薪
|
||
// - 试用期超限:试用期工资差额 + 可能的赔偿
|
||
// - 社保未缴:补缴 + 滞纳金(每日 0.05%)
|
||
```
|
||
|
||
前端 Dashboard 改造:
|
||
- 顶部:**紧急风险横幅**(最高优先级 1 条 + 预估损失 + 处理按钮)
|
||
- 待办列表:按 `priority` 排序,每条显示预估损失金额 + 倒计时
|
||
- 底部:本月风险趋势(较上月 +N / -N)
|
||
|
||
**改动范围**:
|
||
- `backend/src/services/risk.service.ts` — 增加金额估算函数
|
||
- `backend/src/routes/dashboard.routes.ts` — 返回字段扩展
|
||
- `frontend/src/pages/Dashboard.tsx` — 紧急横幅 + 列表排序
|
||
|
||
---
|
||
|
||
#### 2.2 合同到期决策助手
|
||
|
||
**企业痛点**:合同到期了,HR 纠结是续签、不续签还是改条件续签,每个选择的法律后果和成本不同
|
||
**价值**:AI 基于员工真实数据,给出三个选项的成本对比
|
||
|
||
**实现方案**:
|
||
|
||
新增 API `/api/v1/contracts/:id/expiry-decision`
|
||
|
||
```typescript
|
||
// 输入:合同 ID
|
||
// AI 分析员工数据(工龄、薪资、绩效、违纪、特殊状态)
|
||
// 输出三个选项:
|
||
interface ExpiryDecision {
|
||
employee: { name, workYears, salary, performance, specialStatus }
|
||
options: [
|
||
{
|
||
action: '续签'
|
||
cost: 0 // 无直接成本
|
||
risk: '低'
|
||
legalNote: '连续两次固定期限后续签需签无固定期限合同'
|
||
recommendation: '建议续签,员工绩效良好'
|
||
},
|
||
{
|
||
action: '到期不续签'
|
||
cost: number // 经济补偿 N × 月薪
|
||
risk: '中'
|
||
legalNote: '需提前30天通知,需支付经济补偿金'
|
||
recommendation: '需支付补偿金 ¥XX,XXX'
|
||
},
|
||
{
|
||
action: '变更条件续签'
|
||
cost: 0
|
||
risk: '高'
|
||
legalNote: '降低条件续签需协商一致,员工不同意则按到期不续签处理'
|
||
recommendation: '风险较高,建议先协商'
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
前端:合同管理 Tab 中,到期合同增加 **[决策助手]** 按钮,点击弹出三选项对比卡片。
|
||
|
||
**改动范围**:
|
||
- `backend/src/services/contract.service.ts` — 新增 `getExpiryDecision()`
|
||
- `backend/src/routes/roster.routes.ts` — 新增端点
|
||
- `frontend/src/pages/Roster.tsx` — 合同 Tab 增加决策弹窗
|
||
|
||
---
|
||
|
||
#### 2.3 证据链管理
|
||
|
||
**企业痛点**:仲裁时拿不出证据,因为关键操作没有留痕或留痕不完整
|
||
**价值**:每个高风险操作自动生成完整证据链,仲裁时一键导出
|
||
|
||
**实现方案**:
|
||
|
||
数据模型扩展:
|
||
|
||
```prisma
|
||
model EvidenceChain {
|
||
id String @id @default(cuid())
|
||
orgId String
|
||
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
|
||
category String // CONTRACT_SIGN / ONBOARD / PAYSLIP_CONFIRM / DISCIPLINARY / ATTENDANCE / TERMINATION
|
||
refId String? // 关联记录 ID(合同ID/工资条ID等)
|
||
employeeId String?
|
||
employee Employee? @relation(fields: [employeeId], references: [id], onDelete: SetNull)
|
||
events Json // [{ action, timestamp, ip, userAgent, smsCode?, location? }]
|
||
hash String // 全链路 SHA-256 哈希(防篡改)
|
||
createdBy String
|
||
createdAt DateTime @default(now())
|
||
|
||
@@index([orgId, category, refId])
|
||
@@index([orgId, employeeId])
|
||
}
|
||
```
|
||
|
||
需要留痕的操作:
|
||
|
||
| 操作 | 证据内容 | 现有基础 |
|
||
|------|---------|---------|
|
||
| 合同签署 | 签署时间 / IP / 短信验证码 / 设备 | ✅ 有 `ContractConfirmLink`,需补充 IP 和设备 |
|
||
| 入职填报 | 员工提交时间 / IP / 填报内容快照 | ✅ 有入职链接,需补时间戳和快照 |
|
||
| 工资条确认 | 确认时间 / IP / 工资金额 | ✅ 有 `confirmedAt`,需补 IP |
|
||
| 违纪处理 | 警告信签收记录 / 附件 | ⚠️ 有违纪记录,需补附件和签收 |
|
||
| 考勤确认 | 员工确认时间 / 加班费确认 | ❌ 需新增考勤确认功能 |
|
||
| 解聘流程 | 6 步每步操作记录 / 通知工会证据 | ✅ 有解聘记录,需补步骤级时间戳 |
|
||
|
||
新增 API:
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/v1/evidence/:category/:refId` | GET | 获取某操作的完整证据链 |
|
||
| `/api/v1/evidence/employee/:id` | GET | 获取某员工所有证据链 |
|
||
| `/api/v1/evidence/:id/export` | POST | 导出证据链(PDF,含哈希校验) |
|
||
|
||
**改动范围**:
|
||
- `backend/prisma/schema.prisma` — 新增 `EvidenceChain` 模型
|
||
- `backend/src/services/evidence.service.ts` — 新增证据链服务
|
||
- `backend/src/routes/evidence.routes.ts` — 新增路由
|
||
- `backend/src/routes/portal.routes.ts` — 合同签署/工资条确认时补充 IP 和设备信息
|
||
- `frontend/src/pages/Roster.tsx` — 员工详情增加"证据链"Tab
|
||
|
||
---
|
||
|
||
#### 2.4 解聘流程强化:前置校验 + 强制拦截
|
||
|
||
**企业痛点**:解聘流程中漏步骤导致违法解除,从合法变 2N 赔偿
|
||
**价值**:在流程中设置"硬性卡点",不满足条件不允许继续
|
||
|
||
**实现方案**:
|
||
|
||
`termination.service.ts` 扩展:
|
||
|
||
```typescript
|
||
// 每个步骤增加前置条件校验
|
||
interface StepValidation {
|
||
step: number
|
||
canProceed: boolean
|
||
blockReason?: string // 不满足条件时阻止继续
|
||
warning?: string // 可跳过但有风险时提示
|
||
}
|
||
|
||
// 强制拦截规则:
|
||
// - 三期女职工 + 非过错解除 → 阻止(法律禁止)
|
||
// - 工伤期间 + 非过错解除 → 阻止
|
||
// - 医疗期内 + 非过错解除 → 阻止
|
||
// - 未通知工会 → 警告(可跳过但提示违法风险)
|
||
// - 经济补偿金未计算 → 阻止(必须先算钱再走流程)
|
||
// - 合同已到期 + 选择"解除"而非"终止" → 警告(建议用"到期终止"更简单)
|
||
```
|
||
|
||
前端 `Termination.tsx` 改造:
|
||
- 步骤间增加**前置校验门**
|
||
- 拦截时显示红色阻断卡片 + 法律依据 + 替代方案建议
|
||
- 警告时显示黄色提示 + "我已知晓风险,继续" 按钮
|
||
|
||
**改动范围**:
|
||
- `backend/src/services/termination.service.ts` — 增加 `validateStep()` 函数
|
||
- `backend/src/routes/termination.routes.ts` — 增加 `GET /:id/validate-step?step=N`
|
||
- `frontend/src/pages/Termination.tsx` — 步骤间增加校验门 UI
|
||
|
||
---
|
||
|
||
#### 2.5 算薪前 AI 校验
|
||
|
||
**企业痛点**:工资算错了才发现,需要重新核算、解释、补发,HR 被骂、老板不信任
|
||
**价值**:算薪前自动检查 10+ 项异常,把错误拦截在发放前
|
||
|
||
**实现方案**:
|
||
|
||
新增 `payroll.service.ts` 中的 `prePayrollCheck()`:
|
||
|
||
```typescript
|
||
export async function prePayrollCheck(orgId: string, month: string): Promise<PayrollCheckResult> {
|
||
const checks: CheckItem[] = [
|
||
// 1. 社保基数是否在上下限范围内
|
||
// 2. 公积金基数是否在上下限范围内
|
||
// 3. 加班时数是否超过法定上限(月 36 小时)
|
||
// 4. 加班费计算是否正确(工作日 1.5 / 休息日 2.0 / 法定节假日 3.0)
|
||
// 5. 个税累计预扣是否跳档(本月税率突然升高)
|
||
// 6. 试用期工资是否低于合同工资 80%
|
||
// 7. 离职员工是否多算了一个月
|
||
// 8. 新入职员工是否按实际入职日折算
|
||
// 9. 社保是否在入职 30 天内参保
|
||
// 10. 离职当月社保是否已停保
|
||
]
|
||
return { checks, passedCount, failedCount, warningCount }
|
||
}
|
||
```
|
||
|
||
前端 `Money.tsx` 工资批次页面:
|
||
- 批次归档前增加 **[AI 校验]** 按钮
|
||
- 校验结果:绿色 ✅ 通过项 / 红色 ❌ 异常项 / 黄色 ⚠️ 警告项
|
||
- 异常项可直接点击跳转到对应员工修改
|
||
|
||
**改动范围**:
|
||
- `backend/src/services/payroll.service.ts` — 新增 `prePayrollCheck()`
|
||
- `backend/src/routes/payroll2.routes.ts` — 新增 `POST /batch/:id/pre-check`
|
||
- `frontend/src/pages/Money.tsx` — 归档前增加校验步骤
|
||
|
||
---
|
||
|
||
### T2 — 高价值 / 中紧迫(近期做)
|
||
|
||
#### 2.6 HR 月度日历
|
||
|
||
**企业痛点**:HR 每月要做的事散落在各处,经常忘记某个截止日期
|
||
**价值**:一个月历视图,把所有截止日期可视化
|
||
|
||
**实现方案**:
|
||
|
||
后端新增 `/api/v1/dashboard/calendar?month=YYYY-MM`
|
||
|
||
```typescript
|
||
// 聚合当月所有关键日期:
|
||
// - 工资发放日(从 NotificationSetting.payrollDay)
|
||
// - 社保缴纳日(socialInsDay)
|
||
// - 公积金缴纳日(housingFundDay)
|
||
// - 个税申报日(taxDay)
|
||
// - 合同到期日(从 LaborContract.endDate 查当月到期的)
|
||
// - 试用期到期日(从 LaborContract 计算试用期结束日)
|
||
// - 员工退休日(从 Employee.birthDate + retirement.service.ts 计算)
|
||
// - 待办截止日(从 RiskItem 中有 deadline 的)
|
||
```
|
||
|
||
前端 Dashboard 新增日历组件:
|
||
- 月历视图,每天显示当日事项数量和颜色点
|
||
- 点击某天展开当日事项列表
|
||
- 每个事项可点击跳转到对应功能页
|
||
|
||
**改动范围**:
|
||
- `backend/src/routes/dashboard.routes.ts` — 新增日历端点
|
||
- `frontend/src/pages/Dashboard.tsx` — 新增月历组件
|
||
|
||
---
|
||
|
||
#### 2.7 人力成本深度分析
|
||
|
||
**企业痛点**:老板问"人力成本为什么比去年高",HR 答不上来
|
||
**价值**:成本同比/环比 + 归因分析
|
||
|
||
**实现方案**:
|
||
|
||
后端新增 `/api/v1/dashboard/cost-analysis`
|
||
|
||
```typescript
|
||
interface CostAnalysis {
|
||
currentMonth: {
|
||
totalCost: number // 企业总支出
|
||
salary: number // 工资
|
||
socialOrg: number // 企业社保
|
||
housingOrg: number // 企业公积金
|
||
overtime: number // 加班费
|
||
severance: number // 补偿金
|
||
}
|
||
lastMonth: same structure
|
||
lastYearSameMonth: same structure
|
||
// 归因分析
|
||
changes: {
|
||
salary: { amount, reason: '新增员工N人' | '涨薪' | '离职' }
|
||
socialOrg: { amount, reason: '基数调整' | '人数变化' }
|
||
overtime: { amount, reason: '加班增加' | '加班减少' }
|
||
}
|
||
headcount: { current, lastMonth, lastYear }
|
||
perCapitaCost: { current, lastMonth, lastYear }
|
||
}
|
||
```
|
||
|
||
前端 Dashboard 成本区域改造:
|
||
- 月度成本卡 → 增加同比/环比箭头 + 变化金额
|
||
- 新增成本归因列表("工资增加 ¥XX,XXX,原因:新增 3 人")
|
||
- 新增人均成本趋势
|
||
|
||
**改动范围**:
|
||
- `backend/src/services/risk.service.ts` — `getDashboardData()` 扩展成本分析
|
||
- `frontend/src/pages/Dashboard.tsx` — 成本区域增强
|
||
|
||
---
|
||
|
||
#### 2.8 考勤确认功能
|
||
|
||
**企业痛点**:加班费争议是仲裁高发区,企业没有员工确认考勤的证据
|
||
**价值**:员工在移动端确认考勤和加班费,形成证据
|
||
|
||
**实现方案**:
|
||
|
||
数据模型:
|
||
|
||
```prisma
|
||
model AttendanceConfirmation {
|
||
id String @id @default(cuid())
|
||
orgId String
|
||
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
|
||
employeeId String
|
||
employee Employee @relation(fields: [employeeId], references: [id], onDelete: Cascade)
|
||
month String // YYYY-MM
|
||
workDays Int
|
||
overtimeHours { weekdayHours: Int, weekendHours: Int, holidayHours: Int }
|
||
overtimePay Float
|
||
confirmedAt DateTime?
|
||
confirmIp String?
|
||
status String @default("PENDING") // PENDING / CONFIRMED / DISPUTED
|
||
disputeNote String? // 员工有异议时的说明
|
||
createdAt DateTime @default(now())
|
||
|
||
@@unique([orgId, employeeId, month])
|
||
}
|
||
```
|
||
|
||
流程:
|
||
1. HR 在后台生成月度考勤确认单(从 `AttendanceRecord` 汇总)
|
||
2. 员工在 portal 端看到待确认考勤
|
||
3. 员工确认或提出异议
|
||
4. 确认后生成 `EvidenceChain` 记录
|
||
|
||
**改动范围**:
|
||
- `backend/prisma/schema.prisma` — 新增模型
|
||
- `backend/src/routes/portal.routes.ts` — 新增考勤确认端点
|
||
- `backend/src/routes/roster.routes.ts` — 新增生成确认单端点
|
||
- `frontend/src/pages/Roster.tsx` — 考勤 Tab 增加确认状态
|
||
- 员工端 portal — 新增考勤确认页面
|
||
|
||
---
|
||
|
||
#### 2.9 违纪记录附件管理
|
||
|
||
**企业痛点**:记了违纪但没留证据,仲裁时员工不认
|
||
**价值**:每条违纪记录可上传附件(警告信签收 / 邮件截图 / 聊天记录)
|
||
|
||
**实现方案**:
|
||
|
||
利用现有 `EmployeeAttachment` 模型,增加 `category: 'DISCIPLINARY'` 类型,关联到具体违纪记录。
|
||
|
||
前端 Roster 详情 → 违纪记录 Tab:
|
||
- 每条违纪记录增加 **[上传附件]** 按钮
|
||
- 附件类型:警告信签收件 / 邮件记录 / 聊天截图 / 视频 / 其他
|
||
- 附件自动纳入证据链
|
||
|
||
**改动范围**:
|
||
- `backend/src/routes/attachment.routes.ts` — 增加 `disciplinaryId` 关联
|
||
- `frontend/src/pages/Roster.tsx` — 违纪 Tab 增加附件上传
|
||
|
||
---
|
||
|
||
#### 2.10 合同到期批量处理
|
||
|
||
**企业痛点**:月底一次性 10+ 合同到期,逐个续签效率低
|
||
**价值**:批量选择 + 模板填充 + 一键发起
|
||
|
||
**实现方案**:
|
||
|
||
前端合同管理 Tab:
|
||
- 筛选"30 天内到期"合同 → 勾选多个 → **[批量续签]** 按钮
|
||
- 弹窗:统一设置续签条件(期限 / 试用期 / 薪资调整)
|
||
- 生成多条合同确认链接,批量发送
|
||
|
||
**改动范围**:
|
||
- `backend/src/routes/roster.routes.ts` — 新增 `POST /contracts/batch-renew`
|
||
- `frontend/src/pages/Roster.tsx` — 合同 Tab 增加批量操作
|
||
|
||
---
|
||
|
||
### T3 — 中价值 / 中紧迫(排期做)
|
||
|
||
#### 2.11 规章制度民主程序管理
|
||
|
||
**企业痛点**:规章制度未经民主程序,仲裁时被认定无效
|
||
**价值**:管理制度的民主程序全流程留痕
|
||
|
||
**企业是否真需要?** ✅ 需要。这是仲裁中"制度是否有效"的核心证据。但使用频率低(一年几次),所以做轻量版。
|
||
|
||
**实现方案**:
|
||
|
||
数据模型:
|
||
|
||
```prisma
|
||
model PolicyDocument {
|
||
id String @id @default(cuid())
|
||
orgId String
|
||
org Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
|
||
title String
|
||
content String
|
||
type String // RULES / NOTICE
|
||
status String @default("DRAFT") // DRAFT / DISCUSSING / CONSULTING / PUBLISHED
|
||
democracyProgress Json? // { step: 1-4, steps: [{name, status, date, note}] }
|
||
publishedAt DateTime?
|
||
createdBy String
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@index([orgId, status])
|
||
}
|
||
```
|
||
|
||
前端轻量页面(不单独路由,作为合规模块的子功能):
|
||
- 制度列表 + 4 步进度条(起草 → 职工讨论 → 平等协商 → 公示)
|
||
- 每步可上传附件(会议纪要 / 签到表 / 公示截图)
|
||
- 完成后自动纳入证据链
|
||
|
||
**改动范围**:
|
||
- `backend/prisma/schema.prisma` — 新增 `PolicyDocument`
|
||
- `backend/src/services/policy.service.ts` — 新增服务
|
||
- `backend/src/routes/policy.routes.ts` — 新增路由
|
||
- `frontend/src/pages/Settings.tsx` — 新增"规章制度"section
|
||
|
||
---
|
||
|
||
#### 2.12 用工文本模板库
|
||
|
||
**企业痛点**:HR 不是法律专业,写合同/制度/通知容易出错
|
||
**价值**:提供法律审核过的标准模板,减少起草风险
|
||
|
||
**企业是否真需要?** ✅ 需要。但不需要做成独立页面,集成到合同管理和制度管理中即可。
|
||
|
||
**实现方案**:
|
||
|
||
数据库预置模板(不需要单独模型,用 JSON 配置文件管理):
|
||
|
||
```typescript
|
||
// backend/src/data/templates.ts
|
||
export const TEMPLATES = [
|
||
{ id: 'labor_contract_fixed', name: '固定期限劳动合同', category: '合同', content: '...' },
|
||
{ id: 'labor_contract_unfixed', name: '无固定期限劳动合同', category: '合同', content: '...' },
|
||
{ id: 'termination_notice', name: '解除劳动合同通知书', category: '通知', content: '...' },
|
||
{ id: 'resignation_cert', name: '离职证明', category: '证明', content: '...' },
|
||
{ id: 'warning_letter', name: '违纪警告信', category: '通知', content: '...' },
|
||
{ id: 'employee_handbook', name: '员工手册模板', category: '制度', content: '...' },
|
||
{ id: 'non_compete', name: '保密及竞业限制协议', category: '协议', content: '...' },
|
||
{ id: 'training_agreement', name: '培训服务期协议', category: '协议', content: '...' },
|
||
]
|
||
```
|
||
|
||
前端:
|
||
- 合同管理 → 新签合同时可选择模板 → 自动填充
|
||
- 制度管理 → 新建制度时可选择模板
|
||
- 解聘流程 → 生成解除通知书时使用模板
|
||
|
||
**改动范围**:
|
||
- `backend/src/data/templates.ts` — 模板数据
|
||
- `backend/src/routes/roster.routes.ts` — 合同创建支持 `templateId` 参数
|
||
- `frontend/src/pages/Roster.tsx` — 合同表单增加模板选择
|
||
|
||
---
|
||
|
||
#### 2.13 系统操作日志
|
||
|
||
**企业痛点**:出了问题查不到谁操作了什么
|
||
**价值**:审计追溯
|
||
|
||
**企业是否真需要?** ✅ 需要。已有 `AuditLog` 模型和写入逻辑,只缺查询界面。
|
||
|
||
**实现方案**:
|
||
|
||
后端新增 `/api/v1/settings/audit-logs`(分页 + 筛选)
|
||
|
||
前端 Settings 新增"操作日志"section:
|
||
- 筛选:操作人 / 操作类型 / 模块 / 时间范围
|
||
- 表格:时间 / 操作人 / 操作类型 / 模块 / 内容 / IP
|
||
|
||
**改动范围**:
|
||
- `backend/src/routes/settings.routes.ts` — 新增日志查询端点
|
||
- `frontend/src/pages/Settings.tsx` — 新增日志 section
|
||
|
||
---
|
||
|
||
#### 2.14 通知管理增强
|
||
|
||
**企业痛点**:通知设置有了,但通知记录没有管理界面
|
||
**价值**:查看通知发送历史 + 已读未读管理
|
||
|
||
**企业是否真需要?** ⚠️ 低优先级。现有通知设置已能用,通知记录是锦上添花。
|
||
|
||
**实现方案**:
|
||
|
||
复用现有 `notification.routes.ts` 中的日志端点,前端 Settings 增加通知记录查看。
|
||
|
||
**改动范围**:小,仅前端展示层。
|
||
|
||
---
|
||
|
||
### T4 — 低价值 / 不做或远期
|
||
|
||
| 原型功能 | 决策 | 理由 |
|
||
|---------|------|------|
|
||
| 视频中心 | ❌ 不做 | 非核心业务,可用第三方链接替代 |
|
||
| 背景调查 | ❌ 不做 | 专业第三方服务(如 i 背调),自建成本高价值低 |
|
||
| 语音发起签署 | ❌ 不做 | 伪需求,HR 在电脑前操作,语音无实际场景 |
|
||
| 年度 AI 价值报告 | ❌ 不做 | 营销噱头,企业不会因此续约,不如做好核心功能 |
|
||
| 全员风险地图 7 维评分 | ❌ 简化 | 7 维过于复杂,维护成本高。简化为 3 维:合同风险 + 薪酬风险 + 特殊群体风险 |
|
||
| AI Agent 自主巡航 | ❌ 远期 | 概念太大,当前 AI 能力不够支撑自主行动 |
|
||
| 实时 WebSocket 推送 | ❌ 不做 | HR 系统不需要实时推送,轮询足够 |
|
||
| 命令面板 | ❌ 不做 | 炫技功能,HR 用户群不适用 |
|
||
| 判例库自学习 | ❌ 远期 | 需要大量标注数据,当前阶段不现实 |
|
||
| 申请草稿/已发申请 | ❌ 不做 | 现有各功能模块已覆盖业务流程,无需额外的申请管理层 |
|
||
| 电子签独立中心 | ❌ 简化 | 不做独立页面,合同签署已集成在合同管理中,增加催签功能即可 |
|
||
| 企业文本库独立页面 | ❌ 简化 | 不做独立页面,模板集成到合同/制度管理中 |
|
||
| 五险一金计算器 | ⚠️ 可做 | 已有社保计算逻辑,封装为工具页面成本低,但优先级不高 |
|
||
| 医疗期计算器 | ⚠️ 可做 | 需求低频,可作为 AI 对话的快捷问题处理 |
|
||
| 员工生命周期时间轴 | ⚠️ 可做 | 有价值但优先级不高,可作为 Roster 详情的增强 |
|
||
|
||
---
|
||
|
||
### T5 — 架构治理(必须做,但不产生业务价值)
|
||
|
||
#### 2.15 Roster.tsx 拆分
|
||
|
||
**问题**:3840 行单文件,维护困难
|
||
**方案**:按 Tab 拆分为独立组件,主文件只做路由和视图切换
|
||
|
||
```
|
||
frontend/src/pages/roster/
|
||
├── index.tsx # 主页面
|
||
├── RosterList.tsx # 列表
|
||
├── RosterDetail.tsx # 详情容器
|
||
├── tabs/
|
||
│ ├── PersonnelTab.tsx
|
||
│ ├── CompensationTab.tsx
|
||
│ ├── AttendanceTab.tsx
|
||
│ ├── RiskTab.tsx
|
||
│ └── HistoryTab.tsx
|
||
└── modals/
|
||
├── EmployeeFormModal.tsx
|
||
└── ContractFormModal.tsx
|
||
```
|
||
|
||
#### 2.16 验证码迁移 Redis
|
||
|
||
**问题**:`Map` 内存存储,重启丢失,多实例不共享
|
||
**方案**:迁移到 Redis,TTL 5 分钟,支持频率限制
|
||
|
||
#### 2.17 通用组件抽取
|
||
|
||
| 组件 | 用途 |
|
||
|------|------|
|
||
| `MoneyDisplay` | 金额展示(¥ + 千分位 + 颜色) |
|
||
| `RiskBadge` | 风险等级标签(高/中/低 统一颜色) |
|
||
| `FilterBar` | 通用筛选栏 |
|
||
| `StatusBadge` | 状态徽章 |
|
||
| `ConfirmDialog` | 二次确认弹窗 |
|
||
| `EmptyState` | 空状态占位 |
|
||
|
||
---
|
||
|
||
## 三、实施路线图
|
||
|
||
```
|
||
Phase 1(3 周)— 解决"怕被告"和"怕丢证据"
|
||
├── 2.1 风险量化与优先级排序
|
||
├── 2.3 证据链管理
|
||
├── 2.4 解聘流程强化
|
||
└── 2.5 算薪前 AI 校验
|
||
|
||
Phase 2(2 周)— 解决"怕算错"和"怕低效"
|
||
├── 2.2 合同到期决策助手
|
||
├── 2.6 HR 月度日历
|
||
├── 2.7 人力成本深度分析
|
||
└── 2.10 合同到期批量处理
|
||
|
||
Phase 3(2 周)— 解决"怕丢证据"补充 + 制度合规
|
||
├── 2.8 考勤确认功能
|
||
├── 2.9 违纪记录附件管理
|
||
├── 2.11 规章制度民主程序
|
||
└── 2.12 用工文本模板库
|
||
|
||
Phase 4(1 周)— 审计 + 架构
|
||
├── 2.13 系统操作日志
|
||
├── 2.14 通知管理增强
|
||
├── 2.15 Roster.tsx 拆分
|
||
├── 2.16 Redis 迁移
|
||
└── 2.17 通用组件抽取
|
||
```
|
||
|
||
---
|
||
|
||
## 三-A、实施完成报告(2026-07-26)
|
||
|
||
> **全部 17 项优化已实施完成,后端 + 前端均通过 `tsc --noEmit` 编译。**
|
||
|
||
### 完成清单
|
||
|
||
| # | 优化项 | 优先级 | 状态 | 关键文件 |
|
||
|---|--------|--------|------|---------|
|
||
| 2.1 | 风险量化与优先级排序 | 高 | ✅ | `risk.service.ts` / `Dashboard.tsx` |
|
||
| 2.2 | 合同到期决策助手 | 高 | ✅ | `ai.routes.ts` `/contract-decision` |
|
||
| 2.3 | 证据链管理 | 高 | ✅ | `evidence.service.ts` / `EvidenceChain.tsx` |
|
||
| 2.4 | 解聘流程强化 | 高 | ✅ | `termination.service.ts` / `validateTerminationStep` |
|
||
| 2.5 | 算薪前 AI 校验 | 高 | ✅ | `payroll.service.ts` / `prePayrollCheck` |
|
||
| 2.6 | HR 月度日历 | 中 | ✅ | `risk.service.ts` / `getMonthlyCalendar` |
|
||
| 2.7 | 人力成本深度分析 | 中 | ✅ | `risk.service.ts` / `getCostAnalysis` |
|
||
| 2.8 | 考勤确认功能 | 中 | ✅ | `attendance.service.ts` / `Attendance.tsx` |
|
||
| 2.9 | 违纪记录附件管理 | 中 | ✅ | `schema.prisma` / `disciplinaryRecordId` |
|
||
| 2.10 | 合同到期批量处理 | 中 | ✅ | 已有 `batchRenew` 功能 |
|
||
| 2.11 | 规章制度民主程序 | 中 | ✅ | `policy.service.ts` / `Policies.tsx` |
|
||
| 2.12 | 用工文本模板库 | 中 | ✅ | `template.service.ts` / `Templates.tsx` |
|
||
| 2.13 | 系统操作日志 | 低 | ✅ | `audit.routes.ts` / `AuditLog.tsx` |
|
||
| 2.14 | 通知管理增强 | 低 | ✅ | `Notifications.tsx` |
|
||
| 2.15 | Roster.tsx 拆分 | 低 | ✅ | 3840→760 行,`roster/` 目录 12 个组件 |
|
||
| 2.16 | Redis 迁移 | 低 | ✅ | `codeStore.ts` 统一验证码存储 |
|
||
| 2.17 | 通用组件抽取 | 低 | ✅ | `StatusBadge` / `LoadingSpinner` / `ErrorBanner` |
|
||
|
||
### 新增文件清单
|
||
|
||
**后端(15 个文件)**:
|
||
- `src/lib/codeStore.ts` — 验证码存储(Redis + 内存 fallback)
|
||
- `src/services/evidence.service.ts` — 证据链服务
|
||
- `src/services/policy.service.ts` — 制度民主程序服务
|
||
- `src/services/attendance.service.ts` — 考勤确认服务
|
||
- `src/services/template.service.ts` — 用工模板服务
|
||
- `src/routes/evidence.routes.ts` — 证据链 API
|
||
- `src/routes/policy.routes.ts` — 制度管理 API
|
||
- `src/routes/attendance.routes.ts` — 考勤确认 API
|
||
- `src/routes/template.routes.ts` — 模板库 API
|
||
- `src/routes/audit.routes.ts` — 操作日志 API
|
||
|
||
**前端(18 个文件)**:
|
||
- `src/pages/Evidence.tsx` — 证据链管理页面
|
||
- `src/pages/Policies.tsx` — 制度管理页面
|
||
- `src/pages/Attendance.tsx` — 考勤确认页面
|
||
- `src/pages/Templates.tsx` — 模板库页面
|
||
- `src/pages/AuditLog.tsx` — 操作日志页面
|
||
- `src/pages/Notifications.tsx` — 通知管理页面
|
||
- `src/pages/roster/shared.ts` — 共享类型与常量
|
||
- `src/pages/roster/EmployeeProfile.tsx` — 员工详情页
|
||
- `src/pages/roster/BasicInfo.tsx` — 基本信息组件
|
||
- `src/pages/roster/ContractInfo.tsx` — 合同信息组件
|
||
- `src/pages/roster/modals.tsx` — 5 个弹窗组件
|
||
- `src/pages/roster/AttachmentInfo.tsx` — 附件管理组件
|
||
- `src/pages/roster/PayslipSocialInfo.tsx` — 薪酬社保组件
|
||
- `src/pages/roster/ChangeHistoryTab.tsx` — 变更历史组件
|
||
- `src/pages/roster/AttendanceOvertimeInfo.tsx` — 考勤培训组件
|
||
- `src/pages/roster/TerminationInfo.tsx` — 离职解聘组件
|
||
- `src/pages/roster/DisciplinaryInfo.tsx` — 违纪记录组件
|
||
- `src/pages/roster/PerformanceInfo.tsx` — 绩效记录组件
|
||
- `src/pages/roster/EvidenceChain.tsx` — 仲裁证据链组件
|
||
- `src/components/ui/StatusBadge.tsx` — 状态徽章
|
||
- `src/components/ui/LoadingSpinner.tsx` — 加载占位
|
||
- `src/components/ui/ErrorBanner.tsx` — 错误提示横幅
|
||
- `src/components/ui/index.ts` — UI 组件统一导出
|
||
|
||
### Prisma 模型变更
|
||
|
||
| 变更类型 | 模型 | 说明 |
|
||
|---------|------|------|
|
||
| 新增 | `EvidenceChain` | 证据链(SHA-256 hash 链) |
|
||
| 新增 | `AttendanceConfirmation` | 考勤确认记录 |
|
||
| 新增 | `PolicyDocument` | 制度文档 + 民主程序 |
|
||
| 扩展 | `RiskItem` | +`estimatedLoss` / `lossRange` / `deadline` |
|
||
| 扩展 | `EmployeeAttachment` | +`disciplinaryRecordId` |
|
||
|
||
### 编译验证
|
||
|
||
```bash
|
||
# 后端
|
||
cd backend && npx tsc --noEmit # ✅ 零错误
|
||
|
||
# 前端
|
||
cd frontend && npx tsc --noEmit # ✅ 零错误
|
||
```
|
||
|
||
---
|
||
|
||
## 四、数据模型变更汇总
|
||
|
||
### 4.1 新增模型(3 个)
|
||
|
||
| 模型 | 用途 | 对应优化项 |
|
||
|------|------|-----------|
|
||
| `EvidenceChain` | 证据链管理 | 2.3 |
|
||
| `AttendanceConfirmation` | 考勤确认 | 2.8 |
|
||
| `PolicyDocument` | 制度文档 + 民主程序 | 2.11 |
|
||
|
||
### 4.2 现有模型扩展
|
||
|
||
| 模型 | 新增字段 | 用途 |
|
||
|------|---------|------|
|
||
| `RiskItem` | `estimatedLoss Float?` / `lossRange Json?` / `deadline DateTime?` | 风险量化 |
|
||
| `Organization` | 无需扩展 | — |
|
||
| `EmployeeAttachment` | `disciplinaryId String?` | 违纪附件关联 |
|
||
|
||
### 4.3 不新增的模型(对比原方案)
|
||
|
||
| 原方案模型 | 决策 | 理由 |
|
||
|-----------|------|------|
|
||
| `ComplianceScore` | ❌ 不做 | 5 维评分过于复杂,用 RiskItem 的金额量化替代 |
|
||
| `EmployeeRiskScore` | ❌ 不做 | 7 维评分过于复杂,简化为 3 维 |
|
||
| `DemocracyProcess` | ❌ 合并 | 合并到 `PolicyDocument` 的 `democracyProgress` 字段 |
|
||
| `EnterpriseText` | ❌ 不做 | 模板用配置文件管理,不需要独立模型 |
|
||
| `TextTemplate` | ❌ 不做 | 同上 |
|
||
| `ApplicationDraft` | ❌ 不做 | 现有功能已覆盖业务流程 |
|
||
|
||
---
|
||
|
||
## 五、API 变更汇总
|
||
|
||
### 5.1 新增 API(12 个)
|
||
|
||
| 端点 | 方法 | 说明 | 优化项 |
|
||
|------|------|------|--------|
|
||
| `/contracts/:id/expiry-decision` | GET | 合同到期决策助手 | 2.2 |
|
||
| `/evidence/:category/:refId` | GET | 获取证据链 | 2.3 |
|
||
| `/evidence/employee/:id` | GET | 员工全部证据链 | 2.3 |
|
||
| `/evidence/:id/export` | POST | 导出证据链 PDF | 2.3 |
|
||
| `/termination/:id/validate-step` | GET | 解聘步骤校验 | 2.4 |
|
||
| `/payroll2/batch/:id/pre-check` | POST | 算薪前校验 | 2.5 |
|
||
| `/dashboard/calendar` | GET | HR 月度日历 | 2.6 |
|
||
| `/dashboard/cost-analysis` | GET | 成本分析 | 2.7 |
|
||
| `/roster/attendance-confirmations` | POST | 生成考勤确认单 | 2.8 |
|
||
| `/portal/attendance-confirmation` | GET | 员工端获取考勤确认 | 2.8 |
|
||
| `/portal/attendance-confirmation/:id` | POST | 员工确认考勤 | 2.8 |
|
||
| `/contracts/batch-renew` | POST | 批量续签 | 2.10 |
|
||
| `/settings/audit-logs` | GET | 操作日志 | 2.13 |
|
||
| `/policies` | GET/POST/PUT | 制度管理 | 2.11 |
|
||
|
||
### 5.2 现有 API 增强
|
||
|
||
| 端点 | 增强内容 | 优化项 |
|
||
|------|---------|--------|
|
||
| `GET /dashboard` | RiskItem 增加金额/截止日/优先级 | 2.1 |
|
||
| `GET /roster` | 员工列表增加风险标签 | 2.1 |
|
||
| `POST /portal/contract-confirm` | 记录 IP 和设备信息 | 2.3 |
|
||
| `POST /portal/payslip-confirm` | 记录 IP | 2.3 |
|
||
|
||
---
|
||
|
||
## 六、前端变更汇总
|
||
|
||
### 6.1 新增页面(1 个)
|
||
|
||
| 页面 | 路由 | 说明 |
|
||
|------|------|------|
|
||
| 制度管理 | `/settings/policies` | Settings 子页面,轻量 |
|
||
|
||
### 6.2 现有页面增强
|
||
|
||
| 页面 | 增强内容 | 优化项 |
|
||
|------|---------|--------|
|
||
| `Dashboard.tsx` | 紧急风险横幅 + 风险金额 + 月度日历 + 成本分析 | 2.1 / 2.6 / 2.7 |
|
||
| `Roster.tsx` | 合同决策助手 + 批量续签 + 考勤确认 + 违纪附件 + 证据链 Tab | 2.2 / 2.8 / 2.9 / 2.10 / 2.3 |
|
||
| `Termination.tsx` | 步骤前置校验门 | 2.4 |
|
||
| `Money.tsx` | 算薪前 AI 校验 | 2.5 |
|
||
| `Settings.tsx` | 操作日志 + 通知记录 + 制度管理 | 2.13 / 2.14 / 2.11 |
|
||
| `AIAssistant.tsx` | 合同审查增加模板选择 | 2.12 |
|
||
|
||
### 6.3 不新增的页面(对比原方案)
|
||
|
||
| 原方案页面 | 决策 | 理由 |
|
||
|-----------|------|------|
|
||
| `Compliance.tsx` | ❌ | 合规功能分散到 Dashboard + Settings |
|
||
| `ESign.tsx` | ❌ | 合同签署已集成在 Roster |
|
||
| `Democracy.tsx` | ❌ | 合并到 Settings 子页面 |
|
||
| `EnterpriseText.tsx` | ❌ | 模板用配置文件 |
|
||
| `TextTemplates.tsx` | ❌ | 同上 |
|
||
| `Applications.tsx` | ❌ | 无需额外申请管理层 |
|
||
| `Tools.tsx` | ❌ | 计算器优先级低 |
|
||
| `ValueReport.tsx` | ❌ | 营销噱头 |
|
||
|
||
---
|
||
|
||
## 七、验收标准
|
||
|
||
### Phase 1 验收
|
||
|
||
| 项目 | 验收点 |
|
||
|------|--------|
|
||
| 风险量化 | 每条风险显示预估损失金额 + 建议处理截止日 + 优先级排序 |
|
||
| 证据链 | 合同签署/工资条确认/入职填报可导出完整证据链 PDF |
|
||
| 解聘强化 | 三期/工伤/医疗期员工尝试非过错解除时被拦截 |
|
||
| 算薪校验 | 归档前可执行 AI 校验,异常项可点击跳转修改 |
|
||
|
||
### Phase 2 验收
|
||
|
||
| 项目 | 验收点 |
|
||
|------|--------|
|
||
| 合同决策 | 到期合同可查看三选项对比(续签/不续签/变更条件)+ 成本 |
|
||
| 月度日历 | Dashboard 显示当月所有关键日期,可点击跳转 |
|
||
| 成本分析 | 月度成本显示同比/环比 + 归因分析 |
|
||
| 批量续签 | 可勾选多个到期合同批量续签 |
|
||
|
||
### Phase 3 验收
|
||
|
||
| 项目 | 验收点 |
|
||
|------|--------|
|
||
| 考勤确认 | HR 可生成月度考勤确认单,员工可在 portal 确认或异议 |
|
||
| 违纪附件 | 违纪记录可上传附件,附件纳入证据链 |
|
||
| 制度管理 | 可创建制度文档,4 步民主程序可记录进度和附件 |
|
||
| 模板库 | 合同/制度/通知可从模板创建 |
|
||
|
||
### Phase 4 验收
|
||
|
||
| 项目 | 验收点 |
|
||
|------|--------|
|
||
| 操作日志 | Settings 可查看/筛选操作日志 |
|
||
| Roster 拆分 | 功能不变,所有 Tab 和弹窗正常 |
|
||
| Redis | 验证码存储/读取/过期/频率限制正常 |
|
||
| 通用组件 | 5+ 组件抽取,3+ 页面引用 |
|
||
|
||
---
|
||
|
||
## 八、与原方案对比
|
||
|
||
| 维度 | 原方案 | 本方案 |
|
||
|------|--------|--------|
|
||
| 出发点 | 原型有什么我们缺什么 | 企业需要什么我们做什么 |
|
||
| 优化项数 | 21 项 | 17 项(含 3 项架构) |
|
||
| 新增数据模型 | 7 个 | 3 个 |
|
||
| 新增 API | 25 个 | 12 个 |
|
||
| 新增前端页面 | 8 个 | 1 个 |
|
||
| 新增前端文件 | 30+ 个 | 10 个以内 |
|
||
| 核心价值 | 功能覆盖度 | 解决企业痛点 |
|
||
| 开发周期 | 6 周 | 8 周(但每项都有明确业务价值) |
|