Files
TurboHR/20260726优化方案.md
T
selfrelease d79e3baa34 feat: 系统优化Phase2 - 面包屑导航/侧边栏间距/制度公示阅读签收/模板变量中文化/通知类型补全
- 面包屑导航组件,集成至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
2026-07-26 20:32:38 +08:00

914 lines
35 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.
# 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 13 周)— 解决"怕被告"和"怕丢证据"
├── 2.1 风险量化与优先级排序
├── 2.3 证据链管理
├── 2.4 解聘流程强化
└── 2.5 算薪前 AI 校验
Phase 22 周)— 解决"怕算错"和"怕低效"
├── 2.2 合同到期决策助手
├── 2.6 HR 月度日历
├── 2.7 人力成本深度分析
└── 2.10 合同到期批量处理
Phase 32 周)— 解决"怕丢证据"补充 + 制度合规
├── 2.8 考勤确认功能
├── 2.9 违纪记录附件管理
├── 2.11 规章制度民主程序
└── 2.12 用工文本模板库
Phase 41 周)— 审计 + 架构
├── 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 新增 API12 个)
| 端点 | 方法 | 说明 | 优化项 |
|------|------|------|--------|
| `/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 周(但每项都有明确业务价值) |