瀏覽代碼

新增身份证读卡 UI

gavin.chen 1 年之前
父節點
當前提交
629baa9305

+ 1 - 1
android/app/src/main/AndroidManifest.xml

@@ -1,4 +1,4 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.vitalapp">
     <application
         android:label="@string/app_name"
         android:name="${applicationName}"

二進制
assets/images/card_reader.png


+ 53 - 0
lib/pages/patient/card_reader/controller.dart

@@ -0,0 +1,53 @@
+import 'dart:math';
+
+import 'package:get/get.dart';
+
+class CardReaderController extends GetxController {
+  CardReaderController();
+
+  _initData() {
+    /// TODO 判断是否连接读卡器
+    isCardReaderConnected = Random().nextBool(); // FIXME 模拟随机连接读卡器
+    update(["card_reader"]);
+  }
+
+  void onTap() {}
+
+  bool isCardReaderConnected = false;
+
+  void debugConnectCardReader() {
+    // set status to connected
+    isCardReaderConnected = true;
+    update(["card_reader"]);
+  }
+
+  void debugGetValueAndClose() {
+    Get.back(
+      result: CardReaderResult(
+          success: true, code: "123456789012345678", message: "success"),
+    );
+  }
+
+  // @override
+  // void onInit() {
+  //   super.onInit();
+  // }
+
+  @override
+  void onReady() {
+    super.onReady();
+    _initData();
+  }
+
+  // @override
+  // void onClose() {
+  //   super.onClose();
+  // }
+}
+
+class CardReaderResult {
+  bool success;
+  String? code;
+  String? message;
+  CardReaderResult({required this.success, this.code, this.message});
+}

+ 5 - 0
lib/pages/patient/card_reader/index.dart

@@ -0,0 +1,5 @@
+library card_reader;
+
+export './controller.dart';
+export './view.dart';
+export 'widgets/index.dart';

+ 66 - 0
lib/pages/patient/card_reader/view.dart

@@ -0,0 +1,66 @@
+import 'package:date_format/date_format.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+
+import 'index.dart';
+
+class CardReaderDialog extends GetView<CardReaderController> {
+  const CardReaderDialog({Key? key}) : super(key: key);
+
+  // 主视图
+  Widget _buildView() {
+    const designWidth = 1280.0; // 设计尺寸宽度:1280
+    final width = Get.width;
+    final scale = width / designWidth; // 计算缩放比例
+    return Container(
+      width: Get.width * 0.6 / scale,
+      height: Get.height * 0.6 / scale,
+      decoration: BoxDecoration(
+        color: Colors.white,
+        borderRadius: BorderRadius.circular(10),
+      ),
+      child: Column(
+        children: [
+          _buildHead(),
+          // const Expanded(child: NoCardReaderView()),
+          Expanded(
+              child: controller.isCardReaderConnected
+                  ? const CardReaderView()
+                  : const NoCardReaderView()),
+        ],
+      ),
+    );
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GetBuilder<CardReaderController>(
+      init: CardReaderController(),
+      id: "card_reader",
+      builder: (_) {
+        return Dialog(
+          child: _buildView(),
+        );
+      },
+    );
+  }
+
+  /// 构建弹窗顶部,右侧显示关闭按钮
+  Widget _buildHead() {
+    return SizedBox(
+      height: 50,
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.end,
+        children: [
+          IconButton(
+            onPressed: () => Get.back(),
+            icon: const Icon(
+              Icons.close,
+              size: 30,
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 43 - 0
lib/pages/patient/card_reader/widgets/card_reader_view.dart

@@ -0,0 +1,43 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:vitalapp/components/button.dart';
+import '../index.dart';
+
+class CardReaderView extends GetView<CardReaderController> {
+  const CardReaderView({super.key});
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          const Image(
+            image: AssetImage('assets/images/card_reader.png'),
+            width: 100,
+          ),
+          const SizedBox(height: 20),
+          const Text(
+            '已连接读卡器',
+            style: TextStyle(
+              fontSize: 20,
+              fontWeight: FontWeight.bold,
+            ),
+          ),
+          const SizedBox(height: 20),
+          const Text(
+            '请将身份证放置在读卡器上',
+            textAlign: TextAlign.center,
+          ),
+          const SizedBox(height: 20),
+          ElevatedButton(
+            onPressed: () {
+              // FIXME 模拟读取到数据
+              controller.debugGetValueAndClose();
+            },
+            child: const Text('取消'),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 2 - 0
lib/pages/patient/card_reader/widgets/index.dart

@@ -0,0 +1,2 @@
+export 'no_card_reader_view.dart';
+export 'card_reader_view.dart';

+ 43 - 0
lib/pages/patient/card_reader/widgets/no_card_reader_view.dart

@@ -0,0 +1,43 @@
+import 'package:date_format/date_format.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import '../index.dart';
+
+class NoCardReaderView extends GetView<CardReaderController> {
+  const NoCardReaderView({super.key});
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: [
+          const Icon(
+            Icons.warning_amber_rounded,
+            size: 80,
+            color: Colors.red,
+          ),
+          const SizedBox(height: 20),
+          const Text(
+            '未连接读卡器',
+            style: TextStyle(
+              fontSize: 20,
+              fontWeight: FontWeight.bold,
+            ),
+          ),
+          const SizedBox(height: 20),
+          const Text(
+            '请连接读卡器后重试',
+            textAlign: TextAlign.center,
+          ),
+          const SizedBox(height: 20),
+          ElevatedButton(
+            onPressed: () {
+              controller.debugConnectCardReader();
+            },
+            child: const Text('重试'),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 13 - 0
lib/pages/patient/create/controller.dart

@@ -5,6 +5,7 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/managers/interfaces/patient.dart';
 import 'package:vitalapp/pages/controllers/crowd_labels.dart';
 import 'package:vitalapp/pages/controllers/home_nav_mixin.dart';
+import 'package:vitalapp/pages/patient/card_reader/index.dart';
 import 'package:vitalapp/pages/patient/create/state.dart';
 import 'package:vitalapp/pages/patient/list/controller.dart';
 import 'package:vitalapp/routes/nav_ids.dart';
@@ -90,6 +91,18 @@ class CreatePatientController extends FControllerBase with HomeNavMixin {
     );
   }
 
+  /// 打开读卡器弹窗
+  void openCardReader() async {
+    final CardReaderResult? result = await Get.dialog<CardReaderResult>(
+      const CardReaderDialog(),
+    );
+    if (result != null && result.success) {
+      print("读卡成功,身份证号:${result.code}");
+    } else {
+      print("读卡取消");
+    }
+  }
+
   /// 保存并返回
   void saveAndBack() async {
     setBusy("正在保存...");

+ 15 - 0
lib/pages/patient/create/widgets/quick_create.dart

@@ -35,6 +35,21 @@ class QuickCreatePatientPage extends GetView<CreatePatientController> {
             ],
           ),
         ),
+        Positioned(
+          bottom: 8,
+          right: 40,
+          child: Row(
+            mainAxisAlignment: MainAxisAlignment.spaceAround,
+            children: [
+              VButton(
+                label: "从读卡器获取",
+                onTap: () {
+                  controller.openCardReader();
+                },
+              ),
+            ],
+          ),
+        ),
       ],
     );
   }