|
|
@@ -0,0 +1,169 @@
|
|
|
+package org.dromara.system.service.impl.app;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.toolkit.Db;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.system.domain.GameEvent;
|
|
|
+import org.dromara.system.domain.GameEventConfig;
|
|
|
+import org.dromara.system.domain.GameEventProject;
|
|
|
+import org.dromara.system.domain.GameRankGroup;
|
|
|
+import org.dromara.system.domain.bo.ClientProjectSaveBo;
|
|
|
+import org.dromara.system.domain.bo.GameRankGroupBo;
|
|
|
+import org.dromara.system.mapper.GameEventMapper;
|
|
|
+import org.dromara.system.mapper.GameEventProjectMapper;
|
|
|
+import org.dromara.system.service.IGameRankGroupService;
|
|
|
+import org.dromara.system.service.app.IToClientService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class ToClientServiceImpl implements IToClientService {
|
|
|
+
|
|
|
+ private final GameEventProjectMapper projectMapper;
|
|
|
+ private final GameEventMapper gameEventMapper;
|
|
|
+ private final IGameRankGroupService gameRankGroupService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 客户端同步赛事及项目信息 (接口4)
|
|
|
+ *
|
|
|
+ * @param bo 客户端保存对象
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void saveOrUpdateEventFromClient(ClientProjectSaveBo bo) {
|
|
|
+ // 1. 获取或创建赛事
|
|
|
+ GameEvent event = gameEventMapper.selectOne(Wrappers.lambdaQuery(GameEvent.class)
|
|
|
+ .eq(GameEvent::getEventCode, bo.getEventCode()));
|
|
|
+ if (event == null) {
|
|
|
+ event = new GameEvent();
|
|
|
+ event.setEventCode(bo.getEventCode());
|
|
|
+ event.setEventName(bo.getEventName());
|
|
|
+ event.setStatus("0");
|
|
|
+ gameEventMapper.insert(event);
|
|
|
+ } else if (!event.getEventName().equals(bo.getEventName())) {
|
|
|
+ throw new RuntimeException("赛事编号" + bo.getEventCode() + "已被赛事【" + event.getEventName() + "】占用");
|
|
|
+ }
|
|
|
+ Long eventId = event.getEventId();
|
|
|
+
|
|
|
+ // 2. 批量维护配置信息 (机器编号、赛事提示、上传成绩路径)
|
|
|
+ batchSaveConfigs(eventId, bo);
|
|
|
+
|
|
|
+ // 3. 维护组别信息 (参赛组别)
|
|
|
+ Long rgId = bo.getRgId();
|
|
|
+ String rgName = bo.getRgName();
|
|
|
+ if (rgId == null && StringUtils.isNotBlank(rgName)) {
|
|
|
+ GameRankGroup group = Db.getOne(Wrappers.lambdaQuery(GameRankGroup.class)
|
|
|
+ .select(GameRankGroup::getRgId)
|
|
|
+ .eq(GameRankGroup::getEventId, eventId)
|
|
|
+ .eq(GameRankGroup::getRgName, rgName)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+
|
|
|
+ if (group == null) {
|
|
|
+ GameRankGroupBo addGroup = new GameRankGroupBo();
|
|
|
+ addGroup.setEventId(eventId);
|
|
|
+ addGroup.setRgName(rgName);
|
|
|
+ addGroup.setParentId(0L);
|
|
|
+ addGroup.setStatus("0");
|
|
|
+ gameRankGroupService.insertByBo(addGroup);
|
|
|
+ rgId = addGroup.getRgId();
|
|
|
+ } else {
|
|
|
+ rgId = group.getRgId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 维护项目信息 (多填项目内容) - 使用批量操作优化性能
|
|
|
+ List<String> projectNames = bo.getProjectNames();
|
|
|
+ if (CollectionUtils.isNotEmpty(projectNames)) {
|
|
|
+ // 批量查询现有项目
|
|
|
+ List<GameEventProject> existingProjects = projectMapper
|
|
|
+ .selectList(Wrappers.lambdaQuery(GameEventProject.class)
|
|
|
+ .eq(GameEventProject::getEventId, eventId)
|
|
|
+ .in(GameEventProject::getProjectName, projectNames)
|
|
|
+ .eq(StringUtils.isNotBlank(rgName), GameEventProject::getRgName, rgName)
|
|
|
+ .eq(rgId != null, GameEventProject::getRgId, rgId));
|
|
|
+
|
|
|
+ // 转换为 Map 方便查找
|
|
|
+ Map<String, GameEventProject> projectMap = existingProjects.stream()
|
|
|
+ .collect(Collectors.toMap(GameEventProject::getProjectName, p -> p, (p1, p2) -> p1));
|
|
|
+
|
|
|
+ List<GameEventProject> projectsToSave = new ArrayList<>();
|
|
|
+ for (String projectName : projectNames) {
|
|
|
+ GameEventProject project = projectMap.get(projectName);
|
|
|
+ if (project == null) {
|
|
|
+ project = new GameEventProject();
|
|
|
+ project.setEventId(eventId);
|
|
|
+ project.setProjectName(projectName);
|
|
|
+ }
|
|
|
+ project.setProjectType(bo.getProjectType());
|
|
|
+ project.setClassification(bo.getClassification());
|
|
|
+ project.setScoreRule(bo.getScoreRule());
|
|
|
+ project.setGender(bo.getGender());
|
|
|
+ project.setRgName(rgName);
|
|
|
+ project.setRgId(rgId);
|
|
|
+ project.setGameStage(bo.getGameStage());
|
|
|
+ project.setGameRound(bo.getGameRound());
|
|
|
+ project.setOrderType(bo.getOrderType());
|
|
|
+ project.setRoundType(bo.getRoundType());
|
|
|
+ projectsToSave.add(project);
|
|
|
+ }
|
|
|
+ // 批量保存或更新
|
|
|
+ Db.saveOrUpdateBatch(projectsToSave);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量保存配置信息
|
|
|
+ */
|
|
|
+ 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 (configValues.isEmpty()) return;
|
|
|
+
|
|
|
+ Map<String, String> configDescs = Map.of(
|
|
|
+ "machine_code", "机器编号",
|
|
|
+ "event_tip", "赛事提示",
|
|
|
+ "upload_path", "上传成绩路径"
|
|
|
+ );
|
|
|
+
|
|
|
+ // 批量查询现有配置
|
|
|
+ List<GameEventConfig> existingConfigs = Db.list(Wrappers.lambdaQuery(GameEventConfig.class)
|
|
|
+ .eq(GameEventConfig::getEventId, eventId)
|
|
|
+ .in(GameEventConfig::getConfigKey, configValues.keySet()));
|
|
|
+
|
|
|
+ Map<String, GameEventConfig> configMap = existingConfigs.stream()
|
|
|
+ .collect(Collectors.toMap(GameEventConfig::getConfigKey, c -> c));
|
|
|
+
|
|
|
+ List<GameEventConfig> toSave = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, String> entry : configValues.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ String value = entry.getValue();
|
|
|
+ GameEventConfig config = configMap.get(key);
|
|
|
+ if (config == null) {
|
|
|
+ config = new GameEventConfig();
|
|
|
+ config.setEventId(eventId);
|
|
|
+ config.setConfigType("4"); // 系统配置
|
|
|
+ config.setConfigKey(key);
|
|
|
+ config.setConfigDesc(configDescs.get(key));
|
|
|
+ config.setIsEnabled("0");
|
|
|
+ config.setStatus("0");
|
|
|
+ }
|
|
|
+ config.setConfigValue(value);
|
|
|
+ toSave.add(config);
|
|
|
+ }
|
|
|
+ Db.saveOrUpdateBatch(toSave);
|
|
|
+ }
|
|
|
+}
|