From 30ef331bb979f3d3b63bf572335a81bbeb061948 Mon Sep 17 00:00:00 2001 From: zws <447643445@qq.com> Date: Sat, 20 Apr 2024 19:14:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20@Trans=20=E6=94=AF=E6=8C=81=E5=8F=8D?= =?UTF-8?q?=E5=90=91=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Trans 增加 unTrans 开关 默认: 不反向翻译 如果配置了UnTrans,则UnTrans优先级更高 适合场景: 翻译值也是唯一的情况 --- .../java/com/fhs/core/trans/anno/Trans.java | 11 + .../java/com/fhs/core/trans/anno/UnTrans.java | 5 + .../java/com/fhs/trans/manager/ClassInfo.java | 24 ++ .../service/impl/DictionaryTransService.java | 22 ++ .../trans/service/impl/ITransTypeService.java | 20 ++ .../service/impl/SimpleTransService.java | 211 +++++++++++++++++- .../fhs/trans/service/impl/TransService.java | 13 +- 7 files changed, 302 insertions(+), 4 deletions(-) diff --git a/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/Trans.java b/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/Trans.java index 678f1d9..a779632 100644 --- a/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/Trans.java +++ b/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/Trans.java @@ -106,6 +106,17 @@ public @interface Trans { */ String uniqueField() default ""; + /** + * 是否支持反向翻译 注解值映射 + * type > type + * dict > key + * refs > refs and ref + * columns > fields + * uniqueColumn > uniqueField + * tableName > key + */ + boolean unTrans() default false; + /** * 排序字段,一般用于级联翻译 * @return diff --git a/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/UnTrans.java b/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/UnTrans.java index e5ef886..fbaa2f7 100644 --- a/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/UnTrans.java +++ b/easy-trans-anno/src/main/java/com/fhs/core/trans/anno/UnTrans.java @@ -55,5 +55,10 @@ public @interface UnTrans { */ String tableName() default ""; + /** + * 如果 Trans 支持反向翻译 可以拿到原始Trans 注解 + * @return + */ + Trans trans() default @Trans(type = ""); } diff --git a/easy-trans-service/src/main/java/com/fhs/trans/manager/ClassInfo.java b/easy-trans-service/src/main/java/com/fhs/trans/manager/ClassInfo.java index cae577b..45359c0 100644 --- a/easy-trans-service/src/main/java/com/fhs/trans/manager/ClassInfo.java +++ b/easy-trans-service/src/main/java/com/fhs/trans/manager/ClassInfo.java @@ -38,6 +38,8 @@ public class ClassInfo implements Serializable { */ private Map> transFieldMap = new HashMap>(); + private Map> unTransFieldMapByTrans = new HashMap>(); + private Map> unTransFieldMap = new HashMap>(); public ClassInfo() { @@ -129,6 +131,20 @@ public class ClassInfo implements Serializable { fieldList.add(field); unTransFieldMap.put(untrans.type(), fieldList); } + } else { + //如果没有 UnTrans注解 再判断 Trans注解是否支持反向翻译 + if (trans != null && trans.unTrans()) { + if (trans.type() == null) { + LOGGER.warn("类 {} 属性 [{}] type为空。", clazz.getName(), field.getName()); + } else { + unTransTypeSet.add(trans.type()); + List fieldList = unTransFieldMapByTrans.get(trans.type()); + fieldList = fieldList != null ? fieldList : new ArrayList(); + fieldList.add(field); + unTransFieldMapByTrans.put(trans.type(), fieldList); + } + } + } } @@ -165,4 +181,12 @@ public class ClassInfo implements Serializable { public void setUnTransFieldMap(Map> unTransFieldMap) { this.unTransFieldMap = unTransFieldMap; } + + public Map> getUnTransFieldMapByTrans() { + return unTransFieldMapByTrans; + } + + public void setUnTransFieldMapByTrans(Map> unTransFieldMapByTrans) { + this.unTransFieldMapByTrans = unTransFieldMapByTrans; + } } diff --git a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/DictionaryTransService.java b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/DictionaryTransService.java index 803df4d..c91df9e 100644 --- a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/DictionaryTransService.java +++ b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/DictionaryTransService.java @@ -173,6 +173,28 @@ public class DictionaryTransService implements ITransTypeService, InitializingBe } } + @Override + public void unTransOneByTrans(Object obj, List toTransList) { + for (Field tempField : toTransList) { + tempField.setAccessible(true); + try { + Trans trans = tempField.getAnnotation(Trans.class); + String value = bothCacheService.get(UNTRANS_PREFIX + trans.key() + "_" + + ReflectUtils.getDeclaredField(obj.getClass(),trans.refs()[0]).get(obj)); + setValue(obj,tempField.getName(),value); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void unTransMoreByTrans(List objList, List toTransList) { + for (Object obj : objList) { + unTransOneByTrans(obj, toTransList); + } + } + @Override public void transOne(VO obj, List toTransList) { Trans tempTrans = null; diff --git a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/ITransTypeService.java b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/ITransTypeService.java index 88a525e..320e153 100644 --- a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/ITransTypeService.java +++ b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/ITransTypeService.java @@ -166,6 +166,26 @@ public interface ITransTypeService { } + /** + * 反向翻译一个字段 + * + * @param obj 需要翻译的对象 + * @param toTransList 需要翻译的字段 + */ + default void unTransOneByTrans(Object obj, List toTransList) { + this.unTransOne(obj, toTransList); + } + + /** + * 反向翻译多个 字段 + * + * @param objList 需要翻译的对象集合 + * @param toTransList 需要翻译的字段集合 + */ + default void unTransMoreByTrans(List objList, List toTransList) { + this.unTransMore(objList, toTransList); + } + /** * 设置ref diff --git a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/SimpleTransService.java b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/SimpleTransService.java index 0b65ec2..a734745 100644 --- a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/SimpleTransService.java +++ b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/SimpleTransService.java @@ -177,6 +177,37 @@ public class SimpleTransService implements ITransTypeService, InitializingBean { unTransThreadLocalCache.set(null); } + @Override + public void unTransOneByTrans(Object obj, List toTransList) { + for (Field field : toTransList) { + String transValue = getUnTransResult(obj, field.getAnnotation(Trans.class), field); + setValue(obj, field.getName(), transValue); + } + } + + @Override + public void unTransMoreByTrans(List objList, List toTransList) { + // @untrans(type simple,ref="userName",target=" t_user ",fields={"user_name"}) + // @untrans(type simple,refs="userName,deptName",target=xx,fields={'f1','f2'}) + // @untrans(type simple,refs="userName,deptName",target=xx,oo fields={"f1","f2"},on={"a.xx=b.xx","b.xx=c.xx"},unikey) 组合 + + if (simpleUnTransDiver == null) { + throw new RuntimeException("没有simpleUnTransDiver,请手动指定数据库"); + } + unTransThreadLocalCache.set(new HashMap<>()); + for (Field field : toTransList) { + Trans trans = field.getAnnotation(Trans.class); + Map unTransMap = simpleUnTransDiver.getUnTransMap(trans, (List) objList.stream().map(obj -> { + return appedGroupKey(obj, trans, field); + }).collect(Collectors.toList())); + unTransThreadLocalCache.get().put(field.getName(), unTransMap); + } + for (Object o : objList) { + unTransOneByTrans(o, toTransList); + } + unTransThreadLocalCache.set(null); + } + /** * 获取单个翻译结果 * @@ -192,11 +223,23 @@ public class SimpleTransService implements ITransTypeService, InitializingBean { if (fieldUnTransMap == null) { return null; } - fieldUnTransMap.get(appedGroupKey(obj, unTrans, field)); + return fieldUnTransMap.get(appedGroupKey(obj, unTrans, field)); } return simpleUnTransDiver.getUnTransResult(unTrans, appedGroupKey(obj, unTrans, field)); } + public String getUnTransResult(Object obj, Trans trans, Field field) { + //本地缓存优先 + if (this.unTransThreadLocalCache.get() != null) { + Map fieldUnTransMap = this.unTransThreadLocalCache.get().get(field.getName()); + if (fieldUnTransMap == null) { + return null; + } + return fieldUnTransMap.get(appedGroupKey(obj, trans, field)); + } + return simpleUnTransDiver.getUnTransResult(trans, appedGroupKey(obj, trans, field)); + } + @Override public void transMore(List objList, List toTransList) { @@ -489,6 +532,38 @@ public class SimpleTransService implements ITransTypeService, InitializingBean { } } + public String appedGroupKey(Object obj, Trans trans, Field field) { + List refList = new ArrayList<>(); + if (trans != null) { + String ref = trans.ref(); + String[] refs = trans.refs(); + if (CheckUtils.isNotEmpty(ref)) { + refList.add(ref); + } + if (refs != null) { + Collections.addAll(refList, refs); + } + } + //代表多个字段拼接 + if (refList.size() > 1) { + List values = new ArrayList<>(); + for (String ref : refList) { + try { + values.add(ConverterUtils.toString(ReflectUtils.getDeclaredField(obj.getClass(), ref).get(obj))); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + return values.stream().collect(Collectors.joining(SEPARATOR)); + } + //如果refs 不是多个代表只有单个字段,非组合 + try { + return ConverterUtils.toString(ReflectUtils.getDeclaredField(obj.getClass(), refList.get(0)).get(obj)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + /** * 简单翻译数据驱动 */ @@ -571,6 +646,28 @@ public class SimpleTransService implements ITransTypeService, InitializingBean { */ String getUnTransResult(UnTrans unTrans, String groupKey); + /** + * 获取翻译的map (默认实现 兼容 @UnTrans) + * + * @param trans 反向翻译配置 + * @param groupKeys 分组key集合 + * @return + */ + default Map getUnTransMap(Trans trans, List groupKeys){ + return getUnTransMap(new SimpleUnTrans(trans), groupKeys); + } + + /** + * 获取单个反向翻译结果 (默认实现 兼容 @UnTrans) + * + * @param trans 反向翻译配置 + * @param groupKey 分组key + * @return + */ + default String getUnTransResult(Trans trans, String groupKey) { + return getUnTransResult(new SimpleUnTrans(trans), groupKey); + } + } @@ -705,6 +802,11 @@ class SimpleTrans implements Trans { return (anno.uniqueField().length() != 0 || "".equals(uniqueField)) ? anno.uniqueField() : uniqueField; } + @Override + public boolean unTrans() { + return anno.unTrans(); + } + @Override public int sort() { return anno.sort(); @@ -714,4 +816,109 @@ class SimpleTrans implements Trans { public Class annotationType() { return anno.annotationType(); } -} \ No newline at end of file +} + + +/** + * Trans 也支持反向翻译 + */ +class SimpleUnTrans implements UnTrans { + + private Trans anno; + + /** + * 翻译字段 + */ + private String[] fields = new String[]{}; + + /** + * 别名 + */ + private String alias = ""; + + /** + * 唯一键 + */ + private String uniqueField = ""; + + private String dataSource = ""; + + + public SimpleUnTrans(Trans anno) { + this.anno = anno; + Class clazz = (Class) anno.target(); + if (clazz != null && clazz.isAnnotationPresent(TransDefaultSett.class)) { + TransDefaultSett transDefaultSett = clazz.getAnnotation(TransDefaultSett.class); + this.fields = transDefaultSett.defaultFields(); + this.alias = transDefaultSett.defaultAlias(); + this.uniqueField = transDefaultSett.uniqueField(); + this.dataSource = transDefaultSett.dataSource(); + } + } + + @Override + public String type() { + return anno.type(); + } + + @Override + public String dict() { + return anno.key(); + } + + + @Override + public String[] refs() { + List refList = new ArrayList<>(); + String ref = anno.ref(); + String[] refs = anno.refs(); + if (CheckUtils.isNotEmpty(ref)) { + refList.add(ref); + } + if (refs != null) { + Collections.addAll(refList, refs); + } + return refList.toArray(new String[0]); + } + + @Override + public String[] columns() { + if (anno.fields().length != 0 || fields == null) { + return anno.fields(); + } + return fields; + } + + @Override + public String uniqueColumn() { + if (!anno.uniqueField().isEmpty() || "".equals(uniqueField)) { + if (anno.uniqueField().isEmpty()) { + // @Trans.uniqueField 没有填 @UnTrans 默认值为id + return "id"; + } + } + return uniqueField; + } + + @Override + public String tableName() { + if (CheckUtils.isNotEmpty(anno.key())) { + return anno.key(); + } + //Trans注解在翻译的时候 是用 target 或 targetClassName + //一般情况 key 是字典的时候采用 simple不会填 处理方式有两种 + //1. 不使用默认easy-trans-untrans-driver 自己实现SimpleUnTransDiver接口 比如直接取Trans做反向翻译 + //2. 使用默认 easy-trans-untrans-driver 反向翻译 则key必填 + return anno.target().getSimpleName(); + } + + @Override + public Trans trans() { + return this.anno; + } + + @Override + public Class annotationType() { + return anno.annotationType(); + } +} diff --git a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/TransService.java b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/TransService.java index 930f8a1..a40a777 100644 --- a/easy-trans-service/src/main/java/com/fhs/trans/service/impl/TransService.java +++ b/easy-trans-service/src/main/java/com/fhs/trans/service/impl/TransService.java @@ -1,5 +1,6 @@ package com.fhs.trans.service.impl; +import com.fhs.common.utils.CheckUtils; import com.fhs.core.trans.anno.Trans; import com.fhs.core.trans.vo.VO; import com.fhs.trans.manager.ClassInfo; @@ -80,7 +81,11 @@ public class TransService { logger.warn("没有匹配的转换器:" + unTransType); continue; } - transTypeService.unTransMore(objList, info.getUnTransFieldMap().get(unTransType)); + if (CheckUtils.isNotEmpty(info.getUnTransFieldMap().get(unTransType))) { + transTypeService.unTransMore(objList, info.getUnTransFieldMap().get(unTransType)); + } else if (CheckUtils.isNotEmpty(info.getUnTransFieldMapByTrans().get(unTransType))) { + transTypeService.unTransMoreByTrans(objList, info.getUnTransFieldMapByTrans().get(unTransType)); + } } } @@ -103,7 +108,11 @@ public class TransService { logger.warn("没有匹配的转换器:" + unTransType); continue; } - transTypeService.unTransOne(obj, info.getUnTransFieldMap().get(unTransType)); + if (CheckUtils.isNotEmpty(info.getUnTransFieldMap().get(unTransType))) { + transTypeService.unTransOne(obj, info.getUnTransFieldMap().get(unTransType)); + } else if (CheckUtils.isNotEmpty(info.getUnTransFieldMapByTrans().get(unTransType))) { + transTypeService.unTransOneByTrans(obj, info.getUnTransFieldMapByTrans().get(unTransType)); + } } } -- Gitee