Parcourir la source

fix : 兼容APP的渠道匹配

bilingfeng il y a 1 an
Parent
commit
b6cb2ff83a

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0, 提交用户访问下载地址提交记录接口> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0, 兼容APP的渠道匹配> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 4 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAgentService.java

@@ -3,7 +3,7 @@ package com.zanxiang.game.module.sdk.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
 import com.zanxiang.game.module.mybatis.entity.User;
-import reactor.util.function.Tuple2;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import reactor.util.function.Tuple3;
 
 import java.util.Map;
@@ -24,10 +24,10 @@ public interface IAgentService extends IService<Agent> {
     /**
      * 根据前端参数获取渠道信息
      *
-     * @param channel 通道
-     * @return {@link Tuple2}<{@link Long}, {@link Map}<{@link String}, {@link String}>>
+     * @param userData 用户数据
+     * @return {@link Tuple3}<{@link Long}, {@link Map}<{@link String}, {@link String}>, {@link String}>
      */
-    Tuple3<Long, Map<String, String>, String> getUserAgentId(String channel);
+    Tuple3<Long, Map<String, String>, String> getUserAgentId(UserData userData);
 
     /**
      * channel解析

+ 3 - 5
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserLoginLogService.java

@@ -1,7 +1,6 @@
 package com.zanxiang.game.module.sdk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserLoginLog;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 
@@ -26,10 +25,9 @@ public interface IUserLoginLogService extends IService<UserLoginLog> {
     /**
      * 创建用户登录日志
      *
-     * @param user       用户
-     * @param type       类型
-     * @param deviceType 设备类型
+     * @param type     类型
+     * @param userData 用户数据
      * @return {@link Boolean}
      */
-    Boolean createUserLoginLog(User user, Integer type, Integer deviceType);
+    Boolean createUserLoginLog(UserData userData, Integer type);
 }

+ 18 - 50
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -95,48 +95,26 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     }
 
     @Override
-    public Tuple3<Long, Map<String, String>, String> getUserAgentId(String channel) {
-        log.error("用户注册接收到的渠道参数 channel : {}", channel);
-        if (Strings.isBlank(channel)) {
-            return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
-        }
-        //数据解析
-        Map<String, String> urlParamMap = this.channelTransform(channel);
-        String shareUserId = urlParamMap.get("shareUserId");
-        //查询渠道
-        Agent agent = null;
-        if (Strings.isNotBlank(shareUserId)) {
-            User user = userService.getById(Long.valueOf(shareUserId));
-            if (user != null) {
-                agent = super.getById(user.getAgentId());
-            }
-        } else {
-            agent = this.getAgentByKey(urlParamMap);
-        }
-        if (agent == null) {
-            return Tuples.of(0L, Collections.emptyMap(), Strings.isBlank(shareUserId) ? Strings.EMPTY : shareUserId);
-        }
-        return Tuples.of(agent.getId(), urlParamMap, Strings.isBlank(shareUserId) ? Strings.EMPTY : shareUserId);
-    }
-
     public Tuple3<Long, Map<String, String>, String> getUserAgentId(UserData userData) {
+        log.error("用户注册接收到的渠道参数 userData : {}", JsonUtil.toString(userData));
+        //获取游戏信息
         GameExt gameExt = gameExtService.getByGameId(userData.getGameId());
         Game game = gameService.getById(userData.getGameId());
-        String channel = userData.getChannel();
-
+        //不投放得APP游戏按ip和ua进行渠道匹配
         if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_APP.getId())
-                && !Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.TRUE)){
-
+                && !Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.TRUE)) {
+            UserVisitLog userVisitLog = this.getUserVisitLog(userData);
+            if (userVisitLog == null) {
+                return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
+            }
+            return Tuples.of(userVisitLog.getAgentId(), Collections.emptyMap(), Strings.EMPTY);
         }
-
-
-
-        log.error("用户注册接收到的渠道参数 channel : {}", channel);
-        if (Strings.isBlank(channel)) {
+        //链接参数
+        if (Strings.isBlank(userData.getChannel())) {
             return Tuples.of(0L, Collections.emptyMap(), Strings.EMPTY);
         }
         //数据解析
-        Map<String, String> urlParamMap = this.channelTransform(channel);
+        Map<String, String> urlParamMap = this.channelTransform(userData.getChannel());
         String shareUserId = urlParamMap.get("shareUserId");
         //查询渠道
         Agent agent = null;
@@ -149,25 +127,19 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             agent = this.getAgentByKey(urlParamMap);
         }
         if (agent == null) {
-
-
-
-
-
-
             return Tuples.of(0L, Collections.emptyMap(), Strings.isBlank(shareUserId) ? Strings.EMPTY : shareUserId);
         }
         return Tuples.of(agent.getId(), urlParamMap, Strings.isBlank(shareUserId) ? Strings.EMPTY : shareUserId);
     }
 
-    public Long getUserAgentIda(UserData userData) {
+    private UserVisitLog getUserVisitLog(UserData userData) {
         //当前时间
         LocalDateTime regTime = LocalDateTime.now();
         // 0. 优先前置策略, 单独判断ip是否只有一个用户, 只有一个用户则是该用户
         List<UserVisitLog> userVisitLogList = userVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
                 .eq(UserVisitLog::getIp, userData.getIp()));
         if (CollectionUtils.isNotEmpty(userVisitLogList) && userVisitLogList.size() == 1) {
-            return userVisitLogList.get(0).getAgentId();
+            return userVisitLogList.get(0);
         }
         // 1. 策略一 : 根据 ip + ua 精准匹配用户
         userVisitLogList = userVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
@@ -176,8 +148,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                 .le(UserVisitLog::getCreateTime, regTime));
         // 判断通过策略一是否拿到数据, 筛选出访问时间与注册时间最接近的
         if (CollectionUtils.isNotEmpty(userVisitLogList)) {
-            UserVisitLog lastUserCall = this.getLastUserCall(userVisitLogList, regTime);
-            return lastUserCall == null ? null : lastUserCall.getAgentId();
+            return this.getLastUserCall(userVisitLogList, regTime);
         }
         // 2. 策略二 : 根据 ip + regTime 模糊匹配用户, 数据误差在15分钟以内
         userVisitLogList = userVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
@@ -186,8 +157,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                 .le(UserVisitLog::getCreateTime, regTime));
         // 判断通过策略二是否拿到数据, 筛选出访问时间与注册时间最接近的
         if (CollectionUtils.isNotEmpty(userVisitLogList)) {
-            UserVisitLog lastUserCall = this.getLastUserCall(userVisitLogList, regTime);
-            return lastUserCall == null ? null : lastUserCall.getAgentId();
+            return this.getLastUserCall(userVisitLogList, regTime);
         }
         // 3. 策略三 : 根据 ua + regTime 模糊匹配用户, 数据误差在15分钟以内
         userVisitLogList = userVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
@@ -196,16 +166,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
                 .le(UserVisitLog::getCreateTime, regTime));
         // 判断通过策略三是否拿到数据, 筛选出访问时间与注册时间最接近的
         if (CollectionUtils.isNotEmpty(userVisitLogList)) {
-            UserVisitLog lastUserCall = this.getLastUserCall(userVisitLogList, regTime);
-            return lastUserCall == null ? null : lastUserCall.getAgentId();
+            return this.getLastUserCall(userVisitLogList, regTime);
         }
         // 4. 策略四 : 根据 regTime 模糊匹配用户, 数据误差在15分钟以内, 此策略为兜底策略
         userVisitLogList = userVisitLogService.list(new LambdaQueryWrapper<UserVisitLog>()
                 .ge(UserVisitLog::getCreateTime, regTime.minusMinutes(15))
                 .le(UserVisitLog::getCreateTime, regTime));
         if (CollectionUtils.isNotEmpty(userVisitLogList)) {
-            UserVisitLog lastUserCall = this.getLastUserCall(userVisitLogList, regTime);
-            return lastUserCall == null ? null : lastUserCall.getAgentId();
+            return this.getLastUserCall(userVisitLogList, regTime);
         }
         return null;
     }

+ 12 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java

@@ -56,7 +56,7 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         Integer dataType = param.getDataType();
         //选择服务器
         if (Objects.equals(dataType, DataTypeEnum.TYPE_SELECT_SERVER.getDateType())) {
-            return userLoginLogService.createRoleLoginLog(userData, param.getRoleId(), param.getRoleName(), LoginTypeEnum.LOGIN_IN.getLoginType());
+            return Boolean.TRUE;
         }
         //创建角色
         if (Objects.equals(dataType, DataTypeEnum.TYPE_CREATE_ROLE.getDateType())) {
@@ -65,6 +65,16 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
             //插入用户登录记录
             return userLoginLogService.createRoleLoginLog(userData, param.getRoleId(), param.getRoleName(), LoginTypeEnum.LOGIN_IN.getLoginType());
         }
+        //判断角色是否存在
+        GameUserRole gameUserRole = super.getOne(new LambdaQueryWrapper<GameUserRole>()
+                .eq(GameUserRole::getUserId, userData.getUserId())
+                .eq(GameUserRole::getGameId, userData.getGameId())
+                .eq(GameUserRole::getRoleId, param.getRoleId()));
+        //逻辑兜底, 万一角色未创建成功, 补充创建
+        if (gameUserRole == null) {
+            //新建游戏角色
+            this.createRoleUpdate(param, userData);
+        }
         //进入游戏
         if (Objects.equals(dataType, DataTypeEnum.TYPE_ENTER_GAME.getDateType())) {
             //插入用户登录记录
@@ -80,6 +90,7 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                     .set(param.getRoleVipLevel() != null, GameUserRole::getRoleVipLevel, param.getRoleVipLevel())
                     .set(param.getRolePower() != null, GameUserRole::getRolePower, param.getRolePower())
                     .set(GameUserRole::getUpdateTime, param.getRoleGradeUpdateTime() == null || param.getRoleGradeUpdateTime() <= 0 ? LocalDateTime.now() : DateUtil.secondToLocalDateTime(param.getRoleGradeUpdateTime()))
+                    .eq(GameUserRole::getUserId, userData.getUserId())
                     .eq(GameUserRole::getGameId, userData.getGameId())
                     .eq(GameUserRole::getRoleId, param.getRoleId()));
         }

+ 3 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

@@ -228,7 +228,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
 
     private User userCreateSave(UserData userData, String userName, String password, String mobile, String openId, String sessionKey) {
         //渠道id, 链接参数, 分享人id
-        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(userData.getChannel());
+        Tuple3<Long, Map<String, String>, String> tuple3 = agentService.getUserAgentId(userData);
         //分享人id
         Long shareUserId = Strings.isBlank(tuple3.getT3()) ? null : Long.valueOf(tuple3.getT3());
         //用户参数补充
@@ -282,7 +282,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //获取token
         String userToken = userTokenService.getUserToken(user.getId(), userData.getDeviceType());
         //插入用户登录记录
-        userLoginLogService.createUserLoginLog(user, LoginTypeEnum.LOGIN_REG.getLoginType(), userData.getDeviceType());
+        userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_REG.getLoginType());
         //查询用户实名信息
         UserCard userCard = userCardService.getOne(new LambdaQueryWrapper<UserCard>().eq(UserCard::getUserId, user.getId()));
         //查询游戏
@@ -309,7 +309,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
     public Boolean loginOut(UserData userData) {
         User user = userService.getById(userData.getUserId());
         //新增用户退出记录
-        return userLoginLogService.createUserLoginLog(user, LoginTypeEnum.LOGIN_OUT.getLoginType(), userData.getDeviceType());
+        return userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_OUT.getLoginType());
     }
 
     @Override

+ 6 - 7
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserLoginLogServiceImpl.java

@@ -1,7 +1,6 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserLoginLog;
 import com.zanxiang.game.module.mybatis.mapper.UserLoginLogMapper;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
@@ -37,13 +36,13 @@ public class UserLoginLogServiceImpl extends ServiceImpl<UserLoginLogMapper, Use
     }
 
     @Override
-    public Boolean createUserLoginLog(User user, Integer type, Integer deviceType) {
+    public Boolean createUserLoginLog(UserData userData, Integer type) {
         return super.save(UserLoginLog.builder()
-                .userId(user.getId())
-                .gameId(user.getGameId())
-                .os(user.getDeviceSystem())
-                .ip(user.getIp())
-                .deviceType(deviceType)
+                .userId(userData.getUserId())
+                .gameId(userData.getGameId())
+                .os(userData.getDeviceSystem())
+                .ip(userData.getIp())
+                .deviceType(userData.getDeviceType())
                 .type(type)
                 .createTime(LocalDateTime.now())
                 .build());

+ 11 - 5
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

@@ -10,13 +10,11 @@ import com.zanxiang.game.module.mybatis.entity.UserToken;
 import com.zanxiang.game.module.mybatis.mapper.UserTokenMapper;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.ExpireTimeEnum;
+import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.TokenCheckEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.UserTokenDTO;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
-import com.zanxiang.game.module.sdk.service.IGameExtService;
-import com.zanxiang.game.module.sdk.service.IIpBanService;
-import com.zanxiang.game.module.sdk.service.IUserService;
-import com.zanxiang.game.module.sdk.service.IUserTokenService;
+import com.zanxiang.game.module.sdk.service.*;
 import com.zanxiang.game.module.sdk.util.RedisUtil;
 import com.zanxiang.game.module.sdk.util.SignUtil;
 import com.zanxiang.module.util.JsonUtil;
@@ -54,6 +52,9 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     @Autowired
     private IUserService userService;
 
+    @Autowired
+    private IUserLoginLogService userLoginLogService;
+
     @Override
     public ResultVO<Long> cpTokenCheck(String appId, Long userId, String token, String sign) {
         //查询登录签名
@@ -131,7 +132,12 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         //判断token是否过期
         long endTime = DateUtils.localDateTimeToSecond(LocalDateTime.now().plusDays(1));
         //判断有效期时间是否大于1天
-        return expireTime > endTime;
+        boolean result = expireTime > endTime;
+        //token未过期, 记录登录日志
+        if (result) {
+            userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_REG.getLoginType());
+        }
+        return result;
     }
 
     @Override