From 2f1e339413ef7852cb8bf3fc83fbffcac548dcb6 Mon Sep 17 00:00:00 2001 From: selfrelease Date: Sun, 16 Aug 2026 15:12:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8A=B3=E5=8A=A1=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E7=A4=BE=E4=BF=9D=E5=9F=BA=E6=95=B0=E4=B8=BA?= =?UTF-8?q?0=E6=97=B6=E4=BB=8D=E6=8C=89=E5=9F=BA=E6=9C=AC=E5=B7=A5?= =?UTF-8?q?=E8=B5=84=E8=AE=A1=E7=AE=97=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: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> --- backend/src/routes/payroll.routes.ts | 4 ++-- backend/src/services/payroll.service.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/routes/payroll.routes.ts b/backend/src/routes/payroll.routes.ts index 49f8799..1a24138 100644 --- a/backend/src/routes/payroll.routes.ts +++ b/backend/src/routes/payroll.routes.ts @@ -596,8 +596,8 @@ router.post('/tax-preview', async (req: AuthRequest, res: Response, next: NextFu ]) const emp = employee || { socialInsBase: baseSalary, housingFundBase: baseSalary } - const socialBase = emp.socialInsBase || baseSalary - const housingBase = emp.housingFundBase || baseSalary + const socialBase = emp.socialInsBase != null ? emp.socialInsBase : baseSalary + const housingBase = emp.housingFundBase != null ? emp.housingFundBase : baseSalary // 计算社保公积金 let socialEmp = 0, housingEmp = 0 diff --git a/backend/src/services/payroll.service.ts b/backend/src/services/payroll.service.ts index a1c384c..698359f 100644 --- a/backend/src/services/payroll.service.ts +++ b/backend/src/services/payroll.service.ts @@ -233,9 +233,9 @@ export async function calcBatchEntry( }) } - // 社保基数:优先用员工核定基数,否则用基本工资 - const socialBase = employee.socialInsBase || inputs.baseSalary - const housingBase = employee.housingFundBase || inputs.baseSalary + // 社保基数:优先用员工核定基数(含0,劳务协议人员基数为0不交社保),未设置时回退到基本工资 + const socialBase = employee.socialInsBase != null ? employee.socialInsBase : inputs.baseSalary + const housingBase = employee.housingFundBase != null ? employee.housingFundBase : inputs.baseSalary let socialEmp = 0, socialOrg = 0, housingEmp = 0, housingOrg = 0 @@ -689,7 +689,7 @@ export async function prePayrollCheck(orgId: string, batchId: string): Promise

socialConfig.baseMax) { checks.push({ code: 'SOCIAL_BASE_OUT_OF_RANGE', @@ -707,7 +707,7 @@ export async function prePayrollCheck(orgId: string, batchId: string): Promise

housingConfig.baseMax) { checks.push({ code: 'HOUSING_BASE_OUT_OF_RANGE',