Commit Graph

21 Commits

Author SHA1 Message Date
freedakgmail 60951e7fd6 feat: P2+P3 薪酬模板驱动计算 - SYSTEM注册表 + 前端动态化
P2: 社保/公积金/个税改为 SYSTEM 注册表驱动
- 新增 SystemCalcContext 和 systemCalculators 注册表
- ensureSocialHousingCalculated 缓存社保公积金计算
- calcTaxSystem 提取个税计算为系统函数
- calcBatchEntry 重构为模板拓扑排序调度

P3: 前端批次表格动态化 + 模板编辑器增强
- 后端模板 CRUD 支持 calcType/dependencies 字段
- TemplateTab 表格增加计算方式列
- TemplateTab 编辑表单增加 calcType 选择(公式/系统)
- BatchTab editableFields 从模板 isEditable 动态获取
2026-08-19 08:32:57 +08:00
freedakgmail 2f9fa8b5df fix: 5个获取操作 onSuccess 修复 res.data 多余层级
unwrap 已提取 data 字段,res 本身就是 { filled, message, ... }
之前 res.data?.filled 永远为 undefined,导致显示'无数据'
2026-08-19 08:08:12 +08:00
freedakgmail 8388672c40 feat: 批量获取操作跨批次重复检查 + 加班费改为获取 + 排除预入职
后端:
- 5个批量获取接口(加班费/绩效/奖金/违纪/考勤)加 force 参数
- 非force模式下检查同月其他批次是否已有非零值,有则返回 needConfirm
- 加班费接口改用 calcBatchEntry 重算(含税/社保),不再手动算 totalPay
- 批次创建用当前日期判断是否已入职,排除预入职人员

前端:
- 5个 mutation 支持 force 参数,needConfirm 时弹确认框
- 加班费按钮文字从'导入加班费'改为'获取加班费'
2026-08-19 08:04:37 +08:00
freedakgmail 13f21252d0 feat: 绩效工资两行显示+等级系数着色
后端: 批次详情接口附加 perfGrade/perfCoefficient 到每个 entry
前端: 绩效工资列改为两行显示,上行金额,下行等级·系数
- A级(1.2)绿色, C级(0.8)橙色, D级(0.6)红色, B级(1.0)默认色
- 数据从 batch detail 接口获取,刷新不丢失
2026-08-19 07:47:07 +08:00
freedakgmail a7f3d5f3b5 feat: 绩效工资改为手动获取+按考核系数着色
后端:
- 建立批次时绩效工资填0,不自动带出
- 获取绩效工资接口返回 details(grade/coefficient/performanceSalary)
- 无考核记录时系数为1.0(绩效工资=基数全额)

前端:
- 存储获取绩效工资返回的 details 到 perfDetails state
- 绩效工资列按系数着色:A级(1.2)绿色/C级(0.8)橙色/D级(0.6)红色
- B级(1.0)和无考核正常色,0值灰色
- hover显示考核等级和系数
2026-08-19 07:36:22 +08:00
freedakgmail aa39b37f7b feat: 薪税管理批次表格增加绩效工资列
前端 BatchTab.tsx:
- 表头增加绩效工资列
- 表体渲染 performanceSalary 单元格
- 绩效工资加入可编辑字段列表

后端 payroll2.routes.ts:
- updateEntrySchema 增加 performanceSalary 字段
- 更新 entry 时接受前端传来的 performanceSalary 值
2026-08-19 07:24:09 +08:00
selfrelease 9ac07eba0f fix: 薪资批次排除预入职员工(hireDate > 批次月末)
原查询只过滤status=ACTIVE,预入职员工status也是ACTIVE会被错误纳入。
增加hireDate <= monthEnd条件,确保只拉入已入职员工。

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-18 14:15:38 +08:00
freedakgmail a58cc3f6f9 fix: 绩效/培训/违纪/工资条/加班/休假/专项扣除/薪酬批次列表姓名下显示完整身份证号
后端:
- roster.routes.ts: 绩效/培训/违纪列表查询加上 idCardNumber 并解密
- payroll.routes.ts: 加班/工资条查询加上 idCardNumber 并解密
- payroll2.routes.ts: 薪酬批次详情加上 idCardNumber 并解密
- leave.routes.ts: 休假审批列表加上 idCardNumber 并解密
- social.routes.ts: 专项附加扣除查询加上 idCardNumber 并解密

前端:
- PerformanceRecords.tsx: 姓名下显示身份证号
- TrainingRecords.tsx: 姓名下显示身份证号
- DisciplinaryRecords.tsx: 姓名下显示身份证号
- PayslipTab.tsx: 姓名下显示身份证号
- OvertimeTab.tsx: 姓名下显示身份证号
- LeaveApproval.tsx: 姓名下显示身份证号
- SpecialDeductionTab.tsx: 姓名下显示身份证号
- BatchTab.tsx: 姓名下显示身份证号
2026-08-18 07:42:24 +08:00
selfrelease aea88fd385 feat: 工作台合规评分优化、面包屑补全、花名册斑马纹
- 合规评分维度拆分:薪酬社保拆为薪酬工资+社保公积金两个独立维度
- 合同管理评分纳入待签署合同(signDate为null)扣分
- 维度评分hover显示得分依据findings和建议recommendations
- 概览统计卡片支持点击跳转(在管员工/高风险/待办/工资条)
- 面包屑补全10个缺失路由,统一分组名与侧边栏一致
- 移除子Tab中重复的PageGuide组件
- 花名册列表添加斑马纹隔行变色
- 薪酬结构模版表格列宽优化,计算公式列截断+title显示

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-17 17:33:48 +08:00
selfrelease 5196d7c80a fix: portal端token过期后自动跳转登录页,避免显示空数据
- portalAxios 401 响应拦截器:清除 token 并跳转 /portal/login
- PortalLayoutWrapper:检查 token 是否存在,不存在则跳转登录页
- 排除 /portal/login 和 /portal/auto-login 页面避免重复跳转

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-17 15:06:46 +08:00
selfrelease c5f4731d5c fix: 创建批次后自动切换列表筛选到批次所属月
问题:批次列表默认按当前月筛选,创建其他月份的批次后列表
不显示新批次,用户以为创建失败。

修复:创建成功后自动将列表月份筛选切换到批次所属月。

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-17 06:46:19 +08:00
selfrelease de4f8c90fb feat: 最低工资保护按当月累计判断 + 预入职员工 + 发薪年月
1. 最低工资保护:第二批次递延时判断当月累计实发(已归档批次
   netPay 之和 + 本批次 netPay)是否低于 minWage,仅累计低于
   时才触发递延补齐,补齐目标 = minWage - 已归档累计实发

2. 预入职员工:EmployeeStatus 新增 PRE_ONBOARD 状态
   - 新增员工表单加"入职状态"选择器(正式入职/预入职)
   - 薪资批次创建排除 PRE_ONBOARD 员工
   - 花名册支持按预入职状态过滤
   - 新增 POST /:id/activate API 转正式

3. 发薪年月:PayrollBatch 新增 payMonth 字段
   - 所属月(计薪月)决定社保标准、个税累计
   - 发薪年月=实际发放月份(如十一提前发薪:所属月=10月,发薪月=9月)
   - 创建批次表单加所属月和发薪年月输入
   - 批次列表显示所属月/发薪月

4. blank_employees 模式不再自动带出基本工资

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 15:06:58 +08:00
selfrelease 8391c123fc refactor: 社保公积金Tab重构为账户卡片列表+展开年度标准管理
1. 社保/公积金Tab从"选账户→展示配置"改为"账户卡片列表+展开管理"
2. 每个账户卡片可展开显示:当前标准/最低工资编辑/新建年度标准/版本历史/调基/试算
3. 账户新建/编辑/删除/设默认从设置页面迁移到社保公积金菜单
4. 设置页面去掉"社保公积金账户"Tab
5. "新建版本"改名为"新建年度标准"
6. 新增AccountCard组件独立管理每个账户的展开状态和数据查询

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 15:05:06 +08:00
selfrelease 63a0a6934b fix: 优化最低工资保护tooltip文案,明确免扣社保/公积金与额外补齐的区分
minWageApplied 包含免扣社保+免扣公积金+额外补齐三部分,
原tooltip统称"补齐"容易误解为额外补了这么多现金。
改为分项显示:免扣社保 ¥X + 免扣公积金 ¥Y + 额外补齐 ¥Z

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 14:35:25 +08:00
selfrelease 904c9c6369 feat: 薪资表格增加最低工资保护和递延扣款的可视化提示
1. 实发列:最低工资保护触发时显示橙色 + ★标记 + tooltip
2. 新增「递延扣款」列:显示递延金额(橙色)或补扣金额(蓝色)
3. 风险列:最低工资保护触发时显示橙色警告图标 + tooltip
4. 工作流步骤从4步改为3步(编辑薪资→归档锁定→发布工资条)

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 14:30:08 +08:00
selfrelease ea2dfe3b4b feat: 最低工资保护 + 社保/最低工资递延补扣机制
新增功能:
1. SocialYearStandard / SocialInsuranceConfig 增加 minWage 字段
2. BatchEntry 增加递延扣款字段(deferredSocialEmp/HousingEmp/MinWage)
3. calcBatchEntry 增加最低工资保护逻辑:
   - 实发 < 最低工资时,优先递延社保 → 递延公积金 → 递延最低工资补齐
   - 递延金额记录到 BatchEntry,次月创建批次时自动补扣
4. prePayrollCheck 增加最低工资检查(第 11/12 项)
5. 前端社保配置增加最低工资输入框
6. 前端 BatchTab 质量门禁增加最低工资/递延扣款提示

处理场景:
- 入职当月工资不足扣社保个人部分 → 递延到次月补扣
- 实发低于最低工资 → 补齐到最低工资,差额递延次月扣
- 次月创建批次时自动读取上月递延金额并补扣

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 14:15:39 +08:00
selfrelease 5a9d440339 fix: 线下签署登记标题英文转中文+完成时间时区+签署记录角标
1. documentTitle 中 contractType 枚举值转中文
   (LABOR→劳务协议、FIXED→固定期限劳动合同等)
2. 签署日期解析改为本地时区构造(new Date(y,m-1,d,12)),
   避免 new Date('2026-08-16') 被解析为 UTC 00:00 导致
   本地 +8 显示为 08:00:00
3. 签署记录 Tab 增加数字角标显示总记录数

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-16 12:26:13 +08:00
freedakgmail 86e5526a83 fix: 优化文档16项问题修复
- 问题1/3: 绩效考核/培训记录员工姓名可点击跳转员工详情页
- 问题2: 离职证明模板支持自定义+员工端下载
- 问题4(P0): 修复工资填写后数据归零问题
- 问题5: 社保添加员工参保信息列表
- 问题6(P0): 商业保险支持为员工参保
- 问题7(P0): 员工福利支持为员工添加福利
- 问题8: 规章制度支持导入Word文档
- 问题9: 文本模板下载Word增加HTML格式
- 问题10: 模板下载变量替换修复(排除token参数)
- 问题11(P0): 电子签署发起时员工下拉框有选项
- 问题12: 新增绩效记录添加考评人选项
- 问题13: 违纪记录添加处罚执行细节
- 问题14: 特殊员工列表添加查看详情按钮和姓名链接
- 问题15: 员工福利汇总正确显示参保人员
- 问题16(P0): 证据链验证修复(递归排序key+自动修复历史哈希)
2026-08-11 22:02:19 +08:00
freedakgmail c355a7d208 feat: 20260805 系统优化 - 身份证复制fallback/薪税日期筛选/社保版本修复/证据链导出/违纪证明/医疗期政策/绩效类型评级/合同作废/帮助更新 2026-08-05 20:26:16 +08:00
freedakgmail 5604d02de9 feat: 完成23项系统优化 - 花名册社保状态列/身份证复制/附件类型扩展, 用工办理姓名检索/直接提交/文书查看/批量证明, 风险中心跳转筛选+批量处理, 日历7/15/35天分组+逾期统计, 考勤单条编辑+按人导出, 工资条查看状态+工资流水导出, 辞职申请附件上传, 交接清单PDF下载, 操作完成下一步引导, 休假审批入口, 人效成本分部门 2026-08-04 22:55:03 +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