#
vincentlu
昨天 5c7e7501878caca3e4b4e7316681ade4de415fb1
#
1个文件已删除
2个文件已添加
6个文件已修改
188 ■■■■ 已修改文件
zy-acs-framework/src/main/java/com/zy/acs/framework/annotations/IntegrationAuth.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/annotation/IntegrationAuth.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/IntegrationRecordAdvice.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/WebMvcConfig.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/domain/TaskDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationOpenApiInterceptor.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-framework/src/main/java/com/zy/acs/framework/annotations/IntegrationAuth.java
File was deleted
zy-acs-manager/src/main/java/com/zy/acs/manager/common/annotation/IntegrationAuth.java
New file
@@ -0,0 +1,23 @@
package com.zy.acs.manager.common.annotation;
import com.zy.acs.manager.core.domain.type.NamespaceType;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IntegrationAuth {
    Enable value() default Enable.LOG;
    NamespaceType name() default NamespaceType.NONE;
    public enum Enable{
        LOG,
        SKIP_LOG
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/IntegrationRecordAdvice.java
@@ -1,9 +1,7 @@
package com.zy.acs.manager.common.config;
import com.alibaba.fastjson.JSON;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.R;
import com.zy.acs.manager.common.utils.IpTools;
import com.zy.acs.manager.manager.service.IntegrationRecordService;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
@@ -23,7 +21,7 @@
import java.nio.charset.StandardCharsets;
@Slf4j
//@ControllerAdvice
@ControllerAdvice
public class IntegrationRecordAdvice implements ResponseBodyAdvice<Object> {
    @Autowired
zy-acs-manager/src/main/java/com/zy/acs/manager/common/config/WebMvcConfig.java
@@ -1,6 +1,7 @@
package com.zy.acs.manager.common.config;
import com.zy.acs.manager.common.constant.Constants;
import com.zy.acs.manager.common.interceptor.IntegrationOpenApiInterceptor;
import com.zy.acs.manager.common.utils.Http;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -9,6 +10,7 @@
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -21,8 +23,13 @@
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Resource
    private IntegrationOpenApiInterceptor integrationOpenApiInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(integrationOpenApiInterceptor)
                .addPathPatterns("/api/open/**");
        registry.addInterceptor(getAsyncHandlerInterceptor())
                .addPathPatterns("/**")
        ;
zy-acs-manager/src/main/java/com/zy/acs/manager/common/domain/TaskDto.java
@@ -18,6 +18,6 @@
    private String destSta;
    private Integer priority = 1;
    private Integer priority;
}
zy-acs-manager/src/main/java/com/zy/acs/manager/common/interceptor/IntegrationOpenApiInterceptor.java
New file
@@ -0,0 +1,125 @@
package com.zy.acs.manager.common.interceptor;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.common.annotation.IntegrationAuth;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.util.ContentCachingRequestWrapper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
 * Intercepts open API calls so they can be audited via IntegrationRecordAdvice.
 */
@Slf4j
@Component
public class IntegrationOpenApiInterceptor implements HandlerInterceptor {
    private static final String ATTR_APP_AUTH = "appAuth";
    private static final String ATTR_AUTH_MEMO = "integrationAuthMemo";
    private static final String ATTR_CACHE = "cache";
    private static final String ATTR_START_AT = "openApiStartTime";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        IntegrationAuth integrationAuth = findIntegrationAuth(handlerMethod);
        if (integrationAuth == null) {
            log.debug("Skip open-api logging for {} because @IntegrationAuth is missing", handlerMethod.getMethod());
            return true;
        }
        request.setAttribute(ATTR_APP_AUTH, integrationAuth.value());
        if (!Cools.isEmpty(integrationAuth.memo())) {
            request.setAttribute(ATTR_AUTH_MEMO, integrationAuth.memo());
        }
        request.setAttribute(ATTR_START_AT, System.currentTimeMillis());
        request.setAttribute(ATTR_CACHE, buildRequestCache(request));
        return true;
    }
    private IntegrationAuth findIntegrationAuth(HandlerMethod handlerMethod) {
        IntegrationAuth annotation = AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getMethod(), IntegrationAuth.class);
        if (annotation != null) {
            return annotation;
        }
        return AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getBeanType(), IntegrationAuth.class);
    }
    private Map<String, Object> buildRequestCache(HttpServletRequest request) {
        Map<String, Object> cache = new LinkedHashMap<>();
        cache.put("method", request.getMethod());
        cache.put("uri", request.getRequestURI());
        cache.put("query", request.getQueryString());
        cache.put("parameters", flattenParameters(request.getParameterMap()));
        cache.put("headers", extractHeaders(request));
        String body = readBody(request);
        if (!Cools.isEmpty(body)) {
            cache.put("body", body);
        }
        return cache;
    }
    private Map<String, Object> flattenParameters(Map<String, String[]> rawParams) {
        Map<String, Object> flattened = new LinkedHashMap<>();
        if (rawParams == null) {
            return flattened;
        }
        rawParams.forEach((key, values) -> {
            if (values == null) {
                flattened.put(key, null);
            } else if (values.length == 1) {
                flattened.put(key, values[0]);
            } else {
                flattened.put(key, Arrays.asList(values));
            }
        });
        return flattened;
    }
    private Map<String, Object> extractHeaders(HttpServletRequest request) {
        Map<String, Object> headers = new LinkedHashMap<>();
        List<String> names = Collections.list(request.getHeaderNames());
        for (String name : names) {
            headers.put(name, request.getHeader(name));
        }
        return headers;
    }
    private String readBody(HttpServletRequest request) {
        if (request instanceof ContentCachingRequestWrapper) {
            ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;
            byte[] buffer = wrapper.getContentAsByteArray();
            if (buffer.length > 0) {
                Charset charset = charset(wrapper.getCharacterEncoding());
                return new String(buffer, charset);
            }
        }
        return null;
    }
    private Charset charset(String encoding) {
        if (Cools.isEmpty(encoding)) {
            return StandardCharsets.UTF_8;
        }
        try {
            return Charset.forName(encoding);
        } catch (Exception e) {
            return StandardCharsets.UTF_8;
        }
    }
}
zy-acs-manager/src/main/java/com/zy/acs/manager/core/domain/type/NamespaceType.java
@@ -2,6 +2,7 @@
public enum NamespaceType {
    NONE("未知"),
    RCS_TASK_REPORT("任务完成上报"),
    ;
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
@@ -2,9 +2,11 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.R;
import com.zy.acs.manager.common.annotation.IntegrationAuth;
import com.zy.acs.manager.common.annotation.OperationLog;
import com.zy.acs.manager.common.constant.Constants;
import com.zy.acs.manager.common.domain.TaskBoolDto;
import com.zy.acs.manager.core.domain.type.NamespaceType;
import com.zy.acs.manager.core.integrate.dto.OpenBusCancelParam;
import com.zy.acs.manager.core.integrate.dto.OpenBusCancelResult;
import com.zy.acs.manager.core.integrate.dto.OpenBusSubmitParam;
@@ -43,6 +45,7 @@
    @PostMapping("/bus/submit")
    @OperationLog("generate task from open api")
    @IntegrationAuth(name = NamespaceType.RCS_TASK_REPORT)
    public R submit(@RequestBody OpenBusSubmitParam param, HttpServletRequest request) {
        IntegrationRecord integrationRecord = new IntegrationRecord(
                null,    // 编号
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ValidService.java
@@ -21,6 +21,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/**
 * Created by vincent on 2023/6/14
@@ -48,6 +49,7 @@
            if (Cools.isEmpty(taskDto.getTaskNo())) {
                throw new BusinessException("Task seqNum can't be empty!");
            }
            taskDto.setPriority(Optional.ofNullable(taskDto.getPriority()).orElse(1));
            Task task = new Task();
            taskList.add(task);
            task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));