state.dart 6.7 KB

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