From 4c93027028bc960fa907a936169e493ef2a1b7b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Tue, 23 Dec 2025 23:37:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A3=81=E5=88=A4=E9=95=BF=E6=97=A0?= =?UTF-8?q?=E9=99=90=E6=AC=A1=E4=BF=AE=E6=94=B9=E6=80=BB=E5=88=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 baseMapper.updateById() 绕过 Service 层状态检查 - 允许裁判长在原始计算总分 ±0.050 范围内无限次修改 - 每次修改都基于原始计算总分验证范围 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../service/impl/MartialScoreServiceImpl.java | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) 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