From 8153741de83496e8a3dbf966d5c7d664aa0b00a7 Mon Sep 17 00:00:00 2001 From: liang <594755172@qq.com> Date: Tue, 27 May 2025 16:58:14 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev_wms_client/src/api/wmsLog.js | 14 +- dev_wms_client/src/layout/wmsLog.vue | 521 +++++++++++------- .../controller/wms/LogController.java | 43 ++ .../com/wms_main/dao/ITSysApiService.java | 18 + .../com/wms_main/dao/ITSysLogService.java | 10 + .../wms_main/dao/impl/TSysApiServiceImpl.java | 75 +++ .../wms_main/dao/impl/TSysLogServiceImpl.java | 14 + .../com/wms_main/filter/RequestLogFilter.java | 50 +- .../com/wms_main/mapper/SysApiMapper.java | 12 + .../com/wms_main/mapper/SysLogMapper.java | 12 + .../wms_main/model/dto/query/SysApiQuery.java | 22 + .../wms_main/model/dto/query/SysLogQuery.java | 22 + .../java/com/wms_main/model/po/TSysApi.java | 105 ++++ .../java/com/wms_main/model/po/TSysLog.java | 65 +++ .../com/wms_main/model/vo/wms/SysApiVo.java | 102 ++++ .../com/wms_main/model/vo/wms/SysLogVo.java | 62 +++ .../wms_main/repository/http/HttpClient.java | 39 +- .../repository/http/enums/HttpMethodEnum.java | 8 +- .../repository/utils/StringUtils.java | 23 + .../controller/ILogControllerService.java | 27 + .../serviceImpl/LogControllerServiceImpl.java | 91 +++ .../quartz_job/IDataSolverService.java | 4 + .../quartz_job/job_executor/DataSolver.java | 3 +- .../quartz_job/job_executor/OutsRepair.java | 3 +- .../main/resources/mapper/SysApiMapper.xml | 4 + .../main/resources/mapper/SysLogMapper.xml | 4 + 26 files changed, 1128 insertions(+), 225 deletions(-) create mode 100644 dev_wms_serve/src/main/java/com/wms_main/controller/wms/LogController.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/dao/ITSysApiService.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/dao/ITSysLogService.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysApiServiceImpl.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysLogServiceImpl.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/mapper/SysApiMapper.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/mapper/SysLogMapper.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysApiQuery.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysLogQuery.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/po/TSysApi.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/po/TSysLog.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysApiVo.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysLogVo.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/service/controller/ILogControllerService.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/LogControllerServiceImpl.java create mode 100644 dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/IDataSolverService.java create mode 100644 dev_wms_serve/src/main/resources/mapper/SysApiMapper.xml create mode 100644 dev_wms_serve/src/main/resources/mapper/SysLogMapper.xml diff --git a/dev_wms_client/src/api/wmsLog.js b/dev_wms_client/src/api/wmsLog.js index 35c9239..3cade8b 100644 --- a/dev_wms_client/src/api/wmsLog.js +++ b/dev_wms_client/src/api/wmsLog.js @@ -1,13 +1,19 @@ import request from "@/http/request"; -const queryLogs = (params) => { +// 分页查询接收日志 +export const queryLogsByPage = (params) => { return request({ - url: '/log/queryWmsLog', + url: '/log/queryLogsByPage', method: 'post', data: params }) } -export { - queryLogs +// 分页查询发送日志 +export const queryApisByPage = (params) => { + return request({ + url: '/log/queryApisByPage', + method: 'post', + data: params + }) } \ No newline at end of file diff --git a/dev_wms_client/src/layout/wmsLog.vue b/dev_wms_client/src/layout/wmsLog.vue index 3a9ccdd..6d9324e 100644 --- a/dev_wms_client/src/layout/wmsLog.vue +++ b/dev_wms_client/src/layout/wmsLog.vue @@ -1,221 +1,350 @@ - - \ No newline at end of file diff --git a/dev_wms_serve/src/main/java/com/wms_main/controller/wms/LogController.java b/dev_wms_serve/src/main/java/com/wms_main/controller/wms/LogController.java new file mode 100644 index 0000000..2fe5b0d --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/controller/wms/LogController.java @@ -0,0 +1,43 @@ +package com.wms_main.controller.wms; + +import com.wms_main.model.dto.query.SysApiQuery; +import com.wms_main.model.dto.query.SysLogQuery; +import com.wms_main.model.dto.response.wms.WmsApiResponse; +import com.wms_main.model.vo.wms.PageVo; +import com.wms_main.model.vo.wms.SysApiVo; +import com.wms_main.model.vo.wms.SysLogVo; +import com.wms_main.service.controller.ILogControllerService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + * 日志控制类 + */ +@RestController +@ResponseBody +@CrossOrigin +@RequiredArgsConstructor +@RequestMapping("/wms/log") +public class LogController { + private final ILogControllerService logControllerService; + + /** + * 查询接口接收日志 + * @param logQuery 查询参数 + * @return 查询结果 + */ + @PostMapping("/queryLogsByPage") + public WmsApiResponse> queryLogsByPage(@RequestBody SysLogQuery logQuery) { + return logControllerService.queryLogsByPage(logQuery); + } + + /** + * 查询接口发送日志 + * @param apiQuery 查询参数 + * @return 查询结果 + */ + @PostMapping("/queryApisByPage") + public WmsApiResponse> queryApisByPage(@RequestBody SysApiQuery apiQuery) { + return logControllerService.queryApisByPage(apiQuery); + } +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysApiService.java b/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysApiService.java new file mode 100644 index 0000000..feef71f --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysApiService.java @@ -0,0 +1,18 @@ +package com.wms_main.dao; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wms_main.model.po.TSysApi; +import com.wms_main.repository.http.entity.HttpRequest; +import com.wms_main.repository.http.entity.HttpResponse; + +/** + * api表服务 + */ +public interface ITSysApiService extends IService { + /** + * 存储api接口请求日志 + * @param request 请求参数 + * @param response 响应参数 + */ + void insertApiLog(HttpRequest request, HttpResponse response); +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysLogService.java b/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysLogService.java new file mode 100644 index 0000000..a0993ae --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/dao/ITSysLogService.java @@ -0,0 +1,10 @@ +package com.wms_main.dao; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wms_main.model.po.TSysLog; + +/** + * 日志服务接口 + */ +public interface ITSysLogService extends IService { +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysApiServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysApiServiceImpl.java new file mode 100644 index 0000000..7487b12 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysApiServiceImpl.java @@ -0,0 +1,75 @@ +package com.wms_main.dao.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wms_main.dao.ITSysApiService; +import com.wms_main.mapper.SysApiMapper; +import com.wms_main.model.po.TSysApi; +import com.wms_main.repository.http.entity.HttpRequest; +import com.wms_main.repository.http.entity.HttpResponse; +import com.wms_main.repository.utils.StringUtils; +import com.wms_main.repository.utils.UUIDUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +/** + * api表服务实现 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class TSysApiServiceImpl extends ServiceImpl implements ITSysApiService { + /** + * + * @param request 请求参数 + * @param response 响应参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertApiLog(HttpRequest request, HttpResponse response) { + TSysApi apiLog = new TSysApi(); + apiLog.setLogId(UUIDUtils.getNewUUID()); + apiLog.setLogTime(LocalDateTime.now()); + // 设置请求相关信息 + if (request != null) { + apiLog.setUrl(request.getUrl()); + apiLog.setTimeout(request.getTimeout()); + apiLog.setMethod(request.getMethod().name()); + apiLog.setContentType(request.getContentType()); + apiLog.setData(StringUtils.formatStringWithMaxLength(request.getData(), 2048)); + apiLog.setToken(StringUtils.formatStringWithMaxLength(request.getToken(), 2048)); + } + // 设置响应相关信息 + if (response != null) { + apiLog.setSuccess(response.isSuccess() ? "成功" : "失败"); + apiLog.setResponseCode(response.getResponseCode()); + apiLog.setRequestMessage(StringUtils.formatStringWithMaxLength(response.getRequestMessage(), 2048)); + apiLog.setResponseMessage(StringUtils.formatStringWithMaxLength(response.getResponseMessage(), 2048)); + apiLog.setRequestTime(response.getRequestTime()); + apiLog.setResponseTime(response.getResponseTime()); + apiLog.setRequestUrl(response.getRequestUrl()); + apiLog.setUseTime(response.getUseTime()); + apiLog.setExceptionMessage(StringUtils.formatStringWithMaxLength(response.getException().getMessage(), 2048)); + } + // 保存api日志 + save(apiLog); + // 记录文本日志 + log.info(logText(apiLog)); + } + + /** + * 生成日志文本 + * @param apiLog 日志对象 + * @return 字符串 + */ + private String logText(TSysApi apiLog) { + return "\n请求方式:" + apiLog.getMethod() + + "\n请求地址:" + apiLog.getUrl() + + "\n请求数据:" + apiLog.getData() + + "\n响应状态:" + apiLog.getSuccess() + + "\n响应数据:" + apiLog.getRequestMessage(); + } +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysLogServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysLogServiceImpl.java new file mode 100644 index 0000000..1c92199 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/dao/impl/TSysLogServiceImpl.java @@ -0,0 +1,14 @@ +package com.wms_main.dao.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wms_main.dao.ITSysLogService; +import com.wms_main.mapper.SysLogMapper; +import com.wms_main.model.po.TSysLog; +import org.springframework.stereotype.Service; + +/** + * 日志服务实现类 + */ +@Service +public class TSysLogServiceImpl extends ServiceImpl implements ITSysLogService { +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/filter/RequestLogFilter.java b/dev_wms_serve/src/main/java/com/wms_main/filter/RequestLogFilter.java index ff129aa..68110e0 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/filter/RequestLogFilter.java +++ b/dev_wms_serve/src/main/java/com/wms_main/filter/RequestLogFilter.java @@ -1,23 +1,36 @@ package com.wms_main.filter; +import com.wms_main.dao.ITSysLogService; +import com.wms_main.model.po.TSysLog; import com.wms_main.model.pojo.log.RequestLog; +import com.wms_main.repository.utils.UUIDUtils; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.http.HttpFilter; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.util.ContentCachingRequestWrapper; import org.springframework.web.util.ContentCachingResponseWrapper; import java.io.IOException; +import java.time.LocalDateTime; + +import static com.wms_main.repository.utils.StringUtils.formatStringWithMaxLength; @Slf4j @Component @WebFilter(filterName = "requestLogFilter", urlPatterns = "/*") +@RequiredArgsConstructor public class RequestLogFilter extends HttpFilter { + /** + * 日志服务 + */ + private final ITSysLogService sysLogService; + @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { // Wrapper封装request和response @@ -40,26 +53,31 @@ public class RequestLogFilter extends HttpFilter { // 响应体 byte[] responseContent = responseWrapper.getContentAsByteArray(); // 记录日志信息 - String requestContentString = formatContentString(new String(requestContent)); - String responseContentString = formatContentString(new String(responseContent)); + String requestContentString = formatStringWithMaxLength(new String(requestContent), 2048); + String responseContentString = formatStringWithMaxLength(new String(responseContent), 2048); RequestLog logInfo = new RequestLog(method, uri, remoteHost, remoteAddr, requestContentString, String.valueOf(status), responseContentString); log.info(logInfo.toString()); - // TODO 增加存储数据库的操作 + // 增加存储数据库的操作 + new Thread(() -> { + try { + TSysLog logForDb = new TSysLog( + UUIDUtils.getNewUUID(), + logInfo.getMethod(), + logInfo.getUri(), + logInfo.getRemoteHost(), + logInfo.getRemoteAddr(), + logInfo.getRequestContent(), + logInfo.getStatus(), + logInfo.getResponseContent(), + LocalDateTime.now() + ); + sysLogService.save(logForDb); + } catch (Exception e) { + log.error("记录日志失败。", e); + } + }).start(); // 把缓存的响应数据,响应给客户端 responseWrapper.copyBodyToResponse(); } - - /** - * 格式化内容string - * @param contentString 原始字符串 - * @return 格式化之后的字符串 - */ - private String formatContentString (String contentString) { - String newContentString = contentString.replaceAll("\\s*", ""); - if (newContentString.length() > 1024) { - newContentString = newContentString.substring(0, 1024) + "..."; - } - return newContentString; - } } diff --git a/dev_wms_serve/src/main/java/com/wms_main/mapper/SysApiMapper.java b/dev_wms_serve/src/main/java/com/wms_main/mapper/SysApiMapper.java new file mode 100644 index 0000000..5521811 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/mapper/SysApiMapper.java @@ -0,0 +1,12 @@ +package com.wms_main.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wms_main.model.po.TSysApi; +import org.apache.ibatis.annotations.Mapper; + +/** + * api表映射mapper + */ +@Mapper +public interface SysApiMapper extends BaseMapper { +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/mapper/SysLogMapper.java b/dev_wms_serve/src/main/java/com/wms_main/mapper/SysLogMapper.java new file mode 100644 index 0000000..c85f24b --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/mapper/SysLogMapper.java @@ -0,0 +1,12 @@ +package com.wms_main.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.wms_main.model.po.TSysLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 日志mapper接口 + */ +@Mapper +public interface SysLogMapper extends BaseMapper { +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysApiQuery.java b/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysApiQuery.java new file mode 100644 index 0000000..8842e03 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysApiQuery.java @@ -0,0 +1,22 @@ +package com.wms_main.model.dto.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 接口发送日志查询参数 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SysApiQuery extends PageQuery { + /** + * 查询字符串 + */ + @JsonProperty("queryStr") + private String queryStr; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysLogQuery.java b/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysLogQuery.java new file mode 100644 index 0000000..b22b157 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/dto/query/SysLogQuery.java @@ -0,0 +1,22 @@ +package com.wms_main.model.dto.query; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 接口接收日志查询参数 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SysLogQuery extends PageQuery { + /** + * 查询字符串 + */ + @JsonProperty("queryStr") + private String queryStr; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysApi.java b/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysApi.java new file mode 100644 index 0000000..ea26156 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysApi.java @@ -0,0 +1,105 @@ +package com.wms_main.model.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 数据库Api表映射 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "t_sys_api", autoResultMap = true) +public class TSysApi { + /** + * id + */ + @TableId(value = "log_id") + private String logId; + /** + * url + */ + @TableField(value = "url") + private String url; + /** + * 超时时长 + */ + @TableField(value = "timeout") + private Integer timeout; + /** + * 请求方式 + */ + @TableField(value = "method") + private String method; + /** + * 请求头 + */ + @TableField(value = "content_type") + private String contentType; + /** + * 数据 + */ + @TableField(value = "data") + private String data; + /** + * token + */ + @TableField(value = "token") + private String token; + /** + * 请求是否成功 + */ + @TableField(value = "success") + private String success; + /** + * 响应码 + */ + @TableField(value = "response_code") + private int responseCode; + /** + * 请求信息 + */ + @TableField(value = "request_message") + private String requestMessage; + /** + * 响应信息 + */ + @TableField(value = "response_message") + private String responseMessage; + /** + * 请求时间 + */ + @TableField(value = "request_time") + private LocalDateTime requestTime; + /** + * 响应时间 + */ + @TableField(value = "response_time") + private LocalDateTime responseTime; + /** + * 请求地址 + */ + @TableField(value = "request_url") + private String requestUrl; + /** + * 请求耗时 + */ + @TableField(value = "use_time") + private long useTime; + /** + * 异常 + */ + @TableField(value = "exception_message") + private String exceptionMessage; + /** + * 记录时间 + */ + @TableField(value = "log_time") + private LocalDateTime logTime; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysLog.java b/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysLog.java new file mode 100644 index 0000000..5a6623a --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/po/TSysLog.java @@ -0,0 +1,65 @@ +package com.wms_main.model.po; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 数据库Log表映射 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "t_sys_log", autoResultMap = true) +public class TSysLog { + /** + * 日志Id + */ + @TableId(value = "log_id") + private String logId; + /** + * 请求方式 + */ + @TableField(value = "method") + private String method; + /** + * 请求地址 + */ + @TableField(value = "uri") + private String uri; + /** + * 客户端主机 + */ + @TableField(value = "remote_host") + private String remoteHost; + /** + * 客户端地址 + */ + @TableField(value = "remote_addr") + private String remoteAddr; + /** + * 请求数据 + */ + @TableField(value = "request_content") + private String requestContent; + /** + * 响应状态 + */ + @TableField(value = "status") + private String status; + /** + * 响应数据 + */ + @TableField(value = "response_content") + private String responseContent; + /** + * 日志记录时间 + */ + @TableField(value = "log_time") + private LocalDateTime logTime; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysApiVo.java b/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysApiVo.java new file mode 100644 index 0000000..c627360 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysApiVo.java @@ -0,0 +1,102 @@ +package com.wms_main.model.vo.wms; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 接口发送日志 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SysApiVo { + /** + * id + */ + @JsonProperty("logId") + private String logId; + /** + * url + */ + @JsonProperty("url") + private String url; + /** + * 超时时长 + */ + @JsonProperty("timeout") + private Integer timeout; + /** + * 请求方式 + */ + @JsonProperty("method") + private String method; + /** + * 请求头 + */ + @JsonProperty("contentType") + private String contentType; + /** + * 数据 + */ + @JsonProperty("data") + private String data; + /** + * token + */ + @JsonProperty("token") + private String token; + /** + * 请求是否成功 + */ + @JsonProperty("success") + private String success; + /** + * 响应码 + */ + @JsonProperty("responseCode") + private int responseCode; + /** + * 请求信息 + */ + @JsonProperty("requestMessage") + private String requestMessage; + /** + * 响应信息 + */ + @JsonProperty("responseMessage") + private String responseMessage; + /** + * 请求时间 + */ + @JsonProperty("requestTime") + private LocalDateTime requestTime; + /** + * 响应时间 + */ + @JsonProperty("responseTime") + private LocalDateTime responseTime; + /** + * 请求地址 + */ + @JsonProperty("requestUrl") + private String requestUrl; + /** + * 请求耗时 + */ + @JsonProperty("useTime") + private long useTime; + /** + * 异常 + */ + @JsonProperty("exceptionMessage") + private String exceptionMessage; + /** + * 记录时间 + */ + @JsonProperty("logTime") + private LocalDateTime logTime; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysLogVo.java b/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysLogVo.java new file mode 100644 index 0000000..d37a8c3 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/model/vo/wms/SysLogVo.java @@ -0,0 +1,62 @@ +package com.wms_main.model.vo.wms; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 接口接收日志 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SysLogVo { + /** + * 日志Id + */ + @JsonProperty("logId") + private String logId; + /** + * 请求方式 + */ + @JsonProperty("method") + private String method; + /** + * 请求地址 + */ + @JsonProperty("uri") + private String uri; + /** + * 客户端主机 + */ + @JsonProperty("remoteHost") + private String remoteHost; + /** + * 客户端地址 + */ + @JsonProperty("remoteAddr") + private String remoteAddr; + /** + * 请求数据 + */ + @JsonProperty("requestContent") + private String requestContent; + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + /** + * 响应数据 + */ + @JsonProperty("responseContent") + private String responseContent; + /** + * 日志记录时间 + */ + @JsonProperty("logTime") + private LocalDateTime logTime; +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/repository/http/HttpClient.java b/dev_wms_serve/src/main/java/com/wms_main/repository/http/HttpClient.java index 7bfe2e3..2b6c6db 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/repository/http/HttpClient.java +++ b/dev_wms_serve/src/main/java/com/wms_main/repository/http/HttpClient.java @@ -1,8 +1,12 @@ package com.wms_main.repository.http; +import com.wms_main.dao.ITSysApiService; +import com.wms_main.model.po.TSysLog; import com.wms_main.repository.http.entity.HttpRequest; import com.wms_main.repository.http.entity.HttpResponse; import com.wms_main.repository.utils.StringUtils; +import com.wms_main.repository.utils.UUIDUtils; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -24,7 +28,9 @@ import java.time.LocalDateTime; */ @Component @Slf4j +@RequiredArgsConstructor public class HttpClient { + private final ITSysApiService sysApiService; /** * 发送一个 Get 请求 @@ -39,6 +45,8 @@ public class HttpClient { response.setSuccess(false); response.setResponseCode(999); response.setException(new Exception("请求地址为空")); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } if(StringUtils.isNotEmpty(request.getData())) { @@ -74,16 +82,19 @@ public class HttpClient { httpClient.close(); response.setSuccess(true); response.setResponseMessage(result.toString()); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } catch (Exception e) { response.setSuccess(false); response.setResponseCode(999); response.setException(e); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } } - /** * 发送一个 Post 请求 * @param request 请求数据 @@ -98,6 +109,8 @@ public class HttpClient { response.setSuccess(false); response.setResponseCode(999); response.setException(new Exception("请求地址为空")); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } if(StringUtils.isEmpty(request.getData())) { @@ -134,11 +147,15 @@ public class HttpClient { httpClient.close(); response.setSuccess(true); response.setResponseMessage(result.toString()); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } catch (Exception e) { response.setSuccess(false); response.setResponseCode(999); response.setException(e); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } } @@ -156,6 +173,8 @@ public class HttpClient { response.setSuccess(false); response.setResponseCode(999); response.setException(new Exception("请求地址为空")); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } if(!StringUtils.isEmpty(request.getData())) { @@ -191,12 +210,30 @@ public class HttpClient { httpClient.close(); response.setSuccess(true); response.setResponseMessage(result.toString()); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } catch (Exception e) { response.setSuccess(false); response.setResponseCode(999); response.setException(e); + // 增加存储数据库的操作 TODO 后续想办法增加多线程执行存储数据库 + insertApiLogToDb(request, response); return response; } } + + /** + * 存储api日志信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void insertApiLogToDb(HttpRequest request, HttpResponse response) { + try { + sysApiService.insertApiLog(request, response); + } catch (Exception e) { + log.error("插入日志失败{}", StringUtils.objectToString(e)); + } + } + } diff --git a/dev_wms_serve/src/main/java/com/wms_main/repository/http/enums/HttpMethodEnum.java b/dev_wms_serve/src/main/java/com/wms_main/repository/http/enums/HttpMethodEnum.java index 158c8e7..1c98105 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/repository/http/enums/HttpMethodEnum.java +++ b/dev_wms_serve/src/main/java/com/wms_main/repository/http/enums/HttpMethodEnum.java @@ -1,11 +1,13 @@ package com.wms_main.repository.http.enums; +import lombok.AllArgsConstructor; import lombok.Getter; /** * http请求方式 */ @Getter +@AllArgsConstructor public enum HttpMethodEnum { GET("GET"), @@ -13,9 +15,5 @@ public enum HttpMethodEnum { PUT("PUT"), DELETE("DELETE"); - private String method; - - HttpMethodEnum(String method) { - this.method = method; - } + private final String method; } diff --git a/dev_wms_serve/src/main/java/com/wms_main/repository/utils/StringUtils.java b/dev_wms_serve/src/main/java/com/wms_main/repository/utils/StringUtils.java index a8e9725..cd97c4d 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/repository/utils/StringUtils.java +++ b/dev_wms_serve/src/main/java/com/wms_main/repository/utils/StringUtils.java @@ -72,6 +72,11 @@ public class StringUtils { return str.matches("^\\d+$"); } + /** + * 判断一个字符串是否为小数 + * @param str 要判断的字符串 + * @return 结果 + */ public static boolean isDecimal(String str) { if (isEmpty(str)) return false; return str.matches("^\\d+\\.?\\d*$"); @@ -245,4 +250,22 @@ public class StringUtils { } return ip; } + + /** + * 截取字符串---依据最大程度,并去除空白与换行符 + * @param originStr 原始字符串 + * @param maxLength 最大长度 + * @return 格式化之后的字符串 + */ + public static String formatStringWithMaxLength(String originStr, int maxLength) { + if (StringUtils.isEmpty(originStr)) { + // 防止NULL异常 + return ""; + } + String newContentString = originStr.replaceAll("\\s*", ""); + if (newContentString.length() > maxLength) { + newContentString = newContentString.substring(0, maxLength) + "..."; + } + return newContentString; + } } diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/controller/ILogControllerService.java b/dev_wms_serve/src/main/java/com/wms_main/service/controller/ILogControllerService.java new file mode 100644 index 0000000..1288ca8 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/service/controller/ILogControllerService.java @@ -0,0 +1,27 @@ +package com.wms_main.service.controller; + +import com.wms_main.model.dto.query.SysApiQuery; +import com.wms_main.model.dto.query.SysLogQuery; +import com.wms_main.model.dto.response.wms.WmsApiResponse; +import com.wms_main.model.vo.wms.PageVo; +import com.wms_main.model.vo.wms.SysApiVo; +import com.wms_main.model.vo.wms.SysLogVo; + +/** + * 日志控制类服务 + */ +public interface ILogControllerService { + /** + * 查询接口接收日志数据---分页 + * @param logQuery 查询参数 + * @return 查询结果 + */ + WmsApiResponse> queryLogsByPage(SysLogQuery logQuery); + + /** + * 查询接口发送日志数据---分页 + * @param apiQuery 查询参数 + * @return 查询结果 + */ + WmsApiResponse> queryApisByPage(SysApiQuery apiQuery); +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/LogControllerServiceImpl.java b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/LogControllerServiceImpl.java new file mode 100644 index 0000000..d90f8a1 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/service/controller/serviceImpl/LogControllerServiceImpl.java @@ -0,0 +1,91 @@ +package com.wms_main.service.controller.serviceImpl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wms_main.dao.ITSysApiService; +import com.wms_main.dao.ITSysLogService; +import com.wms_main.model.dto.query.SysApiQuery; +import com.wms_main.model.dto.query.SysLogQuery; +import com.wms_main.model.dto.response.wms.WmsApiResponse; +import com.wms_main.model.po.TSysApi; +import com.wms_main.model.po.TSysLog; +import com.wms_main.model.vo.wms.PageVo; +import com.wms_main.model.vo.wms.SysApiVo; +import com.wms_main.model.vo.wms.SysLogVo; +import com.wms_main.repository.utils.StringUtils; +import com.wms_main.service.controller.ILogControllerService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 日志服务类接口实现 + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class LogControllerServiceImpl implements ILogControllerService { + private final ITSysLogService sysLogService;// 接口接收日志服务 + private final ITSysApiService sysApiService;// 接口发送日志服务 + + + /** + * 查询接口接收日志---实现 + * @param logQuery 查询参数 + * @return 查询结果 + */ + @Override + public WmsApiResponse> queryLogsByPage(SysLogQuery logQuery) { + if (logQuery == null) { + return WmsApiResponse.error("查询参数不能为NULL", null); + } + Page page = logQuery.toMpPage(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getMethod, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getUri, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getRemoteHost, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getRemoteAddr, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getRequestContent, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getStatus, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getResponseContent, logQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(logQuery.getQueryStr()), TSysLog::getLogTime, logQuery.getQueryStr()); + Page logsPage = sysLogService.page(page, lambdaQueryWrapper); + + PageVo pageVo = PageVo.of(logsPage, logPo -> BeanUtil.toBean(logPo, SysLogVo.class)); + return WmsApiResponse.success("查询接口接收日志成功。", pageVo); + } + + /** + * 查询接口发送日志---实现 + * @param apiQuery 查询参数 + * @return 查询结果 + */ + @Override + public WmsApiResponse> queryApisByPage(SysApiQuery apiQuery) { + if (apiQuery == null) { + return WmsApiResponse.error("查询参数不能为NULL", null); + } + Page page = apiQuery.toMpPage(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getUrl, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getTimeout, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getMethod, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getContentType, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getData, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getToken, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getSuccess, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getResponseCode, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getRequestMessage, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getResponseMessage, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getRequestTime, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getResponseTime, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getRequestUrl, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getUseTime, apiQuery.getQueryStr()).or() + .like(StringUtils.isNotEmpty(apiQuery.getQueryStr()), TSysApi::getExceptionMessage, apiQuery.getQueryStr()); + Page logsPage = sysApiService.page(page, lambdaQueryWrapper); + + PageVo pageVo = PageVo.of(logsPage, logPo -> BeanUtil.toBean(logPo, SysApiVo.class)); + return WmsApiResponse.success("查询接口发送日志成功。", pageVo); + } +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/IDataSolverService.java b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/IDataSolverService.java new file mode 100644 index 0000000..94f4011 --- /dev/null +++ b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/IDataSolverService.java @@ -0,0 +1,4 @@ +package com.wms_main.service.quartz_job; + +public interface IDataSolverService { +} diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java index d13dc71..015e64c 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/DataSolver.java @@ -19,8 +19,7 @@ public class DataSolver implements Job { */ @Override public void execute(JobExecutionContext jobExecutionContext) { - // 获取定时配置信息 - + // 获取 // 获取各种需要处理的数据 } diff --git a/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsRepair.java b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsRepair.java index 00faf8c..bd3e77a 100644 --- a/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsRepair.java +++ b/dev_wms_serve/src/main/java/com/wms_main/service/quartz_job/job_executor/OutsRepair.java @@ -17,7 +17,8 @@ import org.quartz.PersistJobDataAfterExecution; // 以下注解用于实现fixed_delay @DisallowConcurrentExecution @RequiredArgsConstructor -public class OutsRepair implements Job { +public class +OutsRepair implements Job { private final IOutsExecutorService outsExecutorService;// 出库单解析服务 /** diff --git a/dev_wms_serve/src/main/resources/mapper/SysApiMapper.xml b/dev_wms_serve/src/main/resources/mapper/SysApiMapper.xml new file mode 100644 index 0000000..15035ba --- /dev/null +++ b/dev_wms_serve/src/main/resources/mapper/SysApiMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dev_wms_serve/src/main/resources/mapper/SysLogMapper.xml b/dev_wms_serve/src/main/resources/mapper/SysLogMapper.xml new file mode 100644 index 0000000..e5d8ca5 --- /dev/null +++ b/dev_wms_serve/src/main/resources/mapper/SysLogMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file