package cn.iocoder.yudao.framework.dict.core; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.biz.system.dict.DictDataCommonApi; import cn.iocoder.yudao.framework.common.util.cache.CacheUtils; import cn.iocoder.yudao.framework.common.biz.system.dict.dto.DictDataRespDTO; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import java.time.Duration; import java.util.List; import java.util.Objects; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; /** * 字典工具类 * * @author 芋道源码 */ @Slf4j public class DictFrameworkUtils { private static DictDataCommonApi dictDataApi; /** * 针对 dictType 的字段数据缓存 */ private static final LoadingCache> GET_DICT_DATA_CACHE = CacheUtils.buildAsyncReloadingCache( Duration.ofMinutes(1L), // 过期时间 1 分钟 new CacheLoader>() { @Override public List load(String dictType) { return dictDataApi.getDictDataList(dictType); } }); public static void init(DictDataCommonApi dictDataApi) { DictFrameworkUtils.dictDataApi = dictDataApi; log.info("[init][初始化 DictFrameworkUtils 成功]"); } public static void clearCache() { GET_DICT_DATA_CACHE.invalidateAll(); } @SneakyThrows public static String parseDictDataLabel(String dictType, Integer value) { if (value == null) { return null; } return parseDictDataLabel(dictType, String.valueOf(value)); } @SneakyThrows public static String parseDictDataLabel(String dictType, String value) { List dictDatas = GET_DICT_DATA_CACHE.get(dictType); DictDataRespDTO dictData = CollUtil.findOne(dictDatas, data -> Objects.equals(data.getValue(), value)); return dictData != null ? dictData.getLabel(): null; } @SneakyThrows public static List getDictDataLabelList(String dictType) { List dictDatas = GET_DICT_DATA_CACHE.get(dictType); return convertList(dictDatas, DictDataRespDTO::getLabel); } @SneakyThrows public static String parseDictDataValue(String dictType, String label) { List dictDatas = GET_DICT_DATA_CACHE.get(dictType); DictDataRespDTO dictData = CollUtil.findOne(dictDatas, data -> Objects.equals(data.getLabel(), label)); return dictData!= null ? dictData.getValue(): null; } @SneakyThrows public static List getDictDataValueList(String dictType) { List dictDatas = GET_DICT_DATA_CACHE.get(dictType); return convertList(dictDatas, DictDataRespDTO::getValue); } }