Bläddra i källkod

埋点错误修复

liuchengsen 4 veckor sedan
förälder
incheckning
2343adfafc

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

@@ -1,25 +1,11 @@
 package com.pharmacopoeia.repository;
 
 import com.pharmacopoeia.entity.UserEvent;
-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 UserEventRepository extends JpaRepository<UserEvent, Long> {
-
-    @Query("SELECT e FROM UserEvent e WHERE " +
-           "(:eventType IS NULL OR e.eventType = :eventType) AND " +
-           "(:startTime IS NULL OR e.createdAt >= :startTime) AND " +
-           "(:endTime IS NULL OR e.createdAt < :endTime) " +
-           "ORDER BY e.createdAt DESC")
-    Page<UserEvent> findWithFilters(@Param("eventType") String eventType,
-                                    @Param("startTime") Instant startTime,
-                                    @Param("endTime") Instant endTime,
-                                    Pageable pageable);
+public interface UserEventRepository extends JpaRepository<UserEvent, Long>,
+        JpaSpecificationExecutor<UserEvent> {
 }

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

@@ -15,6 +15,7 @@ import com.pharmacopoeia.entity.QuickAskAuditLog;
 import org.springframework.data.domain.PageRequest;
 
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -497,6 +498,15 @@ public class AdminKnowledgeService {
 
     // ==================== Helpers ====================
 
+    /** 从 SecurityContext 获取当前操作员标识 */
+    private String getCurrentOperator() {
+        var auth = SecurityContextHolder.getContext().getAuthentication();
+        if (auth != null && auth.isAuthenticated() && !"anonymousUser".equals(auth.getPrincipal())) {
+            return auth.getName();
+        }
+        return "anonymous";
+    }
+
     @SuppressWarnings("unchecked")
     private Map<String, Object> castToMap(Object obj) {
         if (obj instanceof Map) return (Map<String, Object>) obj;

+ 20 - 4
backend-java/src/main/java/com/pharmacopoeia/service/AnalyticsService.java

@@ -2,15 +2,19 @@ package com.pharmacopoeia.service;
 
 import com.pharmacopoeia.entity.UserEvent;
 import com.pharmacopoeia.repository.UserEventRepository;
+import jakarta.persistence.criteria.Predicate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.ZoneOffset;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,10 +58,22 @@ public class AnalyticsService {
                 ? LocalDate.parse(endDate).plusDays(1).atStartOfDay(ZoneOffset.UTC).toInstant()
                 : null;
 
-        var pageable = PageRequest.of(page - 1, pageSize);
-        var result = repo.findWithFilters(
-                eventType != null && !eventType.isBlank() ? eventType : null,
-                startTime, endTime, pageable);
+        Specification<UserEvent> spec = (root, query, cb) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (eventType != null && !eventType.isBlank()) {
+                predicates.add(cb.equal(root.get("eventType"), eventType));
+            }
+            if (startTime != null) {
+                predicates.add(cb.greaterThanOrEqualTo(root.get("createdAt"), startTime));
+            }
+            if (endTime != null) {
+                predicates.add(cb.lessThan(root.get("createdAt"), endTime));
+            }
+            return cb.and(predicates.toArray(new Predicate[0]));
+        };
+
+        var pageable = PageRequest.of(page - 1, pageSize, Sort.by(Sort.Direction.DESC, "createdAt"));
+        var result = repo.findAll(spec, pageable);
 
         List<Map<String, Object>> items = result.getContent().stream()
                 .map(e -> {