patient.dart 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import 'dart:convert';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:vital_local_database/core/interface/queryable.dart';
  4. import 'package:vitalapp/database/db.dart';
  5. import 'package:vitalapp/database/entities/defines.dart';
  6. import 'package:vitalapp/global.dart';
  7. import 'package:vitalapp/managers/interfaces/models/patient_model_dto.dart';
  8. import 'package:vitalapp/managers/interfaces/patient.dart';
  9. import 'package:vitalapp/rpc.dart';
  10. import 'package:fis_common/logger/logger.dart';
  11. import 'package:vitalapp/store/store.dart';
  12. class PatientManager implements IPatientManager {
  13. @override
  14. Future<String?> create(CreatePatientRequest request) async {
  15. request.token = Store.user.token;
  16. request.code = request.cardNo;
  17. final result = await rpc.patient.createPatientAsync(request);
  18. return result;
  19. }
  20. @override
  21. Future<List<PatientModelDTO>?> getPagedOfflineList(
  22. PatientPageRequest request) async {
  23. final entities = await db.repositories.patient.queryable
  24. .where((x) {
  25. final List<IDbColumnCondition> arr = [];
  26. arr.add(x.isValid.equals(true));
  27. arr.add(x.userCode.equals(Store.user.userCode)); //添加用户code
  28. arr.add(x.syncState.notEquals(OfflineDataSyncState.success));
  29. final keyword = request.keyword;
  30. if (keyword != null && keyword.isNotEmpty) {
  31. // TODO: 暂时只支持姓名模糊
  32. arr.add(x.name.like("%$keyword%' OR code like '%$keyword%"));
  33. } else {
  34. if (request.startTime != null) {
  35. arr.add(x.createTime.gte(request.startTime));
  36. }
  37. if (request.endTime != null) {
  38. arr.add(x.createTime.lt(request.endTime));
  39. }
  40. }
  41. return arr;
  42. })
  43. .orderBy((x) => x.createTime, DbOrderByType.desc)
  44. .toList();
  45. final dtos = entities.map((e) {
  46. var patientModel = PatientModelDTO.fromJson(jsonDecode(e.dataJson));
  47. patientModel.isExistLocalData = true;
  48. return patientModel;
  49. }).toList();
  50. return dtos;
  51. }
  52. @override
  53. Future<PatientDTO?> getDetail(String code) async {
  54. try {
  55. final request = GetPatientRequest(code: code, token: Store.user.token);
  56. if (kIsOnline) {
  57. //在线状态,先查询是否存在本体未提交数据
  58. final entity = await db.repositories.patient
  59. .singleByCode(code, Store.user.userCode!);
  60. if (entity != null &&
  61. entity.dataJson.isNotEmpty &&
  62. entity.syncState != OfflineDataSyncState.success) {
  63. logger.i("PatientManager query patient detail location exist.");
  64. final jsonMap = jsonDecode(entity.dataJson);
  65. final dto = PatientDTO.fromJson(jsonMap);
  66. return dto;
  67. } else {
  68. logger.i("PatientManager query patient detail location not exist.");
  69. }
  70. }
  71. final result = await rpc.patient.getPatientDetailAsync(request);
  72. return result;
  73. } catch (e) {
  74. logger.e("PatientManager query patient detail error.", e);
  75. return null;
  76. }
  77. }
  78. @override
  79. Future<PageCollection<PatientModelDTO>?> getPagedList(
  80. PatientPageRequest request) async {
  81. PageCollection<PatientModelDTO>? listPatientDto =
  82. PageCollection<PatientModelDTO>();
  83. try {
  84. request.token = Store.user.token;
  85. final result = await rpc.patient.getPatientPageAsync(request);
  86. listPatientDto.dataCount = result.dataCount;
  87. listPatientDto.pageData = [];
  88. for (var element in result.pageData!) {
  89. var patientModel = PatientModelDTO.fromJson(element.toJson());
  90. var isNotUploadedPatient = await db.repositories.patient
  91. .isNotUploadedPatient(element.code!, Store.user.userCode!);
  92. if (isNotUploadedPatient) {
  93. if (kIsOnline) {
  94. continue;
  95. } else {
  96. patientModel.isExistLocalData = true;
  97. }
  98. } else {
  99. final localCount = await db.repositories.diagnosis
  100. .getNotUploadedCountByPatientCode(
  101. element.code!, Store.user.userCode!);
  102. if (localCount > 0) {
  103. patientModel.isExistLocalData = true;
  104. }
  105. }
  106. listPatientDto.pageData?.add(patientModel);
  107. }
  108. return listPatientDto;
  109. } catch (e) {
  110. logger.e("PatientManager query patient paged list error.", e);
  111. return null;
  112. }
  113. }
  114. @override
  115. Future<bool> updatePatientAsync(UpdatePatientRequest request) async {
  116. try {
  117. final result = await rpc.patient.updatePatientAsync(request);
  118. return result;
  119. } catch (e) {
  120. return false;
  121. }
  122. }
  123. @override
  124. Future<bool> setCrowdLabelsAsync(
  125. String patientCode, List<String> crowLabels) async {
  126. try {
  127. final request = SetCrowdLabelsRequest(
  128. code: patientCode, crowdLabels: crowLabels, token: Store.user.token);
  129. final result = rpc.patient.setCrowdLabelsAsync(request);
  130. return result;
  131. } catch (e) {
  132. return false;
  133. }
  134. }
  135. @override
  136. Future<String> createPatientExtensionAsync(
  137. CreatePatientExtensionRequest request) async {
  138. try {
  139. final result =
  140. await rpc.patientExtension.createPatientExtensionAsync(request);
  141. return result;
  142. } catch (e) {
  143. return '';
  144. }
  145. }
  146. @override
  147. Future<PatientExtensionDTO?> getPatientExtensionDetailByCodeAndKeyAsync(
  148. GetPatientExtensionByCodeAndKeyRequest request) async {
  149. try {
  150. final result = await rpc.patientExtension
  151. .getPatientExtensionDetailByCodeAndKeyAsync(request);
  152. return result;
  153. } catch (e) {
  154. return null;
  155. }
  156. }
  157. @override
  158. ///更新居民健康信息
  159. Future<bool> updatePatientExtensionAsync(
  160. UpdatePatientExtensionRequest request) async {
  161. try {
  162. final result =
  163. await rpc.patientExtension.updatePatientExtensionAsync(request);
  164. return result;
  165. } catch (e) {}
  166. return false;
  167. }
  168. ///获取所有userCode为空的数据,并赋值
  169. @override
  170. Future<void> resettingUsercodeIsEmptyData() async {
  171. var version = await db.database.getVersion();
  172. if (version > 0) {
  173. final list = await db.repositories.patient.queryable.where((x) {
  174. final List<IDbColumnCondition> arr = [];
  175. arr.add(x.isValid.equals(true));
  176. arr.add(x.userCode.equals(''));
  177. return arr;
  178. }).toList();
  179. logger.w(
  180. "PatientManager resettingUsercodeIsEmptyData list.count:${list.length}.");
  181. for (var element in list) {
  182. if (element.syncState == OfflineDataSyncState.success) {
  183. var result = await getDetail(element.code);
  184. if (result != null) {
  185. element.userCode = result.createdDoctor!;
  186. }
  187. } else {
  188. element.userCode = Store.user.userCode!;
  189. }
  190. await db.repositories.patient.update(element);
  191. }
  192. }
  193. }
  194. }