crowd_labels.dart 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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. bool _updateAllChecked(String code) {
  35. if (state.isAllSelect) {
  36. if (code != "0") {
  37. return false;
  38. } else {
  39. state.isAllSelect = false;
  40. state.selectedNormalCodes = [];
  41. state.selectedDiseaseCodes = [];
  42. state.selectedSpecialCareCodes = [];
  43. }
  44. } else {
  45. if (code != "0") {
  46. return false;
  47. } else {
  48. state.isAllSelect = true;
  49. state.selectedNormalCodes = state.normalOptions
  50. .where((element) => [
  51. "RQFL_ET",
  52. "RQFL_YF",
  53. "RQFL_LNR",
  54. ].contains(element.code))
  55. .map((LabelDTO e) => e.code ?? '')
  56. .toList();
  57. state.selectedDiseaseCodes = state.diseaseOptions
  58. .where((element) => [
  59. "CJJB_GXY",
  60. "CJJB_TNB",
  61. "CJJB_YZJSBZA",
  62. "CJJB_FJH",
  63. ].contains(element.code))
  64. .map((LabelDTO e) => e.code ?? '')
  65. .toList();
  66. state.selectedSpecialCareCodes = state.specialCareOptions
  67. .where((element) => [].contains(element.code))
  68. .map((LabelDTO e) => e.code ?? '')
  69. .toList();
  70. }
  71. }
  72. return true;
  73. }
  74. bool _updateNormalChecked(code) {
  75. final item = state.normalOptions.firstWhereOrNull((e) => e.code == code);
  76. if (item == null) return false;
  77. final arr = state.selectedNormalCodes.toList();
  78. if (!arr.contains(code)) {
  79. if (arr.contains(code) == false) {
  80. arr.add(code);
  81. }
  82. } else {
  83. arr.remove(code);
  84. state.isAllSelect = false;
  85. }
  86. state.selectedNormalCodes = arr;
  87. return true;
  88. }
  89. bool _updateDiseaseChecked(code) {
  90. final item = state.diseaseOptions.firstWhereOrNull((e) => e.code == code);
  91. if (item == null) return false;
  92. final arr = state.selectedDiseaseCodes.toList();
  93. if (!arr.contains(code)) {
  94. if (arr.contains(code) == false) {
  95. arr.add(code);
  96. }
  97. } else {
  98. arr.remove(code);
  99. state.isAllSelect = false;
  100. }
  101. state.selectedDiseaseCodes = arr;
  102. return true;
  103. }
  104. bool _updateSpecialCareChecked(code) {
  105. final item =
  106. state.specialCareOptions.firstWhereOrNull((e) => e.code == code);
  107. if (item == null) return false;
  108. final arr = state.selectedSpecialCareCodes.toList();
  109. if (!arr.contains(code)) {
  110. if (arr.contains(code) == false) {
  111. arr.add(code);
  112. }
  113. } else {
  114. arr.remove(code);
  115. state.isAllSelect = false;
  116. }
  117. state.selectedSpecialCareCodes = arr;
  118. return true;
  119. }
  120. Future<void> _loadOptions() async {
  121. // TODO: Future.await()
  122. state.normalOptions = await _manager.getNormalCrowdLabels();
  123. // TODO:
  124. state.diseaseOptions = (await _manager.getDiseaseCrowdLabels())
  125. ..removeLast();
  126. // state.diseaseOptions = await _manager.getDiseaseCrowdLabels();
  127. state.specialCareOptions = await _manager.getSpecialCareCrowdLabels();
  128. if (state.isAllSelect) {
  129. state.selectedNormalCodes = state.normalOptions
  130. .where((element) => [
  131. "RQFL_ET",
  132. "RQFL_YF",
  133. "RQFL_LNR",
  134. ].contains(element.code))
  135. .map((LabelDTO e) => e.code ?? '')
  136. .toList();
  137. state.selectedDiseaseCodes = state.diseaseOptions
  138. .where((element) => [
  139. "CJJB_GXY",
  140. "CJJB_TNB",
  141. "CJJB_YZJSBZA",
  142. "CJJB_FJH",
  143. ].contains(element.code))
  144. .map((LabelDTO e) => e.code ?? '')
  145. .toList();
  146. state.selectedSpecialCareCodes = state.specialCareOptions
  147. .where((element) => [].contains(element.code))
  148. .map((LabelDTO e) => e.code ?? '')
  149. .toList();
  150. }
  151. }
  152. }
  153. /// 人群分类标签状态
  154. class CrowdLablesState {
  155. final RxList<LabelDTO> _normalOptions = RxList<LabelDTO>();
  156. final RxList<LabelDTO> _diseaseOptions = RxList<LabelDTO>();
  157. final RxList<LabelDTO> _specialCareOptions = RxList<LabelDTO>();
  158. final RxList<String> _selectedNormalCodes = RxList<String>();
  159. final RxList<String> _selectedDiseaseCodes = RxList<String>();
  160. final RxList<String> _selectedSpecialCareCodes = RxList<String>();
  161. bool isAllSelect = true;
  162. /// 一般人群分类选项集合
  163. List<LabelDTO> get normalOptions =>
  164. UnmodifiableListView(_normalOptions.toList());
  165. set normalOptions(List<LabelDTO> val) => _normalOptions.value = val;
  166. /// 疾居民群分类选项集合
  167. List<LabelDTO> get diseaseOptions =>
  168. UnmodifiableListView(_diseaseOptions.toList());
  169. set diseaseOptions(List<LabelDTO> val) => _diseaseOptions.value = val;
  170. /// 特殊照顾人群分类选项集合
  171. List<LabelDTO> get specialCareOptions =>
  172. UnmodifiableListView(_specialCareOptions.toList());
  173. set specialCareOptions(List<LabelDTO> val) => _specialCareOptions.value = val;
  174. /// 一般人群分类 已选择Code集合
  175. List<String> get selectedNormalCodes =>
  176. UnmodifiableListView(_selectedNormalCodes.toList());
  177. set selectedNormalCodes(List<String> val) => _selectedNormalCodes.value = val;
  178. /// 疾居民群分类 已选择Code集合
  179. List<String> get selectedDiseaseCodes =>
  180. UnmodifiableListView(_selectedDiseaseCodes.toList());
  181. set selectedDiseaseCodes(List<String> val) =>
  182. _selectedDiseaseCodes.value = val;
  183. /// 特殊照顾人群分类 已选择Code集合
  184. List<String> get selectedSpecialCareCodes =>
  185. UnmodifiableListView(_selectedSpecialCareCodes.toList());
  186. set selectedSpecialCareCodes(List<String> val) =>
  187. _selectedSpecialCareCodes.value = val;
  188. /// 所有 已选择Code集合
  189. List<String> get selectedCodes {
  190. final array = <String>[];
  191. array.addAll(_selectedNormalCodes);
  192. array.addAll(_selectedDiseaseCodes);
  193. array.addAll(_selectedSpecialCareCodes);
  194. return array;
  195. }
  196. /// 所有 已选择标签名称集合
  197. List<String> get selectedNames {
  198. final array = <String>[];
  199. for (var code in _selectedNormalCodes) {
  200. array.add(_getNameByCode(_normalOptions, code)!);
  201. }
  202. for (var code in _selectedDiseaseCodes) {
  203. array.add(_getNameByCode(_diseaseOptions, code)!);
  204. }
  205. for (var code in _selectedSpecialCareCodes) {
  206. array.add(_getNameByCode(_specialCareOptions, code)!);
  207. }
  208. return array;
  209. }
  210. static String? _getNameByCode(List<LabelDTO> source, String code) {
  211. final dto = source.firstWhereOrNull((e) => e.code == code);
  212. return dto?.labelName;
  213. }
  214. }