Quellcode durchsuchen

1、签约完善

guanxinyi vor 1 Jahr
Ursprung
Commit
e8f6e2aa4a

+ 6 - 0
lib/components/dialog_select.dart

@@ -3,6 +3,12 @@ import 'package:get/get.dart';
 
 import 'alert_dialog.dart';
 
+class FSelectModel {
+  FSelectModel({required this.name, required this.code});
+  final String name;
+  final String code;
+}
+
 class VDialogSelect<T, TValue> extends StatelessWidget {
   /// 数据集
   final List<T> source;

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

@@ -5,6 +5,7 @@ import 'package:get/get.dart';
 import 'package:vnoteapp/architecture/defines.dart';
 import 'package:vnoteapp/managers/interfaces/contract.dart';
 import 'package:vnoteapp/managers/interfaces/contract_template.dart';
+import 'package:vnoteapp/store/store.dart';
 
 import 'state.dart';
 
@@ -13,8 +14,12 @@ class ContractTemplateController extends FControllerBase {
   final contractTemplateManager = Get.find<IContractTemplateManager>();
   final _contractManager = Get.find<IContractManager>();
   PatientDTO patient = PatientDTO();
-  String servicePackageNames = '';
-  String servicePackageCodes = '';
+  String servicePackageNames = "";
+  String servicePackageCodes = "";
+  String serviceTime = "1";
+  String serviceStartDate = "";
+  String base64Image = "";
+  String notes = "";
   @override
   void onInit() {
     final p = Get.parameters;
@@ -22,6 +27,10 @@ class ContractTemplateController extends FControllerBase {
     patient = PatientDTO.fromJson(json.decode(p["patientInfo"]!));
     servicePackageNames = p["servicePackageNames"] ?? '';
     servicePackageCodes = p["servicePackageCodes"] ?? '';
+    serviceTime = p["serviceTime"] ?? '1';
+    serviceStartDate = p["serviceStartDate"] ?? '';
+    base64Image = p["base64Image"] ?? '';
+    notes = p["notes"] ?? '';
     super.onInit();
   }
 
@@ -47,7 +56,6 @@ class ContractTemplateController extends FControllerBase {
     Iterable<Match> matches = regExp.allMatches(state.templateContent);
     for (Match match in matches) {
       String? key = match.group(1);
-      print(key);
     }
     String replacedString = state.templateContent.replaceAllMapped(
       regExp,
@@ -65,10 +73,13 @@ class ContractTemplateController extends FControllerBase {
       CreateContractRecordRequest(
         contractedPatient: patient.code,
         contractedTime: DateTime.now(),
-        serviceStartDate: DateTime.now(),
-        serviceEndDate: DateTime.now().subtract(const Duration(days: 365)),
-        contractedFileUrl: _mockBase64,
+        serviceStartDate: DateTime.parse(serviceStartDate),
+        serviceEndDate: DateTime.parse(serviceStartDate)
+            .add(Duration(days: 365 * int.parse(serviceTime))),
+        contractedFileUrl: state.templateContent,
         servicePacks: servicePackageCodes.split('、'),
+        photos: ["data:image/png;base64,$base64Image"],
+        notes: notes,
       ),
     );
   }
@@ -77,13 +88,13 @@ class ContractTemplateController extends FControllerBase {
     // 根据键获取真实值的逻辑
     // 这里可以根据你的实际需求进行相应的处理
     if (key == 'doctorName') {
-      return '李四';
+      return Store.user.principalName;
     } else if (key == 'doctorTel') {
-      return 'Monday';
+      return Store.user.principalPhone;
     } else if (key == 'serviceTel') {
-      return '';
+      return Store.user.organizationPhone;
     } else if (key == 'serviceAgency') {
-      return 'Monday';
+      return Store.user.organizationName;
     } else if (key == 'patientName') {
       return patient.patientName ?? '';
     } else if (key == 'patientAddress') {
@@ -103,7 +114,7 @@ class ContractTemplateController extends FControllerBase {
         return '<img src=${state.mock2Base64}  style="width: 110px; height: 30px;" alt="图片">';
       }
     } else if (key == 'signatureDate') {
-      return 'Monday';
+      return '';
     }
 
     return ''; // 如果找不到对应的键值,可以返回null或者其他默认值

+ 19 - 2
lib/pages/contract/package_info/controller.dart

@@ -1,3 +1,6 @@
+import 'dart:convert';
+
+import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
 import 'package:vnoteapp/architecture/defines.dart';
 
@@ -5,11 +8,13 @@ import 'state.dart';
 
 class PackageInfoController extends FControllerBase {
   final state = PackageInfoState();
-
+  String servicePackString = '';
   @override
   void onInit() {
     final p = Get.parameters;
-    // state.servicePack = p["servicePack"]!;
+    servicePackString = p["servicePack"]!;
+
+    state.servicePack = ServicePackDTO.fromJson(jsonDecode(servicePackString));
     super.onInit();
   }
 
@@ -20,4 +25,16 @@ class PackageInfoController extends FControllerBase {
   }
 
   Future<void> _loadData() async {}
+  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('、');
+  }
 }

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

@@ -1,3 +1,18 @@
+import 'dart:collection';
+
+import 'package:fis_jsonrpc/rpc.dart';
+import 'package:get/get.dart';
+
 class PackageInfoState {
   // servicePack
+  final Rx<ServicePackDTO> _servicePack = Rx(ServicePackDTO());
+  final RxList<ServiceItemDTO> _serviceItems = RxList();
+
+  ServicePackDTO get servicePack => _servicePack.value;
+  set servicePack(ServicePackDTO val) => _servicePack.value = val;
+
+  /// 服务包集合
+  List<ServiceItemDTO> get serviceItems =>
+      UnmodifiableListView(_serviceItems.toList());
+  set serviceItems(List<ServiceItemDTO> val) => _serviceItems.value = val;
 }

+ 50 - 6
lib/pages/contract/package_info/view.dart

@@ -1,3 +1,4 @@
+import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:vnoteapp/components/appbar.dart';
@@ -7,17 +8,60 @@ import 'controller.dart';
 /// 包详情
 class PackageInfoPage extends GetView<PackageInfoController> {
   const PackageInfoPage({super.key});
+  Widget buildAlertDialog(ServicePackDTO servicePackDTO) {
+    return Container(
+        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 ?? [],
+                ),
+              ),
+            )
+          ],
+        ));
+  }
 
   @override
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: VAppBar(titleText: "服务包详情"),
-      body: Center(
-        child: ElevatedButton(
-          child: const Text("MOCK"),
-          onPressed: () {},
-        ),
-      ),
+      body: buildAlertDialog(controller.state.servicePack),
     );
   }
 }

+ 1 - 0
lib/pages/contract/package_list/controller.dart

@@ -12,6 +12,7 @@ class ServicePackageContractController extends FControllerBase {
   final _servicePackManager = Get.find<IServicePackManager>();
   List<LabelDTO> normalOptions = [];
   PatientDTO patient = PatientDTO();
+  String base64Image = "";
   @override
   void onInit() {
     final p = Get.parameters;

+ 22 - 2
lib/pages/contract/package_list/state.dart

@@ -2,6 +2,7 @@ import 'dart:collection';
 
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
+import 'package:image_picker/image_picker.dart';
 import 'package:vnoteapp/architecture/utils/datetime.dart';
 import 'package:vnoteapp/consts/rpc_enum_labels.dart';
 
@@ -21,6 +22,12 @@ class ServicePackageContractState {
   /// 地址
   String get address => _dto.value.patientAddress!;
 
+  /// 身份证
+  String get cardNo => _dto.value.cardNo!;
+
+  /// 生日
+  DateTime get birthday => _dto.value.birthday!;
+
   /// 性别
   String get genderDesc => RpcEnumLabels.gender[_dto.value.patientGender]!;
 
@@ -30,11 +37,13 @@ class ServicePackageContractState {
   final RxList<ServicePackDTO> _servicePackageItems = RxList();
 
   final RxList<ServiceItemDTO> _serviceItems = RxList();
-
+  final Rx<XFile?> _userImage = Rx(null);
   final RxList<ServicePackDTO> _selectedServicePackage =
       RxList<ServicePackDTO>();
   final RxString _selectedServicePackageName = RxString('');
   final RxString _selectedServicePackageCode = RxString('');
+  final RxString _notes = RxString('');
+
   final Rx<PatientDTO> _dto = Rx<PatientDTO>(
     PatientDTO(
       patientName: "",
@@ -47,7 +56,7 @@ class ServicePackageContractState {
   );
 
   final Rx<DateTime> _serviceStartDate = Rx(DateTime.now());
-
+  final RxInt _serviceTime = RxInt(1);
   final RxBool _isExpendPatient = RxBool(false);
 
   /// 服务包集合
@@ -72,11 +81,18 @@ class ServicePackageContractState {
   set selectedServicePackageName(String val) =>
       _selectedServicePackageName.value = val;
 
+  XFile? get userImage => _userImage.value;
+  set userImage(XFile? val) => _userImage.value = val;
+
   /// 服务包code
   String get selectedServicePackageCode => _selectedServicePackageCode.value;
   set selectedServicePackageCode(String val) =>
       _selectedServicePackageCode.value = val;
 
+  /// 备注
+  String get notes => _notes.value;
+  set notes(String val) => _notes.value = val;
+
   /// 是否展开
   bool get isExpendPatient => _isExpendPatient.value;
   set isExpendPatient(bool val) => _isExpendPatient.value = val;
@@ -85,6 +101,10 @@ class ServicePackageContractState {
   DateTime get serviceStartDate => _serviceStartDate.value;
   set serviceStartDate(DateTime val) => _serviceStartDate.value = val;
 
+  /// 服务年限
+  int get serviceTime => _serviceTime.value;
+  set serviceTime(int val) => _serviceTime.value = val;
+
   void updateDto(PatientDTO dto) {
     _dto.value = dto;
   }

+ 88 - 33
lib/pages/contract/package_list/view.dart

@@ -1,4 +1,5 @@
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:fis_jsonrpc/rpc.dart';
 import 'package:flutter/material.dart';
@@ -8,8 +9,12 @@ 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';
+import 'package:vnoteapp/components/dialog_input.dart';
+import 'package:vnoteapp/components/dialog_select.dart';
 import 'package:vnoteapp/components/panel.dart';
+import 'package:vnoteapp/store/store.dart';
 import 'controller.dart';
+import 'package:image_picker/image_picker.dart';
 
 class ServicePackageContractPage
     extends GetView<ServicePackageContractController> {
@@ -37,6 +42,11 @@ class ServicePackageContractPage
                       controller.state.selectedServicePackageCode,
                   "servicePackageNames":
                       controller.state.selectedServicePackageName,
+                  "serviceTime": controller.state.serviceTime.toString(),
+                  "serviceStartDate":
+                      controller.state.serviceStartDate.toString(),
+                  "base64Image": controller.base64Image,
+                  "notes": controller.state.notes,
                 },
               );
             },
@@ -260,18 +270,18 @@ class ServicePackageContractPage
                     style: TextStyle(fontSize: 18),
                   ),
                   onPressed: () async {
-                    await Get.toNamed(
-                      '/contract/package_info',
-                      parameters: {
-                        "servicePack": json.encode(servicePackDTO.toJson()),
-                      },
-                    );
-                    // showDialog(
-                    //   context: context,
-                    //   builder: (BuildContext context) {
-                    //     return buildAlertDialog(servicePackDTO);
+                    // await Get.toNamed(
+                    //   '/contract/package_info',
+                    //   parameters: {
+                    //     "servicePack": json.encode(servicePackDTO.toJson()),
                     //   },
                     // );
+                    showDialog(
+                      context: context,
+                      builder: (BuildContext context) {
+                        return buildAlertDialog(servicePackDTO);
+                      },
+                    );
                   },
                 ),
               ),
@@ -362,23 +372,39 @@ class ServicePackageContractPage
     );
   }
 
+  Future<String> convertImageToBase64(XFile image) async {
+    List<int> imageBytes = await image.readAsBytes();
+    String base64Image = base64Encode(imageBytes);
+    return base64Image;
+  }
+
   Widget _buildPhotoVPanel() {
     return VPanel(
       child: VListFormCellGroup(
         children: [
-          VListFormCell(
-            label: '拍照',
-            height: 70,
-            contentWidget: const Center(
-              child: Icon(
-                Icons.supervised_user_circle_outlined,
-                size: 70,
-              ),
+          Obx(
+            () => VListFormCell(
+              label: '拍照',
+              height: 70,
+              contentWidget: controller.state.userImage != null
+                  ? Image.file(
+                      File(controller.state.userImage!.path),
+                    )
+                  : const Center(
+                      child: Icon(
+                        Icons.account_box_rounded,
+                        size: 70,
+                      ),
+                    ),
+              onTap: () async {
+                XFile? image =
+                    await ImagePicker().pickImage(source: ImageSource.camera);
+                controller.state.userImage = image;
+                String base64Image = await convertImageToBase64(image!);
+                controller.base64Image = base64Image;
+              },
             ),
-            onTap: () {
-              print('拍照拍照');
-            },
-          ),
+          )
         ],
       ),
     );
@@ -402,13 +428,31 @@ class ServicePackageContractPage
               },
             ),
           ),
-          const VListFormCell(
+          Obx(
+            () => VListFormCell(
+              label: '服务年限',
+              content: '${controller.state.serviceTime}年',
+              onTap: () async {
+                String? result = await VDialogSelect<FSelectModel, String>(
+                  source: [
+                    FSelectModel(code: "1", name: "1年"),
+                    FSelectModel(code: "2", name: "2年"),
+                    FSelectModel(code: "3", name: "3年"),
+                  ],
+                  labelGetter: (data) => data.name,
+                  valueGetter: (data) => data.code,
+                ).show();
+                controller.state.serviceTime = int.parse(result ?? '1');
+              },
+            ),
+          ),
+          VListFormCell(
             label: '签约医生',
-            content: '李四',
+            content: Store.user.principalName,
           ),
-          const VListFormCell(
+          VListFormCell(
             label: '医生电话',
-            content: '18712341234',
+            content: Store.user.principalPhone,
           ),
         ],
       ),
@@ -431,9 +475,9 @@ class ServicePackageContractPage
                 content: controller.state.phone,
               ),
               if (controller.state.isExpendPatient) ...[
-                const VListFormCell(
+                VListFormCell(
                   label: '身份证号码',
-                  content: '5130221999099987',
+                  content: controller.state.cardNo,
                 ),
                 const VListFormCell(
                   label: '民族',
@@ -443,9 +487,11 @@ class ServicePackageContractPage
                   label: '性别',
                   content: controller.state.genderDesc,
                 ),
-                const VListFormCell(
+                VListFormCell(
                   label: '出生日期',
-                  content: '张三',
+                  content: DateFormat('yyyy-MM-dd').format(
+                    controller.state.birthday,
+                  ),
                 ),
               ]
             ],
@@ -488,9 +534,18 @@ class ServicePackageContractPage
               },
             ),
           ),
-          const VListFormCell(
-            label: '备注',
-            content: '5130221999099987',
+          Obx(
+            () => VListFormCell(
+              label: '备注',
+              content: controller.state.notes,
+              onTap: () async {
+                String? result = await VDialogInput(
+                  title: '备注',
+                  initialValue: controller.state.notes,
+                ).show();
+                controller.state.notes = result ?? controller.state.notes;
+              },
+            ),
           ),
         ],
       ),

+ 12 - 0
lib/store/modules/user.dart

@@ -22,6 +22,18 @@ class UserState extends StateModuleBase {
   /// 团队名称
   String get teamName => _userInfo?.teamName ?? "";
 
+  /// 负责医生
+  String get principalName => _userInfo?.principalName ?? "";
+
+  /// 医生电话
+  String get principalPhone => _userInfo?.principalPhone ?? "";
+
+  /// 机构名称
+  String get organizationName => _userInfo?.organizationName ?? "";
+
+  /// 机构电话
+  String get organizationPhone => _userInfo?.organizationCode ?? "";
+
   /// 是否登录中
   bool get isLogOn => token != null && token!.isNotEmpty;
 

+ 2 - 1
pubspec.yaml

@@ -52,6 +52,7 @@ dependencies:
   date_format: 2.0.7
   intl: 0.17.0
   flutter_inappwebview: ^5.3.2
+  image_picker: ^0.8.4+3
 
 dependencies_overrides:
   dio: 5.3.2
@@ -62,7 +63,7 @@ dependencies_overrides:
   fis_jsonrpc:
     git:
       url: http://git.ius.plus:88/Project-VNOTE/FlutterJsonRPC.git
-      ref: c26ed7a
+      ref: "e76e165"
   # fis_ui:
   #   git:
   #     url: http://git.ius.plus:88/Project-Wing/fis_lib_ui.git