state.dart 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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/managers/interfaces/models/crowd_labels.dart';
  10. import 'package:vitalapp/managers/interfaces/patient.dart';
  11. import 'package:vitalapp/pages/patient/info/widgets/ext_model.dart';
  12. import 'package:vitalapp/store/store.dart';
  13. class PatientInfomationState {
  14. final RxString _code = RxString("");
  15. final RxString _name = RxString("");
  16. final Rx<CardTypeEnum> _cardType = Rx<CardTypeEnum>(CardTypeEnum.Identity);
  17. final RxString _cardNo = RxString("");
  18. final Rx<GenderEnum?> _gender = Rx<GenderEnum?>(null);
  19. final RxString _nation = RxString("");
  20. final Rx<DateTime?> _birthday = Rx<DateTime?>(null);
  21. final RxString _age = RxString("");
  22. final RxString _phoneNo = RxString("");
  23. final RxString _emergencyName = RxString("");
  24. final RxString _emergencyPhone = RxString("");
  25. final RxString _address = RxString("");
  26. final RxString _permanentResidenceAddress = RxString("");
  27. final RxString _createdOrgName = RxString("");
  28. final RxString _createdDoctorName = RxString("");
  29. final RxString _contractedDoctorName = RxString("");
  30. final RxString _createTime = RxString("");
  31. final Rx<PatientDetailInfoModel> _detailInfo =
  32. Rx<PatientDetailInfoModel>(PatientDetailInfoModel());
  33. final RxBool _isSyncAddresses = RxBool(true);
  34. final RxString _villageCode = RxString('');
  35. final Rx<PatientDTO> _dto = Rx<PatientDTO>(
  36. PatientDTO(),
  37. );
  38. final RxList<String> _labels = RxList<String>();
  39. final _patientManager = Get.find<IPatientManager>();
  40. /// 村选项集合
  41. List<StringKVModel> get villageOptions => Store.user.residence;
  42. /// 健康信息
  43. final Rx<PatientHealthInfoModel> _healthInfo =
  44. Rx<PatientHealthInfoModel>(PatientHealthInfoModel());
  45. ///服务区域
  46. String get villageCode => _villageCode.value;
  47. set villageCode(String v) => _villageCode.value = v;
  48. /// 村/居委会 名称
  49. String get villageName {
  50. String name = "";
  51. if (villageCode.isNotEmpty) {
  52. final dto = villageOptions.firstWhereOrNull((e) => e.key == villageCode);
  53. if (dto != null) {
  54. name = dto.value;
  55. }
  56. }
  57. return name;
  58. }
  59. /// 详细信息
  60. PatientDetailInfoModel get detailInfo => _detailInfo.value;
  61. set detailInfo(PatientDetailInfoModel v) => _detailInfo.value = v;
  62. ///同步户籍地址到现住地址
  63. bool get isSyncAddresses => _isSyncAddresses.value;
  64. set isSyncAddresses(bool v) => _isSyncAddresses.value = v;
  65. void refreshDetailInfo() {
  66. _detailInfo.refresh();
  67. }
  68. /// 健康信息
  69. PatientHealthInfoModel get healthInfo => _healthInfo.value;
  70. set healthInfo(PatientHealthInfoModel v) => _healthInfo.value = v;
  71. void refreshHealthInfo() {
  72. _healthInfo.refresh();
  73. }
  74. /// 居民编号
  75. String get code => _code.value;
  76. set code(String val) => _code.value = val;
  77. /// 姓名
  78. String get name => _name.value;
  79. set name(String val) => _name.value = val;
  80. /// 年龄
  81. String get age => _age.value;
  82. /// 手机号
  83. String get phoneNo => _phoneNo.value;
  84. set phoneNo(String val) => _phoneNo.updateValue(val);
  85. String get emergencyName => _emergencyName.value;
  86. set emergencyName(String val) => _emergencyName.updateValue(val);
  87. /// 紧急联系手机号
  88. String get emergencyPhone => _emergencyPhone.value;
  89. set emergencyPhone(String val) => _emergencyPhone.updateValue(val);
  90. /// 地址
  91. String get address => _address.value;
  92. set address(String val) => _address.updateValue(val);
  93. /// 户籍地址
  94. String get permanentResidenceAddress => _permanentResidenceAddress.value;
  95. set permanentResidenceAddress(String val) {
  96. if (val != _permanentResidenceAddress.value) {
  97. _permanentResidenceAddress.value = val;
  98. if (isSyncAddresses) {
  99. _address.value = val;
  100. }
  101. }
  102. }
  103. /// 性别
  104. GenderEnum? get gender => _gender.value;
  105. set gender(GenderEnum? val) => _gender.updateValue(val);
  106. /// 性别描述
  107. String get genderDesc => gender != null ? RpcEnumLabels.gender[gender]! : "";
  108. /// 民族
  109. String get nation => _nation.value;
  110. set nation(String val) => _nation.updateValue(val);
  111. /// 证件类型
  112. CardTypeEnum get cardType => _cardType.value;
  113. set cardType(CardTypeEnum val) => _cardType.updateValue(val);
  114. /// 证件号
  115. String get cardNo => _cardNo.value;
  116. set cardNo(String val) {
  117. _cardNo.updateValue(val);
  118. if (cardType == CardTypeEnum.Identity) {
  119. if (val.length != 18) return;
  120. birthday = extractBirthDateFromIDCard(val);
  121. gender = checkGenderFromID(val);
  122. labels = checkLabelsFromID(val);
  123. }
  124. }
  125. ///人群标签
  126. List<String> get labels => _labels.value;
  127. set labels(List<String> v) => _labels.value = v;
  128. ///刷新标签
  129. void refreshLabels() {
  130. _labels.refresh();
  131. }
  132. GenderEnum checkGenderFromID(String idNumber) {
  133. if (idNumber.isNullOrEmpty) {
  134. return GenderEnum.Unspecified;
  135. }
  136. int secondLastDigit = int.parse(idNumber[idNumber.length - 2]);
  137. if (secondLastDigit % 2 == 0) {
  138. return GenderEnum.Female;
  139. } else {
  140. return GenderEnum.Male;
  141. }
  142. }
  143. DateTime extractBirthDateFromIDCard(String idCardNumber) {
  144. final idCardRegex = RegExp(r'^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})(\d|X)$');
  145. final match = idCardRegex.firstMatch(idCardNumber);
  146. if (match != null) {
  147. final year = int.parse(match.group(2)!);
  148. final month = int.parse(match.group(3)!);
  149. final day = int.parse(match.group(4)!);
  150. final birthDate = DateTime(year, month, day);
  151. return birthDate;
  152. }
  153. return DateTime(1970, 1, 1); // 返回一个默认值,表示无法提取出生日期
  154. }
  155. /// 生日
  156. DateTime? get birthday => _birthday.value;
  157. set birthday(DateTime? val) {
  158. if (val != _birthday.value && val != null) {
  159. _birthday.value = val;
  160. _age.value = DataTimeUtils.calculateAge(val);
  161. }
  162. }
  163. ///建档医院
  164. String get createdOrgName => _createdOrgName.value;
  165. set createdOrgName(String val) => _createdOrgName.updateValue(val);
  166. ///建档医师
  167. String get createdDoctorName => _createdDoctorName.value;
  168. set createdDoctorName(String val) => _createdDoctorName.updateValue(val);
  169. //建档时间
  170. String get createTime => _createTime.value;
  171. set createTime(String val) => _createTime.updateValue(val);
  172. ///责任医师
  173. String get contractedDoctorName => _contractedDoctorName.value;
  174. set contractedDoctorName(String val) =>
  175. _contractedDoctorName.updateValue(val);
  176. void updateDto(PatientDTO dto) {
  177. _dto.value = dto;
  178. code = dto.code ?? "";
  179. name = dto.patientName ?? "";
  180. cardType = dto.cardType;
  181. cardNo = dto.cardNo ?? "";
  182. gender = dto.patientGender;
  183. nation = dto.nationality ?? "";
  184. birthday = dto.birthday ?? DateTime(1970, 1, 1);
  185. phoneNo = dto.phone ?? "";
  186. emergencyName = dto.emergencyName ?? '';
  187. emergencyPhone = dto.emergencyPhone ?? "";
  188. address = dto.patientAddress ?? "";
  189. permanentResidenceAddress = dto.permanentResidenceAddress ?? "";
  190. createdOrgName = dto.createdOrgName ?? "";
  191. createdDoctorName = dto.createdDoctorName ?? "";
  192. contractedDoctorName = dto.contractedDoctorName ?? "";
  193. createTime = DateFormat("yyyy-MM-dd")
  194. .format(dto.createTime?.toLocal() ?? DateTime.now());
  195. var dtoLabels = _patientManager.convertLabelsFormDto(dto.crowdLabels ?? []);
  196. for (var l in dtoLabels) {
  197. if (!labels.contains(l)) {
  198. labels.add(l);
  199. }
  200. }
  201. }
  202. List<String> checkLabelsFromID(String idCardNumber) {
  203. String birthDateString = idCardNumber.substring(6, 14);
  204. // 转换为DateTime对象
  205. DateTime birthDate = DateTime.parse(birthDateString);
  206. DateTime currentDate = DateTime.now();
  207. // 计算年龄
  208. int age = currentDate.year - birthDate.year;
  209. if (currentDate.month < birthDate.month ||
  210. (currentDate.month == birthDate.month &&
  211. currentDate.day < birthDate.day)) {
  212. age--;
  213. }
  214. if (age <= 6 && !labels.contains(CrowdLabels.CHILDREN)) {
  215. labels.add(CrowdLabels.CHILDREN);
  216. return labels;
  217. } else if (age >= 65 && !labels.contains(CrowdLabels.ELDERLY)) {
  218. labels.add(CrowdLabels.ELDERLY);
  219. return labels;
  220. } else {
  221. return [];
  222. }
  223. }
  224. }