From e6b5ac5989e20ea7089e6ffb2c9ff826b94cbf88 Mon Sep 17 00:00:00 2001 From: freedakgmail Date: Thu, 23 Jul 2026 17:14:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=A8=E8=81=8C/=E7=A6=BB=E8=81=8C?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=94=B9=E4=B8=BA=E6=A0=B9=E6=8D=AE=E8=A7=A3?= =?UTF-8?q?=E8=81=98=E6=97=A5=E6=9C=9F=E5=8A=A8=E6=80=81=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 花名册列表 API: include terminations,根据解聘日期<=今天判断RESIGNED - 员工详情 API: 同样动态计算 status - 证据链 API: 同样动态计算 status - 不再依赖数据库中静态的 status 字段 - 吴芳等解聘日期在未来的员工将正确显示为在职 --- backend/src/routes/roster.routes.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/src/routes/roster.routes.ts b/backend/src/routes/roster.routes.ts index d3689d7..e13b5de 100644 --- a/backend/src/routes/roster.routes.ts +++ b/backend/src/routes/roster.routes.ts @@ -26,6 +26,7 @@ router.get('/', authMiddleware, async (req: AuthRequest, res, next) => { orderBy: { createdAt: 'desc' }, include: { contracts: { orderBy: { createdAt: 'desc' }, take: 1 }, + terminations: { orderBy: { terminationDate: 'desc' }, take: 1 }, _count: { select: { disciplinaryRecords: true, @@ -38,6 +39,8 @@ router.get('/', authMiddleware, async (req: AuthRequest, res, next) => { }, }, }) + const today = new Date() + today.setHours(0, 0, 0, 0) const result = employees.map((e) => { const latestContract = e.contracts[0] || null const contractInfo = latestContract @@ -59,7 +62,7 @@ router.get('/', authMiddleware, async (req: AuthRequest, res, next) => { id: e.id, name: e.name, department: e.department, - status: e.status, + status: e.terminations.some((t) => t.terminationDate <= today) ? 'RESIGNED' : 'ACTIVE', hireDate: e.hireDate, gender: e.gender, phone: e.phone, @@ -98,10 +101,14 @@ router.get('/:id/profile', authMiddleware, async (req: AuthRequest, res, next) = return res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: '员工不存在' } }) } const { monthlySalary, bankAccount, idCardNumber, ...rest } = employee + const today = new Date() + today.setHours(0, 0, 0, 0) + const dynamicStatus = employee.terminations.some((t) => t.terminationDate <= today) ? 'RESIGNED' : 'ACTIVE' res.json({ success: true, data: { ...rest, + status: dynamicStatus, monthlySalary: safeDecrypt(monthlySalary), bankAccount: bankAccount ? safeDecrypt(bankAccount).toString() : null, idCardNumber: idCardNumber ? safeDecrypt(idCardNumber).toString() : null, @@ -251,7 +258,7 @@ router.get('/:id/evidence-chain', authMiddleware, async (req: AuthRequest, res, name: empName, department: empDept, hireDate, - status: employee.status, + status: employee.terminations.some((t) => t.terminationDate <= new Date()) ? 'RESIGNED' : 'ACTIVE', gender: employee.gender, phone: employee.phone, },