Просмотр исходного кода

fix : 用过超过30天未登录, 从新的渠道进入, 用户渠道更新

bilingfeng 1 год назад
Родитель
Сommit
7146373a18

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

@@ -2,6 +2,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 java.util.Map;
@@ -11,6 +12,14 @@ import java.util.Map;
  */
 public interface IAgentService extends IService<Agent> {
 
+    /**
+     * 用户渠道更新
+     *
+     * @param user    用户
+     * @param channel 通道
+     */
+    void userAgentUpdate(User user, String channel);
+
     /**
      * 根据前端参数获取渠道信息
      *

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

@@ -1,6 +1,8 @@
 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;
 
 /**
@@ -8,7 +10,7 @@ import com.zanxiang.game.module.sdk.pojo.param.UserData;
  * @time : 2022-06-13
  * @description :
  */
-public interface IUserLoginLogService {
+public interface IUserLoginLogService extends IService<UserLoginLog> {
 
     /**
      * 创建角色登录日志

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

@@ -1,12 +1,18 @@
 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.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.mybatis.entity.Agent;
 import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.entity.UserLoginLog;
 import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
 import com.zanxiang.game.module.sdk.service.IAgentService;
+import com.zanxiang.game.module.sdk.service.ICallBackService;
+import com.zanxiang.game.module.sdk.service.IUserLoginLogService;
 import com.zanxiang.game.module.sdk.service.IUserService;
+import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,8 +20,10 @@ import org.springframework.stereotype.Service;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuples;
 
+import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,8 +36,49 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
     @Autowired
     private IUserService userService;
 
-    public void userAgentUpdate(Long userId, String channel) {
+    @Autowired
+    private IUserLoginLogService userLoginLogService;
+
+    @Autowired
+    private ICallBackService callBackService;
 
+    @Override
+    public void userAgentUpdate(User user, String channel) {
+        //渠道为空
+        if (Strings.isBlank(channel)) {
+            return;
+        }
+        log.error("接收到的渠道参数 user : {}, channel : {}", JsonUtil.toString(user), channel);
+        //判断用户是否超过30天未登录
+        List<UserLoginLog> userLoginLogList = userLoginLogService.list(new LambdaQueryWrapper<UserLoginLog>()
+                .eq(UserLoginLog::getUserId, user.getId())
+                .orderByDesc(UserLoginLog::getCreateTime)
+                .apply("limit 1"));
+        if (CollectionUtils.isEmpty(userLoginLogList)) {
+            return;
+        }
+        //最近登录时间
+        LocalDateTime lastLoginTime = userLoginLogList.get(0).getCreateTime();
+        //最近登录未超过30天
+        if (lastLoginTime.plusDays(30L).isAfter(LocalDateTime.now())) {
+            return;
+        }
+        //30天未登录, 更新渠道
+        Map<String, String> urlParamMap = this.channelTransform(channel);
+        //查询渠道
+        String state = urlParamMap.get("state");
+        Agent agent = super.getOne(new LambdaQueryWrapper<Agent>()
+                .eq(Agent::getAgentKey, state));
+        if (agent == null) {
+            return;
+        }
+        //更新用户信息
+        userService.update(new LambdaUpdateWrapper<User>()
+                .set(User::getAgentId, agent.getId())
+                .set(User::getUpdateTime, LocalDateTime.now())
+                .eq(User::getId, user.getId()));
+        //回传用户信息
+        callBackService.userCallBack(user, Tuples.of(agent.getId(), urlParamMap));
     }
 
     @Override

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

@@ -111,6 +111,8 @@ public class LoginServiceImpl implements IRegisterLoginService {
             userService.update(new LambdaUpdateWrapper<User>()
                     .set(User::getSessionKey, sessionKey)
                     .eq(User::getId, user.getId()));
+            //渠道更新和回传判断
+            agentService.userAgentUpdate(user, userData.getChannel());
             //判断账号是否停用
             if (Objects.equals(BanStatusEnum.BAN_STATUS.getStatus(), user.getStatus())) {
                 return ResultVO.fail(HttpStatusEnum.ACCOUNT_HALT.getMsg());
@@ -146,6 +148,8 @@ public class LoginServiceImpl implements IRegisterLoginService {
                 user = userService.getOne(new LambdaQueryWrapper<User>()
                         .eq(User::getGameId, userData.getGameId()).eq(User::getUsername, username));
             }
+            //渠道更新和回传判断
+            agentService.userAgentUpdate(user, userData.getChannel());
             //用户信息不存在
             if (user == null) {
                 return ResultVO.fail(HttpStatusEnum.USERNAME_OR_PASSWORD_ERR.getMsg());
@@ -191,6 +195,8 @@ public class LoginServiceImpl implements IRegisterLoginService {
                 .eq(User::getGameId, userData.getGameId()).eq(User::getMobile, mobile));
         //用户信息存在
         if (user != null) {
+            //渠道更新和回传判断
+            agentService.userAgentUpdate(user, userData.getChannel());
             //判断账号是否停用
             if (Objects.equals(BanStatusEnum.BAN_STATUS.getStatus(), user.getStatus())) {
                 return ResultVO.fail(HttpStatusEnum.ACCOUNT_HALT.getMsg());