/**
* 获取对象的子列表方法
- *
- * @param name 名称
+ *
+ * @param name 名称
* @param pojoClass 类对象
* @return 子列表方法
*/
- public Method getSubMethod(String name, Class> pojoClass)
- {
+ public Method getSubMethod(String name, Class> pojoClass) {
StringBuffer getMethodName = new StringBuffer("get");
getMethodName.append(name.substring(0, 1).toUpperCase());
getMethodName.append(name.substring(1));
Method method = null;
- try
- {
- method = pojoClass.getMethod(getMethodName.toString(), new Class[] {});
- }
- catch (Exception e)
- {
+ try {
+ method = pojoClass.getMethod(getMethodName.toString(), new Class[]{});
+ } catch (Exception e) {
log.error("获取对象异常{}", e.getMessage());
}
return method;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translate.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translate.java
new file mode 100644
index 0000000..592bfe0
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/Translate.java
@@ -0,0 +1,66 @@
+package com.ruoyi.common.utils.translation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 额外字典翻译字段注解, 用来代替无法使用Excel注解的情况, 优先级大于Excel注解
+ * 优先级(5种):
+ * sql [+ referenceProperty]: 单条SQL语句: 建议加上LIMIT 1, 多条时取第一条, 必须指定占位符?. 例如: @Translate(sql = "SELECT * FROM t_finance_book WHERE id = ? LIMIT 1")
+ * table + tableKeyColumn + tableValueColumn [+ referenceProperty]: 拼接为 SELECT `tableValueColumn` FROM `table` WHERE `tableKeyColumn` = ? LIMIT 1. 例如: @Translate(table = "t_finance_book", tableValueColumn = "book_name", tableKeyColumn = "id")
+ *
+ * dictSql + tableKeyColumn + tableValueColumn: 执行查询SQL后, 取tableKeyColumn(), tableValueColumn()作为字典键值. 例如: @Translate(dictSql = "SELECT * FROM t_finance_book", tableValueColumn = "book_name", tableKeyColumn = "id")
+ * readConverterExp
+ * dictType
+ *
+ * 前两种方式使用待翻译字段值直查
+ * 后三种都是加载对应键值字典, 然后用待翻译字段值匹配. 如果都指定了, 会按优先级混合在一起, 优先级高的覆盖优先级低的
+ *
+ * 关于referenceProperty
+ * 如果带翻译字段为Long的其他表ID, 如:
+ * private Long bookId;
+ * 如果需要翻译bookId
+ * 一种方法是将bookId设为String类型
+ * 还有一种方法是声明String类型的属性辅助翻译bookId, 该新属性不需要原来本身就有bookId的值, 如
+ *
+ * @author zhao
+ * @Translate(table = "t_finance_book", tableKeyColumn = "id", tableValueColumn = "book_name", referenceProperty = "bookId") // 引用bookId属性的值
+ * // @Translate(sql = "SELECT * FROM t_finance_book WHERE id = ? LIMIT 1", referenceProperty = "bookId") // 也可以写成这样
+ * private String bookName; // bookName的值不需要读取, 只写入
+ * private Long typeId;
+ * @Translate(dictType = "dict_xxx_type", referenceProperty = "typeId") // 引用typeId属性的值
+ * private String typeName; // typeName的值不需要读取, 只写入
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Translate {
+ /**
+ * 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
+ */
+ public String dictType() default "" ;
+
+ /**
+ * 读取内容转表达式 (如: 0=男,1=女,2=未知)
+ */
+ public String readConverterExp() default "" ;
+
+ // 查询数据库字典, 字段必须为String, 不能为Long/Integer等数字型
+ // 方式1: SQL, ?号占位
+ public String sql() default "" ;
+
+ // 方式2: 表名 + 对应列名 + 名称列
+ // 拼接为 SELECT tableValueColumn() FROM table() WHERE tableKeyColumn() = ? LIMIT 1
+ public String table() default "" ; // 表名
+
+ public String tableKeyColumn() default "id" ; // 键的列名
+
+ public String tableValueColumn() default "name" ; // 值的列名
+
+ public String referenceProperty() default "" ; // 引用其他类成员属性
+
+ // 方式3: SQL + 对应列名 + 名称列: 无占位符, 从数据库加载键值对
+ // 执行查询SQL后, 取tableKeyColumn(), tableValueColumn()作为字典键值
+ public String dictSql() default "" ;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/TranslateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/TranslateUtils.java
new file mode 100644
index 0000000..3a8a3a8
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/translation/TranslateUtils.java
@@ -0,0 +1,58 @@
+package com.ruoyi.common.utils.translation;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * zhao: 字段自动字典翻译
+ * 需要翻译的字段必须使用Translate注解或Excel注解标记
+ * 优先级:
+ * 注解: Translate优先级大于Excel. 只会使用Translate或Excel其中的一种, 不会混合
+ * 注解属性: readConverterExp优先级大于dictType. readConverterExp和dictType的键值对最终会混合在一起
+ * 字段类型:
+ * 如果是String类型, 必须赋值注解的dictType或readConverterExp
+ * 如果是其他复合类型/List, 无需赋值dictType或readConverterExp, 仅标记注解即可, 此时将递归翻译(注意不要循环嵌套对象)
+ *
+ * 数据库表数据字典: 仅Translate注解支持
+ * 字段必须为String类型
+ */
+public final class TranslateUtils {
+ private TranslateUtils() {
+ }
+
+ public static void translateList(List> list, Object... args) {
+ new Translator().translateList(list, args);
+ }
+
+ public static void translate(Object obj, Object... args) {
+ new Translator().translate(obj, args);
+ }
+
+ public static void translateMapList(List