package com.emergencyrepair.system.log; import com.emergencyrepair.system.entity.SysOperationLog; import com.emergencyrepair.common.audit.CurrentUserContext; import com.emergencyrepair.system.mapper.SysOperationLogMapper; import com.emergencyrepair.system.service.SystemService; import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Records add/update/delete calls. Login is covered by the login log. */ @Component @RequiredArgsConstructor public class OperationLogInterceptor implements HandlerInterceptor { private static final Pattern TARGET_ID = Pattern.compile(".*/(\\d{6,})(?:/.*)?$"); private final SysOperationLogMapper operationLogMapper; private final SystemService systemService; private final JdbcTemplate jdbcTemplate; @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { String method = request.getMethod(); if (!"POST".equals(method) && !"PUT".equals(method) && !"DELETE".equals(method)) { return; } String uri = request.getRequestURI(); if (!StringUtils.hasText(uri) || !uri.startsWith("/api/") || uri.startsWith("/api/auth/login")) { return; } try { String username = CurrentUserContext.get(); SysOperationLog log = new SysOperationLog(); log.setUserName(username); Long userId = systemService.resolveUserId(username); log.setUserId(userId); log.setNickName(resolveNickName(userId)); log.setModule(resolveModule(uri)); log.setOperationType(resolveOperationType(uri, method)); log.setTargetType(resolveTargetType(uri)); log.setTargetId(resolveTargetId(uri)); log.setDescription(method + " " + uri); log.setRequestMethod(method); log.setRequestUri(uri); log.setResult(exception == null && response.getStatus() < 400 ? "\u6210\u529f" : "\u5931\u8d25"); log.setCreateTime(LocalDateTime.now()); operationLogMapper.insert(log); } catch (Exception ignored) { // Logging must never break the business request. } } private String resolveNickName(Long userId) { if (userId == null) { return null; } List 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 resolveModule(String uri) { if (uri.startsWith("/api/faults") || uri.startsWith("/api/fault")) return "\u6545\u969c\u7ba1\u7406"; if (uri.startsWith("/api/work-orders") || uri.startsWith("/api/completion")) return "\u5b8c\u5de5\u7ba1\u7406"; if (uri.startsWith("/api/acceptances")) return "\u5b8c\u5de5\u9a8c\u6536"; if (uri.startsWith("/api/reports")) return "\u7edf\u8ba1\u62a5\u8868"; if (uri.startsWith("/api/system/users")) return "\u7528\u6237\u7ba1\u7406"; if (uri.startsWith("/api/system/roles")) return "\u89d2\u8272\u7ba1\u7406"; if (uri.startsWith("/api/system/menu")) return "\u83dc\u5355\u7ba1\u7406"; if (uri.startsWith("/api/system/contractors")) return "\u627f\u4fee\u5355\u4f4d\u7ba1\u7406"; if (uri.startsWith("/api/system")) return "\u7cfb\u7edf\u7ba1\u7406"; return "\u5176\u4ed6"; } private String resolveOperationType(String uri, String method) { if (uri.contains("/dispatch")) return "\u6d3e\u5355"; if (uri.contains("/approve") || uri.contains("/approval") || uri.contains("/review")) return "\u5ba1\u6279"; if (uri.contains("/cancel")) return "\u9500\u9879"; if (uri.contains("/submit")) return "\u63d0\u4ea4"; if (uri.contains("/apply")) return "\u7533\u8bf7"; if (uri.contains("/print")) return "\u6253\u5370"; if (uri.contains("/rating")) return "\u8bc4\u7ea7"; if (uri.contains("/roles") || uri.contains("/menu-permissions")) return "\u6388\u6743"; if (uri.contains("/buttons")) return "\u83dc\u5355\u6309\u94ae\u914d\u7f6e"; if ("POST".equals(method)) return "\u65b0\u589e"; if ("PUT".equals(method)) return "\u4fee\u6539"; return "\u5220\u9664"; } private String resolveTargetType(String uri) { String[] parts = uri.replace("/api/", "").split("/"); return parts.length == 0 ? "" : parts[0]; } private String resolveTargetId(String uri) { Matcher matcher = TARGET_ID.matcher(uri); return matcher.matches() ? matcher.group(1) : null; } }