fix: AI风险预测员工下拉框显示完整身份证号区分同名员工
- 后端 /employees/list 接口返回解密后的完整身份证号 - 前端 AI风险预测通用模式和结构化模式员工下拉框显示 姓名(身份证号)
This commit is contained in:
@@ -82,10 +82,23 @@ router.get('/list', authMiddleware, async (req: AuthRequest, res, next) => {
|
|||||||
status: { in: status },
|
status: { in: status },
|
||||||
...(department && { department }),
|
...(department && { department }),
|
||||||
},
|
},
|
||||||
select: { id: true, name: true, department: true, position: true, phone: true, gender: true, status: true },
|
select: { id: true, name: true, department: true, position: true, phone: true, gender: true, status: true, idCardNumber: true },
|
||||||
orderBy: { name: 'asc' },
|
orderBy: { name: 'asc' },
|
||||||
})
|
})
|
||||||
res.json({ success: true, data: employees })
|
// 解密身份证号,返回完整明文用于前端下拉框区分同名员工
|
||||||
|
const employeesWithIdCard = employees.map((e: any) => {
|
||||||
|
let idCardNo = ''
|
||||||
|
if (e.idCardNumber) {
|
||||||
|
try {
|
||||||
|
const plain = decrypt(e.idCardNumber)
|
||||||
|
if (plain) idCardNo = plain
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
delete e.idCardNumber
|
||||||
|
e.idCardNo = idCardNo
|
||||||
|
return e
|
||||||
|
})
|
||||||
|
res.json({ success: true, data: employeesWithIdCard })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
next(err)
|
next(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ export interface EmployeeOption {
|
|||||||
phone?: string
|
phone?: string
|
||||||
gender?: string
|
gender?: string
|
||||||
status?: string
|
status?: string
|
||||||
|
idCardNo?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const employeeApi = {
|
export const employeeApi = {
|
||||||
|
|||||||
@@ -557,7 +557,7 @@ export function PredictTab() {
|
|||||||
<Label className="whitespace-nowrap">员工</Label>
|
<Label className="whitespace-nowrap">员工</Label>
|
||||||
<Select value={employeeId} onChange={(e) => setEmployeeId(e.target.value)}>
|
<Select value={employeeId} onChange={(e) => setEmployeeId(e.target.value)}>
|
||||||
<option value="">选择员工</option>
|
<option value="">选择员工</option>
|
||||||
{(employees || []).map((e: any) => <option key={e.id} value={e.id}>{e.name}</option>)}
|
{(employees || []).map((e: any) => <option key={e.id} value={e.id}>{e.name}({e.idCardNo || e.department})</option>)}
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -621,7 +621,7 @@ export function PredictTab() {
|
|||||||
<Label>涉及员工</Label>
|
<Label>涉及员工</Label>
|
||||||
<Select value={structEmployeeName} onChange={(e) => handleStructEmployeeChange(e.target.value)}>
|
<Select value={structEmployeeName} onChange={(e) => handleStructEmployeeChange(e.target.value)}>
|
||||||
<option value="">选择员工(可选)</option>
|
<option value="">选择员工(可选)</option>
|
||||||
{(employees || []).map((e: any) => <option key={e.id} value={e.name}>{e.name}({e.department})</option>)}
|
{(employees || []).map((e: any) => <option key={e.id} value={e.name}>{e.name}({e.idCardNo || e.department})</option>)}
|
||||||
</Select>
|
</Select>
|
||||||
{employeeSpecialStatus && (
|
{employeeSpecialStatus && (
|
||||||
<div className="mt-1 flex items-center gap-1 text-xs text-amber-700 bg-amber-50 border border-amber-200 px-2 py-1 rounded">
|
<div className="mt-1 flex items-center gap-1 text-xs text-amber-700 bg-amber-50 border border-amber-200 px-2 py-1 rounded">
|
||||||
|
|||||||
Reference in New Issue
Block a user