|
|
@@ -1,5 +1,6 @@
|
|
|
package org.dromara.system.service.impl.app;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
|
|
@@ -17,7 +18,6 @@ import org.dromara.system.mapper.GameScoreMapper;
|
|
|
import org.dromara.system.mapper.app.ToClientMapper;
|
|
|
import org.dromara.system.service.IGameScoreService;
|
|
|
import org.dromara.system.service.IGameRankGroupService;
|
|
|
-import org.dromara.system.service.ISysDictDataService;
|
|
|
import org.dromara.system.service.ISysDictTypeService;
|
|
|
import org.dromara.system.service.app.IToClientService;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
@@ -75,15 +75,17 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
public void saveOrUpdateEventFromClient(ClientProjectSaveBo bo) {
|
|
|
// 1. 获取或创建赛事
|
|
|
GameEvent event = gameEventMapper.selectOne(Wrappers.lambdaQuery(GameEvent.class)
|
|
|
- .eq(GameEvent::getEventCode, bo.getEventCode()));
|
|
|
+ .eq(bo.getId() != null, GameEvent::getEventId, bo.getId())
|
|
|
+ .eq(GameEvent::getEventCode, bo.getBianhao())
|
|
|
+ );
|
|
|
if (event == null) {
|
|
|
event = new GameEvent();
|
|
|
- event.setEventCode(bo.getEventCode());
|
|
|
- event.setEventName(bo.getEventName());
|
|
|
+ event.setEventCode(bo.getBianhao());
|
|
|
+ event.setEventName(bo.getName());
|
|
|
event.setStatus("0");
|
|
|
gameEventMapper.insert(event);
|
|
|
- } else if (!event.getEventName().equals(bo.getEventName())) {
|
|
|
- throw new RuntimeException("赛事编号" + bo.getEventCode() + "已被赛事【" + event.getEventName() + "】占用");
|
|
|
+ } else if (!event.getEventName().equals(bo.getName())) {
|
|
|
+ throw new RuntimeException("赛事编号" + bo.getBianhao() + "已被赛事【" + event.getEventName() + "】占用");
|
|
|
}
|
|
|
Long eventId = event.getEventId();
|
|
|
|
|
|
@@ -92,7 +94,7 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
|
|
|
// 3. 维护组别信息 (参赛组别)
|
|
|
Long rgId = bo.getRgId();
|
|
|
- String rgName = bo.getRgName();
|
|
|
+ String rgName = bo.getZu();
|
|
|
if (rgId == null && StringUtils.isNotBlank(rgName)) {
|
|
|
GameRankGroup group = Db.getOne(Wrappers.lambdaQuery(GameRankGroup.class)
|
|
|
.select(GameRankGroup::getRgId)
|
|
|
@@ -138,18 +140,19 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
}
|
|
|
project.setProjectType(bo.getProjectType());
|
|
|
project.setClassification(bo.getClassification());
|
|
|
- project.setScoreRule(bo.getScoreRule());
|
|
|
- project.setTimingFormat(bo.getTimingFormat());
|
|
|
+ project.setScoreRule(bo.getChengjiType());
|
|
|
+ project.setTimingFormat(bo.getGuize());
|
|
|
project.setDistanceMode(bo.getDistanceMode());
|
|
|
project.setCountUnit(bo.getCountUnit());
|
|
|
- project.setScoreCount(bo.getScoreCount());
|
|
|
- project.setGender(bo.getGender());
|
|
|
+ project.setScoreCount(bo.getChengJiNum());
|
|
|
+ project.setGender(bo.getSex());
|
|
|
project.setRgName(rgName);
|
|
|
project.setRgId(rgId);
|
|
|
- project.setGameStage(bo.getGameStage());
|
|
|
- project.setGameRound(bo.getGameRound());
|
|
|
- project.setOrderType(bo.getOrderType());
|
|
|
- project.setRoundType(bo.getRoundType());
|
|
|
+ project.setGameStage(bo.getJieduan());
|
|
|
+ project.setGameRound(bo.getLunci());
|
|
|
+ project.setOrderType(bo.getPaiMing());
|
|
|
+ project.setRoundType(bo.getPmnum());
|
|
|
+ project.setScoreValue(bo.getJifen());
|
|
|
projectsToSave.add(project);
|
|
|
}
|
|
|
// 批量保存或更新
|
|
|
@@ -202,19 +205,44 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<GameEvent> getEventList() {
|
|
|
- return gameEventMapper.selectList(Wrappers.lambdaQuery(GameEvent.class)
|
|
|
- .orderByDesc(GameEvent::getCreateTime)
|
|
|
- .select(GameEvent::getEventId, GameEvent::getEventCode, GameEvent::getEventName,
|
|
|
- GameEvent::getCreateTime));
|
|
|
+ public List<GameAppEvent> getEventList() {
|
|
|
+ List<GameEvent> res = gameEventMapper.selectList(Wrappers.lambdaQuery(GameEvent.class)
|
|
|
+ .orderByDesc(GameEvent::getCreateTime)
|
|
|
+ .select(GameEvent::getEventId, GameEvent::getEventCode, GameEvent::getEventName,
|
|
|
+ GameEvent::getCreateTime));
|
|
|
+ return res.isEmpty() ? new ArrayList<>() : res.stream().map(e -> {
|
|
|
+ GameAppEvent appEvent = BeanUtil.copyProperties(e, GameAppEvent.class);
|
|
|
+ appEvent.setId(e.getEventId());
|
|
|
+ appEvent.setBianhao(e.getEventCode());
|
|
|
+ appEvent.setName(e.getEventName());
|
|
|
+ return appEvent;
|
|
|
+ }).toList();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<GameEventProject> getProjectList(Long eventId) {
|
|
|
- return projectMapper.selectList(Wrappers.lambdaQuery(GameEventProject.class)
|
|
|
- .eq(GameEventProject::getEventId, eventId)
|
|
|
- .select(GameEventProject::getProjectId, GameEventProject::getProjectType,
|
|
|
- GameEventProject::getClassification, GameEventProject::getProjectName, GameEventProject::getStatus));
|
|
|
+ public List<GameAppProject> getProjectList(Long eventId) {
|
|
|
+ List<GameEventProject> res = projectMapper.selectList(Wrappers.lambdaQuery(GameEventProject.class)
|
|
|
+ .eq(GameEventProject::getEventId, eventId)
|
|
|
+ .select(GameEventProject::getProjectId, GameEventProject::getProjectType,
|
|
|
+ GameEventProject::getClassification, GameEventProject::getProjectName,
|
|
|
+ GameEventProject::getStatus)
|
|
|
+ );
|
|
|
+ return res.isEmpty() ? new ArrayList<>() : res.stream().map(p -> {
|
|
|
+ GameAppProject appProject = BeanUtil.copyProperties(p, GameAppProject.class);
|
|
|
+ appProject.setId(p.getEventId());
|
|
|
+ appProject.setState(p.getStatus());
|
|
|
+ appProject.setSex(p.getGender());
|
|
|
+ appProject.setType(p.getProjectType());
|
|
|
+ appProject.setPmnum(p.getRoundType());
|
|
|
+ appProject.setPaiMing(p.getOrderType());
|
|
|
+ appProject.setChengJiNum(p.getScoreCount());
|
|
|
+ appProject.setJifen(p.getScoreValue());
|
|
|
+ appProject.setGuize(p.getTimingFormat());
|
|
|
+ appProject.setLunci(p.getGameRound());
|
|
|
+ appProject.setJieduan(p.getGameStage());
|
|
|
+ appProject.setZu(p.getRgName());
|
|
|
+ return appProject;
|
|
|
+ }).toList();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -241,48 +269,48 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
.map(this::convertToDetailVo)
|
|
|
.collect(Collectors.groupingBy(ScoreSheetDetailVo::getTeamId));
|
|
|
|
|
|
- items.forEach(item -> item.setDetails(detailMap.get(item.getTeamId())));
|
|
|
+ items.forEach(item -> item.setChengji(detailMap.get(item.getTeamId())));
|
|
|
} else {
|
|
|
// 个人项目:优先按 athleteId 分组 (如果存储时没存 athleteId 则按 scoreId)
|
|
|
detailMap = allDetails.stream()
|
|
|
.filter(d -> d.getAthleteId() != null)
|
|
|
.map(this::convertToDetailVo)
|
|
|
- .collect(Collectors.groupingBy(ScoreSheetDetailVo::getAthleteId));
|
|
|
+ .collect(Collectors.groupingBy(ScoreSheetDetailVo::getId));
|
|
|
|
|
|
- items.forEach(item -> item.setDetails(detailMap.get(item.getAthleteId())));
|
|
|
+ items.forEach(item -> item.setChengji(detailMap.get(item.getId())));
|
|
|
|
|
|
// 兜底:处理部分仅关联 scoreId 的旧数据
|
|
|
- items.stream().filter(i -> i.getDetails() == null && i.getScoreId() != null).forEach(item -> {
|
|
|
+ items.stream().filter(i -> i.getChengji() == null && i.getScoreId() != null).forEach(item -> {
|
|
|
List<ScoreSheetDetailVo> scoreDetails = allDetails.stream()
|
|
|
.filter(d -> Objects.equals(d.getScoreId(), item.getScoreId()))
|
|
|
.map(this::convertToDetailVo)
|
|
|
.toList();
|
|
|
- item.setDetails(scoreDetails);
|
|
|
+ item.setChengji(scoreDetails);
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 4. 处理计时格式转换
|
|
|
- if (vo.getTimingFormat() != null && StringUtils.isNotBlank(vo.getTimingFormat())) {
|
|
|
+ if (vo.getGuize() != null && StringUtils.isNotBlank(vo.getGuize())) {
|
|
|
items.forEach(item -> {
|
|
|
// 格式化主成绩
|
|
|
if (StringUtils.isNotBlank(item.getScore())) {
|
|
|
- item.setScore(convertDecimalToTimeScore(new BigDecimal(item.getScore()), vo.getTimingFormat()));
|
|
|
+ item.setScore(convertDecimalToTimeScore(new BigDecimal(item.getScore()), vo.getGuize()));
|
|
|
}
|
|
|
// 格式化明细成绩
|
|
|
- if (item.getDetails() != null) {
|
|
|
- item.getDetails().forEach(detail -> {
|
|
|
- if (StringUtils.isNotBlank(detail.getPerformanceValue())) {
|
|
|
- detail.setPerformanceValue(convertDecimalToTimeScore(
|
|
|
- new BigDecimal(detail.getPerformanceValue()),
|
|
|
- vo.getTimingFormat()));
|
|
|
+ if (item.getChengji() != null) {
|
|
|
+ item.getChengji().forEach(detail -> {
|
|
|
+ if (StringUtils.isNotBlank(detail.getNum())) {
|
|
|
+ detail.setNum(convertDecimalToTimeScore(
|
|
|
+ new BigDecimal(detail.getNum()),
|
|
|
+ vo.getGuize()));
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- vo.setList(items);
|
|
|
+ vo.setUser(items);
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
@@ -291,11 +319,11 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
dvo.setDetailId(d.getDetailId());
|
|
|
dvo.setScoreId(d.getScoreId());
|
|
|
dvo.setAttemptIndex(d.getAttemptIndex());
|
|
|
- dvo.setPerformanceValue(d.getPerformanceValue() != null ? d.getPerformanceValue().toString() : null);
|
|
|
+ dvo.setNum(d.getPerformanceValue() != null ? d.getPerformanceValue().toString() : null);
|
|
|
dvo.setFaultA(d.getFaultA());
|
|
|
dvo.setFaultB(d.getFaultB());
|
|
|
// 传递关联 ID 供分组使用
|
|
|
- dvo.setAthleteId(d.getAthleteId());
|
|
|
+ dvo.setId(d.getAthleteId());
|
|
|
dvo.setTeamId(d.getTeamId());
|
|
|
return dvo;
|
|
|
}
|
|
|
@@ -337,7 +365,7 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void submitScoreSheet(ScoreSubmitBo bo) {
|
|
|
Long projectId = bo.getProjectId();
|
|
|
- Long eventId = bo.getEventId();
|
|
|
+ Long eventId = bo.getId();
|
|
|
GameEventProject project = projectMapper.selectOne(Wrappers.lambdaQuery(GameEventProject.class)
|
|
|
.eq(GameEventProject::getEventId, eventId)
|
|
|
.eq(GameEventProject::getProjectId, projectId));
|
|
|
@@ -345,7 +373,7 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
throw new RuntimeException("该赛事下不存在此项目");
|
|
|
}
|
|
|
|
|
|
- List<ScoreSubmitItemBo> items = bo.getItems();
|
|
|
+ List<ScoreSubmitItemBo> items = bo.getUser();
|
|
|
if (CollectionUtils.isEmpty(items)) {
|
|
|
return;
|
|
|
}
|
|
|
@@ -353,8 +381,8 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
// 1. 批量处理队伍 (缺失则新增)
|
|
|
Map<String, Long> teamIdMap = new HashMap<>();
|
|
|
Set<String> missingTeamNames = items.stream()
|
|
|
- .filter(item -> item.getTeamId() == null && StringUtils.isNotBlank(item.getTeamName()))
|
|
|
- .map(ScoreSubmitItemBo::getTeamName)
|
|
|
+ .filter(item -> item.getTeamId() == null && StringUtils.isNotBlank(item.getDuiwu()))
|
|
|
+ .map(ScoreSubmitItemBo::getDuiwu)
|
|
|
.collect(Collectors.toSet());
|
|
|
|
|
|
if (!missingTeamNames.isEmpty()) {
|
|
|
@@ -381,12 +409,12 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
// 2. 批量处理运动员 (缺失则新增,其余准备批量更新)
|
|
|
Map<String, Long> athleteIdMap = new HashMap<>();
|
|
|
List<ScoreSubmitItemBo> missingAthleteItems = items.stream()
|
|
|
- .filter(item -> item.getAthleteId() == null && StringUtils.isNotBlank(item.getAthleteCode()))
|
|
|
+ .filter(item -> item.getId() == null && StringUtils.isNotBlank(item.getNum()))
|
|
|
.toList();
|
|
|
|
|
|
if (!missingAthleteItems.isEmpty()) {
|
|
|
// 预查是否存在,防止重复
|
|
|
- Set<String> codes = missingAthleteItems.stream().map(ScoreSubmitItemBo::getAthleteCode)
|
|
|
+ Set<String> codes = missingAthleteItems.stream().map(ScoreSubmitItemBo::getNum)
|
|
|
.collect(Collectors.toSet());
|
|
|
List<GameAthlete> existAthletes = gameAthleteMapper.selectList(Wrappers.lambdaQuery(GameAthlete.class)
|
|
|
.eq(GameAthlete::getEventId, eventId)
|
|
|
@@ -395,15 +423,15 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
existAthletes.forEach(a -> athleteIdMap.put(a.getAthleteCode(), a.getAthleteId()));
|
|
|
|
|
|
List<GameAthlete> newAthletes = missingAthleteItems.stream()
|
|
|
- .filter(item -> !athleteIdMap.containsKey(item.getAthleteCode()))
|
|
|
+ .filter(item -> !athleteIdMap.containsKey(item.getNum()))
|
|
|
.map(item -> {
|
|
|
GameAthlete a = new GameAthlete();
|
|
|
a.setEventId(eventId);
|
|
|
- a.setAthleteCode(item.getAthleteCode());
|
|
|
+ a.setAthleteCode(item.getNum());
|
|
|
a.setName(item.getName());
|
|
|
- a.setTeamId(item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getTeamName()));
|
|
|
+ a.setTeamId(item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getDuiwu()));
|
|
|
a.setProjectValue("[\"" + projectId + "\"]");
|
|
|
- a.setTrackIndex(item.getTrackIndex());
|
|
|
+ a.setTrackIndex(item.getXuhao());
|
|
|
return a;
|
|
|
}).collect(Collectors.toMap(GameAthlete::getAthleteCode, a -> a, (a1, a2) -> a1))
|
|
|
.values().stream().toList();
|
|
|
@@ -417,13 +445,13 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
// 3. 直接批量更新所有上传项的运动员信息 (不再预查对比,直接全量同步)
|
|
|
List<GameAthlete> updateBatch = items.stream()
|
|
|
.map(item -> {
|
|
|
- Long aid = item.getAthleteId() != null ? item.getAthleteId()
|
|
|
- : athleteIdMap.get(item.getAthleteCode());
|
|
|
+ Long aid = item.getId() != null ? item.getId()
|
|
|
+ : athleteIdMap.get(item.getNum());
|
|
|
if (aid == null)
|
|
|
return null;
|
|
|
GameAthlete a = new GameAthlete();
|
|
|
a.setAthleteId(aid);
|
|
|
- a.setTrackIndex(item.getTrackIndex());
|
|
|
+ a.setTrackIndex(item.getXuhao());
|
|
|
// 如果有姓名或其它字段变更也可以在此同步
|
|
|
return a;
|
|
|
}).filter(Objects::nonNull).toList();
|
|
|
@@ -434,12 +462,12 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
|
|
|
// 4. 循环处理成绩录入 (统一使用 details 明细列表)
|
|
|
for (ScoreSubmitItemBo item : items) {
|
|
|
- Long athleteId = item.getAthleteId() != null ? item.getAthleteId()
|
|
|
- : athleteIdMap.get(item.getAthleteCode());
|
|
|
+ Long athleteId = item.getId() != null ? item.getId()
|
|
|
+ : athleteIdMap.get(item.getNum());
|
|
|
if (athleteId == null)
|
|
|
continue;
|
|
|
|
|
|
- Long teamId = item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getTeamName());
|
|
|
+ Long teamId = item.getTeamId() != null ? item.getTeamId() : teamIdMap.get(item.getDuiwu());
|
|
|
|
|
|
GameScoreBo scoreBo = new GameScoreBo();
|
|
|
scoreBo.setScoreId(item.getScoreId());
|
|
|
@@ -451,12 +479,12 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
scoreBo.setFaultB(item.getFaultB());
|
|
|
|
|
|
// 统一模式:优先处理明细列表
|
|
|
- if (CollectionUtils.isNotEmpty(item.getDetails())) {
|
|
|
- List<GameScoreDetailBo> details = item.getDetails().stream().map(d -> {
|
|
|
+ if (CollectionUtils.isNotEmpty(item.getChengji())) {
|
|
|
+ List<GameScoreDetailBo> details = item.getChengji().stream().map(d -> {
|
|
|
GameScoreDetailBo dbo = new GameScoreDetailBo();
|
|
|
dbo.setDetailId(d.getDetailId());
|
|
|
dbo.setAttemptIndex(d.getAttemptIndex());
|
|
|
- dbo.setPerformanceValue(d.getPerformanceValue());
|
|
|
+ dbo.setPerformanceValue(d.getNum());
|
|
|
return dbo;
|
|
|
}).toList();
|
|
|
scoreBo.setDetails(details);
|
|
|
@@ -517,7 +545,7 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
detailMap = allDetails.stream()
|
|
|
.filter(d -> d.getAthleteId() != null)
|
|
|
.map(this::convertToDetailVo)
|
|
|
- .collect(Collectors.groupingBy(ScoreSheetDetailVo::getAthleteId));
|
|
|
+ .collect(Collectors.groupingBy(ScoreSheetDetailVo::getId));
|
|
|
|
|
|
list.forEach(item -> {
|
|
|
List<ScoreSheetDetailVo> details = detailMap.get(item.getAthleteId());
|
|
|
@@ -542,9 +570,9 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
}
|
|
|
if (item.getDetails() != null) {
|
|
|
item.getDetails().forEach(detail -> {
|
|
|
- if (StringUtils.isNotBlank(detail.getPerformanceValue())) {
|
|
|
- detail.setPerformanceValue(convertDecimalToTimeScore(
|
|
|
- new BigDecimal(detail.getPerformanceValue()),
|
|
|
+ if (StringUtils.isNotBlank(detail.getNum())) {
|
|
|
+ detail.setNum(convertDecimalToTimeScore(
|
|
|
+ new BigDecimal(detail.getNum()),
|
|
|
project.getTimingFormat()));
|
|
|
}
|
|
|
});
|
|
|
@@ -615,12 +643,12 @@ public class ToClientServiceImpl implements IToClientService {
|
|
|
*/
|
|
|
private void batchSaveConfigs(Long eventId, ClientProjectSaveBo bo) {
|
|
|
Map<String, String> configValues = new HashMap<>();
|
|
|
- if (StringUtils.isNotBlank(bo.getMachineCode()))
|
|
|
- configValues.put("machine_code", bo.getMachineCode());
|
|
|
- if (StringUtils.isNotBlank(bo.getEventTip()))
|
|
|
- configValues.put("event_tip", bo.getEventTip());
|
|
|
- if (StringUtils.isNotBlank(bo.getUploadPath()))
|
|
|
- configValues.put("upload_path", bo.getUploadPath());
|
|
|
+ if (StringUtils.isNotBlank(bo.getJiqi()))
|
|
|
+ configValues.put("machine_code", bo.getJiqi());
|
|
|
+ if (StringUtils.isNotBlank(bo.getInfo()))
|
|
|
+ configValues.put("event_tip", bo.getInfo());
|
|
|
+ if (StringUtils.isNotBlank(bo.getServerUrl()))
|
|
|
+ configValues.put("upload_path", bo.getServerUrl());
|
|
|
|
|
|
if (configValues.isEmpty())
|
|
|
return;
|