瀏覽代碼

支持修改证件号

gavin.chen 1 年之前
父節點
當前提交
f86273786c
共有 3 個文件被更改,包括 96 次插入69 次删除
  1. 74 0
      lib/helper/id_card_helper.dart
  2. 2 67
      lib/pages/patient/create/controller.dart
  3. 20 2
      lib/pages/patient/info/widgets/base.dart

+ 74 - 0
lib/helper/id_card_helper.dart

@@ -0,0 +1,74 @@
+class IdCardHelper {
+  static bool isNumeric(String str) {
+    if (str.isEmpty) {
+      return false;
+    }
+    return double.tryParse(str) != null;
+  }
+
+  static bool validateIDCard(String idCard) {
+    // 校验身份证号码长度
+    if (idCard.length != 18) {
+      return false;
+    }
+
+    // 校验前17位是否为数字
+    String idCard17 = idCard.substring(0, 17);
+    if (!isNumeric(idCard17)) {
+      return false;
+    }
+
+    // 校验最后一位校验码
+    String checkCode = getCheckCode(idCard17);
+    if (idCard[17].toUpperCase() != checkCode) {
+      print("checkCode: $checkCode");
+      return false;
+    }
+
+    return true;
+  }
+
+  static String getCheckCode(String idCard17) {
+    List<int> coefficients = [
+      7,
+      9,
+      10,
+      5,
+      8,
+      4,
+      2,
+      1,
+      6,
+      3,
+      7,
+      9,
+      10,
+      5,
+      8,
+      4,
+      2
+    ];
+    List<String> checkCodes = [
+      '1',
+      '0',
+      'X',
+      '9',
+      '8',
+      '7',
+      '6',
+      '5',
+      '4',
+      '3',
+      '2'
+    ];
+
+    int sum = 0;
+    for (int i = 0; i < idCard17.length; i++) {
+      int digit = int.parse(idCard17[i]);
+      sum += digit * coefficients[i];
+    }
+
+    int remainder = sum % 11;
+    return checkCodes[remainder];
+  }
+}

+ 2 - 67
lib/pages/patient/create/controller.dart

@@ -8,6 +8,7 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/architecture/values/features.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/global.dart';
+import 'package:vitalapp/helper/id_card_helper.dart';
 import 'package:vitalapp/managers/interfaces/device.dart';
 import 'package:vitalapp/managers/interfaces/models/device.dart';
 import 'package:vitalapp/managers/interfaces/patient.dart';
@@ -501,28 +502,6 @@ class CreatePatientController extends FControllerBase
     return result;
   }
 
-  bool validateIDCard(String idCard) {
-    // 校验身份证号码长度
-    if (idCard.length != 18) {
-      return false;
-    }
-
-    // 校验前17位是否为数字
-    String idCard17 = idCard.substring(0, 17);
-    if (!isNumeric(idCard17)) {
-      return false;
-    }
-
-    // 校验最后一位校验码
-    String checkCode = getCheckCode(idCard17);
-    if (idCard[17].toUpperCase() != checkCode) {
-      print("checkCode: $checkCode");
-      return false;
-    }
-
-    return true;
-  }
-
   bool isNumeric(String str) {
     if (str.isEmpty) {
       return false;
@@ -541,50 +520,6 @@ class CreatePatientController extends FControllerBase
     return alphaNumericChineseWithSpaceRegExp.hasMatch(str);
   }
 
-  String getCheckCode(String idCard17) {
-    List<int> coefficients = [
-      7,
-      9,
-      10,
-      5,
-      8,
-      4,
-      2,
-      1,
-      6,
-      3,
-      7,
-      9,
-      10,
-      5,
-      8,
-      4,
-      2
-    ];
-    List<String> checkCodes = [
-      '1',
-      '0',
-      'X',
-      '9',
-      '8',
-      '7',
-      '6',
-      '5',
-      '4',
-      '3',
-      '2'
-    ];
-
-    int sum = 0;
-    for (int i = 0; i < idCard17.length; i++) {
-      int digit = int.parse(idCard17[i]);
-      sum += digit * coefficients[i];
-    }
-
-    int remainder = sum % 11;
-    return checkCodes[remainder];
-  }
-
   Future<String?> _validateForm() async {
     if (state.name.isEmpty) {
       return "请填写姓名";
@@ -611,7 +546,7 @@ class CreatePatientController extends FControllerBase
       }
     }
     if (state.cardType == CardTypeEnum.Identity) {
-      bool isNotIDCard = validateIDCard(state.cardNo);
+      bool isNotIDCard = IdCardHelper.validateIDCard(state.cardNo);
       if (!isNotIDCard) {
         return "请填写正确的证件号";
       }

+ 20 - 2
lib/pages/patient/info/widgets/base.dart

@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:intl/intl.dart';
 import 'package:vitalapp/architecture/utils/datetime.dart';
+import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/cell.dart';
 import 'package:vitalapp/components/dialog_check.dart';
 import 'package:vitalapp/components/dialog_date.dart';
@@ -12,6 +13,7 @@ import 'package:vitalapp/components/dialog_profile_time_input.dart';
 import 'package:vitalapp/components/dialog_select.dart';
 import 'package:vitalapp/consts/nations.dart';
 import 'package:vitalapp/consts/rpc_enum_labels.dart';
+import 'package:vitalapp/helper/id_card_helper.dart';
 import 'package:vitalapp/pages/patient/info/controller.dart';
 import 'package:vitalapp/pages/patient/info/patientInfoRecord.dart';
 import 'package:fis_common/index.dart';
@@ -150,8 +152,24 @@ class _HealthInfoPanel extends GetView<PatientInfoController> {
         () => VListFormCell(
           label: "证件号",
           content: controller.state.cardNo,
-          onTap: () {},
-          endIcon: _buildEndIcon(isEdit: false),
+          onTap: () async {
+            print("点击修改证件号");
+            final result = await VDialogInput(
+              title: "证件号",
+              initialValue: controller.state.cardNo,
+              placeholder: "请填写证件号",
+            ).show();
+            if (result != null && result is String) {
+              // 校验身份证号
+              bool validate = IdCardHelper.validateIDCard(result);
+              if (!validate) {
+                PromptBox.toast("身份证号码格式错误");
+                return;
+              }
+              controller.state.cardNo = result;
+            }
+          },
+          endIcon: _buildEndIcon(isEdit: true),
         ),
       ),
       Obx(