Codex Assistant
2 天以前 ba94ceae1315174798ae1967ef62268c6d16cd5b
backend/src/main/java/com/rongyichuang/player/repository/ActivityPlayerRepository.java
@@ -8,6 +8,7 @@
import java.util.List;
import java.util.Optional;
import java.time.LocalDateTime;
/**
 * 活动选手Repository接口
@@ -26,9 +27,9 @@
    List<ActivityPlayer> findByPlayerId(Long playerId);
    /**
     * 根据活动ID和选手ID查找参赛记录
     * 根据活动ID和选手ID查找参赛记录列表,按创建时间降序排序
     */
    Optional<ActivityPlayer> findByActivityIdAndPlayerId(Long activityId, Long playerId);
    List<ActivityPlayer> findByActivityIdAndPlayerIdOrderByCreateTimeDesc(Long activityId, Long playerId);
    /**
     * 根据阶段ID查找参赛选手
@@ -51,9 +52,9 @@
    List<ActivityPlayer> findByState(Integer state);
    /**
     * 查找活动的参赛选手数量
     * 根据活动ID统计参赛选手数量(包括未审核和审核通过的,排除审核驳回的)
     */
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.state = 1")
    @Query("SELECT COUNT(ap) FROM ActivityPlayer ap WHERE ap.activityId = :activityId AND ap.state IN (0, 1)")
    Long countByActivityId(@Param("activityId") Long activityId);
    /**
@@ -90,7 +91,69 @@
    List<ActivityPlayer> findTopRankedPlayers(@Param("activityId") Long activityId);
    /**
     * 根据状态统计报名数量
     * 统计最近报名趋势(仅第一阶段,state包含待审核与通过)
     */
    @Query(value = "SELECT DATE(ap.create_time) AS signup_date, COUNT(*) AS total " +
            "FROM t_activity_player ap " +
            "JOIN t_activity stage ON stage.id = ap.stage_id " +
            "WHERE stage.sort_order = 1 AND stage.state = 1 " +
            "  AND ap.state IN (0, 1) " +
            "  AND ap.create_time >= :startDate " +
            "GROUP BY DATE(ap.create_time) " +
            "ORDER BY signup_date", nativeQuery = true)
    List<Object[]> countFirstStageRegistrationsByDate(@Param("startDate") LocalDateTime startDate);
    /**
     * 统计各区域报名数量(仅第一阶段,state包含待审核与通过)
     */
    @Query(value = "SELECT ap.region_id, r.name, r.leaf_flag, COUNT(*) AS total " +
            "FROM t_activity_player ap " +
            "JOIN t_activity stage ON stage.id = ap.stage_id " +
            "LEFT JOIN t_region r ON r.id = ap.region_id " +
            "WHERE stage.sort_order = 1 AND stage.state = 1 " +
            "  AND ap.state IN (0, 1) " +
            "GROUP BY ap.region_id, r.name, r.leaf_flag " +
            "ORDER BY total DESC", nativeQuery = true)
    List<Object[]> countFirstStageRegistrationsByRegion();
    /**
     * 统计指定状态的参赛选手数量
     */
    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);
}