record_data_cache_manager.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:vital_local_database/core/index.dart';
  5. import 'package:vitalapp/architecture/storage/storage.dart';
  6. import 'package:vitalapp/architecture/utils/upload.dart';
  7. import 'package:vitalapp/database/entities/defines.dart';
  8. import 'package:vitalapp/database/entities/diagnosis.dart';
  9. import 'package:vitalapp/global.dart';
  10. import 'package:vitalapp/rpc.dart';
  11. import 'package:vitalapp/store/store.dart';
  12. import 'package:vitalapp/database/db.dart';
  13. import 'interfaces/record_data_cache.dart';
  14. import 'package:fis_common/logger/logger.dart';
  15. class RecordDataCacheManager implements IRecordDataCacheManager {
  16. @override
  17. Future<bool> saveRecordData(
  18. String appDataId,
  19. String patientCode,
  20. Map<String, dynamic> diagnosisDataValue,
  21. ) async {
  22. try {
  23. String data = jsonEncode(diagnosisDataValue);
  24. ///更新内存缓存
  25. Store.resident.handleSaveMedicalData(data);
  26. var existData = await db.repositories.diagnosis.queryable
  27. .where((x) => [x.code.equals(appDataId)])
  28. .first();
  29. if (existData != null) {
  30. existData.isValid = true;
  31. existData.dataJson = data;
  32. existData.patientCode = patientCode;
  33. existData.syncState = OfflineDataSyncState.wait;
  34. //更新数据库
  35. await db.repositories.diagnosis.update(existData);
  36. } else {
  37. final entity = DiagnosisEntity();
  38. entity.code = appDataId;
  39. entity.isValid = true;
  40. entity.dataJson = data;
  41. entity.patientCode = patientCode;
  42. entity.syncState = OfflineDataSyncState.wait;
  43. //新增数据
  44. await db.repositories.diagnosis.insert(entity);
  45. }
  46. return true;
  47. } catch (e) {
  48. logger.e('RecordDataCacheManager saveRecordData ex:', e);
  49. }
  50. return false;
  51. }
  52. ///更新记录状态
  53. @override
  54. Future<bool> recordSyncStateChange(
  55. String appDataId, {
  56. OfflineDataSyncState state = OfflineDataSyncState.success,
  57. }) async {
  58. try {
  59. var existData = await db.repositories.diagnosis.queryable
  60. .where((x) => [x.code.equals(appDataId)])
  61. .first();
  62. if (existData != null) {
  63. existData.syncState = state;
  64. //更新数据库
  65. await db.repositories.diagnosis.update(existData);
  66. }
  67. } catch (e) {
  68. logger.e('RecordDataCacheManager recordSyncStateChange ex:', e);
  69. }
  70. return false;
  71. }
  72. ///根据病人Code获取最近一条检查记录
  73. @override
  74. Future<DiagnosisEntity?> getLastRecordByPatientCode(
  75. String patientCode) async {
  76. var existDatas = db.repositories.diagnosis.queryable
  77. .where((x) => [x.patientCode.equals(patientCode)]);
  78. var updateTimeData = await existDatas
  79. .orderBy((x) => x.updateTime, DbOrderByType.desc)
  80. .first();
  81. var createTimeData = await existDatas
  82. .orderBy((x) => x.createTime, DbOrderByType.desc)
  83. .first();
  84. if (updateTimeData != null && createTimeData != null) {
  85. final now = DateTime.now();
  86. ///如果存在更新时间的数据,则需要比较和创建时间哪个更新
  87. final diff1 = (updateTimeData.updateTime ?? DateTime(1970, 1, 1, 0, 0, 0))
  88. .difference(now);
  89. final diff2 = createTimeData.createTime.difference(now);
  90. if (diff1.abs() < diff2.abs()) {
  91. return updateTimeData;
  92. } else {
  93. return createTimeData;
  94. }
  95. } else if (createTimeData != null) {
  96. //如果不存在更新时间的数据,则直接返回创建时间的
  97. return createTimeData;
  98. }
  99. return null;
  100. }
  101. ///根据病人Code获取最近一条检查记录
  102. @override
  103. Future<List<DiagnosisEntity>> getNoSubmitRecords() async {
  104. List<DiagnosisEntity> result = [];
  105. try {
  106. result = await db.repositories.diagnosis.queryable
  107. .where((x) => [x.syncState.equals(OfflineDataSyncState.wait)])
  108. .toList();
  109. } catch (e) {
  110. logger.e('RecordDataCacheManager getRecordsByPatientCode ex:', e);
  111. }
  112. return result;
  113. }
  114. @override
  115. Future<List<DiagnosisItem>> convertDiagnosisDataToList(
  116. Map<String, dynamic> diagnosisDataValue) async {
  117. List<DiagnosisItem> diagnosisItems = [];
  118. for (var entry in diagnosisDataValue.entries) {
  119. var key = entry.key;
  120. var value = entry.value;
  121. if (value != null) {
  122. if (key == 'Heart' && value is Map) {
  123. if (value.isEmpty) {
  124. return [];
  125. }
  126. if (kIsOnline) {
  127. String allPoint = value['ECG_POINT'];
  128. String imageBase64 = value['ECG'];
  129. /// 点集地址
  130. File ecgPointFile = await rpc.storage.writeStringToFile(allPoint);
  131. String? ecgPointUrl = await rpc.storage.uploadFile(ecgPointFile);
  132. /// 图片地址
  133. final imageFile = UploadUtils.convertBase64ToXFile(imageBase64);
  134. String? imageUrl = await rpc.storage.upload(imageFile!);
  135. value['ECG_POINT'] = ecgPointUrl ?? '';
  136. value['ECG'] = imageUrl ?? '';
  137. }
  138. }
  139. diagnosisItems.add(
  140. DiagnosisItem(
  141. key: key,
  142. diagnosisData: jsonEncode(value),
  143. ),
  144. );
  145. }
  146. print('$key: $value');
  147. }
  148. return diagnosisItems;
  149. }
  150. }