Browse Source

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

zhimo 1 year ago
parent
commit
fe14f6c698
87 changed files with 3415 additions and 704 deletions
  1. 0 22
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/rpc/IOceanEngineDataReportRpc.java
  2. 6 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentOrderDTO.java
  3. 5 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserDTO.java
  4. 2 2
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAccountRpcDTO.java
  5. 3 3
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderRpcDTO.java
  6. 3 3
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtUserActiveRpcDTO.java
  7. 32 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/enums/OrderStatusEnum.java
  8. 20 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentMiniGameBackRpc.java
  9. 20 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentUserActionBackRpc.java
  10. 22 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtMiniGameBackRpc.java
  11. 0 17
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/tencent/rpc/IGameBackTencentRpc.java
  12. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/GameBackApplication.java
  13. 59 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/TencentMiniGameLogController.java
  14. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameBackLogMapper.java
  15. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameOrderMapper.java
  16. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameUserMapper.java
  17. 71 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameOrderDTO.java
  18. 36 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameUserDTO.java
  19. 92 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameBackLog.java
  20. 103 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameOrder.java
  21. 79 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameUser.java
  22. 0 4
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentUser.java
  23. 14 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackStatusEnum.java
  24. 106 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameOrderVO.java
  25. 76 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameUserVO.java
  26. 0 27
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/IGameBackTencentRpcImpl.java
  27. 68 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java
  28. 71 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java
  29. 6 6
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java
  30. 0 7
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameBackPolicyService.java
  31. 14 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameBackLogService.java
  32. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameOrderService.java
  33. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameUserService.java
  34. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentOrderService.java
  35. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentUserService.java
  36. 18 218
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java
  37. 7 5
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  38. 138 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java
  39. 121 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java
  40. 92 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameUserServiceImpl.java
  41. 101 64
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java
  42. 66 50
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentUserServiceImpl.java
  43. 0 2
      game-data/game-data-serve/pom.xml
  44. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/GameDataApplication.java
  45. 2 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AccountAgentDayController.java
  46. 9 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java
  47. 2 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RankingController.java
  48. 48 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataWaterDTO.java
  49. 5 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteDayDTO.java
  50. 6 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteTotalDTO.java
  51. 12 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsAccountAgentDay.java
  52. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsEverydayWater.java
  53. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsH5GameDay.java
  54. 12 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/enums/OrderByEnum.java
  55. 265 48
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java
  56. 3 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalVO.java
  57. 65 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataWaterVO.java
  58. 45 9
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayVO.java
  59. 3 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java
  60. 10 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerRechargeRankingVO.java
  61. 52 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerTemplateVO.java
  62. 45 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTemplateVO.java
  63. 30 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTrendVO.java
  64. 4 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameDataService.java
  65. 138 21
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java
  66. 764 132
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  67. 3 5
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RankingServiceImpl.java
  68. 4 3
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/AccountTypeEnum.java
  69. 34 4
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/PayWayEnum.java
  70. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  71. 2 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  72. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/AgentAddParam.java
  73. 4 3
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java
  74. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GamePayWayServiceImpl.java
  75. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/OrderServiceImpl.java
  76. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/PayMerchantServiceImpl.java
  77. 76 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameRemitLog.java
  78. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameRemitLogMapper.java
  79. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  80. 36 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/RemitController.java
  81. 63 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/GameRemitLogParam.java
  82. 21 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameRemitLogService.java
  83. 21 21
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  84. 88 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameRemitLogServiceImpl.java
  85. 2 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java
  86. 1 1
      game-platform/game-platform-serve/src/main/java/com/zanxiang/game/platform/serve/GamePlatformApplication.java
  87. 1 1
      pom.xml

+ 0 - 22
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/rpc/IOceanEngineDataReportRpc.java

@@ -1,22 +0,0 @@
-package com.zanxiang.game.back.base.oceanengine.rpc;
-
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.OrderReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.UserActiveReportRpcDTO;
-import com.zanxiang.module.util.pojo.ResultVO;
-
-/**
- * 微信小游戏头条上报
- * 参考文档:https://bytedance.feishu.cn/docx/doxcnsCqXkvxoAg36GDzkRRRuAq
- */
-public interface IOceanEngineDataReportRpc {
-
-    /**
-     * 用户激活、注册等上报
-     */
-    ResultVO<Boolean> userActiveReport(UserActiveReportRpcDTO dto);
-
-    /**
-     * 用户下单、支付上报
-     */
-    ResultVO<Boolean> orderReport(OrderReportRpcDTO dto);
-}

+ 6 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/tencent/pojo/dto/TencentOrderDTO.java → game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentOrderDTO.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.back.base.tencent.pojo.dto;
+package com.zanxiang.game.back.base.pojo.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -82,4 +82,9 @@ public class TencentOrderDTO implements Serializable {
      * 数据源ID
      */
     private Long userActionSetId;
+
+    /**
+     * 小游戏回传的时候要
+     */
+    private String clickId;
 }

+ 5 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/tencent/pojo/dto/TencentUserDTO.java → game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserDTO.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.back.base.tencent.pojo.dto;
+package com.zanxiang.game.back.base.pojo.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -56,4 +56,8 @@ public class TencentUserDTO implements Serializable {
      * 数据源ID
      */
     private Long userActionSetId;
+    /**
+     * 小游戏回传的时候要
+     */
+    private String clickId;
 }

+ 2 - 2
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/AccountReportRpcDTO.java → game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAccountRpcDTO.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.back.base.oceanengine.pojo.dto;
+package com.zanxiang.game.back.base.pojo.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -14,7 +14,7 @@ import java.io.Serializable;
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
-public class AccountReportRpcDTO implements Serializable {
+public class TtAccountRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
     /**
      * 广告账号 ID

+ 3 - 3
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/OrderReportRpcDTO.java → game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderRpcDTO.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.back.base.oceanengine.pojo.dto;
+package com.zanxiang.game.back.base.pojo.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -12,7 +12,7 @@ import java.time.LocalDateTime;
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
-public class OrderReportRpcDTO implements Serializable {
+public class TtOrderRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
     /**
      * 游戏 id
@@ -21,7 +21,7 @@ public class OrderReportRpcDTO implements Serializable {
     /**
      * 微信小游戏上报组件
      */
-    private AccountReportRpcDTO accountReport;
+    private TtAccountRpcDTO accountReport;
     /**
      * 小游戏 appId
      */

+ 3 - 3
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/oceanengine/pojo/dto/UserActiveReportRpcDTO.java → game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtUserActiveRpcDTO.java

@@ -1,4 +1,4 @@
-package com.zanxiang.game.back.base.oceanengine.pojo.dto;
+package com.zanxiang.game.back.base.pojo.dto;
 
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -12,7 +12,7 @@ import java.time.LocalDateTime;
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
-public class UserActiveReportRpcDTO implements Serializable {
+public class TtUserActiveRpcDTO implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
@@ -34,7 +34,7 @@ public class UserActiveReportRpcDTO implements Serializable {
     /**
      * 微信小游戏上报组件
      */
-    private AccountReportRpcDTO accountReport;
+    private TtAccountRpcDTO accountReport;
     /**
      * 渠道标识
      */

+ 32 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/enums/OrderStatusEnum.java

@@ -0,0 +1,32 @@
+package com.zanxiang.game.back.base.pojo.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum OrderStatusEnum {
+    /**
+     * 预下单
+     */
+    READY_PAY(0),
+
+    /**
+     * 待支付
+     */
+    WAIT_PAY(1),
+
+    /**
+     * 支付成功
+     */
+    SUCCESS_PAY(2),
+
+    /**
+     * 订单关闭
+     */
+    CANCEL_PAY(-1);
+
+    private final Integer value;
+
+    OrderStatusEnum(Integer value) {
+        this.value = value;
+    }
+}

+ 20 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentMiniGameBackRpc.java

@@ -0,0 +1,20 @@
+package com.zanxiang.game.back.base.rpc;
+
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * 腾讯小游戏回传
+ */
+public interface ITencentMiniGameBackRpc {
+    /**
+     * 订单回传
+     */
+    ResultVO<Boolean> backOrder(TencentOrderDTO dto);
+
+    /**
+     * 用户回传
+     */
+    ResultVO<Boolean> backUser(TencentUserDTO dto);
+}

+ 20 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentUserActionBackRpc.java

@@ -0,0 +1,20 @@
+package com.zanxiang.game.back.base.rpc;
+
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * 腾讯数据源回传
+ */
+public interface ITencentUserActionBackRpc {
+    /**
+     * 订单回传
+     */
+    ResultVO<Boolean> backOrder(TencentOrderDTO dto);
+
+    /**
+     * 用户回传
+     */
+    ResultVO<Boolean> backUser(TencentUserDTO dto);
+}

+ 22 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtMiniGameBackRpc.java

@@ -0,0 +1,22 @@
+package com.zanxiang.game.back.base.rpc;
+
+import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * 微信小游戏头条上报
+ * 参考文档:https://bytedance.feishu.cn/docx/doxcnsCqXkvxoAg36GDzkRRRuAq
+ */
+public interface ITtMiniGameBackRpc {
+
+    /**
+     * 用户激活、注册等上报
+     */
+    ResultVO<Boolean> userActiveReport(TtUserActiveRpcDTO dto);
+
+    /**
+     * 用户下单、支付上报
+     */
+    ResultVO<Boolean> orderReport(TtOrderRpcDTO dto);
+}

+ 0 - 17
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/tencent/rpc/IGameBackTencentRpc.java

@@ -1,17 +0,0 @@
-package com.zanxiang.game.back.base.tencent.rpc;
-
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
-import com.zanxiang.module.util.pojo.ResultVO;
-
-public interface IGameBackTencentRpc {
-    /**
-     * 订单回传
-     */
-    ResultVO<Boolean> backOrder(TencentOrderDTO dto);
-
-    /**
-     * 用户回传
-     */
-    ResultVO<Boolean> backUser(TencentUserDTO dto);
-}

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

@@ -16,7 +16,7 @@ public class GameBackApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GameBackApplication.class, args);
-        System.out.println("游戏回传服务启动成功123 ( ´・・)ノ(._.`) \n" +
+        System.out.println("游戏回传服务启动成功 <dubbo升级3.0> ( ´・・)ノ(._.`) \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 59 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/TencentMiniGameLogController.java

@@ -0,0 +1,59 @@
+package com.zanxiang.game.back.serve.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameUserDTO;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/tencentMiniGame")
+@Api("腾讯小游戏回传")
+public class TencentMiniGameLogController {
+    @Autowired
+    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+    @Autowired
+    private IGameTencentMiniGameOrderService gameTencentMiniGameOrderService;
+
+    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderLogs")
+    @PostMapping("/orderLogs")
+    @ApiOperation(value = "腾讯订单回传日志列表")
+    public ResultVO<IPage<GameTencentMiniGameOrderVO>> tencentOrderLogList(@RequestBody GameTencentMiniGameOrderDTO dto) {
+        return ResultVO.ok(gameTencentMiniGameOrderService.listOfPage(dto));
+    }
+
+    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:orderReport")
+    @PostMapping("/orderReport/{ids}")
+    @ApiOperation(value = "腾讯订单手动上报")
+    public ResultVO<Boolean> tencentOrderReport(@PathVariable("ids") List<Long> ids) {
+        return ResultVO.ok(gameTencentMiniGameOrderService.doReport(ids));
+    }
+
+    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userLogs")
+    @PostMapping("/userLogs")
+    @ApiOperation(value = "腾讯用户回传日志列表")
+    public ResultVO<IPage<GameTencentMiniGameUserVO>> tencentUserLogList(@RequestBody GameTencentMiniGameUserDTO dto) {
+        return ResultVO.ok(gameTencentMiniGameUserService.listOfPage(dto));
+    }
+
+    @PreAuthorize(permissionKey = "gameBack:tencentMiniGame:userReport")
+    @PostMapping("/userReport/{ids}")
+    @ApiOperation(value = "腾讯用户手动上报")
+    public ResultVO<Boolean> tencentUserReport(@PathVariable("ids") List<Long> ids) {
+        return ResultVO.ok(gameTencentMiniGameUserService.doReport(ids));
+    }
+}

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameBackLogMapper.java

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

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameOrderMapper.java

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

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameUserMapper.java

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

+ 71 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameOrderDTO.java

@@ -0,0 +1,71 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * 游戏腾讯订单表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentMiniGameOrderDTO extends BaseListDTO<GameTencentMiniGameOrder> {
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String agentKey;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty("订单ID")
+    private String orderId;
+
+    /**
+     * openid
+     */
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    @ApiModelProperty("-1:回传失败;0:未回传;1:回传")
+    private Integer backStatus;
+
+    /**
+     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
+     */
+    @ApiModelProperty("支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消")
+    private Integer orderStatus;
+}

+ 36 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameUserDTO.java

@@ -0,0 +1,36 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 游戏腾讯用户表
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentMiniGameUserDTO extends BaseListDTO<GameTencentMiniGameUser> {
+    @ApiModelProperty("渠道号")
+    private String agentKey;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+}

+ 92 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameBackLog.java

@@ -0,0 +1,92 @@
+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.LocalDateTime;
+
+/**
+ * <p>
+ * 回传日志表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_tencent_mini_game_back_log")
+public class GameTencentMiniGameBackLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+
+    /**
+     * 数据源ID
+     */
+    private String clickId;
+
+    /**
+     * 行为发生时,客户端的时间点
+     */
+    private LocalDateTime actionTime;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    /**
+     * 行为类型:(REGISTER/PURCHASE/COMPLETE_ORDER)
+     */
+    private String actionType;
+
+    /**
+     * 金额
+     */
+    private Long amount;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 回传时间
+     */
+    private LocalDateTime createTime;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+    /**
+     * 回传失败的错误日志
+     */
+    private String errMsg;
+
+
+}

+ 103 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameOrder.java

@@ -0,0 +1,103 @@
+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.LocalDateTime;
+
+/**
+ * <p>
+ * 游戏腾讯订单表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_tencent_mini_game_order")
+public class GameTencentMiniGameOrder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 渠道号
+     */
+    private String agentKey;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    private LocalDateTime subscribeTime;
+
+    /**
+     * 充值金额(分)
+     */
+    private Long rechargeMoney;
+
+    /**
+     * 充值时间
+     */
+    private LocalDateTime rechargeTime;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    /**
+     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
+     */
+    private Integer orderStatus;
+
+    /**
+     * 支付时间
+     */
+    private LocalDateTime payTime;
+
+    private String clickId;
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+
+    private LocalDateTime createTime;
+}

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

@@ -0,0 +1,79 @@
+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.LocalDateTime;
+
+/**
+ * <p>
+ * 游戏腾讯用户表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_tencent_mini_game_user")
+public class GameTencentMiniGameUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 渠道号
+     */
+    private String agentKey;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    private LocalDateTime subscribeTime;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    /**
+     * 点击 id
+     */
+    private String clickId;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+
+    private LocalDateTime createTime;
+}

+ 0 - 4
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentUser.java

@@ -28,10 +28,6 @@ public class GameTencentUser implements Serializable {
 
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
-    /**
-     * 回传策略ID
-     */
-    private Long backPolicyId;
 
     /**
      * 渠道号

+ 14 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackStatusEnum.java

@@ -2,6 +2,8 @@ package com.zanxiang.game.back.serve.pojo.enums;
 
 import lombok.Getter;
 
+import java.util.Objects;
+
 @Getter
 public enum BackStatusEnum {
     /**
@@ -22,4 +24,16 @@ public enum BackStatusEnum {
     BackStatusEnum(Integer backStatus) {
         this.backStatus = backStatus;
     }
+
+    public static BackStatusEnum getByValue(Integer value) {
+        if (value == null) {
+            return null;
+        }
+        for (BackStatusEnum backStatus : BackStatusEnum.values()) {
+            if (Objects.equals(backStatus.getBackStatus(), value)) {
+                return backStatus;
+            }
+        }
+        return null;
+    }
 }

+ 106 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameOrderVO.java

@@ -0,0 +1,106 @@
+package com.zanxiang.game.back.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 游戏腾讯订单表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentMiniGameOrderVO {
+    private Long id;
+
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String agentKey;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty("注册时间")
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    @ApiModelProperty("关注时间")
+    private LocalDateTime subscribeTime;
+
+    /**
+     * 充值金额(分)
+     */
+    @ApiModelProperty("充值金额(分)")
+    private Long rechargeMoney;
+
+    /**
+     * 充值时间
+     */
+    @ApiModelProperty("充值时间")
+    private LocalDateTime rechargeTime;
+
+    /**
+     * 订单ID
+     */
+    @ApiModelProperty("订单ID")
+    private String orderId;
+
+    /**
+     * openid
+     */
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    @ApiModelProperty("回传状态 -1:回传失败;0:未回传;1:已回传")
+    private Integer backStatus;
+
+    /**
+     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
+     */
+    @ApiModelProperty("支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消")
+    private Integer orderStatus;
+
+    /**
+     * 支付时间
+     */
+    @ApiModelProperty("支付时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+}

+ 76 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameUserVO.java

@@ -0,0 +1,76 @@
+package com.zanxiang.game.back.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 游戏腾讯用户表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentMiniGameUserVO {
+    private Long id;
+
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String agentKey;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty("注册时间")
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    @ApiModelProperty("关注时间")
+    private LocalDateTime subscribeTime;
+
+    /**
+     * openid
+     */
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    @ApiModelProperty("回传状态:-1:回传失败;0:未回传;1:已回传")
+    private Integer backStatus;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+}

+ 0 - 27
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/IGameBackTencentRpcImpl.java

@@ -1,27 +0,0 @@
-package com.zanxiang.game.back.serve.rpc.impl;
-
-
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
-import com.zanxiang.game.back.base.tencent.rpc.IGameBackTencentRpc;
-import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
-import com.zanxiang.module.util.pojo.ResultVO;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-@Slf4j
-@DubboService
-public class IGameBackTencentRpcImpl implements IGameBackTencentRpc {
-    @Autowired
-    private IGameBackPolicyService gameBackPolicyService;
-    @Override
-    public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
-        return ResultVO.ok(gameBackPolicyService.tencentOrderBack(dto));
-    }
-
-    @Override
-    public ResultVO<Boolean> backUser(TencentUserDTO dto) {
-        return ResultVO.ok(gameBackPolicyService.tencentUserBack(dto));
-    }
-}

+ 68 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java

@@ -0,0 +1,68 @@
+package com.zanxiang.game.back.serve.rpc.impl;
+
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.rpc.ITencentMiniGameBackRpc;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.time.LocalDateTime;
+
+@Slf4j
+@DubboService
+public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
+
+    @Autowired
+    private IGameTencentMiniGameOrderService gameTencentMiniGameOrderService;
+    @Autowired
+    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+
+    @Override
+    public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
+        GameTencentMiniGameOrder orderLog = GameTencentMiniGameOrder.builder()
+                .adAccountId(dto.getAdAccountId())
+                .gameId(dto.getGameId())
+                .orderId(dto.getOrderId())
+                .agentKey(dto.getChannel())
+                .rechargeMoney(dto.getRechargeMoney())
+                .rechargeTime(dto.getRechargeTime())
+                .subscribeTime(dto.getSubscribeTime())
+                .registerTime(dto.getRegisterTime())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .orderStatus(dto.getOrderStatus())
+                .payTime(dto.getPayTime())
+                .createTime(LocalDateTime.now())
+                .backStatus(BackStatusEnum.NO.getBackStatus())
+                .backPolicyId(dto.getBackPolicyId())
+                .clickId(dto.getClickId())
+                .build();
+        gameTencentMiniGameOrderService.save(orderLog);
+        return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog, false));
+    }
+
+    @Override
+    public ResultVO<Boolean> backUser(TencentUserDTO dto) {
+        GameTencentMiniGameUser userLog = GameTencentMiniGameUser.builder()
+                .adAccountId(dto.getAdAccountId())
+                .gameId(dto.getGameId())
+                .agentKey(dto.getChannel())
+                .subscribeTime(dto.getSubscribeTime())
+                .registerTime(dto.getRegisterTime())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .backStatus(BackStatusEnum.NO.getBackStatus())
+                .clickId(dto.getClickId())
+                .createTime(LocalDateTime.now())
+                .build();
+        gameTencentMiniGameUserService.save(userLog);
+        return ResultVO.ok(gameTencentMiniGameUserService.userBack(userLog, false));
+    }
+}

+ 71 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java

@@ -0,0 +1,71 @@
+package com.zanxiang.game.back.serve.rpc.impl;
+
+
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
+import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
+import com.zanxiang.game.back.serve.service.IGameTencentUserService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.time.LocalDateTime;
+
+@Slf4j
+@DubboService
+public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
+
+    @Autowired
+    private IGameTencentOrderService gameTencentOrderService;
+    @Autowired
+    private IGameTencentUserService gameTencentUserService;
+
+    @Override
+    public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
+        //订单保存
+        GameTencentOrder gameTencentOrder = GameTencentOrder.builder()
+                .adAccountId(dto.getAdAccountId())
+                .gameId(dto.getGameId())
+                .orderId(dto.getOrderId())
+                .channel(dto.getChannel())
+                .rechargeMoney(dto.getRechargeMoney())
+                .rechargeTime(dto.getRechargeTime())
+                .subscribeTime(dto.getSubscribeTime())
+                .registerTime(dto.getRegisterTime())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .orderStatus(dto.getOrderStatus())
+                .payTime(dto.getPayTime())
+                .createTime(LocalDateTime.now())
+                .isBack(BackStatusEnum.NO.getBackStatus())
+                .backPolicyId(dto.getBackPolicyId())
+                .userActionSetId(dto.getUserActionSetId())
+                .build();
+        gameTencentOrderService.save(gameTencentOrder);
+        return ResultVO.ok(gameTencentOrderService.orderBack(gameTencentOrder, false));
+    }
+
+    @Override
+    public ResultVO<Boolean> backUser(TencentUserDTO dto) {
+        GameTencentUser gameTencentUser = GameTencentUser.builder()
+                .adAccountId(dto.getAdAccountId())
+                .gameId(dto.getGameId())
+                .channel(dto.getChannel())
+                .subscribeTime(dto.getSubscribeTime())
+                .registerTime(dto.getRegisterTime())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .isBack(BackStatusEnum.NO.getBackStatus())
+                .userActionSetId(dto.getUserActionSetId())
+                .createTime(LocalDateTime.now())
+                .build();
+        gameTencentUserService.save(gameTencentUser);
+        return ResultVO.ok(gameTencentUserService.userBack(gameTencentUser, false));
+    }
+}

+ 6 - 6
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/OceanEngineDataReportRpcImpl.java → game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java

@@ -1,8 +1,8 @@
 package com.zanxiang.game.back.serve.rpc.impl;
 
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.OrderReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.UserActiveReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.rpc.IOceanEngineDataReportRpc;
+import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
+import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
@@ -16,7 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 @Slf4j
 @DubboService
-public class OceanEngineDataReportRpcImpl implements IOceanEngineDataReportRpc {
+public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
     @Autowired
     private IGameOceanengineUserLogService gameOceanengineUserLogService;
     @Autowired
@@ -24,7 +24,7 @@ public class OceanEngineDataReportRpcImpl implements IOceanEngineDataReportRpc {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResultVO<Boolean> userActiveReport(UserActiveReportRpcDTO dto) {
+    public ResultVO<Boolean> userActiveReport(TtUserActiveRpcDTO dto) {
         GameOceanengineUserLog userLog = GameOceanengineUserLog.builder()
                 .appId(dto.getWechatAppId())
                 .openId(dto.getWechatOpenId())
@@ -47,7 +47,7 @@ public class OceanEngineDataReportRpcImpl implements IOceanEngineDataReportRpc {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResultVO<Boolean> orderReport(OrderReportRpcDTO dto) {
+    public ResultVO<Boolean> orderReport(TtOrderRpcDTO dto) {
         GameOceanengineOrderLog orderLog = GameOceanengineOrderLog.builder()
                 .appId(dto.getWechatAppId())
                 .openId(dto.getWechatOpenId())

+ 0 - 7
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameBackPolicyService.java

@@ -1,14 +1,11 @@
 package com.zanxiang.game.back.serve.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyListDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.back.serve.pojo.vo.GameBackPolicyVO;
-import com.zanxiang.game.back.serve.pojo.vo.GameTencentOrderVO;
 
 import java.util.List;
 
@@ -22,10 +19,6 @@ import java.util.List;
  */
 public interface IGameBackPolicyService extends IService<GameBackPolicy> {
 
-    boolean tencentOrderBack(TencentOrderDTO dto);
-
-    boolean tencentUserBack(TencentUserDTO dto);
-
     boolean createPolicy(GameBackPolicyDTO dto);
 
     boolean updatePolicy(Long policyId, GameBackPolicyDTO dto);

+ 14 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameBackLogService.java

@@ -0,0 +1,14 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+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.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+
+public interface IGameTencentMiniGameBackLogService extends IService<GameTencentMiniGameBackLog> {
+
+    BackStatusEnum userBack(GameTencentMiniGameUser userLog);
+
+    BackStatusEnum orderBack(GameTencentMiniGameOrder orderLog);
+}

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameOrderService.java

@@ -0,0 +1,18 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
+
+import java.util.List;
+
+public interface IGameTencentMiniGameOrderService extends IService<GameTencentMiniGameOrder> {
+
+    boolean orderBack(GameTencentMiniGameOrder orderLog, boolean mustBack);
+
+    IPage<GameTencentMiniGameOrderVO> listOfPage(GameTencentMiniGameOrderDTO dto);
+
+    boolean doReport(List<Long> orderLogIds);
+}

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameUserService.java

@@ -0,0 +1,18 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameUserDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
+
+import java.util.List;
+
+public interface IGameTencentMiniGameUserService extends IService<GameTencentMiniGameUser> {
+
+    boolean userBack(GameTencentMiniGameUser userLog, boolean mustBack);
+
+    IPage<GameTencentMiniGameUserVO> listOfPage(GameTencentMiniGameUserDTO dto);
+
+    boolean doReport(List<Long> userLogIds);
+}

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentOrderService.java

@@ -19,6 +19,8 @@ import java.util.List;
  */
 public interface IGameTencentOrderService extends IService<GameTencentOrder> {
 
+    boolean orderBack(GameTencentOrder tencentOrder, boolean mustBack);
+
     IPage<GameTencentOrderVO> tencentOrderLogList(GameTencentOrderDTO dto);
 
     boolean tencentOrderReport(List<Long> ids);

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentUserService.java

@@ -18,6 +18,8 @@ import java.util.List;
  */
 public interface IGameTencentUserService extends IService<GameTencentUser> {
 
+    boolean userBack(GameTencentUser userLog, boolean mustBack);
+
     IPage<GameTencentUserVO> tencentUserLogList(GameTencentUserDTO dto);
 
     boolean tencentUserReport(List<Long> ids);

+ 18 - 218
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java

@@ -1,47 +1,34 @@
 package com.zanxiang.game.back.serve.service.impl;
 
-import cn.hutool.http.HttpStatus;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
-import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO;
-import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
 import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
 import com.zanxiang.erp.security.util.SecurityUtil;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
 import com.zanxiang.game.back.serve.dao.mapper.GameBackPolicyMapper;
 import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyDTO;
 import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyListDTO;
 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.vo.GameBackPolicyVO;
 import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
 import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
 import com.zanxiang.game.back.serve.service.IGameTencentUserService;
-import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
-import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.NumberUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.exception.BaseException;
-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.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -67,193 +54,6 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
     private IUserActionSetRpc userActionSetRpc;
     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
     private ISysUserRpc sysUserRpc;
-    /**
-     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
-     */
-    private static final Integer COMPLETE_ORDER = 0;
-    private static final Integer PURCHASE = 2;
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean tencentOrderBack(TencentOrderDTO dto) {
-        log.error("回传腾讯订单开始,dto:{}", JsonUtil.toString(dto));
-        //订单保存
-        GameTencentOrder gameTencentOrder = GameTencentOrder.builder()
-                .adAccountId(dto.getAdAccountId())
-                .gameId(dto.getGameId())
-                .orderId(dto.getOrderId())
-                .channel(dto.getChannel())
-                .rechargeMoney(dto.getRechargeMoney())
-                .rechargeTime(dto.getRechargeTime())
-                .subscribeTime(dto.getSubscribeTime())
-                .registerTime(dto.getRegisterTime())
-                .wechatAppId(dto.getWechatAppId())
-                .wechatOpenid(dto.getWechatOpenid())
-                .orderStatus(dto.getOrderStatus())
-                .payTime(dto.getPayTime())
-                .createTime(LocalDateTime.now())
-                .isBack(BackStatusEnum.NO.getBackStatus())
-                .backPolicyId(dto.getBackPolicyId())
-                .userActionSetId(dto.getUserActionSetId())
-                .build();
-        gameTencentOrderService.save(gameTencentOrder);
-        if (!dto.getOrderStatus().equals(COMPLETE_ORDER) && !dto.getOrderStatus().equals(PURCHASE)) {
-            return true;
-        }
-
-        String actionType = gameTencentOrder.getOrderStatus().equals(PURCHASE) ?
-                ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType();
-        Map<String, Object> actionParam = new HashMap<>(2);
-        actionParam.put("claim_type", 0);
-        actionParam.put("value", dto.getRechargeMoney());
-        DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
-                .appId(dto.getWechatAppId())
-                .userActionSetId(dto.getUserActionSetId())
-                .action(UserActionRpcDTO.builder()
-                        .actionTime(dto.getOrderStatus().equals(PURCHASE) ? dto.getPayTime() : dto.getRechargeTime())
-                        .actionType(actionType)
-                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
-                                .wechatAppId(dto.getWechatAppId())
-                                .wechatOpenid(dto.getWechatOpenid())
-                                .build())
-                        .actionParam(actionParam)
-                        .build())
-                .build();
-
-        GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .actionTime(dto.getOrderStatus().equals(PURCHASE) ? dto.getPayTime() : dto.getRechargeTime())
-                .createTime(LocalDateTime.now())
-                .actionType(actionType)
-                .orderId(dto.getOrderId())
-                .wechatAppId(dto.getWechatAppId())
-                .wechatOpenid(dto.getWechatOpenid())
-                .userActionSetId(dto.getUserActionSetId())
-                .actionParam(actionParam.toString())
-                .build();
-
-        boolean doBack;
-        if (null == dto.getBackPolicyId()) {
-            doBack = true;
-        } else {
-            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(dto.getBackPolicyId());
-
-            doBack = BackPolicyUtil.backOrder(gameBackPolicy, dto.getRechargeMoney(),
-                    () -> gameTencentOrderService.count(new LambdaQueryWrapper<GameTencentOrder>()
-                            .eq(GameTencentOrder::getGameId, dto.getGameId())
-                            .eq(GameTencentOrder::getWechatAppId, dto.getWechatAppId())
-                            .eq(GameTencentOrder::getAdAccountId, dto.getAdAccountId())
-                            .eq(GameTencentOrder::getOrderStatus, 2)
-                            .eq(GameTencentOrder::getWechatOpenid, dto.getWechatOpenid())
-                            .last("limit 1")
-                    ) < 1, backUnit -> Long.valueOf(gameTencentOrderService.count(new LambdaQueryWrapper<GameTencentOrder>()
-                            .eq(GameTencentOrder::getGameId, dto.getGameId())
-                            .eq(GameTencentOrder::getWechatAppId, dto.getWechatAppId())
-                            .eq(GameTencentOrder::getAdAccountId, dto.getAdAccountId())
-                            .eq(GameTencentOrder::getOrderStatus, 2)
-                            .orderByDesc(GameTencentOrder::getCreateTime)
-                            .last("limit " + backUnit)
-                    )).intValue());
-        }
-        if (dto.getOrderStatus().equals(COMPLETE_ORDER) || doBack) {
-            ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
-            if (result.getCode() == HttpStatus.HTTP_OK) {
-                gameTencentOrder.setIsBack(BackStatusEnum.SUCCESS.getBackStatus());
-                gameTencentOrder.setBackLog("回传成功");
-                gameTencentOrderService.updateById(gameTencentOrder);
-
-                gameTencentBackLog.setBackLog("回传成功");
-                gameTencentBackLogService.save(gameTencentBackLog);
-            } else {
-                log.error("回传腾讯订单失败,失败原因:{}", result.getMsg());
-                gameTencentOrder.setBackLog(result.getMsg());
-                gameTencentOrder.setIsBack(BackStatusEnum.FAILED.getBackStatus());
-                gameTencentOrderService.updateById(gameTencentOrder);
-
-                gameTencentBackLog.setBackLog(result.getMsg());
-                gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean tencentUserBack(TencentUserDTO dto) {
-        log.error("回传腾讯用户开始,dto:{}", JsonUtil.toString(dto));
-        GameTencentUser gameTencentUser = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>()
-                .eq(GameTencentUser::getWechatOpenid, dto.getWechatOpenid())
-                .eq(GameTencentUser::getGameId, dto.getGameId())
-                .eq(GameTencentUser::getWechatAppId, dto.getWechatAppId())
-                .eq(GameTencentUser::getAdAccountId, dto.getAdAccountId())
-                .eq(GameTencentUser::getIsBack, BackStatusEnum.SUCCESS.getBackStatus())
-        );
-        if (null == gameTencentUser) {
-            //用户保存
-            gameTencentUser = GameTencentUser.builder()
-                    .adAccountId(dto.getAdAccountId())
-                    .gameId(dto.getGameId())
-                    .channel(dto.getChannel())
-                    .subscribeTime(dto.getSubscribeTime())
-                    .registerTime(dto.getRegisterTime())
-                    .wechatAppId(dto.getWechatAppId())
-                    .wechatOpenid(dto.getWechatOpenid())
-                    .isBack(BackStatusEnum.NO.getBackStatus())
-                    .userActionSetId(dto.getUserActionSetId())
-                    .createTime(LocalDateTime.now())
-                    .build();
-            gameTencentUserService.save(gameTencentUser);
-        }
-        Map<String, Object> actionParam = new HashMap<>(2);
-        actionParam.put("claim_type", 0);
-
-        DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
-                .appId(dto.getWechatAppId())
-                .userActionSetId(dto.getUserActionSetId())
-                .action(UserActionRpcDTO.builder()
-                        .actionTime(dto.getRegisterTime())
-                        .actionType(ActionTypeEnum.REGISTER.getActionType())
-                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
-                                .wechatAppId(dto.getWechatAppId())
-                                .wechatOpenid(dto.getWechatOpenid())
-                                .build())
-                        .actionParam(actionParam)
-                        .build())
-                .build();
-
-        GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
-                .gameId(dto.getGameId())
-                .adAccountId(dto.getAdAccountId())
-                .actionTime(dto.getRegisterTime())
-                .createTime(LocalDateTime.now())
-                .actionType(ActionTypeEnum.REGISTER.getActionType())
-                .wechatAppId(dto.getWechatAppId())
-                .wechatOpenid(dto.getWechatOpenid())
-                .userActionSetId(dto.getUserActionSetId())
-                .actionParam(actionParam.toString())
-                .build();
-        ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
-        if (result.getCode() == HttpStatus.HTTP_OK) {
-            gameTencentUser.setIsBack(BackStatusEnum.SUCCESS.getBackStatus());
-            gameTencentUser.setBackLog("回传成功");
-            gameTencentUserService.updateById(gameTencentUser);
-
-            gameTencentBackLog.setBackLog("回传成功");
-            gameTencentBackLogService.save(gameTencentBackLog);
-        } else {
-            log.error("回传腾讯用户失败,失败原因:{}", result.getMsg());
-            gameTencentUser.setBackLog(result.getMsg());
-            gameTencentUser.setIsBack(BackStatusEnum.FAILED.getBackStatus());
-            gameTencentUserService.updateById(gameTencentUser);
-
-            gameTencentBackLog.setBackLog(result.getMsg());
-            gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
-        }
-        return true;
-
-    }
 
     @Override
     public IPage<GameBackPolicyVO> policyList(GameBackPolicyListDTO dto) {
@@ -279,7 +79,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
         }
         GameBackPolicy backPolicy = GameBackPolicy.builder()
                 .backPolicyName(dto.getBackPolicyName())
-                .firstMinMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
+                .firstMinMoney(NumberUtil.multiply100(dto.getFirstMinMoney()).longValue())
                 .firstMinMoneyType(dto.getFirstMinMoneyType())
                 .firstMinMoneyRate(dto.getFirstMinMoneyRate())
                 .firstMaxMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
@@ -287,14 +87,14 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .firstMaxMoneyRate(dto.getFirstMaxMoneyRate())
                 .firstOtherMoneyType(dto.getFirstOtherMoneyType())
                 .firstOtherMoneyRate(dto.getFirstOtherMoneyRate())
-                .rechargeMinMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
-                .rechargeMinMoneyType(dto.getFirstMinMoneyType())
-                .rechargeMinMoneyRate(dto.getFirstMinMoneyRate())
-                .rechargeMaxMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
-                .rechargeMaxMoneyType(dto.getFirstMaxMoneyType())
-                .rechargeMaxMoneyRate(dto.getFirstMaxMoneyRate())
-                .rechargeOtherMoneyType(dto.getFirstOtherMoneyType())
-                .rechargeOtherMoneyRate(dto.getFirstOtherMoneyRate())
+                .rechargeMinMoney(NumberUtil.multiply100(dto.getRechargeMinMoney()).longValue())
+                .rechargeMinMoneyType(dto.getRechargeMinMoneyType())
+                .rechargeMinMoneyRate(dto.getRechargeMinMoneyRate())
+                .rechargeMaxMoney(NumberUtil.multiply100(dto.getRechargeMaxMoney()).longValue())
+                .rechargeMaxMoneyType(dto.getRechargeMaxMoneyType())
+                .rechargeMaxMoneyRate(dto.getRechargeMaxMoneyRate())
+                .rechargeOtherMoneyType(dto.getRechargeOtherMoneyType())
+                .rechargeOtherMoneyRate(dto.getRechargeOtherMoneyRate())
                 .levelDown(dto.getLevelDown())
                 .createBy(SecurityUtil.getUserId())
                 .createTime(LocalDateTime.now())
@@ -311,7 +111,7 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
         GameBackPolicy backPolicy = GameBackPolicy.builder()
                 .id(policyId)
                 .backPolicyName(dto.getBackPolicyName())
-                .firstMinMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
+                .firstMinMoney(NumberUtil.multiply100(dto.getFirstMinMoney()).longValue())
                 .firstMinMoneyType(dto.getFirstMinMoneyType())
                 .firstMinMoneyRate(dto.getFirstMinMoneyRate())
                 .firstMaxMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
@@ -319,14 +119,14 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .firstMaxMoneyRate(dto.getFirstMaxMoneyRate())
                 .firstOtherMoneyType(dto.getFirstOtherMoneyType())
                 .firstOtherMoneyRate(dto.getFirstOtherMoneyRate())
-                .rechargeMinMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
-                .rechargeMinMoneyType(dto.getFirstMinMoneyType())
-                .rechargeMinMoneyRate(dto.getFirstMinMoneyRate())
-                .rechargeMaxMoney(NumberUtil.multiply100(dto.getFirstMaxMoney()).longValue())
-                .rechargeMaxMoneyType(dto.getFirstMaxMoneyType())
-                .rechargeMaxMoneyRate(dto.getFirstMaxMoneyRate())
-                .rechargeOtherMoneyType(dto.getFirstOtherMoneyType())
-                .rechargeOtherMoneyRate(dto.getFirstOtherMoneyRate())
+                .rechargeMinMoney(NumberUtil.multiply100(dto.getRechargeMinMoney()).longValue())
+                .rechargeMinMoneyType(dto.getRechargeMinMoneyType())
+                .rechargeMinMoneyRate(dto.getRechargeMinMoneyRate())
+                .rechargeMaxMoney(NumberUtil.multiply100(dto.getRechargeMaxMoney()).longValue())
+                .rechargeMaxMoneyType(dto.getRechargeMaxMoneyType())
+                .rechargeMaxMoneyRate(dto.getRechargeMaxMoneyRate())
+                .rechargeOtherMoneyType(dto.getRechargeOtherMoneyType())
+                .rechargeOtherMoneyRate(dto.getRechargeOtherMoneyRate())
                 .levelDown(dto.getLevelDown())
                 .createBy(old.getCreateBy())
                 .createTime(old.getCreateTime())

+ 7 - 5
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineOrderLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
 import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
@@ -28,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Objects;
 
 @Slf4j
 @Service
@@ -51,7 +53,7 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
         if (mustBack) {
             doBack = true;
         } else {
-            if (orderLog.getOrderStatus() != 2) {
+            if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
                 // 头条只要回传支付订单
                 return false;
             }
@@ -66,7 +68,7 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                                     .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
                                     .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
                                     .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
-                                    .eq(GameOceanengineOrderLog::getOrderStatus, 2)
+                                    .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
                                     .eq(GameOceanengineOrderLog::getOpenId, orderLog.getOpenId())
                                     .last("limit 1")
                             ) < 1;
@@ -76,7 +78,7 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                                             .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
                                             .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
                                             .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
-                                            .eq(GameOceanengineOrderLog::getOrderStatus, 2)
+                                            .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
                                             .orderByDesc(GameOceanengineOrderLog::getCreateTime)
                                             .last("limit " + backUnit)
                                     ).stream().filter(log -> log.getOrderStatus().equals(BackStatusEnum.SUCCESS.getBackStatus())).count()
@@ -113,9 +115,9 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
 
     @Override
     public boolean oceanengineOrderReport(List<Long> ids) {
-        baseMapper.selectBatchIds(ids).stream()
+        listByIds(ids).stream()
                 .filter(item -> !item.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus()))
-                .forEach(oceanengineOrderLog -> callback(oceanengineOrderLog, true));
+                .forEach(orderLog -> callback(orderLog, true));
         return true;
     }
 

+ 138 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java

@@ -0,0 +1,138 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
+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.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.module.util.DateUtil;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTencentMiniGameBackLogMapper, GameTencentMiniGameBackLog>
+        implements IGameTencentMiniGameBackLogService {
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BackStatusEnum userBack(GameTencentMiniGameUser userLog) {
+        GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
+                .gameId(userLog.getGameId())
+                .adAccountId(userLog.getAdAccountId())
+                .clickId(userLog.getClickId())
+                .actionTime(userLog.getRegisterTime())
+                .wechatOpenid(userLog.getWechatOpenid())
+                .wechatAppId(userLog.getWechatAppId())
+                .actionType(ActionTypeEnum.REGISTER.getActionType())
+                .createTime(LocalDateTime.now())
+                .build();
+        callback(backLog);
+        save(backLog);
+        return BackStatusEnum.getByValue(backLog.getBackStatus());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BackStatusEnum orderBack(GameTencentMiniGameOrder orderLog) {
+        String actionType = orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ?
+                ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType();
+        GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
+                .gameId(orderLog.getGameId())
+                .adAccountId(orderLog.getAdAccountId())
+                .clickId(orderLog.getClickId())
+                .actionTime(orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? orderLog.getPayTime() : orderLog.getRechargeTime())
+                .wechatOpenid(orderLog.getWechatOpenid())
+                .wechatAppId(orderLog.getWechatAppId())
+                .actionType(actionType)
+                .amount(orderLog.getRechargeMoney())
+                .orderId(orderLog.getOrderId())
+                .createTime(LocalDateTime.now())
+                .build();
+        callback(backLog);
+        save(backLog);
+        return BackStatusEnum.getByValue(backLog.getBackStatus());
+    }
+
+    private void callback(GameTencentMiniGameBackLog backLog) {
+        Map<String, Object> actionParam = null;
+        if (backLog.getAmount() != null) {
+            actionParam = new HashMap<>(2);
+            actionParam.put("value", backLog.getAmount());
+        }
+        TencentMiniGameBackRequest request = TencentMiniGameBackRequest.builder()
+                .actions(Collections.singletonList(TencentMiniGameBackRequest.Action.builder()
+                        .action_time(DateUtil.localDateTimeToSecond(backLog.getActionTime()))
+                        .user_id(UserActionRpcDTO.UserIdRpcDTO.builder().wechatAppId(backLog.getWechatAppId()).wechatOpenid(backLog.getWechatOpenid()).build())
+                        .trace(UserActionRpcDTO.TraceRpcDTO.builder().clickId(backLog.getClickId()).build())
+                        .account_id(backLog.getAdAccountId())
+                        .action_set_id(null)
+                        .action_type(backLog.getActionType())
+                        .action_param(actionParam)
+                        .build()))
+                .build();
+        try {
+            ResponseEntity<String> response = restTemplate.postForEntity("http://tracking.e.qq.com/conv", request, String.class);
+            if (response.getStatusCode().is2xxSuccessful()) {
+                backLog.setBackStatus(BackStatusEnum.SUCCESS.getBackStatus());
+                return;
+            }
+            backLog.setBackStatus(BackStatusEnum.FAILED.getBackStatus());
+            backLog.setErrMsg(response.getBody());
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            backLog.setBackStatus(BackStatusEnum.FAILED.getBackStatus());
+            backLog.setErrMsg(e.getMessage());
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Builder
+    public static class TencentMiniGameBackRequest {
+
+        private List<Action> actions;
+
+        @Data
+        @NoArgsConstructor
+        @AllArgsConstructor
+        @Builder
+        public static class Action {
+
+            private Long action_time;
+
+            private UserActionRpcDTO.UserIdRpcDTO user_id;
+            private UserActionRpcDTO.TraceRpcDTO trace;
+
+            private Long account_id;
+
+            private Long action_set_id;
+
+            private String action_type;
+
+            private Map<String, Object> action_param;
+        }
+    }
+}

+ 121 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java

@@ -0,0 +1,121 @@
+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.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
+import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
+import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameOrderMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameOrderService;
+import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
+import com.zanxiang.module.util.bean.BeanUtil;
+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.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencentMiniGameOrderMapper, GameTencentMiniGameOrder>
+        implements IGameTencentMiniGameOrderService {
+
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+    @Autowired
+    private IGameTencentMiniGameBackLogService gameTencentMiniGameBackLogService;
+    @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean orderBack(GameTencentMiniGameOrder orderLog, boolean mustBack) {
+        boolean doBack = false;
+        if (mustBack) {
+            doBack = true;
+        } else {
+            if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue()) &&
+                    !Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
+                // 只要回传 下单、支付行为
+                return false;
+            }
+        }
+        if (orderLog.getBackPolicyId() == null) {
+            // 没有回传策略,则直接全量回传
+            doBack = true;
+        } else {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
+            doBack = BackPolicyUtil.backOrder(gameBackPolicy, orderLog.getRechargeMoney(),
+                    () -> count(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                            .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
+                            .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
+                            .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
+                            .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                            .eq(GameTencentMiniGameOrder::getWechatOpenid, orderLog.getWechatOpenid())
+                            .last("limit 1")
+                    ) < 1, backUnit -> Long.valueOf(count(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                            .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
+                            .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
+                            .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
+                            .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                            .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
+                            .last("limit " + backUnit)
+                    )).intValue());
+            orderLog.setRechargeMoney(BackPolicyUtil.lowRechargeLevel(orderLog.getRechargeMoney(), gameBackPolicy.getLevelDown()));
+        }
+        if (doBack) {
+            BackStatusEnum backStatus = gameTencentMiniGameBackLogService.orderBack(orderLog);
+            update(new LambdaUpdateWrapper<GameTencentMiniGameOrder>()
+                    .set(GameTencentMiniGameOrder::getBackStatus, backStatus.getBackStatus())
+                    .eq(GameTencentMiniGameOrder::getId, orderLog.getId())
+            );
+            return true;
+        }
+        return false;
+    }
+
+
+    @Override
+    public IPage<GameTencentMiniGameOrderVO> listOfPage(GameTencentMiniGameOrderDTO dto) {
+        return page(dto.toPage(), new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameTencentMiniGameOrder::getAgentKey, dto.getAgentKey())
+                .eq(null != dto.getGameId(), GameTencentMiniGameOrder::getGameId, dto.getGameId())
+                .eq(null != dto.getAdAccountId(), GameTencentMiniGameOrder::getAdAccountId, dto.getAdAccountId())
+                .eq(StringUtils.isNotBlank(dto.getWechatAppId()), GameTencentMiniGameOrder::getWechatAppId, dto.getWechatAppId())
+                .eq(StringUtils.isNotBlank(dto.getWechatOpenid()), GameTencentMiniGameOrder::getWechatOpenid, dto.getWechatOpenid())
+                .eq(StringUtils.isNotBlank(dto.getOrderId()), GameTencentMiniGameOrder::getOrderId, dto.getOrderId())
+                .eq(null != dto.getBackStatus(), GameTencentMiniGameOrder::getBackStatus, dto.getBackStatus())
+                .eq(null != dto.getOrderStatus(), GameTencentMiniGameOrder::getOrderStatus, dto.getOrderStatus())
+                .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
+        ).convert(this::toVOSimple);
+    }
+
+    @Override
+    public boolean doReport(List<Long> orderLogIds) {
+        listByIds(orderLogIds).stream()
+                .filter(item -> !item.getBackStatus().equals(BackStatusEnum.SUCCESS.getBackStatus()))
+                .forEach(orderLog -> gameTencentMiniGameBackLogService.orderBack(orderLog));
+        return true;
+    }
+
+    private GameTencentMiniGameOrderVO toVOSimple(GameTencentMiniGameOrder orderLog) {
+        return BeanUtil.copy(orderLog, GameTencentMiniGameOrderVO.class);
+    }
+}

+ 92 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameUserServiceImpl.java

@@ -0,0 +1,92 @@
+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.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
+import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
+import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameUserMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameUserDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
+import com.zanxiang.module.util.bean.BeanUtil;
+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.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class GameTencentMiniGameUserServiceImpl extends ServiceImpl<GameTencentMiniGameUserMapper, GameTencentMiniGameUser>
+        implements IGameTencentMiniGameUserService {
+
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+    @Autowired
+    private IGameTencentMiniGameBackLogService gameTencentMiniGameBackLogService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean userBack(GameTencentMiniGameUser userLog, boolean mustBack) {
+        BackStatusEnum backStatus = doCallback(userLog, mustBack);
+        return update(new LambdaUpdateWrapper<GameTencentMiniGameUser>()
+                .set(GameTencentMiniGameUser::getBackStatus, backStatus.getBackStatus())
+                .eq(GameTencentMiniGameUser::getId, userLog.getId())
+        );
+    }
+
+
+    @Override
+    public IPage<GameTencentMiniGameUserVO> listOfPage(GameTencentMiniGameUserDTO dto) {
+        return page(dto.toPage(), new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameTencentMiniGameUser::getAgentKey, dto.getAgentKey())
+                .eq(null != dto.getGameId(), GameTencentMiniGameUser::getGameId, dto.getGameId())
+                .eq(null != dto.getAdAccountId(), GameTencentMiniGameUser::getAdAccountId, dto.getAdAccountId())
+                .eq(StringUtils.isNotBlank(dto.getWechatAppId()), GameTencentMiniGameUser::getWechatAppId, dto.getWechatAppId())
+                .eq(StringUtils.isNotBlank(dto.getWechatOpenid()), GameTencentMiniGameUser::getWechatOpenid, dto.getWechatOpenid())
+                .eq(null != dto.getBackStatus(), GameTencentMiniGameUser::getBackStatus, dto.getBackStatus())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+        ).convert(this::toVOSimple);
+    }
+
+    @Override
+    public boolean doReport(List<Long> userLogIds) {
+        listByIds(userLogIds).forEach(userLog -> doCallback(userLog, true));
+        return true;
+    }
+
+
+    private BackStatusEnum doCallback(GameTencentMiniGameUser userLog, boolean mustBack) {
+        boolean isBack = mustBack ? false : gameTencentMiniGameBackLogService.count(new LambdaQueryWrapper<GameTencentMiniGameBackLog>()
+                .eq(GameTencentMiniGameBackLog::getGameId, userLog.getGameId())
+                .eq(GameTencentMiniGameBackLog::getWechatAppId, userLog.getWechatAppId())
+                .eq(GameTencentMiniGameBackLog::getWechatOpenid, userLog.getWechatOpenid())
+                .eq(GameTencentMiniGameBackLog::getAdAccountId, userLog.getAdAccountId())
+                .eq(GameTencentMiniGameBackLog::getBackStatus, BackStatusEnum.SUCCESS.getBackStatus())
+        ) > 0;
+        if (isBack) {
+            return BackStatusEnum.NO;
+        }
+        return gameTencentMiniGameBackLogService.userBack(userLog);
+    }
+
+    private GameTencentMiniGameUserVO toVOSimple(GameTencentMiniGameUser userLog) {
+        if (userLog == null) {
+            return null;
+        }
+        return BeanUtil.copy(userLog, GameTencentMiniGameUserVO.class);
+    }
+}

+ 101 - 64
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java

@@ -1,7 +1,7 @@
 package com.zanxiang.game.back.serve.service.impl;
 
-import cn.hutool.http.HttpStatus;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
 import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO;
@@ -9,9 +9,9 @@ import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
 import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
-import com.zanxiang.erp.security.util.SecurityUtil;
-import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyListDTO;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentOrderDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentOrderMapper;
@@ -22,6 +22,7 @@ import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
 import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
 import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
@@ -29,14 +30,13 @@ 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.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
-
-import static com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum.PURCHASE;
+import java.util.Objects;
 
 /**
  * <p>
@@ -55,11 +55,55 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
     private ISysUserRpc sysUserRpc;
     @Autowired
     private IGameTencentBackLogService gameTencentBackLogService;
-    /**
-     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
-     */
-    private static final Integer COMPLETE_ORDER = 0;
-    private static final Integer PURCHASE = 2;
+    @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean orderBack(GameTencentOrder orderLog, boolean mustBack) {
+        boolean doBack = false;
+        if (mustBack) {
+            doBack = true;
+        } else {
+            if (!Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue()) &&
+                    !Objects.equals(orderLog.getOrderStatus(), OrderStatusEnum.SUCCESS_PAY.getValue())) {
+                // 只要回传 下单、支付行为
+                return false;
+            }
+        }
+        if (orderLog.getBackPolicyId() == null) {
+            // 没有回传策略,则直接全量回传
+            doBack = true;
+        } else {
+            GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
+            doBack = BackPolicyUtil.backOrder(gameBackPolicy, orderLog.getRechargeMoney(),
+                    () -> count(new LambdaQueryWrapper<GameTencentOrder>()
+                            .eq(GameTencentOrder::getGameId, orderLog.getGameId())
+                            .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
+                            .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
+                            .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                            .eq(GameTencentOrder::getWechatOpenid, orderLog.getWechatOpenid())
+                            .last("limit 1")
+                    ) < 1, backUnit -> Long.valueOf(count(new LambdaQueryWrapper<GameTencentOrder>()
+                            .eq(GameTencentOrder::getGameId, orderLog.getGameId())
+                            .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
+                            .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
+                            .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
+                            .orderByDesc(GameTencentOrder::getCreateTime)
+                            .last("limit " + backUnit)
+                    )).intValue());
+            orderLog.setRechargeMoney(BackPolicyUtil.lowRechargeLevel(orderLog.getRechargeMoney(), gameBackPolicy.getLevelDown()));
+        }
+        if (doBack) {
+            BackStatusEnum backStatus = doCallback(orderLog);
+            update(new LambdaUpdateWrapper<GameTencentOrder>()
+                    .set(GameTencentOrder::getIsBack, backStatus.getBackStatus())
+                    .eq(GameTencentOrder::getId, orderLog.getId())
+            );
+            return true;
+        }
+        return false;
+    }
 
 
     @Override
@@ -83,61 +127,54 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
 
     @Override
     public boolean tencentOrderReport(List<Long> ids) {
-        baseMapper.selectBatchIds(ids).stream()
+        listByIds(ids).stream()
                 .filter(item -> !item.getIsBack().equals(BackStatusEnum.SUCCESS.getBackStatus()))
-                .forEach(gameTencentOrder -> {
-                    String actionType = gameTencentOrder.getOrderStatus().equals(PURCHASE) ?
-                            ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType();
-                    Map<String, Object> actionParam = new HashMap<>(2);
-                    actionParam.put("claim_type", 0);
-                    actionParam.put("value", gameTencentOrder.getRechargeMoney());
-                    DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
-                            .appId(gameTencentOrder.getWechatAppId())
-                            .userActionSetId(gameTencentOrder.getUserActionSetId())
-                            .action(UserActionRpcDTO.builder()
-                                    .actionTime(gameTencentOrder.getOrderStatus().equals(PURCHASE) ? gameTencentOrder.getPayTime() : gameTencentOrder.getRechargeTime())
-                                    .actionType(actionType)
-                                    .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
-                                            .wechatAppId(gameTencentOrder.getWechatAppId())
-                                            .wechatOpenid(gameTencentOrder.getWechatOpenid())
-                                            .build())
-                                    .actionParam(actionParam)
-                                    .build())
-                            .build();
-
-                    GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
-                            .gameId(gameTencentOrder.getGameId())
-                            .adAccountId(gameTencentOrder.getAdAccountId())
-                            .actionTime(gameTencentOrder.getOrderStatus().equals(PURCHASE) ? gameTencentOrder.getPayTime() : gameTencentOrder.getRechargeTime())
-                            .createTime(LocalDateTime.now())
-                            .actionType(actionType)
-                            .orderId(gameTencentOrder.getOrderId())
-                            .wechatAppId(gameTencentOrder.getWechatAppId())
-                            .wechatOpenid(gameTencentOrder.getWechatOpenid())
-                            .userActionSetId(gameTencentOrder.getUserActionSetId())
-                            .actionParam(actionParam.toString())
-                            .build();
-                    gameTencentOrder.setUpdateTime(LocalDateTime.now());
-                    gameTencentOrder.setUpdateBy(SecurityUtil.getUserId());
-
-                    ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
-                    if (result.getCode() == HttpStatus.HTTP_OK) {
-                        gameTencentOrder.setIsBack(BackStatusEnum.SUCCESS.getBackStatus());
-                        gameTencentOrder.setBackLog("回传成功");
-                        updateById(gameTencentOrder);
+                .forEach(this::doCallback);
+        return true;
+    }
 
-                        gameTencentBackLog.setBackLog("回传成功");
-                        gameTencentBackLogService.save(gameTencentBackLog);
-                    } else {
-                        log.error("回传腾讯订单失败,失败原因:{}", result.getMsg());
-                        gameTencentOrder.setBackLog(result.getMsg());
-                        gameTencentOrder.setIsBack(BackStatusEnum.FAILED.getBackStatus());
-                        updateById(gameTencentOrder);
+    private BackStatusEnum doCallback(GameTencentOrder orderLog) {
+        String actionType = orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ?
+                ActionTypeEnum.PURCHASE.getActionType() : ActionTypeEnum.COMPLETE_ORDER.getActionType();
+        Map<String, Object> actionParam = new HashMap<>(2);
+        actionParam.put("claim_type", 0);
+        actionParam.put("value", orderLog.getRechargeMoney());
+        DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
+                .appId(orderLog.getWechatAppId())
+                .userActionSetId(orderLog.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? orderLog.getPayTime() : orderLog.getRechargeTime())
+                        .actionType(actionType)
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .wechatAppId(orderLog.getWechatAppId())
+                                .wechatOpenid(orderLog.getWechatOpenid())
+                                .build())
+                        .actionParam(actionParam)
+                        .build())
+                .build();
 
-                        gameTencentBackLog.setBackLog(result.getMsg());
-                        gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
-                    }
-                });
-        return true;
+        GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
+                .gameId(orderLog.getGameId())
+                .adAccountId(orderLog.getAdAccountId())
+                .actionTime(orderLog.getOrderStatus().equals(OrderStatusEnum.SUCCESS_PAY.getValue()) ? orderLog.getPayTime() : orderLog.getRechargeTime())
+                .createTime(LocalDateTime.now())
+                .actionType(actionType)
+                .orderId(orderLog.getOrderId())
+                .wechatAppId(orderLog.getWechatAppId())
+                .wechatOpenid(orderLog.getWechatOpenid())
+                .userActionSetId(orderLog.getUserActionSetId())
+                .actionParam(actionParam.toString())
+                .build();
+        ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
+        BackStatusEnum backStatus = BackStatusEnum.FAILED;
+        if (result.isSuccess()) {
+            backStatus = BackStatusEnum.SUCCESS;
+            gameTencentBackLog.setBackLog("回传成功");
+        } else {
+            log.error("回传腾讯订单失败,失败原因:{}", result.getMsg());
+            gameTencentBackLog.setBackLog(result.getMsg());
+        }
+        gameTencentBackLogService.save(gameTencentBackLog);
+        return backStatus;
     }
 }

+ 66 - 50
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentUserServiceImpl.java

@@ -1,7 +1,7 @@
 package com.zanxiang.game.back.serve.service.impl;
 
-import cn.hutool.http.HttpStatus;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
@@ -10,7 +10,6 @@ import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
 import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
-import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentUserMapper;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentUserDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
@@ -27,6 +26,7 @@ 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.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.HashMap;
@@ -44,12 +44,25 @@ import java.util.Map;
 @Slf4j
 @Service
 public class GameTencentUserServiceImpl extends ServiceImpl<GameTencentUserMapper, GameTencentUser> implements IGameTencentUserService {
+
     @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
     private IUserActionSetRpc userActionSetRpc;
     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
     private ISysUserRpc sysUserRpc;
     @Autowired
     private IGameTencentBackLogService gameTencentBackLogService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean userBack(GameTencentUser userLog, boolean mustBack) {
+        BackStatusEnum backStatus = doCallback(userLog, mustBack);
+        return update(new LambdaUpdateWrapper<GameTencentUser>()
+                .set(GameTencentUser::getIsBack, backStatus.getBackStatus())
+                .eq(GameTencentUser::getId, userLog.getId())
+        );
+    }
+
+
     @Override
     public IPage<GameTencentUserVO> tencentUserLogList(GameTencentUserDTO dto) {
         return page(dto.toPage(), new LambdaQueryWrapper<GameTencentUser>()
@@ -69,58 +82,61 @@ public class GameTencentUserServiceImpl extends ServiceImpl<GameTencentUserMappe
 
     @Override
     public boolean tencentUserReport(List<Long> ids) {
-        baseMapper.selectBatchIds(ids).stream()
+        listByIds(ids).stream()
                 .filter(item -> !item.getIsBack().equals(BackStatusEnum.SUCCESS.getBackStatus()))
-                .forEach(gameTencentUser -> {
-                    String actionType = ActionTypeEnum.REGISTER.getActionType();
-                    Map<String, Object> actionParam = new HashMap<>(2);
-                    actionParam.put("claim_type", 0);
-                    DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
-                            .appId(gameTencentUser.getWechatAppId())
-                            .userActionSetId(gameTencentUser.getUserActionSetId())
-                            .action(UserActionRpcDTO.builder()
-                                    .actionTime(gameTencentUser.getRegisterTime())
-                                    .actionType(actionType)
-                                    .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
-                                            .wechatAppId(gameTencentUser.getWechatAppId())
-                                            .wechatOpenid(gameTencentUser.getWechatOpenid())
-                                            .build())
-                                    .actionParam(actionParam)
-                                    .build())
-                            .build();
+                .forEach(gameTencentUser -> doCallback(gameTencentUser, true));
+        return true;
+    }
 
-                    GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
-                            .gameId(gameTencentUser.getGameId())
-                            .adAccountId(gameTencentUser.getAdAccountId())
-                            .actionTime(gameTencentUser.getRegisterTime())
-                            .createTime(LocalDateTime.now())
-                            .actionType(actionType)
-                            .wechatAppId(gameTencentUser.getWechatAppId())
-                            .wechatOpenid(gameTencentUser.getWechatOpenid())
-                            .userActionSetId(gameTencentUser.getUserActionSetId())
-                            .actionParam(actionParam.toString())
-                            .build();
-                    gameTencentUser.setUpdateTime(LocalDateTime.now());
-                    gameTencentUser.setUpdateBy(SecurityUtil.getUserId());
-                    ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
-                    if (result.getCode() == HttpStatus.HTTP_OK) {
-                        gameTencentUser.setIsBack(BackStatusEnum.SUCCESS.getBackStatus());
-                        gameTencentUser.setBackLog("回传成功");
-                        updateById(gameTencentUser);
 
-                        gameTencentBackLog.setBackLog("回传成功");
-                        gameTencentBackLogService.save(gameTencentBackLog);
-                    } else {
-                        log.error("回传腾讯用户失败,失败原因:{}", result.getMsg());
-                        gameTencentUser.setBackLog(result.getMsg());
-                        gameTencentUser.setIsBack(BackStatusEnum.FAILED.getBackStatus());
-                        updateById(gameTencentUser);
+    private BackStatusEnum doCallback(GameTencentUser userLog, boolean mustBack) {
+        boolean isBack = mustBack ? false : gameTencentBackLogService.count(new LambdaQueryWrapper<GameTencentBackLog>()
+                .eq(GameTencentBackLog::getGameId, userLog.getGameId())
+                .eq(GameTencentBackLog::getWechatAppId, userLog.getWechatAppId())
+                .eq(GameTencentBackLog::getWechatOpenid, userLog.getWechatOpenid())
+                .eq(GameTencentBackLog::getAdAccountId, userLog.getAdAccountId())
+                .eq(GameTencentBackLog::getBackLog, "回传成功")
+        ) > 0;
+        if (isBack) {
+            return BackStatusEnum.NO;
+        }
 
-                        gameTencentBackLog.setBackLog(result.getMsg());
-                        gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
-                    }
+        Map<String, Object> actionParam = new HashMap<>(2);
+        actionParam.put("claim_type", 0);
+        DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
+                .appId(userLog.getWechatAppId())
+                .userActionSetId(userLog.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(userLog.getRegisterTime())
+                        .actionType(ActionTypeEnum.REGISTER.getActionType())
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .wechatAppId(userLog.getWechatAppId())
+                                .wechatOpenid(userLog.getWechatOpenid())
+                                .build())
+                        .actionParam(actionParam)
+                        .build())
+                .build();
 
-                });
-        return true;
+        GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
+                .gameId(userLog.getGameId())
+                .adAccountId(userLog.getAdAccountId())
+                .actionTime(userLog.getRegisterTime())
+                .createTime(LocalDateTime.now())
+                .actionType(ActionTypeEnum.REGISTER.getActionType())
+                .wechatAppId(userLog.getWechatAppId())
+                .wechatOpenid(userLog.getWechatOpenid())
+                .userActionSetId(userLog.getUserActionSetId())
+                .actionParam(actionParam.toString())
+                .build();
+        ResultVO<Boolean> result = userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
+        BackStatusEnum backStatus = BackStatusEnum.FAILED;
+        if (result.isSuccess()) {
+            backStatus = BackStatusEnum.SUCCESS;
+            gameTencentBackLog.setBackLog("回传成功");
+        } else {
+            gameTencentBackLog.setBackLog(result.getMsg());
+        }
+        gameTencentBackLogService.save(gameTencentBackLog);
+        return backStatus;
     }
 }

+ 0 - 2
game-data/game-data-serve/pom.xml

@@ -97,12 +97,10 @@
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-spring-boot-starter</artifactId>
-            <version>3.2.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-metadata-definition-protobuf</artifactId>
-            <version>3.2.3</version>
         </dependency>
         <dependency>
             <groupId>io.springfox</groupId>

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/GameDataApplication.java

@@ -16,7 +16,7 @@ public class GameDataApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GameDataApplication.class, args);
-        System.out.println("游戏数据服务启动成功 ( ´・・)ノ(._.`) \n" +
+        System.out.println("游戏数据服务启动成功 <dubbo升级3.0> ( ´・・)ノ(._.`) \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 2 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AccountAgentDayController.java

@@ -23,7 +23,7 @@ public class AccountAgentDayController {
     private IAccountAgentDayService accountAgentDayService;
 
     @ApiOperation(value = "推广每日数据")
-    @PreAuthorize(permissionKey = "gameData:accountAgent:day")
+//    @PreAuthorize(permissionKey = "gameData:accountAgent:day")
     @PostMapping("/day")
     public ResultVO<Page<GamePromoteDayVO>> accountAgentDay(@RequestBody GamePromoteDayDTO dto) {
         return ResultVO.ok(accountAgentDayService.accountAgentDay(dto));
@@ -37,7 +37,7 @@ public class AccountAgentDayController {
     }
 
     @ApiOperation(value = "推广总数据")
-    @PreAuthorize(permissionKey = "gameData:accountAgent:total")
+//    @PreAuthorize(permissionKey = "gameData:accountAgent:total")
     @PostMapping("/total")
     public ResultVO<Page<GamePromoteTotalVO>> accountAgentTotal(@RequestBody GamePromoteTotalDTO dto) {
         return ResultVO.ok(accountAgentDayService.accountAgentTotal(dto));

+ 9 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java

@@ -2,8 +2,10 @@ package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.game.data.serve.pojo.dto.GameDataDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.GameDataTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GameDataWaterDTO;
 import com.zanxiang.game.data.serve.pojo.vo.GameDataDayVO;
 import com.zanxiang.game.data.serve.pojo.vo.GameDataTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.GameDataWaterVO;
 import com.zanxiang.game.data.serve.service.IGameDataService;
 import com.zanxiang.game.data.serve.utils.Page;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -49,5 +51,12 @@ public class GameDataController {
         return ResultVO.ok(gameDataService.getGameDataTotal(dto));
     }
 
+    @ApiOperation(value = "每日流水贡献")
+    //@PreAuthorize(permissionKey = "gameData:adsGameDay:water")
+    @PostMapping("/water")
+    public ResultVO<Page<GameDataWaterVO>> getGameDataWater(@RequestBody GameDataWaterDTO dto) {
+        return ResultVO.ok(gameDataService.getGameDataWater(dto));
+    }
+
 
 }

+ 2 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RankingController.java

@@ -31,9 +31,9 @@ public class RankingController {
     }
 
     @ApiOperation(value = "玩家充值排行榜")
-    @PreAuthorize(permissionKey = "gameData:ranking:player")
+//    @PreAuthorize(permissionKey = "gameData:ranking:player")
     @PostMapping("/player")
-    public ResultVO<Page<PlayerRechargeRankingVO>> userRanking(@RequestBody RechargeRankingDTO dto) {
+    public ResultVO<Page<PlayerRechargeRankingVO>> playerRanking(@RequestBody RechargeRankingDTO dto) {
         return ResultVO.ok(rankingService.playerRanking(dto));
     }
 }

+ 48 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataWaterDTO.java

@@ -0,0 +1,48 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigInteger;
+import java.time.LocalDate;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 游戏总数据前端查询参数实体
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameDataWaterDTO extends BasePage {
+
+    /**
+     * 推广游戏名称
+     */
+    @ApiModelProperty(notes = "游戏名称")
+    private String gameName;
+
+    /**
+     * 推广游戏应用类别
+     */
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameClassify;
+
+    /**
+     * 充值时间(开始)
+     */
+    @ApiModelProperty(notes = "充值时间")
+    private LocalDate rechargeDate;
+
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
+
+}

+ 5 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteDayDTO.java

@@ -1,8 +1,6 @@
 package com.zanxiang.game.data.serve.pojo.dto;
 
 import com.zanxiang.game.data.serve.pojo.base.BasePage;
-import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
-import com.zanxiang.module.web.pojo.BaseListDTO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -37,5 +35,10 @@ public class GamePromoteDayDTO extends BasePage {
     @ApiModelProperty(notes = "消耗结束日期")
     private LocalDate endDay;
 
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
 
 }

+ 6 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteTotalDTO.java

@@ -1,7 +1,6 @@
 package com.zanxiang.game.data.serve.pojo.dto;
 
 import com.zanxiang.game.data.serve.pojo.base.BasePage;
-import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -40,4 +39,10 @@ public class GamePromoteTotalDTO extends BasePage {
     private LocalDate rechargeBeginDay;
     @ApiModelProperty(notes = "充值结束日期")
     private LocalDate rechargeEndDay;
+
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
 }

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsAccountAgentDay.java

@@ -490,6 +490,12 @@ public class AdsAccountAgentDay implements Serializable {
     @Column
     private String amountD3;
 
+    /**
+     * 付费趋势第五天总:增/回/倍
+     */
+    @Column
+    private String amountD5;
+
     /**
      * 付费趋势第七天总:增/回/倍
      */
@@ -520,6 +526,12 @@ public class AdsAccountAgentDay implements Serializable {
     @Column
     private String amountM3;
 
+    /**
+     * 付费趋势第六月总:增/回/倍
+     */
+    @Column
+    private String amountM6;
+
     /**
      * 付费趋势总:增/回/倍
      */

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsEverydayWater.java

@@ -107,6 +107,12 @@ public class AdsEverydayWater implements Serializable {
     @Column
     private Long userId;
 
+    /**
+     * 用户名称
+     */
+    @Column
+    private String userName;
+
     /**
      * 用户充值金额
      */

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsH5GameDay.java

@@ -28,7 +28,7 @@ import java.time.LocalDate;
 @PK({"dt", "gameId", "gameName", "gameClassify", "sourceSystem"})
 public class AdsH5GameDay implements Serializable {
     private static final long serialVersionUID = 1L;
-    public static final String TABLE_NAME = "ads_H5_game_day";
+    public static final String TABLE_NAME = "ads_h5_game_day";
 
     /**
      * ID

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/enums/OrderByEnum.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.data.serve.pojo.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum OrderByEnum {
+    DESC("desc"),
+    ASC("asc");
+    private final String orderType;
+}

+ 265 - 48
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java

@@ -472,147 +472,364 @@ public class GameDataDayVO {
     private BigDecimal amountArpu;
 
     /**
-     * 付费趋势:1天(买量)
+     * 付费趋势:1天(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1天(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1天(买量)金额/人数/增/回/倍")
     private String buyAmountD1;
 
     /**
-     * 付费趋势:3天(买量)
+     * 付费趋势:3天(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3天(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3天(买量)金额/人数/增/回/倍")
     private String buyAmountD3;
 
     /**
-     * 付费趋势:7天(买量)
+     * 付费趋势:5天(买量)金额/人数/增/回/倍
      */
-    @ApiModelProperty(value = "付费趋势:7天(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:5天(买量)金额/人数/增/回/倍")
+    private String buyAmountD5;
+
+    /**
+     * 付费趋势:7天(买量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:7天(买量)金额/人数/增/回/倍")
     private String buyAmountD7;
 
     /**
-     * 付费趋势:15天(买量)
+     * 付费趋势:15天(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:15天(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:15天(买量)金额/人数/增/回/倍")
     private String buyAmountD15;
 
     /**
-     * 付费趋势:1个月(买量)
+     * 付费趋势:1个月(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1个月(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1个月(买量)金额/人数/增/回/倍")
     private String buyAmountM1;
 
     /**
-     * 付费趋势:2个月(买量)
+     * 付费趋势:2个月(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:2个月(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:2个月(买量)金额/人数/增/回/倍")
     private String buyAmountM2;
 
     /**
-     * 付费趋势:3个月(买量)
+     * 付费趋势:3个月(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3个月(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3个月(买量)金额/人数/增/回/倍")
     private String buyAmountM3;
 
     /**
-     * 付费趋势:总(买量)
+     * 付费趋势:6个月(买量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:总(买量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:6个月(买量)金额/人数/增/回/倍")
+    private String buyAmountM6;
+
+    /**
+     * 付费趋势:总(买量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:总(买量)金额/人数/增/回/倍")
     private String buyAmountSum;
 
     /**
-     * 付费趋势:1天(自然量)
+     * 付费趋势:1天(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1天(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1天(自然量)金额/人数/增/回/倍")
     private String natureAmountD1;
 
     /**
-     * 付费趋势:3天(自然量)
+     * 付费趋势:3天(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3天(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3天(自然量)金额/人数/增/回/倍")
     private String natureAmountD3;
 
     /**
-     * 付费趋势:7天(自然量)
+     * 付费趋势:5天(自然量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:5天(自然量)金额/人数/增/回/倍")
+    private String natureAmountD5;
+
+    /**
+     * 付费趋势:7天(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:7天(自然量)")
+    @ApiModelProperty(value = "付费趋势:7天(自然量)金额/人数/增/回/倍")
     private String natureAmountD7;
 
     /**
-     * 付费趋势:15天(自然量)
+     * 付费趋势:15天(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:15天(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:15天(自然量)金额/人数/增/回/倍")
     private String natureAmountD15;
 
     /**
-     * 付费趋势:1个月(自然量)
+     * 付费趋势:1个月(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1个月(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1个月(自然量)金额/人数/增/回/倍")
     private String natureAmountM1;
 
     /**
-     * 付费趋势:2个月(自然量)
+     * 付费趋势:2个月(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:2个月(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:2个月(自然量)金额/人数/增/回/倍")
     private String natureAmountM2;
 
     /**
-     * 付费趋势:3个月(自然量)
+     * 付费趋势:3个月(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3个月(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3个月(自然量)金额/人数/增/回/倍")
     private String natureAmountM3;
 
     /**
-     * 付费趋势:总(自然量)
+     * 付费趋势:6个月(自然量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:总(自然量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:6个月(自然量)金额/人数/增/回/倍")
+    private String natureAmountM6;
+
+    /**
+     * 付费趋势:总(自然量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:总(自然量)金额/人数/增/回/倍")
     private String natureAmountSum;
 
     /**
-     * 付费趋势:1天(总量)
+     * 付费趋势:1天(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1天(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1天(总量)金额/人数/增/回/倍")
     private String amountD1;
 
     /**
-     * 付费趋势:3天(总量)
+     * 付费趋势:3天(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3天(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3天(总量)金额/人数/增/回/倍")
     private String amountD3;
 
     /**
-     * 付费趋势:7天(总量)
+     * 付费趋势:5天(总量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:5天(总量)金额/人数/增/回/倍")
+    private String amountD5;
+
+    /**
+     * 付费趋势:7天(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:7天(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:7天(总量)金额/人数/增/回/倍")
     private String amountD7;
 
     /**
-     * 付费趋势:15天(总量)
+     * 付费趋势:15天(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:15天(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:15天(总量)金额/人数/增/回/倍")
     private String amountD15;
 
     /**
-     * 付费趋势:1个月(总量)
+     * 付费趋势:1个月(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:1个月(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:1个月(总量)金额/人数/增/回/倍")
     private String amountM1;
 
     /**
-     * 付费趋势:2个月(总量)
+     * 付费趋势:2个月(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:2个月(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:2个月(总量)金额/人数/增/回/倍")
     private String amountM2;
 
     /**
-     * 付费趋势:3个月(总量)
+     * 付费趋势:3个月(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:3个月(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:3个月(总量)金额/人数/增/回/倍")
     private String amountM3;
 
     /**
-     * 付费趋势:总(总量)
+     * 付费趋势:6个月(总量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:6个月(总量)金额/人数/增/回/倍")
+    private String amountM6;
+
+    /**
+     * 付费趋势:总(总量)金额/人数/增/回/倍(不展示)
      */
-    @ApiModelProperty(value = "付费趋势:总(总量)")
+    @ApiModelProperty(value = "(不展示)付费趋势:总(总量)金额/人数/增/回/倍")
     private String amountSum;
 
+    /**
+     * 付费趋势:1天(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD1Trend;
+
+    /**
+     * 付费趋势:3天(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD3Trend;
+
+    /**
+     * 付费趋势:5天(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:5天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD5Trend;
+
+    /**
+     * 付费趋势:7天(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:7天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD7Trend;
+
+    /**
+     * 付费趋势:15天(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:15天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD15Trend;
+
+    /**
+     * 付费趋势:1个月(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1个月(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountM1Trend;
+
+    /**
+     * 付费趋势:2个月(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:2个月(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountM2Trend;
+
+    /**
+     * 付费趋势:3个月(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3个月(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountM3Trend;
+
+    /**
+     * 付费趋势:6个月(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:6个月(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountM6Trend;
+
+    /**
+     * 付费趋势:总(买量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:总(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountSumTrend;
+
+    /**
+     * 付费趋势:1天(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD1Trend;
+
+    /**
+     * 付费趋势:3天(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD3Trend;
+
+    /**
+     * 付费趋势:5天(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:5天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD5Trend;
+
+    /**
+     * 付费趋势:7天(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:7天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD7Trend;
+
+    /**
+     * 付费趋势:15天(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:15天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD15Trend;
+
+    /**
+     * 付费趋势:1个月(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1个月(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountM1Trend;
+
+    /**
+     * 付费趋势:2个月(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:2个月(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountM2Trend;
+
+    /**
+     * 付费趋势:3个月(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3个月(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountM3Trend;
+
+    /**
+     * 付费趋势:6个月(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:6个月(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountM6Trend;
+
+    /**
+     * 付费趋势:总(自然量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:总(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountSumTrend;
+
+    /**
+     * 付费趋势:1天(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD1Trend;
+
+    /**
+     * 付费趋势:3天(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD3Trend;
+
+    /**
+     * 付费趋势:5天(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:5天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD5Trend;
+
+    /**
+     * 付费趋势:7天(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:7天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD7Trend;
+
+    /**
+     * 付费趋势:15天(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:15天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD15Trend;
+
+    /**
+     * 付费趋势:1个月(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:1个月(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountM1Trend;
+
+    /**
+     * 付费趋势:2个月(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:2个月(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountM2Trend;
+
+    /**
+     * 付费趋势:3个月(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:3个月(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountM3Trend;
+
+    /**
+     * 付费趋势:6个月(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:6个月(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountM6Trend;
+
+    /**
+     * 付费趋势:总(总量)金额/人数/增/回/倍(展示数据)
+     */
+    @ApiModelProperty(value = "付费趋势:总(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountSumTrend;
+
+
 }

+ 3 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalVO.java

@@ -216,7 +216,7 @@ public class GameDataTotalVO {
      * 新用户复充人数(买量)(前端不需要显示)
      */
     @ApiModelProperty(value = "新用户复充人数(买量)(前端不需要显示)")
-    private BigInteger buyNewUserAgainCount;
+    private BigInteger buyNewUserAgainNum;
 
     /**
      * 新增注册ARPU(买量)
@@ -408,7 +408,7 @@ public class GameDataTotalVO {
      * 新用户复充人数(自然量)(前端不需要显示)
      */
     @ApiModelProperty(value = "新用户复充人数(自然量)(前端不需要显示)")
-    private BigInteger natureNewUserAgainCount;
+    private BigInteger natureNewUserAgainNum;
 
     /**
      * 新增注册ARPU(自然量)
@@ -600,7 +600,7 @@ public class GameDataTotalVO {
      * 新用户复充人数(总量)(前端不需要显示)
      */
     @ApiModelProperty(value = "新用户复充人数(总量)(前端不需要显示)")
-    private BigInteger newUserAgainCount;
+    private BigInteger newUserAgainNum;
 
     /**
      * 新增注册ARPU(总量)

+ 65 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataWaterVO.java

@@ -0,0 +1,65 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 返回给前端的游戏总数据实体
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameDataWaterVO {
+    private Long id;
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @ApiModelProperty("游戏名称")
+    private String gameName;
+
+    /**
+     * 游戏类别
+     */
+    @ApiModelProperty("游戏类别")
+    private String gameClassify;
+
+    /**
+     * 充值金额总
+     */
+    @ApiModelProperty("充值金额总")
+    private BigDecimal amount;
+
+    /**
+     * 买量金额
+     */
+    @ApiModelProperty("买量金额")
+    private BigDecimal buyAmount;
+
+    /**
+     * 自然量充值金额
+     */
+    @ApiModelProperty("自然量充值金额")
+    private BigDecimal natureAmount;
+
+    private List<RechargeTemplateVO> rechargeTemplateVOList;
+
+    private List<PlayerTemplateVO> playerTemplateVOS;
+}

+ 45 - 9
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayVO.java

@@ -228,35 +228,71 @@ public class GamePromoteDayVO {
     @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
     private BigDecimal firstRechargeArpu;
 
-    @ApiModelProperty(notes = "付费Arpu=新用户累计充值金额/新用户累计充值人数")
+    @ApiModelProperty(notes = "当天付费Arpu=新用户累计充值金额/新用户累计充值人数")
     private BigDecimal todayRechargeArpu;
 
     @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
     private BigDecimal showRechargeArpu;
 
+    @ApiModelProperty(notes = "不展示--付费趋势:1天")
+    private String trendDay1;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:3天")
+    private String trendDay3;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:5天")
+    private String trendDay5;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:7天")
+    private String trendDay7;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:15天")
+    private String trendDay15;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:1个月")
+    private String trendMonth1;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:2个月")
+    private String trendMonth2;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:3个月")
+    private String trendMonth3;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:6个月")
+    private String trendMonth6;
+
+    @ApiModelProperty(notes = "不展示--付费趋势:总")
+    private String trendTotal;
+
     @ApiModelProperty(notes = "付费趋势:1天")
-    private String rechargeTrendDay1;
+    private RechargeTrendVO rechargeTrendDay1;
 
     @ApiModelProperty(notes = "付费趋势:3天")
-    private String rechargeTrendDay3;
+    private RechargeTrendVO rechargeTrendDay3;
+
+    @ApiModelProperty(notes = "付费趋势:5天")
+    private RechargeTrendVO rechargeTrendDay5;
 
     @ApiModelProperty(notes = "付费趋势:7天")
-    private String rechargeTrendDay7;
+    private RechargeTrendVO rechargeTrendDay7;
 
     @ApiModelProperty(notes = "付费趋势:15天")
-    private String rechargeTrendDay15;
+    private RechargeTrendVO rechargeTrendDay15;
 
     @ApiModelProperty(notes = "付费趋势:1个月")
-    private String rechargeTrendMonth1;
+    private RechargeTrendVO rechargeTrendMonth1;
 
     @ApiModelProperty(notes = "付费趋势:2个月")
-    private String rechargeTrendMonth2;
+    private RechargeTrendVO rechargeTrendMonth2;
 
     @ApiModelProperty(notes = "付费趋势:3个月")
-    private String rechargeTrendMonth3;
+    private RechargeTrendVO rechargeTrendMonth3;
+
+    @ApiModelProperty(notes = "付费趋势:6个月")
+    private RechargeTrendVO rechargeTrendMonth6;
 
     @ApiModelProperty(notes = "付费趋势:总")
-    private String rechargeTrendTotal;
+    private RechargeTrendVO rechargeTrendTotal;
 
     @ApiModelProperty(notes = "单日付费100+人数")
     private String hundredUserNum;

+ 3 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java

@@ -132,6 +132,9 @@ public class GamePromoteTotalVO {
     @ApiModelProperty(notes = "新用户充值人数")
     private Long userRechargeUser;
 
+    @ApiModelProperty(notes = "不展示字段--新用户复充人数")
+    private Long repeatRechargeUser;
+
     @ApiModelProperty(notes = "新用户充值金额")
     private BigDecimal userRechargeMoney;
 

+ 10 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerRechargeRankingVO.java

@@ -47,6 +47,12 @@ public class PlayerRechargeRankingVO {
     @ApiModelProperty("注册游戏ID")
     private Long regGameId;
 
+    /**
+     * 注册游戏ID
+     */
+    @ApiModelProperty("注册游戏名")
+    private String regGameName;
+
     /**
      * 玩家操作系统
      */
@@ -56,9 +62,12 @@ public class PlayerRechargeRankingVO {
     /**
      * 最近充值游戏
      */
-    @ApiModelProperty("最近充值游戏")
+    @ApiModelProperty("最近充值游戏ID")
     private Long lastAmountGameId;
 
+    @ApiModelProperty("最近充值游戏名称")
+    private String lastAmountGameName;
+
     /**
      * 最近充值时间
      */

+ 52 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PlayerTemplateVO.java

@@ -0,0 +1,52 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 返回给前端的游戏总数据实体
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PlayerTemplateVO {
+    /**
+     * 玩家模板排序
+     */
+    @ApiModelProperty("玩家模板排序")
+    private String userOrderBy;
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    /**
+     * 用户充值金额
+     */
+    @ApiModelProperty("用户充值金额")
+    private BigDecimal userAmount;
+
+    /**
+     * 用户充值占比
+     */
+    @ApiModelProperty("用户充值占比")
+    private BigDecimal proportion;
+
+
+}

+ 45 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTemplateVO.java

@@ -0,0 +1,45 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 返回给前端的游戏总数据实体
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class RechargeTemplateVO {
+    /**
+     * 充值模板排序
+     */
+    @ApiModelProperty("充值模板排序")
+    private String amountOrderBy;
+
+    /**
+     * 充值挡位
+     */
+    @ApiModelProperty("充值挡位")
+    private BigDecimal amountPost;
+
+    /**
+     * 充值次数
+     */
+    @ApiModelProperty("充值次数")
+    private Long amountCount;
+
+    /**
+     * 充值人数
+     */
+    @ApiModelProperty("充值人数")
+    private Long amountNum;
+
+}

+ 30 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTrendVO.java

@@ -0,0 +1,30 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class RechargeTrendVO {
+    @ApiModelProperty(notes = "充值人数")
+    private Long rechargeUserCount;
+
+    @ApiModelProperty(notes = "充值金额")
+    private BigDecimal rechargeMoney;
+
+    @ApiModelProperty(notes = "增")
+    private BigDecimal increase;
+
+    @ApiModelProperty(notes = "回")
+    private BigDecimal back;
+
+    @ApiModelProperty(notes = "倍")
+    private BigDecimal multiples;
+}

+ 4 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameDataService.java

@@ -2,8 +2,10 @@ package com.zanxiang.game.data.serve.service;
 
 import com.zanxiang.game.data.serve.pojo.dto.GameDataDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.GameDataTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GameDataWaterDTO;
 import com.zanxiang.game.data.serve.pojo.vo.GameDataDayVO;
 import com.zanxiang.game.data.serve.pojo.vo.GameDataTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.GameDataWaterVO;
 import com.zanxiang.game.data.serve.utils.Page;
 
 public interface IGameDataService {
@@ -21,4 +23,6 @@ public interface IGameDataService {
      * @return
      */
     Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto);
+
+    Page<GameDataWaterVO> getGameDataWater(GameDataWaterDTO dto);
 }

+ 138 - 21
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java

@@ -1,15 +1,17 @@
 package com.zanxiang.game.data.serve.service.impl;
 
+import com.google.common.base.CaseFormat;
 import com.google.gson.Gson;
 import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayTotalDTO;
 import com.zanxiang.game.data.serve.pojo.dto.GamePromoteTotalDTO;
 import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
-import com.zanxiang.game.data.serve.pojo.entity.AdsGameDay;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayVO;
 import com.zanxiang.game.data.serve.pojo.vo.GamePromoteTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.RechargeTrendVO;
 import com.zanxiang.game.data.serve.service.IAccountAgentDayService;
 import com.zanxiang.game.data.serve.utils.Page;
 import com.zanxiang.module.util.DateUtil;
@@ -22,8 +24,6 @@ import org.nutz.dao.Dao;
 import org.nutz.dao.Sqls;
 import org.nutz.dao.entity.Entity;
 import org.nutz.dao.pager.Pager;
-import org.nutz.dao.sql.Criteria;
-import org.nutz.dao.sql.GroupBy;
 import org.nutz.dao.sql.Sql;
 import org.nutz.dao.util.Daos;
 import org.nutz.dao.util.cri.SimpleCriteria;
@@ -51,6 +51,12 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
         sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
         dto.setSysUserId(sysUserId);
+        if (StringUtils.isBlank(dto.getSortFiled())){
+            dto.setSortFiled("dt");
+        }
+        if (StringUtils.isBlank(dto.getSortType())){
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
         if (null == dto.getBeginDay() || null == dto.getEndDay()){
             dto.setBeginDay(LocalDate.now());
             dto.setEndDay(LocalDate.now());
@@ -83,13 +89,106 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         if (null != dto.getEndDay()) {
             cri.where().and("dt", "<=", dto.getEndDay());
         }
-        Sql sql = Sqls.queryEntity(accountAgentDaySql() + "$condition" + " order by dt desc");
+        cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        Sql sql = Sqls.queryEntity(accountAgentDaySql() + "$condition");
         sql.setPager(pager);
         Entity<GamePromoteDayVO> entity = dao.getEntity(GamePromoteDayVO.class);
         sql.setEntity(entity).setCondition(cri);
         dao.execute(sql);
         pager.setRecordCount(dao.count(AdsAccountAgentDay.class, cri));
-        return new Page<>(sql.getList(GamePromoteDayVO.class), pager);
+        List<GamePromoteDayVO> collect = sql.getList(GamePromoteDayVO.class).stream().map(item -> {
+            String[] trendDay1 = item.getTrendDay1().split("/");
+            item.setRechargeTrendDay1(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendDay1[0]))
+                    .rechargeUserCount(Long.valueOf(trendDay1[1]))
+                    .increase(new BigDecimal(trendDay1[2]))
+                    .back(new BigDecimal(trendDay1[3]))
+                    .multiples(new BigDecimal(trendDay1[4]))
+                    .build());
+
+            String[] trendDay3 = item.getTrendDay3().split("/");
+            item.setRechargeTrendDay3(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendDay3[0]))
+                    .rechargeUserCount(Long.valueOf(trendDay3[1]))
+                    .increase(new BigDecimal(trendDay3[2]))
+                    .back(new BigDecimal(trendDay3[3]))
+                    .multiples(new BigDecimal(trendDay3[4]))
+                    .build());
+
+            String[] trendDay5 = item.getTrendDay5().split("/");
+            item.setRechargeTrendDay5(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendDay5[0]))
+                    .rechargeUserCount(Long.valueOf(trendDay5[1]))
+                    .increase(new BigDecimal(trendDay5[2]))
+                    .back(new BigDecimal(trendDay5[3]))
+                    .multiples(new BigDecimal(trendDay5[4]))
+                    .build());
+
+            String[] trendDay7 = item.getTrendDay7().split("/");
+            item.setRechargeTrendDay7(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendDay7[0]))
+                    .rechargeUserCount(Long.valueOf(trendDay7[1]))
+                    .increase(new BigDecimal(trendDay7[2]))
+                    .back(new BigDecimal(trendDay7[3]))
+                    .multiples(new BigDecimal(trendDay7[4]))
+                    .build());
+
+            String[] trendDay15 = item.getTrendDay15().split("/");
+            item.setRechargeTrendDay15(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendDay15[0]))
+                    .rechargeUserCount(Long.valueOf(trendDay15[1]))
+                    .increase(new BigDecimal(trendDay15[2]))
+                    .back(new BigDecimal(trendDay15[3]))
+                    .multiples(new BigDecimal(trendDay15[4]))
+                    .build());
+
+            String[] trendMonth1 = item.getTrendMonth1().split("/");
+            item.setRechargeTrendMonth1(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendMonth1[0]))
+                    .rechargeUserCount(Long.valueOf(trendMonth1[1]))
+                    .increase(new BigDecimal(trendMonth1[2]))
+                    .back(new BigDecimal(trendMonth1[3]))
+                    .multiples(new BigDecimal(trendMonth1[4]))
+                    .build());
+
+            String[] trendMonth2 = item.getTrendMonth2().split("/");
+            item.setRechargeTrendMonth2(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendMonth2[0]))
+                    .rechargeUserCount(Long.valueOf(trendMonth2[1]))
+                    .increase(new BigDecimal(trendMonth2[2]))
+                    .back(new BigDecimal(trendMonth2[3]))
+                    .multiples(new BigDecimal(trendMonth2[4]))
+                    .build());
+
+            String[] trendMonth3 = item.getTrendMonth3().split("/");
+            item.setRechargeTrendMonth3(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendMonth3[0]))
+                    .rechargeUserCount(Long.valueOf(trendMonth3[1]))
+                    .increase(new BigDecimal(trendMonth3[2]))
+                    .back(new BigDecimal(trendMonth3[3]))
+                    .multiples(new BigDecimal(trendMonth3[4]))
+                    .build());
+
+            String[] trendMonth6 = item.getTrendMonth6().split("/");
+            item.setRechargeTrendMonth6(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendMonth6[0]))
+                    .rechargeUserCount(Long.valueOf(trendMonth6[1]))
+                    .increase(new BigDecimal(trendMonth6[2]))
+                    .back(new BigDecimal(trendMonth6[3]))
+                    .multiples(new BigDecimal(trendMonth6[4]))
+                    .build());
+
+            String[] trendTotal = item.getTrendTotal().split("/");
+            item.setRechargeTrendTotal(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(trendTotal[0]))
+                    .rechargeUserCount(Long.valueOf(trendTotal[1]))
+                    .increase(new BigDecimal(trendTotal[2]))
+                    .back(new BigDecimal(trendTotal[3]))
+                    .multiples(new BigDecimal(trendTotal[4]))
+                    .build());
+            return item;
+        }).collect(Collectors.toList());
+        return new Page<>(collect, pager);
     }
 
     @Override
@@ -136,6 +235,12 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
         sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
         dto.setSysUserId(sysUserId);
+        if (StringUtils.isBlank(dto.getSortFiled())){
+            dto.setSortFiled("cost");
+        }
+        if (StringUtils.isBlank(dto.getSortType())){
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
         if (null == dto.getCostEndDay() || null == dto.getCostBeginDay()) {
             dto.setCostBeginDay(LocalDate.now());
             dto.setCostEndDay(LocalDate.now());
@@ -173,6 +278,7 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
             cri.where().and("a.dt", "<=", dto.getCostEndDay());
         }
         cri.groupBy("a.account_id,a.agent_id");
+        cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
         Sql sql = Sqls.queryEntity(accountAgentTotalSql() + "$condition");
         sql.setPager(pager);
         Entity<GamePromoteTotalVO> entity = dao.getEntity(GamePromoteTotalVO.class);
@@ -185,10 +291,10 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
         List<GamePromoteTotalVO> list = sql.getList(GamePromoteTotalVO.class);
 
-        //存在充值时间,获取表ads_dayn_amount的json数据
+        //渠道注册时间内的dayn充值数据,获取表ads_dayn_amount的json数据
         Map<String, Object> dayNMap = new HashMap<>(4);
-        dayNMap.put("beginDay", dto.getRechargeBeginDay());
-        dayNMap.put("endDay", dto.getRechargeEndDay());
+        dayNMap.put("beginDay", dto.getCostBeginDay());
+        dayNMap.put("endDay", dto.getCostEndDay());
 
         //循环总数据的每条数据
         List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
@@ -208,7 +314,7 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
 
                 Map<String, String> resultMap = new HashMap<>();
-                resultMap.put("dayN", "0.00-0-0");
+                resultMap.put("dayN", "0.00-0-0-0");
                 for (Map<String, String> jsonMap : jsonList) {
                     for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
                         String key = entry.getKey();
@@ -220,7 +326,8 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                             BigDecimal money = new BigDecimal(existingParts[0]).add(new BigDecimal(parts[0]));
                             int count = Integer.parseInt(existingParts[1]) + Integer.parseInt(parts[1]);
                             int num = Integer.parseInt(existingParts[2]) + Integer.parseInt(parts[2]);
-                            String newValue = money + "-" + count + "-" + num;
+                            int repeatNum = Integer.parseInt(existingParts[3]) + Integer.parseInt(parts[3]);
+                            String newValue = money + "-" + count + "-" + num + "-" + repeatNum;
                             resultMap.put("dayN", newValue);
                         }
                     }
@@ -231,6 +338,7 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                             .rechargeMoney(new BigDecimal(parts[0]))
                             .rechargeCount(Long.valueOf(parts[1]))
                             .rechargeNum(Long.valueOf(parts[2]))
+                            .repeatNum(Long.valueOf(parts[3]))
                             .build();
                 }
             }
@@ -239,6 +347,7 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 item.setUserRechargeMoney(dayN.getRechargeMoney());
                 item.setUserRechargeCount(dayN.getRechargeCount());
                 item.setUserRechargeUser(dayN.getRechargeNum());
+                item.setRepeatRechargeUser(dayN.getRepeatNum());
                 item.setUserRechargeArpu(item.getUserRechargeUser() == 0 ?
                         BigDecimal.ZERO:item.getUserRechargeMoney().divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
 
@@ -260,6 +369,11 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
 
                 item.setUserRechargeCost(item.getUserRechargeUser() == 0 ?
                         BigDecimal.ZERO:item.getCost().divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
+
+                item.setRepeatRechargeRate(item.getUserRechargeUser() == 0 ?
+                        BigDecimal.ZERO:BigDecimal.valueOf(item.getRepeatRechargeUser()).divide(BigDecimal.valueOf(item.getUserRechargeUser()),4, RoundingMode.DOWN));
+                item.setUserRepeatRechargeRate(item.getNewUserRechargeUser() == 0 ?
+                        BigDecimal.ZERO:BigDecimal.valueOf(item.getRepeatRechargeUser()).divide(BigDecimal.valueOf(item.getNewUserRechargeUser()),4, RoundingMode.DOWN));
             }
             return item;
         }).collect(Collectors.toList());
@@ -348,14 +462,16 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	first_arpu AS first_recharge_arpu,
                 	today_arpu AS today_recharge_arpu,
                 	paper_arpu AS show_recharge_arpu,
-                	amount_d1 AS recharge_trend_day1,
-                	amount_d3 AS recharge_trend_day3,
-                	amount_d7 AS recharge_trend_day7,
-                	amount_d15 AS recharge_trend_day15,
-                	amount_m1 AS recharge_trend_month1,
-                	amount_m2 AS recharge_trend_month2,
-                	amount_m3 AS recharge_trend_month3,
-                	amount_sum AS recharge_trend_total,
+                	amount_d1 AS trend_day1,
+                	amount_d3 AS trend_day3,
+                	amount_d5 AS trend_day5,
+                	amount_d7 AS trend_day7,
+                	amount_d15 AS trend_day15,
+                	amount_m1 AS trend_month1,
+                	amount_m2 AS trend_month2,
+                	amount_m3 AS trend_month3,
+                	amount_m6 AS trend_month6,
+                	amount_sum AS trend_total,
                 	hundred_user_num,
                 	hundred_user_num_cost
                 from
@@ -491,9 +607,9 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 	sum(a.first_new_user_amount_count) as user_recharge_count,
                 	sum(a.first_new_user_amount_num) as user_recharge_user,
                 	sum(a.first_new_user_amount) as user_recharge_money,
-                	sum(b.amount_count) as show_recharge_count,
-                	sum(b.amount_num) as show_recharge_user,
-                	sum(b.amount) as show_recharge_money,
+                	ifnull(sum(b.amount_count),0) as show_recharge_count,
+                	ifnull(sum(b.amount_num),0) as show_recharge_user,
+                	ifnull(sum(b.amount),0) as show_recharge_money,
                 	sum(a.old_amount_count) as old_user_recharge_count,
                 	sum(a.old_amount_num) as old_user_recharge_user,
                 	sum(a.old_amount) as old_user_recharge_money,
@@ -542,5 +658,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         private BigDecimal rechargeMoney;
         private Long rechargeCount;
         private Long rechargeNum;
+        private Long repeatNum;
     }
 }

+ 764 - 132
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -1,24 +1,42 @@
 package com.zanxiang.game.data.serve.service.impl;
 
+import com.google.common.base.CaseFormat;
+import com.google.gson.Gson;
 import com.zanxiang.game.data.serve.pojo.dto.GameDataDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.GameDataTotalDTO;
-import com.zanxiang.game.data.serve.pojo.vo.GameDataDayVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameDataTotalVO;
+import com.zanxiang.game.data.serve.pojo.dto.GameDataWaterDTO;
+import com.zanxiang.game.data.serve.pojo.entity.AdsEverydayWater;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
+import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.service.IGameDataService;
 import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.DateUtil;
+import lombok.Builder;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
 import org.nutz.dao.Sqls;
+import org.nutz.dao.entity.Entity;
 import org.nutz.dao.pager.Pager;
 import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
+import org.nutz.dao.util.Daos;
+import org.nutz.dao.util.cri.SimpleCriteria;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author tianhua
@@ -32,6 +50,11 @@ public class GameDataServiceImpl implements IGameDataService {
     @Autowired
     private Dao dao;
 
+    /**
+     * 游戏每日数据
+     * @param dto 前端传递查询参数
+     * @return 返回给前端的数据
+     */
     @Override
     public Page<GameDataDayVO> getGameDataDay(GameDataDayDTO dto) {
 
@@ -71,18 +94,300 @@ public class GameDataServiceImpl implements IGameDataService {
         //设置查询总数
         pager.setRecordCount(list.size());
 
+        List<GameDataDayVO> gameDataDayVOList = list.stream().map(vo -> {
+            //买量数据
+            String[] buyAmountD1 = vo.getBuyAmountD1().split("/");
+            vo.setBuyAmountD1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountD1[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountD1[1]))
+                    .increase(new BigDecimal(buyAmountD1[2]))
+                    .back(new BigDecimal(buyAmountD1[3]))
+                    .multiples(new BigDecimal(buyAmountD1[4]))
+                    .build());
+
+            String[] buyAmountD3 = vo.getBuyAmountD3().split("/");
+            vo.setBuyAmountD3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountD3[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountD3[1]))
+                    .increase(new BigDecimal(buyAmountD3[2]))
+                    .back(new BigDecimal(buyAmountD3[3]))
+                    .multiples(new BigDecimal(buyAmountD3[4]))
+                    .build());
+
+            String[] buyAmountD5 = vo.getBuyAmountD5().split("/");
+            vo.setBuyAmountD5Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountD5[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountD5[1]))
+                    .increase(new BigDecimal(buyAmountD5[2]))
+                    .back(new BigDecimal(buyAmountD5[3]))
+                    .multiples(new BigDecimal(buyAmountD5[4]))
+                    .build());
+
+            String[] buyAmountD7 = vo.getBuyAmountD7().split("/");
+            vo.setBuyAmountD7Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountD7[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountD7[1]))
+                    .increase(new BigDecimal(buyAmountD7[2]))
+                    .back(new BigDecimal(buyAmountD7[3]))
+                    .multiples(new BigDecimal(buyAmountD7[4]))
+                    .build());
+
+            String[] buyAmountD15 = vo.getBuyAmountD15().split("/");
+            vo.setBuyAmountD15Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountD15[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountD15[1]))
+                    .increase(new BigDecimal(buyAmountD15[2]))
+                    .back(new BigDecimal(buyAmountD15[3]))
+                    .multiples(new BigDecimal(buyAmountD15[4]))
+                    .build());
+
+            String[] buyAmountM1 = vo.getBuyAmountM1().split("/");
+            vo.setBuyAmountM1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountM1[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountM1[1]))
+                    .increase(new BigDecimal(buyAmountM1[2]))
+                    .back(new BigDecimal(buyAmountM1[3]))
+                    .multiples(new BigDecimal(buyAmountM1[4]))
+                    .build());
+
+            String[] buyAmountM2 = vo.getBuyAmountM2().split("/");
+            vo.setBuyAmountM2Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountM2[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountM2[1]))
+                    .increase(new BigDecimal(buyAmountM2[2]))
+                    .back(new BigDecimal(buyAmountM2[3]))
+                    .multiples(new BigDecimal(buyAmountM2[4]))
+                    .build());
+
+            String[] buyAmountM3 = vo.getBuyAmountM3().split("/");
+            vo.setBuyAmountM3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountM3[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountM3[1]))
+                    .increase(new BigDecimal(buyAmountM3[2]))
+                    .back(new BigDecimal(buyAmountM3[3]))
+                    .multiples(new BigDecimal(buyAmountM3[4]))
+                    .build());
+
+            String[] buyAmountM6 = vo.getBuyAmountM6().split("/");
+            vo.setBuyAmountM6Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountM6[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountM6[1]))
+                    .increase(new BigDecimal(buyAmountM6[2]))
+                    .back(new BigDecimal(buyAmountM6[3]))
+                    .multiples(new BigDecimal(buyAmountM6[4]))
+                    .build());
+
+            String[] buyAmountSum = vo.getBuyAmountSum().split("/");
+            vo.setBuyAmountSumTrend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(buyAmountSum[0]))
+                    .rechargeUserCount(Long.valueOf(buyAmountSum[1]))
+                    .increase(new BigDecimal(buyAmountSum[2]))
+                    .back(new BigDecimal(buyAmountSum[3]))
+                    .multiples(new BigDecimal(buyAmountSum[4]))
+                    .build());
+
+            //自然量数据
+            String[] natureAmountD1 = vo.getNatureAmountD1().split("/");
+            vo.setNatureAmountD1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountD1[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountD1[1]))
+                    .increase(new BigDecimal(natureAmountD1[2]))
+                    .back(new BigDecimal(natureAmountD1[3]))
+                    .multiples(new BigDecimal(natureAmountD1[4]))
+                    .build());
+
+            String[] natureAmountD3 = vo.getNatureAmountD3().split("/");
+            vo.setNatureAmountD3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountD3[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountD3[1]))
+                    .increase(new BigDecimal(natureAmountD3[2]))
+                    .back(new BigDecimal(natureAmountD3[3]))
+                    .multiples(new BigDecimal(natureAmountD3[4]))
+                    .build());
+
+            String[] natureAmountD5 = vo.getNatureAmountD5().split("/");
+            vo.setNatureAmountD5Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountD5[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountD5[1]))
+                    .increase(new BigDecimal(natureAmountD5[2]))
+                    .back(new BigDecimal(natureAmountD5[3]))
+                    .multiples(new BigDecimal(natureAmountD5[4]))
+                    .build());
+
+            String[] natureAmountD7 = vo.getNatureAmountD7().split("/");
+            vo.setNatureAmountD7Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountD7[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountD7[1]))
+                    .increase(new BigDecimal(natureAmountD7[2]))
+                    .back(new BigDecimal(natureAmountD7[3]))
+                    .multiples(new BigDecimal(natureAmountD7[4]))
+                    .build());
+
+            String[] natureAmountD15 = vo.getNatureAmountD15().split("/");
+            vo.setNatureAmountD15Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountD15[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountD15[1]))
+                    .increase(new BigDecimal(natureAmountD15[2]))
+                    .back(new BigDecimal(natureAmountD15[3]))
+                    .multiples(new BigDecimal(natureAmountD15[4]))
+                    .build());
+
+            String[] natureAmountM1 = vo.getNatureAmountM1().split("/");
+            vo.setNatureAmountM1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountM1[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountM1[1]))
+                    .increase(new BigDecimal(natureAmountM1[2]))
+                    .back(new BigDecimal(natureAmountM1[3]))
+                    .multiples(new BigDecimal(natureAmountM1[4]))
+                    .build());
+
+            String[] natureAmountM2 = vo.getNatureAmountM2().split("/");
+            vo.setNatureAmountM2Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountM2[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountM2[1]))
+                    .increase(new BigDecimal(natureAmountM2[2]))
+                    .back(new BigDecimal(natureAmountM2[3]))
+                    .multiples(new BigDecimal(natureAmountM2[4]))
+                    .build());
+
+            String[] natureAmountM3 = vo.getNatureAmountM3().split("/");
+            vo.setNatureAmountM3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountM3[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountM3[1]))
+                    .increase(new BigDecimal(natureAmountM3[2]))
+                    .back(new BigDecimal(natureAmountM3[3]))
+                    .multiples(new BigDecimal(natureAmountM3[4]))
+                    .build());
+
+            String[] natureAmountM6 = vo.getNatureAmountM6().split("/");
+            vo.setNatureAmountM6Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountM6[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountM6[1]))
+                    .increase(new BigDecimal(natureAmountM6[2]))
+                    .back(new BigDecimal(natureAmountM6[3]))
+                    .multiples(new BigDecimal(natureAmountM6[4]))
+                    .build());
+
+            String[] natureAmountSum = vo.getNatureAmountSum().split("/");
+            vo.setNatureAmountSumTrend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(natureAmountSum[0]))
+                    .rechargeUserCount(Long.valueOf(natureAmountSum[1]))
+                    .increase(new BigDecimal(natureAmountSum[2]))
+                    .back(new BigDecimal(natureAmountSum[3]))
+                    .multiples(new BigDecimal(natureAmountSum[4]))
+                    .build());
+
+            //总量数据
+            String[] amountD1 = vo.getAmountD1().split("/");
+            vo.setAmountD1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountD1[0]))
+                    .rechargeUserCount(Long.valueOf(amountD1[1]))
+                    .increase(new BigDecimal(amountD1[2]))
+                    .back(new BigDecimal(amountD1[3]))
+                    .multiples(new BigDecimal(amountD1[4]))
+                    .build());
+
+            String[] amountD3 = vo.getAmountD3().split("/");
+            vo.setAmountD3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountD3[0]))
+                    .rechargeUserCount(Long.valueOf(amountD3[1]))
+                    .increase(new BigDecimal(amountD3[2]))
+                    .back(new BigDecimal(amountD3[3]))
+                    .multiples(new BigDecimal(amountD3[4]))
+                    .build());
+
+            String[] amountD5 = vo.getAmountD5().split("/");
+            vo.setAmountD5Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountD5[0]))
+                    .rechargeUserCount(Long.valueOf(amountD5[1]))
+                    .increase(new BigDecimal(amountD5[2]))
+                    .back(new BigDecimal(amountD5[3]))
+                    .multiples(new BigDecimal(amountD5[4]))
+                    .build());
+
+            String[] amountD7 = vo.getAmountD7().split("/");
+            vo.setAmountD7Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountD7[0]))
+                    .rechargeUserCount(Long.valueOf(amountD7[1]))
+                    .increase(new BigDecimal(amountD7[2]))
+                    .back(new BigDecimal(amountD7[3]))
+                    .multiples(new BigDecimal(amountD7[4]))
+                    .build());
+
+            String[] amountD15 = vo.getAmountD15().split("/");
+            vo.setAmountD15Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountD15[0]))
+                    .rechargeUserCount(Long.valueOf(amountD15[1]))
+                    .increase(new BigDecimal(amountD15[2]))
+                    .back(new BigDecimal(amountD15[3]))
+                    .multiples(new BigDecimal(amountD15[4]))
+                    .build());
+
+            String[] amountM1 = vo.getAmountM1().split("/");
+            vo.setAmountM1Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountM1[0]))
+                    .rechargeUserCount(Long.valueOf(amountM1[1]))
+                    .increase(new BigDecimal(amountM1[2]))
+                    .back(new BigDecimal(amountM1[3]))
+                    .multiples(new BigDecimal(amountM1[4]))
+                    .build());
+
+            String[] amountM2 = vo.getAmountM2().split("/");
+            vo.setAmountM2Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountM2[0]))
+                    .rechargeUserCount(Long.valueOf(amountM2[1]))
+                    .increase(new BigDecimal(amountM2[2]))
+                    .back(new BigDecimal(amountM2[3]))
+                    .multiples(new BigDecimal(amountM2[4]))
+                    .build());
+
+            String[] amountM3 = vo.getAmountM3().split("/");
+            vo.setAmountM3Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountM3[0]))
+                    .rechargeUserCount(Long.valueOf(amountM3[1]))
+                    .increase(new BigDecimal(amountM3[2]))
+                    .back(new BigDecimal(amountM3[3]))
+                    .multiples(new BigDecimal(amountM3[4]))
+                    .build());
+
+            String[] amountM6 = vo.getAmountM6().split("/");
+            vo.setAmountM6Trend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountM6[0]))
+                    .rechargeUserCount(Long.valueOf(amountM6[1]))
+                    .increase(new BigDecimal(amountM6[2]))
+                    .back(new BigDecimal(amountM6[3]))
+                    .multiples(new BigDecimal(amountM6[4]))
+                    .build());
+
+            String[] amountSum = vo.getAmountSum().split("/");
+            vo.setAmountSumTrend(RechargeTrendVO.builder()
+                    .rechargeMoney(new BigDecimal(amountSum[0]))
+                    .rechargeUserCount(Long.valueOf(amountSum[1]))
+                    .increase(new BigDecimal(amountSum[2]))
+                    .back(new BigDecimal(amountSum[3]))
+                    .multiples(new BigDecimal(amountSum[4]))
+                    .build());
+
+            return vo;
+        }).collect(Collectors.toList());
+
         //返回list结果 封装到page对象里
-        return new Page<>(list, pager);
+        return new Page<>(gameDataDayVOList, pager);
     }
 
+    /**
+     * 游戏总数据
+     * @param dto 前端传递的查询参数
+     * @return 返回给前端的数据
+     */
     @Override
     public Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto) {
-        //如果注册时间参数为空,默认设置为当天
+        //如果注册时间参数为空,默认设置查询当天数据
         if (dto.getRegisteredBeginDate() == null || dto.getRechargeEndDate() == null) {
             dto.setRegisteredBeginDate(LocalDate.now());
             dto.setRegisteredEndDate(LocalDate.now());
         }
-        //如果充值时间参数为空,默认设置为注册时间
+        //如果充值时间参数为空,默认设置查询当天数据
         if (dto.getRechargeBeginDate() == null || dto.getRechargeEndDate() == null) {
             dto.setRechargeBeginDate(LocalDate.now());
             dto.setRechargeEndDate(LocalDate.now());
@@ -121,33 +426,135 @@ public class GameDataServiceImpl implements IGameDataService {
         //设置查询总数
         pager.setRecordCount(list.size());
 
-        /*//根据充值时间修改值
-        list.stream().map(new Function<GameDataTotalVO, Object>() {
-            //第一个参数 转换之前的参数
-            //第二个参数,转换之后的参数
-            //apply中的传入参数 就是流中的每一个数据
-            //返回值类型就是需要转换之后的类型
-            @Override
-            public Object apply(GameDataTotalVO gameDataTotalVO) {
+        //根据充值时间修改值
+        List<GameDataTotalVO> gameDataTotalVOList = list.stream().map(vo -> {
+            //设置查询参数map
+            Map<String, Object> dayNMap = new HashMap<>(4);
+            dayNMap.put("registerBeginDate", dto.getRegisteredBeginDate());
+            dayNMap.put("registerEndDate", dto.getRegisteredEndDate());
+            dayNMap.put("rechargeBeginDate", dto.getRechargeBeginDate());
+            dayNMap.put("rechargeEndDate", dto.getRechargeEndDate());
+            dayNMap.put("gameId", vo.getGameId());
 
-                //联表查询根据充值时间查询出相关参数
+            //买量表的充值相关数据
+            DayN buyDayN = getDayNByTableName(dayNMap, "ads_dayn_game_buy");
+            //自然量表的充值相关数据
+            DayN natureDayN = getDayNByTableName(dayNMap, "ads_dayn_game_nature");
+            //总量表的充值相关数据
+            DayN dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
 
+            //设置买量数据
+            //新用户充值次数、金额、人数
+            vo.setBuyNewUserAmount(buyDayN == null ? BigDecimal.ZERO : buyDayN.getRechargeMoney());
+            vo.setBuyNewUserAmountNum(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeNum());
+            vo.setBuyNewUserAmountCount(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeCount());
+            //新用户复充人数
+            vo.setBuyNewUserAgainNum(buyDayN == null ? BigInteger.ZERO : buyDayN.getRechargeAgainNum());
 
-                //设置新用户相关数据
+            //老用户充值次数、人数、金额
+            vo.setBuyOldUserAmount(vo.getBuyAmount().subtract(vo.getBuyNewUserAmount()));
+            vo.setBuyOldUserCount(vo.getBuyAmountCount().subtract(vo.getBuyNewUserAmountCount()));
+            vo.setBuyOldUserNum(vo.getBuyAmountNum().subtract(vo.getBuyNewUserAmountNum()));
 
+            //新用户付费比
+            vo.setBuyNewUserRate(vo.getBuyAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAmountNum().doubleValue() / vo.getBuyAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户付费率
+            vo.setBuyNewUserRoi(vo.getBuyRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAmountNum().doubleValue() / vo.getBuyRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
-                //联表查询新用户复充人数
+            //新用户客单价
+            vo.setBuyNewUserAvgAmount(vo.getBuyNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAmount().doubleValue() / vo.getBuyNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
+            //复充率
+            vo.setBuyUserAgainRate(vo.getBuyNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAgainNum().doubleValue() / vo.getBuyNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户复充率
+            vo.setBuyNewUserAgainRate(vo.getBuyNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAgainNum().doubleValue() / vo.getBuyNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
-                return null;
-            }
-        });*/
+            //新用户付费ARPU
+            vo.setBuyNewUserAmountArpu(vo.getBuyNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getBuyNewUserAmount().doubleValue() / vo.getBuyNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //设置自然量数据
+            //新用户充值次数、金额、人数
+            vo.setNatureNewUserAmount(natureDayN == null ? BigDecimal.ZERO : natureDayN.getRechargeMoney());
+            vo.setNatureNewUserAmountNum(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeNum());
+            vo.setNatureNewUserAmountCount(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeCount());
+            //新用户复充人数
+            vo.setNatureNewUserAgainNum(natureDayN == null ? BigInteger.ZERO : natureDayN.getRechargeAgainNum());
+
+            //老用户充值次数、人数、金额
+            vo.setNatureOldUserAmount(vo.getNatureAmount().subtract(vo.getNatureNewUserAmount()));
+            vo.setNatureOldUserCount(vo.getNatureAmountCount().subtract(vo.getNatureNewUserAmountCount()));
+            vo.setNatureOldUserNum(vo.getNatureAmountNum().subtract(vo.getNatureNewUserAmountNum()));
+
+            //新用户付费比
+            vo.setNatureNewUserRate(vo.getNatureAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAmountNum().doubleValue() / vo.getNatureAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户付费率
+            vo.setNatureNewUserRoi(vo.getNatureRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAmountNum().doubleValue() / vo.getNatureRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //新用户客单价
+            vo.setNatureNewUserAvgAmount(vo.getNatureNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAmount().doubleValue() / vo.getNatureNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //复充率
+            vo.setNatureUserAgainRate(vo.getNatureNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAgainNum().doubleValue() / vo.getNatureNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户复充率
+            vo.setNatureNewUserAgainRate(vo.getNatureNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAgainNum().doubleValue() / vo.getNatureNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //新用户付费ARPU
+            vo.setNatureNewUserAmountArpu(vo.getNatureNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNatureNewUserAmount().doubleValue() / vo.getNatureNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //设置总量数据
+            //新用户充值次数、金额、人数
+            vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
+            vo.setNewUserAmountNum(dayN == null ? BigInteger.ZERO : dayN.getRechargeNum());
+            vo.setNewUserAmountCount(dayN == null ? BigInteger.ZERO : dayN.getRechargeCount());
+            //新用户复充人数
+            vo.setNewUserAgainNum(dayN == null ? BigInteger.ZERO : dayN.getRechargeAgainNum());
+
+            //老用户充值次数、人数、金额
+            vo.setOldUserAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
+            vo.setOldUserCount(vo.getAmountCount().subtract(vo.getNewUserAmountCount()));
+            vo.setOldUserNum(vo.getAmountNum().subtract(vo.getNewUserAmountNum()));
+
+            //新用户付费比
+            vo.setNewUserRate(vo.getAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户付费率
+            vo.setNewUserRoi(vo.getRegNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //新用户客单价
+            vo.setNewUserAvgAmount(vo.getNewUserAmountCount().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAmount().doubleValue() / vo.getNewUserAmountCount().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //复充率
+            vo.setUserAgainRate(vo.getNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAgainNum().doubleValue() / vo.getNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+            //新用户复充率
+            vo.setNewUserAgainRate(vo.getNewUserTotalAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAgainNum().doubleValue() / vo.getNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            //新用户付费ARPU
+            vo.setNewUserAmountArpu(vo.getNewUserAmountNum().compareTo(BigInteger.ZERO) == 0 ? BigDecimal.ZERO :
+                    BigDecimal.valueOf(vo.getNewUserAmount().doubleValue() / vo.getNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+
+            return vo;
+        }).collect(Collectors.toList());
 
         //返回list结果封装到page对象里
-        return new Page<>(list, pager);
+        return new Page<>(gameDataTotalVOList, pager);
     }
 
-
     /**
      * 游戏每日数据SQL
      *
@@ -156,122 +563,123 @@ public class GameDataServiceImpl implements IGameDataService {
     private String gameDataDaySql() {
         return """
                 SELECT
-                dt cost_date,
-                game_name,
-                game_classify,
-                
-                buy_reg_num,
-                nature_reg_num,
-                reg_num,
-                    
-                buy_first_new_user_amount_count,
-                buy_first_new_user_amount_num,
-                buy_first_new_user_amount,
-                buy_old_user_count,
-                buy_old_user_num,
-                buy_old_user_amount,
-                buy_amount_count,
-                buy_amount_num,
-                buy_amount,
-                buy_new_user_total_amount_count,
-                buy_new_user_total_amount_num,
-                buy_new_user_total_amount,
-                buy_first_roi,
-                buy_today_roi,
-                buy_new_user_rate,
-                buy_first_avg_amount,
-                buy_today_avg_amount,
-                buy_avg_amount,
-                buy_user_again_rate,
-                buy_reg_user_arpu,
-                buy_first_amount_arpu,
-                buy_today_amount_arpu,
-                buy_amount_arpu,
-                buy_amount_d1,
-                buy_amount_d3,
-                buy_amount_d5,
-                buy_amount_d7,
-                buy_amount_d15,
-                buy_amount_m1,
-                buy_amount_m2,
-                buy_amount_m3,
-                buy_amount_m6,
-                buy_amount_sum,
-                    
-                nature_first_new_user_amount_count,
-                nature_first_new_user_amount_num,
-                nature_first_new_user_amount,
-                nature_old_user_count,
-                nature_old_user_num,
-                nature_old_user_amount,
-                nature_amount_count,
-                nature_amount_num,
-                nature_amount,
-                nature_new_user_total_amount_count,
-                nature_new_user_total_amount_num,
-                nature_new_user_total_amount,
-                nature_first_roi,
-                nature_today_roi,
-                nature_new_user_rate,
-                nature_first_avg_amount,
-                nature_today_avg_amount,
-                nature_avg_amount,
-                nature_user_again_rate,
-                nature_reg_user_arpu,
-                nature_first_amount_arpu,
-                nature_today_amount_arpu,
-                nature_amount_arpu,
-                nature_amount_d1,
-                nature_amount_d3,
-                nature_amount_d5,
-                nature_amount_d7,
-                nature_amount_d15,
-                nature_amount_m1,
-                nature_amount_m2,
-                nature_amount_m3,
-                nature_amount_m6,
-                nature_amount_sum,
+                    dt cost_date,
+                    game_name,
+                    game_classify,
+                                    
+                    buy_reg_num,
+                    nature_reg_num,
+                    reg_num,
+                        
+                    buy_first_new_user_amount_count,
+                    buy_first_new_user_amount_num,
+                    buy_first_new_user_amount,
+                    buy_old_user_count,
+                    buy_old_user_num,
+                    buy_old_user_amount,
+                    buy_amount_count,
+                    buy_amount_num,
+                    buy_amount,
+                    buy_new_user_total_amount_count,
+                    buy_new_user_total_amount_num,
+                    buy_new_user_total_amount,
+                    buy_first_roi,
+                    buy_today_roi,
+                    buy_new_user_rate,
+                    buy_first_avg_amount,
+                    buy_today_avg_amount,
+                    buy_avg_amount,
+                    buy_user_again_rate,
+                    buy_reg_user_arpu,
+                    buy_first_amount_arpu,
+                    buy_today_amount_arpu,
+                    buy_amount_arpu,
+                    buy_amount_d1,
+                    buy_amount_d3,
+                    buy_amount_d5,
+                    buy_amount_d7,
+                    buy_amount_d15,
+                    buy_amount_m1,
+                    buy_amount_m2,
+                    buy_amount_m3,
+                    buy_amount_m6,
+                    buy_amount_sum,
+                        
+                    nature_first_new_user_amount_count,
+                    nature_first_new_user_amount_num,
+                    nature_first_new_user_amount,
+                    nature_old_user_count,
+                    nature_old_user_num,
+                    nature_old_user_amount,
+                    nature_amount_count,
+                    nature_amount_num,
+                    nature_amount,
+                    nature_new_user_total_amount_count,
+                    nature_new_user_total_amount_num,
+                    nature_new_user_total_amount,
+                    nature_first_roi,
+                    nature_today_roi,
+                    nature_new_user_rate,
+                    nature_first_avg_amount,
+                    nature_today_avg_amount,
+                    nature_avg_amount,
+                    nature_user_again_rate,
+                    nature_reg_user_arpu,
+                    nature_first_amount_arpu,
+                    nature_today_amount_arpu,
+                    nature_amount_arpu,
+                    nature_amount_d1,
+                    nature_amount_d3,
+                    nature_amount_d5,
+                    nature_amount_d7,
+                    nature_amount_d15,
+                    nature_amount_m1,
+                    nature_amount_m2,
+                    nature_amount_m3,
+                    nature_amount_m6,
+                    nature_amount_sum,
+                        
+                    first_new_user_amount_count,
+                    first_new_user_amount_num,
+                    first_new_user_amount,
+                    old_user_count,
+                    old_user_num,
+                    old_user_amount,
+                    amount_count,
+                    amount_num,
+                    amount,
+                    new_user_total_amount_count,
+                    new_user_total_amount_num,
+                    new_user_total_amount,
+                    first_roi,
+                    today_roi,
+                    new_user_rate,
+                    first_avg_amount,
+                    today_avg_amount,
+                    avg_amount,
+                    user_again_rate,
+                    reg_user_arpu,
+                    first_amount_arpu,
+                    today_amount_arpu,
+                    amount_arpu,
+                    amount_d1,
+                    amount_d3,
+                    amount_d5,
+                    amount_d7,
+                    amount_d15,
+                    amount_m1,
+                    amount_m2,
+                    amount_m3,
+                    amount_m6,
+                    amount_sum
                     
-                first_new_user_amount_count,
-                first_new_user_amount_num,
-                first_new_user_amount,
-                old_user_count,
-                old_user_num,
-                old_user_amount,
-                amount_count,
-                amount_num,
-                amount,
-                new_user_total_amount_count,
-                new_user_total_amount_num,
-                new_user_total_amount,
-                first_roi,
-                today_roi,
-                new_user_rate,
-                first_avg_amount,
-                today_avg_amount,
-                avg_amount,
-                user_again_rate,
-                reg_user_arpu,
-                first_amount_arpu,
-                today_amount_arpu,
-                amount_arpu,
-                amount_d1,
-                amount_d3,
-                amount_d5,
-                amount_d7,
-                amount_d15,
-                amount_m1,
-                amount_m2,
-                amount_m3,
-                amount_m6,
-                amount_sum
-                    
-                FROM ads_game_day
+                FROM
+                    ads_game_day
                 """;
     }
 
     /**
-     * 游戏总数SQL
+     * 游戏总数据SQL
      *
      * @return String
      */
@@ -361,5 +769,229 @@ public class GameDataServiceImpl implements IGameDataService {
                 """;
     }
 
+    /** 三张表共用的方法
+     * @param dayNMap 参数Map
+     * @param tableName 查询的表名
+     * @return DayN数据
+     */
+    private DayN getDayNByTableName(Map<String, Object> dayNMap, String tableName) {
+
+        //构架SQL语句,查询相关DayN表获取相关充值数据
+        Sql dayNSql = Sqls.create(
+                """
+                   SELECT
+                        dayN
+                   FROM
+                        $tableName
+                   where
+                        dt between @registerBeginDate and @registerEndDate
+                        and game_id = @gameId
+                """
+        );
+        //sql语句传入参数
+        dayNSql.setParams(dayNMap);
+        //给定查询的表名
+        dayNSql.vars().set("tableName", tableName);
+        //设置回传
+        dayNSql.setCallback(Sqls.callback.strList());
+        //执行sql 获取数据到list中
+        dao.execute(dayNSql);
+
+        //将数据库中获取的所有结果封装到一个List中
+        List<String> dayNList = dayNSql.getList(String.class);
+        //构建一个内部类
+        DayN dayN = null;
+        //解析dayNList
+        if (!CollectionUtils.isEmpty(dayNList)) {
+            //将dayNList中json格式数据转换为 Map
+            Gson gson = new Gson();
+            List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
+            //用来存储数据的map
+            Map<String, String> resMap = new HashMap<>();
+            //对应的参数说明:  日期:每天充值金额-充值次数-充值人数-新用户复充人数
+            resMap.put("dayN", "0.00-0-0-0");
+            for (Map<String, String> jsonMap : jsonList) {
+                for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
+                    //key是充值日期
+                    String key = entry.getKey();
+                    String value = entry.getValue();
+                    //将value按“-”分割
+                    String[] resValues = value.split("-");
+                    //判断充值日期 在充值日期内的数据进行计算
+                    if (DateUtil.parseLocalDate(key).compareTo((LocalDate) dayNMap.get("rechargeBeginDate")) >= 0
+                            && DateUtil.parseLocalDate(key).compareTo((LocalDate) dayNMap.get("rechargeEndDate")) <= 0) {
+                        //获取原先的dayN的值
+                        String[] oldValues = resMap.get("dayN").split("-");
+                        //充值的金额
+                        BigDecimal chargeMoney = new BigDecimal(oldValues[0]).add(new BigDecimal(resValues[0]));
+                        //充值的次数
+                        BigInteger count = new BigInteger(oldValues[1]).add(new BigInteger(resValues[1]));
+                        //充值的人数
+                        BigInteger num = new BigInteger(oldValues[2]).add(new BigInteger(resValues[2]));
+                        //新用户复充人数
+                        BigInteger againNum = new BigInteger(oldValues[3]).add(new BigInteger(resValues[3]));
+                        //合并成字符串 更新dayN的值
+                        String newValue = chargeMoney + "-" + count + "-" + num + "-" + againNum;
+                        resMap.put("dayN", newValue);
+                    }
+                }
+            }
+            //设置dayN的参数
+            if (!resMap.isEmpty() && !resMap.get("dayN").isEmpty()) {
+                String[] values = resMap.get("dayN").split("-");
+                dayN = DayN.builder()
+                        .rechargeMoney(new BigDecimal(values[0]))
+                        .rechargeCount(new BigInteger(values[1]))
+                        .rechargeNum(new BigInteger(values[2]))
+                        .rechargeAgainNum(new BigInteger(values[3]))
+                        .build();
+            }
+        }
+        return dayN;
+    }
+
+    /**
+     * DayN内部类
+     */
+    @Data
+    @Builder
+    public static class DayN {
+        /**
+         * 充值金额
+         */
+        private BigDecimal rechargeMoney;
+
+        /**
+         * 充值次数
+         */
+        private BigInteger rechargeCount;
+
+        /**
+         * 充值人数
+         */
+        private BigInteger rechargeNum;
+
+        /**
+         * 新用户复充人数
+         */
+        private BigInteger rechargeAgainNum;
+    }
+
+    @Override
+    public Page<GameDataWaterVO> getGameDataWater(GameDataWaterDTO dto) {
+        if (null == dto.getRechargeDate()) {
+            dto.setRechargeDate(LocalDate.now());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled("amount");
+        }
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            cri.where().andLike("game_name", dto.getGameName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameClassify())) {
+            cri.where().andEquals("game_classify", dto.getGameClassify());
+        }
+        cri.where().and("dt", "=", dto.getRechargeDate());
+        cri.groupBy("game_id");
+        cri.orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        Sql sql = Sqls.queryEntity(waterSql() + "$condition");
+        sql.setPager(pager);
+        Entity<GameDataWaterVO> entity = dao.getEntity(GameDataWaterVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        dao.execute(sql);
+
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_everyday_water " + "$condition");
+        sqlCount.setCondition(cri);
+        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
+
+        List<Long> gameIds = sql.getList(GameDataWaterVO.class).stream()
+                .map(GameDataWaterVO::getGameId)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(gameIds)) {
+            return new Page<>();
+        }
+
+        SimpleCriteria templateCri = Cnd.cri();
+        templateCri.where().and("dt", "=", dto.getRechargeDate());
+        templateCri.where().andInList("game_id", gameIds);
+        Sql templateSql = Sqls.queryEntity(waterTemplateSql() + "$condition");
+        Entity<AdsEverydayWater> everydayWaterEntity = dao.getEntity(AdsEverydayWater.class);
+        templateSql.setEntity(everydayWaterEntity).setCondition(templateCri);
+        dao.execute(templateSql);
+
+        Map<Long, List<AdsEverydayWater>> collect = templateSql.getList(AdsEverydayWater.class).stream().collect(Collectors.groupingBy(AdsEverydayWater::getGameId));
+        List<GameDataWaterVO> result = sql.getList(GameDataWaterVO.class).stream()
+                .map(item -> {
+                    List<AdsEverydayWater> adsEverydayWaters = collect.get(item.getGameId());
+                    if (!CollectionUtils.isEmpty(adsEverydayWaters)) {
+                        List<RechargeTemplateVO> rechargeTemplateVOList = new ArrayList<>(10);
+
+                        List<PlayerTemplateVO> playerTemplateVOS = new ArrayList<>(10);
+                        adsEverydayWaters.forEach(adsEverydayWater -> {
+                            if (StringUtils.isNotBlank(adsEverydayWater.getAmountOrderBy())) {
+                                rechargeTemplateVOList.add(RechargeTemplateVO.builder()
+                                        .amountCount(adsEverydayWater.getAmountCount())
+                                        .amountNum(adsEverydayWater.getAmountNum())
+                                        .amountOrderBy(adsEverydayWater.getAmountOrderBy())
+                                        .amountPost(adsEverydayWater.getAmountPost())
+                                        .build());
+                            }
+                            if (StringUtils.isNotBlank(adsEverydayWater.getUserOrderBy())) {
+                                playerTemplateVOS.add(PlayerTemplateVO.builder()
+                                        .userId(adsEverydayWater.getUserId())
+                                        .userAmount(adsEverydayWater.getUserAmount())
+                                        .userOrderBy(adsEverydayWater.getUserOrderBy())
+                                        .userName(adsEverydayWater.getUserName())
+                                        .proportion(
+                                                item.getAmount().compareTo(BigDecimal.ZERO) == 0 ?
+                                                        BigDecimal.ZERO :
+                                                        adsEverydayWater.getUserAmount().divide(item.getAmount(), 4, RoundingMode.DOWN)
+                                        )
+                                        .build());
+                            }
+                        });
+                        item.setRechargeTemplateVOList(rechargeTemplateVOList);
+                        item.setPlayerTemplateVOS(playerTemplateVOS);
+                    }
+                    return item;
+                }).collect(Collectors.toList());
+
+        return new Page<>(result, pager);
+    }
+
+    private String waterSql() {
+        return """
+                select
+                game_id as id,
+                game_id,
+                max(game_name) as game_name,
+                max(game_classify) as game_classify,
+                max(amount) as amount,
+                max(buy_amount) as buy_amount,
+                max(nature_amount) as nature_amount
+                from ads_everyday_water
+                """;
+    }
 
+    private String waterTemplateSql() {
+        return """
+                select
+                game_id,
+                user_order_by,
+                user_id,
+                user_name,
+                user_amount,
+                amount_order_by,
+                amount_post,
+                amount_count,
+                amount_num
+                from ads_everyday_water
+                """;
+    }
 }

+ 3 - 5
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RankingServiceImpl.java

@@ -2,6 +2,7 @@ package com.zanxiang.game.data.serve.service.impl;
 
 import com.google.common.base.CaseFormat;
 import com.zanxiang.game.data.serve.pojo.dto.RechargeRankingDTO;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.pojo.vo.GameRechargeRankingVO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerRechargeRankingVO;
 import com.zanxiang.game.data.serve.service.IRankingService;
@@ -25,16 +26,13 @@ public class RankingServiceImpl implements IRankingService {
     @Autowired
     private Dao dao;
 
-    private static final String ASC = "asc";
-    private static final String DESC = "desc";
-
     @Override
     public Page<GameRechargeRankingVO> gameRanking(RechargeRankingDTO dto) {
         if (StringUtils.isBlank(dto.getSortFiled())){
             dto.setSortFiled("totalAmount");
         }
         if (StringUtils.isBlank(dto.getSortType())){
-            dto.setSortType(DESC);
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
         }
         Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
         // 创建一个 Criteria 接口实例
@@ -85,7 +83,7 @@ public class RankingServiceImpl implements IRankingService {
             dto.setSortFiled("totalAmount");
         }
         if (StringUtils.isBlank(dto.getSortType())){
-            dto.setSortType(DESC);
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
         }
         Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
         // 创建一个 Criteria 接口实例

+ 4 - 3
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/enums/AccountTypeEnum.java → game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/AccountTypeEnum.java

@@ -1,11 +1,12 @@
-package com.zanxiang.game.module.manage.pojo.enums;
+package com.zanxiang.game.module.base.pojo.enums;
 
 import lombok.Getter;
 
 @Getter
 public enum AccountTypeEnum {
-    TENCENT(1),
-    BYTE(2);
+    TENCENT_H5(1),
+    BYTE(2),
+    TENCENT_MINI_GAME(3);
 
     private final Integer value;
 

+ 34 - 4
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/PayWayEnum.java

@@ -52,15 +52,45 @@ public enum PayWayEnum {
      * @param payWayId : 支付类型
      * @return : 支付类型枚举
      */
-    public static String getByPayWayId(Long payWayId) {
+    public static String getNameByPayWayId(Long payWayId) {
         if (payWayId == null) {
             return Strings.EMPTY;
         }
+        PayWayEnum payWayEnum = PayWayEnum.getByPayWayId(payWayId.intValue());
+        //获取支付名称
+        return payWayEnum == null ? Strings.EMPTY : payWayEnum.getPayWayName();
+    }
+
+    /**
+     * 根据支付类型id获取名称
+     *
+     * @param payWayId : 支付类型
+     * @return : 支付类型枚举
+     */
+    public static String getKeyByPayWayId(Integer payWayId) {
+        if (payWayId == null) {
+            return Strings.EMPTY;
+        }
+        PayWayEnum payWayEnum = PayWayEnum.getByPayWayId(payWayId);
+        //获取支付名称
+        return payWayEnum == null ? Strings.EMPTY : payWayEnum.getPayWayKey();
+    }
+
+    /**
+     * 根据支付类型id获取名称
+     *
+     * @param payWayId : 支付类型
+     * @return : 支付类型枚举
+     */
+    public static PayWayEnum getByPayWayId(Integer payWayId) {
+        if (payWayId == null) {
+            return null;
+        }
         for (PayWayEnum payWayEnum : PayWayEnum.values()) {
-            if (Objects.equals(payWayId.intValue(), payWayEnum.getPayWayId())) {
-                return payWayEnum.getPayWayName();
+            if (Objects.equals(payWayId, payWayEnum.getPayWayId())) {
+                return payWayEnum;
             }
         }
-        return Strings.EMPTY;
+        return null;
     }
 }

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

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功001 ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

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

@@ -2,7 +2,7 @@ package com.zanxiang.game.module.manage.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zanxiang.erp.security.annotation.PreAuthorize;
-import com.zanxiang.game.module.manage.pojo.enums.AccountTypeEnum;
+import com.zanxiang.game.module.base.pojo.enums.AccountTypeEnum;
 import com.zanxiang.game.module.manage.pojo.params.AgentAddParam;
 import com.zanxiang.game.module.manage.pojo.params.AgentListParam;
 import com.zanxiang.game.module.manage.pojo.vo.AgentVO;
@@ -40,7 +40,7 @@ public class AgentController {
         if (accountType == null) {
             throw new BaseException("错误的账号类型:" + dto.getAccountType());
         }
-        if (accountType == AccountTypeEnum.TENCENT) {
+        if (accountType == AccountTypeEnum.TENCENT_H5) {
             if (dto.getUserActionSetId() == null) {
                 throw new BaseException("腾讯广告账号必须选回传的数据源");
             }

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

@@ -24,7 +24,7 @@ public class AgentAddParam {
     /**
      * 推广账号类型(1:腾讯、2:头条)
      */
-    @ApiModelProperty(notes = "推广账号类型(1:腾讯、2:头条)")
+    @ApiModelProperty(notes = "推广账号类型(1:腾讯H5、2:头条、3:腾讯小游戏)")
     @NotNull(message = "渠道类型不能为空")
     private Integer accountType;
 

+ 4 - 3
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AgentServiceImpl.java

@@ -16,7 +16,7 @@ import com.zanxiang.game.back.base.ServerInfo;
 import com.zanxiang.game.back.base.pojo.vo.GameBackPolicyRpcVO;
 import com.zanxiang.game.back.base.rpc.IGameBackPolicyRpc;
 import com.zanxiang.game.module.manage.pojo.dto.AgentDTO;
-import com.zanxiang.game.module.manage.pojo.enums.AccountTypeEnum;
+import com.zanxiang.game.module.base.pojo.enums.AccountTypeEnum;
 import com.zanxiang.game.module.manage.pojo.params.AgentAddParam;
 import com.zanxiang.game.module.manage.pojo.params.AgentListParam;
 import com.zanxiang.game.module.manage.pojo.vo.AgentAccountChoiceVO;
@@ -143,7 +143,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
         Set<Long> backPolicyIds = new HashSet<>();
         agentList.forEach(agent -> {
             gameIds.add(agent.getGameId());
-            if (AccountTypeEnum.TENCENT.getValue().equals(agent.getAccountType())) {
+            if (AccountTypeEnum.TENCENT_H5.getValue().equals(agent.getAccountType())
+                    || AccountTypeEnum.TENCENT_MINI_GAME.getValue().equals(agent.getAccountType())) {
                 txAccountIds.add(agent.getAccountId());
             }
             userIds.add(agent.getCreateBy());
@@ -170,7 +171,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
         return agentList.stream().map(agent -> {
             AgentVO vo = BeanUtil.copy(agent, AgentVO.class);
             vo.setGameInfo(gameMap.get(agent.getGameId()));
-            if (AccountTypeEnum.TENCENT.getValue().equals(agent.getAccountType())) {
+            if (AccountTypeEnum.TENCENT_H5.getValue().equals(agent.getAccountType())) {
                 vo.setUserActionSet(userActionSetMap.get(agent.getAccountId() + "_" + agent.getUserActionSetId()));
             }
             vo.setCreateByName(userMap.get(agent.getCreateBy()));

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

@@ -70,7 +70,7 @@ public class GamePayWayServiceImpl extends ServiceImpl<GamePayWayMapper, GamePay
                 .gameId(param.getGameId())
                 .payWayId(param.getPayWayId())
                 .payDeviceId(param.getPayDeviceId())
-                .payName(PayWayEnum.getByPayWayId(param.getPayWayId()) + PayDeviceEnum.getByPayWayId(param.getPayDeviceId()))
+                .payName(PayWayEnum.getNameByPayWayId(param.getPayWayId()) + PayDeviceEnum.getByPayWayId(param.getPayDeviceId()))
                 .remark(param.getRemark())
                 .status(StatusEnum.YES.getCode())
                 .isDelete(DeleteEnum.NO.getCode())

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

@@ -188,7 +188,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             orderVO.setGameCategoryName(gameCategoryEnum == null ? null : gameCategoryEnum.getName());
         }
         //支付渠道, 场景
-        orderVO.setPayWayName(PayWayEnum.getByPayWayId(orderVO.getPayWayId()));
+        orderVO.setPayWayName(PayWayEnum.getNameByPayWayId(orderVO.getPayWayId()));
         orderVO.setPayDeviceName(PayDeviceEnum.getByPayWayId(orderVO.getPayDeviceId()));
     }
 

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

@@ -170,7 +170,7 @@ public class PayMerchantServiceImpl extends ServiceImpl<PayMerchantMapper, PayMe
             }
         }
         //支付渠道
-        payMerchantListVO.setPayWayName(PayWayEnum.getByPayWayId(payMerchantListVO.getPayWayId()));
+        payMerchantListVO.setPayWayName(PayWayEnum.getNameByPayWayId(payMerchantListVO.getPayWayId()));
         //支付方式
         String payDeviceIds = payMerchant.getPayDeviceIds();
         if (Strings.isBlank(payDeviceIds)) {

+ 76 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameRemitLog.java

@@ -0,0 +1,76 @@
+package com.zanxiang.game.module.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : 游戏提现记录
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_remit_log")
+public class GameRemitLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 交易订单号
+     */
+    private String merchantOrderNo;
+
+    /**
+     * 金额(单位 : 分)
+     */
+    private Long amount;
+
+    /**
+     * 提现平台
+     */
+    private String payPlatform;
+
+    /**
+     * 提现账号
+     */
+    private String payAccount;
+
+    /**
+     * 提现时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameRemitLogMapper.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.GameRemitLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : ${description}
+ */
+public interface GameRemitLogMapper extends BaseMapper<GameRemitLog> {
+}

+ 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服务启动成功 003 ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 36 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/RemitController.java

@@ -0,0 +1,36 @@
+package com.zanxiang.game.module.sdk.controller;
+
+import com.zanxiang.game.module.sdk.pojo.param.GameRemitLogParam;
+import com.zanxiang.game.module.sdk.service.IGameRemitLogService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : 提现
+ */
+@Api(tags = "注册登录接口")
+@RestController
+@RequestMapping(value = "/api/remit")
+public class RemitController {
+
+    @Autowired
+    private IGameRemitLogService gameRemitLogService;
+
+    @ApiOperation(value = "游戏提现记录日志推送")
+    @PostMapping("/log/push")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> addOrUpdate(@Validated @RequestBody GameRemitLogParam param) {
+        return ResultVO.ok(gameRemitLogService.addOrUpdate(param));
+    }
+}

+ 63 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/param/GameRemitLogParam.java

@@ -0,0 +1,63 @@
+package com.zanxiang.game.module.sdk.pojo.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : 游戏提现参数
+ */
+@Data
+public class GameRemitLogParam {
+
+    /**
+     * 用户id
+     */
+    @NotNull(message = "用户id不可为空")
+    private Long userId;
+
+    /**
+     * 游戏id
+     */
+    @NotBlank(message = "游戏应用id不可为空")
+    private String appId;
+
+    /**
+     * 交易订单号
+     */
+    @NotBlank(message = "交易订单号不可为空")
+    private String merchantOrderNo;
+
+    /**
+     * 金额(单位 : 分)
+     */
+    @NotNull(message = "金额不可为空")
+    private Long amount;
+
+    /**
+     * 提现平台,  1 : 支付宝, 2 : 微信
+     */
+    @NotNull(message = "提现平台不可为空")
+    private Integer payPlatform;
+
+    /**
+     * 提现账号
+     */
+    @NotBlank(message = "提现账号不可为空")
+    private String payAccount;
+
+    /**
+     * 提现时间
+     */
+    @NotNull(message = "提现时间不可为空")
+    private Long createdTime;
+
+    /**
+     * 加密标识
+     */
+    @NotBlank(message = "加密标识不可为空")
+    private String sign;
+}

+ 21 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameRemitLogService.java

@@ -0,0 +1,21 @@
+package com.zanxiang.game.module.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameRemitLog;
+import com.zanxiang.game.module.sdk.pojo.param.GameRemitLogParam;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : 游戏提现记录
+ */
+public interface IGameRemitLogService extends IService<GameRemitLog> {
+
+    /**
+     * 添加或更新
+     *
+     * @param param 参数
+     * @return boolean
+     */
+    boolean addOrUpdate(GameRemitLogParam param);
+}

+ 21 - 21
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java

@@ -3,13 +3,13 @@ package com.zanxiang.game.module.sdk.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.zanxiang.game.back.base.ServerInfo;
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.AccountReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.OrderReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.pojo.dto.UserActiveReportRpcDTO;
-import com.zanxiang.game.back.base.oceanengine.rpc.IOceanEngineDataReportRpc;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentOrderDTO;
-import com.zanxiang.game.back.base.tencent.pojo.dto.TencentUserDTO;
-import com.zanxiang.game.back.base.tencent.rpc.IGameBackTencentRpc;
+import com.zanxiang.game.back.base.pojo.dto.TtAccountRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
+import com.zanxiang.game.back.base.rpc.ITtMiniGameBackRpc;
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
+import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
@@ -33,10 +33,10 @@ import java.util.Objects;
 public class CallBackServiceImpl implements ICallBackService {
 
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
-    private IGameBackTencentRpc gameBackTencentRpc;
+    private ITencentUserActionBackRpc gameBackTencentRpc;
 
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
-    private IOceanEngineDataReportRpc wechatMiniGameDataReportRpc;
+    private ITtMiniGameBackRpc wechatMiniGameDataReportRpc;
 
     @Autowired
     private IAgentService agentService;
@@ -86,7 +86,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 Game game = gameService.getById(user.getGameId());
                 //判断是微信小游戏
                 if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
-                    UserActiveReportRpcDTO activeReportRpcDTO = this.transform(user, agent, gameApplet, urlParamMap);
+                    TtUserActiveRpcDTO activeReportRpcDTO = this.transform(user, agent, gameApplet, urlParamMap);
                     log.error("用户注册 --> 头条回传提交, activeReportRpcDTO : {}", JsonUtil.toString(activeReportRpcDTO));
                     wechatMiniGameDataReportRpc.userActiveReport(activeReportRpcDTO);
                 }
@@ -126,9 +126,9 @@ public class CallBackServiceImpl implements ICallBackService {
                 //判断游戏类型
                 Game game = gameService.getById(platformOrderDTO.getGameId());
                 if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
-                    OrderReportRpcDTO orderReportRpcDTO = this.transform(platformOrderDTO, user.getOpenId(), agent, gameApplet);
-                    log.error("用户下单 --> 头条回传提交, orderReportRpcDTO : {}", JsonUtil.toString(orderReportRpcDTO));
-                    wechatMiniGameDataReportRpc.orderReport(orderReportRpcDTO);
+                    TtOrderRpcDTO ttOrderRpcDTO = this.transform(platformOrderDTO, user.getOpenId(), agent, gameApplet);
+                    log.error("用户下单 --> 头条回传提交, orderReportRpcDTO : {}", JsonUtil.toString(ttOrderRpcDTO));
+                    wechatMiniGameDataReportRpc.orderReport(ttOrderRpcDTO);
                 }
             }
         } catch (Exception e) {
@@ -148,17 +148,17 @@ public class CallBackServiceImpl implements ICallBackService {
                 .build();
     }
 
-    private UserActiveReportRpcDTO transform(User user, Agent agent, GameApplet gameApplet, Map<String, String> urlParamMap) {
-        AccountReportRpcDTO accountReportRpcDTO = AccountReportRpcDTO.builder()
+    private TtUserActiveRpcDTO transform(User user, Agent agent, GameApplet gameApplet, Map<String, String> urlParamMap) {
+        TtAccountRpcDTO ttAccountRpcDTO = TtAccountRpcDTO.builder()
                 .accountId(agent.getAccountId())
                 .reportToken(agent.getReportToken())
                 .reportUrl(agent.getReportUrl())
                 .build();
-        return UserActiveReportRpcDTO.builder()
+        return TtUserActiveRpcDTO.builder()
                 .gameId(user.getGameId())
                 .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
                 .wechatOpenId(user.getOpenId())
-                .accountReport(accountReportRpcDTO)
+                .accountReport(ttAccountRpcDTO)
                 .agentKey(agent.getAgentKey())
                 .activeTime(user.getCreateTime())
                 .clueToken(urlParamMap.get("clue_token"))
@@ -187,15 +187,15 @@ public class CallBackServiceImpl implements ICallBackService {
                 .build();
     }
 
-    private OrderReportRpcDTO transform(PlatformOrderDTO platformOrderDTO, String openId, Agent agent, GameApplet gameApplet) {
-        AccountReportRpcDTO accountReportRpcDTO = AccountReportRpcDTO.builder()
+    private TtOrderRpcDTO transform(PlatformOrderDTO platformOrderDTO, String openId, Agent agent, GameApplet gameApplet) {
+        TtAccountRpcDTO ttAccountRpcDTO = TtAccountRpcDTO.builder()
                 .accountId(agent.getAccountId())
                 .reportToken(agent.getReportToken())
                 .reportUrl(agent.getReportUrl())
                 .build();
-        return OrderReportRpcDTO.builder()
+        return TtOrderRpcDTO.builder()
                 .gameId(platformOrderDTO.getGameId())
-                .accountReport(accountReportRpcDTO)
+                .accountReport(ttAccountRpcDTO)
                 .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
                 .wechatOpenId(openId)
                 .orderId(platformOrderDTO.getOrderId())

+ 88 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameRemitLogServiceImpl.java

@@ -0,0 +1,88 @@
+package com.zanxiang.game.module.sdk.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.base.pojo.enums.PayWayEnum;
+import com.zanxiang.game.module.mybatis.entity.GameExt;
+import com.zanxiang.game.module.mybatis.entity.GameRemitLog;
+import com.zanxiang.game.module.mybatis.mapper.GameRemitLogMapper;
+import com.zanxiang.game.module.sdk.pojo.param.GameRemitLogParam;
+import com.zanxiang.game.module.sdk.service.IGameExtService;
+import com.zanxiang.game.module.sdk.service.IGameRemitLogService;
+import com.zanxiang.game.module.sdk.util.SignUtil;
+import com.zanxiang.module.util.DateUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-07-17
+ * @description : 游戏提现记录
+ */
+@Slf4j
+@Service
+public class GameRemitLogServiceImpl extends ServiceImpl<GameRemitLogMapper, GameRemitLog> implements IGameRemitLogService {
+
+    @Autowired
+    private IGameExtService gameExtService;
+
+    @Override
+    public boolean addOrUpdate(GameRemitLogParam param) {
+        GameExt gameExt = gameExtService.getByGameAppId(param.getAppId());
+        StringBuilder sb = new StringBuilder();
+        sb.append("payKey=").append(gameExt.getPayKey());
+        sb.append("&appId=").append(param.getAppId());
+        sb.append("&userId=").append(param.getUserId());
+        sb.append("&merchantOrderNo=").append(param.getMerchantOrderNo());
+        sb.append("&createdTime=").append(param.getCreatedTime());
+
+        log.error("加密签名字符串, str : {}", sb.toString());
+
+        String mySign;
+        try {
+            mySign = SignUtil.MD5(sb.toString());
+        } catch (Exception e) {
+            log.error("md5工具类加密异常, str : {}, e : {}", sb.toString(), e.getMessage());
+            throw new BaseException("MD5加密异常");
+        }
+        //签名错误
+        if (!Objects.equals(mySign, param.getSign())) {
+            log.error("游戏提现签名验证失败, mySign : {}, sign : {}", mySign, param.getSign());
+            throw new BaseException("签名验证失败");
+        }
+        GameRemitLog gameRemitLog = super.getOne(new LambdaQueryWrapper<GameRemitLog>()
+                .eq(GameRemitLog::getMerchantOrderNo, param.getMerchantOrderNo()));
+        if (gameRemitLog == null) {
+            gameRemitLog = this.transform(param, gameExt.getGameId());
+        } else {
+            gameRemitLog.setUserId(param.getUserId());
+            gameRemitLog.setGameId(gameExt.getGameId());
+            gameRemitLog.setAmount(param.getAmount());
+            gameRemitLog.setPayPlatform(PayWayEnum.getKeyByPayWayId(param.getPayPlatform()));
+            gameRemitLog.setPayAccount(param.getPayAccount());
+            gameRemitLog.setCreatedTime(DateUtil.milliToLocalDateTime(param.getCreatedTime()));
+            gameRemitLog.setUpdateTime(LocalDateTime.now());
+        }
+        return super.saveOrUpdate(gameRemitLog);
+    }
+
+    private GameRemitLog transform(GameRemitLogParam param, Long gameId) {
+        return GameRemitLog.builder()
+                .userId(param.getUserId())
+                .gameId(gameId)
+                .merchantOrderNo(param.getMerchantOrderNo())
+                .amount(param.getAmount())
+                .payPlatform(PayWayEnum.getKeyByPayWayId(param.getPayPlatform()))
+                .payAccount(param.getPayAccount())
+                .createdTime(DateUtil.milliToLocalDateTime(param.getCreatedTime()))
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+    }
+
+}

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

@@ -59,7 +59,7 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         //查询登录签名
         GameExt gameExt = gameExtService.getByGameAppId(appId);
         if (gameExt == null || Strings.isBlank(gameExt.getLoginKey())) {
-            log.error("token验证失败 , 游戏拓展信息不存在!");
+            log.error("token验证失败 , 游戏拓展信息不存在, appId : {}, userId : {}", appId, userId);
             return ResultVO.fail(TokenCheckEnum.PARAM_LACK.getMsg());
         }
         //查询token是否存在
@@ -68,7 +68,7 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
                 .eq(UserToken::getUserId, userId));
         //判断token是否存在, 并且没有过期
         if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
-            log.error("token验证失败 , token不存在或者已经失效!");
+            log.error("token验证失败 , token不存在或者已经失效, appId : {}, userId : {}, token : {}", appId, userId, token);
             return ResultVO.fail(TokenCheckEnum.SIGN_ERROR.getMsg());
         }
         //登录密钥

+ 1 - 1
game-platform/game-platform-serve/src/main/java/com/zanxiang/game/platform/serve/GamePlatformApplication.java

@@ -23,7 +23,7 @@ public class GamePlatformApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(GamePlatformApplication.class, args);
-        System.out.println("游戏第三方平台数据服务启动成功--pro ( ´・・)ノ(._.`) \n" +
+        System.out.println("游戏第三方平台数据服务启动成功 <dubbo升级3.0> ( ´・・)ノ(._.`) \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 1 - 1
pom.xml

@@ -13,7 +13,7 @@
     <parent>
         <groupId>com.zanxiang</groupId>
         <artifactId>microservices-parent</artifactId>
-        <version>0.0.4-SNAPSHOT</version>
+        <version>0.0.5-SNAPSHOT</version>
         <relativePath/>
     </parent>