From 42373d931e30787eaa45e17a49fd04109a22c4bf Mon Sep 17 00:00:00 2001 From: wangzhijiang <1358525938@qq.com> Date: Wed, 6 Mar 2024 15:33:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A6=85=E9=81=93BUG=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jero/common/aspect/DictAspect.java | 922 +++++++++--------- .../entity/DocumentSplitInfo.java | 4 + .../impl/DocumentSplitServiceImpl.java | 23 +- .../SarFileSplitMenuEOController.java | 2 +- .../impl/SarFileSplitMenuEOServiceImpl.java | 18 +- 5 files changed, 503 insertions(+), 466 deletions(-) diff --git a/byd-structuredplugins-serve/laws-base/laws-base-core/src/main/java/com/jero/common/aspect/DictAspect.java b/byd-structuredplugins-serve/laws-base/laws-base-core/src/main/java/com/jero/common/aspect/DictAspect.java index 7225197..526c689 100644 --- a/byd-structuredplugins-serve/laws-base/laws-base-core/src/main/java/com/jero/common/aspect/DictAspect.java +++ b/byd-structuredplugins-serve/laws-base/laws-base-core/src/main/java/com/jero/common/aspect/DictAspect.java @@ -42,466 +42,466 @@ import java.util.stream.Collectors; @Component @Slf4j public class DictAspect { - - @Autowired - private CommonAPI commonAPI; - @Autowired - public RedisTemplate redisTemplate; - - private static final String SYS_CACHE_DICT_S_S = "sys:cache:dict::%s:%s"; - - // 定义切点Pointcut - @Pointcut("execution(public * com.jero.modules..*.*Controller.*(..))") - public void excudeService() { - // do other - } - @Pointcut("@annotation(com.jero.common.aspect.annotation.DictPoint)") - public void dictPointCut() { - } - - @Around("excudeService()") - public Object doAround(ProceedingJoinPoint pjp) throws Throwable { - long time1=System.currentTimeMillis(); - Object result = pjp.proceed(); - long time2=System.currentTimeMillis(); - log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms"); - long start=System.currentTimeMillis(); - this.parseDictText(result); - long end=System.currentTimeMillis(); - log.debug("注入字典到JSON数据 耗时"+(end-start)+"ms"); - return result; - } - - @Around("dictPointCut()") - public Object arround(ProceedingJoinPoint point) throws Throwable { - long time1 = System.currentTimeMillis(); - Object result = point.proceed(); - long time2 = System.currentTimeMillis(); - log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms"); - long start = System.currentTimeMillis(); - this.parseMethodDictText(result); - long end = System.currentTimeMillis(); - log.debug("解析注入JSON数据 耗时" + (end - start) + "ms"); - return result; - } - - /** - * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入 - * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ,table字典 code table text配合使用与原来jero的用法相同 - * 示例为SysUser 字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dictText形式返回到前端 - * 例输入当前返回值的就会多出一个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上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用 - * @param result - */ - private void parseDictText(Object result) { - if (result instanceof Result && ((Result) result).getResult() instanceof IPage) { - List items = new ArrayList<>(); - - //step.1 筛选出加了 Dict 注解的字段列表 - List dictFieldList = new ArrayList<>(); - // 字典数据列表, key = 字典code,value=数据列表 - Map> dataListMap = new HashMap<>(); - - addItems((Result) result, items, dictFieldList, dataListMap); - - //step.2 调用翻译方法,一次性翻译 - Map> translText = this.translateAllDict(dataListMap); - - //step.3 将翻译结果填充到返回结果里 - putItems(items, dictFieldList, translText); - - ((IPage) ((Result) result).getResult()).setRecords(items); - } - } - - private void putItems(List items, List dictFieldList, Map> translText) { - for (JSONObject obj : 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 = obj.getString(field.getName()); - if (oConvertUtils.isNotEmpty(value)) { - List dictModels = translText.get(fieldDictCode); - if(dictModels==null || dictModels.isEmpty()){ - 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)); - - obj.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); - } - } - } - } - - private void addItems(Result> result, List items, List dictFieldList, Map> dataListMap) { - for (Object obj : result.getResult().getRecords()) { - ObjectMapper mapper = new ObjectMapper(); - String json="{}"; - try { - //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat - json = mapper.writeValueAsString(obj); - } catch (JsonProcessingException e) { - log.error("json解析失败"+e.getMessage(),e); - } - JSONObject item = JSON.parseObject(json,Feature.OrderedField); - //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ - // 遍历所有字段,把字典Code取出来,放到 map 里 - putItem(dictFieldList, dataListMap, obj, item); - items.add(item); - } - } - - private void putItem(List dictFieldList, Map> dataListMap, Object obj, JSONObject item) { - for (Field field : oConvertUtils.getAllFields(obj)) { - 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 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格式化日期 - if (Date.class.isAssignableFrom(field.getType()) && 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())))); - } - } - } - - /** - * list 去重添加 - */ - private void listAddAllDeduplicate(List dataList, List addList) { - // 筛选出dataList中没有的数据 - List filterList = addList.stream().filter(i -> !dataList.contains(i)).collect(Collectors.toList()); - dataList.addAll(filterList); - } - - /** - * 一次性把所有的字典都翻译了 - * 1. 所有的普通数据字典的所有数据只执行一次SQL - * 2. 表字典相同的所有数据只执行一次SQL - * @param dataListMap - * @return - */ - private Map> translateAllDict(Map> dataListMap) { - // 翻译后的字典文本,key=dictCode - Map> translText = new HashMap<>(); - // 需要翻译的数据(有些可以从redis缓存中获取,就不走数据库查询) - List needTranslData = new ArrayList<>(); - //step.1 先通过redis中获取缓存字典数据 - for (Map.Entry> entry : dataListMap.entrySet()) { - String dictCode = entry.getKey(); - List dataList = entry.getValue(); - if (dataList.isEmpty()) { - continue; - } - // 表字典需要翻译的数据 - List needTranslDataTable = new ArrayList<>(); - addNeedTranslData(translText, needTranslData, dictCode, dataList, needTranslDataTable); - //step.2 调用数据库翻译表字典 - if (!needTranslDataTable.isEmpty()) { - String[] arr = dictCode.split(","); - String table = arr[0]; - String text = arr[1]; - String code = arr[2]; - String values = String.join(",", needTranslDataTable); - log.info("translateDictFromTableByKeys.dictCode:" + dictCode); - log.info("translateDictFromTableByKeys.values:" + values); - List texts; - if ("sys_user".equals(table)&&"realname".equals(text)&&"id".equals(code)){ - texts = commonAPI.translateUserRealNameFromTableByKeys(values); - }else { - texts = commonAPI.translateDictFromTableByKeys(table, text, code, values); - } - log.info("translateDictFromTableByKeys.result:" + texts); - List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); - list.addAll(texts); - setRedis(dictCode, texts); - - } - } - - //step.3 调用数据库进行翻译普通字典 - if (!needTranslData.isEmpty()) { - List dictCodeList = Arrays.asList(dataListMap.keySet().toArray(new String[]{})); - // 将不包含逗号的字典code筛选出来,因为带逗号的是表字典,而不是普通的数据字典 - List filterDictCodes = dictCodeList.stream().filter(key -> !key.contains(",")).collect(Collectors.toList()); - String dictCodes = String.join(",", filterDictCodes); - String values = String.join(",", needTranslData); - log.info("translateManyDict.dictCodes:" + dictCodes); - log.info("translateManyDict.values:" + values); - Map> manyDict = commonAPI.translateManyDict(dictCodes, values); - log.info("translateManyDict.result:" + manyDict); - for (Map.Entry> entry : manyDict.entrySet()) { - String dictCode = entry.getKey(); - List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); - List newList = entry.getValue(); - list.addAll(newList); - - // 做 redis 缓存 - for (DictModel dict : newList) { - String redisKey = String.format(SYS_CACHE_DICT_S_S, dictCode, dict.getValue()); - try { - redisTemplate.opsForValue().set(redisKey, dict.getText()); - } catch (Exception e) { - log.warn(e.getMessage(), e); - } - } - } - } - return translText; - } - - private void setRedis(String dictCode, List texts) { - // 做 redis 缓存 - for (DictModel dict : texts) { - String redisKey = String.format(CacheConstant.SYS_DICT_TABLE_CACHE_SIMPLE_KEY, dictCode, dict.getValue()); - try { - // 保留10分钟 - redisTemplate.opsForValue().set(redisKey, dict.getText(), 600, TimeUnit.SECONDS); - } catch (Exception e) { - log.warn(e.getMessage(), e); - } - } - } - - private void addNeedTranslData(Map> translText, List needTranslData, String dictCode, List dataList, List needTranslDataTable) { - for (String s : dataList) { - String data = s.trim(); - if (data.length() == 0) { - continue; //跳过循环 - } - if (dictCode.contains(",")) { - String keyString = String.format(CacheConstant.SYS_DICT_TABLE_CACHE_SIMPLE_KEY, dictCode, data); - if (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))) { - addList(translText, dictCode, data, keyString); - } else if (!needTranslDataTable.contains(data)) { - // 去重添加 - needTranslDataTable.add(data); - } - } else { - String keyString = String.format(SYS_CACHE_DICT_S_S, dictCode, data); - if (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))) { - addList(translText, dictCode, data, keyString); - } else if (!needTranslData.contains(data)) { - // 去重添加 - needTranslData.add(data); - } - } - - } - } - - private void addList(Map> translText, String dictCode, String data, String keyString) { - try { - String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); - List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); - list.add(new DictModel(data, text)); - } catch (Exception e) { - log.warn(e.getMessage()); - } - } - - /** - * 字典值替换文本 - * - * @param dictModels - * @param values - * @return - */ - private String translDictText(List dictModels, String values) { - List result = new ArrayList<>(); - - // 允许多个逗号分隔,允许传数组对象 - String[] splitVal = values.split(","); - for (String val : splitVal) { - String dictText = ""; - for (DictModel dict : dictModels) { - if (val.equals(dict.getValue())) { - dictText = dict.getText(); - break; - } - } - result.add(dictText); - } - return String.join(",", result); - } - - /** - * 翻译字典文本 - * @param code - * @param text - * @param table - * @param key - * @deprecated 不推荐 - * @return - */ - @Deprecated - private String translateDictValue(String code, String text, String table, String key) { - if(oConvertUtils.isEmpty(key)) { - return null; - } - StringBuilder textValue = new StringBuilder(); - String[] keys = key.split(","); - for (String k : keys) { - String tmpValue = null; - log.debug(" 字典 key : "+ k); - if (k.trim().length() == 0) { - continue; //跳过循环 - } - //update-begin--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- -// tmpValue = getTmpValue(code, text, table, k, tmpValue); - //update-end--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- - - if (tmpValue != null) { - if (!"".equals(textValue.toString())) { - textValue.append(","); - } - textValue.append(tmpValue); - } - - } - return textValue.toString(); - } - - private String getTmpValue(String code, String text, String table, String k, String tmpValue) { - if (!StringUtils.isEmpty(table)){ - log.info("--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 (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))){ - try { - tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); - } catch (Exception e) { - log.warn(e.getMessage()); - } - }else { - //处理用户要翻译为姓名加工号 - if ("sys_user".equals(table)&&"realname".equals(text)&&"id".equals(code)){ - tmpValue= commonAPI.translateUserRealNameFromTable(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 (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))){ - try { - tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); - } catch (Exception e) { - log.warn(e.getMessage()); - } - }else { - tmpValue = commonAPI.translateDict(code, k.trim()); - } - } - return tmpValue; - } - - /** - * @param result - */ - private void parseMethodDictText(Object result) { - if (result instanceof Result) { - Object result1 = ((Result) result).getResult(); - String jsonStr = JSONUtil.toJsonStr(result1); - if (JSONUtil.isTypeJSONObject(jsonStr)) { - JSONObject translate = translate(result1); - ((Result) result).setResult(translate); - } else { - List items = new ArrayList<>(); - for (Object o : (List) result1) { - JSONObject translate = translate(o); - items.add(translate); - } - ((Result) result).setResult(items); - } - } - } - - /** - * @param record - * @return - */ - private JSONObject translate(Object record) { - ObjectMapper mapper = new ObjectMapper(); - String json = "{}"; - try { - //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat - json = mapper.writeValueAsString(record); - } catch (JsonProcessingException e) { - log.error("json解析失败" + e.getMessage(), e); - } - JSONObject item = JSONObject.parseObject(json, Feature.OrderedField); - //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ - //for (Field field : record.getClass().getDeclaredFields()) { - for (Field field : oConvertUtils.getAllFields(record)) { - //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ - if (field.getAnnotation(Dict.class) != null) { - String code = field.getAnnotation(Dict.class).dicCode(); - String text = field.getAnnotation(Dict.class).dicText(); - String table = field.getAnnotation(Dict.class).dictTable(); - String key = String.valueOf(item.get(field.getName())); - - //翻译字典值对应的txt - String textValue = translateDictValue(code, text, table, key); - - log.debug(" 字典Val : " + textValue); - log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue); - item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); - } - //date类型默认转换string格式化日期 - if (field.getType().getName().equals("java.util.Date") && 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())))); - } - } - return item; - } - +// +// @Autowired +// private CommonAPI commonAPI; +// @Autowired +// public RedisTemplate redisTemplate; +// +// private static final String SYS_CACHE_DICT_S_S = "sys:cache:dict::%s:%s"; +// +// // 定义切点Pointcut +// @Pointcut("execution(public * com.jero.modules..*.*Controller.*(..))") +// public void excudeService() { +// // do other +// } +// @Pointcut("@annotation(com.jero.common.aspect.annotation.DictPoint)") +// public void dictPointCut() { +// } +// +// @Around("excudeService()") +// public Object doAround(ProceedingJoinPoint pjp) throws Throwable { +// long time1=System.currentTimeMillis(); +// Object result = pjp.proceed(); +// long time2=System.currentTimeMillis(); +// log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms"); +// long start=System.currentTimeMillis(); +// this.parseDictText(result); +// long end=System.currentTimeMillis(); +// log.debug("注入字典到JSON数据 耗时"+(end-start)+"ms"); +// return result; +// } +// +// @Around("dictPointCut()") +// public Object arround(ProceedingJoinPoint point) throws Throwable { +// long time1 = System.currentTimeMillis(); +// Object result = point.proceed(); +// long time2 = System.currentTimeMillis(); +// log.debug("获取JSON数据 耗时:" + (time2 - time1) + "ms"); +// long start = System.currentTimeMillis(); +// this.parseMethodDictText(result); +// long end = System.currentTimeMillis(); +// log.debug("解析注入JSON数据 耗时" + (end - start) + "ms"); +// return result; +// } +// +// /** +// * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入 +// * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ,table字典 code table text配合使用与原来jero的用法相同 +// * 示例为SysUser 字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dictText形式返回到前端 +// * 例输入当前返回值的就会多出一个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上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用 +// * @param result +// */ +// private void parseDictText(Object result) { +// if (result instanceof Result && ((Result) result).getResult() instanceof IPage) { +// List items = new ArrayList<>(); +// +// //step.1 筛选出加了 Dict 注解的字段列表 +// List dictFieldList = new ArrayList<>(); +// // 字典数据列表, key = 字典code,value=数据列表 +// Map> dataListMap = new HashMap<>(); +// +// addItems((Result) result, items, dictFieldList, dataListMap); +// +// //step.2 调用翻译方法,一次性翻译 +// Map> translText = this.translateAllDict(dataListMap); +// +// //step.3 将翻译结果填充到返回结果里 +// putItems(items, dictFieldList, translText); +// +// ((IPage) ((Result) result).getResult()).setRecords(items); +// } +// } +// +// private void putItems(List items, List dictFieldList, Map> translText) { +// for (JSONObject obj : 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 = obj.getString(field.getName()); +// if (oConvertUtils.isNotEmpty(value)) { +// List dictModels = translText.get(fieldDictCode); +// if(dictModels==null || dictModels.isEmpty()){ +// 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)); +// +// obj.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); +// } +// } +// } +// } +// +// private void addItems(Result> result, List items, List dictFieldList, Map> dataListMap) { +// for (Object obj : result.getResult().getRecords()) { +// ObjectMapper mapper = new ObjectMapper(); +// String json="{}"; +// try { +// //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat +// json = mapper.writeValueAsString(obj); +// } catch (JsonProcessingException e) { +// log.error("json解析失败"+e.getMessage(),e); +// } +// JSONObject item = JSON.parseObject(json,Feature.OrderedField); +// //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ +// // 遍历所有字段,把字典Code取出来,放到 map 里 +// putItem(dictFieldList, dataListMap, obj, item); +// items.add(item); +// } +// } +// +// private void putItem(List dictFieldList, Map> dataListMap, Object obj, JSONObject item) { +// for (Field field : oConvertUtils.getAllFields(obj)) { +// 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 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格式化日期 +// if (Date.class.isAssignableFrom(field.getType()) && 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())))); +// } +// } +// } +// +// /** +// * list 去重添加 +// */ +// private void listAddAllDeduplicate(List dataList, List addList) { +// // 筛选出dataList中没有的数据 +// List filterList = addList.stream().filter(i -> !dataList.contains(i)).collect(Collectors.toList()); +// dataList.addAll(filterList); +// } +// +// /** +// * 一次性把所有的字典都翻译了 +// * 1. 所有的普通数据字典的所有数据只执行一次SQL +// * 2. 表字典相同的所有数据只执行一次SQL +// * @param dataListMap +// * @return +// */ +// private Map> translateAllDict(Map> dataListMap) { +// // 翻译后的字典文本,key=dictCode +// Map> translText = new HashMap<>(); +// // 需要翻译的数据(有些可以从redis缓存中获取,就不走数据库查询) +// List needTranslData = new ArrayList<>(); +// //step.1 先通过redis中获取缓存字典数据 +// for (Map.Entry> entry : dataListMap.entrySet()) { +// String dictCode = entry.getKey(); +// List dataList = entry.getValue(); +// if (dataList.isEmpty()) { +// continue; +// } +// // 表字典需要翻译的数据 +// List needTranslDataTable = new ArrayList<>(); +// addNeedTranslData(translText, needTranslData, dictCode, dataList, needTranslDataTable); +// //step.2 调用数据库翻译表字典 +// if (!needTranslDataTable.isEmpty()) { +// String[] arr = dictCode.split(","); +// String table = arr[0]; +// String text = arr[1]; +// String code = arr[2]; +// String values = String.join(",", needTranslDataTable); +// log.info("translateDictFromTableByKeys.dictCode:" + dictCode); +// log.info("translateDictFromTableByKeys.values:" + values); +// List texts; +// if ("sys_user".equals(table)&&"realname".equals(text)&&"id".equals(code)){ +// texts = commonAPI.translateUserRealNameFromTableByKeys(values); +// }else { +// texts = commonAPI.translateDictFromTableByKeys(table, text, code, values); +// } +// log.info("translateDictFromTableByKeys.result:" + texts); +// List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); +// list.addAll(texts); +// setRedis(dictCode, texts); +// +// } +// } +// +// //step.3 调用数据库进行翻译普通字典 +// if (!needTranslData.isEmpty()) { +// List dictCodeList = Arrays.asList(dataListMap.keySet().toArray(new String[]{})); +// // 将不包含逗号的字典code筛选出来,因为带逗号的是表字典,而不是普通的数据字典 +// List filterDictCodes = dictCodeList.stream().filter(key -> !key.contains(",")).collect(Collectors.toList()); +// String dictCodes = String.join(",", filterDictCodes); +// String values = String.join(",", needTranslData); +// log.info("translateManyDict.dictCodes:" + dictCodes); +// log.info("translateManyDict.values:" + values); +// Map> manyDict = commonAPI.translateManyDict(dictCodes, values); +// log.info("translateManyDict.result:" + manyDict); +// for (Map.Entry> entry : manyDict.entrySet()) { +// String dictCode = entry.getKey(); +// List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); +// List newList = entry.getValue(); +// list.addAll(newList); +// +// // 做 redis 缓存 +// for (DictModel dict : newList) { +// String redisKey = String.format(SYS_CACHE_DICT_S_S, dictCode, dict.getValue()); +// try { +// redisTemplate.opsForValue().set(redisKey, dict.getText()); +// } catch (Exception e) { +// log.warn(e.getMessage(), e); +// } +// } +// } +// } +// return translText; +// } +// +// private void setRedis(String dictCode, List texts) { +// // 做 redis 缓存 +// for (DictModel dict : texts) { +// String redisKey = String.format(CacheConstant.SYS_DICT_TABLE_CACHE_SIMPLE_KEY, dictCode, dict.getValue()); +// try { +// // 保留10分钟 +// redisTemplate.opsForValue().set(redisKey, dict.getText(), 600, TimeUnit.SECONDS); +// } catch (Exception e) { +// log.warn(e.getMessage(), e); +// } +// } +// } +// +// private void addNeedTranslData(Map> translText, List needTranslData, String dictCode, List dataList, List needTranslDataTable) { +// for (String s : dataList) { +// String data = s.trim(); +// if (data.length() == 0) { +// continue; //跳过循环 +// } +// if (dictCode.contains(",")) { +// String keyString = String.format(CacheConstant.SYS_DICT_TABLE_CACHE_SIMPLE_KEY, dictCode, data); +// if (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))) { +// addList(translText, dictCode, data, keyString); +// } else if (!needTranslDataTable.contains(data)) { +// // 去重添加 +// needTranslDataTable.add(data); +// } +// } else { +// String keyString = String.format(SYS_CACHE_DICT_S_S, dictCode, data); +// if (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))) { +// addList(translText, dictCode, data, keyString); +// } else if (!needTranslData.contains(data)) { +// // 去重添加 +// needTranslData.add(data); +// } +// } +// +// } +// } +// +// private void addList(Map> translText, String dictCode, String data, String keyString) { +// try { +// String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); +// List list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); +// list.add(new DictModel(data, text)); +// } catch (Exception e) { +// log.warn(e.getMessage()); +// } +// } +// +// /** +// * 字典值替换文本 +// * +// * @param dictModels +// * @param values +// * @return +// */ +// private String translDictText(List dictModels, String values) { +// List result = new ArrayList<>(); +// +// // 允许多个逗号分隔,允许传数组对象 +// String[] splitVal = values.split(","); +// for (String val : splitVal) { +// String dictText = ""; +// for (DictModel dict : dictModels) { +// if (val.equals(dict.getValue())) { +// dictText = dict.getText(); +// break; +// } +// } +// result.add(dictText); +// } +// return String.join(",", result); +// } +// +// /** +// * 翻译字典文本 +// * @param code +// * @param text +// * @param table +// * @param key +// * @deprecated 不推荐 +// * @return +// */ +// @Deprecated +// private String translateDictValue(String code, String text, String table, String key) { +// if(oConvertUtils.isEmpty(key)) { +// return null; +// } +// StringBuilder textValue = new StringBuilder(); +// String[] keys = key.split(","); +// for (String k : keys) { +// String tmpValue = null; +// log.debug(" 字典 key : "+ k); +// if (k.trim().length() == 0) { +// continue; //跳过循环 +// } +// //update-begin--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- +//// tmpValue = getTmpValue(code, text, table, k, tmpValue); +// //update-end--Author:scott -- Date:20210531 ----for: !56 优化微服务应用下存在表字段需要字典翻译时加载缓慢问题----- +// +// if (tmpValue != null) { +// if (!"".equals(textValue.toString())) { +// textValue.append(","); +// } +// textValue.append(tmpValue); +// } +// +// } +// return textValue.toString(); +// } +// +// private String getTmpValue(String code, String text, String table, String k, String tmpValue) { +// if (!StringUtils.isEmpty(table)){ +// log.info("--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 (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))){ +// try { +// tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); +// } catch (Exception e) { +// log.warn(e.getMessage()); +// } +// }else { +// //处理用户要翻译为姓名加工号 +// if ("sys_user".equals(table)&&"realname".equals(text)&&"id".equals(code)){ +// tmpValue= commonAPI.translateUserRealNameFromTable(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 (Boolean.TRUE.equals(redisTemplate.hasKey(keyString))){ +// try { +// tmpValue = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); +// } catch (Exception e) { +// log.warn(e.getMessage()); +// } +// }else { +// tmpValue = commonAPI.translateDict(code, k.trim()); +// } +// } +// return tmpValue; +// } +// +// /** +// * @param result +// */ +// private void parseMethodDictText(Object result) { +// if (result instanceof Result) { +// Object result1 = ((Result) result).getResult(); +// String jsonStr = JSONUtil.toJsonStr(result1); +// if (JSONUtil.isTypeJSONObject(jsonStr)) { +// JSONObject translate = translate(result1); +// ((Result) result).setResult(translate); +// } else { +// List items = new ArrayList<>(); +// for (Object o : (List) result1) { +// JSONObject translate = translate(o); +// items.add(translate); +// } +// ((Result) result).setResult(items); +// } +// } +// } +// +// /** +// * @param record +// * @return +// */ +// private JSONObject translate(Object record) { +// ObjectMapper mapper = new ObjectMapper(); +// String json = "{}"; +// try { +// //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat +// json = mapper.writeValueAsString(record); +// } catch (JsonProcessingException e) { +// log.error("json解析失败" + e.getMessage(), e); +// } +// JSONObject item = JSONObject.parseObject(json, Feature.OrderedField); +// //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ +// //for (Field field : record.getClass().getDeclaredFields()) { +// for (Field field : oConvertUtils.getAllFields(record)) { +// //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------ +// if (field.getAnnotation(Dict.class) != null) { +// String code = field.getAnnotation(Dict.class).dicCode(); +// String text = field.getAnnotation(Dict.class).dicText(); +// String table = field.getAnnotation(Dict.class).dictTable(); +// String key = String.valueOf(item.get(field.getName())); +// +// //翻译字典值对应的txt +// String textValue = translateDictValue(code, text, table, key); +// +// log.debug(" 字典Val : " + textValue); +// log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue); +// item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue); +// } +// //date类型默认转换string格式化日期 +// if (field.getType().getName().equals("java.util.Date") && 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())))); +// } +// } +// return item; +// } +// } diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/entity/DocumentSplitInfo.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/entity/DocumentSplitInfo.java index fbc0825..5c4963d 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/entity/DocumentSplitInfo.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/entity/DocumentSplitInfo.java @@ -99,4 +99,8 @@ public class DocumentSplitInfo extends BaseEntity { @TableField(exist = false) @Dict(dicCode = "split_standard_source") private String splitStandardSource; + + // 文件状态展示字段 + @TableField(exist = false) + private String fileTypeShow; } diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/service/impl/DocumentSplitServiceImpl.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/service/impl/DocumentSplitServiceImpl.java index 3654330..e4dd2f6 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/service/impl/DocumentSplitServiceImpl.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/documenttool/service/impl/DocumentSplitServiceImpl.java @@ -149,7 +149,24 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { public IPage queryByPage(DocumentSplitInfo documentSplitInfo, Integer pageNo, Integer pageSize) { // 构建查询条件 QueryWrapper queryWrapper = getSarFileSplitInfoEOQueryWrapper(documentSplitInfo); - return documentSplitMapper.queryByPage(new Page<>(pageNo, pageSize), queryWrapper); + IPage documentSplitInfoIPage = documentSplitMapper.queryByPage(new Page<>(pageNo, pageSize), queryWrapper); + this.disposeData(documentSplitInfoIPage.getRecords()); + return documentSplitInfoIPage; + } + + private void disposeData(List datas) { + if (CollectionUtils.isNotEmpty(datas)) { + for (DocumentSplitInfo data : datas) { + if (StringUtils.isNotEmpty(data.getFileType())) { + if (StringUtils.equals(data.getFileType(), "1")) { + data.setFileTypeShow("发布稿"); + } else if (StringUtils.equals(data.getFileType(), "2")) { + data.setFileTypeShow("正文"); + } + } + } + } + } @Override @@ -298,8 +315,8 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { public void add(SarFileSplitInfoEO sarFileSplitInfoEO) { // // 企标权限校验 // enterpriseCheck(sarFileSplitInfoEO); -// // 唯一校验 -// uniqueCheck(sarFileSplitInfoEO); + // 唯一校验 + uniqueCheck(sarFileSplitInfoEO); // 保存文本拆分数据 saveDocumentSplitInfo(sarFileSplitInfoEO); //拆分 diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java index 570bfb5..95c32b2 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/controller/SarFileSplitMenuEOController.java @@ -36,7 +36,7 @@ public class SarFileSplitMenuEOController extends JeroController> list(SarFileSplitMenuEOPage page) throws Exception { page.setValidFlag("0"); - page.setOrderBy("display_seq asc"); + page.setOrderBy("display_seq,creation_time ASC"); List getList = sarFileSplitMenuEOService.queryByList(page); return Result.OK(getList); } diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java index 2a9980c..e203e5a 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/split/service/impl/SarFileSplitMenuEOServiceImpl.java @@ -255,9 +255,25 @@ public class SarFileSplitMenuEOServiceImpl extends ServiceImpl createChildList(SarFileSplitMenuEO testTree, List treeList) { - return treeList.stream().filter(v -> testTree.getId().equals(v.getPId())) + List results = treeList.stream().filter(v -> testTree.getId().equals(v.getPId())) .peek(v -> v.setChildren(createChildList(v, treeList))) .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(results)) { + Collections.sort(results, new Comparator() { + @Override + public int compare(SarFileSplitMenuEO o1, SarFileSplitMenuEO o2) { + if(o1.getDisplaySeq().compareTo(o2.getDisplaySeq())>0){ + return 1; + }else if(o1.getDisplaySeq().compareTo(o2.getDisplaySeq())==0){ + if(o1.getCreationTime().compareTo(o2.getCreationTime())<0){ + return 1; + } + } + return -1; + } + }); + } + return results; } @Override