lrj
17 小时以前 bec58fa7fe4fae2deac88200d8d939e12ec8a08f
backend/src/main/java/com/rongyichuang/player/service/ActivityPlayerService.java
@@ -18,6 +18,7 @@
import com.rongyichuang.user.service.UserService;
import com.rongyichuang.media.service.MediaV2Service;
import com.rongyichuang.media.dto.MediaSaveInput;
import com.rongyichuang.message.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -58,8 +59,26 @@
    @Autowired
    private MediaV2Service mediaV2Service;
    @Autowired
    private MessageService messageService;
    public ActivityPlayer getMyActivityPlayer(Long activityId) {
        Long userId = userContextUtil.getCurrentUserId();
        if (userId == null) {
            return null;
        }
        Optional<Player> playerOpt = playerRepository.findByUserId(userId);
        if (playerOpt.isEmpty()) {
            return null;
        }
        Player player = playerOpt.get();
        List<ActivityPlayer> activityPlayers = activityPlayerRepository.findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId());
        if (activityPlayers.isEmpty()) {
            return null;
        }
        return activityPlayers.get(0);
    }
    /**
     * 提交活动报名
     * @param input 报名输入信息
@@ -94,28 +113,24 @@
            }
            log.info("选手记录处理成功,选手ID: {}", player.getId());
            // 3. 检查是否已经报名
            log.info("检查是否已经报名,活动ID: {}, 选手ID: {}", input.getActivityId(), player.getId());
            Optional<ActivityPlayer> existingRegistration = activityPlayerRepository
                    .findByActivityIdAndPlayerId(input.getActivityId(), player.getId());
            if (existingRegistration.isPresent()) {
                log.warn("选手已经报名过此活动");
                return ActivityRegistrationResponse.error("您已经报名过此活动");
            // 3. 检查是否已经报名(严格限定同一活动+同一选手)
            log.info("检查是否存在有效报名(state IN 0,1),活动ID: {}, 选手ID: {}", input.getActivityId(), player.getId());
            Long activeOrPendingCount = activityPlayerRepository.countActiveOrPendingByActivityAndPlayer(input.getActivityId(), player.getId());
            if (activeOrPendingCount != null && activeOrPendingCount > 0) {
                log.warn("同一活动与选手存在待审核或已通过的报名记录,禁止重复提交。count={}", activeOrPendingCount);
                return ActivityRegistrationResponse.error("您在该活动已有待审核或已通过的报名,请勿重复提交");
            }
            log.info("未发现重复报名");
            log.info("未发现有效报名,允许创建新的报名记录。");
            // 4. 查找第一阶段,如果没有则使用活动本身
            // 4. 查找第一阶段(严格:pid=活动ID 且 sort_order=1),未配置则拒绝报名
            log.info("查找活动的第一阶段,活动ID: {}", input.getActivityId());
            Activity firstStage = activityRepository.findFirstStageByActivityId(input.getActivityId());
            Long stageId;
            if (firstStage != null) {
                stageId = firstStage.getId();
                log.info("找到第一阶段,阶段ID: {}, 阶段名称: {}", firstStage.getId(), firstStage.getName());
            } else {
                // 如果没有找到第一阶段,使用活动本身作为阶段
                stageId = input.getActivityId();
                log.info("未找到第一阶段,使用活动本身作为阶段,活动ID: {}", input.getActivityId());
            if (firstStage == null) {
                log.warn("未找到第一阶段(pid={}, sort_order=1),拒绝报名。活动ID: {}", input.getActivityId(), input.getActivityId());
                return ActivityRegistrationResponse.error("活动未配置第一阶段,无法报名");
            }
            Long stageId = firstStage.getId();
            log.info("找到第一阶段,阶段ID: {}, 阶段名称: {}", firstStage.getId(), firstStage.getName());
            // 5. 创建报名记录
            log.info("开始创建报名记录");
@@ -318,16 +333,17 @@
            Player player = playerOpt.get();
            
            // 查找该玩家在指定活动中的报名记录
            Optional<ActivityPlayer> activityPlayerOpt = activityPlayerRepository
                    .findByActivityIdAndPlayerId(activityId, player.getId());
            // 查找该玩家在指定活动中的报名记录(获取最新的)
            List<ActivityPlayer> activityPlayers = activityPlayerRepository
                    .findByActivityIdAndPlayerIdOrderByCreateTimeDesc(activityId, player.getId());
            
            if (!activityPlayerOpt.isPresent()) {
            if (activityPlayers.isEmpty()) {
                log.info("玩家 {} 未在活动 {} 中报名", player.getId(), activityId);
                return null;
            }
            ActivityPlayer activityPlayer = activityPlayerOpt.get();
            // 获取最新的报名记录
            ActivityPlayer activityPlayer = activityPlayers.get(0);
            
            // 构建响应对象
            PlayerRegistrationResponse response = new PlayerRegistrationResponse();
@@ -362,6 +378,13 @@
            activityPlayer.setFeedback(feedback);
            activityPlayerRepository.save(activityPlayer);
            // 创建审核通过消息
            messageService.createApprovalMessage(
                activityPlayerId,
                activityPlayer.getPlayerId(),
                activityPlayer.getProjectName()
            );
            log.info("审核通过成功,activityPlayerId: {}", activityPlayerId);
            return true;
        } catch (Exception e) {
@@ -385,6 +408,13 @@
            activityPlayer.setFeedback(feedback);
            activityPlayerRepository.save(activityPlayer);
            // 创建审核驳回消息
            messageService.createRejectionMessage(
                activityPlayerId,
                activityPlayer.getPlayerId(),
                activityPlayer.getProjectName()
            );
            log.info("审核驳回成功,activityPlayerId: {}", activityPlayerId);
            return true;
        } catch (Exception e) {