fix: 裁判长无限次修改总分功能优化
Some checks are pending
continuous-integration/drone/push Build is pending

- 使用 baseMapper.updateById() 绕过 Service 层状态检查
- 允许裁判长在原始计算总分 ±0.050 范围内无限次修改
- 每次修改都基于原始计算总分验证范围

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 23:37:39 +08:00
parent abb1391b2f
commit 4c93027028

View File

@@ -337,38 +337,47 @@ public class MartialScoreServiceImpl extends ServiceImpl<MartialScoreMapper, Mar
throw new ServiceException("修改后的分数必须在5.000-10.000之间"); throw new ServiceException("修改后的分数必须在5.000-10.000之间");
} }
// 3. 保存原始总分(用于记录和范围验证) // 3. 查找是否已存在裁判长的修改记录
BigDecimal originalTotalScore = athlete.getTotalScore();
// 4. 验证修改范围±0.050
if (originalTotalScore != null) {
BigDecimal minAllowed = originalTotalScore.subtract(new BigDecimal("0.050"));
BigDecimal maxAllowed = originalTotalScore.add(new BigDecimal("0.050"));
if (dto.getModifiedScore().compareTo(minAllowed) < 0 || dto.getModifiedScore().compareTo(maxAllowed) > 0) {
throw new ServiceException("修改分数只能在原始分数±0.050范围内");
}
}
// 5. 更新选手总分
athlete.setTotalScore(dto.getModifiedScore());
boolean athleteUpdated = athleteService.updateById(athlete);
// 6. 查找是否已存在裁判长的修改记录通过判断judge_name包含"裁判长修改"
LambdaQueryWrapper<MartialScore> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MartialScore> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MartialScore::getAthleteId, dto.getAthleteId()) queryWrapper.eq(MartialScore::getAthleteId, dto.getAthleteId())
.like(MartialScore::getJudgeName, "裁判长修改"); .like(MartialScore::getJudgeName, "裁判长修改");
MartialScore existingRecord = this.getOne(queryWrapper); 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; boolean recordSaved;
if (existingRecord != null) { if (existingRecord != null) {
// 7a. 更新现有的裁判长修改记录 // 7a. 更新现有的裁判长修改记录(保持原始计算总分不变)
existingRecord.setScore(dto.getModifiedScore()); existingRecord.setScore(dto.getModifiedScore());
existingRecord.setOriginalScore(originalTotalScore); // originalScore 保持不变,始终是系统计算的原始总分
existingRecord.setModifyReason(dto.getNote()); existingRecord.setModifyReason(dto.getNote());
existingRecord.setModifyTime(LocalDateTime.now()); existingRecord.setModifyTime(LocalDateTime.now());
recordSaved = this.updateById(existingRecord); // 直接使用 baseMapper.updateById 绕过 Service 层的状态检查,裁判长可以无限次修改
log.info("裁判长更新评分记录 - 选手ID:{}, 姓名:{}, 原始总分:{}, 修改后总分:{}, 修改原因:{}", recordSaved = this.baseMapper.updateById(existingRecord) > 0;
athlete.getId(), athlete.getPlayerName(), originalTotalScore, dto.getModifiedScore(), dto.getNote()); log.info("裁判长更新评分记录 - 选手ID:{}, 姓名:{}, 原始计算总分:{}, 修改后总分:{}, 修改原因:{}",
athlete.getId(), athlete.getPlayerName(), originalCalculatedScore, dto.getModifiedScore(), dto.getNote());
} else { } else {
// 7b. 创建新的裁判长修改记录 // 7b. 创建新的裁判长修改记录
MartialScore modificationRecord = new MartialScore(); MartialScore modificationRecord = new MartialScore();
@@ -377,7 +386,7 @@ public class MartialScoreServiceImpl extends ServiceImpl<MartialScoreMapper, Mar
modificationRecord.setProjectId(athlete.getProjectId()); modificationRecord.setProjectId(athlete.getProjectId());
modificationRecord.setJudgeId(dto.getModifierId()); modificationRecord.setJudgeId(dto.getModifierId());
modificationRecord.setScore(dto.getModifiedScore()); modificationRecord.setScore(dto.getModifiedScore());
modificationRecord.setOriginalScore(originalTotalScore); modificationRecord.setOriginalScore(originalCalculatedScore); // 保存原始计算总分
modificationRecord.setModifyReason(dto.getNote()); modificationRecord.setModifyReason(dto.getNote());
modificationRecord.setModifyTime(LocalDateTime.now()); modificationRecord.setModifyTime(LocalDateTime.now());
modificationRecord.setScoreTime(LocalDateTime.now()); modificationRecord.setScoreTime(LocalDateTime.now());
@@ -389,8 +398,8 @@ public class MartialScoreServiceImpl extends ServiceImpl<MartialScoreMapper, Mar
} }
recordSaved = this.save(modificationRecord); recordSaved = this.save(modificationRecord);
log.info("裁判长新增评分记录 - 选手ID:{}, 姓名:{}, 原始总分:{}, 修改后总分:{}, 修改原因:{}", log.info("裁判长新增评分记录 - 选手ID:{}, 姓名:{}, 原始计算总分:{}, 修改后总分:{}, 修改原因:{}",
athlete.getId(), athlete.getPlayerName(), originalTotalScore, dto.getModifiedScore(), dto.getNote()); athlete.getId(), athlete.getPlayerName(), originalCalculatedScore, dto.getModifiedScore(), dto.getNote());
} }
return athleteUpdated && recordSaved; return athleteUpdated && recordSaved;