diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java index 5cd93fc..9bd9178 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/controller/ContestReviewController.java @@ -129,4 +129,12 @@ public class ContestReviewController { public Result> calculateFinalScore(@PathVariable Long workId) { return Result.success(contestReviewService.calculateFinalScore(workId)); } + + @GetMapping("/judge/contests/{contestId}/detail") + @RequirePermission("review:read") + @Operation(summary = "获取评委视角的赛事详情(含评审规则)") + public Result> getJudgeContestDetail(@PathVariable Long contestId) { + Long judgeId = SecurityUtil.getCurrentUserId(); + return Result.success(contestReviewService.getJudgeContestDetail(judgeId, contestId)); + } } diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestReviewService.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestReviewService.java index 23a4097..0c91c9e 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestReviewService.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/IContestReviewService.java @@ -31,4 +31,6 @@ public interface IContestReviewService { List> getWorkScores(Long workId); Map calculateFinalScore(Long workId); + + Map getJudgeContestDetail(Long judgeId, Long contestId); } diff --git a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java index ed5f202..938a4c9 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/review/service/impl/ContestReviewServiceImpl.java @@ -668,4 +668,51 @@ public class ContestReviewServiceImpl implements IContestReviewService { result.put("calculationRule", calculationRule); return result; } + + // ====== 评委赛事详情 ====== + + @Override + public Map getJudgeContestDetail(Long judgeId, Long contestId) { + log.info("获取评委赛事详情,评委ID:{},赛事ID:{}", judgeId, contestId); + + // 验证评委属于该赛事 + LambdaQueryWrapper judgeWrapper = new LambdaQueryWrapper<>(); + judgeWrapper.eq(BizContestJudge::getContestId, contestId); + judgeWrapper.eq(BizContestJudge::getJudgeId, judgeId); + judgeWrapper.eq(BizContestJudge::getValidState, 1); + if (judgeMapper.selectCount(judgeWrapper) == 0) { + throw BusinessException.of(ErrorCode.FORBIDDEN, "您不是该赛事的评委"); + } + + BizContest contest = contestMapper.selectById(contestId); + if (contest == null) { + throw BusinessException.of(ErrorCode.NOT_FOUND, "赛事不存在"); + } + + Map result = new LinkedHashMap<>(); + result.put("contestId", contest.getId()); + result.put("contestName", contest.getContestName()); + result.put("contestType", contest.getContestType()); + result.put("contestState", contest.getContestState()); + result.put("status", contest.getStatus()); + result.put("reviewStartTime", contest.getReviewStartTime()); + result.put("reviewEndTime", contest.getReviewEndTime()); + + // 评审规则(前端ReviewWorkModal需要此数据) + if (contest.getReviewRuleId() != null) { + BizContestReviewRule rule = reviewRuleMapper.selectById(contest.getReviewRuleId()); + if (rule != null) { + Map ruleMap = new LinkedHashMap<>(); + ruleMap.put("id", rule.getId()); + ruleMap.put("ruleName", rule.getRuleName()); + ruleMap.put("ruleDescription", rule.getRuleDescription()); + ruleMap.put("judgeCount", rule.getJudgeCount()); + ruleMap.put("dimensions", rule.getDimensions()); + ruleMap.put("calculationRule", rule.getCalculationRule()); + result.put("reviewRule", ruleMap); + } + } + + return result; + } } diff --git a/frontend/src/api/contests.ts b/frontend/src/api/contests.ts index ab1779a..d99b171 100644 --- a/frontend/src/api/contests.ts +++ b/frontend/src/api/contests.ts @@ -1242,6 +1242,14 @@ export const reviewsApi = { >(`/contests/reviews/judge/contests/${contestId}/works`, { params }); return response; }, + + // 获取评委视角的赛事详情(含评审规则) + getJudgeContestDetail: async (contestId: number): Promise => { + const response = await request.get( + `/contests/reviews/judge/contests/${contestId}/detail` + ); + return response; + }, }; // 公告管理 diff --git a/frontend/src/views/activities/components/ReviewWorkModal.vue b/frontend/src/views/activities/components/ReviewWorkModal.vue index 44e593d..fc96000 100644 --- a/frontend/src/views/activities/components/ReviewWorkModal.vue +++ b/frontend/src/views/activities/components/ReviewWorkModal.vue @@ -490,7 +490,7 @@ const fetchWorkDetail = async () => { // 获取活动的评审规则 if (props.contestId) { try { - const contest = await contestsApi.getDetail(props.contestId); + const contest = await reviewsApi.getJudgeContestDetail(props.contestId); if (contest.reviewRule) { // 确保 dimensions 是数组(可能是 JSON 字符串)