dict_stroe.dart 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import 'package:chicken_farm/apis/system/_dict.dart';
  2. import 'package:chicken_farm/core/config/app_config.dart';
  3. import 'package:chicken_farm/core/utils/storage.dart';
  4. import 'package:chicken_farm/modes/system/dict.dart';
  5. import 'package:chicken_farm/core/services/offline_dict_service.dart';
  6. class DictStore {
  7. static final DictStore _instance = DictStore._internal();
  8. static const String _localStorgeKey = 'vb_dict_';
  9. final Map<String, List<DictDataModel>> _cache = {};
  10. final OfflineDictService _offlineDictService = OfflineDictService();
  11. factory DictStore() => _instance;
  12. DictStore._internal();
  13. /// 根据字典类型获取字典数据列表
  14. /// 先从缓存中查找,如果缓存中没有则调用接口查询
  15. Future<List<DictDataModel>?> getDictByType(String dictType) async {
  16. // 先从内存缓存中查找
  17. if (_cache.containsKey(dictType)) {
  18. return _cache[dictType];
  19. }
  20. if (AppConfig.isOffline) {
  21. // 如果是离线模式,则从本地配置中查找
  22. return await _offlineDictService.getDictByType(dictType);
  23. } else {
  24. // 再从本地存储中查找
  25. final cachedDict = await StorageUtils.getObject<List<dynamic>>(
  26. '$_localStorgeKey$dictType',
  27. );
  28. if (cachedDict != null) {
  29. try {
  30. final dictList = cachedDict
  31. .map(
  32. (item) => item is Map<String, dynamic>
  33. ? DictDataModel.fromJson(item)
  34. : null,
  35. )
  36. .where((item) => item != null)
  37. .cast<DictDataModel>()
  38. .toList();
  39. _cache[dictType] = dictList;
  40. return dictList;
  41. } catch (e) {
  42. // 解析失败,继续从网络获取
  43. }
  44. }
  45. // 如果本地都没有,则调用接口查询
  46. final dictData = await DictApi().getDicts(dictType);
  47. if (dictData != null) {
  48. // 存入缓存
  49. _cache[dictType] = dictData;
  50. await StorageUtils.setObject(
  51. '$_localStorgeKey$dictType',
  52. dictData.map((e) => e.toJson()).toList(),
  53. );
  54. return dictData;
  55. }
  56. }
  57. return null;
  58. }
  59. /// 根据字典类型和值查询标签
  60. Future<String?> getLabelByTypeAndValue(String dictType, String value) async {
  61. final dict = await getDictByTypeAndValue(dictType, value);
  62. return dict?.dictLabel.isNotEmpty == true ? dict?.dictLabel : null;
  63. }
  64. /// 根据字典类型和值查询字典项
  65. Future<DictDataModel?> getDictByTypeAndValue(
  66. String dictType,
  67. String value,
  68. ) async {
  69. final dictList = await getDictByType(dictType);
  70. if (dictList != null) {
  71. final dict = dictList.firstWhere(
  72. (element) => element.dictValue == value,
  73. orElse: () => DictDataModel(
  74. dictCode: 0,
  75. dictSort: 0,
  76. dictLabel: '',
  77. dictValue: '',
  78. dictType: dictType,
  79. ),
  80. );
  81. // 检查是否找到了匹配的字典项
  82. if (dict.dictCode != 0 ||
  83. dict.dictLabel.isNotEmpty ||
  84. dict.dictValue.isNotEmpty) {
  85. return dict;
  86. }
  87. }
  88. return null;
  89. }
  90. /// 获取所有字典项(离线模式下)
  91. Future<Map<String, List<DictDataModel>>> getAllOfflineDicts() async {
  92. if (!AppConfig.isOffline) {
  93. throw Exception('字典获取操作仅支持离线模式');
  94. }
  95. final Map<String, List<DictDataModel>> result = {};
  96. // 获取所有字典类型
  97. final dictTypes = await _offlineDictService.getAllDictTypes();
  98. for (final dictType in dictTypes) {
  99. final items = await getDictByType(dictType);
  100. if (items != null && items.isNotEmpty) {
  101. result[dictType] = items;
  102. }
  103. }
  104. return result;
  105. }
  106. /// 清除指定字典类型的缓存
  107. void clearDictCache(String dictType) {
  108. _cache.remove(dictType);
  109. //StorageUtils.remove('$_localStorgeKey$dictType');
  110. }
  111. /// 清除所有字典缓存
  112. void clearAll() {
  113. _cache.clear();
  114. //StorageUtils.removeWithPrefix(_localStorgeKey);
  115. }
  116. /// 添加新的字典项
  117. Future<void> addDictItem(String dictType, DictDataModel dictItem) async {
  118. await _modifyDictList(dictType, (list) {
  119. list.add(dictItem);
  120. return list;
  121. });
  122. }
  123. /// 更新字典项
  124. Future<void> updateDictItem(String dictType, DictDataModel dictItem) async {
  125. await _modifyDictList(dictType, (list) {
  126. final index = list.indexWhere(
  127. (item) => item.dictCode == dictItem.dictCode,
  128. );
  129. if (index >= 0) {
  130. list[index] = dictItem;
  131. } else {
  132. list.add(dictItem);
  133. }
  134. return list;
  135. });
  136. }
  137. /// 删除字典项
  138. Future<void> removeDictItem(String dictType, int dictCode) async {
  139. await _modifyDictList(dictType, (list) {
  140. list.removeWhere((item) => item.dictCode == dictCode);
  141. return list;
  142. });
  143. }
  144. /// 修改字典列表的通用方法
  145. Future<void> _modifyDictList(
  146. String dictType,
  147. List<DictDataModel> Function(List<DictDataModel> list) modifier,
  148. ) async {
  149. // 只支持离线模式
  150. if (!AppConfig.isOffline) {
  151. throw Exception('字典修改操作仅支持离线模式');
  152. }
  153. // 获取现有列表或创建一个新列表
  154. List<DictDataModel>? dictList = _cache[dictType];
  155. dictList ??= await _offlineDictService.getDictByType(dictType) ?? [];
  156. // 应用修改
  157. dictList = modifier(List<DictDataModel>.from(dictList));
  158. // 按照dictSort排序
  159. dictList.sort((a, b) => a.dictSort.compareTo(b.dictSort));
  160. // 更新缓存
  161. _cache[dictType] = dictList;
  162. // 保存到本地存储
  163. await _offlineDictService.saveDict(dictType, dictList);
  164. }
  165. }