fix: 防止重复报名 - 个人项目和集体项目都添加重复检查

- 个人项目:检测到重复报名时返回错误而非更新
- 集体项目:添加重复报名检查
- 新增 /martial/athlete/registered API 用于查询已报名选手

Closes #3
This commit is contained in:
2026-01-15 15:56:29 +08:00
parent c6bf0d3404
commit b9d1d2987e
10 changed files with 39 additions and 7 deletions
@@ -1,5 +1,7 @@
package org.springblade.modules.martial.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qiniu.util.Auth;
import io.swagger.v3.oas.annotations.Operation;
@@ -106,4 +108,25 @@ public class MartialAthleteController extends BladeController {
return R.success("状态更新成功");
}
/**
* 获取已报名选手列表(用于检查重复报名)
*/
@GetMapping("/registered")
@Operation(summary = "获取已报名选手", description = "查询指定赛事和项目的已报名选手")
public R<List<MartialAthlete>> getRegisteredAthletes(
@RequestParam Long competitionId,
@RequestParam(required = false) String projectIds) {
LambdaQueryWrapper<MartialAthlete> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MartialAthlete::getCompetitionId, competitionId)
.eq(MartialAthlete::getIsDeleted, 0)
.eq(MartialAthlete::getRegistrationStatus, 1);
if (Func.isNotBlank(projectIds)) {
wrapper.in(MartialAthlete::getProjectId, Func.toLongList(projectIds));
}
List<MartialAthlete> list = athleteService.list(wrapper);
return R.data(list);
}
}
@@ -329,6 +329,19 @@ public class MartialRegistrationOrderController extends BladeController {
// Create a record for each project
for (Long projectId : projectIds) {
// Check if team already registered for this project
LambdaQueryWrapper<MartialAthlete> teamCheckWrapper = new LambdaQueryWrapper<>();
teamCheckWrapper.eq(MartialAthlete::getCompetitionId, dto.getCompetitionId())
.eq(MartialAthlete::getProjectId, projectId)
.eq(MartialAthlete::getTeamName, team.getTeamName())
.eq(MartialAthlete::getIsDeleted, 0);
MartialAthlete existingTeamRecord = athleteService.getOne(teamCheckWrapper, false);
if (existingTeamRecord != null) {
log.warn("集体重复报名: teamName={}, projectId={}", team.getTeamName(), projectId);
return R.fail("集体 " + team.getTeamName() + " 已报名该项目,请勿重复报名");
}
MartialAthlete teamAthlete = new MartialAthlete();
teamAthlete.setOrderId(orderId);
teamAthlete.setCompetitionId(dto.getCompetitionId());
@@ -368,13 +381,9 @@ public class MartialRegistrationOrderController extends BladeController {
MartialAthlete existingRecord = athleteService.getOne(checkWrapper, false);
if (existingRecord != null) {
// Update existing record with order info
existingRecord.setOrderId(orderId);
existingRecord.setRegistrationStatus(1);
existingRecord.setUpdateUser(AuthUtil.getUserId());
existingRecord.setUpdateTime(new java.util.Date());
athleteService.updateById(existingRecord);
log.info("更新已存在的选手参赛记录: playerName={}, projectId={}", existingAthlete.getPlayerName(), projectId);
// Reject duplicate registration
log.warn("选手重复报名: playerName={}, projectId={}", existingAthlete.getPlayerName(), projectId);
return R.fail("选手 " + existingAthlete.getPlayerName() + " 已报名该项目,请勿重复报名");
} else {
// Create new record
MartialAthlete newRecord = new MartialAthlete();