record_data_cache_manager.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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/rpc.dart';
  10. import 'package:vitalapp/store/store.dart';
  11. import 'package:vitalapp/database/db.dart';
  12. import 'interfaces/record_data_cache.dart';
  13. import 'package:fis_common/logger/logger.dart';
  14. class RecordDataCacheManager implements IRecordDataCacheManager {
  15. @override
  16. Future<bool> saveRecordData(
  17. String appDataId,
  18. String patientCode,
  19. Map<String, dynamic> diagnosisDataValue,
  20. ) async {
  21. try {
  22. String data = jsonEncode(diagnosisDataValue);
  23. ///更新内存缓存
  24. Store.resident.handleSaveMedicalData(data);
  25. var existData = await db.repositories.diagnosis.queryable
  26. .where((x) => [
  27. x.code.equals(appDataId),
  28. x.userCode.equals(Store.user.userCode), //添加用户Code
  29. ])
  30. .first();
  31. if (existData != null) {
  32. existData.isValid = true;
  33. existData.dataJson = data;
  34. existData.patientCode = patientCode;
  35. existData.syncState = OfflineDataSyncState.success;
  36. //更新数据库
  37. await db.repositories.diagnosis.update(existData);
  38. } else {
  39. final entity = DiagnosisEntity();
  40. entity.code = appDataId;
  41. entity.isValid = true;
  42. entity.dataJson = data;
  43. entity.patientCode = patientCode;
  44. entity.userCode = Store.user.userCode!; //添加用户Code
  45. entity.syncState = OfflineDataSyncState.wait;
  46. //新增数据
  47. final id = await db.repositories.diagnosis.insert(entity);
  48. if (id > 0) {
  49. // 统计数量+1
  50. await db.repositories.patient.increaseDiagnoissCount(patientCode);
  51. }
  52. }
  53. return true;
  54. } catch (e) {
  55. logger.e('RecordDataCacheManager saveRecordData ex:', e);
  56. }
  57. return false;
  58. }
  59. ///更新记录状态
  60. @override
  61. Future<bool> recordSyncStateChange(
  62. String appDataId, {
  63. OfflineDataSyncState state = OfflineDataSyncState.success,
  64. }) async {
  65. try {
  66. var existData = await db.repositories.diagnosis.queryable
  67. .where((x) => [
  68. x.code.equals(appDataId),
  69. x.userCode.equals(Store.user.userCode), //添加用户code
  70. ])
  71. .first();
  72. if (existData != null) {
  73. existData.syncState = state;
  74. //更新数据库
  75. await db.repositories.diagnosis.update(existData);
  76. }
  77. } catch (e) {
  78. logger.e('RecordDataCacheManager recordSyncStateChange ex:', e);
  79. }
  80. return false;
  81. }
  82. ///根据病人Code与用户Code获取最近一条检查记录
  83. @override
  84. Future<DiagnosisEntity?> getLastRecordByPatientCode(
  85. String patientCode) async {
  86. var existDatas = db.repositories.diagnosis.queryable.where((x) => [
  87. x.patientCode.equals(patientCode),
  88. x.userCode.equals(Store.user.userCode), //添加用户code
  89. ]);
  90. var updateTimeData = await existDatas
  91. .orderBy((x) => x.updateTime, DbOrderByType.desc)
  92. .first();
  93. var createTimeData = await existDatas
  94. .orderBy((x) => x.createTime, DbOrderByType.desc)
  95. .first();
  96. if (updateTimeData != null && createTimeData != null) {
  97. final now = DateTime.now();
  98. ///如果存在更新时间的数据,则需要比较和创建时间哪个更新
  99. final diff1 = (updateTimeData.updateTime ?? DateTime(1970, 1, 1, 0, 0, 0))
  100. .difference(now);
  101. final diff2 = createTimeData.createTime.difference(now);
  102. if (diff1.abs() < diff2.abs()) {
  103. return updateTimeData;
  104. } else {
  105. return createTimeData;
  106. }
  107. } else if (createTimeData != null) {
  108. //如果不存在更新时间的数据,则直接返回创建时间的
  109. return createTimeData;
  110. }
  111. return null;
  112. }
  113. @override
  114. Future<List<DiagnosisEntity>> getNoSubmitRecords(String patientCode) async {
  115. List<DiagnosisEntity> result = [];
  116. try {
  117. result = await db.repositories.diagnosis.queryable
  118. .where((x) => [
  119. x.syncState.equals(OfflineDataSyncState.wait),
  120. x.patientCode.equals(patientCode),
  121. x.userCode.equals(Store.user.userCode), //添加用户code
  122. ])
  123. .toList();
  124. } catch (e) {
  125. logger.e('RecordDataCacheManager getRecordsByPatientCode ex:', e);
  126. }
  127. return result;
  128. }
  129. @override
  130. Future<List<DiagnosisItem>> convertDiagnosisDataToList(
  131. Map<String, dynamic> diagnosisDataValue) async {
  132. List<DiagnosisItem> diagnosisItems = [];
  133. for (var entry in diagnosisDataValue.entries) {
  134. var key = entry.key;
  135. var value = entry.value;
  136. if (value != null) {
  137. Store.app.setBusy("提交中");
  138. if (['Heart', 'TwelveHeart'].contains(key) && value is Map) {
  139. value = await uploadData(value);
  140. }
  141. Store.app.busy = false;
  142. diagnosisItems.add(
  143. DiagnosisItem(
  144. key: key,
  145. diagnosisData: jsonEncode(value),
  146. ),
  147. );
  148. }
  149. print('$key: $value');
  150. }
  151. Store.app.busy = false;
  152. return diagnosisItems;
  153. }
  154. @override
  155. Future<List<DiagnosisItem>> verifyDiagnosisDataList(
  156. Map<String, dynamic> diagnosisDataValue) async {
  157. List<DiagnosisItem> diagnosisItems = [];
  158. for (var entry in diagnosisDataValue.entries) {
  159. var key = entry.key;
  160. var value = entry.value;
  161. if (value != null) {
  162. if (['Heart', 'TwelveHeart'].contains(key) && value is Map) {
  163. if (value.isEmpty) {
  164. continue;
  165. }
  166. }
  167. diagnosisItems.add(
  168. DiagnosisItem(
  169. key: key,
  170. diagnosisData: jsonEncode(value),
  171. ),
  172. );
  173. }
  174. print('$key: $value');
  175. }
  176. return diagnosisItems;
  177. }
  178. bool isUploaded(String url) {
  179. return url.startsWith('https://') || url.startsWith('http://');
  180. }
  181. Future<Map> uploadData(Map data) async {
  182. if (data['ECG_POINT'] != null && !isUploaded(data['ECG_POINT'])) {
  183. File ecgPointFile =
  184. await rpc.storage.writeStringToFile(data['ECG_POINT']);
  185. String? ecgPointUrl = await rpc.storage.uploadFile(ecgPointFile);
  186. data['ECG_POINT'] = ecgPointUrl ?? '';
  187. // ... 上传点集
  188. }
  189. if (data['ECG'] != null && !isUploaded(data['ECG'])) {
  190. // ... 上传图片
  191. /// 图片地址
  192. final imageFile = UploadUtils.convertBase64ToXFile(data['ECG']);
  193. String? imageUrl = await rpc.storage.upload(imageFile!);
  194. data['ECG'] = imageUrl ?? '';
  195. }
  196. if (data['ECG_POINT12'] != null && !isUploaded(data['ECG_POINT12'])) {
  197. File ecgPointFile =
  198. await rpc.storage.writeStringToFile(data['ECG_POINT12']);
  199. String? ecgPointUrl = await rpc.storage.uploadFile(ecgPointFile);
  200. data['ECG_POINT12'] = ecgPointUrl ?? '';
  201. // ... 上传点集
  202. }
  203. if (data['ECG12'] != null && !isUploaded(data['ECG12'])) {
  204. // ... 上传图片
  205. final imageFile = UploadUtils.convertBase64ToXFile(data['ECG12']);
  206. String? imageUrl = await rpc.storage.upload(imageFile!);
  207. data['ECG12'] = imageUrl ?? '';
  208. }
  209. return data;
  210. }
  211. }