fix:参赛者id逻辑更改
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,3 +18,4 @@
|
|||||||
</mapper>
|
</mapper>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user