state.dart 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:get/get.dart';
  3. import 'package:intl/intl.dart';
  4. import 'package:vitalapp/architecture/defines.dart';
  5. import 'package:vitalapp/architecture/types/kv.dart';
  6. import 'package:vitalapp/architecture/utils/datetime.dart';
  7. import 'package:vitalapp/consts/rpc_enum_labels.dart';
  8. import 'package:vitalapp/pages/patient/info/widgets/ext_model.dart';
  9. import 'package:vitalapp/store/store.dart';
  10. class PatientInfomationState {
  11. final RxString _code = RxString("");
  12. final RxString _name = RxString("");
  13. final Rx<CardTypeEnum> _cardType = Rx<CardTypeEnum>(CardTypeEnum.Identity);
  14. final RxString _cardNo = RxString("");
  15. final Rx<GenderEnum> _gender = Rx<GenderEnum>(GenderEnum.Unspecified);
  16. final RxString _nation = RxString("");
  17. final Rx<DateTime?> _birthday = Rx<DateTime?>(null);
  18. final RxString _age = RxString("");
  19. final RxString _phoneNo = RxString("");
  20. final RxString _emergencyPhone = RxString("");
  21. final RxString _address = RxString("");
  22. final RxString _permanentResidenceAddress = RxString("");
  23. final RxString _createdOrgName = RxString("");
  24. final RxString _createdDoctorName = RxString("");
  25. final RxString _contractedDoctorName = RxString("");
  26. final RxString _createTime = RxString("");
  27. final Rx<PatientDetailInfoModel> _detailInfo =
  28. Rx<PatientDetailInfoModel>(PatientDetailInfoModel());
  29. final RxBool _isSyncAddresses = RxBool(true);
  30. final RxString _villageCode = RxString('');
  31. final Rx<PatientDTO> _dto = Rx<PatientDTO>(
  32. PatientDTO(),
  33. );
  34. /// 村选项集合
  35. List<StringKVModel> get villageOptions => Store.user.residence;
  36. /// 健康信息
  37. final Rx<PatientHealthInfoModel> _healthInfo =
  38. Rx<PatientHealthInfoModel>(PatientHealthInfoModel());
  39. ///服务区域
  40. String get villageCode => _villageCode.value;
  41. set villageCode(String v) => _villageCode.value = v;
  42. /// 村/居委会 名称
  43. String get villageName {
  44. String name = "";
  45. if (villageCode.isNotEmpty) {
  46. final dto = villageOptions.firstWhereOrNull((e) => e.key == villageCode);
  47. if (dto != null) {
  48. name = dto.value;
  49. }
  50. }
  51. return name;
  52. }
  53. /// 详细信息
  54. PatientDetailInfoModel get detailInfo => _detailInfo.value;
  55. set detailInfo(PatientDetailInfoModel v) => _detailInfo.value = v;
  56. ///同步户籍地址到现住地址
  57. bool get isSyncAddresses => _isSyncAddresses.value;
  58. set isSyncAddresses(bool v) => _isSyncAddresses.value = v;
  59. void refreshDetailInfo() {
  60. _detailInfo.refresh();
  61. }
  62. /// 健康信息
  63. PatientHealthInfoModel get healthInfo => _healthInfo.value;
  64. set healthInfo(PatientHealthInfoModel v) => _healthInfo.value = v;
  65. void refreshHealthInfo() {
  66. _healthInfo.refresh();
  67. }
  68. /// 居民编号
  69. String get code => _code.value;
  70. set code(String val) => _code.value = val;
  71. /// 姓名
  72. String get name => _name.value;
  73. set name(String val) => _name.value = val;
  74. /// 年龄
  75. String get age => _age.value;
  76. /// 手机号
  77. String get phoneNo => _phoneNo.value;
  78. set phoneNo(String val) => _phoneNo.updateValue(val);
  79. /// 紧急联系手机号
  80. String get emergencyPhone => _emergencyPhone.value;
  81. set emergencyPhone(String val) => _emergencyPhone.updateValue(val);
  82. /// 地址
  83. String get address => _address.value;
  84. set address(String val) => _address.updateValue(val);
  85. /// 户籍地址
  86. String get permanentResidenceAddress => _permanentResidenceAddress.value;
  87. set permanentResidenceAddress(String val) =>
  88. _permanentResidenceAddress.updateValue(val);
  89. /// 性别
  90. GenderEnum get gender => _gender.value;
  91. set gender(GenderEnum val) => _gender.updateValue(val);
  92. /// 性别描述
  93. String get genderDesc => RpcEnumLabels.gender[gender]!;
  94. /// 民族
  95. String get nation => _nation.value;
  96. set nation(String val) => _nation.updateValue(val);
  97. /// 证件类型
  98. CardTypeEnum get cardType => _cardType.value;
  99. set cardType(CardTypeEnum val) => _cardType.updateValue(val);
  100. /// 证件号
  101. String get cardNo => _cardNo.value;
  102. set cardNo(String val) {
  103. _cardNo.updateValue(val);
  104. if (cardType == CardTypeEnum.Identity) {
  105. birthday = extractBirthDateFromIDCard(val);
  106. gender = checkGenderFromID(val);
  107. }
  108. }
  109. GenderEnum checkGenderFromID(String idNumber) {
  110. int secondLastDigit = int.parse(idNumber[idNumber.length - 2]);
  111. if (secondLastDigit % 2 == 0) {
  112. return GenderEnum.Female;
  113. } else {
  114. return GenderEnum.Male;
  115. }
  116. }
  117. DateTime extractBirthDateFromIDCard(String idCardNumber) {
  118. final idCardRegex = RegExp(r'^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$');
  119. final match = idCardRegex.firstMatch(idCardNumber);
  120. if (match != null) {
  121. final year = int.parse(match.group(2)!);
  122. final month = int.parse(match.group(3)!);
  123. final day = int.parse(match.group(4)!);
  124. final birthDate = DateTime(year, month, day);
  125. return birthDate;
  126. }
  127. return DateTime(1970, 1, 1); // 返回一个默认值,表示无法提取出生日期
  128. }
  129. /// 生日
  130. DateTime? get birthday => _birthday.value;
  131. set birthday(DateTime? val) {
  132. if (val != _birthday.value && val != null) {
  133. _birthday.value = val;
  134. _age.value = DataTimeUtils.calculateAge(val);
  135. }
  136. }
  137. ///建档医院
  138. String get createdOrgName => _createdOrgName.value;
  139. set createdOrgName(String val) => _createdOrgName.updateValue(val);
  140. ///建档医师
  141. String get createdDoctorName => _createdDoctorName.value;
  142. set createdDoctorName(String val) => _createdDoctorName.updateValue(val);
  143. //建档时间
  144. String get createTime => _createTime.value;
  145. set createTime(String val) => _createTime.updateValue(val);
  146. ///责任医师
  147. String get contractedDoctorName => _contractedDoctorName.value;
  148. set contractedDoctorName(String val) =>
  149. _contractedDoctorName.updateValue(val);
  150. void updateDto(PatientDTO dto) {
  151. _dto.value = dto;
  152. code = dto.code ?? "";
  153. name = dto.patientName ?? "";
  154. cardType = dto.cardType;
  155. cardNo = dto.cardNo ?? "";
  156. gender = dto.patientGender;
  157. nation = dto.nationality ?? "";
  158. birthday = dto.birthday ?? DateTime(1970, 1, 1);
  159. phoneNo = dto.phone ?? "";
  160. emergencyPhone = dto.emergencyPhone ?? "";
  161. address = dto.patientAddress ?? "";
  162. permanentResidenceAddress = dto.permanentResidenceAddress ?? "";
  163. createdOrgName = dto.createdOrgName ?? "";
  164. createdDoctorName = dto.createdDoctorName ?? "";
  165. contractedDoctorName = dto.contractedDoctorName ?? "";
  166. createTime = DateFormat("yyyy-MM-dd")
  167. .format(dto.createTime?.toLocal() ?? DateTime.now());
  168. }
  169. }