remedical_Manager.dart 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. import 'package:fis_common/helpers/encrypt.dart';
  2. import 'package:fis_i18n/i18n.dart';
  3. import 'package:fis_jsonrpc/rpc.dart';
  4. import 'package:get/get.dart';
  5. import 'package:fis_common/logger/logger.dart';
  6. import 'package:vitalapp/helper/utc_dateTime_converter.dart';
  7. import 'package:vitalapp/managers/interfaces/remedical.dart';
  8. import 'package:vitalapp/pages/patient/create/widgets/patient_info.dart';
  9. import 'package:vitalapp/rpc.dart';
  10. import 'interfaces/base_manager.dart';
  11. import 'interfaces/models/process_arg.dart';
  12. import 'package:fis_common/event/event_type.dart';
  13. import 'simple_Info.dart';
  14. class RemedicalManager extends BaseManager implements IRemedicalManager {
  15. final processChange = FEventHandler<ProcessArg>();
  16. @override
  17. Future<PageResult<ClientPatientInfoBaseDTO>> findPatients({
  18. int pageIndex = 1,
  19. int pageSize = 20,
  20. String keyWord = '',
  21. DateTime? startDateTime,
  22. DateTime? endDateTime,
  23. PatientValidStatusEnum isValid = PatientValidStatusEnum.All,
  24. }) async {
  25. final patients = await rpc.patient.findPatientsAsync(
  26. FindPatientsPageRequest(
  27. token: token,
  28. pageIndex: pageIndex,
  29. pageSize: pageSize,
  30. keyWord: keyWord,
  31. startTime: startDateTime,
  32. endTime: endDateTime,
  33. isValid: isValid,
  34. ),
  35. );
  36. return patients;
  37. }
  38. @override
  39. Future<bool> createPatientByUnregisteredAsync(String patientName,
  40. {String? code}) async {
  41. final name = FEncryptHelper.encodeBase64(patientName);
  42. final result = await rpc.patient.createPatientByUnregisteredAsync(
  43. CreatePatientByUnregisteredRequest(
  44. token: token,
  45. patientName: name,
  46. unregisteredPatientCode: code,
  47. ),
  48. );
  49. return result;
  50. }
  51. @override
  52. Future<String> createUnregisteredPatient(String patientName,
  53. {String? code}) async {
  54. final name = FEncryptHelper.encodeBase64(patientName);
  55. final result = await rpc.patient.createUnregisteredPatientAsync(
  56. CreatePatientByUnregisteredRequest(
  57. token: token,
  58. patientName: name,
  59. unregisteredPatientCode: code,
  60. ),
  61. );
  62. return result;
  63. }
  64. @override
  65. Future<List<SimpleInfoItem>> findSimpleInfoPatients({
  66. int pageIndex = 1,
  67. int pageSize = 20,
  68. String keyWord = '',
  69. DateTime? startDateTime,
  70. DateTime? endDateTime,
  71. PatientValidStatusEnum isValid = PatientValidStatusEnum.All,
  72. bool isCounsultationPatient = false,
  73. }) async {
  74. PageResult<ClientPatientInfoBaseDTO> patients;
  75. if (isCounsultationPatient) {
  76. patients = await rpc.liveConsultation.findConsultationPatientAsync(
  77. FindConsultationPatientPageRequest(
  78. token: token,
  79. keyword: keyWord,
  80. pageIndex: pageIndex,
  81. pageSize: pageSize,
  82. ),
  83. );
  84. } else {
  85. patients = await findPatients(
  86. keyWord: keyWord,
  87. pageIndex: pageIndex,
  88. pageSize: pageSize,
  89. startDateTime: startDateTime,
  90. endDateTime: endDateTime,
  91. );
  92. }
  93. List<SimpleInfoItem> items = [];
  94. for (ClientPatientInfoBaseDTO p in patients.pageData ?? []) {
  95. List<DataItemDTO> patientData = p.patientData ?? [];
  96. var identityCard = patientData
  97. .firstWhereOrNull((element) => element.key == 'IdentityCard');
  98. items.add(
  99. SimpleInfoItem(
  100. itemCode: p.patientCode ?? '',
  101. name: _getPatientName(patientData),
  102. image: patientData
  103. .firstWhereOrNull((element) => element.key == 'HeadImgUrl')
  104. ?.value,
  105. role: patientData
  106. .firstWhereOrNull((element) => element.key == 'Phone')
  107. ?.value,
  108. des: [
  109. identityCard == null ? '' : identityCard.value,
  110. ],
  111. ),
  112. );
  113. }
  114. return items;
  115. }
  116. String? _getPatientName(List<DataItemDTO> patientData) {
  117. var name =
  118. patientData.firstWhereOrNull((element) => element.key == 'Name')?.value;
  119. if (name == null || name.isEmpty) {
  120. name = patientData
  121. .firstWhereOrNull((element) => element.key == 'AnimalInfoName')
  122. ?.value;
  123. }
  124. return name;
  125. }
  126. @override
  127. PatientInfo dtoConvertToPatientInfo(ClientPatientInfoDTO patientInfoDto) {
  128. var patientData = patientInfoDto.patientData ?? [];
  129. var encryptFullName = patientInfoDto.encryptFullName ?? '';
  130. var name = getKeyValue(patientData, ['Name', 'AnimalInfoName']);
  131. var phone = getKeyValue(patientData, ['Phone', 'AnimalInfoPhone']);
  132. var id = getKeyValue(
  133. patientData,
  134. ['IdentityCard', 'AnimalInfoIdentityCard'],
  135. );
  136. var insuranceCode = getKeyValue(patientData, ['InsuranceCode']);
  137. var sex = getKeyValue(
  138. patientData,
  139. ['Sex', 'AnimalInfoSex'],
  140. );
  141. return PatientInfo();
  142. }
  143. @override
  144. List<DataItemDTO>? convertPatientInfoToPatientDatas(
  145. PatientInfo? patientInfo) {
  146. if (patientInfo == null) {
  147. return [];
  148. }
  149. return [];
  150. }
  151. /// 根据后端接口的key值取到对应的value
  152. ///
  153. /// [patientData] 后端数据
  154. ///
  155. /// [keys] 对应的Key值
  156. @override
  157. String getKeyValue(
  158. List<DataItemDTO> patientData,
  159. List<String> keys,
  160. ) {
  161. return patientData.firstWhereOrNull((element) {
  162. return keys.contains(element.key);
  163. })?.value ??
  164. '';
  165. }
  166. @override
  167. Future<ClientPatientInfoDTO> findPatientByCode(
  168. String patientCode,
  169. ) async {
  170. return await rpc.remoteUltrasound.vitalFindPatientByCodeAsync(
  171. FindPatientByCodeRequest(
  172. code: patientCode,
  173. token: token,
  174. ),
  175. );
  176. }
  177. // @override
  178. // Future<List<FSelectModel>> findScanPositions() async {
  179. // List<FSelectModel> scanPositionsList = [];
  180. // return scanPositionsList;
  181. // }
  182. /// 获取测量图像
  183. @override
  184. Future<List<RemedicalMeasuredInfoDTO>> findRemedicalMeasuredInfoAsync(
  185. String recordCode,
  186. {BusinessTypeEnum businessType =
  187. BusinessTypeEnum.RemoteDiagnosis}) async {
  188. List<RemedicalMeasuredInfoDTO> result = [];
  189. try {
  190. result = await rpc.remoteUltrasound.vitalFindRemedicalMeasuredInfoAsync(
  191. FindRemedicalMeasuredInfoRequest(
  192. token: token,
  193. recordCode: recordCode,
  194. businessType: businessType,
  195. ),
  196. );
  197. return result;
  198. } catch (e) {
  199. logger.i("findRemedicalMeasuredInfoAsync exception:" + e.toString());
  200. }
  201. return result;
  202. }
  203. @override
  204. Future<List<ReportDTO>> findExamReports(String recordCode) async {
  205. try {
  206. var result = await rpc.ultrasoundReport.vitalFindReportsAsync(
  207. FindReportsRequest(
  208. token: token,
  209. recordCode: recordCode,
  210. ),
  211. );
  212. return result;
  213. } catch (e) {
  214. logger.e('RemedicalManager findExamReports ex:$e');
  215. return [];
  216. }
  217. }
  218. ///查询检查详情
  219. @override
  220. Future<QueryRecordResult?> queryRecordInfoAsync(String recordCode) async {
  221. try {
  222. return await rpc.remoteUltrasound.vitalQueryRecordInfoAsync(
  223. QueryRecordRequest(
  224. token: token,
  225. recordCode: recordCode,
  226. ),
  227. );
  228. } catch (e) {
  229. print('error:$recordCode');
  230. logger.i('queryRecordInfoAsync recordCode:$recordCode');
  231. logger.e('RemedicalManager queryRecordInfoAsync ex:', e);
  232. return null;
  233. }
  234. }
  235. @override
  236. Future<List<RemedicalAISelectedInfoDTO>> findAIImages(
  237. String recordCode, String patientId) async {
  238. final result = await rpc.remedical.getPatientAISelectedInfosAsync(
  239. GetPatientAISelectedInfosRequest(
  240. token: token,
  241. recordCode: recordCode,
  242. patientCode: patientId,
  243. ),
  244. );
  245. return result;
  246. }
  247. @override
  248. bool checkCarotidList(
  249. RemedicalItemList remedicalItem, CarotidScanTypeEnum scanTypeEnum) {
  250. return (remedicalItem.remedicalList
  251. ?.where(
  252. (element) =>
  253. element.carotidResult != null &&
  254. element.carotidResult?.carotidScanType == scanTypeEnum,
  255. )
  256. .toList() ??
  257. [])
  258. .isNotEmpty;
  259. }
  260. @override
  261. Future<RemedicalInfoDTO> findRemedicalByCode(String remedicalCode) async {
  262. return rpc.remoteUltrasound.vitalFindRemedicalByCodeAsync(
  263. FindRemedicalByCodeRequest(
  264. remedicalCode: remedicalCode,
  265. token: token,
  266. ),
  267. );
  268. }
  269. @override
  270. Future<PageResult<SimpleRecordInfoDTO>> findRecordPages({
  271. List<String>? organizationCodes,
  272. List<String>? deviceCodes,
  273. RecordQueryStateEnum recordQueryState = RecordQueryStateEnum.All,
  274. RecordProcessStateEnum recordProcessState = RecordProcessStateEnum.All,
  275. String? keyWord,
  276. DateTime? startTime,
  277. DateTime? endTime,
  278. String? patientCode,
  279. int pageIndex = 1,
  280. int pageSize = 20,
  281. }) async {
  282. try {
  283. return await rpc.remoteUltrasound.vitalFindRecordPagesAsync(
  284. FindRecordPagesRequest(
  285. token: token,
  286. pageIndex: pageIndex,
  287. pageSize: pageSize,
  288. organizationCodes: organizationCodes,
  289. deviceCodes: deviceCodes,
  290. keyWord: keyWord,
  291. recordQueryState: recordQueryState,
  292. language: i18nBook.locale.toCodeString('-'),
  293. recordProcessState: recordProcessState,
  294. patientCode: patientCode,
  295. startTime: UtcDateConverter.getDayStartOrEndUTCTime(startTime),
  296. endTime:
  297. UtcDateConverter.getDayStartOrEndUTCTime(endTime, isEnd: true),
  298. ),
  299. );
  300. } catch (e) {
  301. logger.e('RemedicalManager findRecordPages ex:$e');
  302. return PageResult<SimpleRecordInfoDTO>();
  303. }
  304. }
  305. @override
  306. void openImageMeasurePage(
  307. String imageUrl,
  308. int imageindex,
  309. String remedicalCode,
  310. String recordCode,
  311. String? remedicalAISelectedInfoCode,
  312. String patientCode) {}
  313. }