map, HttpServletResponse response, String[] product_area) throws IOException;
}
diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java
index b899b87..ab94748 100644
--- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java
+++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/logging/impl/SysLogServiceImpl.java
@@ -6,6 +6,17 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
+import com.itextpdf.kernel.geom.PageSize;
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.layout.element.Table;
+import com.itextpdf.layout.element.Cell;
+import com.itextpdf.layout.properties.TextAlignment;
+import com.itextpdf.layout.properties.UnitValue;
+import com.itextpdf.kernel.font.PdfFont;
+import com.itextpdf.kernel.font.PdfFontFactory;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,8 +26,6 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.nl.common.domain.query.PageQuery;
import org.nl.common.logging.annotation.Log;
-import org.nl.common.utils.FileUtil;
-import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.StringUtils;
import org.nl.common.utils.ValidationUtil;
import org.nl.system.service.logging.ISysLogService;
@@ -31,7 +40,10 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
+import java.nio.charset.StandardCharsets;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
*
@@ -45,6 +57,9 @@ import java.util.*;
@Service
public class SysLogServiceImpl extends ServiceImpl implements ISysLogService {
+ private static final Pattern BAD_REQUEST_EX_PATTERN = Pattern.compile("org\\.nl\\.common\\.exception\\.BadRequestException:\\s*(.+?)(?:\\r?\\n|\\s+at\\s+|$)");
+ private static final Pattern GENERAL_EX_PATTERN = Pattern.compile("Exception:\\s*(.+?)(?:\\r?\\n|\\s+at\\s+|$)");
+
@Autowired
private SysLogMapper logMapper;
@@ -114,7 +129,7 @@ public class SysLogServiceImpl extends ServiceImpl impleme
logMapper.insert(logDto);
}
- @Override
+ /* @Override
public void download(Map map, HttpServletResponse response, String[] product_area) throws IOException {
String blurry = ObjectUtil.isNotEmpty(map.get("blurry"))?map.get("blurry").toString():null;
String log_type = ObjectUtil.isNotEmpty(map.get("log_type"))?map.get("log_type").toString():null;
@@ -143,6 +158,87 @@ public class SysLogServiceImpl extends ServiceImpl impleme
list.add(mp);
}
FileUtil.downloadExcel(list, response);
+ }*/
+
+ @Override
+ public void download(Map map, HttpServletResponse response, String[] product_area) throws IOException {
+ // pdf导出
+ // 1.提取查询参数
+ String blurry = ObjectUtil.isNotEmpty(map.get("blurry")) ? map.get("blurry").toString() : null;
+ String log_type = ObjectUtil.isNotEmpty(map.get("log_type")) ? map.get("log_type").toString() : null;
+ String username = ObjectUtil.isNotEmpty(map.get("username")) ? map.get("username").toString() : null;
+ String begin_time = ObjectUtil.isNotEmpty(map.get("begin_time")) ? map.get("begin_time").toString() : null;
+ String end_time = ObjectUtil.isNotEmpty(map.get("end_time")) ? map.get("end_time").toString() : null;
+
+ // 2.查询数据库
+ LambdaQueryWrapper lam = new LambdaQueryWrapper<>();
+ lam.eq(ObjectUtil.isNotEmpty(log_type), SysLog::getLog_type, log_type)
+ .eq(ObjectUtil.isNotEmpty(username), SysLog::getUsername, username)
+ .like(ObjectUtil.isNotEmpty(blurry), SysLog::getDescription, blurry)
+ .le(ObjectUtil.isNotEmpty(end_time), SysLog::getCreate_time, end_time)
+ .ge(ObjectUtil.isNotEmpty(begin_time), SysLog::getCreate_time, begin_time)
+ .orderByDesc(SysLog::getCreate_time);
+ List dataList = this.list(lam);
+
+ // 3.设置响应头【前端文件下载】
+ response.reset();
+ response.setContentType("application/pdf");
+ String fileName = "系统异常日志.pdf";
+ fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
+ response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+ response.setHeader("Cache-Control", "no-cache");
+
+ // 4.构建PDF,设置【A4横向】核心改动
+ PdfWriter writer = new PdfWriter(response.getOutputStream());
+ PdfDocument pdfDoc = new PdfDocument(writer);
+ // A4横向旋转
+ pdfDoc.setDefaultPageSize(PageSize.A4.rotate());
+ Document document = new Document(pdfDoc);
+
+ // 中文字体
+ PdfFont font = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
+
+ // 标题
+ Paragraph title = new Paragraph("系统异常日志列表")
+ .setFont(font)
+ .setFontSize(14)
+ .setTextAlignment(TextAlignment.CENTER);
+ document.add(title);
+ document.add(new Paragraph("\n"));
+
+ // 表头
+ String[] headers = {"用户名", "IP", "IP来源", "描述", "浏览器", "请求耗时", "创建日期","错误信息"};
+ // 等分列宽,不再使用固定宽度
+ float[] columnWidths = new float[headers.length];
+ Arrays.fill(columnWidths, 1);
+ Table table = new Table(UnitValue.createPercentArray(columnWidths))
+ .useAllAvailableWidth();
+
+ // 渲染表头
+ for (String header : headers) {
+ Cell cell = new Cell()
+ .add(new Paragraph(header)
+ .setFont(font)
+ .setFontSize(9)
+ .setTextAlignment(TextAlignment.CENTER));
+ table.addCell(cell);
+ }
+
+ // 渲染数据(空值兜底 + 字体9号)
+ for (SysLog sysLog : dataList) {
+ table.addCell(new Cell().add(new Paragraph(sysLog.getUsername()).setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getRequest_ip()).setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getAddress()).setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getDescription()).setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getBrowser()).setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getTime() +"ms").setFont(font)));
+ table.addCell(new Cell().add(new Paragraph(sysLog.getCreate_time()).setFont(font)));
+ // 错误信息
+ table.addCell(new Cell().add(new Paragraph(extractExceptionMsg(sysLog.getException_detail())).setFont(font)));
+ }
+
+ document.add(table);
+ document.close();
}
/**
@@ -175,4 +271,51 @@ public class SysLogServiceImpl extends ServiceImpl impleme
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
}
+ /**
+ * 错误信息过滤
+ * @param exceptionDetail 报错字节数字
+ * @return 具体报错信息
+ */
+ public static String extractExceptionMsg(Object exceptionDetail) {
+ if (exceptionDetail == null) {
+ return "-";
+ }
+ String exceptionStr = "";
+ try {
+ if (exceptionDetail instanceof String) {
+ String rawStr = (String) exceptionDetail;
+ try {
+ // Base64解码
+ byte[] decodeBytes = Base64.getDecoder().decode(rawStr);
+ exceptionStr = new String(decodeBytes, StandardCharsets.UTF_8);
+ } catch (Exception e) {
+ // 不是合法base64,直接使用原字符串
+ exceptionStr = rawStr;
+ }
+ } else if (exceptionDetail instanceof byte[]) {
+ byte[] bytes = (byte[]) exceptionDetail;
+ exceptionStr = new String(bytes, StandardCharsets.UTF_8);
+ } else {
+ // 不支持的类型直接返回-
+ return "-";
+ }
+
+ // 优先匹配 BadRequestException
+ Matcher badMatcher = BAD_REQUEST_EX_PATTERN.matcher(exceptionStr);
+ if (badMatcher.find() && badMatcher.group(1) != null) {
+ return badMatcher.group(1).trim();
+ }
+
+ // 通用Exception匹配兜底
+ Matcher generalMatcher = GENERAL_EX_PATTERN.matcher(exceptionStr);
+ if (generalMatcher.find() && generalMatcher.group(1) != null) {
+ return generalMatcher.group(1).trim();
+ }
+ return "-";
+ } catch (Exception e) {
+ // 任何解析异常全部兜底返回"-"
+ return "-";
+ }
+ }
+
}
diff --git a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/ReviewSignController.java b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/ReviewSignController.java
index 0d26312..4e82166 100644
--- a/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/ReviewSignController.java
+++ b/wms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/ReviewSignController.java
@@ -15,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
import java.util.Map;
@@ -40,4 +42,10 @@ public class ReviewSignController {
public ResponseEntity