state.dart 9.5 KB

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