fix:修复评委打分403

This commit is contained in:
zhonghua 2026-04-07 17:48:48 +08:00
parent f2c10d5e32
commit 1d43501983
5 changed files with 66 additions and 1 deletions

View File

@ -129,4 +129,12 @@ public class ContestReviewController {
public Result<Map<String, Object>> calculateFinalScore(@PathVariable Long workId) {
return Result.success(contestReviewService.calculateFinalScore(workId));
}
@GetMapping("/judge/contests/{contestId}/detail")
@RequirePermission("review:read")
@Operation(summary = "获取评委视角的赛事详情(含评审规则)")
public Result<Map<String, Object>> getJudgeContestDetail(@PathVariable Long contestId) {
Long judgeId = SecurityUtil.getCurrentUserId();
return Result.success(contestReviewService.getJudgeContestDetail(judgeId, contestId));
}
}

View File

@ -31,4 +31,6 @@ public interface IContestReviewService {
List<Map<String, Object>> getWorkScores(Long workId);
Map<String, Object> calculateFinalScore(Long workId);
Map<String, Object> getJudgeContestDetail(Long judgeId, Long contestId);
}

View File

@ -668,4 +668,51 @@ public class ContestReviewServiceImpl implements IContestReviewService {
result.put("calculationRule", calculationRule);
return result;
}
// ====== 评委赛事详情 ======
@Override
public Map<String, Object> getJudgeContestDetail(Long judgeId, Long contestId) {
log.info("获取评委赛事详情评委ID{}赛事ID{}", judgeId, contestId);
// 验证评委属于该赛事
LambdaQueryWrapper<BizContestJudge> 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<String, Object> 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<String, Object> 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;
}
}

View File

@ -1242,6 +1242,14 @@ export const reviewsApi = {
>(`/contests/reviews/judge/contests/${contestId}/works`, { params });
return response;
},
// 获取评委视角的赛事详情(含评审规则)
getJudgeContestDetail: async (contestId: number): Promise<any> => {
const response = await request.get<any, any>(
`/contests/reviews/judge/contests/${contestId}/detail`
);
return response;
},
};
// 公告管理

View File

@ -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