소스 검색

fix : 区服bug修复

bilingfeng 1 년 전
부모
커밋
8f4bb1cf23

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <区服bug修改> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <区服新增excel方式> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 11 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameServerController.java

@@ -2,6 +2,7 @@ package com.zanxiang.game.module.manage.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.module.manage.enums.GameServerExcelEnum;
 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;
@@ -19,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -39,6 +41,15 @@ public class GameServerController {
     @Autowired
     private IGameSupperService gameSupperService;
 
+    @ApiOperation(value = "新增原始服合服excel")
+    @PostMapping(value = "/add/excel")
+    @PreAuthorize(permissionKey = "manage:gameServer:addExcel")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> addOrUpdate(MultipartFile multipartFile, @RequestParam Long gameId,
+                                         @RequestParam GameServerExcelEnum gameServerExcelEnum) {
+        return ResultVO.ok(gameServerService.gameServerExcelImport(multipartFile, gameServerExcelEnum, gameId));
+    }
+
     @ApiOperation(value = "新增或修改游戏区服")
     @PostMapping(value = "/add/or/update")
     @PreAuthorize(permissionKey = "manage:gameServer:addOrUpdate")

+ 30 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/GameServerExcelEnum.java

@@ -0,0 +1,30 @@
+package com.zanxiang.game.module.manage.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-10-10
+ * @description : 游戏区服excel
+ */
+@Getter
+@AllArgsConstructor
+public enum GameServerExcelEnum {
+
+    /**
+     * 添加区服
+     */
+    SERVER_ADD(1),
+
+    /**
+     * 合并区服
+     */
+    SERVER_MERGE(2);
+
+    /**
+     * 文件类型
+     */
+    private Integer value;
+
+}

+ 0 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/AgentListDTO.java


+ 61 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameServerExcelDTO.java

@@ -0,0 +1,61 @@
+package com.zanxiang.game.module.manage.pojo.dto;
+
+import com.zanxiang.module.util.excel.ExcelAnno;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-10-10
+ * @description : 游戏区服excel
+ */
+@Data
+public class GameServerExcelDTO {
+
+    /**
+     * 区服名称
+     */
+    @ExcelAnno(title = "区服名称")
+    private String serverName;
+
+    // -------- 新增原始服字段 --------
+
+    /**
+     * 区服id
+     */
+    @ExcelAnno(title = "区服ID")
+    private String serverId;
+
+    /**
+     * 开服时间
+     */
+    @ExcelAnno(title = "开服时间")
+    private LocalDateTime startTime;
+
+    /**
+     * 区服冠名
+     */
+    @ExcelAnno(title = "区服冠名")
+    private String nickName;
+
+    // -------- 合服字段 --------
+
+    /**
+     * 合服id列表
+     */
+    @ExcelAnno(title = "合区id列表")
+    private String serverIds;
+
+    /**
+     * 合服主服id
+     */
+    @ExcelAnno(title = "合服主服id")
+    private String mainServerId;
+
+    /**
+     * 合服时间
+     */
+    @ExcelAnno(title = "合服时间")
+    private LocalDateTime mergeTime;
+}

+ 12 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerService.java

@@ -2,12 +2,14 @@ package com.zanxiang.game.module.manage.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.enums.GameServerExcelEnum;
 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;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerVO;
 import com.zanxiang.game.module.mybatis.entity.GameServer;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -18,6 +20,16 @@ import java.util.List;
  */
 public interface IGameServerService extends IService<GameServer> {
 
+    /**
+     * 区服excel提交
+     *
+     * @param multipartFile        文件流
+     * @param gameServerExcelEnum  操作类型枚举
+     * @param gameId               游戏id
+     * @return {@link Boolean}
+     */
+    Boolean gameServerExcelImport(MultipartFile multipartFile, GameServerExcelEnum gameServerExcelEnum, Long gameId);
+
     /**
      * 列表名字
      *

+ 101 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -9,7 +9,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.enums.GameServerExcelEnum;
 import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
+import com.zanxiang.game.module.manage.pojo.dto.GameServerExcelDTO;
 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;
@@ -23,14 +25,17 @@ import com.zanxiang.game.module.mybatis.entity.GameServer;
 import com.zanxiang.game.module.mybatis.entity.GameSupper;
 import com.zanxiang.game.module.mybatis.mapper.GameServerMapper;
 import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.excel.ExcelUtil;
 import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 import reactor.util.function.Tuple2;
 
+import java.io.IOException;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
@@ -55,6 +60,102 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
     @Autowired
     private IGameSupperService gameSupperService;
 
+    @Override
+    public Boolean gameServerExcelImport(MultipartFile multipartFile, GameServerExcelEnum gameServerExcelEnum, Long gameId) {
+        StringBuilder stringBuilder = new StringBuilder();
+        List<GameServerExcelDTO> gameServerExcelList;
+        //文件流转换
+        try {
+            gameServerExcelList = ExcelUtil.importFromStream(multipartFile.getInputStream(), GameServerExcelDTO.class, stringBuilder);
+        } catch (IOException e) {
+            throw new BaseException(stringBuilder.toString());
+        }
+        //原始区服添加
+        if (Objects.equals(gameServerExcelEnum, GameServerExcelEnum.SERVER_ADD)) {
+            List<GameServer> gameServerList = new ArrayList<>();
+            gameServerExcelList.forEach(excelDTO -> {
+                //判断单游戏内区服id不可重复
+                if (super.count(new LambdaQueryWrapper<GameServer>()
+                        .eq(GameServer::getGameId, gameId)
+                        .eq(GameServer::getServerId, excelDTO.getServerId())
+                ) > 0) {
+                    throw new BaseException("该游戏区服id : " + excelDTO.getServerId() + "已存在, 禁止重复添加");
+                }
+                gameServerList.add(this.transform(excelDTO, gameId));
+            });
+            return super.saveBatch(gameServerList);
+        }
+        //合服添加
+        List<GameServer> gameServerList = new ArrayList<>();
+        List<String> mergeSerIdList = new ArrayList<>();
+        gameServerExcelList.forEach(excelDTO -> {
+            Set<String> sonServerIdList = Arrays.stream(excelDTO.getServerIds().split(",")).collect(Collectors.toSet());
+            List<GameServer> sonServerList = super.list(new LambdaQueryWrapper<GameServer>()
+                    .eq(GameServer::getGameId, gameId)
+                    .in(GameServer::getServerId, sonServerIdList));
+            if (sonServerIdList.size() != sonServerList.size()) {
+                List<String> collect = sonServerList.stream().map(GameServer::getServerId).collect(Collectors.toList());
+                List<String> list = sonServerIdList.stream().filter(son -> !collect.contains(son)).collect(Collectors.toList());
+                throw new BaseException("提交的子服中存在错误的区服id : " + list.toString());
+            }
+            Set<String> sourceServerIds = new HashSet<>();
+            sonServerList.forEach(gameServer -> {
+                if (gameServer.getIsSourceServer()) {
+                    sourceServerIds.add(gameServer.getServerId());
+                    return;
+                }
+                if (Strings.isNotBlank(gameServer.getSourceServerIds())) {
+                    Collections.addAll(sourceServerIds, gameServer.getSourceServerIds().split(","));
+                }
+            });
+            gameServerList.add(this.transform(excelDTO, sonServerIdList, sourceServerIds, gameId));
+            mergeSerIdList.addAll(sonServerIdList);
+        });
+        super.saveBatch(gameServerList);
+        return super.update(new LambdaUpdateWrapper<GameServer>()
+                .set(GameServer::getIsMerge, Boolean.TRUE)
+                .set(GameServer::getUpdateTime, LocalDateTime.now())
+                .eq(GameServer::getGameId, gameId)
+                .in(GameServer::getServerId, mergeSerIdList));
+    }
+
+    private GameServer transform(GameServerExcelDTO excelDTO, Long gameId) {
+        return GameServer.builder()
+                .gameId(gameId)
+                .serverId(excelDTO.getServerId())
+                .serverName(excelDTO.getServerName())
+                .nickName(excelDTO.getNickName())
+                .startTime(excelDTO.getStartTime())
+                .isDelete(DeleteEnum.NO.getCode())
+                .createBy(SecurityUtil.getUserId())
+                .createTime(LocalDateTime.now())
+                .isSourceServer(Boolean.TRUE)
+                .isMerge(Boolean.FALSE)
+                .updateBy(SecurityUtil.getUserId())
+                .updateTime(LocalDateTime.now())
+                .build();
+    }
+
+    private GameServer transform(GameServerExcelDTO excelDTO, Set<String> sonServerIds, Set<String> sourceServerIds, Long gameId) {
+        return GameServer.builder()
+                .gameId(gameId)
+                .serverId(UUID.randomUUID().toString())
+                .serverName(excelDTO.getServerName())
+                .isSourceServer(Boolean.FALSE)
+                .mainServerId(excelDTO.getMainServerId())
+                .isMerge(Boolean.FALSE)
+                .sonServerIds(String.join(",", sonServerIds))
+                .sourceServerIds(String.join(",", sourceServerIds))
+                .mergeTime(excelDTO.getMergeTime())
+                .startTime(excelDTO.getMergeTime())
+                .isDelete(DeleteEnum.NO.getCode())
+                .createBy(SecurityUtil.getUserId())
+                .createTime(LocalDateTime.now())
+                .updateBy(SecurityUtil.getUserId())
+                .updateTime(LocalDateTime.now())
+                .build();
+    }
+
     @Override
     public List<String> listServerId(Long gameId, String serverName) {
         if (Strings.isBlank(serverName)) {