¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.common.util; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.jeecg.common.api.CommonAPI; |
| | | import org.jeecg.common.constant.CommonConstant; |
| | | import org.jeecg.common.system.vo.DictModel; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Component |
| | | @Slf4j |
| | | public class TranslateDictTextUtils { |
| | | |
| | | @Lazy |
| | | @Autowired |
| | | private CommonAPI commonApi; |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | |
| | | public void translateField(String field, String value, JSONObject item, String dictCode) { |
| | | if (StringUtils.isBlank(value)) { |
| | | item.put(field + CommonConstant.DICT_TEXT_SUFFIX, null); |
| | | return; |
| | | } |
| | | // åå
¸æ°æ®åè¡¨ï¼ key = åå
¸codeï¼value=æ°æ®å表 |
| | | Map<String, List<String>> dataListMap = new HashMap<>(5); |
| | | dataListMap.put(dictCode, this.listAddAllDeduplicate(new ArrayList<>(), Arrays.asList(value.split(",")))); |
| | | //step.2 è°ç¨ç¿»è¯æ¹æ³ï¼ä¸æ¬¡æ§ç¿»è¯ |
| | | Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap); |
| | | //ç¿»è¯ |
| | | List<DictModel> dictModels = translText.get(dictCode); |
| | | if (CollectionUtil.isEmpty(dictModels)) { |
| | | item.put(field + CommonConstant.DICT_TEXT_SUFFIX, null); |
| | | return; |
| | | } |
| | | String textValue = this.translDictText(dictModels, value); |
| | | item.put(field + CommonConstant.DICT_TEXT_SUFFIX, textValue); |
| | | } |
| | | |
| | | /** |
| | | * åå
¸å¼æ¿æ¢ææ¬ |
| | | * |
| | | * @param dictModels |
| | | * @param values |
| | | * @return |
| | | */ |
| | | private String translDictText(List<DictModel> dictModels, String values) { |
| | | List<String> result = new ArrayList<>(); |
| | | |
| | | // å
许å¤ä¸ªéå·åéï¼å
è®¸ä¼ æ°ç»å¯¹è±¡ |
| | | String[] splitVal = values.split(","); |
| | | for (String val : splitVal) { |
| | | String dictText = val; |
| | | for (DictModel dict : dictModels) { |
| | | if (val.equals(dict.getValue())) { |
| | | dictText = dict.getText(); |
| | | break; |
| | | } |
| | | } |
| | | result.add(dictText); |
| | | } |
| | | return String.join(",", result); |
| | | } |
| | | |
| | | /** |
| | | * list å»éæ·»å |
| | | */ |
| | | private List<String> listAddAllDeduplicate(List<String> dataList, List<String> addList) { |
| | | // çéåºdataList䏿²¡æçæ°æ® |
| | | List<String> filterList = addList.stream().filter(i -> !dataList.contains(i)).collect(Collectors.toList()); |
| | | dataList.addAll(filterList); |
| | | return dataList; |
| | | } |
| | | |
| | | /** |
| | | * 䏿¬¡æ§æææçåå
¸é½ç¿»è¯äº |
| | | * 1. ææçæ®éæ°æ®åå
¸çæææ°æ®åªæ§è¡ä¸æ¬¡SQL |
| | | * 2. 表åå
¸ç¸åçæææ°æ®åªæ§è¡ä¸æ¬¡SQL |
| | | * |
| | | * @param dataListMap |
| | | * @return |
| | | */ |
| | | private Map<String, List<DictModel>> translateAllDict(Map<String, List<String>> dataListMap) { |
| | | // ç¿»è¯åçåå
¸ææ¬ï¼key=dictCode |
| | | Map<String, List<DictModel>> translText = new HashMap<>(5); |
| | | // éè¦ç¿»è¯çæ°æ®ï¼æäºå¯ä»¥ä»redisç¼åä¸è·åï¼å°±ä¸èµ°æ°æ®åºæ¥è¯¢ï¼ |
| | | List<String> needTranslData = new ArrayList<>(); |
| | | //step.1 å
éè¿redisä¸è·åç¼ååå
¸æ°æ® |
| | | for (String dictCode : dataListMap.keySet()) { |
| | | List<String> dataList = dataListMap.get(dictCode); |
| | | if (dataList.size() == 0) { |
| | | continue; |
| | | } |
| | | // 表åå
¸éè¦ç¿»è¯çæ°æ® |
| | | List<String> needTranslDataTable = new ArrayList<>(); |
| | | for (String s : dataList) { |
| | | String data = s.trim(); |
| | | if (data.length() == 0) { |
| | | continue; //è·³è¿å¾ªç¯ |
| | | } |
| | | if (dictCode.contains(",")) { |
| | | String keyString = String.format("sys:cache:dictTable::SimpleKey [%s,%s]", dictCode, data); |
| | | if (redisTemplate.hasKey(keyString)) { |
| | | try { |
| | | String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); |
| | | List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); |
| | | list.add(new DictModel(data, text)); |
| | | } catch (Exception e) { |
| | | log.warn(e.getMessage()); |
| | | } |
| | | } else if (!needTranslDataTable.contains(data)) { |
| | | // å»éæ·»å |
| | | needTranslDataTable.add(data); |
| | | } |
| | | } else { |
| | | String keyString = String.format("sys:cache:dict::%s:%s", dictCode, data); |
| | | if (redisTemplate.hasKey(keyString)) { |
| | | try { |
| | | String text = oConvertUtils.getString(redisTemplate.opsForValue().get(keyString)); |
| | | List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); |
| | | list.add(new DictModel(data, text)); |
| | | } catch (Exception e) { |
| | | log.warn(e.getMessage()); |
| | | } |
| | | } else if (!needTranslData.contains(data)) { |
| | | // å»éæ·»å |
| | | needTranslData.add(data); |
| | | } |
| | | } |
| | | |
| | | } |
| | | //step.2 è°ç¨æ°æ®åºç¿»è¯è¡¨åå
¸ |
| | | if (needTranslDataTable.size() > 0) { |
| | | String[] arr = dictCode.split(","); |
| | | String table = arr[0], text = arr[1], code = arr[2]; |
| | | String values = String.join(",", needTranslDataTable); |
| | | log.debug("translateDictFromTableByKeys.dictCode:" + dictCode); |
| | | log.debug("translateDictFromTableByKeys.values:" + values); |
| | | List<DictModel> texts = commonApi.translateDictFromTableByKeys(table, text, code, values); |
| | | log.debug("translateDictFromTableByKeys.result:" + texts); |
| | | List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); |
| | | list.addAll(texts); |
| | | |
| | | // å redis ç¼å |
| | | for (DictModel dict : texts) { |
| | | String redisKey = String.format("sys:cache:dictTable::SimpleKey [%s,%s]", dictCode, dict.getValue()); |
| | | try { |
| | | // update-begin-author:taoyan date:20211012 for: åå
¸è¡¨ç¿»è¯æ³¨è§£ç¼åæªæ´æ° issues/3061 |
| | | // ä¿ç5åé |
| | | redisTemplate.opsForValue().set(redisKey, dict.getText(), 300, TimeUnit.SECONDS); |
| | | // update-end-author:taoyan date:20211012 for: åå
¸è¡¨ç¿»è¯æ³¨è§£ç¼åæªæ´æ° issues/3061 |
| | | } catch (Exception e) { |
| | | log.warn(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | //step.3 è°ç¨æ°æ®åºè¿è¡ç¿»è¯æ®éåå
¸ |
| | | if (needTranslData.size() > 0) { |
| | | List<String> dictCodeList = Arrays.asList(dataListMap.keySet().toArray(new String[]{})); |
| | | // å°ä¸å
å«éå·çåå
¸codeçéåºæ¥ï¼å 为带éå·çæ¯è¡¨åå
¸ï¼è䏿¯æ®éçæ°æ®åå
¸ |
| | | List<String> filterDictCodes = dictCodeList.stream().filter(key -> !key.contains(",")).collect(Collectors.toList()); |
| | | String dictCodes = String.join(",", filterDictCodes); |
| | | String values = String.join(",", needTranslData); |
| | | log.debug("translateManyDict.dictCodes:" + dictCodes); |
| | | log.debug("translateManyDict.values:" + values); |
| | | Map<String, List<DictModel>> manyDict = commonApi.translateManyDict(dictCodes, values); |
| | | log.debug("translateManyDict.result:" + manyDict); |
| | | for (String dictCode : manyDict.keySet()) { |
| | | List<DictModel> list = translText.computeIfAbsent(dictCode, k -> new ArrayList<>()); |
| | | List<DictModel> newList = manyDict.get(dictCode); |
| | | 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; |
| | | } |
| | | } |