- 使用 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:
@@ -337,38 +337,47 @@ public class MartialScoreServiceImpl extends ServiceImpl<MartialScoreMapper, Mar
|
||||
throw new ServiceException("修改后的分数必须在5.000-10.000之间");
|
||||
}
|
||||
|
||||
// 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包含"裁判长修改")
|
||||
// 3. 查找是否已存在裁判长的修改记录
|
||||
LambdaQueryWrapper<MartialScore> 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<MartialScoreMapper, Mar
|
||||
modificationRecord.setProjectId(athlete.getProjectId());
|
||||
modificationRecord.setJudgeId(dto.getModifierId());
|
||||
modificationRecord.setScore(dto.getModifiedScore());
|
||||
modificationRecord.setOriginalScore(originalTotalScore);
|
||||
modificationRecord.setOriginalScore(originalCalculatedScore); // 保存原始计算总分
|
||||
modificationRecord.setModifyReason(dto.getNote());
|
||||
modificationRecord.setModifyTime(LocalDateTime.now());
|
||||
modificationRecord.setScoreTime(LocalDateTime.now());
|
||||
@@ -389,8 +398,8 @@ public class MartialScoreServiceImpl extends ServiceImpl<MartialScoreMapper, Mar
|
||||
}
|
||||
|
||||
recordSaved = this.save(modificationRecord);
|
||||
log.info("裁判长新增评分记录 - 选手ID:{}, 姓名:{}, 原始总分:{}, 修改后总分:{}, 修改原因:{}",
|
||||
athlete.getId(), athlete.getPlayerName(), originalTotalScore, dto.getModifiedScore(), dto.getNote());
|
||||
log.info("裁判长新增评分记录 - 选手ID:{}, 姓名:{}, 原始计算总分:{}, 修改后总分:{}, 修改原因:{}",
|
||||
athlete.getId(), athlete.getPlayerName(), originalCalculatedScore, dto.getModifiedScore(), dto.getNote());
|
||||
}
|
||||
|
||||
return athleteUpdated && recordSaved;
|
||||
|
||||
Reference in New Issue
Block a user