Преглед на файлове

Merge branch 'develop-v3.0.0' of http://39.106.8.246:3003/FM-dev/fm-basics into develop-v3.0.0

lixing преди 4 години
родител
ревизия
44aef660b2

+ 84 - 0
fm-translate/README.md

@@ -0,0 +1,84 @@
+fm-translate 翻译器组件
+============ 
+按配置规则,将对象中指定属性的值翻译为显示名称,并在对象上扩展属性并赋值为显示名称。
+
+说明
+---------------
+1. 可以通过@Transes和@Trans注解定义翻译元数据,注解在Controller、interface、impl、dao方法上,对方法结果进行翻译。
+2. 可以通过new TransMeta()定义翻译元数据,调用TranslatorHelper.translate(),在代码中进行翻译。
+3. TransMeta定义,根据type定义,支持两种翻译模式:
+* TransType.DB:数据库翻译,默认为此值。
+    - source:数据库表名、自定义翻译器名
+    - parameter:原始对象中的待翻译字段。
+    - result:查询结果字段名,查询多个结果以逗号分隔。默认值为name
+    - condition:查询条件
+    - target:回写到原始对象中的字段,默认为待翻译字段+ShowName,回写多个结果以逗号分隔。对象中无对应属性时会动态生成。
+* TransType.SERVICE:自定义翻译器翻译。
+    - parameter:原始对象中的待翻译字段。
+    - source:自定义翻译器名
+    - target:回写到原始对象中的字段,默认为待翻译字段+ShowName,回写多个结果以逗号分隔。对象中无对应属性时会动态生成。
+    - isBatch:是否批量处理,默认值为false
+    
+代码示例
+---------------
+1. 数据库翻译模式使用示例:
+   ```
+   @Trans(source = "person", parameter = "managers")
+   public CommonResult<ResponseDepartmentItemVO> queryDepartmentDetail(
+           @Valid @RequestBody QueryDepartmentDetailDTO queryDepartmentDetailDTO) {
+       Department department = departmentService.queryDepartmentDetail(queryDepartmentDetailDTO.getId());
+       ResponseDepartmentItemVO responseDepartmentItemVO = ConvertDepartmentTool.INSTANCE.convert2ResponseItemDTO(department);
+       return ResultHelper.single(responseDepartmentItemVO);
+   }
+   ```
+2. 自定义翻译模式使用示例:
+   * 翻译器代码
+    ```
+    @Slf4j
+    @Service
+    public class PersonNameTranslator implements ITranslator {
+    
+        @Autowired
+        private IPersonService personService;
+    
+        @Override
+        public String trans(String parameter) {
+            Person person = personService.queryPersonDetail(Long.valueOf(parameter));
+            return person.getName();
+        }
+    
+        @Override
+        public Map<String, Object> transBatch(List<String> parameter) {
+            Map<String, Object> resultMap = new HashMap<>(16);
+            return resultMap;
+        }
+    }
+    ```
+
+   * Controller代码
+   ```
+   @Trans(type = TransType.SERVICE, batch = true, source = "personNameTranslator", parameter = "managers", target = "managerShowName")
+   public CommonResult<ResponseDepartmentItemVO> queryDepartmentDetail(
+           @Valid @RequestBody QueryDepartmentDetailDTO queryDepartmentDetailDTO) {
+       Department department = departmentService.queryDepartmentDetail(queryDepartmentDetailDTO.getId());
+       ResponseDepartmentItemVO responseDepartmentItemVO = ConvertDepartmentTool.INSTANCE.convert2ResponseItemDTO(department);
+       return ResultHelper.single(responseDepartmentItemVO);
+   }
+   ```
+3. 多个翻译器同时使用使用示例:
+   ```
+   @Transes({
+        @Trans(type = TransType.SERVICE, batch = true, source = "personNameTranslator", parameter = "managers", target = "managerShowName"),
+        @Trans(source = "t_project", parameter = "projectIds", target = "projectsShowName")})
+   public CommonResult<ResponseDepartmentItemVO> queryDepartmentDetail(
+           @Valid @RequestBody QueryDepartmentDetailDTO queryDepartmentDetailDTO) {
+       Department department = departmentService.queryDepartmentDetail(queryDepartmentDetailDTO.getId());
+       ResponseDepartmentItemVO responseDepartmentItemVO = ConvertDepartmentTool.INSTANCE.convert2ResponseItemDTO(department);
+       return ResultHelper.single(responseDepartmentItemVO);
+   }
+   ```
+
+
+最新变化
+---------------
+

+ 7 - 3
fm-translate/src/main/java/com/persagy/fm/translate/impl/ServiceTranslateHandleImpl.java

@@ -1,5 +1,6 @@
 package com.persagy.fm.translate.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.persagy.common.exception.BusinessException;
 import com.persagy.fm.common.helper.SpringHelper;
 import com.persagy.fm.translate.model.ITransWrapper;
@@ -11,6 +12,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -63,9 +65,11 @@ public class ServiceTranslateHandleImpl implements ITranslateBatchHandle {
 			}
 			targetFields = meta.getTarget().split(",");
 		}
-		String parameter = String.valueOf(data.getValue(
-				meta.getParameter()));
-		String rsStr = translator.trans(parameter);
+		Object parameter = data.getValue(meta.getParameter());
+		if(parameter instanceof Collection) {
+			parameter = CollUtil.join(((Collection)parameter), ",");
+		}
+		String rsStr = translator.trans(parameter.toString());
 		String[] rs = null;
 		if(StringUtils.isNotEmpty(rsStr)){
 			rs = rsStr.split(",",targetFields.length);

+ 54 - 39
fm-translate/src/main/java/com/persagy/fm/translate/impl/TranslateServiceImpl.java

@@ -1,6 +1,9 @@
 package com.persagy.fm.translate.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.persagy.fm.common.helper.SpringHelper;
+import com.persagy.fm.common.response.CommonResult;
+import com.persagy.fm.common.response.PageList;
 import com.persagy.fm.translate.extension.ITransWrapperBuilder;
 import com.persagy.fm.translate.helper.TranslatorHelper;
 import com.persagy.fm.translate.model.ITransWrapper;
@@ -8,7 +11,6 @@ import com.persagy.fm.translate.model.TransMeta;
 import com.persagy.fm.translate.service.ITranslateBatchHandle;
 import com.persagy.fm.translate.service.ITranslateHandle;
 import com.persagy.fm.translate.service.ITranslateService;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -16,10 +18,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -34,39 +33,19 @@ public class TranslateServiceImpl implements ITranslateService {
 
     @SuppressWarnings("unchecked")
     @Override
-    public Object translate(Object origions, List<TransMeta> metas) {
-        if (origions == null || metas == null || metas.size() == 0) {
-            return origions;
+    public Object translate(Object origins, List<TransMeta> metas) {
+        if (origins == null || metas == null || metas.size() == 0) {
+            return origins;
         }
-        Object orignObj = origions;
-        List<Object> objs = null;
-        boolean islist = false;
-        //对分页和列表进行处理获取单个对象,并设置是否为列表标志
-        if (origions instanceof Page) {
-            try {
-                Field field = PageImpl.class.getSuperclass().getDeclaredField("content");
-                field.setAccessible(true);
-                objs = (List<Object>) field.get(origions);
-            } catch (NoSuchFieldException | IllegalAccessException e) {
-                objs = null;
-            }
-            if (CollectionUtils.isEmpty(objs)) {
-                return origions;
-            }
-            orignObj = objs.get(0);
-            islist = true;
-        } else if (origions instanceof List) {
-            objs = (List<Object>) origions;
-            if (objs.size() == 0) {
-                return origions;
-            }
-            orignObj = objs.get(0);
-            islist = true;
+        Object originObj = fetchTransObj(origins);
+        if(originObj == null) {
+            return origins;
         }
         //按翻译元数据生成翻译处理器
         List<ITranslateHandle> handles = new ArrayList<>();
         HashSet<String> properties = new HashSet<>();
-        ITransWrapperBuilder builder = TranslatorHelper.createTransWrapperBuilder(orignObj.getClass());
+        Class clazz = (originObj instanceof List) ? ((List<Object>) originObj).get(0).getClass() : originObj.getClass();
+        ITransWrapperBuilder builder = TranslatorHelper.createTransWrapperBuilder(clazz);
         for (TransMeta meta : metas) {
             ITranslateHandle handle = createHandle(meta);
             handles.add(handle);
@@ -89,14 +68,45 @@ public class TranslateServiceImpl implements ITranslateService {
             }
         }
         builder.setExtendProps(properties);
-        if (islist) {
-
-            transMultiRows(objs, handles, builder);
-            return origions;
+        if (originObj instanceof List) {
+            transMultiRows((List<Object>) originObj, handles, builder);
+            return origins;
         } else {
             //单条数据翻译
-            return transSingleRow(orignObj, handles, builder);
+            originObj = transSingleRow(originObj, handles, builder);
+            if(origins instanceof CommonResult) {
+                ((CommonResult) origins).setContent(originObj);
+            }
+            return origins;
+        }
+    }
+
+    /**
+     * 转换为实际待翻译对象
+     * @param origins 原结果
+     * @return
+     */
+    private Object fetchTransObj(Object origins){
+        Object obj = null;
+        //对分页和列表进行处理获取单个对象,并设置是否为列表标志
+        if (origins instanceof Page) {
+            try {
+                Field field = PageImpl.class.getSuperclass().getDeclaredField("content");
+                field.setAccessible(true);
+                obj = (List<Object>) field.get(origins);
+            } catch (NoSuchFieldException | IllegalAccessException e) {
+                obj = null;
+            }
+        } else if (origins instanceof CommonResult) {
+            obj = ((CommonResult) origins).getContent();
+            if(obj instanceof PageList) {
+                obj = ((PageList) obj).getRecords();
+            }
+        }
+        if(obj == null) {
+            return null;
         }
+        return obj;
     }
 
     /**
@@ -155,6 +165,9 @@ public class TranslateServiceImpl implements ITranslateService {
                 if (parameter == null) {
                     continue;
                 }
+                if(parameter instanceof Collection) {
+                    parameter = CollUtil.join(((Collection)parameter), ",");
+                }
                 parameters.add(parameter.toString());
             }
         } else {
@@ -164,6 +177,9 @@ public class TranslateServiceImpl implements ITranslateService {
                 if (parameter == null) {
                     continue;
                 }
+                if(parameter instanceof Collection) {
+                    parameter = CollUtil.join(((Collection)parameter), ",");
+                }
                 parameters.add(parameter.toString());
             }
         }
@@ -238,7 +254,6 @@ public class TranslateServiceImpl implements ITranslateService {
 
     /**
      * 根据元数据生成处理器
-     *
      * @param meta 元数据
      * @return 处理器
      */

+ 1 - 1
fm-translate/src/main/java/com/persagy/fm/translate/model/TransMeta.java

@@ -301,7 +301,7 @@ public class TransMeta {
 
 	public String getTarget() {
 		if (StringUtils.isEmpty(target)) {
-			return parameter+"_showname";
+			return parameter+"ShowName";
 		}
 		return target;
 	}