fix:参赛者id逻辑更改

This commit is contained in:
litianxiang
2026-02-04 17:20:22 +08:00
parent f2d43f06f4
commit 1ec42f4ad5
2 changed files with 54 additions and 29 deletions

View File

@@ -158,34 +158,59 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
if (existing == null) { if (existing == null) {
// 由数据库自增分配 contestant_number(请确保数据库列为 AUTO_INCREMENT // 通过行锁 + 重试机制保证 contestant_number 在并发下自增分配
Contestant toInsert = Contestant.builder() final int maxAttempts = 5;
.email(request.getEmail()) for (int attempt = 1; attempt <= maxAttempts; attempt++) {
.firstName(request.getFirstName()) try {
.lastName(request.getLastName()) // 获取当前最大 contestant_number 并加行锁LIMIT 1 FOR UPDATE
.gender(request.getGender()) QueryWrapper<Contestant> qMax = new QueryWrapper<>();
.occupation(request.getOccupation()) qMax.isNotNull("contestant_number");
.age(request.getAge()) qMax.orderByDesc("contestant_number");
.countryRegionCity(request.getCountryRegionCity()) qMax.last("LIMIT 1 FOR UPDATE");
.phoneNumber(request.getPhoneNumber()) Contestant last = contestantMapper.selectOne(qMax);
.designTitle(request.getDesignTitle()) Integer nextNumber = (last == null || last.getContestantNumber() == null) ? 10000 : last.getContestantNumber() + 1;
.designDescription(request.getDesignDescription())
.pdfPath(request.getPdfPath()) Contestant toInsert = Contestant.builder()
.videoPath(request.getVideoPath()) .email(request.getEmail())
.videoDuration(request.getVideoDuration()) .firstName(request.getFirstName())
.videoSize(request.getVideoSize()) .lastName(request.getLastName())
.pdfSize(request.getPdfSize()) .gender(request.getGender())
.createdAt(now) .occupation(request.getOccupation())
.updatedAt(now) .age(request.getAge())
.build(); .countryRegionCity(request.getCountryRegionCity())
contestantMapper.insert(toInsert); .phoneNumber(request.getPhoneNumber())
// 重新查询以获取数据库分配的 contestant_number .designTitle(request.getDesignTitle())
Contestant saved = contestantMapper.selectById(toInsert.getId()); .designDescription(request.getDesignDescription())
Integer assignedNumber = (saved == null) ? null : saved.getContestantNumber(); .pdfPath(request.getPdfPath())
resp.put("success", true); .videoPath(request.getVideoPath())
resp.put("contestant_number", assignedNumber); .videoDuration(request.getVideoDuration())
sendSiteMsg(toInsert.getId(), toInsert.getEmail()); .videoSize(request.getVideoSize())
return resp; .pdfSize(request.getPdfSize())
.contestantNumber(nextNumber)
.createdAt(now)
.updatedAt(now)
.build();
contestantMapper.insert(toInsert);
resp.put("success", true);
sendSiteMsg(toInsert.getId(), toInsert.getEmail());
return resp;
} catch (Exception e) {
log.warn("Attempt {} to assign contestant_number failed", attempt, e);
String msg = e.getMessage() == null ? "" : e.getMessage().toLowerCase();
if ((msg.contains("duplicate") || msg.contains("uniq_contestant_number") || msg.contains("contestant_number")) && attempt < maxAttempts) {
try {
Thread.sleep(100L);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
continue;
}
throw e;
}
}
throw new BusinessException("Failed to assign contestant number after retries.");
} else { } else {
// update existing contestant // update existing contestant
existing.setFirstName(request.getFirstName()); existing.setFirstName(request.getFirstName());
@@ -205,7 +230,6 @@ public class GlobalAwardServiceImpl implements GlobalAwardService {
existing.setUpdatedAt(now); existing.setUpdatedAt(now);
contestantMapper.updateById(existing); contestantMapper.updateById(existing);
resp.put("success", true); resp.put("success", true);
resp.put("contestant_number", existing.getContestantNumber());
return resp; return resp;
} }
} }

View File

@@ -18,3 +18,4 @@
</mapper> </mapper>