Parcourir la source

1、对接签字信息

guanxinyi il y a 1 an
Parent
commit
5f310ae88d

+ 5 - 1
lib/managers/interfaces/service_pack.dart

@@ -4,7 +4,7 @@
  * @Author: guanxiaoxin
  * @Date: 2023-09-13 13:12:23
  * @LastEditors: guanxiaoxin
- * @LastEditTime: 2023-09-13 13:14:48
+ * @LastEditTime: 2023-09-14 15:20:50
  * @FilePath: \VNoteApp\lib\managers\interfaces\service_pack.dart
  */
 import 'package:fis_jsonrpc/rpc.dart';
@@ -15,4 +15,8 @@ abstract class IServicePackManager implements IManager {
   /// 获取服务包分页列表
   Future<PageCollection<ServicePackDTO>?> getServicePackList(
       PageRequest request);
+
+  /// 获取服务包项目分页列表
+  Future<PageCollection<ServiceItemDTO>?> getServiceItemList(
+      PageRequest request);
 }

+ 16 - 0
lib/managers/service_pack.dart

@@ -11,6 +11,22 @@ class ServicePackManager implements IServicePackManager {
     try {
       request.token = Store.user.token;
       final result = await rpc.servicePack.getServicePackPageAsync(request);
+      print('🥔');
+      print(result);
+      print('🥔');
+      return result;
+    } catch (e) {
+      logger.e("getServicePackPageAsync query patient paged list error.", e);
+      return null;
+    }
+  }
+
+  @override
+  Future<PageCollection<ServiceItemDTO>?> getServiceItemList(
+      PageRequest request) async {
+    try {
+      request.token = Store.user.token;
+      final result = await rpc.servicePack.getServiceItemPageAsync(request);
       return result;
     } catch (e) {
       logger.e("PatientManager query patient paged list error.", e);

+ 22 - 12
lib/pages/contract/contract_template/controller.dart

@@ -10,15 +10,18 @@ import 'state.dart';
 
 class ContractTemplateController extends FControllerBase {
   final state = ContractTemplateControllerState();
-  final _contractTemplateManager = Get.find<IContractTemplateManager>();
+  final contractTemplateManager = Get.find<IContractTemplateManager>();
   final _contractManager = Get.find<IContractManager>();
   PatientDTO patient = PatientDTO();
+  String servicePackageNames = '';
+  String servicePackageCodes = '';
   @override
   void onInit() {
     final p = Get.parameters;
     state.templateCode = p["templateCode"]!;
     patient = PatientDTO.fromJson(json.decode(p["patientInfo"]!));
-
+    servicePackageNames = p["servicePackageNames"] ?? '';
+    servicePackageCodes = p["servicePackageCodes"] ?? '';
     super.onInit();
   }
 
@@ -31,7 +34,7 @@ class ContractTemplateController extends FControllerBase {
   }
 
   Future<void> _loadData() async {
-    final dto = await _contractTemplateManager
+    final dto = await contractTemplateManager
         .getContractTemplateDetail(state.templateCode);
     if (dto != null) {
       state.templateContent = dto.templateContent ?? '';
@@ -58,13 +61,16 @@ class ContractTemplateController extends FControllerBase {
   }
 
   Future<void> createContractRecord() async {
-    await _contractManager
-        .createContractRecordAsync(CreateContractRecordRequest(
-      contractedPatient: patient.code,
-      contractedTime: DateTime.now(),
-      serviceStartDate: DateTime.now(),
-      contractedFileUrl: _mockBase64,
-    ));
+    await _contractManager.createContractRecordAsync(
+      CreateContractRecordRequest(
+        contractedPatient: patient.code,
+        contractedTime: DateTime.now(),
+        serviceStartDate: DateTime.now(),
+        serviceEndDate: DateTime.now().subtract(const Duration(days: 365)),
+        contractedFileUrl: _mockBase64,
+        servicePacks: servicePackageCodes.split('、'),
+      ),
+    );
   }
 
   String getValueForKey(String key) {
@@ -87,11 +93,15 @@ class ContractTemplateController extends FControllerBase {
     } else if (key == 'phone') {
       return patient.phone ?? '';
     } else if (key == 'servicesPackageContent') {
-      return 'Monday';
+      return servicePackageNames;
     } else if (key == 'signaturePartyA') {
       return '<img src=$_mockBase64  style="width: 110px; height: 30px;" alt="图片">';
     } else if (key == 'signaturePartyB') {
-      return '<img src=$_mockBase64  style="width: 110px; height: 30px;" alt="图片">';
+      if (state.mock2Base64.isEmpty) {
+        return '';
+      } else {
+        return '<img src=${state.mock2Base64}  style="width: 110px; height: 30px;" alt="图片">';
+      }
     } else if (key == 'signatureDate') {
       return 'Monday';
     }

+ 4 - 0
lib/pages/contract/contract_template/state.dart

@@ -6,8 +6,12 @@ class ContractTemplateControllerState {
   String templateCode = "";
 
   final RxString _templateContent = RxString("");
+  final RxString _mock2Base64 = RxString("");
 
   /// 模板
   String get templateContent => _templateContent.value;
   set templateContent(String val) => _templateContent.updateValue(val);
+
+  String get mock2Base64 => _mock2Base64.value;
+  set mock2Base64(String val) => _mock2Base64.updateValue(val);
 }

+ 18 - 10
lib/pages/contract/contract_template/view.dart

@@ -6,7 +6,8 @@ import 'package:vnoteapp/components/appbar.dart';
 import 'controller.dart';
 
 class ContractTemplatePage extends GetView<ContractTemplateController> {
-  const ContractTemplatePage({super.key});
+  ContractTemplatePage({super.key});
+  late InAppWebViewController? _webViewController;
 
   @override
   Widget build(BuildContext context) {
@@ -20,12 +21,6 @@ class ContractTemplatePage extends GetView<ContractTemplateController> {
         actions: [
           TextButton(
             onPressed: () async {
-              // Get.toNamed(
-              //   "/contract/contract_template",
-              //   parameters: {
-              //     "templateCode": "53C3323BB6444A109B2369703EFFDFF9"
-              //   },
-              // );
               await controller.createContractRecord();
               Get.back();
             },
@@ -68,7 +63,9 @@ class ContractTemplatePage extends GetView<ContractTemplateController> {
                             ),
                           ),
                           onWebViewCreated:
-                              (InAppWebViewController controller) {},
+                              (InAppWebViewController controller) {
+                            _webViewController = controller;
+                          },
                         );
                       }
                     }),
@@ -90,9 +87,20 @@ class ContractTemplatePage extends GetView<ContractTemplateController> {
                     ),
                     child: TextButton(
                       onPressed: () async {
-                        print('sdddddddddddddddd');
                         final result = await Get.toNamed("/contract/signature");
-                        print(result);
+                        controller.state.mock2Base64 = result;
+                        final dto = await controller.contractTemplateManager
+                            .getContractTemplateDetail(
+                                controller.state.templateCode);
+                        if (dto != null) {
+                          controller.state.templateContent =
+                              dto.templateContent ?? '';
+                          controller.getkey();
+                        }
+                        _webViewController?.loadData(
+                            data: controller.state.templateContent,
+                            mimeType: 'text/html',
+                            encoding: 'utf-8');
                       },
                       child: const Text(
                         '签字',

+ 23 - 0
lib/pages/contract/package_info/controller.dart

@@ -0,0 +1,23 @@
+import 'package:get/get.dart';
+import 'package:vnoteapp/architecture/defines.dart';
+
+import 'state.dart';
+
+class PackageInfoController extends FControllerBase {
+  final state = PackageInfoState();
+
+  @override
+  void onInit() {
+    final p = Get.parameters;
+    // state.servicePack = p["servicePack"]!;
+    super.onInit();
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    _loadData();
+  }
+
+  Future<void> _loadData() async {}
+}

+ 3 - 0
lib/pages/contract/package_info/state.dart

@@ -0,0 +1,3 @@
+class PackageInfoState {
+  // servicePack
+}

+ 23 - 0
lib/pages/contract/package_info/view.dart

@@ -0,0 +1,23 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:vnoteapp/components/appbar.dart';
+
+import 'controller.dart';
+
+/// 包详情
+class PackageInfoPage extends GetView<PackageInfoController> {
+  const PackageInfoPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: VAppBar(titleText: "服务包详情"),
+      body: Center(
+        child: ElevatedButton(
+          child: const Text("MOCK"),
+          onPressed: () {},
+        ),
+      ),
+    );
+  }
+}

+ 56 - 4
lib/pages/contract/package_list/controller.dart

@@ -28,15 +28,31 @@ class ServicePackageContractController extends FControllerBase {
   Future<void> _loadData() async {
     final dto = await _patientManager.getDetail(state.patientCode);
 
-    /// server 暂时没根据人群获取服务包列表这边先用全部服务包
-    final result = await _servicePackManager.getServicePackList(
+    try {
+      /// server 暂时没根据人群获取服务包列表这边先用全部服务包
+      final result = await _servicePackManager.getServicePackList(
+        PageRequest(
+          pageIndex: 1,
+          pageSize: 10,
+        ),
+      );
+      print('🌶');
+
+      print(result);
+
+      normalOptions = Get.find<CrowdLabelsController>().state.normalOptions;
+      state.servicePackageItems = result?.pageData ?? [];
+    } catch (e) {
+      print(e);
+    }
+
+    final getServiceItemResult = await _servicePackManager.getServiceItemList(
       PageRequest(
         pageIndex: 1,
         pageSize: 100,
       ),
     );
-    normalOptions = Get.find<CrowdLabelsController>().state.normalOptions;
-    state.servicePackageItems = result?.pageData ?? [];
+    state.serviceItems = getServiceItemResult?.pageData ?? [];
     if (dto != null) {
       dto.birthday = dto.birthday!.toLocal();
       state.updateDto(dto);
@@ -57,4 +73,40 @@ class ServicePackageContractController extends FControllerBase {
     }
     return labels;
   }
+
+  String getServiceItemsName(List<String> serviceItems) {
+    List<String> serviceItemNames = [];
+    for (var element in state.serviceItems) {
+      if (serviceItems.contains(element.code)) {
+        serviceItemNames.add(element.name ?? '');
+      }
+    }
+    if (serviceItemNames.isEmpty) {
+      return '暂无';
+    }
+    return serviceItemNames.join('、');
+  }
+
+  // 切换选择的服务包
+  void changeServicePackage(ServicePackDTO servicePackDTO) {
+    List<ServicePackDTO> selectedServicePackage = state.selectedServicePackage;
+    if (state.selectedServicePackage.contains(servicePackDTO)) {
+      selectedServicePackage.remove(servicePackDTO);
+    } else {
+      selectedServicePackage.add(servicePackDTO);
+    }
+    state.selectedServicePackage = selectedServicePackage;
+    setSelectedServicePackages();
+  }
+
+  void setSelectedServicePackages() {
+    List<String> selectedServicePackageNameList = [];
+    List<String> selectedServicePackageCodeList = [];
+    for (var element in state.selectedServicePackage) {
+      selectedServicePackageNameList.add(element.name ?? "");
+      selectedServicePackageCodeList.add(element.code ?? "");
+    }
+    state.selectedServicePackageName = selectedServicePackageNameList.join('、');
+    state.selectedServicePackageCode = selectedServicePackageCodeList.join('、');
+  }
 }

+ 20 - 0
lib/pages/contract/package_list/state.dart

@@ -28,8 +28,13 @@ class ServicePackageContractState {
   List<String>? get crowdLabelCodes => _dto.value.crowdLabels;
   // final RxList<dynamic> _servicePackageItems = RxList.empty();
   final RxList<ServicePackDTO> _servicePackageItems = RxList();
+
+  final RxList<ServiceItemDTO> _serviceItems = RxList();
+
   final RxList<ServicePackDTO> _selectedServicePackage =
       RxList<ServicePackDTO>();
+  final RxString _selectedServicePackageName = RxString('');
+  final RxString _selectedServicePackageCode = RxString('');
   final Rx<PatientDTO> _dto = Rx<PatientDTO>(
     PatientDTO(
       patientName: "",
@@ -51,12 +56,27 @@ class ServicePackageContractState {
   set servicePackageItems(List<ServicePackDTO> val) =>
       _servicePackageItems.value = val;
 
+  /// 服务包集合
+  List<ServiceItemDTO> get serviceItems =>
+      UnmodifiableListView(_serviceItems.toList());
+  set serviceItems(List<ServiceItemDTO> val) => _serviceItems.value = val;
+
   /// 选择的服务包集合
   List<ServicePackDTO> get selectedServicePackage =>
       _selectedServicePackage.toList();
   set selectedServicePackage(List<ServicePackDTO> val) =>
       _selectedServicePackage.value = val;
 
+  /// 服务包名
+  String get selectedServicePackageName => _selectedServicePackageName.value;
+  set selectedServicePackageName(String val) =>
+      _selectedServicePackageName.value = val;
+
+  /// 服务包code
+  String get selectedServicePackageCode => _selectedServicePackageCode.value;
+  set selectedServicePackageCode(String val) =>
+      _selectedServicePackageCode.value = val;
+
   /// 是否展开
   bool get isExpendPatient => _isExpendPatient.value;
   set isExpendPatient(bool val) => _isExpendPatient.value = val;

+ 209 - 79
lib/pages/contract/package_list/view.dart

@@ -4,6 +4,7 @@ import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:intl/intl.dart';
+import 'package:vnoteapp/components/alert_dialog.dart';
 import 'package:vnoteapp/components/appbar.dart';
 import 'package:vnoteapp/components/cell.dart';
 import 'package:vnoteapp/components/dialog_date.dart';
@@ -31,7 +32,11 @@ class ServicePackageContractPage
                 "/contract/contract_template",
                 parameters: {
                   "templateCode": "53C3323BB6444A109B2369703EFFDFF9",
-                  "patientInfo": json.encode(controller.patient.toJson())
+                  "patientInfo": json.encode(controller.patient.toJson()),
+                  "servicePackageCodes":
+                      controller.state.selectedServicePackageCode,
+                  "servicePackageNames":
+                      controller.state.selectedServicePackageName,
                 },
               );
             },
@@ -69,42 +74,118 @@ class ServicePackageContractPage
     );
   }
 
-  /// TODO baka 需要拆分
   Drawer _servicePackageDrawer(BuildContext context) {
     const double titleSize = 20;
     const double labelSize = 18;
+    Widget buildAlertDialog(ServicePackDTO servicePackDTO) {
+      return VAlertDialog(
+        title: '${servicePackDTO.name}详情',
+        content: Container(
+            height: 200,
+            alignment: Alignment.topLeft,
+            padding: const EdgeInsets.symmetric(horizontal: 15),
+            child: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                LayoutBuilder(
+                  builder: (BuildContext context, BoxConstraints constraints) {
+                    return ConstrainedBox(
+                      constraints: const BoxConstraints(
+                        maxHeight: 100,
+                      ),
+                      child: Scrollbar(
+                        thumbVisibility: true,
+                        child: ListView(
+                          shrinkWrap: true,
+                          children: [
+                            Text(
+                              servicePackDTO.content ?? "",
+                              style: const TextStyle(fontSize: 16),
+                            ),
+                          ],
+                        ),
+                      ),
+                    );
+                  },
+                ),
+                const SizedBox(
+                  height: 5,
+                ),
+                const Text(
+                  '服务项目',
+                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),
+                ),
+                const SizedBox(
+                  height: 5,
+                ),
+                Expanded(
+                  child: Text(
+                    controller.getServiceItemsName(
+                      servicePackDTO.items ?? [],
+                    ),
+                  ),
+                )
+              ],
+            )),
+        // actions: <Widget>[
+        //   TextButton(
+        //     child: const Text('取消'),
+        //     onPressed: () {
+        //       Navigator.of(context).pop(); // 关闭对话框
+        //     },
+        //   ),
+        //   TextButton(
+        //     child: const Text('确定'),
+        //     onPressed: () {
+        //       // 在这里处理确定按钮的逻辑
+        //       Navigator.of(context).pop(); // 关闭对话框
+        //     },
+        //   ),
+        // ],
+      );
+    }
 
     Widget buildItem(ServicePackDTO servicePackDTO) {
       return InkWell(
         onTap: () {
-          List<ServicePackDTO> selectedServicePackage =
-              controller.state.selectedServicePackage;
-          if (controller.state.selectedServicePackage
-              .contains(servicePackDTO)) {
-            selectedServicePackage.remove(servicePackDTO);
-          } else {
-            selectedServicePackage.add(servicePackDTO);
-          }
-          controller.state.selectedServicePackage = selectedServicePackage;
+          controller.changeServicePackage(servicePackDTO);
         },
         child: Container(
-          margin: const EdgeInsets.all(10),
-          padding: const EdgeInsets.all(30),
-          color: Colors.white,
+          margin: const EdgeInsets.symmetric(
+            vertical: 10,
+            horizontal: 50,
+          ),
+          padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 15),
+          decoration: BoxDecoration(
+            color: Colors.white,
+            borderRadius: const BorderRadius.all(
+              Radius.circular(
+                8,
+              ),
+            ),
+            border: Border.all(
+              color: controller.state.selectedServicePackage
+                      .contains(servicePackDTO)
+                  ? const Color.fromRGBO(34, 164, 211, 1)
+                  : Colors.transparent,
+              width: 2,
+            ),
+          ),
           child: Row(
             children: [
               Container(
-                  padding: const EdgeInsets.only(right: 20),
-                  child: Obx(
-                    () => Icon(
-                      Icons.check_circle_outline,
-                      size: 35,
-                      color: controller.state.selectedServicePackage
-                              .contains(servicePackDTO)
-                          ? const Color.fromRGBO(34, 164, 211, 1)
-                          : Colors.grey.shade500,
-                    ),
-                  )),
+                padding: const EdgeInsets.only(right: 20),
+                child: Obx(
+                  () => Icon(
+                    Icons.check_circle_outline,
+                    size: 35,
+                    color: controller.state.selectedServicePackage
+                            .contains(servicePackDTO)
+                        ? const Color.fromRGBO(34, 164, 211, 1)
+                        : Colors.grey.shade500,
+                  ),
+                ),
+              ),
               Expanded(
                 child: Column(
                   children: [
@@ -152,11 +233,15 @@ class ServicePackageContractPage
                                 style: TextStyle(fontSize: titleSize),
                               ),
                               Expanded(
-                                child: Text(
-                                  servicePackDTO.content ?? '',
-                                  overflow: TextOverflow.ellipsis,
-                                  maxLines: 3,
-                                  style: const TextStyle(fontSize: labelSize),
+                                child: Container(
+                                  alignment: Alignment.centerLeft,
+                                  height: 50,
+                                  child: Text(
+                                    servicePackDTO.content ?? '',
+                                    overflow: TextOverflow.ellipsis,
+                                    maxLines: 2,
+                                    style: const TextStyle(fontSize: labelSize),
+                                  ),
                                 ),
                               ),
                             ],
@@ -174,31 +259,19 @@ class ServicePackageContractPage
                     '查看',
                     style: TextStyle(fontSize: 18),
                   ),
-                  onPressed: () {
-                    showDialog(
-                      context: context,
-                      builder: (BuildContext context) {
-                        return AlertDialog(
-                          title: const Text('提示'),
-                          content: const Text('这是一个AlertDialog示例。'),
-                          actions: <Widget>[
-                            TextButton(
-                              child: const Text('取消'),
-                              onPressed: () {
-                                Navigator.of(context).pop(); // 关闭对话框
-                              },
-                            ),
-                            TextButton(
-                              child: const Text('确定'),
-                              onPressed: () {
-                                // 在这里处理确定按钮的逻辑
-                                Navigator.of(context).pop(); // 关闭对话框
-                              },
-                            ),
-                          ],
-                        );
+                  onPressed: () async {
+                    await Get.toNamed(
+                      '/contract/package_info',
+                      parameters: {
+                        "servicePack": json.encode(servicePackDTO.toJson()),
                       },
                     );
+                    // showDialog(
+                    //   context: context,
+                    //   builder: (BuildContext context) {
+                    //     return buildAlertDialog(servicePackDTO);
+                    //   },
+                    // );
                   },
                 ),
               ),
@@ -208,6 +281,61 @@ class ServicePackageContractPage
       );
     }
 
+    Widget buildCancelButton() {
+      return TextButton(
+        onPressed: () {
+          Get.back();
+        },
+        child: const Text(
+          '取消',
+          style: TextStyle(fontSize: 25),
+        ),
+      );
+    }
+
+    Widget buildConfirmButton() {
+      return TextButton(
+        onPressed: () {},
+        child: const Text(
+          '确定',
+          style: TextStyle(fontSize: 25),
+        ),
+      );
+    }
+
+    Widget buildHeader() {
+      return Container(
+        decoration: const BoxDecoration(
+          color: Colors.white,
+        ),
+        height: 90,
+        padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
+        child: Row(
+          mainAxisAlignment: MainAxisAlignment.spaceBetween,
+          children: [
+            buildCancelButton(),
+            buildConfirmButton(),
+          ],
+        ),
+      );
+    }
+
+    Widget buildServicePackageList() {
+      return Obx(
+        () => Expanded(
+          child: controller.state.servicePackageItems.isEmpty
+              ? const Center(
+                  child: Text('暂无数据'),
+                )
+              : ListView(
+                  children: controller.state.servicePackageItems
+                      .map((ServicePackDTO e) => buildItem(e))
+                      .toList(),
+                ),
+        ),
+      );
+    }
+
     return Drawer(
       shape: const RoundedRectangleBorder(
         borderRadius: BorderRadiusDirectional.horizontal(
@@ -217,13 +345,18 @@ class ServicePackageContractPage
       width: MediaQuery.of(context).size.width * 0.7,
       child: Container(
         color: Colors.grey.shade300,
-        padding: const EdgeInsets.all(50),
-        child: Obx(
-          () => ListView(
-            children: controller.state.servicePackageItems
-                .map((ServicePackDTO e) => buildItem(e))
-                .toList(),
-          ),
+        child: Column(
+          mainAxisSize: MainAxisSize.max,
+          children: [
+            // buildHeader(),
+            const SizedBox(
+              height: 30,
+            ),
+            buildServicePackageList(),
+            const SizedBox(
+              height: 10,
+            ),
+          ],
         ),
       ),
     );
@@ -266,7 +399,6 @@ class ServicePackageContractPage
                   initialValue: controller.state.serviceStartDate,
                 ).show();
                 controller.state.serviceStartDate = result;
-                print(result);
               },
             ),
           ),
@@ -327,10 +459,14 @@ class ServicePackageContractPage
               controller.state.isExpendPatient =
                   !controller.state.isExpendPatient;
             },
-            icon: const Icon(
-              Icons.expand_circle_down_outlined,
-              color: Color.fromRGBO(34, 164, 211, 1),
-              size: 30,
+            icon: Obx(
+              () => Icon(
+                controller.state.isExpendPatient
+                    ? Icons.keyboard_arrow_up_rounded
+                    : Icons.keyboard_arrow_down_rounded,
+                color: Colors.grey.shade400,
+                size: 30,
+              ),
             ),
           ),
         )
@@ -342,21 +478,15 @@ class ServicePackageContractPage
     return VPanel(
       child: VListFormCellGroup(
         children: [
-          VListFormCell(
-            label: '家庭医生服务包',
-            height: 70,
-            contentWidget: const SizedBox(
-              child: Row(
-                children: [
-                  SizedBox(
-                    height: 70,
-                  ),
-                ],
-              ),
+          Obx(
+            () => VListFormCell(
+              label: '家庭医生服务包',
+              height: 70,
+              content: controller.state.selectedServicePackageName,
+              onTap: () {
+                Scaffold.of(context).openEndDrawer();
+              },
             ),
-            onTap: () {
-              Scaffold.of(context).openEndDrawer();
-            },
           ),
           const VListFormCell(
             label: '备注',

+ 12 - 1
lib/routes/routes.dart

@@ -1,6 +1,8 @@
 import 'package:get/get.dart';
 import 'package:vnoteapp/pages/contract/contract_template/controller.dart';
 import 'package:vnoteapp/pages/contract/contract_template/view.dart';
+import 'package:vnoteapp/pages/contract/package_info/controller.dart';
+import 'package:vnoteapp/pages/contract/package_info/view.dart';
 import 'package:vnoteapp/pages/contract/package_list/controller.dart';
 import 'package:vnoteapp/pages/contract/package_list/view.dart';
 import 'package:vnoteapp/pages/contract/signature_board/controller.dart';
@@ -138,6 +140,15 @@ class Routes {
         },
       ),
     ),
+    GetPage(
+      name: "/contract/package_info",
+      page: () => const PackageInfoPage(),
+      binding: BindingsBuilder(
+        () {
+          Get.put(PackageInfoController());
+        },
+      ),
+    ),
     GetPage(
       name: "/contract/signature",
       page: () => const SignatureBoardPage(),
@@ -150,7 +161,7 @@ class Routes {
     ),
     GetPage(
       name: "/contract/contract_template",
-      page: () => const ContractTemplatePage(),
+      page: () => ContractTemplatePage(),
       binding: BindingsBuilder(
         () {
           Get.put(ContractTemplateController());