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
|
8bcf1460cf
|
feat: P1 薪酬模板驱动计算 - 公式引擎 + totalPay/netPay 模板化
- 新增 formula-engine.ts: 公式解析、依赖提取、拓扑排序
- PayslipItem 增加 calcType(FORMULA/SYSTEM) 和 dependencies 字段
- DEFAULT_ITEMS 补充 calcType 和 dependencies
- ensureDefaultTemplate 增加已有组织新字段迁移逻辑
- calcBatchEntry: totalPay 从模板公式计算(回退硬编码)
- calcBatchEntry: netPay 从模板公式计算(回退硬编码)
|
2026-08-19 08:23:51 +08:00 |
|
freedakgmail
|
8388672c40
|
feat: 批量获取操作跨批次重复检查 + 加班费改为获取 + 排除预入职
后端:
- 5个批量获取接口(加班费/绩效/奖金/违纪/考勤)加 force 参数
- 非force模式下检查同月其他批次是否已有非零值,有则返回 needConfirm
- 加班费接口改用 calcBatchEntry 重算(含税/社保),不再手动算 totalPay
- 批次创建用当前日期判断是否已入职,排除预入职人员
前端:
- 5个 mutation 支持 force 参数,needConfirm 时弹确认框
- 加班费按钮文字从'导入加班费'改为'获取加班费'
|
2026-08-19 08:04:37 +08:00 |
|
freedakgmail
|
519d14d623
|
fix: blank_employees 模式不再自动带出基本工资等数据
根因:blank_employees 和 custom 模式共用同一分支,
导致空白员工模式也会自动填充 baseSalary
修复:将 blank_employees 模式单独处理,所有金额默认0
|
2026-08-19 07:50:31 +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
|
6e995cc281
|
fix: recalcEntry 排除 taxBreakdown 字段,该字段不在 BatchEntry 表中
|
2026-08-19 07:39:43 +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
|
c6fcfd36b8
|
fix: 批量获取绩效/奖金/扣款后重算应发和实发
根因:获取绩效工资/提成奖金/违纪扣款/考勤扣款等批量操作
只更新了单个字段(performanceSalary/bonus/deduction),没有重算
entry 的 totalPay/tax/netPay,导致应发合计不包含新增的绩效工资
修复:
- 新增 recalcEntry 辅助函数:更新字段后调用 calcBatchEntry 重算
- 新增 recalcBatchTotals 辅助函数:重算批次汇总
- 四个批量操作接口(获取绩效/奖金/违纪扣款/考勤扣款)都改为
更新后调用 recalcEntry + recalcBatchTotals
|
2026-08-19 07:29:10 +08:00 |
|
freedakgmail
|
aa39b37f7b
|
feat: 薪税管理批次表格增加绩效工资列
前端 BatchTab.tsx:
- 表头增加绩效工资列
- 表体渲染 performanceSalary 单元格
- 绩效工资加入可编辑字段列表
后端 payroll2.routes.ts:
- updateEntrySchema 增加 performanceSalary 字段
- 更新 entry 时接受前端传来的 performanceSalary 值
|
2026-08-19 07:24:09 +08:00 |
|
freedakgmail
|
1f90ac5021
|
fix: monthlySalary 始终由 baseSalary + performanceSalary 计算
- updateEmployeeSchema 加上 baseSalary/performanceSalary 字段(Zod strip 问题)
- updateEmployee: 只要传了 baseSalary 或 performanceSalary 就自动计算 monthlySalary
- 不再依赖前端传 monthlySalary,后端自动用 base + perf 计算总额
|
2026-08-19 07:19:37 +08:00 |
|
freedakgmail
|
8d7cc79620
|
fix: updateEmployeeSchema 缺少 baseSalary/performanceSalary 字段
根因:Zod schema 默认 strip 行为会过滤未定义字段,
导致前端传的 baseSalary 和 performanceSalary 被 schema.parse 删除,
后端 updateEmployee 函数收不到这两个值,无法保存工资结构。
|
2026-08-19 07:18:55 +08:00 |
|
freedakgmail
|
4906fc7397
|
fix: 月工资=基本+绩效 数据一致性
- contract.service.ts updateEmployee: 当同时传 baseSalary 和 performanceSalary 时,自动计算 monthlySalary = base + perf
- roster.routes.ts 调薪接口: 同样确保 monthlySalary = base + perf
- 修复前端编辑保存后月工资与基本+绩效不一致的问题
|
2026-08-19 07:13:32 +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
|
39fb4fc739
|
fix: 员工端姓名显示处加上身份证号 + 修复附件上传缺少 uploadedBy 字段
后端:
- portal.routes.ts: 密码登录/验证码登录/自动登录返回 idCardNumber
- portal.routes.ts: home/overview 返回 employeeIdCardNumber
- portal.routes.ts: 合同确认接口返回 employeeIdCardNumber
- portal.routes.ts: 附件上传加上 uploadedBy 字段修复 TS 错误
前端:
- EmployeeHome.tsx: 首页欢迎卡片显示身份证号
- PortalLayout.tsx: 顶栏姓名后显示身份证号
- Payslip.tsx: 下载文件名加上身份证号
- ContractConfirm.tsx: 合同确认页显示身份证号
|
2026-08-18 07:53:57 +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
|
66ae5ff21f
|
fix: 劳务/实习协议员工从根源不创建社保公积金记录
- 创建员工时劳务/实习协议跳过社保公积金记录创建
- 重新入职时同样判断合同类型
- 编辑员工时若最新合同为劳务/实习,强制基数为0并关闭在保记录
- 月度办理列表过滤劳务/实习协议员工
|
2026-08-18 07:20:58 +08:00 |
|
freedakgmail
|
c24cc68cd8
|
fix: 社保公积金月度办理排除劳务/实习协议员工
|
2026-08-18 07:15:05 +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
|
cdb8bdbd38
|
fix: 移除三期/医疗期/工伤员工主动推送解聘受限风险
这些是被动合规检查,在 termination.service.ts 解聘流程中已实现
不应作为主动风险推送到工作台
|
2026-08-17 21:28:50 +08:00 |
|
freedakgmail
|
b2fbfc18c1
|
fix: 三期风险截止日使用合同实际到期日,不再硬编码today+1天
|
2026-08-17 21:21:17 +08:00 |
|
freedakgmail
|
2b8a5d6e30
|
fix: 月度任务截止日使用配置的实际日期,不再用 today+N天 硬编码
detectMonthlyTasks 生成风险时设置 deadline 为当月配置的截止日
runRiskDetection 创建记录时优先使用风险自带的 deadline
|
2026-08-17 21:16:22 +08:00 |
|
freedakgmail
|
f2cb5e66b2
|
fix: 退休检测改为按最新合同类型判断,排除劳务协议员工
detectRetirementRisks、updateEmployeesRetirementDays、日历退休日期查询
均改为 include 最新合同并在代码中判断 contractType,而非用 some 查询
(some 会匹配到历史 FIXED 合同导致劳务人员仍被检测)
|
2026-08-17 21:04:00 +08:00 |
|
freedakgmail
|
0ea069cd57
|
fix: 退休检测排除劳务协议等非劳动合同类型
detectRetirementRisks 和日历退休日期查询均增加 contracts 过滤,
只检测 FIXED/UNFIXED 正式劳动合同员工,与 updateEmployeesRetirementDays 一致
|
2026-08-17 21:00:08 +08:00 |
|
freedakgmail
|
03e9e83483
|
feat: 待办事项显示损失金额理由
后端 estimateRiskCost 返回 lossReason 字段,说明法律依据和计算方式
前端在损失金额下方显示理由,如'逾期缴纳社保/公积金将产生滞纳金,每日万分之五'
|
2026-08-17 20:57:45 +08:00 |
|
freedakgmail
|
be0a44c251
|
fix: 日历风险截止事件按 employeeId:type 去重,避免重复提醒
|
2026-08-17 20:44:31 +08:00 |
|
freedakgmail
|
152b0b5024
|
fix: 后端对非劳动合同类型 socialInsBase/housingFundBase 返回 null
不再在数据源头返回社保基数和公积金基数,而非前端隐藏
|
2026-08-17 20:27:19 +08:00 |
|
freedakgmail
|
442063fb14
|
fix: 后端统一非劳动合同类型不缴社保公积金
- payroll.service.ts: isNoSocialContract 补充 PARTTIME/OUTSOURCING/UNSIGNED
- payroll.routes.ts tax-preview: 增加 contract 类型判断,非劳动合同 socialBase/housingBase 强制 0
- roster.routes.ts: 之前已修复
|
2026-08-17 20:25:11 +08:00 |
|
freedakgmail
|
0c2b9ec5e8
|
fix: 劳务协议等非劳动合同类型不计算社保公积金
合同类型为 LABOR/INTERNSHIP/PARTTIME/OUTSOURCING/UNSIGNED 时
socialInsCalc 和 housingFundCalc 返回 null
|
2026-08-17 20:21:30 +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 |
|
freedakgmail
|
4eb882b1e2
|
fix: 创建员工时从身份证解析性别和出生日期
- contract.service.ts createEmployee: gender 为空时从身份证第17位解析,birthDate 从第7-14位提取
- portal.routes.ts GET /profile: gender/birthDate 为空时从身份证 fallback 解析
- gender 统一使用中文 男/女(与数据库和其他服务一致)
- 前端 MyProfile.tsx 性别显示适配中文
|
2026-08-17 19:04:22 +08:00 |
|
freedakgmail
|
c4a929fc8e
|
feat: 员工端新增个人资料页面,数据同步到花名册
- 后端新增 GET/PUT /portal/profile 接口,员工可查看和编辑个人资料
- 员工可编辑:紧急联系人、住址、银行卡、学历、参保城市
- 只读字段:姓名、性别、手机号、证件号码、部门、岗位、入职日期
- 数据直接写入 Employee 表(花名册),HR 管理端可见
- 更新操作记录证据链(PROFILE_UPDATE)
- 前端新增 MyProfile.tsx 页面,PortalNav 添加导航入口
|
2026-08-17 18:56:42 +08:00 |
|
freedakgmail
|
cdbfeb4f99
|
fix: AI风险预测员工下拉框显示完整身份证号区分同名员工
- 后端 /employees/list 接口返回解密后的完整身份证号
- 前端 AI风险预测通用模式和结构化模式员工下拉框显示 姓名(身份证号)
|
2026-08-17 18:47:37 +08:00 |
|
freedakgmail
|
f2a8f9a97c
|
fix: AI身份证不脱敏+优化员工端登录页UI
- AI读取身份证改为解密明文,不再脱敏,确保生日等信息正确
- 员工端登录页优化:渐变背景、图标输入框、圆角Tab、loading动画、回车登录
|
2026-08-17 18:40:27 +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
|
c66ea290eb
|
fix: 签署日期不能晚于当前日期
后端 /sign-date 和 /paper-sign 均增加校验,签署日期晚于今天则报错。
前端日期选择器增加 max 属性限制为今天。
|
2026-08-17 12:48:07 +08:00 |
|
selfrelease
|
e824cd1629
|
fix: 线下签署登记完成时间改为实际签署日期
/sign-date 路径 completedAt 原来用 new Date()(HR登记时间),
导致发起时间和完成时间完全一样。改为用 parsedDate(HR选择的签署日期)。
|
2026-08-17 12:44:39 +08:00 |
|
selfrelease
|
d3a9ea041f
|
feat: AI风险检查以身份证号为员工唯一标识
- buildOrgContext 员工列表加入脱敏身份证号(前6后4,中间*)
- 单员工/部门预测上下文加入脱敏身份证号
- AI prompt 更新:要求用身份证号标识员工,姓名仅辅助参考
- 同名员工以身份证号区分
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 11:48:42 +08:00 |
|