|
@@ -58,14 +58,14 @@ public class DictAspect {
|
|
|
|
|
|
@Around("excudeService()")
|
|
|
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
|
|
|
- long time1=System.currentTimeMillis();
|
|
|
+ long time1 = System.currentTimeMillis();
|
|
|
Object result = pjp.proceed();
|
|
|
- long time2=System.currentTimeMillis();
|
|
|
- log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms");
|
|
|
- long start=System.currentTimeMillis();
|
|
|
- result=this.parseDictText(result);
|
|
|
- long end=System.currentTimeMillis();
|
|
|
- log.debug("注入字典到JSON数据 耗时"+(end-start)+"ms");
|
|
|
+ long time2 = System.currentTimeMillis();
|
|
|
+ log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms");
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ result = this.parseDictText(result);
|
|
|
+ long end = System.currentTimeMillis();
|
|
|
+ log.debug("注入字典到JSON数据 耗时" + (end - start) + "ms");
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -75,20 +75,21 @@ public class DictAspect {
|
|
|
* 示例为SysUser 字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dictText形式返回到前端
|
|
|
* 例输入当前返回值的就会多出一个sex_dictText字段
|
|
|
* {
|
|
|
- * sex:1,
|
|
|
- * sex_dictText:"男"
|
|
|
+ * sex:1,
|
|
|
+ * sex_dictText:"男"
|
|
|
* }
|
|
|
* 前端直接取值sext_dictText在table里面无需再进行前端的字典转换了
|
|
|
- * customRender:function (text) {
|
|
|
- * if(text==1){
|
|
|
- * return "男";
|
|
|
- * }else if(text==2){
|
|
|
- * return "女";
|
|
|
- * }else{
|
|
|
- * return text;
|
|
|
- * }
|
|
|
- * }
|
|
|
- * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用
|
|
|
+ * customRender:function (text) {
|
|
|
+ * if(text==1){
|
|
|
+ * return "男";
|
|
|
+ * }else if(text==2){
|
|
|
+ * return "女";
|
|
|
+ * }else{
|
|
|
+ * return text;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用
|
|
|
+ *
|
|
|
* @param result
|
|
|
*/
|
|
|
private Object parseDictText(Object result) {
|
|
@@ -101,24 +102,24 @@ public class DictAspect {
|
|
|
// 字典数据列表, key = 字典code,value=数据列表
|
|
|
Map<String, List<String>> dataListMap = new HashMap<>(5);
|
|
|
//取出结果集
|
|
|
- List<Object> records=((IPage) ((Result) result).getResult()).getRecords();
|
|
|
+ List<Object> records = ((IPage) ((Result) result).getResult()).getRecords();
|
|
|
//update-begin--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
|
|
|
- Boolean hasDict= checkHasDict(records);
|
|
|
- if(!hasDict){
|
|
|
+ Boolean hasDict = checkHasDict(records);
|
|
|
+ if (!hasDict) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- log.debug(" __ 进入字典翻译切面 DictAspect —— " );
|
|
|
+ log.debug(" __ 进入字典翻译切面 DictAspect —— ");
|
|
|
//update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
|
|
|
for (Object record : records) {
|
|
|
- String json="{}";
|
|
|
+ String json = "{}";
|
|
|
try {
|
|
|
//update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
//解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
|
|
|
- json = objectMapper.writeValueAsString(record);
|
|
|
+ json = objectMapper.writeValueAsString(record);
|
|
|
//update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
} catch (JsonProcessingException e) {
|
|
|
- log.error("json解析失败"+e.getMessage(),e);
|
|
|
+ log.error("json解析失败" + e.getMessage(), e);
|
|
|
}
|
|
|
//update-begin--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
|
|
|
JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
|
|
@@ -132,7 +133,7 @@ public class DictAspect {
|
|
|
if (oConvertUtils.isEmpty(value)) {
|
|
|
continue;
|
|
|
}
|
|
|
- //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
|
|
|
+ //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
|
|
|
if (field.getAnnotation(Dict.class) != null) {
|
|
|
if (!dictFieldList.contains(field)) {
|
|
|
dictFieldList.add(field);
|
|
@@ -152,8 +153,8 @@ public class DictAspect {
|
|
|
//date类型默认转换string格式化日期
|
|
|
//update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
//if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
|
|
|
- //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
|
|
|
+ //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
|
|
|
//}
|
|
|
//update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
}
|
|
@@ -178,7 +179,7 @@ public class DictAspect {
|
|
|
String value = record.getString(field.getName());
|
|
|
if (oConvertUtils.isNotEmpty(value)) {
|
|
|
List<DictModel> dictModels = translText.get(fieldDictCode);
|
|
|
- if(dictModels==null || dictModels.size()==0){
|
|
|
+ if (dictModels == null || dictModels.size() == 0) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
@@ -198,8 +199,113 @@ public class DictAspect {
|
|
|
}
|
|
|
|
|
|
((IPage) ((Result) result).getResult()).setRecords(items);
|
|
|
- }
|
|
|
+ } else if (((Result) result).getResult() instanceof List) {
|
|
|
+ List<JSONObject> items = new ArrayList<>();
|
|
|
+
|
|
|
+ //step.1 筛选出加了 Dict 注解的字段列表
|
|
|
+ List<Field> dictFieldList = new ArrayList<>();
|
|
|
+ // 字典数据列表, key = 字典code,value=数据列表
|
|
|
+ Map<String, List<String>> dataListMap = new HashMap<>(5);
|
|
|
+ //取出结果集
|
|
|
+ List<Object> records = ((List<Object>) ((Result) result).getResult());
|
|
|
+ //update-begin--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
|
|
|
+ Boolean hasDict = checkHasDict(records);
|
|
|
+ if (!hasDict) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ log.debug(" __ 进入字典翻译切面 DictAspect —— ");
|
|
|
+ //update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
|
|
|
+ for (Object record : records) {
|
|
|
+ String json = "{}";
|
|
|
+ try {
|
|
|
+ //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
+ //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
|
|
|
+ json = objectMapper.writeValueAsString(record);
|
|
|
+ //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ log.error("json解析失败" + e.getMessage(), e);
|
|
|
+ }
|
|
|
+ //update-begin--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
|
|
|
+ JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
|
|
|
+ //update-end--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
|
|
|
+
|
|
|
+ //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
|
|
|
+ //for (Field field : record.getClass().getDeclaredFields()) {
|
|
|
+ // 遍历所有字段,把字典Code取出来,放到 map 里
|
|
|
+ for (Field field : oConvertUtils.getAllFields(record)) {
|
|
|
+ String value = item.getString(field.getName());
|
|
|
+ if (oConvertUtils.isEmpty(value)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
|
|
|
+ if (field.getAnnotation(Dict.class) != null) {
|
|
|
+ if (!dictFieldList.contains(field)) {
|
|
|
+ dictFieldList.add(field);
|
|
|
+ }
|
|
|
+ String code = field.getAnnotation(Dict.class).dicCode();
|
|
|
+ String text = field.getAnnotation(Dict.class).dicText();
|
|
|
+ String table = field.getAnnotation(Dict.class).dictTable();
|
|
|
+
|
|
|
+ List<String> dataList;
|
|
|
+ String dictCode = code;
|
|
|
+ if (!StringUtils.isEmpty(table)) {
|
|
|
+ dictCode = String.format("%s,%s,%s", table, text, code);
|
|
|
+ }
|
|
|
+ dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());
|
|
|
+ this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));
|
|
|
+ }
|
|
|
+ //date类型默认转换string格式化日期
|
|
|
+ //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
+ //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
|
|
|
+ //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
|
|
|
+ //}
|
|
|
+ //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
|
|
|
+ }
|
|
|
+ items.add(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ //step.2 调用翻译方法,一次性翻译
|
|
|
+ Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);
|
|
|
+
|
|
|
+ //step.3 将翻译结果填充到返回结果里
|
|
|
+ for (JSONObject record : items) {
|
|
|
+ for (Field field : dictFieldList) {
|
|
|
+ String code = field.getAnnotation(Dict.class).dicCode();
|
|
|
+ String text = field.getAnnotation(Dict.class).dicText();
|
|
|
+ String table = field.getAnnotation(Dict.class).dictTable();
|
|
|
+
|
|
|
+ String fieldDictCode = code;
|
|
|
+ if (!StringUtils.isEmpty(table)) {
|
|
|
+ fieldDictCode = String.format("%s,%s,%s", table, text, code);
|
|
|
+ }
|
|
|
+
|
|
|
+ String value = record.getString(field.getName());
|
|
|
+ if (oConvertUtils.isNotEmpty(value)) {
|
|
|
+ List<DictModel> dictModels = translText.get(fieldDictCode);
|
|
|
+ if (dictModels == null || dictModels.size() == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ String textValue = this.translDictText(dictModels, value);
|
|
|
+ log.debug(" 字典Val : " + textValue);
|
|
|
+ log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);
|
|
|
+
|
|
|
+ // TODO-sun 测试输出,待删
|
|
|
+ log.debug(" ---- dictCode: " + fieldDictCode);
|
|
|
+ log.debug(" ---- value: " + value);
|
|
|
+ log.debug(" ----- text: " + textValue);
|
|
|
+ log.debug(" ---- dictModels: " + JSON.toJSONString(dictModels));
|
|
|
+
|
|
|
+ record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ ((Result) result).setResult(items);
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
@@ -217,6 +323,7 @@ public class DictAspect {
|
|
|
* 一次性把所有的字典都翻译了
|
|
|
* 1. 所有的普通数据字典的所有数据只执行一次SQL
|
|
|
* 2. 表字典相同的所有数据只执行一次SQL
|
|
|
+ *
|
|
|
* @param dataListMap
|
|
|
* @return
|
|
|
*/
|
|
@@ -352,7 +459,8 @@ public class DictAspect {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 翻译字典文本
|
|
|
+ * 翻译字典文本
|
|
|
+ *
|
|
|
* @param code
|
|
|
* @param text
|
|
|
* @param table
|
|
@@ -361,39 +469,39 @@ public class DictAspect {
|
|
|
*/
|
|
|
@Deprecated
|
|
|
private String translateDictValue(String code, String text, String table, String key) {
|
|
|
- if(oConvertUtils.isEmpty(key)) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- StringBuffer textValue=new StringBuffer();
|
|
|
+ if (oConvertUtils.isEmpty(key)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuffer textValue = new StringBuffer();
|
|
|
String[] keys = key.split(",");
|
|
|
for (String k : keys) {
|
|
|
String tmpValue = null;
|
|
|
- log.debug(" 字典 key : "+ k);
|
|
|
+ log.debug(" 字典 key : " + k);
|
|
|
if (k.trim().length() == 0) {
|
|
|
continue; //跳过循环
|
|
|
}
|
|
|
//update-begin--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题-----
|
|
|
- if (!StringUtils.isEmpty(table)){
|
|
|
- log.debug("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code);
|
|
|
- String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]",table,text,code,k.trim());
|
|
|
- if (redisTemplate.hasKey(keyString)){
|
|
|
+ if (!StringUtils.isEmpty(table)) {
|
|
|
+ log.debug("--DictAspect------dicTable=" + table + " ,dicText= " + text + " ,dicCode=" + code);
|
|
|
+ String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s,%s,%s]", table, text, code, k.trim());
|
|
|
+ if (redisTemplate.hasKey(keyString)) {
|
|
|
try {
|
|
|
tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
|
|
|
} catch (Exception e) {
|
|
|
log.warn(e.getMessage());
|
|
|
}
|
|
|
- }else {
|
|
|
- tmpValue= commonApi.translateDictFromTable(table,text,code,k.trim());
|
|
|
+ } else {
|
|
|
+ tmpValue = commonApi.translateDictFromTable(table, text, code, k.trim());
|
|
|
}
|
|
|
- }else {
|
|
|
- String keyString = String.format("sys:cache:dict::%s:%s",code,k.trim());
|
|
|
- if (redisTemplate.hasKey(keyString)){
|
|
|
+ } else {
|
|
|
+ String keyString = String.format("sys:cache:dict::%s:%s", code, k.trim());
|
|
|
+ if (redisTemplate.hasKey(keyString)) {
|
|
|
try {
|
|
|
tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString));
|
|
|
} catch (Exception e) {
|
|
|
- log.warn(e.getMessage());
|
|
|
+ log.warn(e.getMessage());
|
|
|
}
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
tmpValue = commonApi.translateDict(code, k.trim());
|
|
|
}
|
|
|
}
|
|
@@ -412,11 +520,12 @@ public class DictAspect {
|
|
|
|
|
|
/**
|
|
|
* 检测返回结果集中是否包含Dict注解
|
|
|
+ *
|
|
|
* @param records
|
|
|
* @return
|
|
|
*/
|
|
|
- private Boolean checkHasDict(List<Object> records){
|
|
|
- if(oConvertUtils.isNotEmpty(records) && records.size()>0){
|
|
|
+ private Boolean checkHasDict(List<Object> records) {
|
|
|
+ if (oConvertUtils.isNotEmpty(records) && records.size() > 0) {
|
|
|
for (Field field : oConvertUtils.getAllFields(records.get(0))) {
|
|
|
if (oConvertUtils.isNotEmpty(field.getAnnotation(Dict.class))) {
|
|
|
return true;
|