Sfoglia il codice sorgente

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

zhangxianyu 2 mesi fa
parent
commit
676241c9a3
14 ha cambiato i file con 195 aggiunte e 45 eliminazioni
  1. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java
  2. 0 3
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/OceanengineCallbackApi.java
  3. 0 3
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/TencentCallbackApi.java
  4. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameUser.java
  5. 53 5
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java
  6. 5 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/OsEnum.java
  7. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  8. 11 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java
  9. 8 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IIpDataAssayService.java
  10. 100 25
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/IpDataAssayServiceImpl.java
  11. 1 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/task/IpDataAssayTask.java
  12. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  13. 4 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/OrderPayServiceImpl.java
  14. 5 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.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("腾讯小游戏上报新增类型 (腾讯小游戏投放监测链接调试完成´・・)ノ(._.`)  \n" +
+        System.out.println("腾讯小游戏上报新增类型 (监测链接日志优化´・・)ノ(._.`)  \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 0 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/OceanengineCallbackApi.java

@@ -4,7 +4,6 @@ import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineCallbackDTO;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineCallbackService;
-import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,13 +31,11 @@ public class OceanengineCallbackApi {
     // &ua=__UA__&geo=__GEO__&ts=__TS__&callbackParam=__CALLBACK_PARAM__&callbackUrl=__CALLBACK_URL__&model=__MODEL__&unionSite=__UNION_SITE__&caid=__CAID__&productid=__PRODUCTID__&outerid=__OUTERID__
     @GetMapping("/app/callBack")
     public ResultVO<Boolean> appCallback(GameOceanengineAppCallbackDTO dto) {
-        log.info("头条APP监测链接:{}", JsonUtil.toString(dto));
         return ResultVO.ok(gameOceanengineAppCallbackService.callback(dto));
     }
 
     @GetMapping("/miniGame/callback")
     public ResultVO<Boolean> callback(GameOceanengineCallbackDTO dto) {
-        log.info("头条微信小游戏监测链接:{}", JsonUtil.toString(dto));
         return ResultVO.ok(gameOceanengineCallbackService.callback(dto));
     }
 }

+ 0 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/TencentCallbackApi.java

@@ -4,7 +4,6 @@ import com.zanxiang.game.back.serve.pojo.dto.GameTencentAppCallbackDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentCallbackDTO;
 import com.zanxiang.game.back.serve.service.IGameTencentAppCallbackService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameCallbackService;
-import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,7 +34,6 @@ public class TencentCallbackApi {
     // &encryptedPositionId=__ENCRYPTED_POSITION_ID__&ipv6=__IPV6__&hashOaid=__HASH_OAID__&&caid=__QAID_CAA__&ipMd5=__IP_MD5__&ipv6Md5=__IPV6_MD5__
     @GetMapping("/app/callback")
     public ResultVO<Boolean> appCallback(GameTencentAppCallbackDTO dto) {
-        log.info("腾讯APP监测链接:{}", JsonUtil.toString(dto));
         return ResultVO.ok(gameTencentAppCallbackService.callback(dto));
     }
 
@@ -47,7 +45,6 @@ public class TencentCallbackApi {
     // &callback=__CALLBACK__&encryptedPositionId=__ENCRYPTED_POSITION_ID__&ipv6=__IPV6__&ipMd5=__IP_MD5__&ipv6Md5=__IPV6_MD5__
     @GetMapping("/miniGame/callback")
     public ResultVO<Boolean> miniGameCallback(GameTencentCallbackDTO dto) {
-        log.info("腾讯小游戏监测链接:{}", JsonUtil.toString(dto));
         return ResultVO.ok(gameTencentMiniGameCallbackService.callback(dto));
     }
 }

+ 5 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameUser.java

@@ -79,6 +79,11 @@ public class GameTencentMiniGameUser implements Serializable {
      */
     private Integer backStatus;
 
+    /**
+     * 回传地址
+     */
+    private String callBackUrl;
+
     /**
      * 创建时间
      */

+ 53 - 5
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java

@@ -1,24 +1,27 @@
 package com.zanxiang.game.back.serve.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.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameBackLogMapper;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
-import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.entity.*;
 import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackTypeEnum;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameCallbackService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
 import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.URIUtil;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -35,6 +38,12 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
     @Autowired
     private RestTemplate restTemplate;
 
+    @Autowired
+    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+
+    @Autowired
+    private IGameTencentMiniGameCallbackService gameTencentMiniGameCallbackService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Tuple2<BackStatusEnum, String> userBack(GameTencentMiniGameUser userLog) {
@@ -142,7 +151,7 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
                 .build();
         try {
             log.error("腾讯小游戏回传参数:{}", JsonUtil.toString(request));
-            ResponseEntity<Map> response = restTemplate.postForEntity("http://tracking.e.qq.com/conv", request, Map.class);
+            ResponseEntity<Map> response = restTemplate.postForEntity(this.getCallBackUrl(backLog), request, Map.class);
             log.error("腾讯小游戏回传完成:{}", JsonUtil.toString(response.getBody()));
             if (response.getStatusCode().is2xxSuccessful()) {
                 if (Objects.equals(response.getBody().get("code").toString(), "0")) {
@@ -156,6 +165,45 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
         }
     }
 
+    private String getCallBackUrl(GameTencentMiniGameBackLog backLog) {
+        GameTencentMiniGameUser user = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                .eq(GameTencentMiniGameUser::getGameId, backLog.getGameId())
+                .eq(GameTencentMiniGameUser::getWechatAppId, backLog.getWechatAppId())
+                .eq(GameTencentMiniGameUser::getWechatOpenid, backLog.getWechatOpenid())
+                .eq(GameTencentMiniGameUser::getAdAccountId, backLog.getAdAccountId())
+                .eq(GameTencentMiniGameUser::getBackType, BackTypeEnum.BACK_API.getBackType())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+                .last("limit 1"));
+        String callBackUrl = Optional.ofNullable(user)
+                .map(GameTencentMiniGameUser::getCallBackUrl)
+                .orElse(null);
+        if (Strings.isNotBlank(callBackUrl)) {
+            return callBackUrl;
+        }
+        GameTencentMiniGameCallback tencentMiniGameCallback = gameTencentMiniGameCallbackService.getOne(
+                new LambdaQueryWrapper<GameTencentMiniGameCallback>()
+                        .eq(GameTencentMiniGameCallback::getWechatOpenid, backLog.getWechatOpenid())
+                        .and(qw -> qw.eq(GameTencentMiniGameCallback::getImpressionId, backLog.getClickId())
+                                .or().eq(GameTencentMiniGameCallback::getRequestId, backLog.getClickId())
+                        )
+                        .orderByDesc(GameTencentMiniGameCallback::getClickTime)
+                        .last("limit 1"));
+        String callBack = Optional.ofNullable(tencentMiniGameCallback)
+                .map(GameTencentMiniGameCallback::getCallback)
+                .orElse(null);
+        if (Strings.isBlank(callBack)) {
+            return "http://tracking.e.qq.com/conv";
+        }
+        callBackUrl = URIUtil.decodeURIComponent(callBack);
+        if (user != null) {
+            gameTencentMiniGameUserService.update(new LambdaUpdateWrapper<GameTencentMiniGameUser>()
+                    .set(GameTencentMiniGameUser::getCallBackUrl, callBackUrl)
+                    .eq(GameTencentMiniGameUser::getId, user.getId())
+            );
+        }
+        return callBackUrl;
+    }
+
     @Data
     @NoArgsConstructor
     @AllArgsConstructor

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

@@ -39,6 +39,11 @@ public enum OsEnum {
      */
     SYSTEM_LINUX(5, "linux", "linux操作系统"),
 
+    /**
+     * 华为 OpenHarmony 系统
+     */
+    SYSTEM_OHOS(6, "ohos", "华为鸿蒙系统"),
+
     /**
      * 前端开发工具
      */

+ 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服务启动成功 < (IP解析历史数据处理新增线程池调试 ・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (IP解析历史数据处理新增线程池调试02 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 11 - 2
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java

@@ -166,9 +166,9 @@ public class UserController {
         return ResultVO.ok();
     }
 
-    @ApiOperation(value = "根据主键id解析数据IP")
+    @ApiOperation(value = "根据主键id解析用户数据IP")
     @PatchMapping(value = "/ip/assay/by/ids")
-    @PreAuthorize(permissionKey = "manage:user:ipAssay")
+    @PreAuthorize(permissionKey = "manage:user:ipAssayByIds")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功")})
     public ResultVO<Void> userIpAssayById(@RequestParam String ids) {
         ipDataAssayService.userHandleByIds(ids);
@@ -183,4 +183,13 @@ public class UserController {
         ipDataAssayService.userLoginLogHandle();
         return ResultVO.ok();
     }
+
+    @ApiOperation(value = "根据主键id解析玩家登录日志数据IP")
+    @PatchMapping(value = "/login/log/ip/assay/by/ids")
+    @PreAuthorize(permissionKey = "manage:user:loginLogIpAssayByIds")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功")})
+    public ResultVO<Void> userLoginLogHandleByIds(@RequestParam String ids) {
+        ipDataAssayService.userLoginLogHandleByIds(ids);
+        return ResultVO.ok();
+    }
 }

+ 8 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IIpDataAssayService.java

@@ -10,7 +10,7 @@ import java.util.List;
 public interface IIpDataAssayService {
 
     /**
-     * 根据主键id处理
+     * 根据主键id处理用户数据
      *
      * @param ids : 主键id
      */
@@ -21,6 +21,13 @@ public interface IIpDataAssayService {
      */
     void userHandle(long supperGameId);
 
+    /**
+     * 根据id主键处理登录日志
+     *
+     * @param ids : 主键id
+     */
+    void userLoginLogHandleByIds(String ids);
+
     /**
      * 登录日志处理
      */

+ 100 - 25
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/IpDataAssayServiceImpl.java

@@ -8,10 +8,12 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.pojo.vo.SysIpv4RpcVO;
 import com.zanxiang.erp.base.rpc.ISysIpv4Rpc;
+import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
 import com.zanxiang.game.module.manage.service.IGameService;
 import com.zanxiang.game.module.manage.service.IIpDataAssayService;
 import com.zanxiang.game.module.manage.service.IUserLoginLogService;
 import com.zanxiang.game.module.manage.service.IUserService;
+import com.zanxiang.game.module.manage.utils.RedisUtil;
 import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserLoginLog;
@@ -27,6 +29,7 @@ import java.time.LocalDateTime;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -44,6 +47,9 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
     private ISysIpv4Rpc sysIpv4Rpc;
 
+    @Autowired
+    private RedisUtil<String> redisUtil;
+
     @Autowired
     private IGameService gameService;
 
@@ -62,6 +68,16 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             new ThreadFactoryBuilder()
                     .setNameFormat("sync-ipDataAssay-%d").build());
 
+    private static final ThreadPoolExecutor THREAD_POOL_IP_DATA_ASSAY_QUEUE = new ThreadPoolExecutor(
+            10,
+            10,
+            0,
+            TimeUnit.MINUTES,
+            new LinkedBlockingQueue<>(),
+            new ThreadFactoryBuilder()
+                    .setNameFormat("sync-ipDataAssayQueue-%d").build());
+
+
     @Override
     public void userHandleByIds(String ids) {
         List<Long> userIds = Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList());
@@ -71,7 +87,7 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
         }
         userList.forEach(user -> {
             String ipData = this.ipAssay(user.getIp());
-            log.error("IP解析返回的结果, ipData : {}", ipData);
+            log.error("用户IP解析返回的结果, ipData : {}", ipData);
             if (Strings.isBlank(ipData)) {
                 return;
             }
@@ -101,7 +117,9 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
                     .in(User::getGameId, gameIdList)
                     .orderByDesc(User::getCreateTime));
             totalPage = pageUser.getPages();
-            userList = pageUser.getRecords();
+            userList = pageUser.getRecords().stream()
+                    .filter(user -> Strings.isBlank(user.getIpData()))
+                    .collect(Collectors.toList());
             log.error("用户执行页, page : {}, totalPage : {}, size : {}", page, totalPage, userList.size());
             this.pageUserHandle(userList);
         } while (++page <= totalPage);
@@ -112,7 +130,7 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             log.error("用户单页数据为空, 不处理");
             return;
         }
-        THREAD_POOL_IP_DATA_ASSAY.execute(() -> userList.forEach(user -> {
+        List<CompletableFuture<?>> futures = userList.stream().map(user -> CompletableFuture.runAsync(() -> {
             if (Strings.isNotBlank(user.getIpData())) {
                 return;
             }
@@ -124,7 +142,31 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             userService.update(new LambdaUpdateWrapper<User>()
                     .set(User::getIpData, ipData)
                     .eq(User::getId, user.getId()));
-        }));
+        }, THREAD_POOL_IP_DATA_ASSAY)).collect(Collectors.toList());
+        try {
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get();
+        } catch (Exception e) {
+            log.error("等待所有用户处理完成时出现异常: {}", e.getMessage());
+        }
+    }
+
+    @Override
+    public void userLoginLogHandleByIds(String ids) {
+        List<Long> userLoginLogIds = Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList());
+        List<UserLoginLog> userLoginLogList = userLoginLogService.listByIds(userLoginLogIds);
+        if (CollectionUtils.isEmpty(userLoginLogList)) {
+            return;
+        }
+        userLoginLogList.forEach(userLoginLog -> {
+            String ipData = this.ipAssay(userLoginLog.getIp());
+            log.error("登录日志IP解析返回的结果, ipData : {}", ipData);
+            if (Strings.isBlank(ipData)) {
+                return;
+            }
+            userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
+                    .set(UserLoginLog::getIpData, ipData)
+                    .eq(UserLoginLog::getId, userLoginLog.getId()));
+        });
     }
 
     @Override
@@ -140,7 +182,9 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
                             .ge(UserLoginLog::getCreateTime, LocalDateTime.now().minusMonths(2))
                             .orderByDesc(UserLoginLog::getCreateTime));
             totalPage = pageUserLoginLog.getPages();
-            userLoginLogList = pageUserLoginLog.getRecords();
+            userLoginLogList = pageUserLoginLog.getRecords().stream()
+                    .filter(userLoginLog -> Strings.isBlank(userLoginLog.getIpData()))
+                    .collect(Collectors.toList());
             log.error("登录日志执行页, page : {}, totalPage : {}, size : {}", page, totalPage, userLoginLogList.size());
             this.pageUserLoginLogHandle(userLoginLogList);
         } while (++page <= totalPage);
@@ -151,7 +195,7 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             log.error("登录日志单页数据为空, 不处理");
             return;
         }
-        THREAD_POOL_IP_DATA_ASSAY.execute(() -> userLoginLogList.forEach(userLoginLog -> {
+        List<CompletableFuture<?>> futures = userLoginLogList.stream().map(userLoginLog -> CompletableFuture.runAsync(() -> {
             if (Strings.isNotBlank(userLoginLog.getIpData())) {
                 return;
             }
@@ -163,34 +207,65 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
                     .set(UserLoginLog::getIpData, ipData)
                     .eq(UserLoginLog::getId, userLoginLog.getId()));
-        }));
+        }, THREAD_POOL_IP_DATA_ASSAY)).collect(Collectors.toList());
+        try {
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get();
+        } catch (Exception e) {
+            log.error("等待所有登录日志完成时出现异常: {}", e.getMessage());
+        }
     }
 
     @Override
     public void ipDataHandle(List<String> msgList) {
-        msgList.forEach(msg -> {
+        List<CompletableFuture<?>> futures = msgList.stream().map(msg -> CompletableFuture.runAsync(() -> {
+            //数据解析, 消息类型(注册还是登录), 数据主键, ip地址
             String[] array = msg.split(":");
-            //消息类型(注册还是登录), 数据主键, ip地址
             Tuple3<String, String, String> tuple3 = Tuple3.with(array[0], array[1], array[2]);
-            String ipData = this.ipAssay(tuple3.third);
+            //IP信息
+            String ip = tuple3.third.contains("_") ? tuple3.third.split("_")[0] : tuple3.third;
+            //解析重试次数
+            int count = tuple3.third.contains("_") ? Integer.parseInt(tuple3.third.split("_")[1]) : 0;
+            //IP解析
+            String ipData = this.ipAssay(ip);
+            //解析失败业务处理
             if (Strings.isBlank(ipData)) {
+                this.handleFailedIpAssay(msg, ip, count);
                 return;
             }
-            //注册用户, t_user表
-            if (Objects.equals(tuple3.first, "REG")) {
-                userService.update(new LambdaUpdateWrapper<User>()
-                        .set(User::getIpData, ipData)
-                        .eq(User::getId, Long.parseLong(tuple3.second))
-                );
-            }
-            //登录日志, t_user_login_log表
-            if (Objects.equals(tuple3.first, "LOGIN")) {
-                userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
-                        .set(UserLoginLog::getIpData, ipData)
-                        .eq(UserLoginLog::getId, Long.parseLong(tuple3.second))
-                );
-            }
-        });
+            //解析成功业务处理
+            this.handleSuccessIpAssay(tuple3.first, Long.parseLong(tuple3.second), ipData);
+        }, THREAD_POOL_IP_DATA_ASSAY_QUEUE)).collect(Collectors.toList());
+        try {
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get();
+        } catch (Exception e) {
+            log.error("等待所有队列消息消费完成时出现异常: {}", e.getMessage());
+        }
+    }
+
+    private void handleFailedIpAssay(String msg, String ip, int count) {
+        if (++count < 50) {
+            log.error("队列消息IP解析失败, 重新添加到队列, ip : {}, count : {}", ip, count);
+            redisUtil.addToSet(RedisKeyConstant.IP_DATA_ASSAY_QUEUE, msg + "_" + count);
+        } else {
+            log.error("队列消息IP解析失败, 重试次数达到上限, ip : {}, count : {}", ip, count);
+        }
+    }
+
+    private void handleSuccessIpAssay(String type, Long id, String ipData) {
+        //注册用户, t_user表
+        if (Objects.equals(type, "REG")) {
+            userService.update(new LambdaUpdateWrapper<User>()
+                    .set(User::getIpData, ipData)
+                    .eq(User::getId, id)
+            );
+        }
+        //登录日志, t_user_login_log表
+        if (Objects.equals(type, "LOGIN")) {
+            userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
+                    .set(UserLoginLog::getIpData, ipData)
+                    .eq(UserLoginLog::getId, id)
+            );
+        }
     }
 
     private String ipAssay(String ip) {

+ 1 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/task/IpDataAssayTask.java

@@ -47,5 +47,6 @@ public class IpDataAssayTask {
         log.error("IP解析从队列中获取到数据长度 : {}", msgList.size());
         //数据处理执行
         ipDataAssayService.ipDataHandle(msgList);
+        log.error("IP解析队列消息消费完成 : {}", msgList.size());
     }
 }

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

@@ -25,7 +25,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <新增IP解析任务队列01> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决鸿蒙系统米大师兼容性问题> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 4 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/OrderPayServiceImpl.java

@@ -160,7 +160,9 @@ public class OrderPayServiceImpl implements IOrderPayService {
         GamePayWayDTO gamePayWayDTO = null;
         //android用户, 游戏适配米大师支付
         if (Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_ANDROID.getOs())
-                || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_WINDOW.getOs())) {
+                || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_WINDOW.getOs())
+                || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_OHOS.getOs())
+        ) {
             gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
                     Objects.equals(gamePayWay.getPayDeviceId(), PayDeviceEnum.MI_PAY.getPayDeviceId()))
                     .findFirst().orElse(null);
@@ -269,6 +271,7 @@ public class OrderPayServiceImpl implements IOrderPayService {
             if (Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_ANDROID.getOs())
                     || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_WINDOW.getOs())
                     || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_DEVTOOLS.getOs())
+                    || Objects.equals(userData.getDeviceSystem(), OsEnum.SYSTEM_OHOS.getOs())
             ) {
                 result = wxApiService.checkSessionKey(userData.getGameId(), user.getOpenId(), user.getSessionKey());
             }

+ 5 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java

@@ -218,7 +218,9 @@ public class AliPayService extends PayBaseService {
         payParamMap.put("orderId", product.getOutTradeNo());
         //非手机系统, 不走deepLink
         if (!product.getDeviceSystem().contains(OsEnum.SYSTEM_ANDROID.getOs())
-                && !product.getDeviceSystem().contains(OsEnum.SYSTEM_IOS.getOs())) {
+                && !product.getDeviceSystem().contains(OsEnum.SYSTEM_OHOS.getOs())
+                && !product.getDeviceSystem().contains(OsEnum.SYSTEM_IOS.getOs())
+        ) {
             payParamMap.put("data", body);
             return payParamMap;
         }
@@ -254,7 +256,8 @@ public class AliPayService extends PayBaseService {
         Map<String, String> deepLinkParamMap = this.deepLinkParamMap(mobileClientUrl);
         deepLinkAndroid += URIUtil.encodeURIComponent(deepLinkParamMap.get("dataString"), UTF8);
         deepLinkIos += URIUtil.encodeURIComponent(JsonUtil.toString(deepLinkParamMap), UTF8);
-        return Objects.equals(deviceSystem, OsEnum.SYSTEM_ANDROID.getOs()) ? deepLinkAndroid : deepLinkIos;
+        return Objects.equals(deviceSystem, OsEnum.SYSTEM_ANDROID.getOs())
+                || Objects.equals(deviceSystem, OsEnum.SYSTEM_OHOS.getOs()) ? deepLinkAndroid : deepLinkIos;
     }
 
     private Map<String, String> deepLinkParamMap(String mobileClientUrl) {