lrj
4 小时以前 8337c34fcc761d07acaad796d10f3e12e9bbe2d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.rongyichuang.player.repository;
 
import com.rongyichuang.player.entity.ActivityPlayer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
 
import java.util.List;
import java.util.Optional;
 
/**
 * 活动选手Repository接口
 */
@Repository
public interface ActivityPlayerRepository extends JpaRepository<ActivityPlayer, Long> {
 
    /**
     * 根据活动ID查找参赛选手
     */
    List<ActivityPlayer> findByActivityId(Long activityId);
 
    /**
     * 根据选手ID查找参赛记录
     */
    List<ActivityPlayer> findByPlayerId(Long playerId);
 
    /**
     * 根据活动ID和选手ID查找参赛记录列表,按创建时间降序排序
     */
    List<ActivityPlayer> findByActivityIdAndPlayerIdOrderByCreateTimeDesc(Long activityId, Long playerId);
 
    /**
     * 根据阶段ID查找参赛选手
     */
    List<ActivityPlayer> findByStageId(Long stageId);
 
    /**
     * 根据区域ID查找参赛选手
     */
    List<ActivityPlayer> findByRegionId(Long regionId);
 
    /**
     * 根据活动ID和区域ID查找参赛选手
     */
    List<ActivityPlayer> findByActivityIdAndRegionId(Long activityId, Long regionId);
 
    /**
     * 根据状态查找参赛选手
     */
    List<ActivityPlayer> findByState(Integer state);
 
    /**
     * 根据活动ID统计参赛选手数量(包括未审核和审核通过的,排除审核驳回的)
     */
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.state IN (0, 1)")
    Long countByActivityId(@Param("activityId") Long activityId);
 
    /**
     * 查找区域的参赛选手数量
     */
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.regionId = :regionId AND ap.state = 1")
    Long countByRegionId(@Param("regionId") Long regionId);
 
    /**
     * 根据活动ID查找参赛选手,包含选手和区域信息
     */
    @Query("SELECT ap FROM ActivityPlayer ap " +
           "LEFT JOIN FETCH ap.player p " +
           "LEFT JOIN FETCH ap.region r " +
           "WHERE ap.activityId = :activityId AND ap.state = 1 " +
           "ORDER BY ap.createTime DESC")
    List<ActivityPlayer> findByActivityIdWithPlayerAndRegion(@Param("activityId") Long activityId);
 
    /**
     * 根据区域统计各活动的参赛人数
     */
    @Query("SELECT ap.activityId, ap.regionId, COUNT(ap) " +
           "FROM ActivityPlayer ap " +
           "WHERE ap.state = 1 " +
           "GROUP BY ap.activityId, ap.regionId")
    List<Object[]> countByActivityAndRegion();
 
    /**
     * 查找排名前N的选手
     */
    @Query("SELECT ap FROM ActivityPlayer ap " +
           "WHERE ap.activityId = :activityId AND ap.state = 1 AND ap.rank IS NOT NULL " +
           "ORDER BY ap.rank ASC")
    List<ActivityPlayer> findTopRankedPlayers(@Param("activityId") Long activityId);
 
    /**
     * 统计指定状态的参赛选手数量
     */
    long countByState(Integer state);
 
    /**
     * 根据阶段ID和状态统计参赛选手数量
     */
    Long countByStageIdAndState(Long stageId, Integer state);
 
    /**
     * 根据活动ID和状态统计参赛选手数量
     */
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.state = :state")
    Long countByActivityIdAndState(@Param("activityId") Long activityId, @Param("state") Integer state);
 
    /**
     * 统计同一活动+同一选手的有效报名数量(state IN (0,1))
     */
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.playerId = :playerId AND ap.state IN (0, 1)")
    Long countActiveOrPendingByActivityAndPlayer(@Param("activityId") Long activityId, @Param("playerId") Long playerId);
 
    /**
     * 根据阶段ID和状态查找参赛选手(包含选手信息)
     */
    @Query("SELECT ap FROM ActivityPlayer ap " +
           "LEFT JOIN FETCH ap.player p " +
           "WHERE ap.stageId = :stageId AND ap.state = :state " +
           "ORDER BY ap.createTime DESC")
    List<ActivityPlayer> findByStageIdAndStateWithPlayerOrderByCreateTimeDesc(@Param("stageId") Long stageId, @Param("state") Integer state);
 
    /**
     * 检查选手是否已在指定阶段报名
     */
    boolean existsByStageIdAndPlayerId(Long stageId, Long playerId);
 
    /**
     * 根据阶段和选手查询报名记录
     */
    Optional<ActivityPlayer> findByStageIdAndPlayerId(Long stageId, Long playerId);
}