123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- import 'package:fis_common/index.dart';
- import 'package:fis_jsonrpc/rpc.dart';
- import 'package:get/get.dart';
- import 'package:intl/intl.dart';
- import 'package:vitalapp/architecture/defines.dart';
- import 'package:vitalapp/architecture/types/kv.dart';
- import 'package:vitalapp/architecture/utils/datetime.dart';
- import 'package:vitalapp/consts/rpc_enum_labels.dart';
- import 'package:vitalapp/managers/interfaces/models/crowd_labels.dart';
- import 'package:vitalapp/managers/interfaces/patient.dart';
- import 'package:vitalapp/pages/patient/info/widgets/ext_model.dart';
- import 'package:vitalapp/store/store.dart';
- class PatientInfomationState {
- final RxString _code = RxString("");
- final RxString _name = RxString("");
- final Rx<CardTypeEnum> _cardType = Rx<CardTypeEnum>(CardTypeEnum.Identity);
- final RxString _cardNo = RxString("");
- final Rx<GenderEnum?> _gender = Rx<GenderEnum?>(GenderEnum.Male);
- final RxString _nation = RxString("");
- final Rx<DateTime?> _birthday = Rx<DateTime?>(null);
- final RxString _age = RxString("");
- final RxString _phoneNo = RxString("");
- final RxString _emergencyName = RxString("");
- final RxString _emergencyPhone = RxString("");
- final RxString _address = RxString("");
- final RxString _permanentResidenceAddress = RxString("");
- final RxString _createdOrgName = RxString("");
- final RxString _createdDoctorName = RxString("");
- final RxString _contractedDoctorName = RxString("");
- final RxString _createTime = RxString("");
- final Rx<PatientDetailInfoModel> _detailInfo = Rx<PatientDetailInfoModel>(
- PatientDetailInfoModel(permanentlyResideType: "1"));
- final RxBool _isSyncAddresses = RxBool(true);
- final RxString _villageCode = RxString('');
- final Rx<PatientDTO> _dto = Rx<PatientDTO>(
- PatientDTO(),
- );
- final RxList<String> _labels = RxList<String>();
- final _patientManager = Get.find<IPatientManager>();
- /// 村选项集合
- List<StringKVModel> get villageOptions => Store.user.residence;
- ///过敏史选中默认值
- RxBool _selectedAllergyHistory = RxBool(false);
- //既往史
- RxBool _selectedAllMedicalHistory = RxBool(false);
- //家族病史
- RxBool _selectedAllFamilyMedicalHistory = RxBool(false);
- //遗传病史
- RxBool _selectAllGeneticHistory = RxBool(false);
- //生活环境
- RxBool _livingEnvironment = RxBool(false);
- /// 健康信息
- final Rx<PatientHealthInfoModel> _healthInfo =
- Rx<PatientHealthInfoModel>(PatientHealthInfoModel());
- ///服务区域
- String get villageCode => _villageCode.value;
- set villageCode(String v) => _villageCode.value = v;
- /// 村/居委会 名称
- String get villageName {
- String name = "";
- if (villageCode.isNotEmpty) {
- final dto = villageOptions.firstWhereOrNull((e) => e.key == villageCode);
- if (dto != null) {
- name = dto.value;
- }
- }
- return name;
- }
- /// 详细信息
- PatientDetailInfoModel get detailInfo => _detailInfo.value;
- set detailInfo(PatientDetailInfoModel v) => _detailInfo.value = v;
- ///同步户籍地址到现住地址
- bool get isSyncAddresses => _isSyncAddresses.value;
- set isSyncAddresses(bool v) => _isSyncAddresses.value = v;
- void refreshDetailInfo() {
- _detailInfo.refresh();
- }
- bool get livingEnvironment => _livingEnvironment.value;
- set livingEnvironment(bool v) => _livingEnvironment.value = v;
- bool get selectAllGeneticHistory => _selectAllGeneticHistory.value;
- set selectAllGeneticHistory(bool v) => _selectAllGeneticHistory.value = v;
- bool get selectedAllFamilyMedicalHistory =>
- _selectedAllFamilyMedicalHistory.value;
- set selectedAllFamilyMedicalHistory(bool v) =>
- _selectedAllFamilyMedicalHistory.value = v;
- bool get selectedAllergyHistory => _selectedAllergyHistory.value;
- set selectedAllergyHistory(bool v) => _selectedAllergyHistory.value = v;
- bool get selectedAllMedicalHistory => _selectedAllMedicalHistory.value;
- set selectedAllMedicalHistory(bool v) => _selectedAllMedicalHistory.value = v;
- /// 健康信息
- PatientHealthInfoModel get healthInfo => _healthInfo.value;
- set healthInfo(PatientHealthInfoModel v) => _healthInfo.value = v;
- void refreshHealthInfo() {
- _healthInfo.refresh();
- }
- /// 居民编号
- String get code => _code.value;
- set code(String val) => _code.value = val;
- /// 姓名
- String get name => _name.value;
- set name(String val) => _name.value = val;
- /// 年龄
- String get age => _age.value;
- /// 手机号
- String get phoneNo => _phoneNo.value;
- set phoneNo(String val) => _phoneNo.updateValue(val);
- String get emergencyName => _emergencyName.value;
- set emergencyName(String val) => _emergencyName.updateValue(val);
- /// 紧急联系手机号
- String get emergencyPhone => _emergencyPhone.value;
- set emergencyPhone(String val) => _emergencyPhone.updateValue(val);
- /// 地址
- String get address => _address.value;
- set address(String val) => _address.updateValue(val);
- /// 户籍地址
- String get permanentResidenceAddress => _permanentResidenceAddress.value;
- set permanentResidenceAddress(String val) {
- if (val != _permanentResidenceAddress.value) {
- _permanentResidenceAddress.value = val;
- if (isSyncAddresses) {
- _address.value = val;
- }
- }
- }
- /// 性别
- GenderEnum? get gender => _gender.value;
- set gender(GenderEnum? val) => _gender.updateValue(val);
- /// 性别描述
- String get genderDesc => gender != null ? RpcEnumLabels.gender[gender]! : "";
- /// 民族
- String get nation => _nation.value;
- set nation(String val) => _nation.updateValue(val);
- /// 证件类型
- CardTypeEnum get cardType => _cardType.value;
- set cardType(CardTypeEnum val) => _cardType.updateValue(val);
- /// 证件号
- String get cardNo => _cardNo.value;
- set cardNo(String val) {
- _cardNo.updateValue(val);
- if (cardType == CardTypeEnum.Identity) {
- if (val.length != 18) return;
- birthday = extractBirthDateFromIDCard(val);
- gender = checkGenderFromID(val);
- labels = checkLabelsFromID(val);
- }
- }
- ///人群标签
- List<String> get labels => _labels.value;
- set labels(List<String> v) => _labels.value = v;
- ///刷新标签
- void refreshLabels() {
- _labels.refresh();
- }
- GenderEnum checkGenderFromID(String idNumber) {
- if (idNumber.isNullOrEmpty) {
- return GenderEnum.Unspecified;
- }
- int secondLastDigit = int.parse(idNumber[idNumber.length - 2]);
- if (secondLastDigit % 2 == 0) {
- return GenderEnum.Female;
- } else {
- return GenderEnum.Male;
- }
- }
- DateTime extractBirthDateFromIDCard(String idCardNumber) {
- final idCardRegex = RegExp(r'^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$');
- final match = idCardRegex.firstMatch(idCardNumber);
- if (match != null) {
- final year = int.parse(match.group(2)!);
- final month = int.parse(match.group(3)!);
- final day = int.parse(match.group(4)!);
- final birthDate = DateTime(year, month, day);
- return birthDate;
- }
- return DateTime(1970, 1, 1); // 返回一个默认值,表示无法提取出生日期
- }
- /// 生日
- DateTime? get birthday => _birthday.value;
- set birthday(DateTime? val) {
- if (val != _birthday.value && val != null) {
- _birthday.value = val;
- _age.value = DataTimeUtils.calculateAge(val);
- }
- }
- ///建档医院
- String get createdOrgName => _createdOrgName.value;
- set createdOrgName(String val) => _createdOrgName.updateValue(val);
- ///建档医师
- String get createdDoctorName => _createdDoctorName.value;
- set createdDoctorName(String val) => _createdDoctorName.updateValue(val);
- //建档时间
- String get createTime => _createTime.value;
- set createTime(String val) => _createTime.updateValue(val);
- ///责任医师
- String get contractedDoctorName => _contractedDoctorName.value;
- set contractedDoctorName(String val) =>
- _contractedDoctorName.updateValue(val);
- void updateDto(PatientDTO dto) {
- _dto.value = dto;
- code = dto.code ?? "";
- name = dto.patientName ?? "";
- cardType = dto.cardType;
- cardNo = dto.cardNo ?? "";
- gender = dto.patientGender;
- nation = dto.nationality ?? "";
- birthday = dto.birthday ?? DateTime(1970, 1, 1);
- phoneNo = dto.phone ?? "";
- emergencyName = dto.emergencyName ?? '';
- emergencyPhone = dto.emergencyPhone ?? "";
- // 地址不走Setter
- _address.value = dto.patientAddress ?? "";
- _permanentResidenceAddress.value = dto.permanentResidenceAddress ?? "";
- createdOrgName = dto.createdOrgName ?? "";
- createdDoctorName = dto.createdDoctorName ?? "";
- contractedDoctorName = dto.contractedDoctorName ?? "";
- createTime = DateFormat("yyyy-MM-dd")
- .format(dto.createTime?.toLocal() ?? DateTime.now());
- var dtoLabels = _patientManager.convertLabelsFormDto(dto.crowdLabels ?? []);
- for (var l in dtoLabels) {
- if (!labels.contains(l)) {
- labels.add(l);
- }
- }
- }
- List<String> checkLabelsFromID(String idCardNumber) {
- String birthDateString = idCardNumber.substring(6, 14);
- // 转换为DateTime对象
- DateTime birthDate = DateTime.parse(birthDateString);
- DateTime currentDate = DateTime.now();
- // 计算年龄
- int age = currentDate.year - birthDate.year;
- if (currentDate.month < birthDate.month ||
- (currentDate.month == birthDate.month &&
- currentDate.day < birthDate.day)) {
- age--;
- }
- if (age <= 6 && !labels.contains(CrowdLabels.CHILDREN)) {
- labels.add(CrowdLabels.CHILDREN);
- return labels;
- } else if (age >= 65 && !labels.contains(CrowdLabels.ELDERLY)) {
- labels.add(CrowdLabels.ELDERLY);
- return labels;
- } else {
- return labels;
- }
- }
- }
|