Codex Assistant
14 小时以前 0a48616045ddce1562584543a0e89e5144051fde
backend/src/main/java/com/rongyichuang/judge/service/JudgeService.java
@@ -2,6 +2,7 @@
import com.rongyichuang.judge.dto.request.JudgeInput;
import com.rongyichuang.judge.dto.response.JudgeResponse;
import com.rongyichuang.judge.dto.response.JudgeStatsResponse;
import com.rongyichuang.judge.entity.Judge;
import com.rongyichuang.tag.entity.Tag;
import com.rongyichuang.judge.repository.JudgeRepository;
@@ -12,13 +13,15 @@
import com.rongyichuang.common.service.MediaService;
import com.rongyichuang.common.exception.BusinessException;
import com.rongyichuang.common.enums.MediaTargetType;
import com.rongyichuang.common.util.UserContextUtil;
import com.rongyichuang.tag.repository.TagRepository;
import com.rongyichuang.user.service.UserService;
import com.rongyichuang.user.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.slf4j.Logger;
@@ -39,18 +42,23 @@
    private final MediaRepository mediaRepository;
    private final MediaService mediaService;
    private final UserService userService;
    private final JdbcTemplate jdbcTemplate;
    private final UserContextUtil userContextUtil;
    
    @Value("${app.media-url}")
    private String mediaBaseUrl;
    public JudgeService(JudgeRepository judgeRepository, TagRepository tagRepository, 
                       MediaRepository mediaRepository, MediaService mediaService,
                       UserService userService) {
                       UserService userService, JdbcTemplate jdbcTemplate,
                       UserContextUtil userContextUtil) {
        this.judgeRepository = judgeRepository;
        this.tagRepository = tagRepository;
        this.mediaRepository = mediaRepository;
        this.mediaService = mediaService;
        this.userService = userService;
        this.jdbcTemplate = jdbcTemplate;
        this.userContextUtil = userContextUtil;
    }
    public List<JudgeResponse> findAll() {
@@ -71,6 +79,71 @@
                .orElse(null);
    }
    /**
     * 根据用户ID获取评委信息
     */
    public Judge findByUserId(Long userId) {
        Optional<Judge> judge = judgeRepository.findByUserId(userId);
        return judge.orElse(null);
    }
    /**
     * 获取当前评委的统计数据
     */
    public JudgeStatsResponse getJudgeStats() {
        log.info("获取评委统计数据");
        Long currentJudgeId = userContextUtil.getCurrentJudgeId();
        if (currentJudgeId == null) {
            throw new RuntimeException("当前用户不是评委,无法查询评审统计");
        }
        // 查询我未评审的数量
        String unReviewedSql = "SELECT COUNT(*) FROM t_activity_player ap " +
                              "WHERE EXISTS (" +
                              "  SELECT 1 FROM t_activity_judge aj " +
                              "  WHERE ap.activity_id = aj.activity_id " +
                              "  AND ap.stage_id = aj.stage_id " +
                              "  AND aj.judge_id = ? " +
                              ") " +
                              "AND NOT EXISTS (" +
                              "  SELECT 1 FROM t_activity_player_rating apr " +
                              "  WHERE ap.id = apr.activity_player_id " +
                              "  AND apr.judge_id = ? " +
                              "  AND apr.state = 1 " +
                              ") " +
                              "AND ap.state = 1";
        Integer unReviewedCount = jdbcTemplate.queryForObject(unReviewedSql, Integer.class, currentJudgeId, currentJudgeId);
        // 查询我已评审的数量
        String reviewedSql = "SELECT COUNT(*) FROM t_activity_player ap " +
                            "WHERE EXISTS (" +
                            "  SELECT 1 FROM t_activity_judge aj " +
                            "  WHERE ap.activity_id = aj.activity_id " +
                            "  AND ap.stage_id = aj.stage_id " +
                            "  AND aj.judge_id = ? " +
                            ") " +
                            "AND EXISTS (" +
                            "  SELECT 1 FROM t_activity_player_rating apr " +
                            "  WHERE ap.id = apr.activity_player_id " +
                            "  AND apr.judge_id = ? " +
                            "  AND apr.state = 1 " +
                            ") " +
                            "AND ap.state = 1";
        Integer reviewedCount = jdbcTemplate.queryForObject(reviewedSql, Integer.class, currentJudgeId, currentJudgeId);
        // 计算总数
        Integer totalCount = (unReviewedCount != null ? unReviewedCount : 0) + (reviewedCount != null ? reviewedCount : 0);
        log.info("评委统计数据 - 待评审: {}, 已评审: {}, 总数: {}", unReviewedCount, reviewedCount, totalCount);
        return new JudgeStatsResponse(
            unReviewedCount != null ? unReviewedCount : 0,
            reviewedCount != null ? reviewedCount : 0,
            totalCount
        );
    }
    @Transactional
    public JudgeResponse save(JudgeInput input) {
        Judge judge;