소스 검색

feat : APP测试账号全量回传

bilingfeng 9 달 전
부모
커밋
4559f53a56

+ 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服务启动成功 <APP测试账号全量回传> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <CP数据推送新增log日志记录> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 182 - 100
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java

@@ -6,6 +6,7 @@ import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.DeleteEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
+import com.zanxiang.game.module.sdk.enums.CpPushDataEnum;
 import com.zanxiang.game.module.sdk.enums.DeviceTypeEnum;
 import com.zanxiang.game.module.sdk.enums.KafkaEventTrackEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
@@ -23,8 +24,10 @@ import org.apache.logging.log4j.util.Strings;
 import org.json.JSONObject;
 import org.redisson.api.RLock;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuple3;
 import reactor.util.function.Tuples;
@@ -80,11 +83,19 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
     @Autowired
     private IOrderService orderService;
 
+    @Autowired
+    private TransactionDefinition transactionDefinition;
+
+    @Autowired
+    private ICpPushErrorLogService cpPushErrorLogService;
+
+    @Autowired
+    private DataSourceTransactionManager dataSourceTransactionManager;
+
     @Autowired
     private IDistributedLockComponent distributedLockComponent;
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public CpPushResultVO pushOrder(String gameAppId, CpPushOrderParam param) {
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
@@ -92,15 +103,28 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         Order order = orderService.getOne(new LambdaQueryWrapper<Order>()
                 .eq(Order::getGameId, game.getId())
                 .eq(Order::getCpOrderId, param.getOrderId()));
-        if (order == null) {
-            order = this.createOrder(game, param);
-        } else {
-            order.setStatus(param.getStatus());
-            order.setPayTime(param.getPayTime());
-            order.setUpdateTime(LocalDateTime.now());
+        // 手动开启事务
+        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
+        try {
+            if (order == null) {
+                order = this.createOrder(game, param);
+            } else {
+                order.setStatus(param.getStatus());
+                order.setPayTime(param.getPayTime());
+                order.setUpdateTime(LocalDateTime.now());
+            }
+            //订单更新或者保存
+            orderService.saveOrUpdate(order);
+            // 提交事务
+            dataSourceTransactionManager.commit(transactionStatus);
+        } catch (Exception e) {
+            // 回滚事务
+            dataSourceTransactionManager.rollback(transactionStatus);
+            //保存错误日志
+            cpPushErrorLogService.createLog(game.getId(), CpPushDataEnum.CP_PUSH_DATA_ORDER, param, e.getMessage());
+            //抛出异常
+            throw new BaseException(e.getMessage());
         }
-        //订单更新或者保存
-        orderService.saveOrUpdate(order);
         //订单回传
         callBackService.orderCallBack(BeanUtil.copy(order, PlatformOrderDTO.class));
         //判断订单行为
@@ -118,7 +142,7 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
     private Order createOrder(Game game, CpPushOrderParam param) {
         String lockKey = RedisKeyConstant.ORDER_CREATE_LOCK + param.getOpenId() + "_" + param.getOrderId();
         if (!distributedLockComponent.doLock(lockKey, 0L, 1L, TimeUnit.MINUTES)) {
-            log.error("订单正在创建中, param : {}", JsonUtil.toString(param));
+            log.error("[订单推送]正在创建中, param : {}", JsonUtil.toString(param));
             throw new BaseException("接口调用订单正在创建中");
         }
         try {
@@ -127,25 +151,30 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
                     .eq(User::getOpenId, param.getOpenId())
                     .eq(User::getGameId, game.getId()));
             if (user == null) {
-                throw new BaseException("参数错误, 玩家信息不存在");
+                log.error("[订单推送]游戏玩家信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[订单推送]玩家信息不存在");
             }
             //玩家信息
             GameUser gameUser = gameUserService.getOne(new LambdaQueryWrapper<GameUser>()
                     .eq(GameUser::getUserId, user.getId()));
+            if (gameUser == null) {
+                log.error("[订单推送]游戏玩家信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[订单推送]游戏玩家信息不存在");
+            }
             //角色信息
             GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
                     .eq(GameUserRole::getGameId, game.getId())
                     .eq(GameUserRole::getUserId, user.getId())
                     .eq(GameUserRole::getRoleId, param.getRoleId()));
-            if (gameUser == null || gameUserRole == null) {
-                log.error("游戏用户信息不全, gameUser : {}, gameUserRole : {}", JsonUtil.toString(gameUser), JsonUtil.toString(gameUserRole));
-                throw new BaseException("参数错误, 游戏用户信息不全");
+            if (gameUserRole == null) {
+                log.error("[订单推送]角色信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[订单推送]角色信息不存在");
             }
             //构造订单
             return this.transform(game, param, user, gameUser, gameUserRole);
         } catch (Exception e) {
-            log.error("订单数据推送创建订单异常, param : {}, e : {}", JsonUtil.toString(param), e.getMessage(), e);
-            throw new BaseException("订单数据推送创建订单异常");
+            log.error("[订单推送]订单创建出现异常, game : {}, param : {}, e : {}", JsonUtil.toString(game), JsonUtil.toString(param), e.getMessage(), e);
+            throw new BaseException("[订单推送]订单创建出现异常!");
         } finally {
             RLock rLock = distributedLockComponent.getLock(lockKey);
             if (rLock != null) {
@@ -190,55 +219,76 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
     public CpPushResultVO pushActive(String gameAppId, CpPushActiveParam param) {
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
-        //查询玩家信息
-        User user = userService.getOne(new LambdaQueryWrapper<User>()
-                .eq(User::getOpenId, param.getOpenId())
-                .eq(User::getGameId, game.getId()));
-        if (user == null) {
-            throw new BaseException("参数错误, 玩家信息不存在");
-        }
-        //查询角色信息
-        GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
-                .eq(GameUserRole::getUserId, user.getId())
-                .eq(GameUserRole::getGameId, game.getId())
-                .eq(GameUserRole::getServerId, param.getServerId())
-                .eq(GameUserRole::getRoleId, param.getRoleId())
-                .orderByDesc(GameUserRole::getCreateTime)
-                .last("limit 1"));
-        if (gameUserRole == null) {
-            throw new BaseException("参数错误, 玩家角色信息不存在");
+        try {
+            //查询玩家信息
+            User user = userService.getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getOpenId, param.getOpenId())
+                    .eq(User::getGameId, game.getId()));
+            if (user == null) {
+                log.error("[活跃推送]玩家信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[活跃推送]角色信息不存在");
+            }
+            //查询角色信息
+            GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
+                    .eq(GameUserRole::getUserId, user.getId())
+                    .eq(GameUserRole::getGameId, game.getId())
+                    .eq(GameUserRole::getServerId, param.getServerId())
+                    .eq(GameUserRole::getRoleId, param.getRoleId())
+                    .orderByDesc(GameUserRole::getCreateTime)
+                    .last("limit 1"));
+            if (gameUserRole == null) {
+                log.error("[活跃推送]角色信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[活跃推送]角色信息不存在");
+            }
+            //角色活跃信息上报到卡夫卡
+            kafkaService.roleActiveTrack(gameUserRole, param.getActiveType());
+        } catch (Exception e) {
+            //保存错误日志
+            cpPushErrorLogService.createLog(game.getId(), CpPushDataEnum.CP_PUSH_DATA_ACTIVE, param, e.getMessage());
+            //抛出异常
+            throw new BaseException(e.getMessage());
         }
-        //角色活跃信息上报到卡夫卡
-        kafkaService.roleActiveTrack(gameUserRole, param.getActiveType());
         //构造返回
         return CpPushResultVO.builder().result(Boolean.TRUE).build();
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public CpPushResultVO pushServer(String gameAppId, CpPushServerParam param) {
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
-        //查询区服id
-        GameServer gameServer = gameServerService.getOne(new LambdaQueryWrapper<GameServer>()
-                .eq(GameServer::getGameId, game.getSuperGameId())
-                .eq(GameServer::getServerId, param.getServerId())
-        );
-        GameServer transform = this.transform(game.getSuperGameId(), param);
-        if (gameServer == null) {
-            gameServer = transform;
-        } else {
-            gameServer.setGameId(transform.getGameId());
-            gameServer.setServerId(transform.getServerId());
-            gameServer.setServerName(transform.getServerName());
-            gameServer.setNickName(transform.getNickName());
-            gameServer.setStartTime(transform.getStartTime());
-            gameServer.setUpdateTime(LocalDateTime.now());
+        // 手动开启事务
+        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
+        try {
+            //查询区服id
+            GameServer gameServer = gameServerService.getOne(new LambdaQueryWrapper<GameServer>()
+                    .eq(GameServer::getGameId, game.getSuperGameId())
+                    .eq(GameServer::getServerId, param.getServerId())
+            );
+            GameServer transform = this.transform(game.getSuperGameId(), param);
+            if (gameServer == null) {
+                gameServer = transform;
+            } else {
+                gameServer.setGameId(transform.getGameId());
+                gameServer.setServerId(transform.getServerId());
+                gameServer.setServerName(transform.getServerName());
+                gameServer.setNickName(transform.getNickName());
+                gameServer.setStartTime(transform.getStartTime());
+                gameServer.setUpdateTime(LocalDateTime.now());
+            }
+            //区服添加或者更新
+            boolean result = gameServerService.saveOrUpdate(gameServer);
+            // 提交事务
+            dataSourceTransactionManager.commit(transactionStatus);
+            //构造返回
+            return CpPushResultVO.builder().result(result).build();
+        } catch (Exception e) {
+            // 回滚事务
+            dataSourceTransactionManager.rollback(transactionStatus);
+            //保存错误日志
+            cpPushErrorLogService.createLog(game.getId(), CpPushDataEnum.CP_PUSH_DATA_SERVER, param, e.getMessage());
+            //抛出异常
+            throw new BaseException(e.getMessage());
         }
-        //区服添加或者更新
-        boolean result = gameServerService.saveOrUpdate(gameServer);
-        //构造返回
-        return CpPushResultVO.builder().result(result).build();
     }
 
     private GameServer transform(Long superGameId, CpPushServerParam param) {
@@ -259,30 +309,43 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public CpPushResultVO pushRole(String gameAppId, CpPushRoleParam param) {
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
-        //查询玩家信息
-        User user = userService.getOne(new LambdaQueryWrapper<User>()
-                .eq(User::getGameId, game.getId())
-                .eq(User::getOpenId, param.getOpenId()));
-        if (user == null) {
-            throw new BaseException("参数错误, 玩家信息不存在");
-        }
-        //查询玩家角色信息
-        GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
-                .eq(GameUserRole::getUserId, user.getId())
-                .eq(GameUserRole::getGameId, user.getGameId())
-                .eq(GameUserRole::getRoleId, param.getRoleId()));
-        boolean result;
-        if (gameUserRole == null) {
-            result = this.gameRoleCreate(param, user);
-        } else {
-            result = this.gameRoleUpdate(param, gameUserRole, user);
+        // 手动开启事务
+        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
+        try {
+            //查询玩家信息
+            User user = userService.getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getGameId, game.getId())
+                    .eq(User::getOpenId, param.getOpenId()));
+            if (user == null) {
+                log.error("[角色推送]玩家信息不存在, game : {}, param : {}", JsonUtil.toString(game), JsonUtil.toString(param));
+                throw new BaseException("[角色推送]玩家信息不存在");
+            }
+            //查询玩家角色信息
+            GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
+                    .eq(GameUserRole::getUserId, user.getId())
+                    .eq(GameUserRole::getGameId, user.getGameId())
+                    .eq(GameUserRole::getRoleId, param.getRoleId()));
+            boolean result;
+            if (gameUserRole == null) {
+                result = this.gameRoleCreate(param, user);
+            } else {
+                result = this.gameRoleUpdate(param, gameUserRole, user);
+            }
+            // 提交事务
+            dataSourceTransactionManager.commit(transactionStatus);
+            //构造返回
+            return CpPushResultVO.builder().result(result).build();
+        } catch (Exception e) {
+            // 回滚事务
+            dataSourceTransactionManager.rollback(transactionStatus);
+            //保存错误日志
+            cpPushErrorLogService.createLog(game.getId(), CpPushDataEnum.CP_PUSH_DATA_ROLE, param, e.getMessage());
+            //抛出异常
+            throw new BaseException(e.getMessage());
         }
-        //构造返回
-        return CpPushResultVO.builder().result(result).build();
     }
 
     private boolean gameRoleCreate(CpPushRoleParam param, User user) {
@@ -291,11 +354,13 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
                 .eq(GameUser::getGameId, user.getGameId())
                 .eq(GameUser::getUserId, user.getId()));
         if (gameUser == null) {
-            throw new BaseException("参数错误, 玩家游戏信息不存在");
+            log.error("[角色推送]游戏玩家信息不存在, param : {}, user : {}", JsonUtil.toString(param), JsonUtil.toString(user));
+            throw new BaseException("[角色推送]游戏玩家信息不存在");
         }
         //上锁
         if (!distributedLockComponent.doLock(RedisKeyConstant.ROLE_CREATE_LOCK + user.getGameId() + "_" + param.getRoleId(),
                 0L, 1L, TimeUnit.MINUTES)) {
+            log.error("[角色推送]角色正在创建中, param : {}, user : {}", JsonUtil.toString(param), JsonUtil.toString(user));
             return Boolean.TRUE;
         }
         //创建角色
@@ -370,30 +435,46 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
     public CpPushUserVO pushUser(String gameAppId, CpPushUserParam param) {
-        //渠道参数判断
-        String channel = param.getChannel();
-        Tuple2<Boolean, Boolean> jsonAndEmpty = this.isJsonAndEmpty(channel);
         //查询游戏
         Game game = this.getGameByGameAppId(gameAppId);
-        //中间数据
-        UserData userData = UserData.builder().gameId(game.getId()).channel(param.getChannel()).ip(param.getIp()).ua(param.getUa()).build();
-        //根据openId查询用户
-        User user = userService.getOne(new LambdaQueryWrapper<User>()
-                .eq(User::getGameId, game.getId())
-                .eq(User::getOpenId, param.getOpenId()));
-        //玩家信息不存在
-        if (user == null) {
-            return this.createUser(game, userData, param, jsonAndEmpty);
+        // 手动开启事务
+        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
+        try {
+            //渠道参数判断
+            String channel = param.getChannel();
+            Tuple2<Boolean, Boolean> jsonAndEmpty = this.isJsonAndEmpty(channel);
+            //中间数据
+            UserData userData = UserData.builder().gameId(game.getId()).channel(param.getChannel()).ip(param.getIp()).ua(param.getUa()).build();
+            //根据openId查询用户
+            User user = userService.getOne(new LambdaQueryWrapper<User>()
+                    .eq(User::getGameId, game.getId())
+                    .eq(User::getOpenId, param.getOpenId()));
+            //结果信息
+            CpPushUserVO cpPushUserVO;
+            //玩家信息不存在
+            if (user == null) {
+                cpPushUserVO = this.createUser(game, userData, param, jsonAndEmpty);
+            } else {
+                //玩家信息更新
+                Map<String, String> channelMap = this.updateUser(user, param, game, userData, jsonAndEmpty);
+                cpPushUserVO = CpPushUserVO.builder().userId(user.getId())
+                        .sdkUser(!Objects.equals(user.getAgentId(), Agent.DEFAULT_AGENT))
+                        .channel(JsonUtil.toString(channelMap))
+                        .build();
+            }
+            // 提交事务
+            dataSourceTransactionManager.commit(transactionStatus);
+            //返回结果
+            return cpPushUserVO;
+        } catch (Exception e) {
+            // 回滚事务
+            dataSourceTransactionManager.rollback(transactionStatus);
+            //保存错误日志
+            cpPushErrorLogService.createLog(game.getId(), CpPushDataEnum.CP_PUSH_DATA_USER, param, e.getMessage());
+            //抛出异常
+            throw new BaseException(e.getMessage());
         }
-        //玩家信息更新
-        Map<String, String> channelMap = this.updateUser(user, param, game, userData, jsonAndEmpty);
-        //构造返回
-        return CpPushUserVO.builder().userId(user.getId())
-                .sdkUser(!Objects.equals(user.getAgentId(), Agent.DEFAULT_AGENT))
-                .channel(JsonUtil.toString(channelMap))
-                .build();
     }
 
     private CpPushUserVO createUser(Game game, UserData userData, CpPushUserParam param, Tuple2<Boolean, Boolean> jsonAndEmpty) {
@@ -403,7 +484,8 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         String lockKey = RedisKeyConstant.USER_CREATE + gameId + "_" + param.getOpenId();
         //上锁
         if (!distributedLockComponent.doLock(lockKey, 0L, 3L, TimeUnit.MINUTES)) {
-            throw new BaseException("用户信息正在注册中, 请勿重复请求!");
+            log.error("[用户推送]用户正在创建中, param : {}, game : {}", JsonUtil.toString(param), JsonUtil.toString(game));
+            throw new BaseException("[用户推送]用户正在创建中");
         }
         //玩家信息
         User user;
@@ -440,8 +522,8 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
                     .channel(JsonUtil.toString(channelMap))
                     .build();
         } catch (Exception e) {
-            log.error("玩家信息推送数据处理异常, gameId : {}, param : {}, e : {}", gameId, JsonUtil.toString(param), e.getMessage(), e);
-            throw new BaseException("玩家信息推送数据处理异常");
+            log.error("[用户推送]用户创建出现异常, gameId : {}, param : {}, e : {}", gameId, JsonUtil.toString(param), e.getMessage(), e);
+            throw new BaseException("[用户推送]用户创建出现异常");
         } finally {
             RLock rLock = distributedLockComponent.getLock(lockKey);
             if (rLock != null) {