From 4906fc73979c482155e0e2327fd229660c81e3b5 Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Wed, 19 Aug 2026 07:13:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=88=E5=B7=A5=E8=B5=84=3D=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC+=E7=BB=A9=E6=95=88=20=E6=95=B0=E6=8D=AE=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - contract.service.ts updateEmployee: 当同时传 baseSalary 和 performanceSalary 时,自动计算 monthlySalary = base + perf - roster.routes.ts 调薪接口: 同样确保 monthlySalary = base + perf - 修复前端编辑保存后月工资与基本+绩效不一致的问题 --- backend/src/routes/roster.routes.ts | 6 +++++- backend/src/services/contract.service.ts | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/src/routes/roster.routes.ts b/backend/src/routes/roster.routes.ts index 4a88aa5..982d098 100644 --- a/backend/src/routes/roster.routes.ts +++ b/backend/src/routes/roster.routes.ts @@ -1467,7 +1467,11 @@ router.post('/:id/salary-change', authMiddleware, async (req: AuthRequest, res, }) // 同步 Employee 便捷字段(含工资结构) - const updateData: any = { monthlySalary: encrypt(String(newSalary)) } + // 如果同时传了 baseSalary 和 performanceSalary,自动计算 monthlySalary = base + perf + const finalSalary = (baseSalary !== undefined && performanceSalary !== undefined) + ? (Number(baseSalary) || 0) + (Number(performanceSalary) || 0) + : newSalary + const updateData: any = { monthlySalary: encrypt(String(finalSalary)) } if (baseSalary !== undefined) updateData.baseSalary = encrypt(String(Number(baseSalary) || 0)) if (performanceSalary !== undefined) updateData.performanceSalary = encrypt(String(Number(performanceSalary) || 0)) await prisma.employee.update({ diff --git a/backend/src/services/contract.service.ts b/backend/src/services/contract.service.ts index 73069f1..ae9210e 100644 --- a/backend/src/services/contract.service.ts +++ b/backend/src/services/contract.service.ts @@ -690,8 +690,11 @@ export async function updateEmployee(orgId: string, id: string, data: any) { if (data.hireDate !== undefined) updateData.hireDate = new Date(data.hireDate) if (data.monthlySalary !== undefined) { const oldSalary = Number(decrypt(employee.monthlySalary)) || 0 - const newSalary = Number(data.monthlySalary) || 0 - updateData.monthlySalary = encrypt(data.monthlySalary) + // 如果同时传了 baseSalary 和 performanceSalary,自动计算 monthlySalary = base + perf + const baseNum = data.baseSalary !== undefined ? Number(data.baseSalary) || 0 : null + const perfNum = data.performanceSalary !== undefined ? Number(data.performanceSalary) || 0 : null + const newSalary = (baseNum !== null && perfNum !== null) ? baseNum + perfNum : (Number(data.monthlySalary) || 0) + updateData.monthlySalary = encrypt(String(newSalary)) // 同步更新工资结构 if (data.baseSalary !== undefined) { updateData.baseSalary = encrypt(String(Number(data.baseSalary) || 0))