Bladeren bron

档案查询Mock

Melon 1 jaar geleden
bovenliggende
commit
450cfad97d
1 gewijzigde bestanden met toevoegingen van 76 en 21 verwijderingen
  1. 76 21
      lib/mock/services/patient.dart

+ 76 - 21
lib/mock/services/patient.dart

@@ -1,6 +1,7 @@
 import 'dart:convert';
 
 import 'package:fis_jsonrpc/rpc.dart';
+import 'package:vital_local_database/index.dart';
 import 'package:vitalapp/database/db.dart';
 import 'package:vitalapp/database/entities/patient.dart';
 import 'package:fis_common/logger/logger.dart';
@@ -10,22 +11,37 @@ class PatientServiceMock extends VitalPatientService {
 
   @override
   Future<String> createPatientAsync(CreatePatientRequest request) async {
-    final cardNo = request.cardNo;
+    final code = request.code!;
+    final existEntity = await _checkPatientExist(code);
 
-    // final dto = _ModelConverter.create2Dto(request);
-    // final dtoJson = dto.toJson();
+    PatientEntity entity;
+    PatientDTO dto;
+    if (existEntity == null) {
+      entity = PatientEntity();
+      entity.code = request.code!;
+      entity.isValid = true;
+      entity.name = request.patientName!;
 
-    // final entity = PatientEntity();
-    // entity.code = request.code!;
-    // entity.isValid = true;
-    // entity.name = request.patientName!;
-    // entity.dataJson = jsonEncode(dtoJson);
+      dto = PatientDTO();
+      _ModelConverter.syncCreate2Dto(dto, request);
 
-    // final id = await db.repositories.patient.insert(entity);
-    // print("Patient Id: $id");
+      final dtoJson = dto.toJson();
+      entity.dataJson = jsonEncode(dtoJson);
 
-    // return id > 0 ? entity.code : null;
-    return request.code!;
+      final id = await db.repositories.patient.insert(entity);
+      return id > 0 ? code : "";
+    } else {
+      entity = existEntity;
+      final jsonMap = jsonDecode(entity.dataJson);
+      dto = PatientDTO.fromJson(jsonMap);
+      _ModelConverter.syncCreate2Dto(dto, request);
+
+      final dtoJson = dto.toJson();
+      entity.dataJson = jsonEncode(dtoJson);
+
+      final rows = await db.repositories.patient.update(entity);
+      return rows > 0 ? code : "";
+    }
   }
 
   @override
@@ -35,16 +51,56 @@ class PatientServiceMock extends VitalPatientService {
   }
 
   @override
-  Future<PatientDTO> getPatientDetailAsync(GetPatientRequest request) {
-    // TODO: implement getPatientDetailAsync
-    return super.getPatientDetailAsync(request);
+  Future<PatientDTO> getPatientDetailAsync(GetPatientRequest request) async {
+    final code = request.code!;
+    final entity = await db.repositories.patient.singleByCode(code);
+    if (entity == null || entity.dataJson.isEmpty) {
+      throw JsonRpcException(code: -1, message: "Offline patient not found");
+    }
+    final jsonMap = jsonDecode(entity.dataJson);
+    final dto = PatientDTO.fromJson(jsonMap);
+    return dto;
   }
 
   @override
   Future<PageCollection<PatientDTO>> getPatientPageAsync(
-      PatientPageRequest request) {
-    // TODO: implement getPatientPageAsync
-    return super.getPatientPageAsync(request);
+      PatientPageRequest request) async {
+    final query = db.repositories.patient.queryable.where((x) {
+      final List<IDbColumnCondition> arr = [];
+      arr.add(x.isValid.equals(true));
+      final keyword = request.keyword;
+      if (keyword != null && keyword.isNotEmpty) {
+        // TODO: 暂时只支持姓名模糊
+        arr.add(x.name.like("%$keyword%"));
+      } else {
+        if (request.startTime != null) {
+          arr.add(x.createTime.gte(request.startTime));
+        }
+        if (request.endTime != null) {
+          arr.add(x.createTime.lt(request.endTime));
+        }
+      }
+      return arr;
+    });
+
+    final count = await query.count();
+    final offset = request.pageSize * (request.pageIndex - 1);
+    final entities =
+        await query.offset(offset).limit(request.pageSize).toList();
+
+    final dtos = entities.map((e) {
+      final jsonMap = jsonDecode(e.dataJson);
+      final dto = PatientDTO.fromJson(jsonMap);
+      return dto;
+    }).toList();
+
+    final pagedList = PageCollection<PatientDTO>(
+      pageIndex: request.pageIndex,
+      pageSize: request.pageSize,
+      dataCount: count,
+      pageData: dtos,
+    );
+    return pagedList;
   }
 
   Future<PatientEntity?> _checkPatientExist(String code) async {
@@ -55,13 +111,13 @@ class PatientServiceMock extends VitalPatientService {
       logger.e(
           "PatientServiceMock - Check patient exist error. Code: $code.", e);
     }
+    return null;
   }
 }
 
 abstract class _ModelConverter {
   /// 根据新建请求创建DTO
-  static PatientDTO create2Dto(CreatePatientRequest request) {
-    final dto = PatientDTO();
+  static void syncCreate2Dto(PatientDTO dto, CreatePatientRequest request) {
     dto.code = request.code;
     dto.patientName = request.patientName;
     dto.phone = request.phone;
@@ -75,7 +131,6 @@ abstract class _ModelConverter {
     dto.permanentResidenceAddress = request.permanentResidenceAddress;
     dto.teamRegionCode = request.teamRegionCode;
     dto.contractedDoctor = request.contractedDoctor;
-    return dto;
   }
 
   /// 根据DTO创建新建请求