UserEventRepository.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.pharmacopoeia.repository;
  2. import com.pharmacopoeia.entity.UserEvent;
  3. import org.springframework.data.domain.Page;
  4. import org.springframework.data.domain.Pageable;
  5. import org.springframework.data.jpa.repository.JpaRepository;
  6. import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  7. import org.springframework.data.jpa.repository.Query;
  8. import org.springframework.data.repository.query.Param;
  9. import org.springframework.stereotype.Repository;
  10. import java.time.Instant;
  11. import java.util.List;
  12. @Repository
  13. public interface UserEventRepository extends JpaRepository<UserEvent, Long>,
  14. JpaSpecificationExecutor<UserEvent> {
  15. /** 总数 */
  16. @Query("SELECT COUNT(e) FROM UserEvent e " +
  17. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  18. long countTotal(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  19. /** 去重活跃用户数 */
  20. @Query("SELECT COUNT(DISTINCT e.userKey) FROM UserEvent e " +
  21. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  22. long countDistinctUsers(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  23. /** 去重 IP 数 */
  24. @Query("SELECT COUNT(DISTINCT e.ip) FROM UserEvent e " +
  25. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  26. long countDistinctIps(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  27. /** 按类型 count */
  28. @Query("SELECT COUNT(e) FROM UserEvent e " +
  29. "WHERE e.eventType = :eventType " +
  30. "AND e.createdAt >= :startTime AND e.createdAt < :endTime")
  31. long countByType(@Param("eventType") String eventType,
  32. @Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  33. // ==================== 分组统计(全量,供其他场景用) ====================
  34. @Query("SELECT e.ip as key, COUNT(e) as cnt FROM UserEvent e " +
  35. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  36. "GROUP BY e.ip ORDER BY cnt DESC")
  37. List<Object[]> countByIp(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  38. @Query("SELECT e.pageUrl as key, COUNT(e) as cnt FROM UserEvent e " +
  39. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  40. "GROUP BY e.pageUrl ORDER BY cnt DESC")
  41. List<Object[]> countByPageUrl(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  42. @Query("SELECT e.eventType as key, COUNT(e) as cnt FROM UserEvent e " +
  43. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  44. "GROUP BY e.eventType ORDER BY cnt DESC")
  45. List<Object[]> countByEventType(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  46. @Query("SELECT e.userKey as key, COUNT(e) as cnt FROM UserEvent e " +
  47. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  48. "GROUP BY e.userKey ORDER BY cnt DESC")
  49. List<Object[]> countByUserKey(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  50. @Query("SELECT e.userKey, e.ip, COUNT(e) as cnt FROM UserEvent e " +
  51. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  52. "GROUP BY e.userKey, e.ip ORDER BY e.userKey, cnt DESC")
  53. List<Object[]> countByUserIp(@Param("startTime") Instant startTime, @Param("endTime") Instant endTime);
  54. // ==================== 分组统计(分页) ====================
  55. @Query(value = "SELECT e.ip as key, COUNT(e) as cnt FROM UserEvent e " +
  56. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  57. "GROUP BY e.ip ORDER BY cnt DESC",
  58. countQuery = "SELECT COUNT(DISTINCT e.ip) FROM UserEvent e " +
  59. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  60. Page<Object[]> countByIpPaged(@Param("startTime") Instant startTime,
  61. @Param("endTime") Instant endTime, Pageable pageable);
  62. @Query(value = "SELECT e.pageUrl as key, COUNT(e) as cnt FROM UserEvent e " +
  63. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  64. "GROUP BY e.pageUrl ORDER BY cnt DESC",
  65. countQuery = "SELECT COUNT(DISTINCT e.pageUrl) FROM UserEvent e " +
  66. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  67. Page<Object[]> countByPageUrlPaged(@Param("startTime") Instant startTime,
  68. @Param("endTime") Instant endTime, Pageable pageable);
  69. @Query(value = "SELECT e.eventType as key, COUNT(e) as cnt FROM UserEvent e " +
  70. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  71. "GROUP BY e.eventType ORDER BY cnt DESC",
  72. countQuery = "SELECT COUNT(DISTINCT e.eventType) FROM UserEvent e " +
  73. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  74. Page<Object[]> countByEventTypePaged(@Param("startTime") Instant startTime,
  75. @Param("endTime") Instant endTime, Pageable pageable);
  76. @Query(value = "SELECT e.userKey as key, COUNT(e) as cnt FROM UserEvent e " +
  77. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  78. "GROUP BY e.userKey ORDER BY cnt DESC",
  79. countQuery = "SELECT COUNT(DISTINCT e.userKey) FROM UserEvent e " +
  80. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime")
  81. Page<Object[]> countByUserKeyPaged(@Param("startTime") Instant startTime,
  82. @Param("endTime") Instant endTime, Pageable pageable);
  83. @Query(value = "SELECT e.userKey, e.ip, COUNT(e) as cnt FROM UserEvent e " +
  84. "WHERE e.createdAt >= :startTime AND e.createdAt < :endTime " +
  85. "GROUP BY e.userKey, e.ip ORDER BY e.userKey, cnt DESC",
  86. countQuery = "SELECT COUNT(*) FROM (" +
  87. "SELECT e2.userKey AS userKey, e2.ip AS ip FROM UserEvent e2 " +
  88. "WHERE e2.createdAt >= :startTime AND e2.createdAt < :endTime " +
  89. "GROUP BY e2.userKey, e2.ip) sub")
  90. Page<Object[]> countByUserIpPaged(@Param("startTime") Instant startTime,
  91. @Param("endTime") Instant endTime, Pageable pageable);
  92. /** 获取所有去重事件类型,供前端筛选 */
  93. @Query("SELECT DISTINCT e.eventType FROM UserEvent e ORDER BY e.eventType")
  94. List<String> findDistinctEventTypes();
  95. }