freedakgmail
|
e02e3dcd81
|
fix: 新增后端 /api/v1/salary/dashboard 路由
- 创建 salary.routes.ts,提供薪酬分析数据
- 基于 Payslip 模型计算部门对比、月度趋势、同比环比
- 在 app.ts 中挂载 /api/v1/salary 路由
|
2026-08-04 07:58:21 +08:00 |
|
freedakgmail
|
2968484d2d
|
优化: 大文件拆分+代码分割+按需加载+console清理+any类型替换
- Money.tsx (2260行→54行): 拆分为 money/ 子目录4个组件, React.lazy二级分割
- AIAssistant.tsx (2038行→63行): 拆分为 ai-assistant/ 子目录6个组件, React.lazy二级分割
- xlsx改为动态导入, OvertimeTab从345KB降至12.7KB
- api-services.ts: 请求参数 any→Record<string,unknown>
- 移除前端3处console.log残留
- 后端console替换为pino logger
- 前后端未使用import/变量清理
- Zod schema验证: termination/platform/special-status/work-process
- 新增 leave.routes.ts, acceptance-test.routes.ts
- UI组件: PageGuide, QueryError, Stepper
|
2026-08-04 07:53:37 +08:00 |
|
selfrelease
|
1da385cd5d
|
docs: 新增第十一届人力资源服务创新创业大赛参赛商业计划书
|
2026-08-03 15:45:40 +08:00 |
|
selfrelease
|
68ebe6a4ff
|
feat: 新增验收测试清单(199项24域)替代功能调查问卷; 修复工作台评分环文字重叠
- 新增 acceptance-test.html 交互式验收测试页面(验收人姓名/自动补全/自动统计/CSV+Excel下载)
- 新增 AcceptanceTestModal 组件, TopNav 中用验收测试弹窗替代 SurveyModal
- Settings 页问卷导出替换为验收测试结果导出(支持多验收人汇总MD)
- 修复 Dashboard 合规健康度评分环文字重叠: 圆环增大至w-32, 加overflow-hidden+truncate
|
2026-08-02 09:22:51 +08:00 |
|
selfrelease
|
787897e6d3
|
fix: 修复员工端离职申请创建时缺少checklist和type字段导致内部错误; 新增E2E测试场景文档
|
2026-08-01 19:05:20 +08:00 |
|
selfrelease
|
b0942f3e61
|
fix: Dashboard complianceScore 字段名不匹配及缺少可选链保护
- complianceScore.overallScore → fallback to totalScore
- complianceScore.levelLabel → fallback to summary
- complianceScore.suggestions 加可选链守卫
- data.todos 加可选链守卫
- data.topRisks 加空数组兜底
|
2026-08-01 16:27:03 +08:00 |
|
selfrelease
|
a252d72e68
|
refactor: 消除所有 api-services-raw 残留调用,API 口径完全统一
- dashboardApi 新增 resolveTodo/ignoreTodo/batchResolveTodos/batchIgnoreTodos
- notificationsApi 新增 checkContracts/test
- settingsApi 新增 confirmRetirementPolicy
- socialInsuranceApi 新增 monthlyChanges/housingMonthlyChanges/housingActiveDeclaration
- Dashboard.tsx 替换 4 处 apiPatch
- Settings.tsx 替换 4 处 apiPost
- Notifications.tsx 替换 1 处 apiPost
- SocialInsurance.tsx 替换 4 处 apiGet
- AIAssistant.tsx 移除未使用的 apiPost 导入
- 所有页面零 api-services-raw 依赖
|
2026-08-01 16:20:28 +08:00 |
|
selfrelease
|
16f22e6622
|
refactor: 全量迁移前端 API 调用到统一 api-services 服务层
- 新建 api-services-raw.ts 导出原始 axios 方法供特殊端点使用
- 完成 api-services.ts 全领域覆盖(auth/employee/roster/dashboard/attendance/payroll/socialInsurance/commercialInsurance/termination/policies/evidence/audit/calendar/companyFiles/notifications/settings/ai/platform/portal/survey/search)
- 迁移所有 47+ 页面文件:pages/、pages/roster/、pages/portal/、pages/platform/、pages/auth/、pages/dashboard/、pages/compliance/
- 移除所有直接 import api from '../../lib/api' 引用
- 修复 Termination.tsx / WorkProcess.tsx 中 string|null 类型错误
- 修复 SocialInsurance.tsx 中 api-services-raw delete 导入名
- 修复 PlatformLogin.tsx 变量遮蔽问题
- tsc --noEmit 零错误,vite build 成功
|
2026-08-01 16:13:19 +08:00 |
|
selfrelease
|
fb924dea98
|
refactor: API口径统一 — 统计函数/员工列表/前端服务层
后端:
- /dashboard/compliance-score 改用 getHealthCheck,与体检诊断同口径
- 新增 /employees/list 端点(不分页,供各页面下拉选择)
- /employees/all-lite 增加 position 字段和 status 筛选参数
- getHealthCheck 未签合同改为查无合同记录的员工(非UNSIGNED类型)
前端:
- 新建 lib/api-services.ts 统一 API 服务层
- employeeApi/rosterApi/dashboardApi/attendanceApi 统一封装
- 6个页面迁移到统一 API 调用:
- Attendance: employeeApi.list + rosterApi.departments
- Termination: rosterApi.list + rosterApi.departments
- Money: rosterApi.list + rosterApi.departments
- PortalQRModal: employeeApi.list
- AIAssistant: 3处 employeeApi.list 替代 /roster?pageSize=999
- Contracts: rosterApi.departments
- Dashboard: rosterApi.expiringContracts + dashboardApi.healthCheck/workforceStats
|
2026-08-01 15:29:13 +08:00 |
|
selfrelease
|
5dd92a0e20
|
fix: 合同管理未签合同统计修正
原查询查contractType=UNSIGNED的合同数(=0),但实际有12名员工完全无合同记录。
改为查contracts: { none: {} }的在职员工数,getHealthCheck和getComplianceScore均修复。
|
2026-08-01 15:14:11 +08:00 |
|
selfrelease
|
4d067e476e
|
fix: 用工体检诊断6维度改为与评分标准说明一致
原维度(合同管理/规章制度/社会保险/背景调查/工作时间/保密竞业)改为
标准维度(合同管理/薪酬社保/考勤加班/规章制度/解聘合规/证据链)
- 合同管理:未签合同+到期预警
- 薪酬社保:社保配置+公积金+工资条确认率+社保缴纳异常
- 考勤加班:加班超时+考勤记录完整性
- 规章制度:制度公示+民主程序
- 解聘合规:解聘流程完成率+合规检查清单
- 证据链:违纪/考勤/培训记录+制度+解聘+工资条覆盖度
|
2026-08-01 15:01:15 +08:00 |
|
selfrelease
|
c8d8e5c292
|
fix: 用工体检诊断数据修正
1. 合同管理:移除合同附件扣分(查所有历史合同导致624虚高,附件非合规问题)
2. 规章制度:democracyProgress是JSONB不能用lt查询,改用status!=PUBLISHED
3. 社保/公积金记录异常:按员工去重,避免一个员工多条记录被重复计数
4. getComplianceScore中同样的democracyProgress查询问题修复
|
2026-08-01 14:52:26 +08:00 |
|
selfrelease
|
6fc8fe6a42
|
fix: 合同管理诊断624份无附件数据错误
合同附件不是法律合规问题,且查询计入所有历史合同(含续签/变更)导致数量虚高。
移除附件扣分和findings,合同管理评分仅基于未签合同和到期合同。
|
2026-08-01 14:50:26 +08:00 |
|
selfrelease
|
aa9bd95d6c
|
fix: 用工体检诊断分数不合理
1. 合同管理:缺少附件扣分上限30分(每份2分),避免42份无附件直接扣到0分
2. 保密竞业:employeesWithNDA 改为按员工数(distinct employee)计算而非合同数,避免一个员工多份合同被重复计数
|
2026-08-01 14:46:34 +08:00 |
|
selfrelease
|
31a25a7320
|
fix: 花名册合同风险统计与风险中心不一致
花名册快捷筛选标签基于当前页数据统计,改为后端返回全局RiskItem统计
- 后端roster API返回globalRiskStats(expiring/expired/unsigned)
- 前端优先使用全局统计,fallback到当前页统计
|
2026-08-01 14:41:45 +08:00 |
|
selfrelease
|
e8690d4fbb
|
fix: 日历月份切换在UTC+8时区跳两个月
toISOString() 使用UTC时间,在UTC+8时区下 new Date(y,m-2,1) 会回退到前一天导致月份-1。
改用本地时间格式化函数 fmtMonth/fmtDate 替代所有 toISOString().slice() 调用。
|
2026-08-01 14:33:54 +08:00 |
|
selfrelease
|
8faf0d4365
|
fix: 工作台tab数量不一致(20≠15+4)
riskTodos 缺少 RETIREMENT 类型,导致退休风险待办不计入风险提醒tab
|
2026-08-01 14:29:20 +08:00 |
|
selfrelease
|
cb9209dbdd
|
fix: 风险中心与工作台数量不一致
风险中心改用 getDashboardData 的 todos 数据源(已按员工+类别去重),确保与工作台待办数量完全一致
|
2026-08-01 14:23:04 +08:00 |
|
selfrelease
|
6da7f2ca22
|
fix: 风险重复问题
1. runRiskDetection开头清理重复PENDING记录(同employeeId:type只保留最新)
2. onboardingRisks过滤掉已被contractRisks覆盖的员工,避免同一员工出现'未签合同'+'入职手续未完成'两条重复待办
|
2026-08-01 14:18:06 +08:00 |
|
selfrelease
|
4aa13d11c5
|
fix: 风险中心页面无数据
- 后端缺少 /compliance/risks 路由,新增 /dashboard/risks 端点返回PENDING风险项
- 前端API调用从 /compliance/risks 改为 /dashboard/risks
- RISK_TYPES 配置key从虚构子类型改为实际Prisma RiskType枚举值
- 风险列表字段映射修正: r.message→r.title, r.employeeName→r.employee.name
|
2026-08-01 14:14:47 +08:00 |
|
selfrelease
|
8892a244eb
|
fix: 任务中心待办事项查看全部跳转到风险中心
|
2026-08-01 13:58:48 +08:00 |
|
selfrelease
|
63c5a3b2e2
|
fix: 自动消除已解决的PENDING风险
问题:员工补签合同后,旧的未签合同/合同到期风险仍显示在待办中
原因:runRiskDetection只去重和更新,不会自动消除不再触发的风险
方案:检测后比较新风险key集合,PENDING但不再出现的自动标记RESOLVED
|
2026-08-01 13:55:17 +08:00 |
|
selfrelease
|
f1a02f0439
|
feat: TurboHR 14项优化与功能增强
- #1 Dashboard风险提醒增加立刻办理按钮
- #2 Calendar月份选择器改为input month
- #3 Termination增加7种解聘原因法律依据和操作步骤
- #5 合同审查支持PDF TXT格式
- #6 AI合同审查prompt优化为具体修改建议
- #7 知识库添加更新机制说明
- #9 SpecialStatus员工选择改用all-lite接口
- #10 Termination增加详细法律条款引用
- #11 Money发薪批次增加社保公积金合计列
- #12 EmployeeAttachment扩展文件类型
- #13 花名册增加女职工干部工人选项加退休提醒
- #14 新增公司备用文件上传模块
|
2026-08-01 13:47:49 +08:00 |
|
selfrelease
|
d9e2c610cf
|
fix: 待办时长格式统一 — 不足30天用天,超过30天用月+天
|
2026-08-01 08:24:06 +08:00 |
|
selfrelease
|
8e61c16f36
|
fix: 修复待办跳转定位错误员工 — 等待debouncedSearch匹配后才打开详情,避免旧数据误选
|
2026-08-01 08:19:30 +08:00 |
|
selfrelease
|
88e027bcda
|
fix: 待办跳转修复 — 1)actionUrl从/contracts改为/roster(无此路由) 2)Roster页面读取employee参数自动搜索并打开员工详情 3)更新数据库281条已有riskItem的actionUrl
|
2026-08-01 08:15:52 +08:00 |
|
selfrelease
|
d0c0be0984
|
fix: TaskCenter待办列表改用getDashboardData去重todos,与概览91一致(原211未去重)
|
2026-08-01 08:11:14 +08:00 |
|
selfrelease
|
d64f9c41a6
|
fix: 修复首页数据不一致 — 1)风险分布用去重数据 2)无工资数据时不估算社保 3)TaskCenter显示全部待办不再截取10条 4)修复dedupedTodos引用顺序
|
2026-08-01 07:53:30 +08:00 |
|
selfrelease
|
aef45c066e
|
fix: 修复首页问候语数字(211)与实际待办数(91)不一致 — 用去重后的 todos.length 替代未去重的 pendingRisks count
|
2026-08-01 07:23:25 +08:00 |
|
selfrelease
|
26147fa990
|
fix: 修复 portal 页面 top-level await 导致生产构建失败
|
2026-08-01 07:19:39 +08:00 |
|
selfrelease
|
6b0fee64d5
|
fix: 修复 ResignationApply records.some 错误 + prisma db push 同步 employeeNo/position/confirmedBy 字段
|
2026-08-01 07:02:44 +08:00 |
|
selfrelease
|
329ce9673d
|
docs: 更新 Sprint 2-5 完成状态,全部标记为已完成
|
2026-08-01 06:48:59 +08:00 |
|
selfrelease
|
a88c96299c
|
Sprint 4-5: 员工自助+考勤+合规+AI+搜索
|
2026-08-01 06:45:59 +08:00 |
|
selfrelease
|
9946197d20
|
Sprint 3: 员工目录优化 + Profile Shell + 离职工作流重构 + 合同类型扩充 + 月度社保重构 + 商险管理Tab
S3-1: Roster.tsx 添加 InlineAlert 合同风险提示 + 快捷筛选标签
S3-2: 新建 EmployeeProfileShell.tsx 统一员工详情布局,重构 EmployeeProfile.tsx
S3-3: Termination.tsx 集成 Stepper 步骤条 + InlineAlert 风险提示
S3-4: schema.prisma ContractType 枚举扩充 DISPATCH/OUTSOURCING/PARTTIME + 后端接口 + 前端选择器
S3-5: SocialInsurance.tsx 月度办理 Tab 使用 InlineAlert 替换原始提示
S3-6: SocialInsurance.tsx 新增商险管理 Tab(方案CRUD + 参保人员列表)
|
2026-07-31 18:07:49 +08:00 |
|
selfrelease
|
55b6867c9c
|
feat: Sprint 2 — Stepper/InlineAlert组件 + 首页TaskCenter任务中心 + /workspace/next-actions API + Money.tsx BatchDetail集成工作流步骤条和质量门禁
|
2026-07-31 17:52:02 +08:00 |
|
selfrelease
|
c181d3fa45
|
docs: 更新 Sprint 1 完成状态 + 变更文件清单 + Sprint 2-5 标记为待开始
|
2026-07-31 17:46:07 +08:00 |
|
selfrelease
|
e7dfe3c380
|
fix: 修复 Tailwind CSS border 类名冲突(border-border-default 改为直接颜色值)
|
2026-07-31 17:43:50 +08:00 |
|
selfrelease
|
821a62e3f8
|
feat: Sprint 1 — 设计Token系统 + 新导航5分组 + AppShell/PageHeader/FilterBar/DataTable组件 + 花名册导出扩充19字段 + 社保/公积金不缴纳选项 + 个税申报表导出 + 入离职/绩效统计看板
|
2026-07-31 17:40:49 +08:00 |
|
selfrelease
|
c15e11ec22
|
fix: 人力成本分析按员工去重,统一与Dashboard口径;环比/同比无数据时显示暂无数据
|
2026-07-31 14:24:37 +08:00 |
|
selfrelease
|
9df147ce59
|
fix: 年度价值报告待处理风险排除employeeId为null的未知员工
|
2026-07-31 11:44:37 +08:00 |
|
selfrelease
|
ebebe1814f
|
ui: 移除Dashboard紧急风险横幅和待处理风险快捷入口,tab已包含全部风险
|
2026-07-31 11:41:49 +08:00 |
|
selfrelease
|
3f580bdb3d
|
fix: todoCount和highRiskCount使用去重后的数据保持一致
|
2026-07-31 11:37:49 +08:00 |
|
selfrelease
|
c184670775
|
fix: 修复风险扫描去重key不匹配导致大量重复数据,Dashboard风险提醒按员工聚合
|
2026-07-31 11:26:03 +08:00 |
|
selfrelease
|
64f4f3e86a
|
feat: Dashboard工作台增加待处理风险快捷入口卡片
|
2026-07-31 11:10:59 +08:00 |
|
selfrelease
|
d4cc7e5e62
|
feat: 风险标题天数改为月数显示
|
2026-07-31 10:59:33 +08:00 |
|
selfrelease
|
6c008387ad
|
fix: 员工规避损失明细排除无关联员工的月度任务记录
|
2026-07-31 10:44:05 +08:00 |
|
selfrelease
|
abbba82f25
|
feat: 员工规避损失明细添加规避方式列
|
2026-07-31 10:41:22 +08:00 |
|
selfrelease
|
7d7f39fd30
|
fix: 待处理风险按风险类别去重,避免同一风险重复展示
|
2026-07-31 10:18:42 +08:00 |
|
selfrelease
|
8014c9a139
|
feat: 移除ROI,新增待处理风险列表
- 移除ROI横幅和说明,改为年度总价值概览
- 后端新增 pendingRisks 查询,返回PENDING状态风险
- 前端新增待处理风险表格,按员工去重展示
- summary 改为包含待处理风险数量
|
2026-07-31 10:04:04 +08:00 |
|
selfrelease
|
de73d20d68
|
fix: 年度价值报告只统计人工解决的风险,排除系统自动关闭
- 员工离职时系统自动将PENDING风险标记为RESOLVED(resolvedBy=null)
- 这些风险并未被真正解决,不应计入规避损失
- 年度报告所有RESOLVED查询加 resolvedBy: { not: null } 条件
- 只有用户在待办中点击完成的才算真正规避
|
2026-07-31 09:49:40 +08:00 |
|