Эх сурвалжийг харах

健康检测报告离线适配

finlay 1 жил өмнө
parent
commit
42affa8da6

+ 54 - 18
lib/managers/diagnosis.dart

@@ -1,8 +1,8 @@
 import 'dart:convert';
-
-import 'package:fis_jsonrpc/services/diagnosis.m.dart';
+import 'package:fis_jsonrpc/rpc.dart';
 import 'package:vitalapp/database/db.dart';
 import 'package:vitalapp/managers/interfaces/diagnosis.dart';
+import 'package:vitalapp/managers/interfaces/models/diagnosis_aggregation_record_model.dart';
 import 'package:vitalapp/rpc.dart';
 import 'package:vitalapp/store/store.dart';
 
@@ -10,23 +10,59 @@ class DiagnosisManager implements IDiagnosisManager {
   DiagnosisManager();
 
   @override
-  Future<List<DiagnosisAggregationRecord>?> getDiagnosisAggregationPageAsync(
-      String patientCode) async {
-    var request = DiagnosisPageRequest(
-      token: Store.user.token,
-      pageIndex: 1,
-      pageSize: 20,
-      patientCode: patientCode,
-    );
-    var result = await rpc.diagnosis.getDiagnosisAggregationPageAsync(request);
-
-    // final localRecords =
-    //     await db.repositories.diagnosis.getListByPatientCode(patientCode);
-    // for (var element in localRecords) {
-    //   result.pageData.insert(0, element);
-    // }
+  Future<PageCollection<DiagnosisAggregationRecordModel>?>
+      getDiagnosisAggregationPageAsync(
+          String patientCode, int pageIndex, int pageSize) async {
+    PageCollection<DiagnosisAggregationRecordModel> diagnosisAggregationRecord =
+        PageCollection<DiagnosisAggregationRecordModel>();
+    try {
+      var request = DiagnosisPageRequest(
+        token: Store.user.token,
+        pageIndex: pageIndex,
+        pageSize: pageSize,
+        patientCode: patientCode,
+      );
+      diagnosisAggregationRecord.pageData = [];
+      var result =
+          await rpc.diagnosis.getDiagnosisAggregationPageAsync(request);
+      diagnosisAggregationRecord.pageIndex = result.pageIndex;
+      diagnosisAggregationRecord.pageSize = result.pageSize;
+      diagnosisAggregationRecord.dataCount = result.dataCount;
+      for (var element in result.pageData!) {
+        var record = DiagnosisAggregationRecordModel.fromJson(element.toJson());
+        diagnosisAggregationRecord.pageData!.add(record);
+      }
+    } catch (e) {}
+    return diagnosisAggregationRecord;
+  }
 
-    return result.pageData?.toList();
+  @override
+  Future<List<DiagnosisAggregationRecordModel>?> getListByPatientCode(
+      String patientCode) async {
+    try {
+      List<DiagnosisAggregationRecordModel> records =
+          <DiagnosisAggregationRecordModel>[];
+      final localRecords =
+          await db.repositories.diagnosis.getListByPatientCode(patientCode);
+      var currentPatient = Store.user.currentSelectPatientInfo!;
+      for (var element in localRecords) {
+        Map<String, dynamic> data = jsonDecode(element.dataJson);
+        List<DiagnosisAggregationData> list = [];
+        for (var key in data.keys) {
+          list.add(DiagnosisAggregationData(
+              key: key, diagnosisData: jsonEncode(data[key])));
+        }
+        records.add(DiagnosisAggregationRecordModel(
+          patientCode: element.patientCode,
+          patientName: currentPatient.patientName,
+          doctorName: currentPatient.contractedDoctorName,
+          diagnosisTime: element.createTime,
+          diagnosisAggregationData: list,
+        ));
+      }
+      return records;
+    } catch (e) {}
+    return null;
   }
 
   /// 创建健康检测

+ 7 - 2
lib/managers/interfaces/diagnosis.dart

@@ -1,11 +1,16 @@
 import 'package:fis_jsonrpc/rpc.dart';
+import 'package:vitalapp/managers/interfaces/models/diagnosis_aggregation_record_model.dart';
 
 import 'base.dart';
 
 abstract class IDiagnosisManager implements IManager {
   ///获取健康检测记录
-  Future<List<DiagnosisAggregationRecord>?> getDiagnosisAggregationPageAsync(
-      String patientCode);
+  Future<PageCollection<DiagnosisAggregationRecordModel>?>
+      getDiagnosisAggregationPageAsync(
+          String patientCode, int pageIndex, int pageSize);
 
   Future<bool> submitDiagnosisAsync(SubmitDiagnosisRequest request);
+
+  Future<List<DiagnosisAggregationRecordModel>?> getListByPatientCode(
+      String patientCode);
 }

+ 49 - 0
lib/managers/interfaces/models/diagnosis_aggregation_record_model.dart

@@ -0,0 +1,49 @@
+import 'package:fis_jsonrpc/services/contractRecord.m.dart';
+import 'package:fis_jsonrpc/services/diagnosis.m.dart';
+
+class DiagnosisAggregationRecordModel extends DiagnosisAggregationRecord {
+  DiagnosisAggregationRecordModel({
+    super.patientCode,
+    super.doctorCode,
+    super.doctorName,
+    super.patientName,
+    super.patientGender,
+    super.phone,
+    super.cardNo,
+    super.birthday,
+    super.patientAddress,
+    super.crowdLabels,
+    super.organizationName,
+    super.appDataId,
+    super.diagnosisTime,
+    super.registTime,
+    super.diagnosisAggregationData,
+    super.national,
+  });
+
+  factory DiagnosisAggregationRecordModel.fromJson(Map<String, dynamic> map) {
+    return DiagnosisAggregationRecordModel(
+      patientCode: map['PatientCode'],
+      doctorCode: map['DoctorCode'],
+      doctorName: map['DoctorName'],
+      patientName: map['PatientName'],
+      patientGender:
+          GenderEnum.values.firstWhere((e) => e.index == map['PatientGender']),
+      phone: map['Phone'],
+      cardNo: map['CardNo'],
+      birthday:
+          map['Birthday'] != null ? DateTime.parse(map['Birthday']) : null,
+      patientAddress: map['PatientAddress'],
+      crowdLabels: map['CrowdLabels']?.cast<String>().toList(),
+      organizationName: map['OrganizationName'],
+      appDataId: map['AppDataId'],
+      diagnosisTime: map['DiagnosisTime'] != null
+          ? DateTime.parse(map['DiagnosisTime'])
+          : null,
+      registTime:
+          map['RegistTime'] != null ? DateTime.parse(map['RegistTime']) : null,
+      diagnosisAggregationData: map['DiagnosisAggregationData'],
+      national: map['National'],
+    );
+  }
+}

+ 5 - 5
lib/managers/patient.dart

@@ -51,11 +51,11 @@ class PatientManager implements IPatientManager {
         var patientModel = PatientModelDTO.fromJson(element.toJson());
 
         ///等待接口实现
-        // final localRecords =
-        //     await db.repositories.diagnosis.getListByPatientCode(element.code!);
-        // if (localRecords.isNotEmpty) {
-        //   patientModel.isExistLocalData = true;
-        // }
+        final localRecords =
+            await db.repositories.diagnosis.getListByPatientCode(element.code!);
+        if (localRecords.isNotEmpty) {
+          patientModel.isExistLocalData = true;
+        }
         listPatientDto.pageData?.add(patientModel);
       }
       return listPatientDto;

+ 19 - 4
lib/pages/medical/records/controller.dart

@@ -23,14 +23,29 @@ class MedicalRecordsController extends FControllerBase {
 
   _loadData() async {
     try {
-      var result =
-          await _diagnosisManager.getDiagnosisAggregationPageAsync(patientCode);
-      if (result != null) {
-        state.updateDto(result);
+      state.pageIndex = 0;
+      state.dataList = [];
+      var listRecord =
+          await _diagnosisManager.getListByPatientCode(patientCode);
+      if (listRecord != null) {
+        state.appendDataList(listRecord);
       }
+      await loadNextPageList();
     } catch (e) {}
   }
 
+  Future<void> loadNextPageList() async {
+    var result = await _diagnosisManager.getDiagnosisAggregationPageAsync(
+        patientCode, state.pageIndex + 1, state.pageSize);
+    if (result != null) {
+      state.totalCount = result.dataCount;
+      if (result.pageData != null) {
+        state.pageIndex = state.pageIndex + 1;
+        state.appendDataList(result.pageData!);
+      }
+    }
+  }
+
   Future<List<List<String>>> getTableData(
       DiagnosisAggregationRecord dto) async {
     var currentDiagnosis = <List<String>>[];

+ 4 - 11
lib/pages/medical/records/state.dart

@@ -1,12 +1,5 @@
-import 'package:fis_jsonrpc/services/diagnosis.m.dart';
-import 'package:get/get.dart';
+import 'package:vitalapp/managers/interfaces/models/diagnosis_aggregation_record_model.dart';
+import 'package:vitalapp/pages/controllers/paged_state_mixin.dart';
 
-class MedicalRecordsState {
-  final RxList<DiagnosisAggregationRecord> _dtoList = RxList();
-
-  List<DiagnosisAggregationRecord> get dtoList => _dtoList.toList();
-
-  updateDto(List<DiagnosisAggregationRecord> dtoList) {
-    _dtoList.value = dtoList;
-  }
-}
+class MedicalRecordsState
+    with PagedStateMixin<DiagnosisAggregationRecordModel> {}

+ 33 - 11
lib/pages/medical/records/view.dart

@@ -65,6 +65,23 @@ class MedicalRecordsPage extends GetView<MedicalRecordsController> {
   }
 
   Widget _buildListView() {
+    final scrollController = ScrollController();
+    scrollController.addListener(
+      () {
+        // 如果滑动到底部
+        try {
+          if (scrollController.position.atEdge) {
+            if (scrollController.position.pixels != 0) {
+              if (controller.state.hasNextPage) {
+                controller.loadNextPageList();
+              }
+            }
+          }
+        } catch (e) {
+          // logger.e("listViewScrollController exception:", e);
+        }
+      },
+    );
     return Expanded(
       flex: 2,
       child: Padding(
@@ -72,12 +89,12 @@ class MedicalRecordsPage extends GetView<MedicalRecordsController> {
         child: RefreshIndicator(
             child: Obx(() {
               final children = <Widget>[];
-              for (var element in controller.state.dtoList) {
+              for (var element in controller.state.dataList) {
                 children.add(_MedicalRecordCard(
                   dto: element,
                 ));
               }
-              return controller.state.dtoList.isEmpty
+              return controller.state.dataList.isEmpty
                   ? Container(
                       margin: const EdgeInsets.only(top: 80),
                       child: Column(
@@ -97,16 +114,21 @@ class MedicalRecordsPage extends GetView<MedicalRecordsController> {
                         ],
                       ),
                     )
-                  : GridView(
-                      shrinkWrap: true,
-                      gridDelegate:
-                          const SliverGridDelegateWithFixedCrossAxisCount(
-                        crossAxisCount: 1,
-                        mainAxisSpacing: 16,
-                        crossAxisSpacing: 20,
-                        childAspectRatio: 1080 / 180,
+                  : Scrollbar(
+                      trackVisibility: true,
+                      controller: scrollController,
+                      child: GridView(
+                        shrinkWrap: true,
+                        controller: scrollController,
+                        gridDelegate:
+                            const SliverGridDelegateWithFixedCrossAxisCount(
+                          crossAxisCount: 1,
+                          mainAxisSpacing: 16,
+                          crossAxisSpacing: 20,
+                          childAspectRatio: 1080 / 180,
+                        ),
+                        children: children,
                       ),
-                      children: children,
                     );
             }),
             onRefresh: () async {}),

+ 2 - 2
lib/pages/patient/list/state.dart

@@ -1,8 +1,8 @@
-import 'package:fis_jsonrpc/rpc.dart';
 import 'package:get/get.dart';
+import 'package:vitalapp/managers/interfaces/models/patient_model_dto.dart';
 import 'package:vitalapp/pages/controllers/paged_state_mixin.dart';
 
-class PatientListState with PagedStateMixin<PatientDTO> {
+class PatientListState with PagedStateMixin<PatientModelDTO> {
   // final RxList<PatientDTO> _dataList = RxList<PatientDTO>();
 
   // /// 列表数据集合