Files
TurboHR/20260815-优化.md
T
selfrelease e1b5ae9aab feat: 20260815 系统优化 - 全部31项问题修复(P0×6+P1×14+P2×9+P3×2)
P0紧急修复(6项):
- 草稿保存完整恢复所有字段(含socialAvgWage)
- 补偿金批次从compensationBreakdown读取
- 违法解除风险确认UI
- 合同结束日期前后校验(前后端双保险)

P1高优先级(14项):
- 离职日期联动社保/公积金截止月(15号规则)
- 合规检查+工作交接改为软阻断(生成待办)
- 补偿月数(N/N+1/2N/自定义)+计算基数(近12月/合同/自定义)
- 解聘并入花名册操作栏(类型选择跳转向导)
- 合同续签开始日期自动推导(原合同结束日+1天)
- 年龄合规筛查(童工阻断/未成年工/退休警告)
- 编辑入职日期后状态联动(待入职↔在职)
- 转正移植到花名册操作栏+薪资回写
- 男职工无法选择三期

P2体验优化(9项):
- "劳动合同"调整为"用工关系"
- 费用结算新增剩余年假折算(300%日工资)
- 身份证号全域改为"证件号码"(前后端18个文件)
- 手机号查重
- 开具证明+合同续签移植到花名册操作栏
- 批量转正+批量开具证明
- 去掉用工办理模块

P3规划(2项):
- 组织架构+审批流(Department/Position/ApprovalFlow/ApprovalInstance)
- 客服工作台(Ticket/ChatSession+SUPPORT角色)

新增模型: Department/Position/ApprovalFlow/ApprovalInstance/Ticket/TicketMessage/ChatSession/ChatMessage
新增字段: Employee.departmentId/supervisorId
新增角色: SUPPORT

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-15 12:37:27 +08:00

385 lines
27 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.
# 20260815 优化清单
> 来源:`20260815-优化.csv`(共 31 条)
> 结合 TurboHR 当期功能梳理,按模块归类,标注根因 / 修复方向 / 优先级 / 涉及文件。
> 优先级:P0 紧急(影响业务正确性/数据丢失)|P1 高(流程阻塞或合规风险)|P2 中(体验/增强)|P3 规划(新模块)
---
## 一、离职管理(问题 2-11
### 问题 2:离职日期调整后未联动社保/公积金截止年月
- **现状**`Termination.tsx:1334-1338` 社保截止、公积金截止为 `<Input type="month">` 手动填写,默认值取 `terminationDate.slice(0,7)`,但修改离职日期后不会重算,也无"15 日前/后"规则。
- **修复方向**
1. 增加"离职日期 → 社保/公积金截止月"自动推导规则:每月 15 日(含)前离职不缴当月、15 日后离职缴纳当月,截止月 = 离职月 - 0 或 -1。
2. 阈值日期(15 日)做成系统设置可配置项(`org_settings.socialInsCutoffDay`,默认 15)。
3. 离职日期变更时自动回填两个截止月,同时保留手动覆盖入口。
- **优先级**P1 高
- **涉及文件**`frontend/src/pages/Termination.tsx``backend/src/services/termination.service.ts``backend/prisma/schema.prisma`org_settings 增字段)
### 问题 3:合规检查"是否已支付经济补偿金"硬阻断
- **现状**:合规检查为必勾才能进入下一步,未勾选时无法继续,且未保存的检查项不进入待办/风险提醒。
- **修复方向**
1. 将"必勾才能下一步"改为"未勾选可下一步,但自动写入待办事项 + 风险提醒"。
2. 待办项关联 `termination_draft`,在 Dashboard/风险中心展示"XX 员工解聘未支付经济补偿金"。
3. 提交审批时若仍存在未闭环必检项,给出强提示但不阻断(除非法定禁止情形,如孕期/工伤)。
- **优先级**P1 高
- **涉及文件**`Termination.tsx`step 2 校验逻辑)、`backend/src/services/notification.service.ts``frontend/src/pages/Dashboard.tsx`
### 问题 4:费用结算新增"剩余年假天数"
- **现状**:费用结算步骤仅展示补偿金/代通知金/赔偿金,未涉及年假折算。
- **修复方向**
1. 费用结算区新增"剩余年假天数"字段,支持手动录入或调用考勤模块年假余额(若有)。
2. 按规则计算未休年假折算工资:`日工资 × 剩余年假天数 × 300%`(未休部分)。
3. 折算金额计入"合计应付"。
- **优先级**P2 中
- **涉及文件**`Termination.tsx`step 3)、`backend/src/services/termination.service.ts`cost 计算扩展)
### 问题 5:补偿月数支持 N / N+1 / 2N / 其他
- **现状**`Termination.tsx:1442` 补偿月数取 `costResult.cappedMonths`(系统按工龄自动算 N),不允许选择其他模式。
- **修复方向**
1. 补偿月数改为下拉:N、N+1、2N、其他(自定义输入)。
2. 选择"协商解除"时允许修改月数并实时重算补偿金。
3. 选择"其他"时需填写说明,留痕到 `compensationBreakdown.adjustments`
- **优先级**P1 高
- **涉及文件**`Termination.tsx`step 3 补偿金区)、`backend/src/services/termination.service.ts`
### 问题 6:计算基数支持多种来源
- **现状**`Termination.tsx:1443` 计算基数固定取 `costResult.cappedWage`(近 12 月平均工资,且有三倍社平工资封顶)。
- **修复方向**
1. 计算基数改为下拉:近 12 月平均工资(默认)、合同工资、其他(手动填写)。
2. 切换来源后实时重算补偿金,并记录选用算法到草稿。
3. "其他"需填写说明,受三倍社平封顶提示但不强制。
- **优先级**P1 高
- **涉及文件**`Termination.tsx``termination.service.ts`
### 问题 7:手动调整补偿金分项后合计未同步
- **现状**`Termination.tsx:530` 注释提到"系统预估 + 手动调整差额",但 `handleSave`578 行附近)仍使用 `costResult.grandTotal`,未叠加 `compAdjustments`。20260803 问题 13 已识别但未闭环。
- **修复方向**
1. 实际合计 = `costResult.grandTotal + Σ(adjustments.to - adjustments.from)`,保存与确认页统一使用此值。
2. 调整任一分项后实时刷新"合计应付"显示。
3. 后端 `compensationBreakdown.adjustments` 已支持,前端需正确传递并回显。
- **优先级**P0 紧急
- **涉及文件**`Termination.tsx``handleSave`、确认步骤、step 3 合计显示)
### 问题 8:工作交接未完成无法下一步
- **现状**`Termination.tsx:552-554` step 4 校验 `work_handover/equipment_return/access_revoke` 三项必须完成才能下一步。
- **修复方向**
1. 改为可下一步,未完成事项自动写入待办(关联离职草稿)。
2. 交接清单前三项标注"离职必办",未完成时在确认页和风险中心强提示。
3. 待办在到达离职日期前持续提醒,超期升级为风险。
- **优先级**P1 高
- **涉及文件**`Termination.tsx`step 4 校验)、`notification.service.ts``Dashboard.tsx`
### 问题 9:离职管理"新建解聘"并入花名册操作栏
- **现状**:花名册操作栏已有"离职"按钮(`Roster.tsx:734-746`,触发 `ResignModal` 创建 RESIGNATION 草稿),但"新建解聘"仍在离职管理列表页独立入口,且仅支持 RESIGNATION 类型。
- **修复方向**
1. 花名册操作栏"离职"按钮扩展为支持所有解聘类型(协商/过错/非过错/裁员/到期/违法),弹出类型选择后跳转 Termination 向导并预填员工。
2. 离职管理列表页移除"新建解聘"按钮,仅保留草稿列表与审批。
- **优先级**P1 高
- **涉及文件**`Roster.tsx``roster/modals.tsx``ResignModal`)、`Termination.tsx`(支持 URL 参数预填)
### 问题 10:解聘驳回后修改内容未更新
- **现状**:驳回后重新修改解聘类型、金额等,系统未按新内容更新(疑似使用旧草稿快照或前端未刷新)。
- **修复方向**
1. 排查 `updateDraft` 是否正确覆盖 `reason/compensationBreakdown/terminationDate`
2. 驳回后再编辑走 `updateDraft`(而非新建),版本号 +1,旧版本留快照。
3. 前端进入驳回草稿时强制重新拉取最新数据。
- **优先级**P0 紧急
- **涉及文件**`Termination.tsx`(编辑驳回草稿逻辑)、`backend/src/services/termination.service.ts``backend/src/routes/termination.routes.ts`
### 问题 11:违法解除降低补偿金后无合规风险提醒
- **现状**:选择 ILLEGAL(2N)后手动降低补偿金金额,`acknowledgeRisk` 仅在初始选择违法解除时提示,金额变动后不再校验。
- **修复方向**
1. 实际补偿金 < 法定 2N 时,强制弹出合规风险提醒,需勾选"已知风险并继续"才能下一步。
2. 风险提醒记录到 `compensationBreakdown.riskAcknowledged`,留痕可审计。
3. 同步推送风险中心。
- **优先级**P0 紧急
- **涉及文件**`Termination.tsx`step 3 风险校验)、`risk-center`
---
## 二、用工办理 / 合同(问题 12-13、18、20-23、26
### 问题 12:合同续签新增合同开始日期应为上一份结束日期 +1
- **现状**`WorkProcess.tsx:93-99` RENEW 表单 `newStartDate` 为手动填写,无自动推导。
- **修复方向**
1. 选择员工后自动拉取最新已签合同,`newStartDate` 默认 = 上一份合同 `endDate + 1 天`
2. 允许手动覆盖,但偏离时提示。
- **优先级**P1 高
- **涉及文件**`WorkProcess.tsx`RENEW 字段)、`backend/src/services/work-process.service.ts`
### 问题 13:合同结束日期早于开始日期未校验
- **现状**`WorkProcess.tsx` 表单提交前无日期前后关系校验,已产生时间倒置数据。
- **修复方向**
1. 前端表单提交前校验 `endDate >= startDate`,否则阻断并提示。
2. 后端 `work-process.service.ts` 增加同样校验,双保险。
3. 历史倒置数据提供修复脚本/列表提示。
- **优先级**P0 紧急
- **涉及文件**`WorkProcess.tsx``work-process.service.ts`
### 问题 18:员工转正移植到花名册操作栏,替换发薪
- **现状**:花名册操作栏(`Roster.tsx:694-747`)有调薪/发薪/调部门/离职,无转正入口;转正仍在用工办理 CONFIRM 流程。
- **修复方向**
1. 操作栏"发薪"按钮(`Wallet`711-720 行)替换为"转正"按钮(`CheckCircle`),点击弹出转正 Modal(转正日期 + 转正薪资)。
2. 仅试用期员工(`probationInfo.isProbation`)显示转正按钮。
3. 发薪入口保留在薪税管理模块。
- **优先级**P1 高
- **涉及文件**`Roster.tsx``roster/modals.tsx`(新增 `ConfirmModal`
### 问题 19:转正薪资未回写花名册,未与用工协议匹配校验
- **现状**CONFIRM 流程填写 `regularSalary` 后未同步到员工 `monthlySalary`,也未校验与已签合同薪资是否一致。
- **修复方向**
1. 转正完成后同步更新员工 `monthlySalary`,并在花名册明细展示"试用期薪资 → 转正薪资"变更记录。
2. 校验转正薪资与最新合同 `monthlySalary` 是否一致,不一致时提示并支持发起合同变更流程(CHANGE)。
- **优先级**P1 高
- **涉及文件**`work-process.service.ts`CONFIRM 完成回调)、`Roster.tsx``roster/SalaryInfo.tsx`
### 问题 20:开具证明移植到花名册操作栏
- **现状**:操作栏无开具证明入口,需进用工办理 INCOME_CERT/LEAVING_CERT 流程。
- **修复方向**:操作栏新增"证明"按钮(`FileText`),点击弹出证明类型选择(收入证明/离职证明/在职证明),复用 WorkProcess 的 INCOME_CERT/LEAVING_CERT 表单。
- **优先级**P2 中
- **涉及文件**`Roster.tsx``roster/modals.tsx`
### 问题 21:合同续签移植到花名册操作栏
- **现状**:操作栏无续签入口,批量续签在列表顶部(`Roster.tsx:444`),单人续签需进用工办理。
- **修复方向**:操作栏新增"续签"按钮(`Repeat`),仅合同即将到期(≤30 天)或已到期员工显示,点击跳转 WorkProcess RENEW 并预填员工。
- **优先级**P2 中
- **涉及文件**`Roster.tsx``WorkProcess.tsx`(支持 URL 参数预填)
### 问题 22:合同变更选择员工无法查询到对应合同
- **现状**`WorkProcess.tsx:88-92` CHANGE 表单 `contractId``contract-select` 类型,但选择员工后未按员工过滤合同列表,导致查不到。
- **修复方向**
1. `contract-select` 组件接收 `employeeId` 参数,仅返回该员工的有效合同。
2. 后端合同查询接口支持 `employeeId` 过滤。
- **优先级**P1 高
- **涉及文件**`WorkProcess.tsx`contract-select 组件)、`backend/src/routes/contract.routes.ts`
### 问题 23:合同续签原合同 ID 无法查询,改为选择已存在合同
- **现状**`WorkProcess.tsx:95` RENEW 表单 `oldContractId``text` 类型,需手动输入 UUID,无法查询。
- **修复方向**:将 `oldContractId` 改为 `contract-select`(同问题 22),选择员工后下拉展示该员工已存在合同。
- **优先级**P1 高
- **涉及文件**`WorkProcess.tsx`RENEW 字段类型)
### 问题 26:去掉用工办理模块
- **现状**:侧边栏"团队"分组有"用工办理"入口(`SidebarNav.tsx:47`),承载 HIRE/ONBOARD/CONFIRM/CHANGE/RENEW/SUSPEND/INCOME_CERT/LEAVING_CERT/FLEXIBLE 等流程。
- **修复方向**
1. 将各流程入口下沉到花名册操作栏(转正/续签/变更/开具证明/入职)和独立页面(合同管理/电子签署)。
2. 侧边栏移除"用工办理"菜单项,保留 WorkProcess 页面作为批量流程入口(或迁移到"更多"分组)。
3. 需先完成问题 18/20/21/22/23 的入口下沉,再移除菜单。
- **优先级**:P2 中(依赖前置问题完成)
- **涉及文件**`SidebarNav.tsx``Roster.tsx``WorkProcess.tsx``App.tsx`(路由)
---
## 三、花名册(问题 14-17、24-25
### 问题 14:身份证号全域改为"证件号码"
- **现状**`roster/modals.tsx:687``WorkProcess.tsx:60/109/132/140` 等多处 label 为"身份证号"。
- **修复方向**:全域搜索替换 label "身份证号" → "证件号码",字段名 `idCardNumber` 保持不变(兼容历史数据),同时支持证件类型下拉(身份证/护照/港澳台通行证)。
- **优先级**P2 中
- **涉及文件**`roster/modals.tsx``WorkProcess.tsx``Roster.tsx`(搜索 placeholder)、`SpecialStatus.tsx`
### 问题 15:添加员工根据证件号码进行年龄合规筛查
- **现状**`roster/modals.tsx:557` 已根据身份证号自动计算性别,未做年龄校验。
- **修复方向**
1. 解析证件号码出生日期,计算年龄。
2. 年龄 < 16 岁禁止录入(童工红线),强提示并阻断。
3. 年龄 ≥ 60(男)/55(女干部)/50(女工人)提示已达法定退休年龄,确认后允许录入但标记"退休返聘"。
- **优先级**P1 高
- **涉及文件**`roster/modals.tsx``handleIdCardChange`
### 问题 16:编辑入职日期后状态未变更
- **现状**:花名册明细编辑入职日期后,员工状态未联动(如改为下月 1 日入职,状态应从"在职"变为"待入职")。
- **修复方向**
1. 编辑入职日期时,若新入职日期 > 今天,状态自动设为 `PENDING_ONBOARD`(待入职);若 ≤ 今天,设为 `ACTIVE`
2. 状态变更需二次确认,避免误操作。
3. 变更记录留痕到员工档案。
- **优先级**P1 高
- **涉及文件**`roster/BasicInfo.tsx``backend/src/services/employee.service.ts`
### 问题 17:录入手机号查重
- **现状**`roster/modals.tsx:702` 手机号为选填,无查重;身份证号已有查重(691 行)。
- **修复方向**
1. 手机号录入时调用查重接口,已存在则提示"该手机号已用于 XX 人员"。
2. 允许继续保存(一人多号/家庭号场景),但强提示确认。
- **优先级**P2 中
- **涉及文件**`roster/modals.tsx``backend/src/routes/employee.routes.ts`(新增手机号查重接口)
### 问题 24:花名册多选增加批量转正
- **现状**`Roster.tsx:444-447` 批量操作仅有"批量续签""批量解聘",无批量转正。
- **修复方向**
1. 多选后新增"批量转正"按钮,仅对试用期员工生效。
2. 弹窗统一填写转正日期(默认今天)和转正薪资(可按原薪资倍数/手动逐人填写)。
3. 调用后端批量转正接口,复用问题 18 的转正逻辑。
- **优先级**P2 中
- **涉及文件**`Roster.tsx``roster/modals.tsx``backend/src/services/employee.service.ts`
### 问题 25:花名册多选增加批量开具证明
- **现状**:无批量开具证明入口。
- **修复方向**
1. 多选后新增"批量开具证明"按钮,选择证明类型(在职/收入)后批量生成。
2. 支持批量下载(ZIP)或逐个下载。
- **优先级**P2 中
- **涉及文件**`Roster.tsx``backend/src/services/work-process.service.ts`(批量生成接口)
---
## 四、薪税管理(问题 28
### 问题 28:补偿金批次经济补偿金发放数据读取错误
- **现状**`money/BatchTab.tsx:110` 批次类型支持 `SEVERANCE`(补偿金),但创建补偿金批次时经济补偿金发放数据读取逻辑有误(疑似读取了工资数据或未关联离职草稿的 `compensationBreakdown`)。
- **修复方向**
1. 排查 `createBatch``type=SEVERANCE` 时的数据源,应从已审批通过的 `termination_draft` 读取 `compensationBreakdown.grandTotal`
2. 校验员工范围:仅包含有未发放补偿金的离职员工。
3. 增加预览页展示每位员工的补偿金明细,确认后再创建批次。
- **优先级**P0 紧急
- **涉及文件**`money/BatchTab.tsx``backend/src/services/payroll.service.ts`SEVERANCE 分支)
---
## 五、特殊员工(问题 29
### 问题 29:男职工应无法选择三期
- **现状**`SpecialStatus.tsx:123` 默认 `type: 'PREGNANCY'`,新增/编辑表单未根据员工性别过滤类型,男职工也可选"三期"。
- **修复方向**
1. 选择员工后,若 `gender === '男'`,类型下拉移除"三期"选项或置灰并提示"三期仅适用于女性员工"。
2. 后端保存时增加校验,男职工 + PREGNANCY 组合拒绝并返回 400。
- **优先级**P1 高
- **涉及文件**`SpecialStatus.tsx`(表单 type 下拉)、`backend/src/services/special-status.service.ts`
---
## 六、系统设置 / 组织架构(问题 27)
### 问题 27:增加简单组织架构,支持三步以内审批流转
- **现状**:系统无组织架构模块,`LeaveApproval.tsx:90` 仅有简单审批,无层级流转;`settingsApi.org()` 仅返回企业基本信息。当前员工仅有 `department`(字符串)和 `position`(字符串,前端 label "职务/岗位")两个字段,无上下级关系。
- **职位/岗位设计决策**
- **现状**:数据库只有一个 `position` 字段(`schema.prisma:225`,注释"岗位"),前端 label 统一为"职务/岗位"`roster/modals.tsx:686``roster/BasicInfo.tsx:153/328`),已合并为一个字段。
- **建议方案 A(推荐,保留一个字段)**:维持 `position` 单字段,label 保持"职务/岗位"。组织架构中"岗位"作为独立实体管理(岗位字典,含岗位名称、职级、编制人数),员工 `position` 关联到岗位字典。优点:改动小,兼容历史数据,符合当前使用习惯。
- **方案 B(拆分两个字段)**:新增 `jobTitle`(职位,如"经理/主管/专员"+ `position`(岗位,如"前端工程师")。优点:职级体系更清晰;缺点:需改 schema + 全域表单 + 历史 position 数据需清洗归类,工作量大。
- **结论**:建议采用方案 A,组织架构模块中"岗位"独立建表(`Position` 字典),员工 `position` 字段值关联岗位字典 ID 或保持文本(兼容旧数据),审批流按"直属上级 → 部门负责人"两级流转,无需引入职级。
- **修复方向**
1. 系统设置新增"组织架构"子页:树形部门(`Department` 自引用 parent+ 岗位字典(`Position`,含名称/所属部门/编制)+ 上下级关系(`Employee.supervisorId`)。
2. 新建简单审批流配置:最多 3 步(发起人 → 直属上级 → 部门负责人),支持按流程类型(休假/离职/调薪)配置是否启用某步。
3. 现有 `LeaveApproval` 接入审批流引擎,离职/调薪等流程可选启用。
4. 数据模型:`Department`(树形,parent 自引用)、`Position`(岗位字典)、`Employee.supervisorId``ApprovalFlow`type + steps)。
- **优先级**:P3 规划(新模块,建议单独排期)
- **涉及文件**`Settings.tsx`、新增 `pages/OrgChart.tsx``backend/prisma/schema.prisma``backend/src/services/approval.service.ts`
---
## 七、全域问题(问题 1、30、31)
### 问题 1"劳动合同"调整为更宽泛的"用工关系"
- **现状**:系统多处文案使用"劳动合同"(合同管理、离职管理、WorkProcess 等)。
- **修复方向**
1. 全域文案审计:将面向用户的"劳动合同"在合适场景改为"用工关系"或"用工协议"(涵盖劳动合同/劳务协议/实习协议/灵活用工协议)。
2. 数据层 `Contract` 模型保持不变,新增 `contractCategory` 字段区分劳动关系类型。
3. 注意法律文书模板中的"劳动合同"为法定术语,不可改。
- **优先级**P2 中
- **涉及文件**`SidebarNav.tsx``Contracts.tsx``WorkProcess.tsx``Termination.tsx` 等文案
### 问题 30:全域保存草稿后部分录入数据未保存(BUG)
- **现状**:多个流程页面支持"保存草稿",但部分字段(如 `compAdjustments``handoverItems` 备注、`checklistOverrides`)未持久化。
- **修复方向**
1. 排查各流程 `saveDraft` 的 payload,确保覆盖所有前端 state。
2. 后端 `draft` 表 schema 检查是否有字段缺失(`compensationBreakdown.adjustments``handoverItems.remark` 等)。
3. 增加"草稿完整性校验":保存后立即回读对比,缺失字段告警。
4. 重点排查:Termination(补偿金调整/交接备注)、WorkProcess(自定义字段)。
- **优先级**P0 紧急
- **涉及文件**`Termination.tsx``handleSaveDraft`)、`WorkProcess.tsx``backend/src/services/termination.service.ts``backend/src/services/work-process.service.ts`
### 问题 31:单立户客服端
#### 已实现部分(平台管理端,代码完整可运行)
系统已有完整的"平台管理端"(Platform),前后端代码均已实现:
**前端(4 页面 + 1 侧边栏)**
- `frontend/src/pages/platform/PlatformLogin.tsx` — 独立登录页
- `frontend/src/pages/platform/PlatformDashboard.tsx` — 数据总览(企业数/用户数/员工数/合同数/工资条数 + 套餐分布 + 最近注册企业)
- `frontend/src/pages/platform/PlatformOrgs.tsx` — 企业租户管理(创建/搜索/编辑套餐/删除/管理员账号管理)
- `frontend/src/pages/platform/PlatformUsers.tsx` — 用户管理(启用/禁用)
- `frontend/src/components/layout/PlatformSidebar.tsx` — 独立侧边栏(带 ADMIN 徽章)
- `frontend/src/lib/api-services.ts:938-965``platformApi` 完整定义
- `frontend/src/App.tsx:217-220` — 四条路由注册 + `PlatformRoute` 角色校验(`SUPER_ADMIN`
**后端(1 路由文件 437 行 + 1 schema**
- `backend/src/routes/platform.routes.ts` — 完整实现 11 个接口:
- `GET /platform/dashboard` — 平台总览数据
- `GET /platform/orgs` — 企业列表(分页+搜索+套餐筛选)
- `POST /platform/orgs` — 创建企业(含管理员账号自动创建)
- `GET /platform/orgs/:id` — 企业详情(含用户列表)
- `PUT /platform/orgs/:id` — 编辑企业(套餐/上限/联系人)
- `PUT /platform/orgs/:id/admin` — 编辑企业管理员(姓名/手机号/重置密码)
- `DELETE /platform/orgs/:id` — 删除企业(级联)
- `GET /platform/users` — 全平台用户列表
- `PUT /platform/users/:id/toggle` — 启用/禁用用户
- `GET /platform/admins` — 平台管理员列表
- `POST /platform/admins` — 创建平台管理员
- `backend/src/schemas/platform.schema.ts` — 入参校验
- `backend/src/middleware/auth.ts``platformAdminMiddleware` 权限校验
**数据模型**
- `Organization` 模型支持多租户(`plan`/`maxEmployees`/`city`/`contactName`/`contactPhone`
- `User.role``SUPER_ADMIN` 角色,`orgId` 为 null(平台管理员不归属任何租户)
- `backend/prisma/seed-multi-org.ts` — 多租户种子数据
**结论**:单立户服务(开户+租户管理+用户管理+数据总览)**已完整实现**,CSV 标注为"调整"类型也印证了该功能已存在。
#### 可增强部分(客服工作台,尚未实现)
当前平台管理端是"运营管理后台",定位为超级管理员/运营使用。如需扩展为客服人员日常服务客户的工作台,以下功能尚未实现:
| 增强项 | 现状 | 说明 |
|--------|------|------|
| 工单管理 | 缺失 | 无 `Ticket` 模型、无工单页面,客服无法接收/分派/跟进客户问题 |
| 客户会话 | 缺失 | 无会话模块,客服无法与客户企业管理员实时沟通或留言 |
| 租户数据穿透 | 缺失 | `SUPER_ADMIN` 仅能看租户列表和统计,无法穿透查看指定租户的花名册/合同/薪税/风险等业务数据 |
| 协助操作 | 部分已有 | 管理员重置密码已有,代客户发起流程/调整套餐等未实现 |
| AI 辅助 | 缺失 | 当前 AI 仅在企业端,客服侧无 AI 问答辅助 |
| 操作日志 | 缺失 | 当前 `AuditLog` 仅在企业端,客服操作无留痕 |
**增强修复方向(如需)**
1. 新增角色 `SUPPORT`(客服),独立路由 `/support/*`,独立登录页 `/support/login`
2. 客服端侧边栏含:工单中心、客户会话、租户数据查看、协助操作、AI 辅助、操作日志。
3. 数据模型新增:`Ticket`(工单:标题/内容/状态/优先级/归属租户/处理人)、`TicketMessage`(工单回复)、`ChatSession`(客户会话)。
4. 租户数据穿透:客服选择租户后,以"只读+代操作"模式访问该租户的业务数据(复用现有 API,请求头带 `X-Support-Tenant-Id`,后端中间件切换租户上下文)。
5. AI 辅助复用现有 AI 接口,独立会话隔离。
6. MVP 建议:先做工单 + 租户数据查看 + AI 辅助三项。
- **优先级**:核心功能已完成;增强部分 P3 规划(新模块,建议单独排期)
- **涉及文件(增强部分)**:新增 `frontend/src/pages/support/*``frontend/src/components/layout/SupportSidebar.tsx``backend/prisma/schema.prisma`Ticket/ChatSession 模型)、`backend/src/routes/support.routes.ts``backend/src/middleware/support-tenant.ts`
---
## 优先级汇总
| 优先级 | 问题 | 说明 |
|--------|------|------|
| **P0 紧急** | 7、10、11、13、28、30 | 数据丢失/业务正确性/合规风险 |
| **P1 高** | 2、3、5、6、8、9、12、15、16、18、19、22、23、29 | 流程阻塞或合规校验缺失 |
| **P2 中** | 1、4、14、17、20、21、24、25、26 | 体验优化/功能增强 |
| **P3 规划** | 27、31增强 | 新模块(组织架构+审批流 / 客服工作台增强),需单独排期 |
| **已完成** | 31核心 | 单立户服务(平台管理端)已完整实现,前后端代码可运行 |
---
## 建议执行顺序
1. **第一批(P0,立即)**:问题 30(草稿丢失)→ 问题 7(补偿金合计)→ 问题 10(驳回未更新)→ 问题 11(违法解除风险)→ 问题 13(合同日期校验)→ 问题 28(补偿金批次数据)
2. **第二批(P1,本迭代)**:离职管理联动(2/3/5/6/8/9)→ 花名册校验(15/16)→ 用工办理入口下沉(18/19/22/23)→ 特殊员工性别校验(29)
3. **第三批(P2,排期)**:花名册批量操作(24/25)→ 文案统一(1/14)→ 入口下沉收尾(20/21/26)→ 年假折算(4)→ 手机号查重(17)
4. **第四批(P3,规划)**:组织架构与审批流(27)→ 客服工作台增强(31增强,MVP = 工单 + 租户数据查看 + AI 辅助)
- 问题 31 核心功能(单立户服务/平台管理端)已完整实现,无需开发
---
## 备注
- 本清单基于当期代码梳理,部分"根因"为基于代码静态分析的推断,实际修复前需运行复现确认。
- 涉及数据库 schema 变更的(问题 2/27/31),需走 migration + 回滚方案,符合数据 8 铁律。
- 涉及文案全域替换的(问题 1/14),需同步更新 HelpModal、OnboardingGuide 等帮助文案。
- 问题 26(去掉用工办理模块)依赖问题 18/20/21/22/23 完成,不可先行移除。