|
|
@@ -7,6 +7,29 @@ import { QRCodeData, ValidationResult } from '@/types/qrcode';
|
|
|
import { validateQRCodeData, sanitizeData } from './qrCodeValidator';
|
|
|
import dayjs from 'dayjs';
|
|
|
|
|
|
+/**
|
|
|
+ * 从中国身份证号中提取性别
|
|
|
+ * @param idNumber 身份证号(18位)
|
|
|
+ * @returns 'M' (男) | 'F' (女) | undefined (无法判断)
|
|
|
+ */
|
|
|
+const extractGenderFromIdNumber = (idNumber: string): 'M' | 'F' | undefined => {
|
|
|
+ // 验证身份证号格式(18位)
|
|
|
+ if (!idNumber || idNumber.length !== 18) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取第17位(索引16)- 性别标识位
|
|
|
+ const genderDigit = parseInt(idNumber[16]);
|
|
|
+
|
|
|
+ // 验证是否为有效数字
|
|
|
+ if (isNaN(genderDigit)) {
|
|
|
+ return undefined;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 奇数为男性,偶数为女性
|
|
|
+ return genderDigit % 2 === 1 ? 'M' : 'F';
|
|
|
+};
|
|
|
+
|
|
|
/**
|
|
|
* 解析制表符分隔的文本格式(姓名[TAB]年龄[TAB]岁[TAB]身份证号)
|
|
|
* @param text 原始文本
|
|
|
@@ -21,12 +44,12 @@ const parseTabSeparatedText = (text: string) => {
|
|
|
console.log('[QRCodeParse] 清理后:', cleaned);
|
|
|
console.log('[QRCodeParse] 分割结果:', parts);
|
|
|
|
|
|
- if (parts.length >= 3) {
|
|
|
- // 预期格式:[姓名, 年龄, 岁/年龄单位, ..., 身份证号]
|
|
|
+ if (parts.length >= 4) {
|
|
|
+ // 预期格式:[姓名, 年龄, 岁/年龄单位, 身份证号, ...]
|
|
|
const name = parts[0]; // 姓名
|
|
|
const ageStr = parts[1]; // 年龄数字
|
|
|
const unitStr = parts[2]; // 年龄单位(如"岁")
|
|
|
- const idNumber = parts[parts.length - 1]; // 身份证号(通常在最后)
|
|
|
+ const idNumber = parts[3]; // 身份证号(第4个位置)
|
|
|
|
|
|
// 验证年龄是否为数字
|
|
|
const ageNumber = parseInt(ageStr);
|
|
|
@@ -45,6 +68,10 @@ const parseTabSeparatedText = (text: string) => {
|
|
|
ageUnit = 'D';
|
|
|
}
|
|
|
|
|
|
+ // 从身份证号提取性别
|
|
|
+ const gender = extractGenderFromIdNumber(idNumber);
|
|
|
+ const patient_sex = gender || 'O'; // 如果无法判断,使用 'O' (Other)
|
|
|
+
|
|
|
const result = {
|
|
|
patient_name: name,
|
|
|
patient_age: {
|
|
|
@@ -52,14 +79,15 @@ const parseTabSeparatedText = (text: string) => {
|
|
|
unit: ageUnit
|
|
|
},
|
|
|
patient_id: idNumber,
|
|
|
- patient_sex: 'F' // 默认女性,可根据需要调整
|
|
|
+ patient_sex: patient_sex
|
|
|
};
|
|
|
|
|
|
console.log('[QRCodeParse] 解析结果:', result);
|
|
|
+ console.log('[QRCodeParse] 性别判断:', gender ? `从身份证号提取: ${gender}` : '无法判断性别,使用默认值 O');
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- console.error('[QRCodeParse] 文本格式不匹配,期望至少3个部分,实际:', parts.length);
|
|
|
+ console.error('[QRCodeParse] 文本格式不匹配,期望至少4个部分,实际:', parts.length);
|
|
|
return null;
|
|
|
};
|
|
|
|