|
|
@@ -513,77 +513,31 @@ public class IEnrollServiceImpl implements IEnrollService {
|
|
|
AtomicInteger currentNumber;
|
|
|
boolean isNewTeam = false;
|
|
|
String numberRange = "";
|
|
|
+ boolean needUpdateNumberRange = false;
|
|
|
|
|
|
// 判断队伍是否已存在
|
|
|
- if (existingTeamMap.containsKey(teamName)) {
|
|
|
- // 队伍已存在,使用现有队伍的号码段
|
|
|
- GameTeam existingTeam = existingTeamMap.get(teamName);
|
|
|
+ GameTeam existingTeam = existingTeamMap.get(teamName);
|
|
|
+ if (existingTeam != null) {
|
|
|
+ // 队伍已存在
|
|
|
teamId = existingTeam.getTeamId();
|
|
|
numberRange = existingTeam.getNumberRange();
|
|
|
|
|
|
- try {
|
|
|
- // 尝试查询该队伍的最大队员编号
|
|
|
- String maxNumberStr = gameAthleteService.queryMaxNumber(teamId);
|
|
|
- Integer maxNumber = Integer.valueOf(maxNumberStr);
|
|
|
-
|
|
|
- // 如果最大编号为0,说明队伍实际上没有队员,从号码段起始开始
|
|
|
- if (maxNumber == 0) {
|
|
|
- String[] rangeParts = numberRange.split("-");
|
|
|
- int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
- currentNumber = new AtomicInteger(startNumber);
|
|
|
- } else {
|
|
|
- // 成功获取到有效编号,续着分配
|
|
|
- currentNumber = new AtomicInteger(maxNumber + 1);
|
|
|
- }
|
|
|
- } catch (NumberFormatException e) {
|
|
|
- log.warn("解析队伍{}的号码段失败: {},从号码段起始开始分配", teamName, numberRange, e);
|
|
|
- String[] rangeParts = numberRange.split("-");
|
|
|
- int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
- currentNumber = new AtomicInteger(startNumber);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("查询队伍{}的最大队员编号时发生异常", teamName, e);
|
|
|
- String[] rangeParts = numberRange.split("-");
|
|
|
- int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
- currentNumber = new AtomicInteger(startNumber);
|
|
|
+ // 检查号码段是否为空或无效
|
|
|
+ if (StringUtils.isBlank(numberRange) || !isValidNumberRange(numberRange)) {
|
|
|
+ log.warn("队伍{}存在但号码段为空或无效: {},将为队伍生成新的号码段", teamName, numberRange);
|
|
|
+ numberRange = generateOrGetNumberRange(athletes, eventId, teamId, dataList.size(), teamIndexCounter);
|
|
|
+ currentNumber = initializeCurrentNumber(numberRange, teamId, teamName);
|
|
|
+ needUpdateNumberRange = true;
|
|
|
+ } else {
|
|
|
+ // 号码段有效,使用现有号码段
|
|
|
+ currentNumber = getCurrentNumberFromExistingTeam(numberRange, teamId, teamName);
|
|
|
}
|
|
|
} else {
|
|
|
- // 队伍不存在,创建新队伍并分配新的300号码段
|
|
|
+ // 队伍不存在,创建新队伍
|
|
|
isNewTeam = true;
|
|
|
teamId = snowflake.nextId();
|
|
|
-
|
|
|
- // 检查是否有填写的号码
|
|
|
- List<String> providedCodes = athletes.stream()
|
|
|
- .map(EnrollProjectVo::getAthleteCode)
|
|
|
- .filter(StringUtils::isNotBlank)
|
|
|
- .map(code -> code.trim())
|
|
|
- .filter(code -> StringUtils.isNotBlank(code))
|
|
|
- .collect(Collectors.toList());
|
|
|
-
|
|
|
- if (!providedCodes.isEmpty()) {
|
|
|
- // 有填写的号码,使用ASCII值比较来确定号码段
|
|
|
- numberRange = generateCustomNumberRangeWithChars(providedCodes, eventId, null);
|
|
|
-
|
|
|
- if (numberRange != null) {
|
|
|
- // 成功生成自定义号码段
|
|
|
- currentNumber = null; // 对于字符号码,不使用数字计数器
|
|
|
- log.info("队伍 {} 使用自定义字符号码段: {}", teamName, numberRange);
|
|
|
- } else {
|
|
|
- // 生成失败,使用默认方式
|
|
|
- int teamIndex = teamIndexCounter.getAndIncrement();
|
|
|
- numberRange = generateNumberRange(dataList.size(), teamIndex);
|
|
|
- String[] rangeParts = numberRange.split("-");
|
|
|
- int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
- currentNumber = new AtomicInteger(startNumber);
|
|
|
- log.warn("队伍 {} 自定义号码段生成失败,使用默认号码段: {}", teamName, numberRange);
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 没有填写的号码,使用默认的300号码段
|
|
|
- int teamIndex = teamIndexCounter.getAndIncrement();
|
|
|
- numberRange = generateNumberRange(dataList.size(), teamIndex);
|
|
|
- String[] rangeParts = numberRange.split("-");
|
|
|
- int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
- currentNumber = new AtomicInteger(startNumber);
|
|
|
- }
|
|
|
+ numberRange = generateOrGetNumberRange(athletes, eventId, null, dataList.size(), teamIndexCounter);
|
|
|
+ currentNumber = initializeCurrentNumber(numberRange, null, teamName);
|
|
|
}
|
|
|
|
|
|
// 保存队员信息
|
|
|
@@ -609,7 +563,11 @@ public class IEnrollServiceImpl implements IEnrollService {
|
|
|
gameTeamService.insertByBo(gameTeamBo);
|
|
|
} else {
|
|
|
// 更新现有队伍的队员列表和数量
|
|
|
- updateExistingTeam(teamId, athletesId, athletes.size());
|
|
|
+ if (needUpdateNumberRange) {
|
|
|
+ updateExistingTeamWithNumberRange(teamId, athletesId, athletes.size(), numberRange);
|
|
|
+ } else {
|
|
|
+ updateExistingTeam(teamId, athletesId, athletes.size());
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -980,6 +938,160 @@ public class IEnrollServiceImpl implements IEnrollService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新现有队伍信息(包括号码段)
|
|
|
+ */
|
|
|
+ private void updateExistingTeamWithNumberRange(Long teamId, List<Long> newAthletesId, int newAthleteCount, String numberRange) {
|
|
|
+ GameTeamVo existingTeam = gameTeamService.queryById(teamId);
|
|
|
+ if (existingTeam != null) {
|
|
|
+ // 合并现有队员ID和新队员ID
|
|
|
+ List<Long> existingAthletes = JSONUtil.toList(existingTeam.getAthleteValue(), Long.class);
|
|
|
+ List<Long> allAthletes = new ArrayList<>();
|
|
|
+ if (existingAthletes != null) {
|
|
|
+ allAthletes.addAll(existingAthletes);
|
|
|
+ }
|
|
|
+ allAthletes.addAll(newAthletesId);
|
|
|
+
|
|
|
+ // 更新队伍信息
|
|
|
+ GameTeamBo updateTeamBo = new GameTeamBo();
|
|
|
+ updateTeamBo.setTeamId(teamId);
|
|
|
+ updateTeamBo.setAthleteValue(JSONUtil.toJsonStr(allAthletes));
|
|
|
+ updateTeamBo.setAthleteNum(existingTeam.getAthleteNum() + newAthleteCount);
|
|
|
+ updateTeamBo.setNumberRange(numberRange); // 更新号码段
|
|
|
+ gameTeamService.updateByBo(updateTeamBo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证号码段格式是否有效
|
|
|
+ * 号码段格式为:xxxx-yyyy(如:0001-0300)
|
|
|
+ *
|
|
|
+ * @param numberRange 号码段
|
|
|
+ * @return 是否有效
|
|
|
+ */
|
|
|
+ private boolean isValidNumberRange(String numberRange) {
|
|
|
+ if (StringUtils.isBlank(numberRange)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否包含"-"分隔符
|
|
|
+ if (!numberRange.contains("-")) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否能够正确分割
|
|
|
+ String[] parts = numberRange.split("-");
|
|
|
+ if (parts.length != 2) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查起始和结束号码都不为空
|
|
|
+ if (StringUtils.isBlank(parts[0]) || StringUtils.isBlank(parts[1])) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成或获取号码段
|
|
|
+ *
|
|
|
+ * @param athletes 运动员列表
|
|
|
+ * @param eventId 赛事ID
|
|
|
+ * @param teamId 队伍ID(可为null)
|
|
|
+ * @param totalSize 总人数
|
|
|
+ * @param teamIndexCounter 队伍索引计数器
|
|
|
+ * @return 号码段
|
|
|
+ */
|
|
|
+ private String generateOrGetNumberRange(List<EnrollProjectVo> athletes, Long eventId, Long teamId,
|
|
|
+ int totalSize, AtomicInteger teamIndexCounter) {
|
|
|
+ // 收集填写的号码
|
|
|
+ List<String> providedCodes = athletes.stream()
|
|
|
+ .map(EnrollProjectVo::getAthleteCode)
|
|
|
+ .filter(StringUtils::isNotBlank)
|
|
|
+ .map(String::trim)
|
|
|
+ .filter(code -> StringUtils.isNotBlank(code))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (!providedCodes.isEmpty()) {
|
|
|
+ // 尝试生成自定义号码段
|
|
|
+ String customRange = generateCustomNumberRangeWithChars(providedCodes, eventId, teamId);
|
|
|
+ if (customRange != null) {
|
|
|
+ log.info("使用自定义号码段: {}", customRange);
|
|
|
+ return customRange;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成默认号码段
|
|
|
+ int teamIndex = teamIndexCounter.getAndIncrement();
|
|
|
+ return generateNumberRange(totalSize, teamIndex);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化当前号码
|
|
|
+ *
|
|
|
+ * @param numberRange 号码段
|
|
|
+ * @param teamId 队伍ID(可为null)
|
|
|
+ * @param teamName 队伍名称
|
|
|
+ * @return 当前号码
|
|
|
+ */
|
|
|
+ private AtomicInteger initializeCurrentNumber(String numberRange, Long teamId, String teamName) {
|
|
|
+ // 尝试分割号码段
|
|
|
+ String[] rangeParts = numberRange.split("-");
|
|
|
+ if (rangeParts.length == 2) {
|
|
|
+ try {
|
|
|
+ int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
+ return new AtomicInteger(startNumber);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ log.warn("解析号码段起始号码失败: {}, 使用默认值", numberRange);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果解析失败,尝试从队伍查询
|
|
|
+ if (teamId != null) {
|
|
|
+ try {
|
|
|
+ String maxNumberStr = gameAthleteService.queryMaxNumber(teamId);
|
|
|
+ Integer maxNumber = Integer.valueOf(maxNumberStr);
|
|
|
+ return new AtomicInteger(maxNumber > 0 ? maxNumber + 1 : 1);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("查询队伍{}的最大号码失败", teamName, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return new AtomicInteger(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从现有队伍获取当前号码
|
|
|
+ *
|
|
|
+ * @param numberRange 号码段
|
|
|
+ * @param teamId 队伍ID
|
|
|
+ * @param teamName 队伍名称
|
|
|
+ * @return 当前号码
|
|
|
+ */
|
|
|
+ private AtomicInteger getCurrentNumberFromExistingTeam(String numberRange, Long teamId, String teamName) {
|
|
|
+ try {
|
|
|
+ // 查询队伍的最大队员编号
|
|
|
+ String maxNumberStr = gameAthleteService.queryMaxNumber(teamId);
|
|
|
+ Integer maxNumber = Integer.valueOf(maxNumberStr);
|
|
|
+
|
|
|
+ // 如果最大编号为0,从号码段起始开始
|
|
|
+ if (maxNumber == 0) {
|
|
|
+ String[] rangeParts = numberRange.split("-");
|
|
|
+ int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
+ return new AtomicInteger(startNumber);
|
|
|
+ } else {
|
|
|
+ // 续着分配
|
|
|
+ return new AtomicInteger(maxNumber + 1);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("查询队伍{}的号码失败: {},从号码段起始开始", teamName, numberRange, e);
|
|
|
+ String[] rangeParts = numberRange.split("-");
|
|
|
+ int startNumber = Integer.valueOf(rangeParts[0]);
|
|
|
+ return new AtomicInteger(startNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private String generateNumberRangeByMax(int maxNumber) {
|
|
|
// 每个队伍固定分配300个号码
|
|
|
int start = maxNumber + 1;
|