import 'package:fis_common/index.dart'; import 'package:fis_jsonrpc/rpc.dart'; import 'package:get/get.dart'; import 'package:uuid/uuid.dart'; import 'package:vitalapp/architecture/storage/text_storage.dart'; import 'package:vitalapp/architecture/utils/datetime.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/managers/interfaces/patient.dart'; import 'package:vitalapp/pages/home/controller.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/controller.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/state/list.dart'; import 'package:vitalapp/pages/medical_checkup_station/registration/widgets/form/index.dart'; class RegistrationFormController { late RegistrationController registrationController; RegistrationFormController( RegistrationController controller, ) { registrationController = controller; } final state = ListState(); final _homeController = Get.find(); List selectGenderList = [ VSelectGenderEnumModel(code: GenderEnum.Female, name: "女"), VSelectGenderEnumModel(code: GenderEnum.Male, name: "男"), VSelectGenderEnumModel(code: GenderEnum.Unknown, name: "未知的性别"), VSelectGenderEnumModel(code: GenderEnum.Unspecified, name: "未说明的性别"), ]; /// 创建登记 Future createResident( PatientDTO? patient, { required bool isVital, }) async { AddRegiterInfoRequest addRegiterInfo = AddRegiterInfoRequest(); addRegiterInfo.adress = patient?.patientAddress; addRegiterInfo.age = DataTimeUtils.calculateAge( patient?.birthday ?? DateTime.now(), ); addRegiterInfo.iDCardNo = patient?.cardNo; addRegiterInfo.name = patient?.patientName; addRegiterInfo.phone = patient?.phone; addRegiterInfo.nationality = patient?.nationality; addRegiterInfo.permanentResidenceAddress = patient?.permanentResidenceAddress; addRegiterInfo.sex = RegistrationInfoModel.getGenderString(patient?.patientGender); addRegiterInfo.birthday = patient?.birthday?.toLocal(); addRegiterInfo.code = await saveCachedBatchNumber(patient?.cardNo); addRegiterInfo.projectType = isVital ? VitalProjectTypeEnum.VinnoHealth : VitalProjectTypeEnum.VitalStation; AddRegiterInfoResult? infoResult = await registrationController.registrationManager.addRegiterInfoAsync( request: addRegiterInfo, ); // 登记失败 if (infoResult == null) { return; } if (infoResult.isNewPatient) { await Get.find() .switchCurrentPatientByCode(patient!.cardNo!); Get.toNamed("/patient/info"); } else { PromptBox.toast('新建成功'); } } /// 创建登记 Future createResidentFromRegistrationInfoModel( RegistrationInfoModel? patient, { required bool isVital, }) async { AddRegiterInfoRequest addRegiterInfo = AddRegiterInfoRequest(); addRegiterInfo.adress = patient?.patientAddress; addRegiterInfo.age = DataTimeUtils.calculateAge( patient?.birthday ?? DateTime.now(), ); addRegiterInfo.iDCardNo = patient?.cardNo; addRegiterInfo.name = patient?.patientName; addRegiterInfo.phone = patient?.phone; addRegiterInfo.nationality = patient?.nationality; addRegiterInfo.permanentResidenceAddress = patient?.permanentResidenceAddress; addRegiterInfo.sex = RegistrationInfoModel.getGenderString(patient?.patientGender); addRegiterInfo.birthday = patient?.birthday?.toLocal(); addRegiterInfo.code = await saveCachedBatchNumber(patient?.cardNo); addRegiterInfo.projectType = isVital ? VitalProjectTypeEnum.VinnoHealth : VitalProjectTypeEnum.VitalStation; AddRegiterInfoResult? infoResult = await registrationController.registrationManager.addRegiterInfoAsync( request: addRegiterInfo, ); // 登记失败 if (infoResult == null) { return; } if (infoResult.isNewPatient) { await Get.find() .switchCurrentPatientByCode(patient!.cardNo!); Get.toNamed("/patient/info"); } else { PromptBox.toast('新建成功'); } } Future saveCachedBatchNumber(String? cardNo) async { String batchNumber = const Uuid().v4().replaceAll('-', ''); TextStorage cachedRecord = TextStorage( fileName: 'batchNumber', directory: "patient/${cardNo}", ); await cachedRecord.save(batchNumber); return batchNumber; } /// 编辑登记 Future editResident(RegistrationInfoModel? patient) async { UpdateRegiterInfoRequest editRegiterInfo = UpdateRegiterInfoRequest(); editRegiterInfo.adress = patient?.patientAddress; editRegiterInfo.age = DataTimeUtils.calculateAge( patient?.birthday ?? DateTime.now(), ); editRegiterInfo.birthday = patient?.birthday; editRegiterInfo.iDCardNo = patient?.cardNo; editRegiterInfo.name = patient?.patientName; editRegiterInfo.phone = patient?.phone; editRegiterInfo.sex = RegistrationInfoModel.getGenderString(patient?.patientGender); editRegiterInfo.code = patient?.code; final result = await registrationController.registrationManager.updateRegiterInfoAsync( request: editRegiterInfo, ); if (result == true) { await registrationController.listController.getRegisterInfoPage(); } } /// 创建登记之前查看有没有预约 Future getExamBookingByIDCard(String idCard) async { return await registrationController.appointmentManager .getExamBookingByIDCardAsync( idCardNo: idCard, ); } /// 若未预约则需要补充手机号信息 Future fillInIdentityInfo(PatientDTO? patient) async { RegistrationInfoModel patientInfo = RegistrationInfoModel(); if (patient != null) { patientInfo = RegistrationInfoModel.fromPatientDTO(patient); } // RegistrationInfoModel from PatientDTO final RegistrationInfoModel? result = await Get.dialog( RegistrationFormDialog(patient: patientInfo), barrierDismissible: false, ); if (result == null) { return null; } if (patient != null) { patient.cardNo = result.cardNo; patient.patientName = result.patientName; patient.patientGender = result.patientGender ?? GenderEnum.Unknown; patient.birthday = result.birthday; patient.phone = result.phone; patient.patientAddress = result.patientAddress; } return patient; } /// 提交 Future confirmSubmit({ required PatientDTO patient, required bool isVital, }) async { if (patient.cardNo == null) { return; } /// 判断是否预约过,若未预约则需要更新手机号信息 HealthExamPersonDTO? healthExamPerson = await getExamBookingByIDCard( patient.cardNo!, ); if (healthExamPerson != null) { patient.cardNo = healthExamPerson.identityCard; patient.patientGender = healthExamPerson.gender == PatientGenderEnum.Male ? GenderEnum.Male : GenderEnum.Female; patient.patientName = healthExamPerson.name; patient.phone = healthExamPerson.phone; if (patient.patientAddress.isNotNullOrEmpty) { patient.patientAddress = patient.patientAddress; } } else { if (patient.phone.isNullOrEmpty) { ///判断是否录入过居民信息,若录入过则加载录入时的手机号 final patientDto = await registrationController.getPatientByID(patient.cardNo!); if (patientDto != null) { patient.phone = patientDto.phone; } ///若未预约也未录入则需要更新手机号 PatientDTO? currentPatient = await fillInIdentityInfo(patient); if (currentPatient != null) { patient = currentPatient; await createResidentInList( patient: patient, isVital: isVital, ); } else { return; } } else { PatientDTO? currentPatient = await fillInIdentityInfo(patient); if (currentPatient != null) { patient = currentPatient; await createResidentInList( patient: patient, isVital: isVital, ); } } } } /// 提交数据给server 生成登记列表 Future createResidentInList({ required PatientDTO patient, required bool isVital, }) async { await createResident( patient, isVital: isVital, ); await registrationController.listController.getRegisterInfoPage(); } /// 提交数据给server 生成登记列表 Future createResidentInListFromRegistrationInfoModel({ required RegistrationInfoModel patient, required bool isVital, }) async { await createResidentFromRegistrationInfoModel( patient, isVital: isVital, ); await registrationController.listController.getRegisterInfoPage(); } }