Ver código fonte

审计日志更新

liuchengsen 3 semanas atrás
pai
commit
76ef31f4fb

+ 3 - 17
backend-java/src/main/java/com/pharmacopoeia/repository/QuickAskAuditLogRepository.java

@@ -1,26 +1,12 @@
 package com.pharmacopoeia.repository;
 
 import com.pharmacopoeia.entity.QuickAskAuditLog;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
-import java.time.Instant;
-
 @Repository
-public interface QuickAskAuditLogRepository extends JpaRepository<QuickAskAuditLog, Long> {
+public interface QuickAskAuditLogRepository extends JpaRepository<QuickAskAuditLog, Long>,
+        JpaSpecificationExecutor<QuickAskAuditLog> {
 
-    @Query("SELECT a FROM QuickAskAuditLog a WHERE "
-         + "(:action IS NULL OR a.action = :action) AND "
-         + "(CAST(:startTime AS java.time.Instant) IS NULL OR a.createdAt >= :startTime) AND "
-         + "(CAST(:endTime AS java.time.Instant) IS NULL OR a.createdAt < :endTime) "
-         + "ORDER BY a.createdAt DESC")
-    Page<QuickAskAuditLog> findByFilters(
-            @Param("action") String action,
-            @Param("startTime") Instant startTime,
-            @Param("endTime") Instant endTime,
-            Pageable pageable);
 }

+ 25 - 10
backend-java/src/main/java/com/pharmacopoeia/service/AdminKnowledgeService.java

@@ -12,6 +12,8 @@ import com.pharmacopoeia.repository.KnowledgePointRepository;
 import com.pharmacopoeia.repository.QuestionRepository;
 import com.pharmacopoeia.repository.QuickAskAuditLogRepository;
 import com.pharmacopoeia.repository.QuickAskRepository;
+import org.springframework.data.jpa.domain.Specification;
+import jakarta.persistence.criteria.Predicate;
 import com.pharmacopoeia.util.IpUtils;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -422,16 +424,8 @@ public class AdminKnowledgeService {
                                                        String startDate, String endDate) {
         var pageable = PageRequest.of(page - 1, pageSize);
 
-        Instant startTime = startDate != null && !startDate.isBlank()
-                ? LocalDate.parse(startDate).atStartOfDay(ZoneOffset.UTC).toInstant()
-                : null;
-        Instant endTime = endDate != null && !endDate.isBlank()
-                ? LocalDate.parse(endDate).plusDays(1).atStartOfDay(ZoneOffset.UTC).toInstant()
-                : null;
-
-        var result = auditLogRepository.findByFilters(
-                action != null && !action.isBlank() ? action : null,
-                startTime, endTime, pageable);
+        var spec = buildAuditLogSpec(action, startDate, endDate);
+        var result = auditLogRepository.findAll(spec, pageable);
 
         return Map.of(
                 "items", result.getContent(),
@@ -442,6 +436,27 @@ public class AdminKnowledgeService {
         );
     }
 
+    private Specification<QuickAskAuditLog> buildAuditLogSpec(String action, String startDate, String endDate) {
+        return (root, query, cb) -> {
+            List<Predicate> predicates = new java.util.ArrayList<>();
+
+            if (action != null && !action.isBlank()) {
+                predicates.add(cb.equal(root.get("action"), action));
+            }
+            if (startDate != null && !startDate.isBlank()) {
+                predicates.add(cb.greaterThanOrEqualTo(root.get("createdAt"),
+                        java.time.LocalDate.parse(startDate).atStartOfDay(java.time.ZoneOffset.UTC).toInstant()));
+            }
+            if (endDate != null && !endDate.isBlank()) {
+                predicates.add(cb.lessThan(root.get("createdAt"),
+                        java.time.LocalDate.parse(endDate).plusDays(1).atStartOfDay(java.time.ZoneOffset.UTC).toInstant()));
+            }
+
+            query.orderBy(cb.desc(root.get("createdAt")));
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+    }
+
     // ==================== Helpers ====================
 
     /** 从 SecurityContext 获取当前操作员标识 */