Parcourir la source

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

 Conflicts:
	fm-common/src/main/java/com/persagy/fm/common/utils/DmpUpsertResultUtil.java
lijie il y a 4 ans
Parent
commit
4855a33a01
26 fichiers modifiés avec 707 ajouts et 292 suppressions
  1. 6 0
      fm-common/pom.xml
  2. 59 0
      fm-common/src/main/java/com/persagy/fm/common/config/FeignExceptionHandler.java
  3. 20 13
      fm-common/src/main/java/com/persagy/fm/common/config/RequiredParamsHandler.java
  4. 18 0
      fm-common/src/main/java/com/persagy/fm/common/constant/PageQueryConstants.java
  5. 15 0
      fm-common/src/main/java/com/persagy/fm/common/constant/RequiredParamsConstants.java
  6. 69 60
      fm-common/src/main/java/com/persagy/fm/common/context/AppContext.java
  7. 25 22
      fm-common/src/main/java/com/persagy/fm/common/context/DefaultAppContext.java
  8. 35 24
      fm-common/src/main/java/com/persagy/fm/common/exception/FmExceptionHandler.java
  9. 0 23
      fm-common/src/main/java/com/persagy/fm/common/model/RequiredParams.java
  10. 0 47
      fm-common/src/main/java/com/persagy/fm/common/model/RequiredParamsStorage.java
  11. 53 0
      fm-common/src/main/java/com/persagy/fm/common/response/CommonResult.java
  12. 5 0
      fm-common/src/main/java/com/persagy/fm/common/response/FmResponseContent.java
  13. 5 0
      fm-common/src/main/java/com/persagy/fm/common/response/FmResponseItem.java
  14. 3 3
      fm-common/src/main/java/com/persagy/fm/common/response/FmResponseMsg.java
  15. 0 54
      fm-common/src/main/java/com/persagy/fm/common/response/FmResponseUtil.java
  16. 22 0
      fm-common/src/main/java/com/persagy/fm/common/response/PageList.java
  17. 5 3
      fm-common/src/main/java/com/persagy/fm/common/utils/DmpUpsertResultUtil.java
  18. 87 0
      fm-common/src/main/java/com/persagy/fm/common/utils/ResultHelper.java
  19. 127 0
      fm-common/src/main/java/com/persagy/fm/common/utils/SecureAES.java
  20. 5 0
      fm-parent/pom.xml
  21. 1 0
      fm-server/src/main/java/com/persagy/ServerApplication.java
  22. 84 0
      fm-translate/README.md
  23. 7 3
      fm-translate/src/main/java/com/persagy/fm/translate/impl/ServiceTranslateHandleImpl.java
  24. 54 39
      fm-translate/src/main/java/com/persagy/fm/translate/impl/TranslateServiceImpl.java
  25. 1 1
      fm-translate/src/main/java/com/persagy/fm/translate/model/TransMeta.java
  26. 1 0
      pom.xml

+ 6 - 0
fm-common/pom.xml

@@ -18,6 +18,12 @@
             <artifactId>integrated-common-core</artifactId>
         </dependency>
 
+        <!-- 集成框架安全校验类 -->
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>integrated-common-security</artifactId>
+        </dependency>
+
         <!-- web -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 59 - 0
fm-common/src/main/java/com/persagy/fm/common/config/FeignExceptionHandler.java

@@ -0,0 +1,59 @@
+package com.persagy.fm.common.config;
+
+import com.persagy.common.enums.ResponseCode;
+import com.persagy.fm.common.exception.RpcException;
+import com.persagy.fm.common.response.FmResponseContent;
+import com.persagy.fm.common.response.FmResponseItem;
+import com.persagy.fm.common.response.FmResponseMsg;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * feign调用接口,如果接口返回了报错信息,将报错信息抛出
+ *
+ * @author lixing
+ * @version V1.0 2021/3/24 4:55 下午
+ **/
+@Aspect
+@Component
+public class FeignExceptionHandler {
+
+    @Pointcut("@within(org.springframework.cloud.openfeign.FeignClient)")
+    private void pointCutMethod() {
+    }
+
+    @AfterReturning(pointcut = "pointCutMethod()", returning = "res")
+    public void process(Object res) {
+        String respCode = null;
+        String resultMsg = null;
+        if (res instanceof FmResponseMsg) {
+            FmResponseMsg response = (FmResponseMsg) res;
+            respCode = response.getRespCode();
+            resultMsg = response.getRespMsg();
+        }
+
+        if (res instanceof FmResponseContent) {
+            FmResponseContent response = (FmResponseContent) res;
+            respCode = response.getRespCode();
+            resultMsg = response.getRespMsg();
+        }
+
+        if (res instanceof FmResponseItem) {
+            FmResponseItem response = (FmResponseItem) res;
+            respCode = response.getRespCode();
+            resultMsg = response.getRespMsg();
+        }
+
+        if (!ResponseCode.A00000.getCode().equals(respCode)) {
+            throw new RpcException(resultMsg);
+        }
+    }
+
+    @Before("pointCutMethod()")
+    public void test() {
+        System.out.println("test test test");
+    }
+}

+ 20 - 13
fm-common/src/main/java/com/persagy/fm/common/config/RequiredParamsHandler.java

@@ -1,7 +1,10 @@
 package com.persagy.fm.common.config;
 
-import com.persagy.fm.common.model.RequiredParams;
-import com.persagy.fm.common.model.RequiredParamsStorage;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.fm.common.constant.RequiredParamsConstants;
+import com.persagy.fm.common.context.DefaultAppContext;
+import com.persagy.fm.common.context.DefaultAppContextFactory;
+import com.persagy.fm.common.utils.SecureAES;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@@ -28,18 +31,22 @@ public class RequiredParamsHandler extends HandlerInterceptorAdapter {
         ) {
             return true;
         }
-        // 必填项校验
-        checkeRequiredParams(request);
 
-        RequiredParams data = new RequiredParams(
-                request.getParameter("groupCode"),
-                request.getParameter("schemaId"),
-                request.getParameter("projectId"),
-                request.getParameter("appId"),
-                request.getParameter("userId")
+        // 从token中解析数据
+        SecureAES aes = new SecureAES("63499E35378AE1B0733E3FED7F780B68", "C0E7BD39B52A15C7");
+        String tokenStr = request.getHeader("token");
+        JSONObject tokenObj = aes.decrypt(tokenStr);
+
+        DefaultAppContext.getContext().setAccountId(
+                tokenObj.getString(RequiredParamsConstants.ACCOUNT_ID)
+        );
+        DefaultAppContext.getContext().setGroupCode(
+                tokenObj.getString(RequiredParamsConstants.GROUP_CODE)
+        );
+        DefaultAppContext.getContext().setAppId(
+                tokenObj.getString(RequiredParamsConstants.APP_ID)
         );
 
-        RequiredParamsStorage.set(data);
         return true;
     }
 
@@ -64,11 +71,11 @@ public class RequiredParamsHandler extends HandlerInterceptorAdapter {
 
     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
-        RequiredParamsStorage.clear();
+        DefaultAppContext.getFactory().unloadContext();
     }
 
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
-        RequiredParamsStorage.clear();
+        DefaultAppContext.getFactory().unloadContext();
     }
 }

+ 18 - 0
fm-common/src/main/java/com/persagy/fm/common/constant/PageQueryConstants.java

@@ -0,0 +1,18 @@
+package com.persagy.fm.common.constant;
+
+/**
+ * 分页查询常量
+ *
+ * @author lixing
+ * @version V1.0 2021/3/24 3:05 下午
+ **/
+public class PageQueryConstants {
+    /**
+     * 默认查询第一页
+     */
+    public static final int DEFAULT_PAGE = 1;
+    /**
+     * 默认查询10条
+     */
+    public static final int DEFAULT_SIZE = 10;
+}

+ 15 - 0
fm-common/src/main/java/com/persagy/fm/common/constant/RequiredParamsConstants.java

@@ -0,0 +1,15 @@
+package com.persagy.fm.common.constant;
+
+/**
+ * 必填参数常量类
+ *
+ * @author lixing
+ * @version V1.0 2021/3/25 5:50 下午
+ **/
+public class RequiredParamsConstants {
+    public static final String GROUP_CODE = "groupCode";
+    public static final String APP_ID = "appId";
+    public static final String ACCOUNT_ID = "accountId";
+    public static final String PROJECT_ID = "projectId";
+
+}

+ 69 - 60
fm-common/src/main/java/com/persagy/fm/common/context/AppContext.java

@@ -45,64 +45,73 @@ public abstract class AppContext implements Serializable {
         return factory;
     }
 
-    /**
-     * 取得操作用户主键
-     * @return 用户主键
-     */
-    public abstract String getUserId();
-
-    /**
-     * 设置操作用户主键
-     * @param userId 用户主键
-     */
-    public abstract void setUserId(String userId);
-
-    /**
-     * 取得操作用户名
-     * @return 用户名
-     */
-    public abstract String getUserName();
-
-    /**
-     * 设置操作用户名
-     * @param userName 用户名
-     */
-    public abstract void setUserName(String userName);
-
-    /**
-     * 取得租户
-     * @return 租户
-     */
-    public abstract String getTenant();
-
-    /**
-     * 设置租户
-     * @param tenant 租户
-     */
-    public abstract void setTenant(String tenant);
-
-    /**
-     * 取得产品线
-     * @return 产品线
-     */
-    public abstract String getProductLine();
-
-    /**
-     * 设置产品线
-     * @param productLine 产品线
-     */
-    public abstract void setProductLine(String productLine);
-
-    /**
-     * 动态数据源支持
-     * @return java.lang.String
-     **/
-    public abstract String getDataSourceName();
-
-    /**
-     * 设置动态数据源
-     * @param dataSourceName 动态数据源
-     * @return void
-     **/
-    public abstract void setDataSourceName(String dataSourceName);
+//    /**
+//     * 取得操作用户主键
+//     * @return 用户主键
+//     */
+//    public abstract String getUserId();
+//
+//    /**
+//     * 设置操作用户主键
+//     * @param userId 用户主键
+//     */
+//    public abstract void setUserId(String userId);
+//
+//    /**
+//     * 取得操作用户名
+//     * @return 用户名
+//     */
+//    public abstract String getUserName();
+//
+//    /**
+//     * 设置操作用户名
+//     * @param userName 用户名
+//     */
+//    public abstract void setUserName(String userName);
+//
+//    /**
+//     * 取得租户
+//     * @return 租户
+//     */
+//    public abstract String getTenant();
+//
+//    /**
+//     * 设置租户
+//     * @param tenant 租户
+//     */
+//    public abstract void setTenant(String tenant);
+//
+//    /**
+//     * 取得产品线
+//     * @return 产品线
+//     */
+//    public abstract String getProductLine();
+//
+//    /**
+//     * 设置产品线
+//     * @param productLine 产品线
+//     */
+//    public abstract void setProductLine(String productLine);
+//
+//    /**
+//     * 动态数据源支持
+//     * @return java.lang.String
+//     **/
+//    public abstract String getDataSourceName();
+//
+//    /**
+//     * 设置动态数据源
+//     * @param dataSourceName 动态数据源
+//     * @return void
+//     **/
+//    public abstract void setDataSourceName(String dataSourceName);
+
+    public abstract void setAccountId(String accountId);
+    public abstract void setProjectId(String projectId);
+    public abstract void setGroupCode(String groupCode);
+    public abstract void setAppId(String appId);
+    public abstract String getAccountId();
+    public abstract String getProjectId();
+    public abstract String getGroupCode();
+    public abstract String getAppId();
 }

+ 25 - 22
fm-common/src/main/java/com/persagy/fm/common/context/DefaultAppContext.java

@@ -13,26 +13,29 @@ public class DefaultAppContext extends AppContext {
     /**
      * 用户主键
      */
-    private String userId;
-
-    /**
-     * 用户名
-     */
-    private String userName;
-
-    /**
-     * 租户
-     */
-    private String tenant;
-
-    /**
-     * 所属产品线
-     */
-    private String productLine;
-
-    /**
-     * 数据源名称
-     */
-    private String dataSourceName;
-
+    private String accountId;
+
+//    /**
+//     * 用户名
+//     */
+//    private String userName;
+//
+//    /**
+//     * 租户
+//     */
+//    private String tenant;
+//
+//    /**
+//     * 所属产品线
+//     */
+//    private String productLine;
+//
+//    /**
+//     * 数据源名称
+//     */
+//    private String dataSourceName;
+
+    private String projectId;
+    private String appId;
+    private String groupCode;
 }

+ 35 - 24
fm-common/src/main/java/com/persagy/fm/common/exception/FmExceptionHandler.java

@@ -2,8 +2,10 @@ package com.persagy.fm.common.exception;
 
 import com.persagy.common.enums.ResponseCode;
 import com.persagy.common.exception.BusinessException;
-import com.persagy.fm.common.response.FmResponseUtil;
-import com.persagy.fm.common.response.FmResponseMsg;
+import com.persagy.fm.common.response.CommonResult;
+import com.persagy.fm.common.utils.ResultHelper;
+import com.persagy.security.exception.AESDecryptException;
+import com.persagy.security.exception.AESEncryptException;
 import feign.FeignException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpStatus;
@@ -31,9 +33,18 @@ public class FmExceptionHandler {
      * feign调用异常
      */
     @ExceptionHandler({RpcException.class})
-    public FmResponseMsg handleRpcException(RpcException e) {
+    public CommonResult handleRpcException(RpcException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.C0110.getCode(), e.getMessage());
+        return ResultHelper.failure(ResponseCode.C0110.getCode(), e.getMessage());
+    }
+
+    /**
+     * token解析失败
+     */
+    @ExceptionHandler({AESDecryptException.class})
+    public CommonResult handleRpcException(AESDecryptException e) {
+        log.error(e.getMessage(), e);
+        return ResultHelper.failure(ResponseCode.A0220.getCode(), e.getMessage());
     }
 
 
@@ -41,54 +52,54 @@ public class FmExceptionHandler {
      * 空指针异常
      */
     @ExceptionHandler(NullPointerException.class)
-    public FmResponseMsg handleBusinessRuntimeException(NullPointerException e) {
+    public CommonResult handleBusinessRuntimeException(NullPointerException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.B0001.getCode(), e.getMessage());
+        return ResultHelper.failure(ResponseCode.B0001.getCode(), e.getMessage());
     }
 
     /**
      * 自定义业务异常
      */
     @ExceptionHandler(BusinessException.class)
-    public FmResponseMsg handleBusinessRuntimeException(BusinessException e) {
+    public CommonResult handleBusinessRuntimeException(BusinessException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(e.getErrorCode(), e.getErrorDesc());
+        return ResultHelper.failure(e.getErrorCode(), e.getErrorDesc());
     }
 
     /**
      * 入参校验异常
      */
     @ExceptionHandler(MethodArgumentNotValidException.class)
-    public FmResponseMsg handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+    public CommonResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0400.getCode(), e.getBindingResult().getFieldError().getDefaultMessage());
+        return ResultHelper.failure(ResponseCode.A0400.getCode(), e.getBindingResult().getFieldError().getDefaultMessage());
     }
 
     /**
      * 入参校验异常
      */
     @ExceptionHandler(BindException.class)
-    public FmResponseMsg handleBindException(BindException e) {
+    public CommonResult handleBindException(BindException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0400.getCode(), e.getBindingResult().getFieldError().getDefaultMessage());
+        return ResultHelper.failure(ResponseCode.A0400.getCode(), e.getBindingResult().getFieldError().getDefaultMessage());
     }
 
     /**
      * 参数校验异常,message 为手动抛出时定义的具体异常信息
      */
     @ExceptionHandler(ValidationException.class)
-    public FmResponseMsg handleValidationException(ValidationException e) {
+    public CommonResult handleValidationException(ValidationException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0400.getCode(), e.getCause().getMessage());
+        return ResultHelper.failure(ResponseCode.A0400.getCode(), e.getCause().getMessage());
     }
 
     /**
      * 参数校验异常,message 为手动抛出时定义的具体异常信息
      */
     @ExceptionHandler(IllegalArgumentException.class)
-    public FmResponseMsg handleIllegalArgumentException(IllegalArgumentException e) {
+    public CommonResult handleIllegalArgumentException(IllegalArgumentException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0400.getCode(), e.getMessage());
+        return ResultHelper.failure(ResponseCode.A0400.getCode(), e.getMessage());
     }
 
     /**
@@ -96,9 +107,9 @@ public class FmExceptionHandler {
      */
     @ResponseStatus(HttpStatus.NOT_FOUND)
     @ExceptionHandler(NoHandlerFoundException.class)
-    public FmResponseMsg handleNoHandlerFoundException(NoHandlerFoundException e) {
+    public CommonResult handleNoHandlerFoundException(NoHandlerFoundException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0422.getCode(), e.getMessage());
+        return ResultHelper.failure(ResponseCode.A0422.getCode(), e.getMessage());
     }
 
     /**
@@ -106,9 +117,9 @@ public class FmExceptionHandler {
      */
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ExceptionHandler(FeignException.class)
-    public FmResponseMsg handleFeignException(FeignException e) {
+    public CommonResult handleFeignException(FeignException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.C0110.getCode(), e.getMessage());
+        return ResultHelper.failure(ResponseCode.C0110.getCode(), e.getMessage());
     }
 
     /**
@@ -116,9 +127,9 @@ public class FmExceptionHandler {
      */
     @ResponseStatus(HttpStatus.BAD_REQUEST)
     @ExceptionHandler(HttpMessageNotReadableException.class)
-    public FmResponseMsg handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
+    public CommonResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
+        return ResultHelper.failure(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
     }
 
     /**
@@ -126,8 +137,8 @@ public class FmExceptionHandler {
      */
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ExceptionHandler(Exception.class)
-    public FmResponseMsg handleException(Exception e) {
+    public CommonResult handleException(Exception e) {
         log.error(e.getMessage(), e);
-        return FmResponseUtil.errorMsg(ResponseCode.Z9999.getCode(), ResponseCode.Z9999.getDesc());
+        return ResultHelper.failure(ResponseCode.Z9999.getCode(), ResponseCode.Z9999.getDesc());
     }
 }

+ 0 - 23
fm-common/src/main/java/com/persagy/fm/common/model/RequiredParams.java

@@ -1,23 +0,0 @@
-package com.persagy.fm.common.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @description:
- * @author: lixing
- * @company: Persagy Technology Co.,Ltd
- * @since: 2021/3/8 9:57 上午
- * @version: V1.0
- **/
-@Setter
-@Getter
-@AllArgsConstructor
-public class RequiredParams {
-    private String groupCode;
-    private String schemaId;
-    private String projectId;
-    private String appId;
-    private String userId;
-}

+ 0 - 47
fm-common/src/main/java/com/persagy/fm/common/model/RequiredParamsStorage.java

@@ -1,47 +0,0 @@
-package com.persagy.fm.common.model;
-
-/**
- * @description:
- * @author: lixing
- * @company: Persagy Technology Co.,Ltd
- * @since: 2021/3/8 10:21 上午
- * @version: V1.0
- **/
-public class RequiredParamsStorage {
-    /**
-     * 线程内部存储类
-     */
-    private static final ThreadLocal<RequiredParams> STORAGE = new ThreadLocal();
-
-    public static void set(RequiredParams data) {
-        STORAGE.set(data);
-    }
-
-    public static RequiredParams get() {
-        return STORAGE.get();
-    }
-
-    public static void clear() {
-        STORAGE.remove();
-    }
-
-    public static String getGroupCode() {
-        return STORAGE.get().getGroupCode();
-    }
-
-    public static String getSchemaId() {
-        return STORAGE.get().getSchemaId();
-    }
-
-    public static String getProjectId() {
-        return STORAGE.get().getProjectId();
-    }
-
-    public static String getAppId() {
-        return STORAGE.get().getAppId();
-    }
-
-    public static String getUserId() {
-        return STORAGE.get().getUserId();
-    }
-}

+ 53 - 0
fm-common/src/main/java/com/persagy/fm/common/response/CommonResult.java

@@ -0,0 +1,53 @@
+package com.persagy.fm.common.response;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.persagy.common.enums.ResponseCode;
+import lombok.Data;
+
+/**
+ * 服务调用消息结果
+ * @author Charlie Yu
+ * @date 2021-03-25
+ */
+@Data
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class CommonResult<T> {
+
+    /** 不需要提示 */
+    public static final CommonResult SUCCESS = new CommonResult();
+
+    /** 响应码 */
+    private String respCode;
+    /** 响应码 */
+    private String respMsg;
+    /** 响应数据 */
+    private T content;
+
+    /**
+     * 构造方法
+     */
+    public CommonResult(){
+        this(ResponseCode.A00000.getCode(), ResponseCode.A00000.getDesc());
+    }
+
+    /**
+     * 构造方法
+     * @param respCode 响应码
+     * @param respMsg 提示信息
+     */
+    public CommonResult(String respCode, String respMsg) {
+        this(respCode, respMsg,null);
+    }
+
+    /**
+     * 构造方法
+     * @param respCode 响应码
+     * @param respMsg 提示信息
+     * @param content 数据
+     */
+    public CommonResult(String respCode, String respMsg, T content){
+        this.respCode = respCode;
+        this.respMsg = respMsg;
+        this.content = content;
+    }
+}

+ 5 - 0
fm-common/src/main/java/com/persagy/fm/common/response/FmResponseContent.java

@@ -35,6 +35,11 @@ public class FmResponseContent<T> {
     @JSONField(name = "Count")
     private Integer count;
 
+    /**
+     * 错误信息
+     */
+    private String respMsg;
+
     public FmResponseContent(String respCode, T content, Integer count) {
         this.respCode = respCode;
         this.content = content;

+ 5 - 0
fm-common/src/main/java/com/persagy/fm/common/response/FmResponseItem.java

@@ -28,6 +28,11 @@ public class FmResponseItem<T> {
     @JSONField(name = "Item")
     private T item;
 
+    /**
+     * 错误信息
+     */
+    private String respMsg;
+
     public FmResponseItem(String respCode, T item) {
         this.respCode = respCode;
         this.item = item;

+ 3 - 3
fm-common/src/main/java/com/persagy/fm/common/response/FmResponseMsg.java

@@ -23,10 +23,10 @@ public class FmResponseMsg {
     /**
      * 错误信息
      */
-    private String resultMsg;
+    private String respMsg;
 
-    public FmResponseMsg(String respCode, String resultMsg) {
+    public FmResponseMsg(String respCode, String respMsg) {
         this.respCode = respCode;
-        this.resultMsg = resultMsg;
+        this.respMsg = respMsg;
     }
 }

+ 0 - 54
fm-common/src/main/java/com/persagy/fm/common/response/FmResponseUtil.java

@@ -1,54 +0,0 @@
-package com.persagy.fm.common.response;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.persagy.common.enums.ResponseCode;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
-/**
- * @description: 服务接口调用返回值工具类
- * @author: lixing
- * @company: Persagy Technology Co.,Ltd
- * @since: 2020/9/21 11:01
- * @version: V1.0
- */
-public class FmResponseUtil {
-
-    public static <T extends List> FmResponseContent<T> successContent(T content) {
-        return successContent(content, content.size());
-    }
-
-    public static <T> FmResponseContent<List<T>> successContent(IPage<T> page) {
-        return successContent(page.getRecords(),Long.valueOf(page.getTotal()).intValue());
-    }
-
-    public static <T extends List> FmResponseContent<T> successContent(T content, Integer count) {
-        return new FmResponseContent<T>(ResponseCode.A00000.getCode(), content, count);
-    }
-
-    public static <T> FmResponseItem<T> successItem(T object) {
-        return new FmResponseItem<T>(ResponseCode.A00000.getCode(), object);
-    }
-
-    public static FmResponseMsg successMsg(String resultMsg) {
-        if (StringUtils.isBlank(resultMsg)) {
-            resultMsg = ResponseCode.A00000.getDesc();
-        }
-        return new FmResponseMsg(ResponseCode.A00000.getCode(), resultMsg);
-    }
-
-    public static FmResponseMsg errorMsg(String resultMsg) {
-        return errorMsg(null, resultMsg);
-    }
-
-    public static FmResponseMsg errorMsg(String respCode, String resultMsg) {
-        if (StringUtils.isBlank(respCode)) {
-            respCode = ResponseCode.A10000.getCode();
-        }
-        if (StringUtils.isBlank(resultMsg)) {
-            resultMsg = ResponseCode.A10000.getDesc();
-        }
-        return new FmResponseMsg(respCode, resultMsg);
-    }
-}

+ 22 - 0
fm-common/src/main/java/com/persagy/fm/common/response/PageList.java

@@ -0,0 +1,22 @@
+package com.persagy.fm.common.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 分页列表
+ * @author Charlie Yu
+ * @data 2021-03-25
+ */
+@Data
+public class PageList<T> {
+
+    private List<T> records;
+    private long total;
+
+    public PageList(final List<T> records, final long total) {
+        this.records = records;
+        this.total = total;
+    }
+}

+ 5 - 3
fm-common/src/main/java/com/persagy/fm/common/utils/DmpUpsertResultUtil.java

@@ -1,7 +1,9 @@
 package com.persagy.fm.common.utils;
 
-import com.alibaba.fastjson.JSON;
-import com.persagy.fm.common.response.*;
+import com.persagy.fm.common.response.FmDmpResponseUtil;
+import com.persagy.fm.common.response.FmResponseItem;
+import com.persagy.fm.common.response.FmResponseUtil;
+import com.persagy.fm.common.response.FmResponseUpsertVO;
 
 /**
  * @description:
@@ -26,7 +28,7 @@ public class DmpUpsertResultUtil {
     public static FmResponseItem<FmResponseUpsertVO> dealDmpUpsertResult(
             String dmpUpsertResult, Long id, String dmpInterfaceName) {
         // 处理数据中台返回结果
-        if (FmDmpResponseUtil.isSuccess(JSON.parseObject(dmpUpsertResult, DmpPageResponse.class))) {
+        if (FmDmpResponseUtil.isSuccess(dmpUpsertResult)) {
             FmResponseUpsertVO fmResponseUpsertVO = new FmResponseUpsertVO();
             fmResponseUpsertVO.setId(id);
             return FmResponseUtil.successItem(fmResponseUpsertVO);

+ 87 - 0
fm-common/src/main/java/com/persagy/fm/common/utils/ResultHelper.java

@@ -0,0 +1,87 @@
+package com.persagy.fm.common.utils;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.common.enums.ResponseCode;
+import com.persagy.fm.common.response.CommonResult;
+import com.persagy.fm.common.response.PageList;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 响应结果包装助手
+ * @author Charlie Yu
+ * @date 2021-03-25
+ */
+public class ResultHelper {
+
+    /**
+     * 成功消息
+     * @return
+     */
+    public static CommonResult success(){
+        return new CommonResult(ResponseCode.A00000.getCode(), ResponseCode.A00000.getDesc());
+    }
+
+    /**
+     * 成功消息
+     * @return
+     */
+    public static CommonResult success(String respMsg){
+        return new CommonResult(ResponseCode.A00000.getCode(), respMsg);
+    }
+
+    /**
+     * 失败消息
+     * @param respCode
+     * @param respMsg
+     * @return
+     */
+    public static CommonResult failure(String respCode, String respMsg) {
+        return new CommonResult(respCode, respMsg);
+    }
+
+    /**
+     * 单个数据
+     * @param content
+     * @param <T>
+     * @return
+     */
+    public static <T> CommonResult<T> single(T content) {
+        return new CommonResult(ResponseCode.A00000.getCode(), ResponseCode.A00000.getDesc(), content);
+    }
+
+    /**
+     * 多个数据 - 列表
+     * @param records
+     * @param <T>
+     * @return
+     */
+    public static <T> CommonResult<PageList<T>> multi(List<T> records) {
+        return multi(records, CollectionUtils.size(records));
+    }
+
+    /**
+     * 多个数据 - 分页
+     * @param page
+     * @param <T>
+     * @return
+     */
+    public static <T> CommonResult<PageList<T>> multi(IPage<T> page) {
+        List<T> records = page == null ? null : page.getRecords();
+        long total = page == null ? 0 : page.getTotal();
+        return multi(records, total);
+    }
+
+    /**
+     * 多个数据
+     * @param records
+     * @param total
+     * @param <T>
+     * @return
+     */
+    private static <T> CommonResult<PageList<T>> multi(List<T> records, long total) {
+        PageList<T> pageList = new PageList<>(records, total);
+        return new CommonResult(ResponseCode.A00000.getCode(), ResponseCode.A00000.getDesc(), pageList);
+    }
+}

+ 127 - 0
fm-common/src/main/java/com/persagy/fm/common/utils/SecureAES.java

@@ -0,0 +1,127 @@
+package com.persagy.fm.common.utils;
+
+import cn.hutool.crypto.Mode;
+import cn.hutool.crypto.Padding;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.symmetric.AES;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.common.utils.StringUtil;
+import com.persagy.fm.common.constant.RequiredParamsConstants;
+import com.persagy.security.exception.AESDecryptException;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 借助于hutool工具类实现 AES 128/256加密,全局编码UTF-8
+ * 
+ * @version 1.0.0
+ * @author zhangqiankun
+ * @date 2021-03-13 15:29:50
+ */
+public class SecureAES {
+	
+	public static void main(String[] args) {
+		SecureAES aes = new SecureAES("63499E35378AE1B0733E3FED7F780B68", "C0E7BD39B52A15C7");
+		String encryptAccount = aes.encrypt("TEST", "PC", "AC123456789");
+		System.out.println("account info encrypt: " + encryptAccount);
+		JSONObject decrypt = aes.decrypt(encryptAccount + ".FSD45SSD1B5D56GB5DFBD");
+		System.out.println("header token decrypt: " + decrypt.toJSONString());
+		JSONObject account = aes.decryptAccount(encryptAccount);
+		System.out.println("account info decrypt: " + account.toJSONString());
+	}
+	
+	private AES aes;
+	
+	public static final Charset CHARSET_UTF_8 = StandardCharsets.UTF_8;
+	
+	/**
+	 * 默认AES/ECB/PKCS5Padding
+	 * 
+	 * @param key 128或256位
+	 */
+	public SecureAES (String key) {
+		aes = SecureUtil.aes(key.getBytes(CHARSET_UTF_8));
+	}
+	
+	/**
+	 * 默认AES/CTS/PKCS5Padding
+	 * 
+	 * @param key 128或256位
+	 * @param iv 16字节
+	 */
+	public SecureAES (String key, String iv) {
+		aes = new AES(Mode.CTS, Padding.PKCS5Padding, key.getBytes(CHARSET_UTF_8), iv.getBytes(CHARSET_UTF_8));
+	}
+	
+	/**
+	 * 加密为16进制
+	 * 
+	 * @param content
+	 * @return
+	 */
+	public String encryptHex(String content) {
+		return aes.encryptHex(content, CHARSET_UTF_8);
+	}
+	
+	/**
+	 * 解密
+	 * 
+	 * @param content
+	 * @return
+	 */
+	public String decryptStr(String content) {
+		return aes.decryptStr(content, CHARSET_UTF_8);
+	}
+	
+	/**
+	 * 加密为16进制,参数组装为json格式数据
+	 * 
+	 * @param groupCode
+	 * @param appId
+	 * @param accountId
+	 * @return
+	 */
+	public String encrypt(String groupCode, String appId, String accountId) {
+		JSONObject object = new JSONObject();
+		object.put(RequiredParamsConstants.GROUP_CODE, groupCode);
+		object.put(RequiredParamsConstants.APP_ID, appId);
+		object.put(RequiredParamsConstants.ACCOUNT_ID, accountId);
+		return aes.encryptHex(object.toJSONString(), CHARSET_UTF_8);
+	}
+	
+	/**
+	 * 解密
+	 * 
+	 * @param headerToken token字符串
+	 * @return token内容,json格式
+	 */
+	public JSONObject decrypt(String headerToken) {
+		if (StringUtil.isBlank(headerToken)) {
+			throw new AESDecryptException("token is null");
+		}
+		String[] tokens = headerToken.split("\\.");
+		if (tokens.length != 2) {
+			throw new AESDecryptException("token invalid parameter");
+		}
+		// 加密的账号信息
+		String encryptAccount = tokens[0];
+		return this.decryptAccount(encryptAccount);
+	}
+	
+	/**
+	 * 解密
+	 * 
+	 * @param encryptAccount
+	 * @return token内容,json格式
+	 */
+	public JSONObject decryptAccount(String encryptAccount) {
+		String decryptStr = this.decryptStr(encryptAccount);
+		if (StringUtil.isBlank(decryptStr)) {
+			throw new AESDecryptException("AES decrypt failure");
+		}
+		JSONObject object = JSONObject.parseObject(decryptStr);
+		return object;
+	}
+	
+}

+ 5 - 0
fm-parent/pom.xml

@@ -57,6 +57,11 @@
             </dependency>
             <dependency>
                 <groupId>com.persagy</groupId>
+                <artifactId>integrated-common-security</artifactId>
+                <version>${platform.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.persagy</groupId>
                 <artifactId>integrated-log-spring-boot-starter</artifactId>
                 <version>${platform.version}</version>
             </dependency>

+ 1 - 0
fm-server/src/main/java/com/persagy/ServerApplication.java

@@ -24,6 +24,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableDiscoveryClient
 @Configuration
 @EnableScheduling
+@MapperScan(value = "com.persagy.fm.*.dao")
 @EnableSpringUtil
 @SpringBootApplication
 @MapperScan(value = "com.persagy.fm.*.dao")

+ 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;
 	}

+ 1 - 0
pom.xml

@@ -16,5 +16,6 @@
         <module>fm-parent</module>
         <module>fm-server</module>
         <module>fm-common</module>
+        <module>fm-translate</module>
     </modules>
 </project>