Sfoglia il codice sorgente

feat: 请求日志入库

weijianghai 11 mesi fa
parent
commit
efd899d3b3

+ 15 - 0
src/main/java/com/nokia/financeapi/config/ApiDocConfig.java

@@ -2,6 +2,8 @@ package com.nokia.financeapi.config;
 
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.parameters.Parameter;
+import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -15,4 +17,17 @@ public class ApiDocConfig {
     public OpenAPI openapi() {
         return new OpenAPI().info(new Info().title("财务接口").description("财务接口文档").version("1.0"));
     }
+
+    @Bean
+    public OpenApiCustomiser openApiCustomiser() {
+        return openApi -> openApi.getPaths().values().forEach(pathItem -> pathItem.readOperations().forEach(operation -> {
+            Parameter headerParam = new Parameter()
+                    .required(true)
+                    .in("header")
+                    .name("token")
+                    .description("访问令牌")
+                    .example("zoQtYlmhk/add/mBUBZD5mFJB1IXEwaLRS97Uf9z9Hlqdh/UHio66b35GOo/eEziALCI90sLNBn3WM7k1/FVGgGiDUO84mJ2JUgw5zHx8fvcO/OxqUB83JYaeV6eJIWkvJpp");
+            operation.addParametersItem(headerParam);
+        }));
+    }
 }

+ 2 - 1
src/main/java/com/nokia/financeapi/config/web/MyDispatcherServlet.java

@@ -15,7 +15,8 @@ public class MyDispatcherServlet extends DispatcherServlet {
      * 上传和返回文件流的接口uri,不替换request和response
      */
     public static final Set<String> UN_WRAPPER = Stream.of(
-            "/house-car/house/report/api/importData"
+            "/house-car/house/report/api/importData",
+            "/house-car/car/data-import/api/dataImport"
     ).collect(Collectors.toSet());
 
     @Override

+ 7 - 1
src/main/java/com/nokia/financeapi/config/web/MyWebMvcConfigurer.java

@@ -1,5 +1,6 @@
 package com.nokia.financeapi.config.web;
 
+import com.nokia.financeapi.service.common.RequestLogService;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
 import org.springframework.context.annotation.Bean;
@@ -10,11 +11,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
 public class MyWebMvcConfigurer implements WebMvcConfigurer {
+    private final RequestLogService requestLogService;
+
+    public MyWebMvcConfigurer(RequestLogService requestLogService) {
+        this.requestLogService = requestLogService;
+    }
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
         // 添加请求日志拦截
-        registry.addInterceptor(new RequestLogHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/webjars/**", "/doc**", "/v3/**");
+        registry.addInterceptor(new RequestLogHandlerInterceptor(requestLogService)).addPathPatterns("/**").excludePathPatterns("/webjars/**", "/doc**", "/v3/**");
         // 添加token拦截
 //        registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/house-car/**");
     }

+ 38 - 9
src/main/java/com/nokia/financeapi/config/web/RequestLogHandlerInterceptor.java

@@ -4,6 +4,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.nokia.financeapi.common.R;
+import com.nokia.financeapi.pojo.po.common.RequestLogPo;
+import com.nokia.financeapi.service.common.RequestLogService;
 import com.nokia.financeapi.utils.AESUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
@@ -20,6 +22,7 @@ import java.net.URLDecoder;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -34,6 +37,11 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
      * 计时器线程变量
      */
     private static final ThreadLocal<StopWatch> STOP_WATCH_THREAD_LOCAL = new ThreadLocal<>();
+    private RequestLogService requestLogService;
+
+    public RequestLogHandlerInterceptor(RequestLogService requestLogService) {
+        this.requestLogService = requestLogService;
+    }
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@@ -69,7 +77,6 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             body = StreamUtils.copyToString(request.getInputStream(), Charset.forName(request.getCharacterEncoding()));
             log.info("请求体参数: {}", StringUtils.trimAllWhitespace(body));
         }
-        // todo: 记录日志
         String token = request.getHeader("token");
         log.info("token: {}", token);
         if (!StringUtils.hasText(token)) {
@@ -86,10 +93,20 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             if (!"FINANCE".equals(map.get("APP_ID")) || !StringUtils.hasText(map.get("LOGIN_ID"))) {
                 return forbidden(response);
             }
-            map.put("api", request.getRequestURI());
-            map.put("body", body);
-            map.put("time", now.toString());
-            log.info("调用记录: {}", gson.toJson(map));
+            Map<String, String> requestParameters = new HashMap<>();
+            requestParameters.put("request_parameters", gson.toJson(parameters));
+            requestParameters.put("request_body", body);
+            RequestLogPo requestLogPo = new RequestLogPo();
+            requestLogPo.setRequestTime(now);
+            requestLogPo.setLoginId(map.get("LOGIN_ID"));
+            requestLogPo.setPageUrl(map.get("REQUEST_URL"));
+            requestLogPo.setApi(request.getRequestURI());
+            requestLogPo.setRequestParameters(gson.toJson(requestParameters));
+            requestLogPo.setHeaders(gson.toJson(headers));
+            requestLogPo.setAppId(map.get("APP_ID"));
+            setTimeStamp(map, requestLogPo);
+            requestLogPo.setToken(urlDecodeToken);
+            requestLogService.offer(requestLogPo);
         } catch (Exception e) {
             log.warn("token解密失败: {}", token);
             return forbidden(response);
@@ -97,16 +114,28 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
         return true;
     }
 
+    private void setTimeStamp(Map<String, String> map, RequestLogPo requestLogPo) {
+        String timeStamp = map.get("TIME_STAMP");
+        if (StringUtils.hasText(timeStamp)) {
+            try {
+                requestLogPo.setTimeStamp(LocalDateTime.parse(map.get("TIME_STAMP"),
+                        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            } catch (Exception e) {
+                log.warn("时间戳解析失败: {}", timeStamp);
+            }
+        }
+    }
+
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                 @Nullable Exception ex) throws Exception {
         if (!MyDispatcherServlet.UN_WRAPPER.contains(request.getRequestURI())) {
             MyHttpServletResponseWrapper wrapper = (MyHttpServletResponseWrapper) response;
             String responseString = new String(wrapper.toByteArray());
-            log.info("响应 {}: {}", wrapper.getStatus(), responseString);
-            // 返回结果打印前1000个字符
-//            log.info("返回 {}: {}", wrapper.getStatus(),
-//                    org.apache.commons.lang3.StringUtils.substring(responseString, 0, 1000));
+//            log.info("响应 {}: {}", wrapper.getStatus(), responseString);
+            // 返回结果打印前500个字符
+            log.info("返回 {}: {}", wrapper.getStatus(),
+                    org.apache.commons.lang3.StringUtils.substring(responseString, 0, 500));
         } else {
             log.info("响应 {}", response.getStatus());
         }

+ 1 - 1
src/main/java/com/nokia/financeapi/dao/house/CarReportDao.java → src/main/java/com/nokia/financeapi/dao/car/CarReportDao.java

@@ -1,4 +1,4 @@
-package com.nokia.financeapi.dao.house;
+package com.nokia.financeapi.dao.car;
 
 import com.nokia.financeapi.pojo.dto.GetCarReportDto;
 import com.nokia.financeapi.pojo.po.car.CarReportsPo;

+ 1 - 1
src/main/java/com/nokia/financeapi/dao/car/CarResourceMapMapper.java → src/main/java/com/nokia/financeapi/dao/car/CarResourceMapDao.java

@@ -17,7 +17,7 @@ import org.apache.ibatis.annotations.Select;
 import java.util.List;
 
 @Mapper
-public interface CarResourceMapMapper {
+public interface CarResourceMapDao {
     /**
      * 获取公告
      */

+ 46 - 0
src/main/java/com/nokia/financeapi/dao/common/RequestLogDao.java

@@ -0,0 +1,46 @@
+package com.nokia.financeapi.dao.common;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.nokia.financeapi.pojo.po.common.RequestLogPo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+@Mapper
+public interface RequestLogDao extends BaseMapper<RequestLogPo> {
+    /**
+     * 批量插入
+     */
+    @Update("""
+<script>
+insert into common.request_log
+(
+request_time,
+login_id,
+page_url,
+api,
+request_parameters,
+headers,
+app_id,
+time_stamp,
+token
+)
+values
+<foreach collection="list" item="item" index="index" separator=",">
+(
+#{item.requestTime},
+#{item.loginId},
+#{item.pageUrl},
+#{item.api},
+#{item.requestParameters},
+#{item.headers},
+#{item.appId},
+#{item.timeStamp},
+#{item.token}
+)
+</foreach>
+</script>
+""")
+    int insertBatch(List<RequestLogPo> list);
+}

+ 1 - 1
src/main/java/com/nokia/financeapi/dao/house/HouseDataCheckMapper.java → src/main/java/com/nokia/financeapi/dao/house/HouseDataCheckDao.java

@@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Select;
 import java.util.List;
 
 @Mapper
-public interface HouseDataCheckMapper {
+public interface HouseDataCheckDao {
     /**
      * 全省建筑面积变化
      */

+ 57 - 0
src/main/java/com/nokia/financeapi/pojo/po/common/RequestLogPo.java

@@ -0,0 +1,57 @@
+package com.nokia.financeapi.pojo.po.common;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@NoArgsConstructor
+@Data
+@TableName("common.request_log")
+public class RequestLogPo {
+    /**
+     * 请求时间
+     */
+    private LocalDateTime requestTime;
+
+    /**
+     * 账号,从token解密
+     */
+    private String loginId;
+
+    /**
+     * 页面url,从token解密
+     */
+    private String pageUrl;
+
+    /**
+     * 接口url
+     */
+    private String api;
+
+    /**
+     * 请求参数
+     */
+    private String requestParameters;
+
+    /**
+     * 请求头
+     */
+    private String headers;
+
+    /**
+     * 应用id,从token解密
+     */
+    private String appId;
+
+    /**
+     * 时间戳,从token解密
+     */
+    private LocalDateTime timeStamp;
+
+    /**
+     * 访问令牌
+     */
+    private String token;
+}

+ 3 - 2
src/main/java/com/nokia/financeapi/service/car/CarReportService.java

@@ -1,7 +1,7 @@
 package com.nokia.financeapi.service.car;
 
 import com.nokia.financeapi.common.R;
-import com.nokia.financeapi.dao.house.CarReportDao;
+import com.nokia.financeapi.dao.car.CarReportDao;
 import com.nokia.financeapi.pojo.dto.GetCarReportDto;
 import com.nokia.financeapi.pojo.po.car.CarReportsPo;
 import com.nokia.financeapi.pojo.vo.GetCarReportVo;
@@ -32,7 +32,8 @@ public class CarReportService {
     private R<GetCarReportVo> getReport(GetCarReportDto dto) {
         GetCarReportVo vo = new GetCarReportVo();
         vo.setUrl("");
-        String object = null;
+        String object ="word".equals(dto.getFileType()) ? "oss/reports/car/default.doc"
+                : "oss/reports/car/default.pdf";
         if (dto.getEndDate() == null) {
             CarReportsPo po = carReportDao.getLatest(dto);
             if (po != null) {

+ 12 - 12
src/main/java/com/nokia/financeapi/service/car/CarResourceMapService.java

@@ -1,7 +1,7 @@
 package com.nokia.financeapi.service.car;
 
 import com.nokia.financeapi.common.R;
-import com.nokia.financeapi.dao.car.CarResourceMapMapper;
+import com.nokia.financeapi.dao.car.CarResourceMapDao;
 import com.nokia.financeapi.pojo.dto.GetCarCostStatDto;
 import com.nokia.financeapi.pojo.dto.GetCarMapStatDto;
 import com.nokia.financeapi.pojo.dto.GetCarNoticeDto;
@@ -19,49 +19,49 @@ import java.util.List;
 
 @Service
 public class CarResourceMapService {
-    private final CarResourceMapMapper carResourceMapMapper;
+    private final CarResourceMapDao carResourceMapDao;
 
-    public CarResourceMapService(CarResourceMapMapper carResourceMapMapper) {
-        this.carResourceMapMapper = carResourceMapMapper;
+    public CarResourceMapService(CarResourceMapDao carResourceMapDao) {
+        this.carResourceMapDao = carResourceMapDao;
     }
 
     public R<List<GetCarNoticeVo>> getNotice(GetCarNoticeDto dto) {
         if (!StringUtils.hasText(dto.getCity())) {
             dto.setCity("全省");
         }
-        List<GetCarNoticeVo> vo = carResourceMapMapper.getNotice(dto);
+        List<GetCarNoticeVo> vo = carResourceMapDao.getNotice(dto);
         return R.ok(vo);
     }
 
     public R<GetCarTypeStatVo> getCarTypeStat(GetCarTypeStatDto dto) {
-        GetCarTypeStatVo vo = carResourceMapMapper.getCarTypeStat(dto);
+        GetCarTypeStatVo vo = carResourceMapDao.getCarTypeStat(dto);
         return R.ok(vo);
     }
 
     public R<List<GetCarMapStatVo>> getCarMapStat(GetCarMapStatDto dto) {
         if (StringUtils.hasText(dto.getCity())) {
-            List<GetCarMapStatVo> vo = carResourceMapMapper.getDistrictCarMapStat(dto);
+            List<GetCarMapStatVo> vo = carResourceMapDao.getDistrictCarMapStat(dto);
             return R.ok(vo);
         }
-        List<GetCarMapStatVo> vo = carResourceMapMapper.getCityCarMapStat();
+        List<GetCarMapStatVo> vo = carResourceMapDao.getCityCarMapStat();
         return R.ok(vo);
     }
 
     public R<List<GetDriveStatVo>> getDriveStat(GetDriveStatDto dto) {
         if (StringUtils.hasText(dto.getCity())) {
-            List<GetDriveStatVo> vo = carResourceMapMapper.getDistrictDriveStat(dto);
+            List<GetDriveStatVo> vo = carResourceMapDao.getDistrictDriveStat(dto);
             return R.ok(vo);
         }
-        List<GetDriveStatVo> vo = carResourceMapMapper.getCityDriveStat();
+        List<GetDriveStatVo> vo = carResourceMapDao.getCityDriveStat();
         return R.ok(vo);
     }
 
     public R<List<GetCarCostStatVo>> getCarCostStat(GetCarCostStatDto dto) {
         if (StringUtils.hasText(dto.getCity())) {
-            List<GetCarCostStatVo> vo = carResourceMapMapper.getDistrictCostStat(dto);
+            List<GetCarCostStatVo> vo = carResourceMapDao.getDistrictCostStat(dto);
             return R.ok(vo);
         }
-        List<GetCarCostStatVo> vo = carResourceMapMapper.getCityCostStat();
+        List<GetCarCostStatVo> vo = carResourceMapDao.getCityCostStat();
         return R.ok(vo);
     }
 }

+ 41 - 0
src/main/java/com/nokia/financeapi/service/common/RequestLogService.java

@@ -0,0 +1,41 @@
+package com.nokia.financeapi.service.common;
+
+import com.nokia.financeapi.dao.common.RequestLogDao;
+import com.nokia.financeapi.pojo.po.common.RequestLogPo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+@Slf4j
+@Service
+public class RequestLogService {
+    public static final ConcurrentLinkedQueue<RequestLogPo> QUEUE = new ConcurrentLinkedQueue<>();
+    private final RequestLogDao requestLogDao;
+
+    public RequestLogService(RequestLogDao requestLogDao) {
+        this.requestLogDao = requestLogDao;
+    }
+
+    public void offer(RequestLogPo requestLog) {
+        QUEUE.offer(requestLog);
+    }
+
+    @PostConstruct
+    public void consumer() {
+        CompletableFuture.runAsync(() -> {
+            while (true) {
+                try {
+                    RequestLogPo requestLogPo = QUEUE.poll();
+                    if (requestLogPo != null) {
+                        requestLogDao.insert(requestLogPo);
+                    }
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+            }
+        });
+    }
+}

+ 14 - 11
src/main/java/com/nokia/financeapi/service/house/HouseDataCheckService.java

@@ -1,7 +1,7 @@
 package com.nokia.financeapi.service.house;
 
 import com.nokia.financeapi.common.R;
-import com.nokia.financeapi.dao.house.HouseDataCheckMapper;
+import com.nokia.financeapi.dao.house.HouseDataCheckDao;
 import com.nokia.financeapi.pojo.dto.GetBuildingAreaDiffDto;
 import com.nokia.financeapi.pojo.dto.GetHouseAbnormalDataDto;
 import com.nokia.financeapi.pojo.vo.GetBuildingAreaDiffVo;
@@ -13,17 +13,17 @@ import java.util.List;
 
 @Service
 public class HouseDataCheckService {
-    private final HouseDataCheckMapper houseDataCheckMapper;
+    private final HouseDataCheckDao houseDataCheckDao;
 
-    public HouseDataCheckService(HouseDataCheckMapper houseDataCheckMapper) {
-        this.houseDataCheckMapper = houseDataCheckMapper;
+    public HouseDataCheckService(HouseDataCheckDao houseDataCheckDao) {
+        this.houseDataCheckDao = houseDataCheckDao;
     }
 
     public R<GetBuildingAreaDiffVo> getBuildingAreaDiff(GetBuildingAreaDiffDto dto) {
-        GetBuildingAreaDiffVo vo = houseDataCheckMapper.getFirstUnitBuildingAreaDiff();
-        List<GetBuildingAreaDiffVo> l2 = houseDataCheckMapper.getSecondUnitBuildingAreaDiff();
+        GetBuildingAreaDiffVo vo = houseDataCheckDao.getFirstUnitBuildingAreaDiff();
+        List<GetBuildingAreaDiffVo> l2 = houseDataCheckDao.getSecondUnitBuildingAreaDiff();
         vo.setChildren(l2);
-        List<GetBuildingAreaDiffVo> l3 = houseDataCheckMapper.getThirdUnitBuildingAreaDiff();
+        List<GetBuildingAreaDiffVo> l3 = houseDataCheckDao.getThirdUnitBuildingAreaDiff();
         for (GetBuildingAreaDiffVo second : l2) {
             List<GetBuildingAreaDiffVo> l33 = new ArrayList<>();
             second.setChildren(l33);
@@ -40,16 +40,19 @@ public class HouseDataCheckService {
         Integer endDate = dto.getEndDate();
         // 账期为空则取最新的账期
         if (dto.getEndDate() == null) {
-            endDate = houseDataCheckMapper.getAbnormalDataMaxDate();
+            endDate = houseDataCheckDao.getAbnormalDataMaxDate();
         }
         if (endDate == null) {
             return R.ok();
         }
         dto.setEndDate(endDate);
-        GetHouseAbnormalDataVo vo = houseDataCheckMapper.getFirstUnitAbnormalData(dto);
-        List<GetHouseAbnormalDataVo> l2 = houseDataCheckMapper.getSecondUnitAbnormalData(dto);
+        GetHouseAbnormalDataVo vo = houseDataCheckDao.getFirstUnitAbnormalData(dto);
+        if (vo == null || vo.getWeiGuanLianJuZhiSum() == null || vo.getXianZhiJianZhuMianJiSum() == null) {
+            return R.ok();
+        }
+        List<GetHouseAbnormalDataVo> l2 = houseDataCheckDao.getSecondUnitAbnormalData(dto);
         vo.setChildren(l2);
-        List<GetHouseAbnormalDataVo> l3 = houseDataCheckMapper.getThirdUnitAbnormalData(dto);
+        List<GetHouseAbnormalDataVo> l3 = houseDataCheckDao.getThirdUnitAbnormalData(dto);
         for (GetHouseAbnormalDataVo second : l2) {
             List<GetHouseAbnormalDataVo> l33 = new ArrayList<>();
             second.setChildren(l33);

+ 1 - 1
src/main/resources/application-test.yml

@@ -3,9 +3,9 @@ server:
 spring:
   datasource:
     driver-class-name: org.postgresql.Driver
-    password: NFQCgBA6YhNvgAqG6THw
     url: jdbc:postgresql://192.168.50.3:15432/finance
     username: postgres
+    password: NFQCgBA6YhNvgAqG6THw
 logging:
   level:
     com: