|  | @@ -2,6 +2,7 @@ package com.zanxiang.game.module.manage.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
	
	
		
			
				|  | @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
	
		
			
				|  |  |  import com.zanxiang.erp.security.util.SecurityUtil;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.base.pojo.enums.DeleteEnum;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
 | 
	
		
			
				|  |  | +import com.zanxiang.game.module.manage.pojo.params.GameMergeServerParam;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.params.GameServerAddUpdateParam;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.params.GameServerListParam;
 | 
	
		
			
				|  |  |  import com.zanxiang.game.module.manage.pojo.vo.GameServerListVO;
 | 
	
	
		
			
				|  | @@ -28,9 +30,8 @@ import reactor.util.function.Tuple2;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.time.LocalDateTime;
 | 
	
		
			
				|  |  |  import java.time.LocalTime;
 | 
	
		
			
				|  |  | -import java.util.Collections;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Objects;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  | +import java.util.function.Function;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
	
		
			
				|  | @@ -85,6 +86,8 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
 | 
	
		
			
				|  |  |                  .isDelete(DeleteEnum.NO.getCode())
 | 
	
		
			
				|  |  |                  .createBy(param.getId() == null ? SecurityUtil.getUserId() : null)
 | 
	
		
			
				|  |  |                  .createTime(param.getId() == null ? LocalDateTime.now() : null)
 | 
	
		
			
				|  |  | +                .isSourceServer(Boolean.TRUE)
 | 
	
		
			
				|  |  | +                .isMerge(Boolean.FALSE)
 | 
	
		
			
				|  |  |                  .updateBy(SecurityUtil.getUserId())
 | 
	
		
			
				|  |  |                  .updateTime(LocalDateTime.now())
 | 
	
		
			
				|  |  |                  .build();
 | 
	
	
		
			
				|  | @@ -121,9 +124,116 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
 | 
	
		
			
				|  |  |          GameServerListVO gameServerListVO = BeanUtil.copy(gameServer, GameServerListVO.class);
 | 
	
		
			
				|  |  |          GameDTO gameDTO = gameService.getById(gameServer.getGameId());
 | 
	
		
			
				|  |  |          gameServerListVO.setGameName(gameDTO == null ? null : gameDTO.getName());
 | 
	
		
			
				|  |  | +        List<String> serverIdList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        String[] sonServerIdArray = null;
 | 
	
		
			
				|  |  | +        String[] sourceServerIdArray = null;
 | 
	
		
			
				|  |  | +        if (Strings.isNotBlank(gameServer.getMainServerId())) {
 | 
	
		
			
				|  |  | +            serverIdList.add(gameServer.getMainServerId());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (Strings.isNotBlank(gameServer.getSonServerIds())) {
 | 
	
		
			
				|  |  | +            sonServerIdArray = gameServer.getSonServerIds().split(",");
 | 
	
		
			
				|  |  | +            Collections.addAll(serverIdList, sonServerIdArray);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (Strings.isNotBlank(gameServer.getSourceServerIds())) {
 | 
	
		
			
				|  |  | +            sourceServerIdArray = gameServer.getSourceServerIds().split(",");
 | 
	
		
			
				|  |  | +            Collections.addAll(serverIdList, sourceServerIdArray);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //关联区服信息
 | 
	
		
			
				|  |  | +        Map<String, GameServer> gameServerMap = super.list(new LambdaQueryWrapper<GameServer>()
 | 
	
		
			
				|  |  | +                .in(GameServer::getServerId, serverIdList)
 | 
	
		
			
				|  |  | +        ).stream().collect(Collectors.toMap(GameServer::getServerId, Function.identity()));
 | 
	
		
			
				|  |  | +        //合服主服名称
 | 
	
		
			
				|  |  | +        if (Strings.isNotBlank(gameServer.getMainServerId())) {
 | 
	
		
			
				|  |  | +            GameServer mainServer = gameServerMap.get(gameServer.getMainServerId());
 | 
	
		
			
				|  |  | +            gameServerListVO.setMainServerName(mainServer == null ? null : mainServer.getServerName());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //合服子服列表
 | 
	
		
			
				|  |  | +        if (sonServerIdArray != null) {
 | 
	
		
			
				|  |  | +            List<GameServerListVO.ServerBean> sonServerList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            for (String sonServerId : sonServerIdArray) {
 | 
	
		
			
				|  |  | +                GameServer sonServer = gameServerMap.get(sonServerId);
 | 
	
		
			
				|  |  | +                if (sonServer == null) {
 | 
	
		
			
				|  |  | +                    continue;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                sonServerList.add(GameServerListVO.ServerBean.builder()
 | 
	
		
			
				|  |  | +                        .serverId(sonServerId)
 | 
	
		
			
				|  |  | +                        .serverName(sonServer.getServerName())
 | 
	
		
			
				|  |  | +                        .build());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            gameServerListVO.setSonServerList(sonServerList);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //合服原始服列表
 | 
	
		
			
				|  |  | +        if (sourceServerIdArray != null) {
 | 
	
		
			
				|  |  | +            List<GameServerListVO.ServerBean> sourceServerList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            for (String sourceServerId : sourceServerIdArray) {
 | 
	
		
			
				|  |  | +                GameServer sourceServer = gameServerMap.get(sourceServerId);
 | 
	
		
			
				|  |  | +                if (sourceServer != null) {
 | 
	
		
			
				|  |  | +                    sourceServerList.add(GameServerListVO.ServerBean.builder()
 | 
	
		
			
				|  |  | +                            .serverId(sourceServerId)
 | 
	
		
			
				|  |  | +                            .serverName(sourceServer.getServerName())
 | 
	
		
			
				|  |  | +                            .build());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            gameServerListVO.setSourceServerList(sourceServerList);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          return gameServerListVO;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public Boolean mergeServerAddUpdate(GameMergeServerParam param) {
 | 
	
		
			
				|  |  | +        List<GameServer> gameServerList = super.list(new LambdaQueryWrapper<GameServer>()
 | 
	
		
			
				|  |  | +                .eq(GameServer::getGameId, param.getGameId())
 | 
	
		
			
				|  |  | +                .in(GameServer::getServerId, param.getServerIdList()));
 | 
	
		
			
				|  |  | +        Set<String> sourceServerIds = new HashSet<>();
 | 
	
		
			
				|  |  | +        gameServerList.forEach(gameServer -> {
 | 
	
		
			
				|  |  | +            if (gameServer.getIsSourceServer()) {
 | 
	
		
			
				|  |  | +                sourceServerIds.add(gameServer.getServerId());
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (Strings.isBlank(gameServer.getSourceServerIds())) {
 | 
	
		
			
				|  |  | +                Collections.addAll(sourceServerIds, gameServer.getSourceServerIds().split(","));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        //新增
 | 
	
		
			
				|  |  | +        if (param.getId() == null) {
 | 
	
		
			
				|  |  | +            super.save(this.transform(param, sourceServerIds));
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            super.update(new LambdaUpdateWrapper<GameServer>()
 | 
	
		
			
				|  |  | +                    .set(GameServer::getGameId, param.getGameId())
 | 
	
		
			
				|  |  | +                    .set(GameServer::getMainServerId, param.getMainServerId())
 | 
	
		
			
				|  |  | +                    .set(GameServer::getSonServerIds, String.join(",", param.getServerIdList()))
 | 
	
		
			
				|  |  | +                    .set(GameServer::getSourceServerIds, String.join(",", sourceServerIds))
 | 
	
		
			
				|  |  | +                    .set(GameServer::getServerName, param.getServerName())
 | 
	
		
			
				|  |  | +                    .set(GameServer::getMergeTime, param.getMergeTime())
 | 
	
		
			
				|  |  | +                    .set(GameServer::getUpdateBy, SecurityUtil.getUserId())
 | 
	
		
			
				|  |  | +                    .set(GameServer::getUpdateTime, LocalDateTime.now())
 | 
	
		
			
				|  |  | +                    .eq(GameServer::getId, param.getId()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return super.update(new LambdaUpdateWrapper<GameServer>()
 | 
	
		
			
				|  |  | +                .set(GameServer::getIsMerge, Boolean.TRUE)
 | 
	
		
			
				|  |  | +                .set(GameServer::getUpdateTime, LocalDateTime.now())
 | 
	
		
			
				|  |  | +                .in(GameServer::getServerId, param.getServerIdList()));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private GameServer transform(GameMergeServerParam param, Set<String> sourceServerIds) {
 | 
	
		
			
				|  |  | +        return GameServer.builder()
 | 
	
		
			
				|  |  | +                .gameId(param.getGameId())
 | 
	
		
			
				|  |  | +                .serverId(UUID.randomUUID().toString())
 | 
	
		
			
				|  |  | +                .serverName(param.getServerName())
 | 
	
		
			
				|  |  | +                .isSourceServer(Boolean.FALSE)
 | 
	
		
			
				|  |  | +                .mainServerId(param.getMainServerId())
 | 
	
		
			
				|  |  | +                .isMerge(Boolean.FALSE)
 | 
	
		
			
				|  |  | +                .sonServerIds(String.join(",", param.getServerIdList()))
 | 
	
		
			
				|  |  | +                .sourceServerIds(String.join(",", sourceServerIds))
 | 
	
		
			
				|  |  | +                .mergeTime(param.getMergeTime())
 | 
	
		
			
				|  |  | +                .isDelete(DeleteEnum.NO.getCode())
 | 
	
		
			
				|  |  | +                .createBy(SecurityUtil.getUserId())
 | 
	
		
			
				|  |  | +                .createTime(LocalDateTime.now())
 | 
	
		
			
				|  |  | +                .updateBy(SecurityUtil.getUserId())
 | 
	
		
			
				|  |  | +                .updateTime(LocalDateTime.now())
 | 
	
		
			
				|  |  | +                .build();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |      public boolean deleteById(Long id) {
 |