fix: 创建员工时从身份证解析性别和出生日期
- contract.service.ts createEmployee: gender 为空时从身份证第17位解析,birthDate 从第7-14位提取 - portal.routes.ts GET /profile: gender/birthDate 为空时从身份证 fallback 解析 - gender 统一使用中文 男/女(与数据库和其他服务一致) - 前端 MyProfile.tsx 性别显示适配中文
This commit is contained in:
@@ -885,11 +885,29 @@ router.get('/profile', portalAuth, async (req: any, res, next) => {
|
||||
try { if (emp.idCardNumber) idCardNo = decrypt(emp.idCardNumber) } catch {}
|
||||
try { if (emp.bankAccount) bankAccount = decrypt(emp.bankAccount) } catch {}
|
||||
|
||||
// 从身份证号解析性别和出生日期(数据库字段为空时)
|
||||
let gender = emp.gender || ''
|
||||
let birthDate = emp.birthDate ? emp.birthDate.toISOString().slice(0, 10) : ''
|
||||
if (idCardNo && idCardNo.length === 18) {
|
||||
// 第17位:奇数=男,偶数=女
|
||||
if (!gender) {
|
||||
const genderDigit = parseInt(idCardNo[16], 10)
|
||||
gender = genderDigit % 2 === 1 ? '男' : '女'
|
||||
}
|
||||
// 第7-14位:出生日期 YYYYMMDD
|
||||
if (!birthDate) {
|
||||
const y = idCardNo.slice(6, 10)
|
||||
const m = idCardNo.slice(10, 12)
|
||||
const d = idCardNo.slice(12, 14)
|
||||
birthDate = `${y}-${m}-${d}`
|
||||
}
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
name: emp.name,
|
||||
gender: emp.gender || '',
|
||||
gender,
|
||||
phone: emp.phone || '',
|
||||
idCardNo,
|
||||
idType: emp.idType || 'ID_CARD',
|
||||
@@ -903,7 +921,7 @@ router.get('/profile', portalAuth, async (req: any, res, next) => {
|
||||
bankName: emp.bankName || '',
|
||||
education: emp.education || '',
|
||||
city: emp.city || '',
|
||||
birthDate: emp.birthDate ? emp.birthDate.toISOString().slice(0, 10) : '',
|
||||
birthDate,
|
||||
},
|
||||
})
|
||||
} catch (err) { next(err) }
|
||||
|
||||
@@ -410,12 +410,13 @@ export async function createEmployee(orgId: string, userId: string, data: any) {
|
||||
monthlySalary: encrypt(data.monthlySalary),
|
||||
baseSalary: encrypt(String(baseSalaryNum)),
|
||||
performanceSalary: encrypt(String(performanceSalaryNum)),
|
||||
gender: data.gender,
|
||||
gender: data.gender || (data.idCardNumber ? extractGenderFromIdCard(data.idCardNumber) : null),
|
||||
femaleWorkerType: data.femaleWorkerType,
|
||||
phone: data.phone,
|
||||
passwordHash,
|
||||
idCardNumber: data.idCardNumber ? encrypt(data.idCardNumber) : null,
|
||||
idCardHash: data.idCardNumber ? sha256(data.idCardNumber) : null,
|
||||
birthDate: data.idCardNumber ? extractBirthDateFromIdCard(data.idCardNumber) : null,
|
||||
isPregnant: data.isPregnant || false,
|
||||
isInMedicalPeriod: data.isInMedicalPeriod || false,
|
||||
isWorkInjured: data.isWorkInjured || false,
|
||||
|
||||
@@ -75,7 +75,7 @@ export default function MyProfile() {
|
||||
|
||||
const readOnlyFields = [
|
||||
{ label: '姓名', value: profile.name, icon: User },
|
||||
{ label: '性别', value: profile.gender === 'M' ? '男' : profile.gender === 'F' ? '女' : '未填写', icon: User },
|
||||
{ label: '性别', value: profile.gender === '男' ? '男' : profile.gender === '女' ? '女' : '未填写', icon: User },
|
||||
{ label: '手机号', value: profile.phone || '未填写', icon: Phone },
|
||||
{ label: '证件号码', value: profile.idCardNo || '未填写', icon: IdCard },
|
||||
{ label: '部门', value: profile.department || '未填写', icon: User },
|
||||
|
||||
Reference in New Issue
Block a user