Commit Graph

225 Commits

Author SHA1 Message Date
freedakgmail 81e136b707 fix: 批次表格锁定列偏移量修正 - table-layout:fixed 确保列宽精确
- 使用 table-layout: fixed 防止列宽被内容压缩
- 动态计算表格总宽: 固定列宽 + 动态列数×90 + 右侧锁定列总宽
- 右侧锁定列偏移量从常量计算,不再硬编码
- 操作列宽度调整为60px,确保移除按钮可见
2026-08-19 10:14:44 +08:00
selfrelease 41be262dee feat: 社保配置回退SocialYearStandard、月度办理tab切换、员工参保筛选分页
- 后端:dotenv/config 加载 ENCRYPTION_KEY,修复薪资数据解密
- 后端:社保/公积金 calculate API 回退到 SocialYearStandard(通过默认账户)
- 后端:getSocialConfigByMonth/getHousingConfigByMonth 回退到 SocialYearStandard
- 后端:active-declaration 查询条件改为 lte,当月办理的增员也显示在在保列表
- 后端:employee-enrollment API 增加部门/参保状态筛选和分页
- 后端:updateEmployeeSchema 增加 baseSalary/performanceSalary 字段
- 后端:payroll2.routes 批次详情包含 contracts 合同类型
- 前端:月度办理社保/公积金改为 tab 切换(不再同时展开)
- 前端:员工参保列表增加筛选(部门/社保状态/公积金状态)和分页
- 前端:花名册基本信息增加月度工资只读显示(基本+绩效自动计算)
- 前端:薪资批次详情表增加合同类型列

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-19 10:13:49 +08:00
freedakgmail 20f920686e feat: 发薪批次表格动态化 - 根据薪酬模板动态生成列
- schema: BatchEntry 增加 extraItems Json 字段存储自定义模板项
- calcBatchEntry: 新增 extraItems 参数,合并自定义 INPUT 项取值
- 后端编辑接口: 动态校验自定义字段,预置字段走固定列,自定义走 extraItems
- 所有 calcBatchEntry 调用处传入并写回 extraItems
- 前端表头/单元格从 templateItems 动态生成,排除 netPay 重复列
- 前端 saveEdit 动态化: 预置字段走固定列,自定义字段走 extraItems
- renderCell 支持从 extraItems 取值
- 表格列左右锁定: 员工/合同类型左锁,实发/递延/风险/操作右锁
- 合理列宽 + 横向滚动 + hover 效果
2026-08-19 09:15:54 +08:00
freedakgmail 64ae633857 feat: P4 dataSource 字段 + overtimePay 修复 + 获取按钮动态化
- schema: PayslipItem 增加 dataSource 字段标记数据来源
- DEFAULT_ITEMS: overtimePay 从 CALCULATED 改为 INPUT(修复被重算覆盖为0的bug)
- DEFAULT_ITEMS: performanceSalary/bonus/deduction 标记 dataSource
- 迁移逻辑: 已有组织自动补充 dataSource + 修正 overtimePay 类型
- 后端模板 CRUD 支持 dataSource 字段
- 前端模板编辑器增加数据来源下拉选择
- 前端模板表格增加数据来源列
- 前端批次详情'获取'按钮根据模板 dataSource 动态显示
2026-08-19 08:57:19 +08:00
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
freedakgmail 1c5fde0b03 fix: 组织架构部门下拉改为花名册相同的树形缩进模式
- 使用 buildDeptOptions 递归构建树形选项
- 用全角空格 ' '.repeat(level) 实现层级缩进
- 与花名册员工详情编辑的部门下拉保持一致
2026-08-18 22:14:17 +08:00
freedakgmail 04f119a53a fix: 组织架构部门下拉显示层级路径
- 部门编辑弹窗上级部门下拉显示完整路径如 总公司 / 技术部 / 前端组
- 岗位编辑弹窗所属部门下拉同样显示层级路径
- 下拉选项按路径名排序
2026-08-18 22:08:29 +08:00
freedakgmail a7df4fedfc ui: 优化特殊状态台账页面UI
- 统计卡片:添加图标、圆角xl、左图标右数据布局
- 列表卡片:类型图标背景色、hover显示操作按钮、分隔线分区
- 日期字段:改用Field组件双列网格布局,关键日期accent高亮
- 提醒区域:圆点指示器+过期动画pulse+今天到期文案
- 员工信息:独立分区带底部分隔线
2026-08-18 21:50:55 +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
selfrelease 1feada76d1 feat: 节假日配置、排班管理独立页面、考勤加班显示优化
- 新增 HolidayConfig 模型,支持法定节假日和调休工作日配置
- 加班费同步逻辑改用 HolidayConfig 判断日期类型
- 员工端考勤显示加班工时、费率和日期类型
- 周末/节假日出勤状态显示为"周末出勤"/"节假日出勤"
- 新增 Employee.defaultShiftId 字段,支持长期排班(工作日班次)
- 排班管理拆分为独立页面(班次管理+排班),考勤管理保留出勤相关功能
- 排班和每日出勤页面增加身份证号列
- 修复岗位和部门编辑失败问题(POST 改 PUT)
- 新增 backfill 脚本:合同薪资回填、默认班次回填

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

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-08-18 11:00:53 +08:00
freedakgmail eb91c2d8fb fix: 统一风险中心及全应用身份证号显示
后端:
- employee.routes.ts: all-lite 接口加上 idCardNumber 并解密
- special-status.routes.ts: 列表和详情查询加上 idCardNumber 并解密
- esign.routes.ts: 列表/pending/detail/remind 接口加上 idCardNumber 并解密
- risk.service.ts: getMonthlyCalendar 所有事件加上 employeeIdCardNumber
- termination.service.ts: batchTerminatePreview 加上 employeeIdCardNumber
- employee.routes.ts: preview-renew 加上 employeeIdCardNumber

前端:
- Roster.tsx: 批量续签/解聘预检结果加上身份证号
- SpecialStatus.tsx: 列表/下拉/删除确认加上身份证号
- Calendar.tsx: 日历事件姓名后显示身份证号
- ESign.tsx: 签署列表/详情/员工列表/提醒弹窗/下拉加上身份证号
- CommercialInsuranceTab.tsx: 参保选择列表加上身份证号
- OvertimeTab.tsx: 导入预览加上身份证号
2026-08-18 08:14:26 +08:00
freedakgmail 4d78eac5c2 fix: 提成奖金、证据链条、风险中心姓名显示身份证号
后端:
- commission-bonus.service.ts: listByMonth 查询加上 idCardNumber 并解密
- evidence.service.ts: getEvidenceList 加上 idCardNumber 并解密返回 employeeIdCardNumber
- roster.routes.ts: 证据链接口返回 employee.idCardNumber,Excel 导出加上身份证号

前端:
- CommissionBonus.tsx: 列表姓名下显示身份证号,下拉选项和编辑弹窗也加上
- EvidenceChain.tsx: 两处姓名显示加上身份证号,文本导出加上身份证号
- Evidence.tsx: 证据链列表页姓名后显示身份证号
2026-08-18 08:03:09 +08:00
freedakgmail 5db53ed591 fix: 员工端身份证号显示兼容旧登录——从 home/overview 获取 fallback
- EmployeeHome.tsx: 使用 overview.employeeIdCardNumber 作为 fallback
- PortalLayout.tsx: 获取 overview 数据作为 idCardNumber fallback
- 两者都会在获取到后同步更新 localStorage,避免重复请求
2026-08-18 07:57:54 +08:00
freedakgmail 754dfd3116 fix: 员工端姓名显示处加上身份证号
后端:
- portal.routes.ts: 密码登录/验证码登录/自动登录返回 idCardNumber
- portal.routes.ts: home/overview 返回 employeeIdCardNumber
- portal.routes.ts: 合同确认接口返回 employeeIdCardNumber

前端:
- EmployeeHome.tsx: 首页欢迎卡片显示身份证号
- PortalLayout.tsx: 顶栏姓名后显示身份证号
- Payslip.tsx: 下载文件名加上身份证号
- ContractConfirm.tsx: 合同确认页显示身份证号
2026-08-18 07:52:52 +08:00
freedakgmail 5c016914dd fix: 非列表页面姓名显示处也加上身份证号
后端:
- employee.routes.ts: checkPhone 返回 idCardNumber
- risk.service.ts: 风险项查询加上 idCardNumber 并解密
- dashboard.routes.ts: 风险中心返回 employeeIdCardNumber

前端:
- Termination.tsx: 离职管理所有姓名显示处加上身份证号(员工概况、通知书、PDF导出、下拉选项)
- Roster.tsx: 弹窗标题加上身份证号,signChoice 传递 idCardNumber
- SignMethodChoice.tsx: 签署方式弹窗显示身份证号
- Contracts.tsx: 手机查重提示加上身份证号
- RiskCenter.tsx: 风险卡片员工姓名后显示身份证号
2026-08-18 07:46:43 +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
freedakgmail ef03b2e5f8 fix: 全部员工显示改为姓名+完整身份证号,不再脱敏
- 花名册列表显示完整身份证号
- 社保公积金月度办理列表姓名下显示身份证号
- 员工详情页显示完整身份证号
- 商业保险列表显示完整身份证号
- 后端去掉 idCardMasked 脱敏逻辑
2026-08-18 07:33:54 +08:00
freedakgmail 2ab9e87e6f ui: 合计与起止年月列分开,公积金配置显示基数范围 2026-08-18 07:28:38 +08:00
freedakgmail 95b2929768 ui: 公积金配置版本显示基数范围 2026-08-18 07:27:47 +08:00
freedakgmail b8e2ebe5ee ui: 月度办理社保公积金区域改为可折叠卡片,添加统计摘要 2026-08-18 07:25:13 +08:00
freedakgmail 3ed22668f1 ui: 公积金参数也改为分组卡片式布局 2026-08-17 22:04:41 +08:00
freedakgmail 5e4b0b3fa9 ui: 社保参数改为分组卡片式布局,更清晰专业 2026-08-17 22:01:03 +08:00
freedakgmail f9ed465c09 ui: 最低工资保存按钮横置紧凑显示 2026-08-17 21:52:04 +08:00
freedakgmail 0f11dbb8c4 ui: 合并最低工资标准显示和编辑,去掉重复的只读行 2026-08-17 21:49:51 +08:00
freedakgmail 9e54a34dd6 feat: 社保/公积金缴纳截止日改为按账户配置
- SocialAccount 模型增加 paymentDay 字段
- detectMonthlyTasks 社保/公积金改为按账户 paymentDay 生成提醒
- 账户表单增加缴纳截止日输入
- 设置页面移除社保/公积金缴纳日,保留发薪日和个税日
2026-08-17 21:42:17 +08:00
freedakgmail 743c7616da fix: 移除工作台风险分布饼图区域,简化页面布局 2026-08-17 21:32:51 +08:00
freedakgmail 802604c9e5 fix: 合同类型显示中文,补充劳务协议/实习/兼职/外包映射 2026-08-17 21:09:14 +08:00
freedakgmail 04620e19e8 fix: 添加 lossReason 类型定义 2026-08-17 20:58:53 +08:00
freedakgmail 03e9e83483 feat: 待办事项显示损失金额理由
后端 estimateRiskCost 返回 lossReason 字段,说明法律依据和计算方式
前端在损失金额下方显示理由,如'逾期缴纳社保/公积金将产生滞纳金,每日万分之五'
2026-08-17 20:57:45 +08:00
freedakgmail a1a0b22e95 fix: 总分说明移到评分图下方显示 2026-08-17 20:51:19 +08:00
freedakgmail 2407b9cc7b fix: 侧边栏公司名居中排列 2026-08-17 20:33:51 +08:00
freedakgmail a1424a42d6 feat: 待签合同移到首页分组 2026-08-17 20:31:39 +08:00
freedakgmail 152b0b5024 fix: 后端对非劳动合同类型 socialInsBase/housingFundBase 返回 null
不再在数据源头返回社保基数和公积金基数,而非前端隐藏
2026-08-17 20:27:19 +08:00
freedakgmail f242a592bb fix: 花名册社保基数列对非劳动合同类型显示— 2026-08-17 20:26:32 +08:00
freedakgmail 2154247b23 fix: 花名册副标题不折行 2026-08-17 20:18:09 +08:00
freedakgmail ec89b6b1b7 fix: 花名册入职日期和手机号字号统一为text-xs 2026-08-17 20:16:02 +08:00
freedakgmail 5e03b8b60f fix: 花名册操作按钮缩小(图标 h-3.5 + padding p-1) 2026-08-17 20:13:06 +08:00
freedakgmail 226c4f1444 fix: 花名册状态列在职/试用期分两行显示 2026-08-17 20:10:53 +08:00
freedakgmail 95567c9cc4 fix: 隐藏侧边栏菜单滚动条
- tailwind.config 添加 scrollbar-hide 工具类插件
- SidebarNav nav 元素添加 scrollbar-hide class
2026-08-17 20:02:48 +08:00
freedakgmail eaa7ec5518 feat: 管理端侧边栏底部显示安职通产品名 2026-08-17 19:35:19 +08:00
freedakgmail 79ddd2d358 fix: 删除基本信息中重复的社保公积金明细(硬编码通用比例)
保留薪税信息中按参保城市实际政策计算的社保费用明细
删除社保与公积金明细区块(硬编码8%/16%等通用比例,与薪税信息重复)
2026-08-17 19:31:02 +08:00
freedakgmail 007109e425 feat: 附件管理拆为独立tab + 员工端附件上传
管理端:
- 花名册详情新增「附件资料」独立tab(人事信息分组下)
- 从 BasicInfo 移除附件管理代码到独立 AttachmentsTab 组件
- shared.ts 添加 attachments tab 类型和计数映射

员工端:
- 后端新增 GET/POST/DELETE /portal/attachments 接口
- 前端 api-services 添加 portalDelete + 附件 API 方法
- MyProfile 新增附件资料卡片,支持上传/查看/删除附件
- 附件类型:身份证/银行卡/学历证书/职业资格证书/合同/照片/其他
2026-08-17 19:27:45 +08:00
freedakgmail 7b2f722984 fix: 员工端Header标题显示企业名称而非安职通Logo
- 后端3处登录接口(密码/验证码/auto-login)返回 orgName
- 前端 PortalLayout Header 改为显示 employee.orgName
- 移除 Logo 组件引用
2026-08-17 19:20:38 +08:00
freedakgmail 76a49985f1 fix: 专项附加扣除改为5项明细分类(子女教育、赡养老人、住房、继续教育、婴幼儿照护)
- 后端 GET /profile 返回最新月份的专项附加扣除明细记录
- 后端 PUT /profile 保存明细到 SpecialDeductionRecord 表(当前月份 upsert)
- 前端5项明细输入框 + 合计实时计算 + 备注字段
- 与管理端社保>专项附加扣除 Tab 数据结构一致
2026-08-17 19:16:26 +08:00
freedakgmail 88b0fcdc7d feat: 个人资料补充工号、女性岗位类型、专项附加扣除字段
- 后端 GET /profile 返回 employeeNo/femaleWorkerType/specialDeduction
- 后端 PUT /profile 支持更新 specialDeduction(员工自行填报)
- 前端只读区补充:工号、女性岗位类型(仅女性显示)
- 前端可编辑区补充:专项附加扣除(元/月)
2026-08-17 19:09:28 +08:00