فهرست منبع

Merge remote-tracking branch 'origin/package' into package

lth 1 سال پیش
والد
کامیت
984c07da44

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

@@ -2,10 +2,12 @@ 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.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.service.IGameServerService;
+import com.zanxiang.game.module.manage.service.IGameSupperService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Map;
+
 /**
  * @author : lingfeng
  * @time : 2023-08-07
@@ -30,6 +34,9 @@ public class GameServerController {
     @Autowired
     private IGameServerService gameServerService;
 
+    @Autowired
+    private IGameSupperService gameSupperService;
+
     @ApiOperation(value = "新增或修改游戏区服")
     @PostMapping(value = "/add/or/update")
     @PreAuthorize(permissionKey = "manage:gameServer:addOrUpdate")
@@ -54,4 +61,19 @@ public class GameServerController {
         return ResultVO.ok(gameServerService.deleteById(id));
     }
 
+    @ApiOperation(value = "合服新增修改")
+    @PostMapping(value = "/merge/add/or/update")
+    @PreAuthorize(permissionKey = "manage:gameServer:mergeAddOrUpdate")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> mergeServerAddUpdate(@Validated @RequestBody GameMergeServerParam param) {
+        return ResultVO.ok(gameServerService.mergeServerAddUpdate(param));
+    }
+
+    @ApiOperation(value = "获取合服超父游戏列表")
+    @PostMapping(value = "/game/supper/list")
+    @PreAuthorize(permissionKey = "manage:gameServer:gameSupperList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Map<Long, String>> getGameSupperList() {
+        return ResultVO.ok(gameSupperService.getGameSupperList());
+    }
 }

+ 60 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameMergeServerParam.java

@@ -0,0 +1,60 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-11
+ * @description : 游戏合并区服
+ */
+@Data
+public class GameMergeServerParam {
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(notes = "主键id, 传则是修改, 不传则是新增")
+    private Long id;
+
+    /**
+     * 超父游戏id
+     */
+    @NotNull(message = "超父游戏id不可为空")
+    @ApiModelProperty(notes = "超父游戏id")
+    private Long gameId;
+
+    /**
+     * 合服的主服id
+     */
+    @NotBlank(message = "合服的主服id不可为空")
+    @ApiModelProperty(notes = "合服的主服id")
+    private String mainServerId;
+
+    /**
+     * 合并的区服id列表
+     */
+    @NotEmpty(message = "合并的区服id列表不可为空")
+    @ApiModelProperty(notes = "合并的区服id列表")
+    private List<String> serverIdList;
+
+    /**
+     * 合服区服名称
+     */
+    @NotBlank(message = "区服名称不可为空")
+    @ApiModelProperty(notes = "合服区服名称")
+    private String serverName;
+
+    /**
+     * 合服时间
+     */
+    @NotNull(message = "合服时间不可为空")
+    @ApiModelProperty(notes = "合服时间")
+    private LocalDateTime mergeTime;
+}

+ 64 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameServerListVO.java

@@ -6,7 +6,9 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author : lingfeng
@@ -72,4 +74,66 @@ public class GameServerListVO {
      */
     @ApiModelProperty(notes = "更新时间")
     private LocalDateTime updateTime;
+
+    /**
+     * 是否原始服
+     */
+    @ApiModelProperty(notes = "是否原始服")
+    private Boolean isSourceServer;
+
+    /**
+     * 合服的主服id
+     */
+    @ApiModelProperty(notes = "合服的主服id")
+    private String mainServerId;
+
+    /**
+     * 合服的主服名称
+     */
+    @ApiModelProperty(notes = "合服的主服名称")
+    private String mainServerName;
+
+    /**
+     * 是否参与合服
+     */
+    @ApiModelProperty(notes = "是否参与合服")
+    private Boolean isMerge;
+
+    /**
+     * 合服包含的子服列表
+     */
+    @ApiModelProperty(notes = "合服包含的子服列表")
+    private List<ServerBean> sonServerList;
+
+    /**
+     * 合服包含的原始服列表
+     */
+    @ApiModelProperty(notes = "合服包含的原始服列表")
+    private List<ServerBean> sourceServerList;
+
+    /**
+     * 合服时间
+     */
+    @ApiModelProperty(notes = "合服时间")
+    private LocalDateTime mergeTime;
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Builder
+    public static class ServerBean {
+
+        /**
+         * 区服id
+         */
+        @ApiModelProperty(notes = "区服id")
+        private String serverId;
+
+        /**
+         * 区服名称
+         */
+        @ApiModelProperty(notes = "区服名称")
+        private String serverName;
+
+    }
 }

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

@@ -2,6 +2,7 @@ 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.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;
@@ -48,4 +49,10 @@ public interface IGameServerService extends IService<GameServer> {
      * @return boolean
      */
     boolean deleteById(Long id);
+
+    /**
+     * @param param 参数
+     * @return {@link Boolean}
+     */
+    Boolean mergeServerAddUpdate(GameMergeServerParam param);
 }

+ 22 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameSupperService.java

@@ -0,0 +1,22 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameSupper;
+
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-12
+ * @description :
+ */
+public interface IGameSupperService extends IService<GameSupper> {
+
+
+    /**
+     * 获取超父游戏
+     *
+     * @return {@link Map}<{@link Long}, {@link String}>
+     */
+    Map<Long, String> getGameSupperList();
+}

+ 113 - 3
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -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) {

+ 30 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameSupperServiceImpl.java

@@ -0,0 +1,30 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.IGameSupperService;
+import com.zanxiang.game.module.mybatis.entity.GameSupper;
+import com.zanxiang.game.module.mybatis.mapper.GameSupperMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-12
+ * @description : 超父游戏
+ */
+@Slf4j
+@Service
+public class GameSupperServiceImpl extends ServiceImpl<GameSupperMapper, GameSupper> implements IGameSupperService {
+
+    @Override
+    public Map<Long, String> getGameSupperList() {
+        List<GameSupper> list = super.list();
+        Map<Long, String> map = new HashMap<>(list.size());
+        list.forEach(gameSupper -> map.put(gameSupper.getId(), gameSupper.getName()));
+        return map;
+    }
+}

+ 4 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java

@@ -264,7 +264,10 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         }
         //最近角色
         GameUserRole gameUserRole = gameUserRoleService.getLastGameUserRoleName(user.getId(), user.getGameId());
-        userListVO.setLastGameRoleName(gameUserRole == null ? null : gameUserRole.getRoleName());
+        if (gameUserRole != null) {
+            userListVO.setLastGameRoleName(gameUserRole.getRoleName());
+            userListVO.setUpdateTime(gameUserRole.getLastLoginTime());
+        }
         //注册充值时间差
         userListVO.setRegPayTimeDiff(DateUtils.getRegPayTimeDiff(userListVO.getCreateTime(), userListVO.getLastRechargeTime()));
         //设置关联游戏名称

+ 30 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServer.java

@@ -53,6 +53,36 @@ public class GameServer implements Serializable {
      */
     private LocalDateTime startTime;
 
+    /**
+     * 是否原始服
+     */
+    private Boolean isSourceServer;
+
+    /**
+     * 合服的主服id
+     */
+    private String mainServerId;
+
+    /**
+     * 是否参与合服
+     */
+    private Boolean isMerge;
+
+    /**
+     * 合服包含的子服列表
+     */
+    private String sonServerIds;
+
+    /**
+     * 合服包含的原始服列表
+     */
+    private String sourceServerIds;
+
+    /**
+     * 合服时间
+     */
+    private LocalDateTime mergeTime;
+
     /**
      * 1 删除  0 正常
      */

+ 58 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameSupper.java

@@ -0,0 +1,58 @@
+package com.zanxiang.game.module.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-12
+ * @description : 超父游戏
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_supper")
+public class GameSupper implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * CP ID
+     */
+    private Long cpId;
+
+    /**
+     * 游戏名称
+     */
+    private String name;
+
+    /**
+     * 1 删除  0 正常
+     */
+    @TableLogic
+    private Integer isDelete;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameSupperMapper.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.GameSupper;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-12
+ * @description :
+ */
+public interface GameSupperMapper extends BaseMapper<GameSupper> {
+}