2025-07-25 11:22:48 +08:00
|
|
|
|
package com.youchain.utils;
|
|
|
|
|
|
|
|
|
|
|
|
import cn.hutool.json.JSON;
|
|
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
|
import com.youchain.basicdata.service.dto.TableConfigDto;
|
|
|
|
|
|
import com.youchain.basicdata.service.dto.TableConfigQueryCriteria;
|
|
|
|
|
|
import com.youchain.basicdata.service.impl.TableConfigServiceImpl;
|
|
|
|
|
|
import com.youchain.exception.BadRequestException;
|
|
|
|
|
|
import com.youchain.modules.system.domain.DictDetail;
|
|
|
|
|
|
import com.youchain.modules.system.service.impl.DictDetailServiceImpl;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
import org.apache.poi.ss.formula.functions.T;
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
|
public class ExcelDownUtils {
|
|
|
|
|
|
public static List<Map<String, Object>> CreateMap(List all,String tableType) throws Exception{
|
|
|
|
|
|
Long stTime=System.currentTimeMillis();
|
|
|
|
|
|
|
|
|
|
|
|
//查询配置表
|
|
|
|
|
|
TableConfigServiceImpl tableConfigService = SpringContextHolder.getBean(TableConfigServiceImpl.class);
|
|
|
|
|
|
TableConfigQueryCriteria tbble_criteria =new TableConfigQueryCriteria();
|
|
|
|
|
|
tbble_criteria.setTableType(tableType.trim());
|
|
|
|
|
|
List<TableConfigDto> tableConfigDtoList=tableConfigService.queryAll(tbble_criteria);
|
|
|
|
|
|
if(tableConfigDtoList.size()<=0){
|
|
|
|
|
|
throw new BadRequestException("请先保存配置");
|
|
|
|
|
|
}
|
|
|
|
|
|
TableConfigDto tableConfigDto=tableConfigDtoList.get(0);
|
|
|
|
|
|
//解析配置内容
|
|
|
|
|
|
List<FanShe> tableConfigList;
|
|
|
|
|
|
try{
|
|
|
|
|
|
tableConfigList= JSONUtil.toList(tableConfigDto.getValue(),FanShe.class);
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
throw new BadRequestException("请保存配置");
|
|
|
|
|
|
}
|
|
|
|
|
|
log.error("导出配置数据:"+tableConfigList+"");
|
|
|
|
|
|
|
|
|
|
|
|
//创建空的字典集合
|
|
|
|
|
|
Map<String, Map<String, DictDetail>> dictDetailMaps =new HashMap<>();
|
|
|
|
|
|
//加载字典表
|
|
|
|
|
|
DictDetailServiceImpl dictDetailService = SpringContextHolder.getBean(DictDetailServiceImpl.class);
|
|
|
|
|
|
//查找所需要用到的字典
|
|
|
|
|
|
tableConfigList.forEach(fanShe->{
|
|
|
|
|
|
//遍历配置属性
|
|
|
|
|
|
|
|
|
|
|
|
String property=fanShe.property;
|
|
|
|
|
|
if(property.indexOf("#")>-1){
|
|
|
|
|
|
//如果带# 代表调用了字典
|
|
|
|
|
|
try{
|
|
|
|
|
|
String dictStr=property.split("#")[0];
|
|
|
|
|
|
Map<String, DictDetail> dictDetailMap=dictDetailService.getDictDetailByNameForValue(dictStr);
|
|
|
|
|
|
dictDetailMaps.put(dictStr,dictDetailMap);
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
log.error(e.toString());
|
|
|
|
|
|
log.error("获取字典配置"+property+"异常");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
List<Map<String, Object>> list = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
|
|
for (Object obj : all) {
|
|
|
|
|
|
Map<String,Object> map = new LinkedHashMap<>();
|
|
|
|
|
|
tableConfigList.forEach(fanShe->{
|
|
|
|
|
|
if(fanShe.visible){
|
|
|
|
|
|
//获取属性名
|
|
|
|
|
|
String property=fanShe.property;
|
|
|
|
|
|
|
|
|
|
|
|
if(property.indexOf("#")>-1){
|
|
|
|
|
|
try{
|
|
|
|
|
|
String dictStr=property.split("#")[0];
|
|
|
|
|
|
String propertyStr=property.split("#")[1];
|
|
|
|
|
|
|
|
|
|
|
|
Map<String, DictDetail> dictDetailMap=dictDetailMaps.get(dictStr);
|
|
|
|
|
|
//log.info("dictDetailMap:"+dictDetailMap.size());
|
|
|
|
|
|
//for (String key: dictDetailMap.keySet()) {
|
|
|
|
|
|
//log.info("dictDetailMap:"+key);
|
|
|
|
|
|
//}
|
|
|
|
|
|
//log.info(dictStr+"获取value:"+json.getByPath(propertyStr)+"");
|
|
|
|
|
|
|
|
|
|
|
|
DictDetail dictDetail=dictDetailMap.get(getNestedFieldValue(obj,propertyStr));
|
|
|
|
|
|
|
|
|
|
|
|
//log.info(jsonObject.getStr("label")+"--"+dictDetail.getLabel()+"");
|
|
|
|
|
|
String value=dictDetail.getLabel()+"";
|
|
|
|
|
|
map.put(fanShe.label, value.trim()+"");
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
log.error(e.toString());
|
|
|
|
|
|
log.error("匹配字典:"+property+"异常");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
try{
|
|
|
|
|
|
Object value= getNestedFieldValue(obj,property);
|
|
|
|
|
|
if(value!=null){
|
|
|
|
|
|
if(value instanceof String){
|
|
|
|
|
|
value=((String) value).trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
map.put(fanShe.label,value);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
map.put(fanShe.label,"");
|
|
|
|
|
|
}
|
|
|
|
|
|
}catch (Exception e){
|
|
|
|
|
|
//log.error(e.toString());
|
|
|
|
|
|
//log.error("匹配数据"+property+"异常");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list.add(map);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Object value2 = jsonObj.eval("$.address.city");
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
return list;
|
|
|
|
|
|
}
|
2025-09-30 12:07:47 +08:00
|
|
|
|
private static Field getFieldRecursively(Class<?> clazz, String fieldName) {
|
|
|
|
|
|
while (clazz != null) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
return clazz.getDeclaredField(fieldName);
|
|
|
|
|
|
} catch (NoSuchFieldException e) {
|
|
|
|
|
|
clazz = clazz.getSuperclass();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2025-07-25 11:22:48 +08:00
|
|
|
|
|
|
|
|
|
|
public static Object getNestedFieldValue(Object obj, String nestedFieldName) throws Exception {
|
|
|
|
|
|
String[] fields = nestedFieldName.split("\\.");
|
2025-09-30 12:07:47 +08:00
|
|
|
|
try {
|
|
|
|
|
|
Object result = obj;
|
|
|
|
|
|
for (String field : fields) {
|
|
|
|
|
|
if (result == null) {
|
|
|
|
|
|
throw new IllegalArgumentException("尝试在 null 对象上访问字段: " + field);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Field f = getFieldRecursively(result.getClass(), field);
|
|
|
|
|
|
if (f == null) {
|
|
|
|
|
|
throw new NoSuchFieldException("字段 " + field + " 在类 " +
|
|
|
|
|
|
result.getClass().getName() + " 中不存在");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
|
result = f.get(result);
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
log.error("获取字段值失败: " + e.getMessage());
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
2025-07-25 11:22:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|