Browse Source

feat: 调整日志打印

weijianghai 3 tháng trước cách đây
mục cha
commit
16e0ad90b0

+ 0 - 6
pom.xml

@@ -66,12 +66,6 @@
             <artifactId>poi-ooxml</artifactId>
             <version>5.2.5</version>
         </dependency>
-        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>2.10.1</version>
-        </dependency>
         <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
         <dependency>
             <groupId>com.baomidou</groupId>

+ 0 - 19
src/main/java/com/nokia/finance/tasks/config/web/MyDispatcherServlet.java

@@ -1,19 +0,0 @@
-package com.nokia.finance.tasks.config.web;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.servlet.DispatcherServlet;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Slf4j
-public class MyDispatcherServlet extends DispatcherServlet {
-
-    @Override
-    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
-        String uri = request.getRequestURI();
-        // 替换request和response
-        log.info("替换 {} 的request和response", uri);
-        super.doDispatch(new MyHttpServletRequestWrapper(request), new MyHttpServletResponseWrapper(response));
-    }
-}

+ 0 - 58
src/main/java/com/nokia/finance/tasks/config/web/MyHttpServletRequestWrapper.java

@@ -1,58 +0,0 @@
-package com.nokia.finance.tasks.config.web;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.StreamUtils;
-
-import javax.servlet.ReadListener;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
-
-/**
- * 解决流只能读取一次问题
- */
-@Slf4j
-public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
-    private byte[] bytes;
-
-    public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
-        super(request);
-        bytes = StreamUtils.copyToByteArray(request.getInputStream());
-    }
-
-    @Override
-    public ServletInputStream getInputStream() {
-        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
-        return new ServletInputStream() {
-            @Override
-            public boolean isFinished() {
-                return false;
-            }
-
-            @Override
-            public boolean isReady() {
-                return false;
-            }
-
-            @Override
-            public void setReadListener(ReadListener readListener) {
-                //
-            }
-
-            @Override
-            public int read() {
-                return stream.read();
-            }
-        };
-    }
-
-    @Override
-    public BufferedReader getReader() throws UnsupportedEncodingException {
-        return new BufferedReader(new InputStreamReader(getInputStream(), super.getCharacterEncoding()));
-    }
-}

+ 0 - 47
src/main/java/com/nokia/finance/tasks/config/web/MyHttpServletResponseWrapper.java

@@ -1,47 +0,0 @@
-package com.nokia.finance.tasks.config.web;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.WriteListener;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-/**
- * 解决流只能读取一次问题
- */
-public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper {
-    private ByteArrayOutputStream byteArrayOutputStream;
-    private ServletOutputStream servletOutputStream;
-
-    public MyHttpServletResponseWrapper(HttpServletResponse response) {
-        super(response);
-        byteArrayOutputStream = new ByteArrayOutputStream();
-        servletOutputStream = new ServletOutputStream() {
-            @Override
-            public boolean isReady() {
-                return false;
-            }
-
-            @Override
-            public void setWriteListener(WriteListener writeListener) {
-                //
-            }
-
-            @Override
-            public void write(int b) throws IOException {
-                response.getOutputStream().write(b);
-                byteArrayOutputStream.write(b);
-            }
-        };
-    }
-
-    @Override
-    public ServletOutputStream getOutputStream() {
-        return servletOutputStream;
-    }
-
-    public byte[] toByteArray() {
-        return byteArrayOutputStream.toByteArray();
-    }
-}

+ 6 - 14
src/main/java/com/nokia/finance/tasks/config/web/MyWebMvcConfigurer.java

@@ -1,29 +1,21 @@
 package com.nokia.finance.tasks.config.web;
 
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
-import org.springframework.context.annotation.Bean;
+import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.DispatcherServlet;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
+@RequiredArgsConstructor
 public class MyWebMvcConfigurer implements WebMvcConfigurer {
+    private final RequestLogHandlerInterceptor requestLogHandlerInterceptor;
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         // 添加请求日志拦截
-        registry.addInterceptor(new RequestLogHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/webjars/**", "/doc**", "/v3/**");
-    }
-
-    /**
-     * 使用自定义DispatcherServlet
-     */
-    @Bean
-    @Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
-    public DispatcherServlet dispatcherServlet() {
-        return new MyDispatcherServlet();
+        registry.addInterceptor(requestLogHandlerInterceptor)
+                .addPathPatterns("/**")
+                .excludePathPatterns("/webjars/**", "/v3/**", "/doc.html", "/favicon.ico");
     }
 
 //    /**

+ 64 - 13
src/main/java/com/nokia/finance/tasks/config/web/RequestLogHandlerInterceptor.java

@@ -1,17 +1,26 @@
 package com.nokia.finance.tasks.config.web;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.HttpInputMessage;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
 import org.springframework.lang.Nullable;
 import org.springframework.util.StopWatch;
-import org.springframework.util.StreamUtils;
-import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.nio.charset.Charset;
+import java.io.IOException;
+import java.lang.reflect.Type;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -21,11 +30,14 @@ import java.util.UUID;
  * 请求日志拦截器
  */
 @Slf4j
-public class RequestLogHandlerInterceptor implements HandlerInterceptor {
+@ControllerAdvice
+@RequiredArgsConstructor
+public class RequestLogHandlerInterceptor implements HandlerInterceptor, RequestBodyAdvice, ResponseBodyAdvice<Object> {
     /**
      * 计时器线程变量
      */
     private static final ThreadLocal<StopWatch> STOP_WATCH_THREAD_LOCAL = new ThreadLocal<>();
+    private final ObjectMapper objectMapper;
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@@ -44,7 +56,7 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             String v = request.getHeader(k);
             headers.put(k, v);
         }
-        log.info("请求头参数: {}", new ObjectMapper().writeValueAsString(headers));
+        log.info("请求头参数: {}", objectMapper.writeValueAsString(headers));
         // 查询参数
         Map<String, String> parameters = new HashMap<>();
         Enumeration<String> parameterNames = request.getParameterNames();
@@ -53,10 +65,7 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             String v = request.getParameter(k);
             parameters.put(k, v);
         }
-        log.info("查询参数: {}", new ObjectMapper().writeValueAsString(parameters));
-        // 请求体参数
-        String body = StreamUtils.copyToString(request.getInputStream(), Charset.forName(request.getCharacterEncoding()));
-        log.info("请求体参数: {}", StringUtils.trimAllWhitespace(body));
+        log.info("查询参数: {}", objectMapper.writeValueAsString(parameters));
         String remoteAddr = request.getRemoteAddr();
         // 判断请求是否来自本地
         if (!"127.0.0.1".equals(remoteAddr)) {
@@ -69,12 +78,54 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                 @Nullable Exception ex) throws Exception {
-        MyHttpServletResponseWrapper wrapper = (MyHttpServletResponseWrapper) response;
-        String responseString = new String(wrapper.toByteArray());
-        log.info("响应 {}: {}", wrapper.getStatus(), responseString);
+        log.info("响应状态: {}", response.getStatus());
         StopWatch stopWatch = STOP_WATCH_THREAD_LOCAL.get();
         stopWatch.stop();
-        log.info("耗时 {} ms", stopWatch.getTotalTimeMillis());
+        log.info("耗时: {} ms", stopWatch.getTotalTimeMillis());
         STOP_WATCH_THREAD_LOCAL.remove();
     }
+
+    @Override
+    public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
+        return true;
+    }
+
+    @Override
+    public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
+        return inputMessage;
+    }
+
+    @Override
+    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
+        try {
+            if (STOP_WATCH_THREAD_LOCAL.get() != null) {
+                log.info("请求体参数: {}", objectMapper.writeValueAsString(body));
+            }
+        } catch (Exception e) {
+            log.error(e.toString(), e);
+        }
+        return body;
+    }
+
+    @Override
+    public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
+        return body;
+    }
+
+    @Override
+    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
+        return true;
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
+        try {
+            if (STOP_WATCH_THREAD_LOCAL.get() != null) {
+                log.info("响应内容: {}", org.apache.commons.lang3.StringUtils.substring(objectMapper.writeValueAsString(body), 0, 500));
+            }
+        } catch (Exception e) {
+            log.error(e.toString(), e);
+        }
+        return body;
+    }
 }

+ 6 - 3
src/main/java/com/nokia/finance/tasks/jobs/car/CarReportJob.java

@@ -93,6 +93,10 @@ public class CarReportJob {
     @Scheduled(cron = "0 30 0 13 * ?")
     @Transactional(timeout = 300, rollbackFor = Exception.class)
     public void runJob() {
+        runJob(LocalDate.now());
+    }
+
+    public void runJob(LocalDate localDateNow) {
         log.info("执行车辆报告定时任务");
         List<DataLogPo> dataLogPoList = new ArrayList<>();
         DataLogPo dataLogPo = new DataLogPo();
@@ -101,7 +105,7 @@ public class CarReportJob {
         dataLogPo.setOperationName("生成车辆报告");
         dataLogPoList.add(dataLogPo);
         try {
-            CarReportVo vo = getReportVo();
+            CarReportVo vo = getReportVo(localDateNow);
             // 生成docx
             generateDocx(vo, dataLogPo);
             // 生成pdf
@@ -120,8 +124,7 @@ public class CarReportJob {
         }
     }
 
-    public CarReportVo getReportVo() throws IOException {
-        LocalDate localDateNow = LocalDate.now();
+    public CarReportVo getReportVo(LocalDate localDateNow) throws IOException {
         LocalDate localDateEnd = localDateNow.minusMonths(1);
         LocalDate localDateStart = localDateEnd.withDayOfYear(1);
         LocalDate localDateLastYear = localDateEnd.minusYears(1);

+ 11 - 13
src/main/java/com/nokia/finance/tasks/jobs/gdc/car/CarPhpRequestLogJob.java

@@ -1,11 +1,12 @@
 package com.nokia.finance.tasks.jobs.gdc.car;
 
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.nokia.finance.tasks.dao.common.RequestLogDao;
 import com.nokia.finance.tasks.pojo.po.common.CarPhpRequestLogPo;
 import com.nokia.finance.tasks.pojo.po.common.RequestLogPo;
 import com.nokia.finance.tasks.utils.AESUtil;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -32,12 +33,10 @@ import java.util.concurrent.TimeUnit;
  */
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class CarPhpRequestLogJob {
     private final RequestLogDao requestLogDao;
-
-    public CarPhpRequestLogJob(RequestLogDao requestLogDao) {
-        this.requestLogDao = requestLogDao;
-    }
+    private final ObjectMapper objectMapper;
 
     /**
      * 执行任务
@@ -47,7 +46,6 @@ public class CarPhpRequestLogJob {
         log.info("执行车辆php页面请求日志入库定时任务");
         try {
             CompletableFuture.runAsync(() -> {
-                Gson gson = new Gson();
 //                LocalDateTime startLocalDateTime = LocalDateTime.of(2024, 3, 23, 0, 0);
 //                LocalDateTime endLocalDateTime = LocalDateTime.of(2024, 3, 25, 18, 0);
                 LocalDateTime now = LocalDateTime.now();
@@ -73,8 +71,8 @@ public class CarPhpRequestLogJob {
                         }
                         String urlDecodeToken = URLDecoder.decode(data, StandardCharsets.UTF_8);
                         String decryptToken = AESUtil.decrypt(urlDecodeToken);
-                        Map<String, String> tokenMap = gson.fromJson(decryptToken, new TypeToken<Map<String, String>>() {
-                        }.getType());
+                        Map<String, String> tokenMap = objectMapper.readValue(decryptToken,
+                                TypeFactory.defaultInstance().constructMapType(Map.class, String.class, String.class));
                         if (!"FINANCE".equals(tokenMap.get("APP_ID"))
                                 || !StringUtils.hasText(tokenMap.get("LOGIN_ID"))
                                 || !StringUtils.hasText(tokenMap.get("TIME_STAMP"))
@@ -90,14 +88,14 @@ public class CarPhpRequestLogJob {
                         String pageUrl = tokenMap.get("REQUEST_URL");
                         String api = StringUtils.hasText(singleValueMap.get("type")) ? pageUrl + "?type=" + singleValueMap.get("type") : pageUrl;
                         Map<String, String> requestParameters = new HashMap<>();
-                        requestParameters.put("request_parameters", gson.toJson(singleValueMap));
+                        requestParameters.put("request_parameters", objectMapper.writeValueAsString(singleValueMap));
                         String appId = tokenMap.get("APP_ID");
                         RequestLogPo requestLogPo = new RequestLogPo();
                         requestLogPo.setRequestTime(carPhpRequestLogPo.getRequestTime());
                         requestLogPo.setLoginId(loginId);
                         requestLogPo.setPageUrl(pageUrl);
                         requestLogPo.setApi(api);
-                        requestLogPo.setRequestParameters(gson.toJson(requestParameters));
+                        requestLogPo.setRequestParameters(objectMapper.writeValueAsString(requestParameters));
                         requestLogPo.setAppId(appId);
                         requestLogPo.setToken(urlDecodeToken);
                         requestLogPo.setTimeStamp(timeStamp);
@@ -105,7 +103,7 @@ public class CarPhpRequestLogJob {
                         requestLogPo.setExpireTimeStamp(expireTimeStamp);
                         list.add(requestLogPo);
                     } catch (Exception e) {
-                        log.error("请求日志解析失败: {} -> {}", carPhpRequestLogPo, e.toString(), e);
+                        log.error("请求日志解析失败: {} -> {}", carPhpRequestLogPo, e, e);
                     }
                 }
                 if (CollectionUtils.isEmpty(list)) {
@@ -114,7 +112,7 @@ public class CarPhpRequestLogJob {
                 requestLogDao.insertBatch(list);
             }).get(1, TimeUnit.MINUTES);
         } catch (InterruptedException e) {
-            log.error("线程中断: {}", e.toString(), e);
+            log.error("线程中断: {}", e, e);
             Thread.currentThread().interrupt();
         } catch (Exception e) {
             log.error(e.toString(), e);

+ 6 - 3
src/main/java/com/nokia/finance/tasks/jobs/house/HouseReportJob.java

@@ -80,6 +80,10 @@ public class HouseReportJob {
     @Scheduled(cron = "0 35 0 13 * ?")
     @Transactional(timeout = 300, rollbackFor = Exception.class)
     public void runJob() {
+        runJob(LocalDate.now());
+    }
+
+    public void runJob(LocalDate localDateNow) {
         log.info("执行不动产报告定时任务");
         List<DataLogPo> dataLogPoList = new ArrayList<>();
         DataLogPo dataLogPo = new DataLogPo();
@@ -88,7 +92,7 @@ public class HouseReportJob {
         dataLogPo.setOperationName("生成不动产报告");
         dataLogPoList.add(dataLogPo);
         try {
-            HouseReportVo vo = getReportVo();
+            HouseReportVo vo = getReportVo(localDateNow);
             // 生成docx
             generateDocx(vo, dataLogPo);
             // 生成pdf
@@ -107,8 +111,7 @@ public class HouseReportJob {
         }
     }
 
-    public HouseReportVo getReportVo() {
-        LocalDate localDateNow = LocalDate.now();
+    public HouseReportVo getReportVo(LocalDate localDateNow) {
         LocalDate localDateEnd = localDateNow.minusMonths(1);
         LocalDate localDateStart = localDateEnd.withDayOfYear(1);
         Integer endYearMonth = Integer.valueOf(localDateEnd.format(DateTimeFormatter.ofPattern("yyyyMM")));

+ 1 - 0
src/main/java/com/nokia/finance/tasks/pojo/dto/RunJobDto.java

@@ -9,4 +9,5 @@ import javax.validation.constraints.NotNull;
 public class RunJobDto {
     @NotNull
     private JobEnum jobName;
+    private Integer yearMonth;
 }

+ 10 - 2
src/main/java/com/nokia/finance/tasks/service/JobService.java

@@ -39,6 +39,10 @@ import com.nokia.finance.tasks.pojo.dto.RunJobDto;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 
 @Slf4j
 @RequiredArgsConstructor
@@ -79,7 +83,11 @@ public class JobService {
     private final HouseBuildingLandCountJob houseBuildingLandCountJob;
     private final HouseRentalIncomeJob houseRentalIncomeJob;
 
+    @Transactional(timeout = 300, rollbackFor = Exception.class)
     public R<Object> runJob(RunJobDto dto) {
+        Integer yearMonth = dto.getYearMonth();
+        LocalDate ld = yearMonth == null ? LocalDate.now()
+                : LocalDate.parse(yearMonth + "01", DateTimeFormatter.ofPattern("yyyyMMdd")).plusMonths(1);
         switch (dto.getJobName()) {
             case CAR_BASE_DATA_DAY_JOB -> carBaseDataDayJob.runJob();
             case CAR_YUE_JIE_JOB -> carYueJieJob.runJob();
@@ -101,8 +109,8 @@ public class JobService {
             case CAR_SI_CHE_GONG_YONG_JOB -> carSiCheGongYongJob.runJob();
             case CAR_FU_WU_FEI_JOB -> carFuWuFeiJob.runJob();
             case HOUSE_RENT_IN_REPAIR_MONTH_JOB -> houseRentInRepairMonthJob.runJob();
-            case CAR_REPORT_JOB -> carReportJob.runJob();
-            case HOUSE_REPORT_JOB -> houseReportJob.runJob();
+            case CAR_REPORT_JOB -> carReportJob.runJob(ld);
+            case HOUSE_REPORT_JOB -> houseReportJob.runJob(ld);
             case CAR_CXDP_JOB -> carCxdpJob.runJob();
             case CAR_HIGH_FUEL_CONSUMPTION_JOB -> carHighFuelConsumptionJob.runJob();
             case CAR_HIGH_REPAIR_JOB -> carHighRepairJob.runJob();

+ 17 - 5
src/main/java/com/nokia/finance/tasks/service/car/CarService.java

@@ -1,7 +1,9 @@
 package com.nokia.finance.tasks.service.car;
 
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.nokia.finance.tasks.common.exception.MyRuntimeException;
 import com.nokia.finance.tasks.pojo.po.common.AreaPo;
 import com.nokia.finance.tasks.pojo.po.common.OrganizationPo;
 import lombok.extern.slf4j.Slf4j;
@@ -36,7 +38,12 @@ public class CarService {
     /**
      * 一级单位的二级单位字典
      */
-    static final Map<String, List<String>> ER_JI_MAP = new Gson().fromJson("""
+    static final Map<String, List<String>> ER_JI_MAP;
+
+    static {
+        try {
+            ER_JI_MAP = new ObjectMapper().readValue(
+                    """
 {
     "石家庄": ["鹿泉", "藁城", "栾城", "井陉矿区", "井陉", "无极", "正定", "元氏", "新乐", "晋州", "平山", "灵寿", "赞皇", "赵县", "行唐", "高邑", "辛集", "深泽"],
     "唐山": ["唐山高开区", "迁西", "海港", "开平", "丰南", "滦县", "乐亭", "丰润", "玉田", "古冶", "曹妃甸", "遵化", "滦南", "迁安"],
@@ -51,8 +58,13 @@ public class CarService {
     "衡水": ["景县", "阜城", "枣强", "深州", "饶阳", "故城", "武强", "武邑", "冀州", "安平"],
     "雄安": ["容城", "雄县", "安新"]
 }
-                    """,
-            new TypeToken<Map<String, List<String>>>() {}.getType());
+                            """,
+                    TypeFactory.defaultInstance().constructMapType(Map.class, String.class, List.class)
+            );
+        } catch (JsonProcessingException e) {
+            throw new MyRuntimeException(e);
+        }
+    }
 
     /**
      * 匹配车牌

+ 29 - 3
src/main/java/com/nokia/finance/tasks/utils/AESUtil.java

@@ -1,7 +1,7 @@
 package com.nokia.finance.tasks.utils;
 
 import cn.hutool.core.codec.Base64;
-import com.google.gson.Gson;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 import javax.crypto.Cipher;
 import javax.crypto.spec.SecretKeySpec;
@@ -69,6 +69,28 @@ public class AESUtil {
         return decrypt(str, KEY);
     }
 
+    public static String getTestToken() {
+        // 参数
+        HashMap<String, String> map = new HashMap<>();
+        // 财务系统id, 固定值
+        map.put("APP_ID", "FINANCE");
+        // 时间戳
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        map.put("TIME_STAMP", sdf.format(new Date()));
+        // 当前登录账号
+        map.put("LOGIN_ID", "test");
+        //请求的地址
+        map.put("REQUEST_URL","");
+        map.put("EXPIRE_TIME","604800");
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 加密串
+        try {
+            return AESUtil.encrypt(objectMapper.writeValueAsString(map), KEY);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
     public static void main(String[] args) throws Exception {
 // 参数
         HashMap<String, String> map = new HashMap<>();
@@ -77,17 +99,21 @@ public class AESUtil {
         // 时间戳
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         map.put("TIME_STAMP", sdf.format(new Date()));
+//        map.put("TIME_STAMP", "2024-03-29 00:00:00");
         // 当前登录账号
         map.put("LOGIN_ID", "test");
         //请求的地址
         map.put("REQUEST_URL","");
+        map.put("EXPIRE_TIME","3600");
 
+        ObjectMapper objectMapper = new ObjectMapper();
         // 加密串
-        String encrypt = AESUtil.encrypt(new Gson().toJson(map), "2na$$PdV9AW8b#CS");
+        String encrypt = AESUtil.encrypt(objectMapper.writeValueAsString(map), "2na$$PdV9AW8b#CS");
         // 返回
         System.out.println(encrypt);
         //解密
         System.out.println(AESUtil.decrypt(encrypt,"2na$$PdV9AW8b#CS"));
-        System.out.println(AESUtil.decrypt("zoQtYlmhk/add/mBUBZD5mFJB1IXEwaLRS97Uf9z9Hlqdh8eF/add/c2gDUmD3pwGPfA8FQKBNTCB8LPlCPF/vHcU/2tL7Ps/add/6rn6w5rDS98R4GJueGgU01n12YZVS/FNx6pSI/add/BuEy1XyrSg8QBfx7igSozPxmdZ6a235/add/fqZPPSjoQReI","2na$$PdV9AW8b#CS"));
+        System.out.println(AESUtil.decrypt("zoQtYlmhk/add/mBUBZD5mFJB1IXEwaLRS97Uf9z9Hlqdh/UHio66b35GOo/eEziALCI/P8MJ/NfqMqiE5mpkHr0/add/309c0RoCYGzuwK1F7OYCOaxqUB83JYaeV6eJIWkvJpp","2na$$PdV9AW8b#CS"));
+        System.out.println(getTestToken());
     }
 }

+ 0 - 86
src/test/java/com/nokia/finance/tasks/requestlogs/JavaRequestLogTest.java

@@ -1,86 +0,0 @@
-package com.nokia.finance.tasks.requestlogs;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
-import org.apache.commons.csv.QuoteMode;
-import org.junit.jupiter.api.Test;
-
-import java.io.OutputStreamWriter;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-
-@Slf4j
-class JavaRequestLogTest {
-    @Test
-    void test() throws Exception {
-        Gson gson = new Gson();
-        Pattern pattern = Pattern.compile("调用记录: \\s*(.*)");
-        Files.createDirectories(Paths.get("test/output"));
-        try (Stream<String> stream = Files.lines(Paths.get("test/data/java-request-log.txt"));
-             OutputStreamWriter osw = new OutputStreamWriter(Files.newOutputStream(Paths.get("test/output/java-request-log.csv")),
-                     StandardCharsets.UTF_8);
-             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT.builder().setQuoteMode(QuoteMode.ALL).build())
-        ) {
-            // 添加bom头避免excel乱码
-            osw.write('\ufeff');
-            printer.printRecord("request_time", "login_id", "page_url", "api", "request_parameters", "headers", "app_id", "time_stamp", "token");
-            stream.forEachOrdered(line -> {
-                Matcher matcher = pattern.matcher(line);
-                if (matcher.find()) {
-                    String s = matcher.group(1);
-                    log.info(s);
-                    RequestLogBo bo = gson.fromJson(s, new TypeToken<>() {});
-                    Map<String, String> requestParameters = new HashMap<>();
-                    requestParameters.put("request_parameters", bo.getParameters());
-                    requestParameters.put("request_body", bo.getBody());
-                    try {
-                        printer.printRecord(
-                                LocalDateTime.parse(bo.getTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")),
-                                bo.getLOGIN_ID(),
-                                bo.getREQUEST_URL(),
-                                bo.getApi(),
-                                gson.toJson(requestParameters),
-                                bo.getHeaders(),
-                                bo.getAPP_ID(),
-                                bo.getTIME_STAMP(),
-                                bo.getToken()
-                        );
-                    } catch (Exception e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-            });
-        } catch (Exception e) {
-            log.error(e.toString(), e);
-        }
-    }
-
-    @NoArgsConstructor
-    @Data
-    public static class RequestLogBo {
-        private String APP_ID;
-        private String LOGIN_ID;
-        private String TIME_STAMP;
-        private String REQUEST_URL;
-        private String api;
-        private String body;
-        private String time;
-        private String headers;
-        private String parameters;
-        private String token;
-    }
-
-}

+ 0 - 97
src/test/java/com/nokia/finance/tasks/requestlogs/PhpRequestLogTest.java

@@ -1,97 +0,0 @@
-package com.nokia.finance.tasks.requestlogs;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.nokia.finance.tasks.utils.AESUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVPrinter;
-import org.apache.commons.csv.QuoteMode;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.util.MultiValueMap;
-import org.springframework.util.StringUtils;
-import org.springframework.web.util.UriComponents;
-import org.springframework.web.util.UriComponentsBuilder;
-
-import java.io.OutputStreamWriter;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Slf4j
-@SpringBootTest
-@ActiveProfiles("prod")
-class PhpRequestLogTest {
-    @Autowired
-    JdbcTemplate jdbcTemplate;
-
-    @Test
-    void test() throws Exception {
-        Gson gson = new Gson();
-        Files.createDirectories(Paths.get("test/output"));
-        String sql = """
-select to_char(to_timestamp(create_time), 'YYYY-MM-DD HH24:MI:SS') as request_time, query_string from car_theme.wz_adminlog order by create_time
-                """;
-        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
-        try (OutputStreamWriter osw = new OutputStreamWriter(
-                Files.newOutputStream(Paths.get("test/output/php-request-log.csv")), StandardCharsets.UTF_8);
-             CSVPrinter printer = new CSVPrinter(osw, CSVFormat.DEFAULT.builder().setQuoteMode(QuoteMode.ALL).build())
-        ) {
-            // 添加bom头避免excel乱码
-            osw.write('\ufeff');
-            printer.printRecord("request_time", "login_id", "page_url", "api", "request_parameters", "headers", "app_id", "time_stamp", "token");
-            for (Map<String, Object> t : list) {
-                String requestTime = (String) t.get("request_time");
-                String queryString = (String) t.get("query_string");
-                if (!StringUtils.hasText(requestTime) || !StringUtils.hasText(queryString)) {
-                    continue;
-                }
-                UriComponents uriComponents = UriComponentsBuilder.fromUriString("?" + queryString).build();
-                MultiValueMap<String, String> queryParams = uriComponents.getQueryParams();
-                Map<String, String> singleValueMap = queryParams.toSingleValueMap();
-                String data = singleValueMap.get("data");
-                if (!StringUtils.hasText(data)) {
-                    continue;
-                }
-                String urlDecodeToken = URLDecoder.decode(data, StandardCharsets.UTF_8);
-                String decodeToken;
-                try {
-                    decodeToken = AESUtil.decrypt(urlDecodeToken);
-                } catch (Exception e) {
-                    log.error("token解密失败: {} -> {} -> {}", urlDecodeToken, queryString, e.toString(), e);
-                    continue;
-                }
-                Map<String, String> tokenMap = gson.fromJson(decodeToken, new TypeToken<Map<String, String>>() {
-                }.getType());
-                String loginId = tokenMap.get("LOGIN_ID");
-                String pageUrl = tokenMap.get("REQUEST_URL");
-                String api = StringUtils.hasText(singleValueMap.get("type")) ? pageUrl + "?type=" + singleValueMap.get("type") : pageUrl;
-                Map<String, String> requestParameters = new HashMap<>();
-                requestParameters.put("request_parameters", gson.toJson(singleValueMap));
-                String appId = tokenMap.get("APP_ID");
-                String timeStamp = tokenMap.get("TIME_STAMP");
-                printer.printRecord(
-                        requestTime,
-                        loginId,
-                        pageUrl,
-                        api,
-                        gson.toJson(requestParameters),
-                        null,
-                        appId,
-                        timeStamp,
-                        urlDecodeToken
-                );
-            }
-        } catch (Exception e) {
-            log.error(e.toString(), e);
-        }
-    }
-}