state.dart 8.8 KB

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