import 'dart:convert'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; import 'package:vitalapp/architecture/defines.dart'; import 'package:vitalapp/architecture/network_connectivity.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/architecture/values/features.dart'; import 'package:vitalapp/components/alert_dialog.dart'; import 'package:vitalapp/consts/diagnosis.dart'; import 'package:vitalapp/database/entities/defines.dart'; import 'package:vitalapp/global.dart'; import 'package:vitalapp/managers/interfaces/diagnosis.dart'; import 'package:vitalapp/managers/interfaces/dictionary.dart'; import 'package:vitalapp/managers/interfaces/models/diagnosis_aggregation_record_model.dart'; import 'package:vitalapp/managers/interfaces/patient.dart'; import 'package:vitalapp/managers/interfaces/record_data_cache.dart'; import 'package:vitalapp/pages/controllers/home_nav_mixin.dart'; import 'package:vitalapp/pages/facial_recognition/index.dart'; import 'package:vitalapp/store/store.dart'; import 'state.dart'; class PatientDetailController extends FControllerBase with HomeNavMixin { final state = PatientDetailState(); final _patientManager = Get.find(); @override void onInit() { WidgetsBinding.instance.addPostFrameCallback( (timeStamp) async { loadData(); if (Store.user.hasFeature(FeatureKeys.RecentTestRecords)) { await onReadLastRecordInfo(); } netChecker.onlineChangedEvent.addListener(_onlineChanged); }, ); super.onInit(); } void _onlineChanged(_, e) { state.isOnline = e; } /// 打开信息页 void gotoInfo() { Get.toNamed( "/patient/info", parameters: {"code": state.code}, ); } /// 前往随访页 void gotoFollowUp() { Get.toNamed( "/check/follow_up", parameters: {"patientCode": state.code, "patientName": state.name}, ); } /// 前往随访记录页 void gotoFollowUpRecord() { Get.toNamed( "/check/follow_up_record", parameters: {"patientCode": state.code, "patientName": state.name}, ); } /// 前往健康体检页 void gotoHealthCheck() { Get.toNamed( "/check/form", parameters: {"patientCode": state.code}, ); } /// 前往签约页 void gotoContract() { Get.toNamed( "/contract/package_list", parameters: {"patientCode": state.code}, ); } /// 前往转诊页 void gotoReferral() { // } /// 前往健康检测页 void gotoExam() { // Get.toNamed( "/medical", parameters: {"patientCode": state.code}, ); } /// 前往诊疗记录页 void gotoExamRecord() { // Get.toNamed( "/medical/records", parameters: {"patientCode": state.code}, ); } ///前往体检记录 void gotoHealthCheckRecord() { Get.toNamed( "/check/healthCheckRecord", parameters: {"patientCode": state.code}, ); } void gotoContractRecords() { Get.toNamed( "/contract/contract_records", parameters: {"patientCode": state.code}, ); } /// 询问是否需要人脸录入 Future queryIsNeedFaceInput() async { /// 拥有人脸权限并且不是身份证扫码建档 if (Store.user.hasFeature(FeatureKeys.FaceRecognition) && state.isOnline) { var dto = await getPatientPhoto(Store.user.currentSelectPatientInfo!.cardNo!); String? photoUrl = dto?.photos != null ? dto?.photos![0] : ""; if (photoUrl!.isNotEmpty) { await Get.dialog(VAlertDialog( contentPadding: const EdgeInsets.fromLTRB(20, 1, 20, 1), title: '提示', content: Container( margin: const EdgeInsets.only(bottom: 20), child: Column( mainAxisSize: MainAxisSize.min, children: [ Image.network(photoUrl, width: 300, height: 220, fit: BoxFit.cover, loadingBuilder: (context, child, progress) { if (progress == null || progress.cumulativeBytesLoaded == progress.expectedTotalBytes) { return Image.network( photoUrl, width: 300, height: 220, fit: BoxFit.cover, ); } return const CircularProgressIndicator( color: Colors.blueAccent); }), const Text("该居民已采集过人脸,是否重新采集?", style: TextStyle(fontSize: 20), textAlign: TextAlign.center), ], ), ), confirmLabel: '重新采集', cancelLabel: '跳过', showCancel: true, onConfirm: () async { await onFaceEntryClicked(dto); Get.back(); }, onCanceled: () { Get.back(); }, )); } else { await Get.dialog(VAlertDialog( contentPadding: const EdgeInsets.fromLTRB(20, 1, 20, 1), title: '提示', content: Container( margin: const EdgeInsets.only(bottom: 20), child: const Text( '采集人像,完成后可以使用人脸识别功能', style: TextStyle(fontSize: 20), textAlign: TextAlign.center, ), ), confirmLabel: '采集', cancelLabel: '暂不采集', showCancel: true, onConfirm: () async { await onFaceEntryClicked(dto); Get.back(); }, onCanceled: () { Get.back(); }, )); } } } /// 点击录入人脸 Future onFaceEntryClicked(PatientDTO? dto) async { bool? result = await Get.to( () => FacialRecognitionPage( mode: FacialRecognitionMode.faceInput, patientInfo: dto, ), ); if (result != null && result) { loadData(); PromptBox.toast('人脸数据存入成功'); } } Future getPatientPhoto(String patientCode) async { try { final dto = await _patientManager.getDetail(patientCode); return dto; } catch (e) { return null; } } Future loadData() async { state.code = Store.user.currentSelectPatientInfo?.code ?? ''; var dto = await getPatientPhoto(Store.user.currentSelectPatientInfo!.code!); dto ??= Store.user.currentSelectPatientInfo; if (dto != null) { dto.birthday = dto.birthday!.toLocal(); state.updateDto(dto); } } Future setCrowdLabelsAsync( List carowLabels, List crowdNames) async { final result = await _patientManager.setCrowdLabelsAsync(state.code, carowLabels); if (result) { state.updateCrowd(carowLabels, crowdNames); } return result; } /// 读取到最近检测记录的数据 Future onReadLastRecordInfo() async { if (Store.user.currentSelectPatientInfo?.code != null) { var diagnosisManager = Get.find(); List getRecords = []; var getLastRecords = await diagnosisManager.getDiagnosisAggregationPageAsync( Store.user.currentSelectPatientInfo!.code!, 1, 10); getRecords.addAll(getLastRecords?.pageData ?? []); var listRecords = await diagnosisManager .getListByPatientCode(Store.user.currentSelectPatientInfo!.code!); getRecords.addAll(listRecords ?? []); if (getRecords.isNotEmpty) { var lastRecordInfo = getRecords.reduce((curr, next) => (curr.diagnosisTime!).isAfter(next.diagnosisTime!) ? curr : next); state.isExistLocalData = lastRecordInfo.isExistLocalData ?? false; state.currentDiagnosis = await diagnosisManager.getTableData(lastRecordInfo); } } } @override void onClose() { netChecker.onlineChangedEvent.removeListener(_onlineChanged); } }