Browse Source

1、处方二维码列表更新

guanxinyi 11 months ago
parent
commit
c74c95449c

+ 125 - 0
lib/components/qr_code_with_logo/qr_code_with_logo.dart

@@ -0,0 +1,125 @@
+import 'dart:async';
+import 'dart:ui' as ui;
+
+import 'package:fis_lib_qrcode/qr_flutter.dart';
+import 'package:fis_lib_qrcode/src/custom_qrcode_builder.dart';
+import 'package:fis_ui/index.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+/// 带logo的二维码
+class VQRCodeWithLogo extends StatefulWidget implements FWidget {
+  /// 二维码数据
+  final String qrData;
+
+  /// 二维码说明
+  final String? codeStatement;
+
+  /// 操作说明
+  final String? operationStatement;
+
+  /// 操作回调
+  final void Function()? operationSuccessCallback;
+
+  /// 尺寸
+  final double size;
+
+  /// logo尺寸
+  final double? logoSize;
+
+  ///带Logo的二维码
+  const VQRCodeWithLogo(
+    this.qrData, {
+    Key? key,
+    this.codeStatement = "QRCodeStatement",
+    this.operationStatement = "QRCodeOperationStatement",
+    this.operationSuccessCallback,
+    this.size = 280,
+    this.logoSize,
+  }) : super(key: key);
+
+  @override
+  _VQRCodeWithLogoState createState() => _VQRCodeWithLogoState();
+}
+
+class _VQRCodeWithLogoState extends State<VQRCodeWithLogo> {
+  @override
+  Widget build(BuildContext context) {
+    final qrFutureBuilder = CustomFutureBuilder<ui.Image>(
+      future: _loadOverlayImage(),
+      builder: (ctx, snapshot) {
+        final size = widget.size;
+        final logoSize = widget.logoSize ?? size / 5;
+        if (!snapshot.hasData) {
+          return Container(width: size, height: size);
+        }
+        return CustomPaint(
+          size: Size.square(size),
+          painter: QrPainter(
+            data: widget.qrData,
+            version: QrVersions.auto,
+            eyeStyle: const QrEyeStyle(
+              eyeShape: QrEyeShape.square,
+              color: Colors.black,
+            ),
+            dataModuleStyle: const QrDataModuleStyle(
+              dataModuleShape: QrDataModuleShape.square,
+              color: Colors.black,
+            ),
+            embeddedImage: snapshot.data,
+            embeddedImageStyle: QrEmbeddedImageStyle(
+              size: Size.square(logoSize),
+            ),
+          ),
+        );
+      },
+    );
+
+    return Material(
+      color: Colors.white,
+      child: FContainer(
+        width: 160,
+        child: FColumn(
+          mainAxisAlignment: MainAxisAlignment.center,
+          children: [
+            qrFutureBuilder,
+            FPadding(
+              padding: EdgeInsets.symmetric(
+                vertical: 8,
+                horizontal: 8,
+              ).copyWith(
+                bottom: 5,
+              ),
+              child: FText(
+                widget.codeStatement!,
+                overflow: TextOverflow.ellipsis,
+              ),
+            ),
+            FInk(
+              decoration: UnderlineTabIndicator(
+                  borderSide: BorderSide(color: Colors.blue),
+                  insets: EdgeInsets.fromLTRB(0, 0, 0, 1)),
+              child: FInkWell(
+                child: FText(
+                  widget.operationStatement!,
+                  style: TextStyle(color: Colors.blue),
+                ),
+                onTap: () => {
+                  Clipboard.setData(ClipboardData(text: widget.qrData)),
+                  widget.operationSuccessCallback?.call()
+                },
+              ),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+
+  Future<ui.Image> _loadOverlayImage() async {
+    final completer = Completer<ui.Image>();
+    final byteData = await rootBundle.load('assets/images/flyinsono.png');
+    ui.decodeImageFromList(byteData.buffer.asUint8List(), completer.complete);
+    return completer.future;
+  }
+}

+ 1 - 1
lib/managers/prescription.dart

@@ -51,7 +51,7 @@ class PrescriptionManager implements IPrescriptionManager {
         followUpCode: followUpCode,
         patientCode: patientCode,
       );
-      PrescriptionDTO prescription = await rpc.vitalPrescription
+      PrescriptionDTO? prescription = await rpc.vitalPrescription
           .getPrescriptionDetailByFollowAnPatientAsync(request);
       return prescription;
     } catch (e) {

+ 9 - 4
lib/pages/check/children_follow_up_record/controller.dart

@@ -226,17 +226,22 @@ class ChildrenFollowUpRecordController extends FControllerBase {
     showDialogBox(initialData, jsonData);
   }
 
-  Future<List<String>> sharePrescription(
+  Future<List<Map<String, dynamic>>> sharePrescription(
     FollowUpRecordDataDTO dataDTO,
   ) async {
-    List<String> previewUrlList = [];
+    List<Map<String, dynamic>> previewList = [];
     List<PrescriptionDTO>? prescriptionList =
         await getPrescriptionList(dataDTO.code!);
     for (PrescriptionDTO prescription in prescriptionList ?? []) {
-      previewUrlList.add(prescription.previewUrl ?? "");
+      if (prescription.previewUrl != null) {
+        previewList.add({
+          "previewUrl": prescription.previewUrl ?? "",
+          "key": prescription.prescriptionTemplateKey,
+        });
+      }
     }
 
-    return previewUrlList;
+    return previewList;
   }
 
   Future<List<PrescriptionDTO>?> getPrescriptionList(

+ 32 - 23
lib/pages/check/children_follow_up_record/view.dart

@@ -1,4 +1,3 @@
-import 'package:fis_common/index.dart';
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
@@ -7,6 +6,7 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/button.dart';
+import 'package:vitalapp/components/qr_code_with_logo/qr_code_with_logo.dart';
 import 'package:vitalapp/components/scroll_list.dart';
 import 'package:vitalapp/consts/styles.dart';
 import 'package:vitalapp/database/entities/defines.dart';
@@ -15,12 +15,12 @@ import 'package:vitalapp/pages/check/children_follow_up_record/widgets/children_
 import 'package:vitalapp/pages/check/follow_up/widgets/follow_up_from.dart';
 import 'package:vitalapp/pages/check/maternal_health_management/widgets/delete_follow_up_record_button.dart';
 import 'package:vitalapp/pages/check/prescription/pediatric_prescription_collection.dart';
+import 'package:vitalapp/pages/check/prescription/prescription_form_keys.dart';
 import 'package:vitalapp/pages/check/widgets/configurable_card.dart';
 import 'package:vitalapp/pages/form/form_info.dart';
 import 'package:vitalapp/pages/medical/controller.dart';
 import 'package:vitalapp/pages/patient/list/widgets/status.dart';
 import 'package:vitalapp/pages/widgets/record_common_item.dart';
-import 'package:fis_lib_qrcode/qr_flutter.dart';
 
 class ChildrenFollowUpRecordPage
     extends GetView<ChildrenFollowUpRecordController> {
@@ -403,21 +403,20 @@ class _followUpRecordCard extends StatelessWidget {
       child: VButton(
         onTap: () async {
           // 1111
-          List<String> previewUrlList =
+          List<Map<String, dynamic>> previewList =
               await controller.sharePrescription(dataDto);
           const designWidth = 1280.0; // 设计尺寸宽度:1280
           final width = Get.width;
           final scale = width / designWidth; // 计算缩放比例
-          if (previewUrlList.length == 0 ||
-              !previewUrlList.any((element) => element.isNotNullOrEmpty)) {
+          if (previewList.length == 0) {
             PromptBox.toast("暂未生成处方");
             return;
           }
           Get.dialog(
             VAlertDialog(
               title: "分享处方",
-              width: width * 0.4 / scale,
-              content: _buildQrcode(previewUrlList),
+              width: width * 0.8 / scale,
+              content: _buildQrcode(previewList),
             ),
           );
         },
@@ -427,22 +426,32 @@ class _followUpRecordCard extends StatelessWidget {
   }
 
   ///二维码
-  Widget _buildQrcode(List<String> qrCodes) {
-    return Center(
-      child: Wrap(
-        children: qrCodes
-            .map(
-              (e) => QRCodeWithLogo(
-                e,
-                codeStatement: "请扫描",
-                operationStatement: "复制链接",
-                size: 120,
-                operationSuccessCallback: () {
-                  PromptBox.toast("复制成功");
-                },
-              ),
-            )
-            .toList(),
+  Widget _buildQrcode(List<Map<String, dynamic>> qrCodes) {
+    final scrollController = ScrollController();
+    return AlwaysScrollListView(
+      scrollController: scrollController,
+      child: ListView(
+        controller: scrollController,
+        children: [
+          Center(
+            child: Wrap(
+              children: qrCodes
+                  .map(
+                    (e) => VQRCodeWithLogo(
+                      e["previewUrl"],
+                      codeStatement:
+                          PrescriptionFormKeys.AllChildFormKeys[e["key"]],
+                      operationStatement: "复制链接",
+                      size: 150,
+                      operationSuccessCallback: () {
+                        PromptBox.toast("复制成功");
+                      },
+                    ),
+                  )
+                  .toList(),
+            ),
+          ),
+        ],
       ),
     );
     ;

+ 9 - 2
lib/pages/check/follow_up_record/controller.dart

@@ -271,12 +271,19 @@ class FollowUpRecordController extends FControllerBase {
     );
   }
 
-  Future<String> sharePrescription(
+  Future<Map<String, dynamic>> sharePrescription(
     FollowUpRecordDataDTO dataDTO,
   ) async {
     PrescriptionDTO? prescription =
         await getPrescriptionDetailByFollowAnPatient(dataDTO.code!);
-    return prescription?.previewUrl ?? "";
+    if (prescription == null) {
+      return {};
+    }
+
+    return {
+      "previewUrl": prescription.previewUrl ?? "",
+      "key": prescription.prescriptionTemplateKey ?? "",
+    };
   }
 
   toCheckPage(

+ 17 - 13
lib/pages/check/follow_up_record/view.dart

@@ -7,17 +7,18 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/button.dart';
+import 'package:vitalapp/components/qr_code_with_logo/qr_code_with_logo.dart';
 import 'package:vitalapp/consts/styles.dart';
 import 'package:vitalapp/database/entities/defines.dart';
 import 'package:vitalapp/pages/check/follow_up/widgets/follow_up_from.dart';
 import 'package:vitalapp/pages/check/follow_up_record/controller.dart';
 import 'package:vitalapp/pages/check/maternal_health_management/widgets/delete_follow_up_record_button.dart';
+import 'package:vitalapp/pages/check/prescription/prescription_form_keys.dart';
 import 'package:vitalapp/pages/check/widgets/configurable_card.dart';
 import 'package:vitalapp/pages/form/form_info.dart';
 import 'package:vitalapp/pages/medical/controller.dart';
 import 'package:vitalapp/pages/patient/list/widgets/status.dart';
 import 'package:vitalapp/pages/widgets/record_common_item.dart';
-import 'package:fis_lib_qrcode/qr_flutter.dart';
 
 class FollowUpRecordPage extends GetView<FollowUpRecordController> {
   const FollowUpRecordPage({
@@ -382,11 +383,12 @@ class _followUpRecordCard extends StatelessWidget {
       child: VButton(
         onTap: () async {
           // 1111
-          String previewUrl = await controller.sharePrescription(dataDto);
+          Map<String, dynamic> preview =
+              await controller.sharePrescription(dataDto);
           const designWidth = 1280.0; // 设计尺寸宽度:1280
           final width = Get.width;
           final scale = width / designWidth; // 计算缩放比例
-          if (previewUrl == "") {
+          if (preview["previewUrl"] == "" || preview["previewUrl"] == null) {
             PromptBox.toast("暂未生成处方");
             return;
           }
@@ -394,7 +396,7 @@ class _followUpRecordCard extends StatelessWidget {
             VAlertDialog(
               title: "分享处方",
               width: width * 0.4 / scale,
-              content: _buildQrcode(previewUrl),
+              content: _buildQrcode(preview),
             ),
           );
         },
@@ -404,15 +406,17 @@ class _followUpRecordCard extends StatelessWidget {
   }
 
   ///二维码
-  Widget _buildQrcode(String qrCode) {
-    return QRCodeWithLogo(
-      qrCode,
-      codeStatement: "请扫描二维码",
-      operationStatement: "复制链接",
-      size: 200,
-      operationSuccessCallback: () {
-        PromptBox.toast("复制成功");
-      },
+  Widget _buildQrcode(Map<String, dynamic> qr) {
+    return Container(
+      child: VQRCodeWithLogo(
+        qr["previewUrl"],
+        codeStatement: PrescriptionFormKeys.AllFormKeys[qr["key"]] ?? '',
+        operationStatement: "复制链接",
+        size: 200,
+        operationSuccessCallback: () {
+          PromptBox.toast("复制成功");
+        },
+      ),
     );
   }
 }

+ 9 - 4
lib/pages/check/maternal_health_management/controller.dart

@@ -154,17 +154,22 @@ class MaternalHealthManagementController extends GetxController {
     return "";
   }
 
-  Future<List<String>> sharePrescription(
+  Future<List<Map<String, dynamic>>> sharePrescription(
     FollowUpRecordDataDTO dataDTO,
   ) async {
-    List<String> previewUrlList = [];
+    List<Map<String, dynamic>> previewList = [];
     List<PrescriptionDTO>? prescriptionList =
         await getPrescriptionList(dataDTO.code!);
     for (PrescriptionDTO prescription in prescriptionList ?? []) {
-      previewUrlList.add(prescription.previewUrl ?? "");
+      if (prescription.previewUrl != null) {
+        previewList.add({
+          "previewUrl": prescription.previewUrl ?? "",
+          "key": prescription.prescriptionTemplateKey,
+        });
+      }
     }
 
-    return previewUrlList;
+    return previewList;
   }
 
   Future<List<PrescriptionDTO>?> getPrescriptionList(

+ 33 - 23
lib/pages/check/maternal_health_management/view.dart

@@ -7,10 +7,13 @@ import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/button.dart';
 import 'package:vitalapp/components/no_data_view.dart';
+import 'package:vitalapp/components/qr_code_with_logo/qr_code_with_logo.dart';
+import 'package:vitalapp/components/scroll_list.dart';
 import 'package:vitalapp/consts/styles.dart';
 import 'package:vitalapp/database/entities/defines.dart';
 import 'package:vitalapp/managers/interfaces/follow_up.dart';
 import 'package:vitalapp/pages/check/prescription/pediatric_prescription_collection.dart';
+import 'package:vitalapp/pages/check/prescription/prescription_form_keys.dart';
 import 'package:vitalapp/pages/form/form_info.dart';
 import 'package:vitalapp/pages/patient/list/widgets/status.dart';
 import 'package:vitalapp/pages/widgets/record_common_item.dart';
@@ -21,7 +24,6 @@ import 'forms/postpartum_follow_up.dart';
 import 'widgets/delete_follow_up_record_button.dart';
 import 'widgets/form_select_dialog.dart';
 import 'controller.dart';
-import 'package:fis_lib_qrcode/qr_flutter.dart';
 
 class MaternalHealthManagement
     extends GetView<MaternalHealthManagementController> {
@@ -416,9 +418,9 @@ class MaternalHealthManagement
       child: VButton(
         onTap: () async {
           // 1111
-          List<String> previewUrlList =
+          List<Map<String, dynamic>> previewList =
               await controller.sharePrescription(dataDto);
-          if (previewUrlList.length == 0) {
+          if (previewList.length == 0) {
             PromptBox.toast("暂未生成处方");
             return;
           }
@@ -429,7 +431,7 @@ class MaternalHealthManagement
             VAlertDialog(
               title: "分享处方",
               width: width * 0.4 / scale,
-              content: _buildQrcode(previewUrlList),
+              content: _buildQrcode(previewList),
             ),
           );
         },
@@ -439,26 +441,34 @@ class MaternalHealthManagement
   }
 
   ///二维码
-  Widget _buildQrcode(List<String> qrCodes) {
-    return Center(
-      child: Wrap(
-        children: qrCodes
-            .map(
-              (e) => Container(
-                padding: EdgeInsets.symmetric(horizontal: 8),
-                child: QRCodeWithLogo(
-                  e,
-                  codeStatement: "请扫描",
-                  operationStatement: "复制链接",
-                  size: 120,
-                  operationSuccessCallback: () {
-                    PromptBox.toast("复制成功");
-                  },
-                ),
-              ),
-            )
-            .toList(),
+  Widget _buildQrcode(List<Map<String, dynamic>> qrCodes) {
+    final scrollController = ScrollController();
+    return AlwaysScrollListView(
+      scrollController: scrollController,
+      child: ListView(
+        controller: scrollController,
+        children: [
+          Center(
+            child: Wrap(
+              children: qrCodes
+                  .map(
+                    (e) => VQRCodeWithLogo(
+                      e["previewUrl"],
+                      codeStatement: PrescriptionFormKeys
+                          .AllPregnantWomenFormKeys[e["key"]],
+                      operationStatement: "复制链接",
+                      size: 150,
+                      operationSuccessCallback: () {
+                        PromptBox.toast("复制成功");
+                      },
+                    ),
+                  )
+                  .toList(),
+            ),
+          ),
+        ],
       ),
     );
+    ;
   }
 }

+ 10 - 9
lib/pages/check/tuberculosis_management_record/view.dart

@@ -7,18 +7,18 @@ import 'package:vitalapp/architecture/utils/prompt_box.dart';
 import 'package:vitalapp/components/alert_dialog.dart';
 import 'package:vitalapp/components/appbar.dart';
 import 'package:vitalapp/components/button.dart';
+import 'package:vitalapp/components/qr_code_with_logo/qr_code_with_logo.dart';
 import 'package:vitalapp/consts/styles.dart';
 import 'package:vitalapp/database/entities/defines.dart';
 import 'package:vitalapp/pages/check/follow_up/widgets/follow_up_from.dart';
 import 'package:vitalapp/pages/check/follow_up_record/controller.dart';
 import 'package:vitalapp/pages/check/maternal_health_management/widgets/delete_follow_up_record_button.dart';
-import 'package:vitalapp/pages/check/tuberculosis_management_record/controller.dart';
+import 'package:vitalapp/pages/check/prescription/prescription_form_keys.dart';
 import 'package:vitalapp/pages/check/tuberculosis_management_record/widget/FormSelectDialog.dart';
 import 'package:vitalapp/pages/check/widgets/configurable_card.dart';
 import 'package:vitalapp/pages/medical/controller.dart';
 import 'package:vitalapp/pages/patient/list/widgets/status.dart';
 import 'package:vitalapp/pages/widgets/record_common_item.dart';
-import 'package:fis_lib_qrcode/qr_flutter.dart';
 
 class TuberculosisManagementView extends GetView<FollowUpRecordController> {
   const TuberculosisManagementView({
@@ -391,11 +391,12 @@ class _followUpRecordCard extends StatelessWidget {
       child: VButton(
         onTap: () async {
           // 1111
-          String previewUrl = await controller.sharePrescription(dataDto);
+          Map<String, dynamic> preview =
+              await controller.sharePrescription(dataDto);
           const designWidth = 1280.0; // 设计尺寸宽度:1280
           final width = Get.width;
           final scale = width / designWidth; // 计算缩放比例
-          if (previewUrl == "") {
+          if (preview["previewUrl"] == "" || preview["previewUrl"] == null) {
             PromptBox.toast("暂未生成处方");
             return;
           }
@@ -403,7 +404,7 @@ class _followUpRecordCard extends StatelessWidget {
             VAlertDialog(
               title: "分享处方",
               width: width * 0.4 / scale,
-              content: _buildQrcode(previewUrl),
+              content: _buildQrcode(preview),
             ),
           );
         },
@@ -413,10 +414,10 @@ class _followUpRecordCard extends StatelessWidget {
   }
 
   ///二维码
-  Widget _buildQrcode(String qrCode) {
-    return QRCodeWithLogo(
-      qrCode,
-      codeStatement: "请扫描二维码",
+  Widget _buildQrcode(Map<String, dynamic> qr) {
+    return VQRCodeWithLogo(
+      qr["previewUrl"],
+      codeStatement: PrescriptionFormKeys.AllFormKeys[qr["key"]],
       operationStatement: "复制链接",
       size: 200,
       operationSuccessCallback: () {