Browse Source

Merge branch 'package' of GameCenter/game-center into dev

zhimo 2 weeks ago
parent
commit
4859d142df
18 changed files with 368 additions and 65 deletions
  1. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java
  2. 11 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppCallbackXgltMapper.java
  3. 119 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppCallbackXglt.java
  4. 26 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/GameOceanengineAppCallbackXgltService.java
  5. 125 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackXgltServiceImpl.java
  6. 5 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java
  7. 5 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/vo/AgentRpcVO.java
  8. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  9. 0 6
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  10. 6 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java
  11. 5 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/AgentVO.java
  12. 0 7
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IUserAgentLogService.java
  13. 1 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java
  14. 0 50
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserAgentLogServiceImpl.java
  15. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Agent.java
  16. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameSupper.java
  17. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/UserEvent.java
  18. 48 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/IpBanServiceImpl.java

+ 1 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java

@@ -18,7 +18,7 @@ public class GameBackApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GameBackApplication.class, args);
-        System.out.println("腾讯广告新增监测链接注册回传(监测链接callBackUrl匹配优化) (´・・)ノ(._.`)  \n" +
+        System.out.println("腾讯广告新增监测链接注册回传(星广联投监测链接) (´・・)ノ(._.`)  \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 11 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppCallbackXgltMapper.java

@@ -0,0 +1,11 @@
+package com.zanxiang.game.back.serve.dao.mapper;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface GameOceanengineAppCallbackXgltMapper extends BaseMapper<GameOceanengineAppCallbackXglt> {
+}
+
+
+
+

+ 119 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppCallbackXglt.java

@@ -0,0 +1,119 @@
+package com.zanxiang.game.back.serve.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 头条游戏 APP 星广联投AD版监测链接回传数据(文档:<a href="https://bytedance.larkoffice.com/docx/OUQ6d50Rpoga7YxrqUrchWp0ncg">...</a>
+ *
+ * @TableName t_game_oceanengine_app_callback_xglt
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName(GameOceanengineAppCallbackXglt.TABLE_NAME)
+public class GameOceanengineAppCallbackXglt implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "t_game_oceanengine_app_callback_xglt";
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 时间发生日期
+     */
+    private LocalDate day;
+
+    /**
+     * 13位豪秒时间戳
+     */
+    private Long ts;
+
+    /**
+     * 客户端操作系统的类型, 0–Android,1–iOS,2–WP,3-Others
+     */
+    private Integer os;
+
+    /**
+     * User_Agent
+     */
+    private String ua;
+
+    /**
+     * 星广联投AD版的任务id
+     */
+    private Long demandId;
+
+    /**
+     * 用户终端的公共 IP
+     */
+    private String ip;
+
+    /**
+     * 第6版网际协议
+     */
+    private String ipv6;
+
+    /**
+     * 手机型号代码
+     */
+    private String model;
+
+    /**
+     * 视频ID,发布视频后产生的视频唯一ID
+     */
+    private Long itemId;
+
+    /**
+     * 素材ID,广告平台上披露的视频素材ID
+     */
+    private Long mid3;
+
+    /**
+     * 回调参数
+     */
+    private String callbackParam;
+
+    /**
+     * 安卓的设备 IMEI 的 MD5
+     */
+    private String imeiMd5;
+
+    /**
+     * iOS设备IDFA的 MD5
+     */
+    private String idfaMd5;
+
+    /**
+     * Android Q及更高版本的设备号的MD5
+     */
+    private String oaidMd5;
+
+    /**
+     * Android 8及更高版本的设备标识符的MD5
+     */
+    private String androidIdMd5;
+
+    /**
+     * 中国广告协会互联网广告标识,json格式
+     */
+    private String caidMd5;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 26 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/GameOceanengineAppCallbackXgltService.java

@@ -0,0 +1,26 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+
+import java.util.Map;
+
+public interface GameOceanengineAppCallbackXgltService extends IService<GameOceanengineAppCallbackXglt> {
+
+    /**
+     * 回调处理
+     *
+     * @param paramMap : 回调参数
+     * @return : 返回结果
+     */
+    boolean callback(Map<String, Object> paramMap);
+
+    /**
+     * 获取回调参数
+     *
+     * @param userLog : 用户日志
+     * @return : 返回结果
+     */
+    String getCallBackParamByUser(GameOceanengineAppUserLog userLog);
+}

+ 125 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackXgltServiceImpl.java

@@ -0,0 +1,125 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppCallbackXgltMapper;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallbackXglt;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+import com.zanxiang.game.back.serve.service.GameOceanengineAppCallbackXgltService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.DateUtil;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.URIUtil;
+import com.zanxiang.module.util.encryption.Md5Util;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@Slf4j
+@Service
+public class GameOceanengineAppCallbackXgltServiceImpl extends ServiceImpl<GameOceanengineAppCallbackXgltMapper, GameOceanengineAppCallbackXglt>
+        implements GameOceanengineAppCallbackXgltService {
+
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Override
+    public boolean callback(Map<String, Object> paramMap) {
+        try {
+            GameOceanengineAppCallbackXglt callback = JsonUtil.toObj(JsonUtil.toString(paramMap), GameOceanengineAppCallbackXglt.class);
+            callback.setDay(callback.getTs() == null || callback.getTs() < 1000 ? LocalDate.now() : DateUtil.milliToLocalDate(callback.getTs()));
+            callback.setCreateTime(LocalDateTime.now());
+            save(callback);
+        } catch (Exception e) {
+            log.error("接收到头条星广联投测链接数据保存异常, paramMap : {}, errorMsg : {}", JsonUtil.toString(paramMap), e.getMessage(), e);
+        }
+        return true;
+    }
+
+    @Override
+    public String getCallBackParamByUser(GameOceanengineAppUserLog userLog) {
+        //没有渠道标识, 无法匹配
+        if (StringUtils.isBlank(userLog.getAgentKey())) {
+            return null;
+        }
+        try {
+            ResultVO<List<AgentRpcVO>> resultVO = agentRpc.getByAgentKeys(Collections.singletonList(userLog.getAgentKey()));
+            Long demandId = Optional.ofNullable(resultVO).map(ResultVO::getData)
+                    .filter(list -> !list.isEmpty()).map(list -> list.get(0))
+                    .map(AgentRpcVO::getXgltDemandId).orElse(null);
+            if (demandId == null) {
+                return null;
+            }
+            GameOceanengineAppCallbackXglt callBack = this.getCallBack(demandId, userLog.getAndroidId(), userLog.getOaid(),
+                    userLog.getImei(), userLog.getActiveTime());
+            return callBack == null ? null : callBack.getCallbackParam();
+        } catch (Exception e) {
+            log.error("头条APP玩家匹配星广联投监测链接数据异常, userLogId : {}, e : {}", JsonUtil.toString(userLog), e.getMessage(), e);
+        }
+        return null;
+    }
+
+    private GameOceanengineAppCallbackXglt getCallBack(Long demandId, String androidId, String oaid, String imei, LocalDateTime regTime) {
+        //星广联投任务id不存在, 不可匹配
+        if (demandId == null) {
+            return null;
+        }
+        LambdaQueryWrapper<GameOceanengineAppCallbackXglt> queryWrapper = new LambdaQueryWrapper<GameOceanengineAppCallbackXglt>()
+                .lt(GameOceanengineAppCallbackXglt::getTs, DateUtil.localDateTimeToMilli(regTime))
+                .eq(GameOceanengineAppCallbackXglt::getDemandId, demandId)
+                .orderByDesc(GameOceanengineAppCallbackXglt::getTs)
+                .last("limit 1");
+        //条件匹配
+        queryWrapper.and(qw -> {
+            boolean hasCondition = false;
+            //安卓id匹配
+            if (StringUtils.isNoneBlank(androidId)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getAndroidIdMd5, Md5Util.encrypt32(androidId));
+                hasCondition = true;
+            }
+            //oaid匹配
+            if (StringUtils.isNoneBlank(oaid)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getOaidMd5, Md5Util.encrypt32(oaid));
+                hasCondition = true;
+            }
+            //imei匹配
+            if (StringUtils.isNoneBlank(imei)) {
+                qw.or().eq(GameOceanengineAppCallbackXglt::getImeiMd5, Md5Util.encrypt32(imei));
+                hasCondition = true;
+            }
+            // 避免无条件的OR查询
+            if (!hasCondition) {
+                qw.or().apply("1=0");
+            }
+        });
+        //返回星广联投监测链接数据
+        return super.getOne(queryWrapper);
+    }
+
+    private String doCallBack(String callback, String eventType, Long amount) {
+        Map<String, String> paramMap = new HashMap<>(3);
+        paramMap.put("callback", callback);
+        paramMap.put("event_type", eventType);
+        //付费回传
+        if (Objects.equals(eventType, "2") && amount != null) {
+            Map<String, String> payAmount = Collections.singletonMap("pay_amount", amount.toString());
+            paramMap.put("props", URIUtil.encodeURIComponent(JsonUtil.toString(payAmount)));
+        }
+        String uri = URIUtil.fillUrlParams("https://ad.oceanengine.com/track/activate/", paramMap, false);
+        return restTemplate.getForObject(uri, String.class);
+    }
+}

+ 5 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java

@@ -92,6 +92,11 @@ public enum HttpStatusEnum {
      */
     ACCOUNT_NOT_BIND_PHONE(41110, "账户未绑定手机"),
 
+    /**
+     * 服务器正在维护中
+     */
+    SERVER_MAINTAIN(41111, "服务器正在维护中"),
+
     /**
      * 手机号请使用手机注册
      */

+ 5 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/vo/AgentRpcVO.java

@@ -55,6 +55,11 @@ public class AgentRpcVO implements Serializable {
      */
     private String reportUrl;
 
+    /**
+     * 头条星广联投任务 id
+     */
+    private Long xgltDemandId;
+
     /**
      * 投放状态
      */

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

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (游戏聊天记录功能上线-04 ・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (头条渠道兼容星广联投任务id-01 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 0 - 6
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java

@@ -81,7 +81,6 @@ public class AgentController {
         return ResultVO.ok(agentService.add(dto));
     }
 
-
     @PreAuthorize(permissionKey = "manage:agent:configPutStatus")
     @PutMapping("/configPutStatus/{agentIds}/{putStatus}")
     public ResultVO<Boolean> configPutStatus(@PathVariable("agentIds") List<Long> agentIds, @PathVariable("putStatus") Integer putStatus) {
@@ -94,9 +93,4 @@ public class AgentController {
         return ResultVO.ok(agentService.configBackPolicy(agentIds, backPolicyId));
     }
 
-    @PutMapping("/user/agent/log/update")
-    public ResultVO<Void> userAgentLogUpdate(@RequestParam Boolean isRunUpdate) {
-        userAgentLogService.userAgentLogUpdate(isRunUpdate);
-        return ResultVO.ok();
-    }
 }

+ 6 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java

@@ -63,6 +63,12 @@ public class AgentAddParam {
     @ApiModelProperty(notes = "头条回传 url")
     private String reportUrl;
 
+    /**
+     * 头条星广联投任务 id
+     */
+    @ApiModelProperty(notes = "头条星广联投任务 id")
+    private Long xgltDemandId;
+
     /**
      * 投放状态
      */

+ 5 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/AgentVO.java

@@ -53,6 +53,11 @@ public class AgentVO {
      */
     private String reportUrl;
 
+    /**
+     * 头条星广联投任务 id
+     */
+    private Long xgltDemandId;
+
     /**
      * 投放状态
      */

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

@@ -11,13 +11,6 @@ import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
  */
 public interface IUserAgentLogService extends IService<UserAgentLog> {
 
-    /**
-     * 数据修正
-     *
-     * @param isRunUpdate : 是否执行修正
-     */
-    void userAgentLogUpdate(boolean isRunUpdate);
-
     /**
      * 注册代理日志
      *

+ 1 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java

@@ -151,6 +151,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                 .userActionSetId(dto.getUserActionSetId())
                 .reportToken(dto.getReportToken())
                 .reportUrl(dto.getReportUrl())
+                .xgltDemandId(dto.getXgltDemandId())
                 .backPolicyId(dto.getBackPolicyId())
                 .putStatus(dto.getPutStatus())
                 .createTime(LocalDateTime.now())

+ 0 - 50
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserAgentLogServiceImpl.java

@@ -1,6 +1,5 @@
 package com.zanxiang.game.module.manage.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.manage.service.IUserAgentLogService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
@@ -8,13 +7,9 @@ import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
 import com.zanxiang.game.module.mybatis.mapper.UserAgentLogMapper;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Objects;
-
 /**
  * @author : lingfeng
  * @time : 2023-07-20
@@ -24,51 +19,6 @@ import java.util.Objects;
 @Service
 public class UserAgentLogServiceImpl extends ServiceImpl<UserAgentLogMapper, UserAgentLog> implements IUserAgentLogService {
 
-    @Override
-    public void userAgentLogUpdate(boolean isRunUpdate) {
-        List<UserAgentLog> errorList = super.list(new LambdaQueryWrapper<UserAgentLog>()
-                .isNotNull(UserAgentLog::getOldAgentId)
-                .isNotNull(UserAgentLog::getNewAgentId)
-                .apply("old_agent_id=new_agent_id"));
-        if (CollectionUtils.isEmpty(errorList)) {
-            log.error("查询到可修正的数据列表为空!!!");
-            return;
-        }
-        log.error("查询到数据 count : {}", errorList.size());
-        if (!isRunUpdate) {
-            return;
-        }
-        int count = 0;
-        for (UserAgentLog userAgentLog : errorList) {
-            this.agentLogUpdate(userAgentLog);
-            count++;
-            log.error("第 count : {} 条数据, id : {} 修正", count, userAgentLog.getId());
-        }
-        log.error("=========== 全部修正完成 ===========");
-    }
-
-    private void agentLogUpdate(UserAgentLog userAgentLog) {
-        //不是错误数据
-        if (!Objects.equals(userAgentLog.getOldAgentId(), userAgentLog.getNewAgentId())) {
-            return;
-        }
-        //根据 userId 和 createTime 查询上一条数据
-        UserAgentLog beforeLog = super.getOne(new LambdaQueryWrapper<UserAgentLog>()
-                .eq(UserAgentLog::getUserId, userAgentLog.getUserId())
-                .lt(UserAgentLog::getCreateTime, userAgentLog.getCreateTime())
-                .orderByDesc(UserAgentLog::getCreateTime)
-                .last("limit 1"));
-        //未查询到上一条记录, 不做修正
-        if (beforeLog == null) {
-            log.error("查询上一条记录结果为空-------!!!!!!, logId : {}", userAgentLog.getId());
-            return;
-        }
-        //数据修正
-        userAgentLog.setOldAgentId(beforeLog.getNewAgentId());
-        userAgentLog.setOldChannel(beforeLog.getNewChannel());
-        super.updateById(userAgentLog);
-    }
-
     @Override
     public boolean regAgentLog(User user) {
         if (Agent.DEFAULT_AGENT.equals(user.getAgentId()) || Strings.isBlank(user.getChannel())) {

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Agent.java

@@ -83,6 +83,11 @@ public class Agent implements Serializable {
      */
     private String reportUrl;
 
+    /**
+     * 头条星广联投任务 id
+     */
+    private Long xgltDemandId;
+
     /**
      * 投放状态
      */

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

@@ -60,6 +60,11 @@ public class GameSupper implements Serializable {
      */
     private String cpServerKey;
 
+    /**
+     * 服务器维护中
+     */
+    private Boolean serverMaintain;
+
     /**
      * 1 删除  0 正常
      */

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/UserEvent.java

@@ -42,4 +42,9 @@ public class UserEvent implements Serializable {
      * 绑定手机号码
      */
     private String mobile;
+
+    /**
+     * 公网IP
+     */
+    private String ip;
 }

+ 48 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/IpBanServiceImpl.java

@@ -1,16 +1,27 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
+import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.mybatis.entity.Game;
+import com.zanxiang.game.module.mybatis.entity.GameSupper;
 import com.zanxiang.game.module.mybatis.entity.IpBan;
+import com.zanxiang.game.module.mybatis.entity.UserEvent;
 import com.zanxiang.game.module.mybatis.mapper.IpBanMapper;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import com.zanxiang.game.module.sdk.service.IGameService;
+import com.zanxiang.game.module.sdk.service.IGameSupperService;
 import com.zanxiang.game.module.sdk.service.IIpBanService;
+import com.zanxiang.game.module.sdk.service.IUserEventService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * @author : lingfeng
@@ -21,6 +32,15 @@ import java.util.Objects;
 @Service
 public class IpBanServiceImpl extends ServiceImpl<IpBanMapper, IpBan> implements IIpBanService {
 
+    @Autowired
+    private IUserEventService userEventService;
+
+    @Autowired
+    private IGameSupperService gameSupperService;
+
+    @Autowired
+    private IGameService gameService;
+
     @Override
     public boolean checkIpBan(UserData userData) {
         IpBan ipBan = super.getOne(new LambdaUpdateWrapper<IpBan>()
@@ -30,4 +50,32 @@ public class IpBanServiceImpl extends ServiceImpl<IpBanMapper, IpBan> implements
         return ipBan != null && Objects.equals(ipBan.getStatus(), BanStatusEnum.BAN_STATUS.getStatus());
     }
 
+    public Tuple2<Boolean, HttpStatusEnum> checkIpBanAndGetStatus(UserData userData) {
+        IpBan ipBan = super.getOne(new LambdaUpdateWrapper<IpBan>()
+                .eq(IpBan::getIp, userData.getIp())
+                .eq(IpBan::getGameId, userData.getGameId())
+        );
+        if (ipBan != null && Objects.equals(ipBan.getStatus(), BanStatusEnum.BAN_STATUS.getStatus())) {
+            return Tuple2.with(Boolean.TRUE, HttpStatusEnum.IP_HALT);
+        }
+        //获取游戏维护状态
+        Boolean serverMaintain = Optional.ofNullable(gameService.getById(userData.getGameId()))
+                .map(Game::getSuperGameId)
+                .flatMap(superGameId -> Optional.ofNullable(gameSupperService.getById(superGameId)))
+                .map(GameSupper::getServerMaintain)
+                .orElse(null);
+        //没有维护, 直接放行
+        if (!Objects.equals(serverMaintain, Boolean.TRUE)) {
+            return Tuple2.with(Boolean.FALSE, HttpStatusEnum.SUCCESS);
+        }
+        //维护中, 测试账号直接放行
+        if (userEventService.count(new LambdaQueryWrapper<UserEvent>()
+                .eq(UserEvent::getGameId, userData.getGameId())
+                .eq(UserEvent::getIp, userData.getIp())
+        ) > 0) {
+            return Tuple2.with(Boolean.FALSE, HttpStatusEnum.SUCCESS);
+        }
+        //返回服务器正在维护中
+        return Tuple2.with(Boolean.TRUE, HttpStatusEnum.SERVER_MAINTAIN);
+    }
 }