patient.dart 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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/database/entities/patient.dart';
  7. import 'package:vitalapp/global.dart';
  8. import 'package:vitalapp/managers/interfaces/models/patient_model_dto.dart';
  9. import 'package:vitalapp/managers/interfaces/patient.dart';
  10. import 'package:vitalapp/mock/services/patient.dart';
  11. import 'package:vitalapp/rpc.dart';
  12. import 'package:fis_common/logger/logger.dart';
  13. import 'package:vitalapp/store/store.dart';
  14. class PatientManager implements IPatientManager {
  15. String? get userCode => Store.user.userCode;
  16. @override
  17. Future<String?> create(CreatePatientRequest request) async {
  18. request.token = Store.user.token;
  19. request.code = request.cardNo;
  20. final result = await rpc.patient.createPatientAsync(request);
  21. return result;
  22. }
  23. @override
  24. Future<List<PatientModelDTO>?> getPagedOfflineList(
  25. PatientPageRequest request) async {
  26. final keyword = request.keyword;
  27. final isKeywordQuery = keyword != null && keyword.isNotEmpty;
  28. final query = db.repositories.patient.queryable.where((x) {
  29. final List<IDbColumnCondition> arr = [];
  30. arr.add(x.isValid.equals(true));
  31. arr.add(x.orgCode.equals(Store.user.organizationCode));
  32. arr.add(x.syncState.notEquals(OfflineDataSyncState.success));
  33. if (!isKeywordQuery) {
  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. if (isKeywordQuery) {
  44. // 姓名查询
  45. query.and((x) => x.name.like("%$keyword%"));
  46. // 身份照查询
  47. query.or((x) => x.code.like("%$keyword%"));
  48. }
  49. final entities =
  50. await query.orderBy((x) => x.createTime, DbOrderByType.desc).toList();
  51. final dtos = entities.map((e) {
  52. var patientModel = PatientModelDTO.fromJson(jsonDecode(e.dataJson));
  53. patientModel.isExistLocalData = true;
  54. return patientModel;
  55. }).toList();
  56. return dtos;
  57. }
  58. @override
  59. Future<PatientDTO?> getDetail(String code) async {
  60. try {
  61. final request = GetPatientRequest(code: code, token: Store.user.token);
  62. if (kIsOnline) {
  63. //在线状态,先查询是否存在本体未提交数据
  64. final entity = await db.repositories.patient.singleByCode(code);
  65. if (entity != null &&
  66. entity.dataJson.isNotEmpty &&
  67. entity.syncState != OfflineDataSyncState.success) {
  68. logger.i("PatientManager query patient detail location exist.");
  69. final jsonMap = jsonDecode(entity.dataJson);
  70. final dto = PatientDTO.fromJson(jsonMap);
  71. return dto;
  72. } else {
  73. logger.i("PatientManager query patient detail location not exist.");
  74. }
  75. }
  76. final result = await rpc.patient.getPatientDetailAsync(request);
  77. return result;
  78. } catch (e) {
  79. logger.e("PatientManager query patient detail error.", e);
  80. return null;
  81. }
  82. }
  83. @override
  84. Future<PageCollection<PatientModelDTO>?> getPagedList(
  85. PatientPageRequest request) async {
  86. PageCollection<PatientModelDTO>? listPatientDto =
  87. PageCollection<PatientModelDTO>();
  88. try {
  89. request.token = Store.user.token;
  90. final result = await rpc.patient.getPatientPageAsync(request);
  91. listPatientDto.dataCount = result.dataCount;
  92. listPatientDto.pageData = [];
  93. for (var element in result.pageData!) {
  94. var patientModel = PatientModelDTO.fromJson(element.toJson());
  95. var isNotUploadedPatient =
  96. await db.repositories.patient.isNotUploadedPatient(element.code!);
  97. if (isNotUploadedPatient) {
  98. if (kIsOnline) {
  99. continue;
  100. } else {
  101. patientModel.isExistLocalData = true;
  102. }
  103. } else {
  104. final localCount = await db.repositories.diagnosis
  105. .getNotUploadedCountByPatientCode(
  106. element.code!, Store.user.userCode!);
  107. if (localCount > 0) {
  108. patientModel.isExistLocalData = true;
  109. }
  110. }
  111. listPatientDto.pageData?.add(patientModel);
  112. }
  113. return listPatientDto;
  114. } catch (e) {
  115. logger.e("PatientManager query patient paged list error.", e);
  116. return null;
  117. }
  118. }
  119. @override
  120. Future<bool> updatePatientAsync(UpdatePatientRequest request) async {
  121. try {
  122. if (kIsOnline) {
  123. await _updateLocationPatientAsync(request);
  124. }
  125. final result = await rpc.patient.updatePatientAsync(request);
  126. return result;
  127. } catch (e) {
  128. return false;
  129. }
  130. }
  131. ///在线编辑居民信息时,同步更改本地缓存
  132. Future<bool> _updateLocationPatientAsync(UpdatePatientRequest request) async {
  133. final code = request.code!;
  134. final existEntity = await _checkPatientExist(code);
  135. PatientEntity entity;
  136. PatientDTO dto;
  137. if (existEntity == null) {
  138. entity = PatientEntity();
  139. entity.code = request.code!;
  140. entity.isValid = true;
  141. entity.name = request.patientName!;
  142. entity.userCode = Store.user.userCode!; //添加用户code
  143. entity.syncState = OfflineDataSyncState.success;
  144. dto = PatientDTO();
  145. ModelConverter.syncUpdate2Dto(dto, request);
  146. final dtoJson = dto.toJson();
  147. entity.dataJson = jsonEncode(dtoJson);
  148. final id = await db.repositories.patient.insert(entity);
  149. return id > 0;
  150. } else {
  151. entity = existEntity;
  152. final jsonMap = jsonDecode(entity.dataJson);
  153. dto = PatientDTO.fromJson(jsonMap);
  154. ModelConverter.syncUpdate2Dto(dto, request);
  155. final dtoJson = dto.toJson();
  156. entity.dataJson = jsonEncode(dtoJson);
  157. final rows = await db.repositories.patient.update(entity);
  158. return rows > 0;
  159. }
  160. }
  161. Future<PatientEntity?> _checkPatientExist(String code) async {
  162. try {
  163. final entity = await db.repositories.patient.singleByCode(code);
  164. return entity;
  165. } catch (e) {
  166. logger.e(
  167. "PatientServiceMock - Check patient exist error. Code: $code.", e);
  168. }
  169. return null;
  170. }
  171. @override
  172. Future<bool> setCrowdLabelsAsync(
  173. String patientCode, List<String> crowLabels) async {
  174. try {
  175. final request = SetCrowdLabelsRequest(
  176. code: patientCode, crowdLabels: crowLabels, token: Store.user.token);
  177. final result = rpc.patient.setCrowdLabelsAsync(request);
  178. return result;
  179. } catch (e) {
  180. return false;
  181. }
  182. }
  183. @override
  184. Future<String> createPatientExtensionAsync(
  185. CreatePatientExtensionRequest request) async {
  186. try {
  187. final result =
  188. await rpc.patientExtension.createPatientExtensionAsync(request);
  189. return result;
  190. } catch (e) {
  191. return '';
  192. }
  193. }
  194. @override
  195. Future<PatientExtensionDTO?> getPatientExtensionDetailByCodeAndKeyAsync(
  196. GetPatientExtensionByCodeAndKeyRequest request) async {
  197. try {
  198. final result = await rpc.patientExtension
  199. .getPatientExtensionDetailByCodeAndKeyAsync(request);
  200. return result;
  201. } catch (e) {
  202. return null;
  203. }
  204. }
  205. @override
  206. ///更新居民健康信息
  207. Future<bool> updatePatientExtensionAsync(
  208. UpdatePatientExtensionRequest request) async {
  209. try {
  210. final result =
  211. await rpc.patientExtension.updatePatientExtensionAsync(request);
  212. return result;
  213. } catch (e) {}
  214. return false;
  215. }
  216. ///获取所有userCode为空的数据,并赋值
  217. @override
  218. Future<void> resettingUsercodeIsEmptyData() async {
  219. var version = await db.database.getVersion();
  220. if (version > 0) {
  221. final list = await db.repositories.patient.queryable.where((x) {
  222. final List<IDbColumnCondition> arr = [];
  223. arr.add(x.isValid.equals(true));
  224. arr.add(x.userCode.equals(''));
  225. return arr;
  226. }).toList();
  227. logger.w(
  228. "PatientManager resettingUsercodeIsEmptyData list.count:${list.length}.");
  229. for (var element in list) {
  230. if (element.syncState == OfflineDataSyncState.success) {
  231. var result = await getDetail(element.code);
  232. if (result != null) {
  233. element.userCode = result.createdDoctor!;
  234. }
  235. } else {
  236. element.userCode = Store.user.userCode!;
  237. }
  238. await db.repositories.patient.update(element);
  239. }
  240. // 更新归属于该医生下的居民的组织Code
  241. final orgCode = Store.user.organizationCode;
  242. final userCode = Store.user.userCode;
  243. await db.database.execute(
  244. "UPDATE patients SET orgCode = '$orgCode' WHERE 1=1 AND isValid=1 AND orgCode='' AND userCode='$userCode';");
  245. }
  246. }
  247. @override
  248. Future<void> switchCurrentPatient(PatientDTO dto) async {
  249. try {
  250. PatientEntity? entity =
  251. await db.repositories.patient.singleByCode(dto.code!);
  252. if (entity == null) {
  253. entity = PatientEntity();
  254. entity.isValid = true;
  255. entity.code = dto.code!;
  256. entity.userCode = userCode!;
  257. entity.orgCode = Store.user.organizationCode;
  258. // 从在线数据中刚获取的,不需要同步
  259. entity.syncState = OfflineDataSyncState.success;
  260. entity.overallSyncState = OfflineDataSyncState.success;
  261. // 先创建,后面统一代码更新
  262. final id = await db.repositories.patient.insert(entity);
  263. entity.id = id;
  264. } else {
  265. entity.updateTime = DateTime.now();
  266. }
  267. entity.name = dto.patientName!;
  268. final dtoJsonMap = dto.toJson();
  269. entity.dataJson = jsonEncode(dtoJsonMap);
  270. await db.repositories.patient.update(entity);
  271. Store.user.currentSelectPatientInfo = dto;
  272. } catch (e) {
  273. logger.e("PatientManager switchCurrentPatient-${dto.code} error.", e);
  274. }
  275. }
  276. }