Files
TurboHR/20260726优化方案.md
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

35 KiB
Raw Permalink Blame History

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 扩展:

// 为每个 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

// 输入:合同 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 证据链管理

企业痛点:仲裁时拿不出证据,因为关键操作没有留痕或留痕不完整 价值:每个高风险操作自动生成完整证据链,仲裁时一键导出

实现方案

数据模型扩展:

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 扩展:

// 每个步骤增加前置条件校验
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()

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

// 聚合当月所有关键日期:
// - 工资发放日(从 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

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.tsgetDashboardData() 扩展成本分析
  • frontend/src/pages/Dashboard.tsx — 成本区域增强

2.8 考勤确认功能

企业痛点:加班费争议是仲裁高发区,企业没有员工确认考勤的证据 价值:员工在移动端确认考勤和加班费,形成证据

实现方案

数据模型:

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 规章制度民主程序管理

企业痛点:规章制度未经民主程序,仲裁时被认定无效 价值:管理制度的民主程序全流程留痕

企业是否真需要? 需要。这是仲裁中"制度是否有效"的核心证据。但使用频率低(一年几次),所以做轻量版。

实现方案

数据模型:

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 配置文件管理):

// 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 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

编译验证

# 后端
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 合并 合并到 PolicyDocumentdemocracyProgress 字段
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 周(但每项都有明确业务价值)