From ffe06be91f95ffd2459ebdb2f9130d1e38d53ea7 Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期二, 06 十月 2026 18:32:34 +0800
Subject: [PATCH] fix: preserve manually edited menu names

---
 emergency-repair-server/src/main/java/com/emergencyrepair/system/log/ErrorLogRecorder.java |  107 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 107 insertions(+), 0 deletions(-)

diff --git a/emergency-repair-server/src/main/java/com/emergencyrepair/system/log/ErrorLogRecorder.java b/emergency-repair-server/src/main/java/com/emergencyrepair/system/log/ErrorLogRecorder.java
new file mode 100644
index 0000000..6c17876
--- /dev/null
+++ b/emergency-repair-server/src/main/java/com/emergencyrepair/system/log/ErrorLogRecorder.java
@@ -0,0 +1,107 @@
+package com.emergencyrepair.system.log;
+
+import com.emergencyrepair.common.audit.CurrentUserContext;
+import com.emergencyrepair.system.entity.SysErrorLog;
+import com.emergencyrepair.system.mapper.SysErrorLogMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * Persists unhandled server exceptions so administrators can inspect runtime bugs.
+ */
+@Component
+@RequiredArgsConstructor
+public class ErrorLogRecorder {
+    private static final int MAX_MESSAGE_LENGTH = 2000;
+    private static final int MAX_STACK_LENGTH = 60000;
+
+    private final SysErrorLogMapper errorLogMapper;
+    private final JdbcTemplate jdbcTemplate;
+
+    public void record(Exception exception, HttpServletRequest request) {
+        if (exception == null) {
+            return;
+        }
+        try {
+            String username = CurrentUserContext.get();
+            Long userId = resolveUserId(username);
+            SysErrorLog log = new SysErrorLog();
+            log.setUserId(userId);
+            log.setUserName(username);
+            log.setNickName(resolveNickName(userId));
+            log.setModule(resolveModule(request));
+            log.setRequestMethod(request == null ? null : limit(request.getMethod(), 10));
+            log.setRequestUri(request == null ? null : limit(request.getRequestURI(), 500));
+            log.setExceptionType(limit(exception.getClass().getName(), 300));
+            log.setMessage(limit(resolveMessage(exception), MAX_MESSAGE_LENGTH));
+            log.setStackTrace(limit(stackTrace(exception), MAX_STACK_LENGTH));
+            log.setErrorTime(LocalDateTime.now());
+            errorLogMapper.insert(log);
+        } catch (Exception ignored) {
+            // Error logging must never interfere with the original error response.
+        }
+    }
+
+    private Long resolveUserId(String username) {
+        if (!StringUtils.hasText(username)) {
+            return null;
+        }
+        List<Long> ids = jdbcTemplate.query(
+                "SELECT USER_ID FROM CSICZB_ZB.SYS_USER WHERE USER_NAME = ? AND (DEL_FLAG = '0' OR DEL_FLAG IS NULL)",
+                new Object[]{username}, (rs, rowNum) -> rs.getLong(1));
+        return ids.isEmpty() ? null : ids.get(0);
+    }
+
+    private String resolveNickName(Long userId) {
+        if (userId == null) {
+            return null;
+        }
+        List<String> names = jdbcTemplate.query(
+                "SELECT NICK_NAME FROM CSICZB_ZB.SYS_USER WHERE USER_ID = ?",
+                new Object[]{userId}, (rs, rowNum) -> rs.getString(1));
+        return names.isEmpty() ? null : names.get(0);
+    }
+
+    private String resolveMessage(Exception exception) {
+        String message = exception.getMessage();
+        return StringUtils.hasText(message) ? message : exception.getClass().getSimpleName();
+    }
+
+    private String stackTrace(Exception exception) {
+        StringWriter writer = new StringWriter();
+        exception.printStackTrace(new PrintWriter(writer));
+        return writer.toString();
+    }
+
+    private String resolveModule(HttpServletRequest request) {
+        if (request == null || !StringUtils.hasText(request.getRequestURI())) {
+            return "鍏朵粬";
+        }
+        String uri = request.getRequestURI();
+        if (uri.startsWith("/api/faults") || uri.startsWith("/api/fault")) return "鏁呴殰绠$悊";
+        if (uri.startsWith("/api/work-orders") || uri.startsWith("/api/completion")) return "瀹屽伐绠$悊";
+        if (uri.startsWith("/api/acceptances")) return "瀹屽伐楠屾敹";
+        if (uri.startsWith("/api/reports")) return "缁熻鎶ヨ〃";
+        if (uri.startsWith("/api/system/users")) return "鐢ㄦ埛绠$悊";
+        if (uri.startsWith("/api/system/roles")) return "瑙掕壊绠$悊";
+        if (uri.startsWith("/api/system/menu")) return "鑿滃崟绠$悊";
+        if (uri.startsWith("/api/system/contractors")) return "鎵夸慨鍗曚綅绠$悊";
+        if (uri.startsWith("/api/system")) return "绯荤粺绠$悊";
+        return "鍏朵粬";
+    }
+
+    private String limit(String value, int maxLength) {
+        if (value == null || value.length() <= maxLength) {
+            return value;
+        }
+        return value.substring(0, maxLength);
+    }
+}

--
Gitblit v1.9.1