Bläddra i källkod

Merge branch 'master' of http://code.pacsonline.cn/ddx/dros

szy 4 dagar sedan
förälder
incheckning
e42c2ebb26

+ 31 - 1
CHANGELOG.md

@@ -2,7 +2,7 @@
 
 本项目的所有重要变更都将记录在此文件中.
 
-## [1.61.4] - 2026-01-08 12:46
+## [1.63.0] - 2026-01-08 12:46
 
 ### 新增 (Added)
 
@@ -17,6 +17,36 @@
 - src/pages/system/SettingsModal/sections/Preferences/index.tsx
 - src/pages/system/SettingsModal/sections/Preferences/report/index.tsx
 
+## [1.62.1] - 2026-01-08 10:59
+
+### 修复 (Fixed)
+
+- **修复退出反馈对话框可被意外关闭问题** - 禁用遮罩点击和ESC键关闭功能,防止用户意外关闭重要的退出确认对话框
+  - 添加 maskClosable={false} 禁止点击遮罩关闭对话框
+  - 添加 keyboard={false} 禁止ESC键关闭对话框
+  - 确保用户在检查退出流程中必须明确选择操作,提升流程可靠性
+
+**改动文件:**
+
+- src/pages/exam/components/ExamExitFeedback.tsx
+
+## [1.62.0] - 2026-01-08 10:15
+
+### 新增 (Added)
+
+- **实现二维码扫描基于身份证号自动判断性别功能** - 根据中国身份证号第17位(倒数第2位)的奇偶性自动提取性别信息,提升二维码扫描录入的智能化水平
+  - 新增 extractGenderFromIdNumber 工具函数,实现身份证号性别提取逻辑(奇数=男性,偶数=女性)
+  - 修改 parseTabSeparatedText 函数,将身份证号提取位置从最后一个元素改为第4个位置(parts[3])
+  - 集成性别自动判断逻辑,从身份证号提取性别替代硬编码的默认值'F'
+  - 格式验证从至少3个部分改为至少4个部分(姓名 年龄 岁 身份证号)
+  - 新增性别判断日志输出,便于问题排查和调试
+  - 优化二维码扫描模态框样式,调整扫描区域padding为0
+
+**改动文件:**
+
+- src/domain/qrcode/qrCodeDataProcessor.ts
+- src/components/QRCodeScanner/QRCodeScanModal.tsx
+
 ## [1.61.3] - 2026-01-07 18:33
 
 ### 修复 (Fixed)

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.61.4",
+  "version": "1.63.0",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 1 - 1
src/components/QRCodeScanner/QRCodeScanModal.tsx

@@ -226,7 +226,7 @@ const QRCodeScanModal: React.FC<QRCodeScanModalProps> = ({ visible, onCancel, fo
               margin: '0 auto',
               border: '2px solid #1890ff',
               borderRadius: 8,
-              padding: 8,
+              padding: 0,
               minHeight: 300, // 给扫描区域固定高度
               display: scannedText ? 'none' : 'block',
             }}

+ 33 - 5
src/domain/qrcode/qrCodeDataProcessor.ts

@@ -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;
 };
 

+ 2 - 0
src/pages/exam/components/ExamExitFeedback.tsx

@@ -45,6 +45,8 @@ const ExamExitFeedback: React.FC<ExamExitFeedbackProps> = ({
       }
       open={open}
       onCancel={onContinue}
+      maskClosable={false}
+      keyboard={false}
       footer={
         <Space>
           <Button onClick={onContinue}>