crowd_labels.dart 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import 'dart:collection';
  2. import 'package:fis_jsonrpc/rpc.dart';
  3. import 'package:get/get.dart';
  4. import 'package:vitalapp/architecture/defines.dart';
  5. import 'package:vitalapp/managers/interfaces/label.dart';
  6. /// 人群分类标签控制器
  7. class CrowdLabelsController extends FControllerBase {
  8. final state = CrowdLablesState();
  9. final _manager = Get.find<ILabelManager>();
  10. @override
  11. void onReady() {
  12. super.onReady();
  13. _loadOptions();
  14. }
  15. void onNormalSelectedChanged(List<String> codes) {
  16. state.selectedNormalCodes = codes;
  17. }
  18. void onDiseaseSelectedChanged(List<String> codes) {
  19. state.selectedDiseaseCodes = codes;
  20. }
  21. void onSpecialCareSelectedChanged(List<String> codes) {
  22. state.selectedSpecialCareCodes = codes;
  23. }
  24. void onItemCheckChanged(String code) {
  25. bool result = false;
  26. result = _updateAllChecked(code);
  27. if (result) return;
  28. result = _updateNormalChecked(code);
  29. if (result) return;
  30. result = _updateDiseaseChecked(code);
  31. if (result) return;
  32. result = _updateSpecialCareChecked(code);
  33. }
  34. void onItemCheckFilterChanged(String code) {
  35. bool result = false;
  36. result = _updateAllChecked(code);
  37. if (result) return;
  38. final item = state.allLabels.firstWhereOrNull((e) => e.code == code);
  39. if (item == null) return;
  40. final arr = state.selectedFilterCodes.toList();
  41. if (!arr.contains(code)) {
  42. if (arr.contains(code) == false) {
  43. arr.add(code);
  44. }
  45. } else {
  46. arr.remove(code);
  47. }
  48. state.selectedFilterCodes = arr;
  49. }
  50. bool _updateAllChecked(String code) {
  51. if (state.isAllSelect) {
  52. state.isAllSelect = false;
  53. state.selectedFilterCodes = [];
  54. } else {
  55. if (code != "0") {
  56. return false;
  57. } else {
  58. state.isAllSelect = true;
  59. state.selectedFilterCodes =
  60. state.allLabels.map((LabelDTO e) => e.code ?? '').toList();
  61. }
  62. }
  63. return true;
  64. }
  65. bool _updateNormalChecked(code) {
  66. final item = state.normalOptions.firstWhereOrNull((e) => e.code == code);
  67. if (item == null) return false;
  68. final arr = state.selectedNormalCodes.toList();
  69. if (!arr.contains(code)) {
  70. if (arr.contains(code) == false) {
  71. arr.add(code);
  72. }
  73. } else {
  74. arr.remove(code);
  75. }
  76. state.selectedNormalCodes = arr;
  77. return true;
  78. }
  79. bool _updateDiseaseChecked(code) {
  80. final item = state.diseaseOptions.firstWhereOrNull((e) => e.code == code);
  81. if (item == null) return false;
  82. final arr = state.selectedDiseaseCodes.toList();
  83. if (!arr.contains(code)) {
  84. if (arr.contains(code) == false) {
  85. arr.add(code);
  86. }
  87. } else {
  88. arr.remove(code);
  89. }
  90. state.selectedDiseaseCodes = arr;
  91. return true;
  92. }
  93. bool _updateSpecialCareChecked(code) {
  94. final item =
  95. state.specialCareOptions.firstWhereOrNull((e) => e.code == code);
  96. if (item == null) return false;
  97. final arr = state.selectedSpecialCareCodes.toList();
  98. if (!arr.contains(code)) {
  99. if (arr.contains(code) == false) {
  100. arr.add(code);
  101. }
  102. } else {
  103. arr.remove(code);
  104. }
  105. state.selectedSpecialCareCodes = arr;
  106. return true;
  107. }
  108. Future<void> _loadOptions() async {
  109. // TODO: Future.await()
  110. state.normalOptions = await _manager.getNormalCrowdLabels();
  111. // TODO:
  112. state.diseaseOptions = (await _manager.getDiseaseCrowdLabels())
  113. ..removeLast();
  114. // state.diseaseOptions = await _manager.getDiseaseCrowdLabels();
  115. var labels = await Get.find<ILabelManager>().getAllLabels();
  116. state.specialCareOptions = await _manager.getSpecialCareCrowdLabels();
  117. state.allLabels = [
  118. LabelDTO(code: 'RQFL_ET', labelName: "儿童"),
  119. LabelDTO(code: "RQFL_LNR", labelName: "老年人"),
  120. ...labels
  121. ];
  122. }
  123. }
  124. /// 人群分类标签状态
  125. class CrowdLablesState {
  126. final RxList<LabelDTO> _normalOptions = RxList<LabelDTO>();
  127. final RxList<LabelDTO> _diseaseOptions = RxList<LabelDTO>();
  128. final RxList<LabelDTO> _specialCareOptions = RxList<LabelDTO>();
  129. final RxList<String> _selectedNormalCodes = RxList<String>();
  130. final RxList<String> _selectedDiseaseCodes = RxList<String>();
  131. final RxList<String> _selectedSpecialCareCodes = RxList<String>();
  132. final RxList<LabelDTO> _allLabels = RxList<LabelDTO>();
  133. final RxList<String> _selectedFilterCodes = RxList<String>();
  134. /// 一般人群分类 已选择Code集合
  135. List<String> get selectedFilterCodes =>
  136. UnmodifiableListView(_selectedFilterCodes.toList());
  137. set selectedFilterCodes(List<String> val) => _selectedFilterCodes.value = val;
  138. bool isAllSelect = true;
  139. /// 一般人群分类选项集合
  140. List<LabelDTO> get allLabels => UnmodifiableListView(_allLabels.toList());
  141. set allLabels(List<LabelDTO> val) => _allLabels.value = val;
  142. /// 一般人群分类选项集合
  143. List<LabelDTO> get normalOptions =>
  144. UnmodifiableListView(_normalOptions.toList());
  145. set normalOptions(List<LabelDTO> val) => _normalOptions.value = val;
  146. /// 疾居民群分类选项集合
  147. List<LabelDTO> get diseaseOptions =>
  148. UnmodifiableListView(_diseaseOptions.toList());
  149. set diseaseOptions(List<LabelDTO> val) => _diseaseOptions.value = val;
  150. /// 特殊照顾人群分类选项集合
  151. List<LabelDTO> get specialCareOptions =>
  152. UnmodifiableListView(_specialCareOptions.toList());
  153. set specialCareOptions(List<LabelDTO> val) => _specialCareOptions.value = val;
  154. /// 一般人群分类 已选择Code集合
  155. List<String> get selectedNormalCodes =>
  156. UnmodifiableListView(_selectedNormalCodes.toList());
  157. set selectedNormalCodes(List<String> val) => _selectedNormalCodes.value = val;
  158. /// 疾居民群分类 已选择Code集合
  159. List<String> get selectedDiseaseCodes =>
  160. UnmodifiableListView(_selectedDiseaseCodes.toList());
  161. set selectedDiseaseCodes(List<String> val) =>
  162. _selectedDiseaseCodes.value = val;
  163. /// 特殊照顾人群分类 已选择Code集合
  164. List<String> get selectedSpecialCareCodes =>
  165. UnmodifiableListView(_selectedSpecialCareCodes.toList());
  166. set selectedSpecialCareCodes(List<String> val) =>
  167. _selectedSpecialCareCodes.value = val;
  168. /// 所有 已选择Code集合
  169. List<String> get selectedCodes {
  170. final array = <String>[];
  171. array.addAll(_selectedNormalCodes);
  172. array.addAll(_selectedDiseaseCodes);
  173. array.addAll(_selectedSpecialCareCodes);
  174. return array;
  175. }
  176. /// 所有 已选择标签名称集合
  177. List<String> get selectedNames {
  178. final array = <String>[];
  179. for (var code in _selectedNormalCodes) {
  180. array.add(_getNameByCode(_normalOptions, code)!);
  181. }
  182. for (var code in _selectedDiseaseCodes) {
  183. array.add(_getNameByCode(_diseaseOptions, code)!);
  184. }
  185. for (var code in _selectedSpecialCareCodes) {
  186. array.add(_getNameByCode(_specialCareOptions, code)!);
  187. }
  188. return array;
  189. }
  190. static String? _getNameByCode(List<LabelDTO> source, String code) {
  191. final dto = source.firstWhereOrNull((e) => e.code == code);
  192. return dto?.labelName;
  193. }
  194. }