feat: 绩效工资两行显示+等级系数着色
后端: 批次详情接口附加 perfGrade/perfCoefficient 到每个 entry 前端: 绩效工资列改为两行显示,上行金额,下行等级·系数 - A级(1.2)绿色, C级(0.8)橙色, D级(0.6)红色, B级(1.0)默认色 - 数据从 batch detail 接口获取,刷新不丢失
This commit is contained in:
@@ -292,12 +292,31 @@ router.get('/batches/:id', async (req: AuthRequest, res: Response, next: NextFun
|
||||
},
|
||||
})
|
||||
if (!rawBatch) return res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: '批次不存在' } })
|
||||
|
||||
// 查询批次月份的绩效记录,附加到 entry 上
|
||||
const perfRecords = await prisma.performanceRecord.findMany({
|
||||
where: { orgId: req.user!.orgId, period: rawBatch.month, periodType: 'MONTHLY' },
|
||||
select: { employeeId: true, grade: true, score: true },
|
||||
})
|
||||
const gradeCoefficients: Record<string, number> = { A: 1.2, B: 1.0, C: 0.8, D: 0.6 }
|
||||
const perfMap = new Map<string, { grade: string; coefficient: number }>()
|
||||
for (const r of perfRecords) {
|
||||
if (!perfMap.has(r.employeeId)) {
|
||||
perfMap.set(r.employeeId, { grade: r.grade, coefficient: gradeCoefficients[r.grade] || 1.0 })
|
||||
}
|
||||
}
|
||||
|
||||
const batch = {
|
||||
...rawBatch,
|
||||
entries: rawBatch.entries.map((e: any) => ({
|
||||
...e,
|
||||
employee: e.employee ? { ...e.employee, idCardNumber: safeDecryptStr(e.employee.idCardNumber) } : e.employee,
|
||||
})),
|
||||
entries: rawBatch.entries.map((e: any) => {
|
||||
const perf = perfMap.get(e.employeeId)
|
||||
return {
|
||||
...e,
|
||||
employee: e.employee ? { ...e.employee, idCardNumber: safeDecryptStr(e.employee.idCardNumber) } : e.employee,
|
||||
perfGrade: perf?.grade || null,
|
||||
perfCoefficient: perf?.coefficient || null,
|
||||
}
|
||||
}),
|
||||
}
|
||||
res.json({ success: true, data: batch })
|
||||
} catch (err) {
|
||||
|
||||
Reference in New Issue
Block a user