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
|
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
|
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 |
|
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
|
a6189d209d
|
fix: 员工端首页快捷入口添加个人资料和我的记录
手机端底部TabBar只有5个固定入口,个人资料通过首页快捷入口访问
|
2026-08-17 19:00:04 +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 |
|
freedakgmail
|
c6e2dbf5b7
|
fix: portal/login死循环 — 登录页和自动登录页移出PortalLayoutWrapper
|
2026-08-17 18:35:31 +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
|
c039f0a3cf
|
fix: 员工端工资条补全明细项(奖金/社保/公积金/个税/实发)
原只显示基本工资/加班费/津贴/扣款4项,补全为:
基本工资/加班费/津贴/奖金/扣款 → 应发合计
→ 个人社保/个人公积金/个人所得税 → 实发工资
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 12:38:05 +08:00 |
|
selfrelease
|
61873b2581
|
fix: 公积金账户下拉只显示基本公积金,补充公积金下拉只显示补充
添加员工表单中:
- 公积金账户下拉:只显示 accountType !== 'SUPPLEMENTARY' 的基本公积金账户
- 补充公积金下拉:只显示 accountType === 'SUPPLEMENTARY' 的补充公积金账户
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 12:35:51 +08:00 |
|
selfrelease
|
ef685663ac
|
fix: 公积金表单去掉多余的housingBaseMin/Max输入,只保留一套基数上下限
新架构下社保和公积金是不同账户,各自有独立的年度标准,
baseMin/baseMax 已各自独立,housingBaseMin/Max是旧架构遗留。
公积金表单标签改为"公积金基数下限/上限",默认值改为2540/35811。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 12:30:55 +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 |
|
selfrelease
|
874f8c49bd
|
fix: 懒加载chunk失败时自动刷新页面
部署后旧chunk文件名(带hash)被删除,浏览器若缓存了旧index.html
仍会请求旧chunk导致 "Failed to fetch dynamically imported module"。
新增 lazyRetry 包装器,检测到此错误时自动刷新页面获取新index.html。
用 sessionStorage 标记防止无限刷新。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 11:42:19 +08:00 |
|
selfrelease
|
fa7bf69682
|
ui: 优化侧边栏菜单分组
- 提成奖金从「团队」移到「薪酬」
- 待签合同从「首页」移到「团队」
- 「合规」拆分:风险中心/证据链条/规章制度保留,用工体检/医疗期/年度价值独立为「工具」组
|
2026-08-17 11:35:58 +08:00 |
|
selfrelease
|
d017d6337f
|
ui: 登录页Logo放大
|
2026-08-17 11:25:13 +08:00 |
|
selfrelease
|
2afbdacae3
|
ui: 侧边栏左上角只显示公司名,不显示Logo
|
2026-08-17 11:22:18 +08:00 |
|
selfrelease
|
6e80bcb330
|
brand: 品牌名改回安职通,公司名嘉驰英才
|
2026-08-17 11:12:52 +08:00 |
|
selfrelease
|
7ba357a6e5
|
ui: 登录页Logo单独一行放大显示
|
2026-08-17 11:07:03 +08:00 |
|
selfrelease
|
668a908dd6
|
ui: 登录页Logo单独显示,去掉背景框
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 11:05:17 +08:00 |
|
selfrelease
|
99aa6d6998
|
brand: 替换品牌名称为嘉驰英才,使用新Logo
- 登录页/注册页/忘记密码/员工端登录:品牌名改为嘉驰英才
- 登录页公司全称:嘉驰英才(上海)信息科技有限公司
- Logo组件改为使用 JClog.png 图片
- 全局替换所有"安职通"为"嘉驰英才"
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 10:56:10 +08:00 |
|
selfrelease
|
6919f997c6
|
fix: 员工端首页应发合计显示为0
后端返回字段是 totalPay,前端误用 grossPay(不存在的字段),
导致应发合计始终显示 0。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 10:37:20 +08:00 |
|
selfrelease
|
16f38f3c36
|
feat: 补充公积金支持(员工级别可选)
上海等城市存在补充公积金账户,同一企业内高管可能有但普通员工
没有。新增员工级别补充公积金账户关联:
- Employee 表加 supplementaryHousingAccountId 字段
- BatchEntry 表加 supplementaryHousingEmp/Org 字段
- 薪资计算 calcBatchEntry 支持补充公积金(额外算一笔,纳入
个税扣除、最低工资保护递延逻辑)
- 新增员工弹窗加补充公积金账户选择器(可选,仅显示
accountType=SUPPLEMENTARY 的公积金账户)
- 员工档案编辑支持补充公积金账户
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 10:20:59 +08:00 |
|
selfrelease
|
1e7932c36c
|
ui: 删除新增员工弹窗的参保城市字段
参保城市由社保账户自动确定,无需单独显示。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 10:03:23 +08:00 |
|
selfrelease
|
def0fe3a1f
|
refactor: 删除 PRE_ONBOARD 显式状态,统一按入职日期判定预入职
预入职不再需要显式设置 PRE_ONBOARD 状态,统一按入职日期自动
判定:入职日期在未来 = 预入职(不进入薪资),入职日期 <= 今天
= 正式在职。
删除内容:
- schema: EmployeeStatus 枚举移除 PRE_ONBOARD
- roster.routes.ts: 移除 PRE_ONBOARD 筛选和 /activate API
- payroll2.routes.ts: 移除 NOT PRE_ONBOARD 排除条件
- modals.tsx: 移除入职状态选择器
保留:按 hireDate > 今天 自动判定预入职的逻辑
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-17 09:59:21 +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
|
1d9890e607
|
fix: 创建年度标准时同effectiveFrom已存在则更新而非报错
问题:创建年度标准时如果该账户已有同 effectiveFrom 的标准,
会触发 P2002 唯一约束冲突,返回400"数据已存在"。
修复:先查是否已存在同 effectiveFrom 的标准,存在则更新,
不存在才创建新标准。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:48:21 +08:00 |
|
selfrelease
|
b5aa5552ff
|
chore: 添加社保公积金账户数据修复脚本
- fix-missing-standards.ts: 补齐无年度标准的账户
- fix-housing-base-limits.ts: 更新各城市公积金基数上下限
- check-test-accounts.ts: 删除不完整的测试账户
- assign-accounts.ts: 为全部员工按城市匹配社保公积金账户
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:42:37 +08:00 |
|
selfrelease
|
38075420f4
|
feat: 社保年度标准完善 — 医疗附加 + 继承旧配置 + 公积金独立上下限
1. 医疗附加金额:SocialYearStandard 和 SocialInsuranceConfig 新增
medicalOrgExtra/medicalEmpExtra 字段(如北京3元大病医疗)
- calcSocialInsurance 计算时加上医疗附加
- 前端年度标准表单加医疗企业/个人附加输入
2. 新建年度标准继承:新增 /inherit-config API
- 优先用当前年度标准
- 回退到旧 SocialInsuranceConfig/HousingFundConfig
- 前端点击"新建年度标准"时自动继承填充
3. 公积金独立上下限:SocialYearStandard 新增 housingBaseMin/housingBaseMax
- calcHousingFund 优先用公积金专用上下限,为0时回退到社保
- 前端公积金年度标准表单加公积金基数上下限输入
4. blank_employees/blank_all 模式跳过试用期工资覆盖
5. 劳务协议/实习协议人员 calcBatchEntry 强制社保公积金为0
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:31:56 +08:00 |
|
selfrelease
|
3ac333891c
|
fix: 劳务协议/实习协议人员薪资计算强制社保公积金为0
calcBatchEntry 查询员工时 include contracts,判断合同类型:
- LABOR(劳务协议)/ INTERNSHIP(实习协议)→ 社保公积金基数强制0,跳过社保计算
- 其他合同类型 → 正常计算
无论哪种批次创建模式(copy_last/blank_employees/custom等),
劳务协议人员的社保公积金都为0。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:24:49 +08:00 |
|
selfrelease
|
c3ca2c9f50
|
fix: 公积金基数上下限独立于社保
问题:SocialYearStandard 只有一套 baseMin/baseMax,社保和公积金
共用,但公积金下限通常是最低工资标准(如北京2420),远低于社保
下限(如北京6326)。
修复:
- SocialYearStandard 新增 housingBaseMin/housingBaseMax 字段
- clampHousingFundBase 优先用公积金专用上下限,为0时回退到社保
- calcHousingFund 同样优先用公积金专用上下限
- 前端公积金年度标准表单加公积金基数上下限输入
- 前端公积金当前标准展示用公积金专用上下限
同时修复 blank_employees/blank_all 模式跳过试用期工资覆盖
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:23:08 +08:00 |
|
selfrelease
|
94959522df
|
fix: blank_employees/blank_all 模式跳过试用期工资覆盖
blank_employees 和 blank_all 模式下所有金额应为 0,但统一试用期
判定逻辑会把 probationSalary 覆盖到 baseSalary,导致有试用期合同
的员工基本工资不为 0。
修复:试用期判定仅对 copy_last / copy_batch / custom 模式执行,
blank_employees / blank_all 模式跳过。
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:20:05 +08:00 |
|
selfrelease
|
2f1e339413
|
fix: 劳务协议人员社保基数为0时仍按基本工资计算的bug
根因:socialInsBase || baseSalary 中 0 是 falsy,导致基数为0
的劳务协议/实习人员回退到基本工资计算社保。
修复:改为 nullish check(!= null),区分"明确设置为0"
和"未设置(null)":
- socialInsBase = 0 → 用 0(劳务协议不交社保)
- socialInsBase = null → 用 baseSalary(回退)
- socialInsBase = 5000 → 用 5000(核定基数)
涉及文件:
- payroll.service.ts calcBatchEntry + prePayrollCheck
- payroll.routes.ts 旧版薪资计算
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
2026-08-16 15:12:07 +08:00 |
|