| | |
| | | |
| | | @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; |
| | | } |
| | | |
| | |
| | | * 示例为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) { |
| | |
| | | // 字典数据列表, 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 —— " ); |
| | | //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); |
| | | 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); |
| | | } |
| | | String code = field.getAnnotation(Dict.class).dicCode(); |
| | | String text = field.getAnnotation(Dict.class).dicText(); |
| | | String table = field.getAnnotation(Dict.class).dictTable(); |
| | | //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顺序错乱 ----- |
| | | |
| | | List<String> dataList; |
| | | String dictCode = code; |
| | | if (!StringUtils.isEmpty(table)) { |
| | | dictCode = String.format("%s,%s,%s", table, text, code); |
| | | //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序列化报错----- |
| | | } |
| | | 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); |
| | | items.add(item); |
| | | } |
| | | |
| | | String value = record.getString(field.getName()); |
| | | if (oConvertUtils.isNotEmpty(value)) { |
| | | List<DictModel> dictModels = translText.get(fieldDictCode); |
| | | if(dictModels==null || dictModels.size()==0){ |
| | | continue; |
| | | //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); |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | ((IPage) ((Result) result).getResult()).setRecords(items); |
| | | } |
| | |
| | | * 一次性把所有的字典都翻译了 |
| | | * 1. 所有的普通数据字典的所有数据只执行一次SQL |
| | | * 2. 表字典相同的所有数据只执行一次SQL |
| | | * |
| | | * @param dataListMap |
| | | * @return |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 翻译字典文本 |
| | | * 翻译字典文本 |
| | | * |
| | | * @param code |
| | | * @param text |
| | | * @param table |
| | |
| | | */ |
| | | @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()); |
| | | } |
| | | } |
| | |
| | | |
| | | /** |
| | | * 检测返回结果集中是否包含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; |