diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialScoreServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScoreServiceImpl.java index 0d2d643..ca48581 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialScoreServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialScoreServiceImpl.java @@ -337,38 +337,47 @@ public class MartialScoreServiceImpl extends ServiceImpl 0) { - throw new ServiceException("修改分数只能在原始分数±0.050范围内"); - } - } - - // 5. 更新选手总分 - athlete.setTotalScore(dto.getModifiedScore()); - boolean athleteUpdated = athleteService.updateById(athlete); - - // 6. 查找是否已存在裁判长的修改记录(通过判断judge_name包含"裁判长修改") + // 3. 查找是否已存在裁判长的修改记录 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(MartialScore::getAthleteId, dto.getAthleteId()) .like(MartialScore::getJudgeName, "裁判长修改"); MartialScore existingRecord = this.getOne(queryWrapper); + // 4. 确定原始计算总分(用于范围验证) + // 如果已有修改记录,使用记录中保存的原始分数;否则使用当前总分 + BigDecimal originalCalculatedScore; + if (existingRecord != null && existingRecord.getOriginalScore() != null) { + // 已有修改记录,使用记录中的原始计算总分 + originalCalculatedScore = existingRecord.getOriginalScore(); + } else { + // 首次修改,当前总分就是原始计算总分 + originalCalculatedScore = athlete.getTotalScore(); + } + + // 5. 验证修改范围(基于原始计算总分±0.050) + if (originalCalculatedScore != null) { + BigDecimal minAllowed = originalCalculatedScore.subtract(new BigDecimal("0.050")); + BigDecimal maxAllowed = originalCalculatedScore.add(new BigDecimal("0.050")); + if (dto.getModifiedScore().compareTo(minAllowed) < 0 || dto.getModifiedScore().compareTo(maxAllowed) > 0) { + throw new ServiceException("修改分数只能在原始计算总分(" + originalCalculatedScore + ")±0.050范围内"); + } + } + + // 6. 更新选手总分 + athlete.setTotalScore(dto.getModifiedScore()); + boolean athleteUpdated = athleteService.updateById(athlete); + boolean recordSaved; if (existingRecord != null) { - // 7a. 更新现有的裁判长修改记录 + // 7a. 更新现有的裁判长修改记录(保持原始计算总分不变) existingRecord.setScore(dto.getModifiedScore()); - existingRecord.setOriginalScore(originalTotalScore); + // originalScore 保持不变,始终是系统计算的原始总分 existingRecord.setModifyReason(dto.getNote()); existingRecord.setModifyTime(LocalDateTime.now()); - recordSaved = this.updateById(existingRecord); - log.info("裁判长更新评分记录 - 选手ID:{}, 姓名:{}, 原始总分:{}, 修改后总分:{}, 修改原因:{}", - athlete.getId(), athlete.getPlayerName(), originalTotalScore, dto.getModifiedScore(), dto.getNote()); + // 直接使用 baseMapper.updateById 绕过 Service 层的状态检查,裁判长可以无限次修改 + recordSaved = this.baseMapper.updateById(existingRecord) > 0; + log.info("裁判长更新评分记录 - 选手ID:{}, 姓名:{}, 原始计算总分:{}, 修改后总分:{}, 修改原因:{}", + athlete.getId(), athlete.getPlayerName(), originalCalculatedScore, dto.getModifiedScore(), dto.getNote()); } else { // 7b. 创建新的裁判长修改记录 MartialScore modificationRecord = new MartialScore(); @@ -377,7 +386,7 @@ public class MartialScoreServiceImpl extends ServiceImpl