package org.jeecg.common.system.util; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.system.annotation.EnumDict; import org.jeecg.common.system.vo.DictModel; import org.jeecg.common.util.oConvertUtils; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.ClassUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 资源加载工具类 * @Author taoYan * @Date 2022/7/8 10:40 **/ @Slf4j public class ResourceUtil { /** * 枚举字典数据 */ private final static Map> enumDictData = new HashMap<>(5); /** * 所有java类 */ private final static String CLASS_PATTERN="/**/*.class"; /** * 所有枚举java类 */ private final static String CLASS_ENMU_PATTERN="/**/*Enum.class"; /** * 包路径 org.jeecg */ private final static String BASE_PACKAGE = "org.jeecg"; /** * 枚举类中获取字典数据的方法名 */ private final static String METHOD_NAME = "getDictList"; /** * 获取枚举类对应的字典数据 SysDictServiceImpl#queryAllDictItems() * @return */ public static Map> getEnumDictData(){ if(enumDictData.keySet().size()>0){ return enumDictData; } ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + CLASS_ENMU_PATTERN; try { Resource[] resources = resourcePatternResolver.getResources(pattern); MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver); for (Resource resource : resources) { MetadataReader reader = readerFactory.getMetadataReader(resource); String classname = reader.getClassMetadata().getClassName(); Class clazz = Class.forName(classname); EnumDict enumDict = clazz.getAnnotation(EnumDict.class); if (enumDict != null) { EnumDict annotation = clazz.getAnnotation(EnumDict.class); String key = annotation.value(); if(oConvertUtils.isNotEmpty(key)){ List list = (List) clazz.getDeclaredMethod(METHOD_NAME).invoke(null); enumDictData.put(key, list); } } } }catch (Exception e){ log.error("获取枚举类字典数据异常", e.getMessage()); // e.printStackTrace(); } return enumDictData; } /** * 用于后端字典翻译 SysDictServiceImpl#queryManyDictByKeys(java.util.List, java.util.List) * @param dictCodeList * @param keys * @return */ public static Map> queryManyDictByKeys(List dictCodeList, List keys){ if(enumDictData.keySet().size()==0){ getEnumDictData(); } Map> map = new HashMap<>(); for (String code : enumDictData.keySet()) { if(dictCodeList.indexOf(code)>=0){ List dictItemList = enumDictData.get(code); for(DictModel dm: dictItemList){ String value = dm.getValue(); if(keys.indexOf(value)>=0){ List list = new ArrayList<>(); list.add(new DictModel(value, dm.getText())); map.put(code,list); break; } } } } return map; } }