diff --git a/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberRepository.java b/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberRepository.java index 9500eb3994..6e21350e61 100644 --- a/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberRepository.java +++ b/modules/service/src/main/java/com/bytedesk/service/queue_member/QueueMemberRepository.java @@ -29,32 +29,40 @@ import com.bytedesk.service.queue.QueueEntity; import jakarta.persistence.LockModeType; -public interface QueueMemberRepository extends JpaRepository, JpaSpecificationExecutor { +public interface QueueMemberRepository + extends JpaRepository, JpaSpecificationExecutor { Optional findByUid(String uid); - List findByOrgUidAndCreatedAtBetweenAndResolved(String orgUid, ZonedDateTime startTime, ZonedDateTime endTime, boolean resolved); - - List findByOrgUidAndCreatedAtBetweenAndAgentAcceptType(String orgUid, ZonedDateTime startTime, ZonedDateTime endTime, String acceptType); + List findByOrgUidAndCreatedAtBetweenAndResolved(String orgUid, ZonedDateTime startTime, + ZonedDateTime endTime, boolean resolved); + + List findByOrgUidAndCreatedAtBetweenAndAgentAcceptType(String orgUid, ZonedDateTime startTime, + ZonedDateTime endTime, String acceptType); + // 修改查询方法,使用 JPQL 通过关联的 Thread 实体的 uid 字段查询 @Query("SELECT qm FROM QueueMemberEntity qm WHERE qm.thread.uid = :threadUid AND qm.deleted = false") Optional findByThreadUid(@Param("threadUid") String threadUid); // 统计指定组织在指定日期范围内的会话总数 @Query("SELECT COUNT(qm) FROM QueueMemberEntity qm WHERE qm.orgUid = :orgUid AND qm.createdAt >= :startDate AND qm.createdAt <= :endDate") - Long countByOrgUidAndDateBetween(@Param("orgUid") String orgUid, @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); + Long countByOrgUidAndDateBetween(@Param("orgUid") String orgUid, @Param("startDate") ZonedDateTime startDate, + @Param("endDate") ZonedDateTime endDate); // 统计指定工作组在指定日期范围内的会话总数 @Query("SELECT COUNT(qm) FROM QueueMemberEntity qm WHERE qm.orgUid = :orgUid AND qm.workgroupQueue IS NOT NULL AND qm.createdAt >= :startDate AND qm.createdAt <= :endDate") - Long countByWorkgroupUidAndDateBetween(@Param("orgUid") String orgUid, @Param("workgroupUid") String workgroupUid, @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); + Long countByWorkgroupUidAndDateBetween(@Param("orgUid") String orgUid, @Param("workgroupUid") String workgroupUid, + @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); // 统计指定客服在指定日期范围内的会话总数 @Query("SELECT COUNT(qm) FROM QueueMemberEntity qm WHERE qm.thread.agent LIKE CONCAT('%', :agentUid, '%') AND qm.createdAt >= :startDate AND qm.createdAt <= :endDate") - Long countByAgentUidAndDateBetween(@Param("agentUid") String agentUid, @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); + Long countByAgentUidAndDateBetween(@Param("agentUid") String agentUid, @Param("startDate") ZonedDateTime startDate, + @Param("endDate") ZonedDateTime endDate); // 统计指定机器人在指定日期范围内的会话总数 @Query("SELECT COUNT(qm) FROM QueueMemberEntity qm WHERE qm.orgUid = :orgUid AND qm.robotQueue IS NOT NULL AND qm.createdAt >= :startDate AND qm.createdAt <= :endDate") - Long countByRobotUidAndDateBetween(@Param("orgUid") String orgUid, @Param("robotUid") String robotUid, @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); + Long countByRobotUidAndDateBetween(@Param("orgUid") String orgUid, @Param("robotUid") String robotUid, + @Param("startDate") ZonedDateTime startDate, @Param("endDate") ZonedDateTime endDate); /** * 查找在指定时间之前仍未发送任何访客消息(visitorMessageCount=0)的排队成员 @@ -62,25 +70,30 @@ public interface QueueMemberRepository extends JpaRepository findIdleBefore(@Param("threshold") ZonedDateTime threshold); - Optional findFirstByAgentQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc(String agentQueueUid, String status); + Optional findFirstByAgentQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc( + String agentQueueUid, String status); - @Lock(LockModeType.PESSIMISTIC_WRITE) - @Query("SELECT qm FROM QueueMemberEntity qm WHERE qm.agentQueue.uid = :agentQueueUid AND qm.deleted = false AND qm.status = :status ORDER BY qm.queueNumber ASC") - List findAgentQueueHeadForUpdate(@Param("agentQueueUid") String agentQueueUid, + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query("SELECT qm FROM QueueMemberEntity qm WHERE qm.agentQueue.uid = :agentQueueUid AND qm.deleted = false AND qm.status = :status ORDER BY qm.queueNumber ASC") + List findAgentQueueHeadForUpdate(@Param("agentQueueUid") String agentQueueUid, @Param("status") String status, Pageable pageable); - Optional findFirstByWorkgroupQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc(String workgroupQueueUid, String status); + Optional findFirstByWorkgroupQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc( + String workgroupQueueUid, String status); - Optional findFirstByRobotQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc(String robotQueueUid, String status); + Optional findFirstByRobotQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc( + String robotQueueUid, String status); - Page findByAgentQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc(String agentQueueUid, String status, Pageable pageable); + Page findByAgentQueue_UidAndDeletedFalseAndStatusOrderByQueueNumberAsc(String agentQueueUid, + String status, Pageable pageable); Optional findFirstByThreadUidAndDeletedFalseAndStatusIn(String threadUid, List statuses); @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("SELECT qm FROM QueueMemberEntity qm WHERE qm.thread.uid = :threadUid AND qm.deleted = false AND qm.status IN :statuses") - Optional findFirstByThreadUidAndDeletedFalseAndStatusInForUpdate(@Param("threadUid") String threadUid, @Param("statuses") List statuses); + Optional findFirstByThreadUidAndDeletedFalseAndStatusInForUpdate( + @Param("threadUid") String threadUid, @Param("statuses") List statuses); @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("SELECT COALESCE(MAX(qm.queueNumber), 0) FROM QueueMemberEntity qm WHERE qm.deleted = false AND ((:queueType = 'AGENT' AND qm.agentQueue = :queue) OR (:queueType = 'WORKGROUP' AND qm.workgroupQueue = :queue) OR (:queueType = 'ROBOT' AND qm.robotQueue = :queue))")