Procházet zdrojové kódy

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

bilingfeng před 9 měsíci
rodič
revize
5eaeb2bcc6
42 změnil soubory, kde provedl 2760 přidání a 415 odebrání
  1. 109 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentOrderAppRpcDTO.java
  2. 80 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppRpcDTO.java
  3. 78 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserAppRpcDTO.java
  4. 58 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppOrderBackQueryRpcDTO.java
  5. 57 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppRoleRegisterBackQueryRpcDTO.java
  6. 54 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppUserBackQueryRpcDTO.java
  7. 88 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderAppRpcDTO.java
  8. 73 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterAppRpcDTO.java
  9. 69 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtUserActiveAppRpcDTO.java
  10. 21 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentAppBackRpc.java
  11. 43 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtAppBackRpc.java
  12. 6 0
      game-back/game-back-serve/pom.xml
  13. 27 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/KafkaConfig.java
  14. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/NacosDynamicParamConfig.java
  15. 30 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/OceanengineCallbackApi.java
  16. 29 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/api/TencentCallbackApi.java
  17. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppCallbackMapper.java
  18. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentAppCallbackMapper.java
  19. 218 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppCallbackDTO.java
  20. 185 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentAppCallbackDTO.java
  21. 239 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppCallback.java
  22. 204 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppCallback.java
  23. 39 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppBackRpcImpl.java
  24. 65 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java
  25. 10 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackService.java
  26. 10 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppCallbackService.java
  27. 44 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackServiceImpl.java
  28. 44 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppCallbackServiceImpl.java
  29. 53 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/task/CallbackClearTask.java
  30. 12 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleRechargeRankingDTO.java
  31. 26 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalTotalVO.java
  32. 26 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalVO.java
  33. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataDayTotalVO.java
  34. 8 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataDayVO.java
  35. 9 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataTotalSumVO.java
  36. 10 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataTotalVO.java
  37. 680 399
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  38. 8 8
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OrderCostMonitorAlarmBySmsServiceImpl.java
  39. 17 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PitcherDataServiceImpl.java
  40. 5 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java
  41. 2 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/task/OrderCostMonitorAlarmTask.java
  42. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GamePolicyConfigListVO.java

+ 109 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentOrderAppRpcDTO.java

@@ -0,0 +1,109 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TencentOrderAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    private LocalDateTime subscribeTime;
+
+    /**
+     * 充值金额(分)
+     */
+    private Long rechargeMoney;
+
+    /**
+     * 充值时间
+     */
+    private LocalDateTime rechargeTime;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 渠道号
+     */
+    private String channel;
+
+    /**
+     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
+     */
+    private Integer orderStatus;
+
+    /**
+     * 支付时间
+     */
+    private LocalDateTime payTime;
+
+    private String roleId;
+
+    private String roleName;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 80 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppRpcDTO.java

@@ -0,0 +1,80 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TencentRoleRegisterAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * 渠道号
+     */
+    private String channel;
+
+    private String roleId;
+
+    private String roleName;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 78 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserAppRpcDTO.java

@@ -0,0 +1,78 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TencentUserAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * 关注时间
+     */
+    private LocalDateTime subscribeTime;
+
+    /**
+     * 渠道号
+     */
+    private String channel;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 58 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppOrderBackQueryRpcDTO.java

@@ -0,0 +1,58 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 创角是否回传
+ */
+@Data
+public class TtAppOrderBackQueryRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 订单编号
+     */
+    private String orderId;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 57 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppRoleRegisterBackQueryRpcDTO.java

@@ -0,0 +1,57 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 创角是否回传
+ */
+@Data
+public class TtAppRoleRegisterBackQueryRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+
+    private String roleId;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 54 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppUserBackQueryRpcDTO.java

@@ -0,0 +1,54 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 创角是否回传
+ */
+@Data
+public class TtAppUserBackQueryRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 88 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderAppRpcDTO.java

@@ -0,0 +1,88 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TtOrderAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 订单编号
+     */
+    private String orderId;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 回传策略 id
+     */
+    private Long backPolicyId;
+    /**
+     * 订单金额(分)
+     */
+    private Long rechargeMoney;
+    /**
+     * 支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消
+     */
+    private Integer orderStatus;
+
+    private LocalDateTime regTime;
+    /**
+     * 下单时间
+     */
+    private LocalDateTime createTime;
+    /**
+     * 支付时间
+     */
+    private LocalDateTime payTime;
+
+    private String roleId;
+
+    private String roleName;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 73 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterAppRpcDTO.java

@@ -0,0 +1,73 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TtRoleRegisterAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+
+
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+
+    private String roleId;
+
+    private String roleName;
+    /**
+     * 激活/注册时间
+     */
+    private LocalDateTime registerTime;
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 69 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtUserActiveAppRpcDTO.java

@@ -0,0 +1,69 @@
+package com.zanxiang.game.back.base.pojo.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TtUserActiveAppRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 激活/注册时间
+     */
+    private LocalDateTime activeTime;
+
+    /**
+     * 回传策略 id
+     */
+    private Long backPolicyId;
+
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+}

+ 21 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentAppBackRpc.java

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

+ 43 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtAppBackRpc.java

@@ -0,0 +1,43 @@
+package com.zanxiang.game.back.base.rpc;
+
+import com.zanxiang.game.back.base.pojo.dto.*;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * 微信小游戏头条上报
+ * 参考文档:https://bytedance.feishu.cn/docx/doxcnsCqXkvxoAg36GDzkRRRuAq
+ */
+public interface ITtAppBackRpc {
+
+    /**
+     * 用户激活、注册等上报
+     */
+    ResultVO<Boolean> userActiveReport(TtUserActiveAppRpcDTO dto);
+
+    /**
+     * 用户下单、支付上报
+     */
+    ResultVO<Boolean> orderReport(TtOrderAppRpcDTO dto);
+
+    /**
+     * 创角上报
+     */
+    ResultVO<Boolean> roleRegisterReport(TtRoleRegisterAppRpcDTO dto);
+
+
+
+    /**
+     * 用户是否回传
+     */
+    ResultVO<Boolean> userBackQuery(TtAppUserBackQueryRpcDTO dto);
+
+    /**
+     * 订单是否回传
+     */
+    ResultVO<Boolean> orderBackQuery(TtAppOrderBackQueryRpcDTO dto);
+
+    /**
+     * 创角是否回传
+     */
+    ResultVO<Boolean> roleRegisterBackQuery(TtAppRoleRegisterBackQueryRpcDTO dto);
+}

+ 6 - 0
game-back/game-back-serve/pom.xml

@@ -70,6 +70,12 @@
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-client</artifactId>
         </dependency>
+        <!-- kafka -->
+        <dependency>
+            <groupId>org.apache.kafka</groupId>
+            <artifactId>kafka-clients</artifactId>
+            <version>2.2.1</version>
+        </dependency>
         <dependency>
             <groupId>com.zanxiang.erp</groupId>
             <artifactId>erp-security</artifactId>

+ 27 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/KafkaConfig.java

@@ -0,0 +1,27 @@
+package com.zanxiang.game.back.serve.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.common.serialization.StringSerializer;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+@Slf4j
+@Configuration
+public class KafkaConfig {
+    @Value("${spring.kafka.bootstrap-servers}")
+    private String kafkaSevers;
+
+    @Bean
+    public KafkaProducer<String, String> gameKafkaProducer() {
+        Properties props = new Properties();
+        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaSevers);
+        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
+        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
+        return new KafkaProducer<>(props);
+    }
+}

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/NacosDynamicParamConfig.java

@@ -9,4 +9,7 @@ import org.springframework.stereotype.Component;
 @Component
 @RefreshScope
 public class NacosDynamicParamConfig {
+
+    @Value("${nacos.dynamic.callbackClearDay:15}")
+    private Integer callbackClearDay;
 }

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

@@ -0,0 +1,30 @@
+package com.zanxiang.game.back.serve.controller.api;
+
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackService;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 头条监测链接
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/oceanengineCallback")
+public class OceanengineCallbackApi {
+
+    @Autowired
+    private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
+
+    // https://xxxx.xxx.com?promotionid=__PROMOTION_ID__&mid1=__MID1__&idfa=__IDFA__&mac=__MAC__&os=__OS__&TIMESTAMP=__TS__&callback=__CALLBACK_PARAM__
+    @GetMapping("/callback")
+    public ResultVO<Boolean> callback(GameOceanengineAppCallbackDTO dto) {
+        log.info("头条监测链接:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(gameOceanengineAppCallbackService.callback(dto));
+    }
+}

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

@@ -0,0 +1,29 @@
+package com.zanxiang.game.back.serve.controller.api;
+
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentAppCallbackDTO;
+import com.zanxiang.game.back.serve.service.IGameTencentAppCallbackService;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 腾讯监测链接
+ */
+@Slf4j
+@RestController
+@RequestMapping("/api/tencentCallback")
+public class TencentCallbackApi {
+    @Autowired
+    private IGameTencentAppCallbackService gameTencentAppCallbackService;
+
+    // https://www.example.com/click/?click_id=__CLICK_ID__&click_time=__CLICK_TIME__&adgroup_id=__ADGROUP_ID__&ad_platform_type=__AD_PLATFORM_TYPE__&ad_type=__AD_TYPE__&account_id=__ACCOUNT_ID__&agency_id=__AGENCY_ID__&click_sku_id=__CLICK_SKU_ID__&billing_event=__BILLING_EVENT__&device_os_type=__DEVICE_OS_TYPE__&process_time=__PROCESS_TIME__&promoted_object_type=__PROMOTED_OBJECT_TYPE__&request_id=__REQUEST_ID__&callback=__CALLBACK__&adgroup_name=__ADGROUP_NAME__&dynamic_creative_id=__DYNAMIC_CREATIVE_ID__&dynamic_creative_name=__DYNAMIC_CREATIVE_NAME__&creative_components_info=__CREATIVE_COMPONENTS_INFO__&element_info=__ELEMENT_INFO__&marketing_goal=__MARKETING_GOAL__&marketing_sub_goal=__MARKETING_SUB_GOAL__&marketing_target_id=__MARKETING_TARGET_ID__&marketing_carrier_id=__MARKETING_CARRIER_ID__&marketing_sub_carrier_id=__MARKETING_SUB_CARRIER_ID__&marketing_asset_id=__MARKETING_ASSET_ID__&material_package_id=__MATERIAL_PACKAGE_ID__&hash_android_id=__HASH_ANDROID_ID__&hash_oaid=__HASH_OAID__&muid=__MUID__
+    @GetMapping("/callback")
+    public ResultVO<Boolean> callback(GameTencentAppCallbackDTO dto) {
+        log.info("腾讯监测链接:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(gameTencentAppCallbackService.callback(dto));
+    }
+}

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineAppCallbackMapper.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.GameOceanengineAppCallback;
+
+public interface GameOceanengineAppCallbackMapper extends BaseMapper<GameOceanengineAppCallback> {
+}

+ 7 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentAppCallbackMapper.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.GameTencentAppCallback;
+
+public interface GameTencentAppCallbackMapper extends BaseMapper<GameTencentAppCallback> {
+}

+ 218 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppCallbackDTO.java

@@ -0,0 +1,218 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 头条游戏 APP 监测链接回传数据(文档:https://open.oceanengine.com/labels/7/docs/1696710655781900)
+ * </p>
+ *
+ */
+@Data
+public class GameOceanengineAppCallbackDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 巨量广告体验版中特有的宏参,代表巨量广告体验版的广告ID, ex: ID: 7074140945750507528, 宏: PROMOTION_ID
+     */
+    private Long promotionId;
+
+    /**
+     * 巨量广告体验版中特有的宏参,代表巨量广告体验版的项目ID, ex: ID: 7074140945750507528, 宏: PROJECT_ID
+     */
+    private Long projectId;
+
+    /**
+     * 针对巨量广告体验版,图片素材宏参数(下发原始素材id), 宏: MID1
+     */
+    private String mid1;
+
+    /**
+     * 针对巨量广告体验版,标题素材宏参数(下发原始素材id), 宏: MID2
+     */
+    private String mid2;
+
+    /**
+     * 针对巨量广告体验版,视频素材宏参数(下发原始素材id), 宏: MID3
+     */
+    private String mid3;
+
+    /**
+     * 针对巨量广告体验版,搭配试玩素材宏参数(下发原始素材id), 宏: MID4
+     */
+    private String mid4;
+
+    /**
+     * 针对巨量广告体验版,落地页素材宏参数(下发原始素材id), 宏: MID5
+     */
+    private String mid5;
+
+    /**
+     * 针对巨量广告体验版,安卓下载详情页素材宏参数(下发原始素材id), 宏: MID6
+     */
+    private String mid6;
+
+    /**
+     * 广告计划id, ex: 1645988237525045, 宏: AID
+     */
+    private Long aid;
+
+    /**
+     * 广告创意 id, ex: 1650703686054530, 宏: CID
+     */
+    private Long cid;
+
+    /**
+     * 广告组 id, ex: 1651688272934434, 宏: CAMPAIGN_ID
+     */
+    private Long campaignId;
+
+    /**
+     * 创意样式, 2=小图模式、3=大图模式、4=组图模式、5=视频, 宏: CTYPE
+     */
+    private Integer ctype;
+
+    /**
+     * 广告主id, ex: 1631857582073864, 宏: ADVERTISER_ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 广告投放位置, 今日头条:1-10000,80000-110001、西瓜视频:10001-10099、火山小视频:30001-30099、抖音:40001-40099、番茄小说:26001-26099、穿山甲开屏广告:800000000、穿山甲网盟非开屏广告:900000000、通投广告位:33013、搜索:38016, 宏: CSITE
+     */
+    private Integer csite;
+
+    /**
+     * 转化id, ex: 1681681272671401, 宏: CONVERT_ID
+     */
+    private Long convertId;
+
+    /**
+     * 请求下发的id, ex: 20191202180607010026077068090BA60A, 宏: REQUEST_ID
+     */
+    private String requestId;
+
+    /**
+     * 请求下发的id&创意id的md5,16位, ex: b2f97be5b363764d, 宏: TRACK_ID
+     */
+    private String trackId;
+
+    /**
+     * 这次请求的语言, ex: zh, 宏: SL
+     */
+    private String sl;
+
+    /**
+     * 安卓的设备 ID 的 md5 摘要,32位, 假设原始的 imei 是 868823031739689我们最终发送的是 imei 的 md5 摘要:0c2bd03c39f19845bf54ea0abafae70e,会存在部分无法获取imei的情况,则imei会回传空字符串或者0的md5摘要, 宏: IMEI
+     */
+    private String imei;
+
+    /**
+     * IOS 6+的设备id字段,32位, ex: 4FCFEFA1-096D-4176-B352-1870ED6DB777注意,一些例外00000000-0000-0000-0000-000000000000, 如果用户关闭里读取idfa的权限,会导致idfa全部是0, 宏: IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS 6+的设备id的md5摘要,32位, ex: 09c593c62a6074ae5f859e97a222c0e8,注意,用户关闭读取idfa权限,0值也会进行MD5加密, 宏: IDFA_MD5
+     */
+    private String idfaMd5;
+
+    /**
+     * 安卓id原值的md5,32位, ex: androidId的原值是: 7b5ca2d57178d2f1我们进行md5摘要,最终结果是:873541edf36da9170af47d5b69e82193, 宏: ANDROIDID
+     */
+    private String androidid;
+
+    /**
+     * Android Q及更高版本的设备号,32位, ex: 97e7ef3f-e5f2-d0b8-ccfc-f79bbeaf4841注意,一些例外如果无法获取oaid,oaid会传空字符串, 宏: OAID
+     */
+    private String oaid;
+
+    /**
+     * Android Q及更高版本的设备号的md5摘要,32位, ex: 87f8274c36eb73fabcbf143a10eca6a4,会存在部分无法获取oaid的情况,则该字段会回传空字符串, 宏: OAID_MD5
+     */
+    private String oaidMd5;
+
+    /**
+     * 操作系统平台, 安卓:0、IOS:1、其它:3, 宏: OS
+     */
+    private Integer os;
+
+    /**
+     * 移动设备mac地址,转换成大写字母,去掉“:”,并且取md5摘要后的结果, 假设原始的mac地址是34:d7:12:9b:3a:89去掉“:”后变成 34d7129b3a89变成大写字母34D7129B3A89取MD5摘要,最后变成如下结果:df97bc5021e14256e141b2f036df5a3c, 宏: MAC
+     */
+    private String mac;
+
+    /**
+     * 移动设备 mac 地址,转换成大写字母,并且取md5摘要后的结果,32位, 假设原始的mac地址是 34:d7:12:9b:3a:89变成大写字母: 34:D7:12:9B:3A:89进行MD5摘要,最后变成如下结果:4d0433eb614f5d5ad409a65395426cbe, 宏: MAC1
+     */
+    private String mac1;
+
+    /**
+     * 优先使用上报请求的对端 IP 地址。如果该IP为 IPv6, 则使用客户端获取的 client_ipv4 地址, ex: 61.168.146.195或为空, 宏: IPV4
+     */
+    private String ipv4;
+
+    /**
+     * 优先使用上报请求的对端 IP 地址。如果该IP为 IPv4, 则使用客户端获取的 client_ipv6 地址, ex: 240e:498:1c90:9d00:5513:b9c9:650a:d9d2或为空, 宏: IPV6
+     */
+    private String ipv6;
+
+    /**
+     * [下发逻辑修改 - 0727生效]正常情况下,全量下发IPv4地址。极少数情况如IPV4无法取数,则下发 IPv6, ex: 61.158.146.195或240e:398:1c90:9d00:5513:b9c9:650a:d9d2, 宏: IP
+     */
+    private String ip;
+
+    /**
+     * 用户代理(User Agent),一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。经过url encode, ex: News+7.4.5+rv%3A7.4.5.23%5C%28iPhone%3B+iOS+12.4.1%3B+zh_CN%5C%29Cronet, 宏: UA
+     */
+    private String ua;
+
+    /**
+     * 位置信息,包含三部分:latitude(纬度),longitude(经度)以及precise(确切信息,精度)十进制保留1位小数,西经南纬保留负数,用字母 x 分 割纬度与精度 (先纬后经,最后精度), ex: 35.7x122.4x100.0, 宏: GEO
+     */
+    private String geo;
+
+    /**
+     * 客户端发生广告点击事件的时间,以毫秒为单位时间戳, ex: 1575194434000, 宏: TS
+     */
+    private Long ts;
+
+    /**
+     * 一些跟广告信息相关的回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到, ex: EJiw267wvfQCGKf2g74ZIPD89-vIATAMOAFCIjIwMTkxMTI3MTQxMTEzMDEwMDI2MDc3MjE1MTUwNTczNTBIAQ==, 宏: CALLBACK_PARAM
+     */
+    private String callbackParam;
+
+    /**
+     * 直接把调用事件回传接口的url生成出来,广告主可以直接使用, ex: https://ad.toutiao.com/track/activate/?callback=EJiw267wvfQCGKf2g74ZIPD89-vIATAMOAFCIjIwMTkxMTI3MTQxMTEzMDEwMDI2MDc3MjE1MTUwNTczNTBIAQ==&os=0&muid=db94e6a60a9c6661e3e03a7d301c25b6, 宏: CALLBACK_URL
+     */
+    private String callbackUrl;
+
+    /**
+     * 手机型号, 包含多种格式, ex: iPhone12,2 (urlencode之后为iPhone12%2c2),iPhone X (urlencode之后为iPhone+X),SM-A750GN (urlencode之后为SM-A750GN), 宏: MODEL
+     */
+    private String model;
+
+    /**
+     * 对外广告位编码, ex: 2045891290, 宏: UNION_SITE
+     */
+    private String unionSite;
+
+    /**
+     * 中国广告协会互联网广告标识,包含最新两个版本的CAID和版本号,url encode之后的json字符串。(【CAID】和【CAID1、CAID2】的信息一致,使用一种即可;建议使用【CAID】,参数中包含多个信息,后续维护成本低), ex: %5B%7B%22version%22%3A%2220220111%22%2C%22caid%22%3A%22912ec803b2ce49e4a541068d495ab570%22%7D%2C%7B%22version%22%3A%2220211207%22%2C%22caid%22%3A%22e332a76c29654fcb7f6e6b31ced090c7%22%7D%5D, 宏: CAID
+     */
+    private String caid;
+
+    /**
+     * 商品id,仅支持站内(不支持穿山甲), 宏: PRODUCTID
+     */
+    private String productid;
+
+    /**
+     * 商品id,同时支持站内和穿山甲, 宏: OUTERID
+     */
+    private String outerid;
+
+
+}

+ 185 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentAppCallbackDTO.java

@@ -0,0 +1,185 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 腾讯游戏 APP 监测链接回传数据(文档:https://datanexus.qq.com/doc/develop/guider/interface/conversion/ad_track_click#5-%E5%AD%97%E6%AE%B5%E5%88%97%E8%A1%A8)
+ * </p>
+ *
+ * @author wcc
+ * @since 2024-06-27
+ */
+@Data
+public class GameTencentAppCallbackDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 点击id, ex: 24oi6xq2aaakvagnqu7a, 宏: __CLICK_ID__
+     */
+    private String clickId;
+
+    /**
+     * 点击时间, ex: 1586437362, 宏: __CLICK_TIME__
+     */
+    private Long clickTime;
+
+    /**
+     * 曝光时间, ex: 1586437361, ex: , 宏: __IMPRESSION_TIME__
+     */
+    private Long impressionTime;
+
+    /**
+     * 广告组id(实际为广告id), ex: 228691429, ex: , 宏: __ADGROUP_ID__
+     */
+    private Long adgroupId;
+
+    /**
+     * 创意 ID, ex: 654321, 宏: __DYNAMIC_CREATIVE_ID__
+     */
+    private Long dynamicCreativeId;
+
+    /**
+     * 营销资产ID, ex: 12345, 宏: __MARKETING_ASSET_ID__
+     */
+    private Long marketingAssetId;
+
+    /**
+     * 素材标签ID, 宏: __MATERIAL_PACKAGE_ID__
+     */
+    private String materialPackageId;
+
+    /**
+     * 广告投放平台, 1:GDT entrance、3:京东直投、5:经 wechat mp 投放的广告、6:京东运营、8:QQ 公众账号平台、9:移动联盟 SSP、10:58 运营、11:58 商户、12:易车运营、13:易车商户、14:融 360 运营、15:融 360 商户、16:点评运营、17:点评商户、18:来自 OMG 的广告主、19:京东外单, 宏: __AD_PLATFORM_TYPE__
+     */
+    private Integer adPlatformType;
+
+    /**
+     * 广告主id, ex: 9471147, 宏: __ACCOUNT_ID__
+     */
+    private Long accountId;
+
+    /**
+     * 代理商id, ex: 1050262, 宏: __AGENCY_ID__
+     */
+    private Long agencyId;
+
+    /**
+     * 点击sku, ex: 478c4a93a054f7c9087b4ecb1f03f8a1, 宏: __CLICK_SKU_ID__
+     */
+    private String clickSkuId;
+
+    /**
+     * 设备类型, ex: ios、android, 宏: __DEVICE_OS_TYPE__
+     */
+    private String deviceOsType;
+
+    /**
+     * 请求时间, ex: 1586437335, 宏: __PROCESS_TIME__
+     */
+    private Long processTime;
+
+    /**
+     * 应用id, ex: 1101072624、wx69618ae091cf2c76, 宏: __PROMOTED_OBJECT_ID__
+     */
+    private String promotedObjectId;
+
+    /**
+     * 请求id, ex: vqp7xdombqonw, 宏: __REQUEST_ID__
+     */
+    private String requestId;
+
+    /**
+     * 曝光id, ex: xkrx5et47h7g401, 宏: __IMPRESSION_ID__
+     */
+    private String impressionId;
+
+    /**
+     * 设备id(imei或idfa的加密值),对 IMEI 设备号转成小写,再进行md5编码,再小写,32位、对 IDFA 设备号保持大写,再进行 md5 编码,再小写,32位, 宏: __MUID__
+     */
+    private String muid;
+
+    /**
+     * 安卓id做md5加密后小写, ex: 797745b011e3286de9e1a1c59ba72c97, 宏: __HASH_ANDROID_ID__
+     */
+    private String hashAndroidId;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV4地址, ex: 183.226.102.120, 宏: __IP__
+     */
+    private String ip;
+
+    /**
+     * 用户代理(user_agent), ex: Dalvik%2F2.1.0+%28Linux%3B+U%3B+Android+8.0.0%3B+PIC-AL00+Build%2FHUAWEIPIC-AL00%29, 宏: __USER_AGENT__
+     */
+    private String userAgent;
+
+    /**
+     * 情况1:使用 DataNexus 配置,并与广告直接绑定(ex: 空值)、情况2:新版转化归因中的监测链接信息(使用 DataNexus 或直接填写监测链接)直接提供上报信息回传接口的 url,示例为url encode 编码原值,广告主需要 decode 作为 post 请求url回传至腾讯广告(ex: http%3A%2F%2Ftracking.e.qq.com%2Fconv%3Fcb%3DxXx%252BxXx%253D%26conv_id%3D123)、情况3:使用投放管理平台 - 工具(ex: http://tracking.e.qq.com/conv?cb=%s&&%s&&%s&&%s 其中%s代表的参数分别为 productId、productType、advertiserId、clickId), 宏: __CALLBACK__
+     */
+    private String callback;
+
+    /**
+     * 联盟广告位id, ex: 8144201, 宏: __ENCRYPTED_POSITION_ID__
+     */
+    private String encryptedPositionId;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV6地址, ex: 2409%3A8a55%3A4cc0%3A4050%3A2507%3A4922%3Abbe0%3A524b, 宏: __IPV6__
+     */
+    private String ipv6;
+
+    /**
+     * Android Q 及更高版本的设备号,64位及以下,取原值后做md5加密, ex: 9d271e4d04de7e4b0b4f1df20e79ce64, 宏: __HASH_OAID__
+     */
+    private String hashOaid;
+
+    /**
+     * URL Encode后的JSON数组;其中qaid为中广协ID(即CAID),hash_qaid为CAID原值MD5加密后的结果, version为腾讯版本号,支持两个版本同时下发(即最新版和上一版),腾讯版本号与中广协版本对应关系为:腾讯 1001 = 中广协 20200901;腾讯 1003 = 中广协 20201230; 腾讯1004 = 中广协 20211207;腾讯1005=中广协 20220111;腾讯1006=中广协 20230330, 宏: __QAID_CAA__
+     */
+    private String caid;
+
+    /**
+     * 机型, ex:  PCKM00、Redmi 7、iPhone 7..., 宏: __MODEL__
+     */
+    private String model;
+
+    /**
+     * 专用于网页类小程序转化规则的点击监测下发,其它类型不支持该字段下发。每个用户针对小程序应用会产生一个安全的OpenID,只针对当前的小程序有效, ex: ozWH25VK0aodxYMZrX0Lqj9HHhrg, 宏: __WECHAT_OPEN_ID__
+     */
+    private String wechatOpenid;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV4地址MD5加密后转小写,仅在新版转化里支持配置, 宏: __IP_MD5__
+     */
+    private String ipMd5;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV6地址MD5加密后转小写,仅在新版转化里支持配置, 宏: __IPV6_MD5__
+     */
+    private String ipv6Md5;
+
+    /**
+     * 渠道包id, 只 for Android 设备生效, 宏: __CHANNEL_PACKAGE_ID__
+     */
+    private String channelPackageId;
+
+    /**
+     * 操作系统版本, 只 for iOS 和 Android 设备生效, 宏: __DEVICE_OS_VERSION__
+     */
+    private String deviceOsVersion;
+
+    /**
+     * 行为类型, LANDING_PAGE_CLICK:点击跳转按钮,RESERVATION:表单预约, 宏: __ACT_TYPE__
+     */
+    private String actType;
+
+    /**
+     * 行为时间, ex: 1586437361, 宏: __ACT_TIME__
+     */
+    private Long actTime;
+
+
+}

+ 239 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppCallback.java

@@ -0,0 +1,239 @@
+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 java.io.Serializable;
+import java.time.LocalDate;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * 头条游戏 APP 监测链接回传数据(文档:https://open.oceanengine.com/labels/7/docs/1696710655781900)
+ * </p>
+ *
+ * @author wcc
+ * @since 2024-06-27
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName(GameOceanengineAppCallback.TABLE_NAME)
+public class GameOceanengineAppCallback implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "t_game_oceanengine_app_callback";
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 时间发生日期
+     */
+    private LocalDate day;
+
+    /**
+     * 巨量广告体验版中特有的宏参,代表巨量广告体验版的广告ID, ex: ID: 7074140945750507528, 宏: PROMOTION_ID
+     */
+    private Long promotionId;
+
+    /**
+     * 巨量广告体验版中特有的宏参,代表巨量广告体验版的项目ID, ex: ID: 7074140945750507528, 宏: PROJECT_ID
+     */
+    private Long projectId;
+
+    /**
+     * 针对巨量广告体验版,图片素材宏参数(下发原始素材id), 宏: MID1
+     */
+    private String mid1;
+
+    /**
+     * 针对巨量广告体验版,标题素材宏参数(下发原始素材id), 宏: MID2
+     */
+    private String mid2;
+
+    /**
+     * 针对巨量广告体验版,视频素材宏参数(下发原始素材id), 宏: MID3
+     */
+    private String mid3;
+
+    /**
+     * 针对巨量广告体验版,搭配试玩素材宏参数(下发原始素材id), 宏: MID4
+     */
+    private String mid4;
+
+    /**
+     * 针对巨量广告体验版,落地页素材宏参数(下发原始素材id), 宏: MID5
+     */
+    private String mid5;
+
+    /**
+     * 针对巨量广告体验版,安卓下载详情页素材宏参数(下发原始素材id), 宏: MID6
+     */
+    private String mid6;
+
+    /**
+     * 广告计划id, ex: 1645988237525045, 宏: AID
+     */
+    private Long aid;
+
+    /**
+     * 广告创意 id, ex: 1650703686054530, 宏: CID
+     */
+    private Long cid;
+
+    /**
+     * 广告组 id, ex: 1651688272934434, 宏: CAMPAIGN_ID
+     */
+    private Long campaignId;
+
+    /**
+     * 创意样式, 2=小图模式、3=大图模式、4=组图模式、5=视频, 宏: CTYPE
+     */
+    private Integer ctype;
+
+    /**
+     * 广告主id, ex: 1631857582073864, 宏: ADVERTISER_ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 广告投放位置, 今日头条:1-10000,80000-110001、西瓜视频:10001-10099、火山小视频:30001-30099、抖音:40001-40099、番茄小说:26001-26099、穿山甲开屏广告:800000000、穿山甲网盟非开屏广告:900000000、通投广告位:33013、搜索:38016, 宏: CSITE
+     */
+    private Integer csite;
+
+    /**
+     * 转化id, ex: 1681681272671401, 宏: CONVERT_ID
+     */
+    private Long convertId;
+
+    /**
+     * 请求下发的id, ex: 20191202180607010026077068090BA60A, 宏: REQUEST_ID
+     */
+    private String requestId;
+
+    /**
+     * 请求下发的id&创意id的md5,16位, ex: b2f97be5b363764d, 宏: TRACK_ID
+     */
+    private String trackId;
+
+    /**
+     * 这次请求的语言, ex: zh, 宏: SL
+     */
+    private String sl;
+
+    /**
+     * 安卓的设备 ID 的 md5 摘要,32位, 假设原始的 imei 是 868823031739689我们最终发送的是 imei 的 md5 摘要:0c2bd03c39f19845bf54ea0abafae70e,会存在部分无法获取imei的情况,则imei会回传空字符串或者0的md5摘要, 宏: IMEI
+     */
+    private String imei;
+
+    /**
+     * IOS 6+的设备id字段,32位, ex: 4FCFEFA1-096D-4176-B352-1870ED6DB777注意,一些例外00000000-0000-0000-0000-000000000000, 如果用户关闭里读取idfa的权限,会导致idfa全部是0, 宏: IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS 6+的设备id的md5摘要,32位, ex: 09c593c62a6074ae5f859e97a222c0e8,注意,用户关闭读取idfa权限,0值也会进行MD5加密, 宏: IDFA_MD5
+     */
+    private String idfaMd5;
+
+    /**
+     * 安卓id原值的md5,32位, ex: androidId的原值是: 7b5ca2d57178d2f1我们进行md5摘要,最终结果是:873541edf36da9170af47d5b69e82193, 宏: ANDROIDID
+     */
+    private String androidid;
+
+    /**
+     * Android Q及更高版本的设备号,32位, ex: 97e7ef3f-e5f2-d0b8-ccfc-f79bbeaf4841注意,一些例外如果无法获取oaid,oaid会传空字符串, 宏: OAID
+     */
+    private String oaid;
+
+    /**
+     * Android Q及更高版本的设备号的md5摘要,32位, ex: 87f8274c36eb73fabcbf143a10eca6a4,会存在部分无法获取oaid的情况,则该字段会回传空字符串, 宏: OAID_MD5
+     */
+    private String oaidMd5;
+
+    /**
+     * 操作系统平台, 安卓:0、IOS:1、其它:3, 宏: OS
+     */
+    private Integer os;
+
+    /**
+     * 移动设备mac地址,转换成大写字母,去掉“:”,并且取md5摘要后的结果, 假设原始的mac地址是34:d7:12:9b:3a:89去掉“:”后变成 34d7129b3a89变成大写字母34D7129B3A89取MD5摘要,最后变成如下结果:df97bc5021e14256e141b2f036df5a3c, 宏: MAC
+     */
+    private String mac;
+
+    /**
+     * 移动设备 mac 地址,转换成大写字母,并且取md5摘要后的结果,32位, 假设原始的mac地址是 34:d7:12:9b:3a:89变成大写字母: 34:D7:12:9B:3A:89进行MD5摘要,最后变成如下结果:4d0433eb614f5d5ad409a65395426cbe, 宏: MAC1
+     */
+    private String mac1;
+
+    /**
+     * 优先使用上报请求的对端 IP 地址。如果该IP为 IPv6, 则使用客户端获取的 client_ipv4 地址, ex: 61.168.146.195或为空, 宏: IPV4
+     */
+    private String ipv4;
+
+    /**
+     * 优先使用上报请求的对端 IP 地址。如果该IP为 IPv4, 则使用客户端获取的 client_ipv6 地址, ex: 240e:498:1c90:9d00:5513:b9c9:650a:d9d2或为空, 宏: IPV6
+     */
+    private String ipv6;
+
+    /**
+     * [下发逻辑修改 - 0727生效]正常情况下,全量下发IPv4地址。极少数情况如IPV4无法取数,则下发 IPv6, ex: 61.158.146.195或240e:398:1c90:9d00:5513:b9c9:650a:d9d2, 宏: IP
+     */
+    private String ip;
+
+    /**
+     * 用户代理(User Agent),一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。经过url encode, ex: News+7.4.5+rv%3A7.4.5.23%5C%28iPhone%3B+iOS+12.4.1%3B+zh_CN%5C%29Cronet, 宏: UA
+     */
+    private String ua;
+
+    /**
+     * 位置信息,包含三部分:latitude(纬度),longitude(经度)以及precise(确切信息,精度)十进制保留1位小数,西经南纬保留负数,用字母 x 分 割纬度与精度 (先纬后经,最后精度), ex: 35.7x122.4x100.0, 宏: GEO
+     */
+    private String geo;
+
+    /**
+     * 客户端发生广告点击事件的时间,以毫秒为单位时间戳, ex: 1575194434000, 宏: TS
+     */
+    private Long ts;
+
+    /**
+     * 一些跟广告信息相关的回调参数,内容是一个加密字符串,在调用事件回传接口的时候会用到, ex: EJiw267wvfQCGKf2g74ZIPD89-vIATAMOAFCIjIwMTkxMTI3MTQxMTEzMDEwMDI2MDc3MjE1MTUwNTczNTBIAQ==, 宏: CALLBACK_PARAM
+     */
+    private String callbackParam;
+
+    /**
+     * 直接把调用事件回传接口的url生成出来,广告主可以直接使用, ex: https://ad.toutiao.com/track/activate/?callback=EJiw267wvfQCGKf2g74ZIPD89-vIATAMOAFCIjIwMTkxMTI3MTQxMTEzMDEwMDI2MDc3MjE1MTUwNTczNTBIAQ==&os=0&muid=db94e6a60a9c6661e3e03a7d301c25b6, 宏: CALLBACK_URL
+     */
+    private String callbackUrl;
+
+    /**
+     * 手机型号, 包含多种格式, ex: iPhone12,2 (urlencode之后为iPhone12%2c2),iPhone X (urlencode之后为iPhone+X),SM-A750GN (urlencode之后为SM-A750GN), 宏: MODEL
+     */
+    private String model;
+
+    /**
+     * 对外广告位编码, ex: 2045891290, 宏: UNION_SITE
+     */
+    private String unionSite;
+
+    /**
+     * 中国广告协会互联网广告标识,包含最新两个版本的CAID和版本号,url encode之后的json字符串。(【CAID】和【CAID1、CAID2】的信息一致,使用一种即可;建议使用【CAID】,参数中包含多个信息,后续维护成本低), ex: %5B%7B%22version%22%3A%2220220111%22%2C%22caid%22%3A%22912ec803b2ce49e4a541068d495ab570%22%7D%2C%7B%22version%22%3A%2220211207%22%2C%22caid%22%3A%22e332a76c29654fcb7f6e6b31ced090c7%22%7D%5D, 宏: CAID
+     */
+    private String caid;
+
+    /**
+     * 商品id,仅支持站内(不支持穿山甲), 宏: PRODUCTID
+     */
+    private String productid;
+
+    /**
+     * 商品id,同时支持站内和穿山甲, 宏: OUTERID
+     */
+    private String outerid;
+
+
+}

+ 204 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppCallback.java

@@ -0,0 +1,204 @@
+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 java.io.Serializable;
+import java.time.LocalDate;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * 腾讯游戏 APP 监测链接回传数据(文档:https://datanexus.qq.com/doc/develop/guider/interface/conversion/ad_track_click#5-%E5%AD%97%E6%AE%B5%E5%88%97%E8%A1%A8)
+ * </p>
+ *
+ * @author wcc
+ * @since 2024-06-27
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName(GameTencentAppCallback.TABLE_NAME)
+public class GameTencentAppCallback implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "t_game_tencent_app_callback";
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 时间发生日期
+     */
+    private LocalDate day;
+
+    /**
+     * 点击id, ex: 24oi6xq2aaakvagnqu7a, 宏: __CLICK_ID__
+     */
+    private String clickId;
+
+    /**
+     * 点击时间, ex: 1586437362, 宏: __CLICK_TIME__
+     */
+    private Long clickTime;
+
+    /**
+     * 曝光时间, ex: 1586437361, ex: , 宏: __IMPRESSION_TIME__
+     */
+    private Long impressionTime;
+
+    /**
+     * 广告组id(实际为广告id), ex: 228691429, ex: , 宏: __ADGROUP_ID__
+     */
+    private Long adgroupId;
+
+    /**
+     * 创意 ID, ex: 654321, 宏: __DYNAMIC_CREATIVE_ID__
+     */
+    private Long dynamicCreativeId;
+
+    /**
+     * 营销资产ID, ex: 12345, 宏: __MARKETING_ASSET_ID__
+     */
+    private Long marketingAssetId;
+
+    /**
+     * 素材标签ID, 宏: __MATERIAL_PACKAGE_ID__
+     */
+    private String materialPackageId;
+
+    /**
+     * 广告投放平台, 1:GDT entrance、3:京东直投、5:经 wechat mp 投放的广告、6:京东运营、8:QQ 公众账号平台、9:移动联盟 SSP、10:58 运营、11:58 商户、12:易车运营、13:易车商户、14:融 360 运营、15:融 360 商户、16:点评运营、17:点评商户、18:来自 OMG 的广告主、19:京东外单, 宏: __AD_PLATFORM_TYPE__
+     */
+    private Integer adPlatformType;
+
+    /**
+     * 广告主id, ex: 9471147, 宏: __ACCOUNT_ID__
+     */
+    private Long accountId;
+
+    /**
+     * 代理商id, ex: 1050262, 宏: __AGENCY_ID__
+     */
+    private Long agencyId;
+
+    /**
+     * 点击sku, ex: 478c4a93a054f7c9087b4ecb1f03f8a1, 宏: __CLICK_SKU_ID__
+     */
+    private String clickSkuId;
+
+    /**
+     * 设备类型, ex: ios、android, 宏: __DEVICE_OS_TYPE__
+     */
+    private String deviceOsType;
+
+    /**
+     * 请求时间, ex: 1586437335, 宏: __PROCESS_TIME__
+     */
+    private Long processTime;
+
+    /**
+     * 应用id, ex: 1101072624、wx69618ae091cf2c76, 宏: __PROMOTED_OBJECT_ID__
+     */
+    private String promotedObjectId;
+
+    /**
+     * 请求id, ex: vqp7xdombqonw, 宏: __REQUEST_ID__
+     */
+    private String requestId;
+
+    /**
+     * 曝光id, ex: xkrx5et47h7g401, 宏: __IMPRESSION_ID__
+     */
+    private String impressionId;
+
+    /**
+     * 设备id(imei或idfa的加密值),对 IMEI 设备号转成小写,再进行md5编码,再小写,32位、对 IDFA 设备号保持大写,再进行 md5 编码,再小写,32位, 宏: __MUID__
+     */
+    private String muid;
+
+    /**
+     * 安卓id做md5加密后小写, ex: 797745b011e3286de9e1a1c59ba72c97, 宏: __HASH_ANDROID_ID__
+     */
+    private String hashAndroidId;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV4地址, ex: 183.226.102.120, 宏: __IP__
+     */
+    private String ip;
+
+    /**
+     * 用户代理(user_agent), ex: Dalvik%2F2.1.0+%28Linux%3B+U%3B+Android+8.0.0%3B+PIC-AL00+Build%2FHUAWEIPIC-AL00%29, 宏: __USER_AGENT__
+     */
+    private String userAgent;
+
+    /**
+     * 情况1:使用 DataNexus 配置,并与广告直接绑定(ex: 空值)、情况2:新版转化归因中的监测链接信息(使用 DataNexus 或直接填写监测链接)直接提供上报信息回传接口的 url,示例为url encode 编码原值,广告主需要 decode 作为 post 请求url回传至腾讯广告(ex: http%3A%2F%2Ftracking.e.qq.com%2Fconv%3Fcb%3DxXx%252BxXx%253D%26conv_id%3D123)、情况3:使用投放管理平台 - 工具(ex: http://tracking.e.qq.com/conv?cb=%s&&%s&&%s&&%s 其中%s代表的参数分别为 productId、productType、advertiserId、clickId), 宏: __CALLBACK__
+     */
+    private String callback;
+
+    /**
+     * 联盟广告位id, ex: 8144201, 宏: __ENCRYPTED_POSITION_ID__
+     */
+    private String encryptedPositionId;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV6地址, ex: 2409%3A8a55%3A4cc0%3A4050%3A2507%3A4922%3Abbe0%3A524b, 宏: __IPV6__
+     */
+    private String ipv6;
+
+    /**
+     * Android Q 及更高版本的设备号,64位及以下,取原值后做md5加密, ex: 9d271e4d04de7e4b0b4f1df20e79ce64, 宏: __HASH_OAID__
+     */
+    private String hashOaid;
+
+    /**
+     * URL Encode后的JSON数组;其中qaid为中广协ID(即CAID),hash_qaid为CAID原值MD5加密后的结果, version为腾讯版本号,支持两个版本同时下发(即最新版和上一版),腾讯版本号与中广协版本对应关系为:腾讯 1001 = 中广协 20200901;腾讯 1003 = 中广协 20201230; 腾讯1004 = 中广协 20211207;腾讯1005=中广协 20220111;腾讯1006=中广协 20230330, 宏: __QAID_CAA__
+     */
+    private String caid;
+
+    /**
+     * 机型, ex:  PCKM00、Redmi 7、iPhone 7..., 宏: __MODEL__
+     */
+    private String model;
+
+    /**
+     * 专用于网页类小程序转化规则的点击监测下发,其它类型不支持该字段下发。每个用户针对小程序应用会产生一个安全的OpenID,只针对当前的小程序有效, ex: ozWH25VK0aodxYMZrX0Lqj9HHhrg, 宏: __WECHAT_OPEN_ID__
+     */
+    private String wechatOpenid;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV4地址MD5加密后转小写,仅在新版转化里支持配置, 宏: __IP_MD5__
+     */
+    private String ipMd5;
+
+    /**
+     * 媒体投放系统获取的用户终端的公共IPV6地址MD5加密后转小写,仅在新版转化里支持配置, 宏: __IPV6_MD5__
+     */
+    private String ipv6Md5;
+
+    /**
+     * 渠道包id, 只 for Android 设备生效, 宏: __CHANNEL_PACKAGE_ID__
+     */
+    private String channelPackageId;
+
+    /**
+     * 操作系统版本, 只 for iOS 和 Android 设备生效, 宏: __DEVICE_OS_VERSION__
+     */
+    private String deviceOsVersion;
+
+    /**
+     * 行为类型, LANDING_PAGE_CLICK:点击跳转按钮,RESERVATION:表单预约, 宏: __ACT_TYPE__
+     */
+    private String actType;
+
+    /**
+     * 行为时间, ex: 1586437361, 宏: __ACT_TIME__
+     */
+    private Long actTime;
+
+
+}

+ 39 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppBackRpcImpl.java

@@ -0,0 +1,39 @@
+package com.zanxiang.game.back.serve.rpc.impl;
+
+import com.zanxiang.game.back.base.pojo.dto.*;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
+import com.zanxiang.game.back.base.rpc.ITencentAppBackRpc;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import java.util.Objects;
+
+@Slf4j
+@DubboService
+public class TencentAppBackRpcImpl implements ITencentAppBackRpc {
+
+    @Override
+    public ResultVO<Boolean> backOrder(TencentOrderAppRpcDTO dto) {
+        if (Objects.equals(OrderStatusEnum.SUCCESS_PAY.getValue(), dto.getOrderStatus())) {
+            log.error("腾讯 APP订单回传收到:{}。", JsonUtil.toString(dto));
+        } else {
+            log.error("腾讯H5订单回传收到:{}。订单未支付,直接过滤", JsonUtil.toString(dto));
+            return ResultVO.ok(true);
+        }
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> backUser(TencentUserAppRpcDTO dto) {
+        log.error("腾讯 APP用户回传收到:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterAppRpcDTO dto) {
+        log.error("腾讯 APP创角回传收到:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(Boolean.TRUE);
+    }
+}

+ 65 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -0,0 +1,65 @@
+package com.zanxiang.game.back.serve.rpc.impl;
+
+import com.zanxiang.game.back.base.pojo.dto.*;
+import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
+import com.zanxiang.game.back.base.rpc.ITtAppBackRpc;
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Objects;
+
+@Slf4j
+@DubboService
+public class TtAppBackRpcImpl implements ITtAppBackRpc {
+
+    @Autowired
+    private IGameBackPolicyService gameBackPolicyService;
+
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+
+    @Override
+    public ResultVO<Boolean> userActiveReport(TtUserActiveAppRpcDTO dto) {
+        log.error("头条 APP用户回传收到:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> orderReport(TtOrderAppRpcDTO dto) {
+        if (Objects.equals(OrderStatusEnum.SUCCESS_PAY.getValue(), dto.getOrderStatus())) {
+            log.error("头条 APP订单回传收到:{}。", JsonUtil.toString(dto));
+        } else {
+            log.error("头条 APP订单回传收到:{}。订单未支付,直接过滤", JsonUtil.toString(dto));
+            return ResultVO.ok(true);
+        }
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> roleRegisterReport(TtRoleRegisterAppRpcDTO dto) {
+        log.error("头条 APP创角回传收到:{}", JsonUtil.toString(dto));
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> userBackQuery(TtAppUserBackQueryRpcDTO dto) {
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> orderBackQuery(TtAppOrderBackQueryRpcDTO dto) {
+        return ResultVO.ok(Boolean.TRUE);
+    }
+
+    @Override
+    public ResultVO<Boolean> roleRegisterBackQuery(TtAppRoleRegisterBackQueryRpcDTO dto) {
+        return ResultVO.ok(Boolean.TRUE);
+    }
+}

+ 10 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackService.java

@@ -0,0 +1,10 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallback;
+
+public interface IGameOceanengineAppCallbackService extends IService<GameOceanengineAppCallback> {
+
+    boolean callback(GameOceanengineAppCallbackDTO dto);
+}

+ 10 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppCallbackService.java

@@ -0,0 +1,10 @@
+package com.zanxiang.game.back.serve.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentAppCallbackDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppCallback;
+
+public interface IGameTencentAppCallbackService extends IService<GameTencentAppCallback> {
+
+    boolean callback(GameTencentAppCallbackDTO dto);
+}

+ 44 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackServiceImpl.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppCallbackMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallback;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackService;
+import com.zanxiang.module.util.DateUtil;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+
+@Slf4j
+@Service
+public class GameOceanengineAppCallbackServiceImpl extends ServiceImpl<GameOceanengineAppCallbackMapper, GameOceanengineAppCallback>
+implements IGameOceanengineAppCallbackService {
+
+    @Value("${spring.kafka.oceanengineAppCallbackTopic}")
+    private String oceanengineAppCallbackTopic;
+    @Autowired
+    private KafkaProducer<String, String> kafkaProducer;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean callback(GameOceanengineAppCallbackDTO dto) {
+        GameOceanengineAppCallback appCallback = BeanUtil.copy(dto, GameOceanengineAppCallback.class);
+        appCallback.setDay(dto.getTs() == null || dto.getTs() < 1000 ? LocalDate.now() : DateUtil.milliToLocalDateTime(dto.getTs()).toLocalDate());
+        save(appCallback);
+        try {
+            kafkaProducer.send(new ProducerRecord<>(oceanengineAppCallbackTopic, dto.getAdvertiserId().toString(), JsonUtil.toString(appCallback)));
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return true;
+    }
+}

+ 44 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppCallbackServiceImpl.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameTencentAppCallbackMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentAppCallbackDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppCallback;
+import com.zanxiang.game.back.serve.service.IGameTencentAppCallbackService;
+import com.zanxiang.module.util.DateUtil;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+
+@Slf4j
+@Service
+public class GameTencentAppCallbackServiceImpl extends ServiceImpl<GameTencentAppCallbackMapper, GameTencentAppCallback>
+implements IGameTencentAppCallbackService {
+
+    @Value("${spring.kafka.tencentAppCallbackTopic}")
+    private String tencentAppCallbackTopic;
+    @Autowired
+    private KafkaProducer<String, String> kafkaProducer;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean callback(GameTencentAppCallbackDTO dto) {
+        GameTencentAppCallback appCallback = BeanUtil.copy(dto, GameTencentAppCallback.class);
+        appCallback.setDay(dto.getClickTime() == null || dto.getClickTime() < 1000 ? LocalDate.now() : DateUtil.milliToLocalDateTime(dto.getClickTime()).toLocalDate());
+        save(appCallback);
+        try {
+            kafkaProducer.send(new ProducerRecord<>(tencentAppCallbackTopic, dto.getAccountId().toString(), JsonUtil.toString(appCallback)));
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return true;
+    }
+}

+ 53 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/task/CallbackClearTask.java

@@ -0,0 +1,53 @@
+package com.zanxiang.game.back.serve.task;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zanxiang.game.back.base.ServerInfo;
+import com.zanxiang.game.back.serve.config.NacosDynamicParamConfig;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallback;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppCallback;
+import com.zanxiang.game.back.serve.service.IGameOceanengineAppCallbackService;
+import com.zanxiang.game.back.serve.service.IGameTencentAppCallbackService;
+import com.zanxiang.module.redis.service.IDistributedLockComponent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+
+@Slf4j
+@Component
+public class CallbackClearTask {
+    private static final String CLEAR_KEY = ServerInfo.SERVER_NAME + ":CALLBACK_DATA_CLEAR";
+
+    @Autowired
+    private NacosDynamicParamConfig nacosDynamicParamConfig;
+    @Autowired
+    private IDistributedLockComponent distributedLockComponent;
+    @Autowired
+    private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
+    @Autowired
+    private IGameTencentAppCallbackService gameTencentAppCallbackService;
+
+    /**
+     * 每天凌晨 2点清理一次 15天前的监测链接数据
+     */
+    @Scheduled(cron = "0 0 2 * * ?")
+    public void execute() {
+        log.error("开始清理监测链接的日志");
+        try {
+            gameOceanengineAppCallbackService.remove(new LambdaQueryWrapper<GameOceanengineAppCallback>()
+                    .lt(GameOceanengineAppCallback::getDay, LocalDate.now().minusDays(nacosDynamicParamConfig.getCallbackClearDay()))
+            );
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        try {
+            gameTencentAppCallbackService.remove(new LambdaQueryWrapper<GameTencentAppCallback>()
+                    .lt(GameTencentAppCallback::getDay, LocalDate.now().minusDays(nacosDynamicParamConfig.getCallbackClearDay()))
+            );
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+}

+ 12 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleRechargeRankingDTO.java

@@ -271,5 +271,17 @@ public class RoleRechargeRankingDTO extends BasePage {
     @ApiModelProperty(value = "玩家渠道id")
     private List<Long> agentIds;
 
+    /**
+     * 角色最近充值时间最小值
+     */
+    @ApiModelProperty(value = "角色最近充值时间最小值")
+    private LocalDate roleLastPayTimeMin;
+    /**
+     * 角色最近充值时间最大值
+     */
+    @ApiModelProperty(value = "角色最近充值时间最大值")
+    private LocalDate roleLastPayTimeMax;
+
+
 
 }

+ 26 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalTotalVO.java

@@ -121,6 +121,32 @@ public class GameDataTotalTotalVO {
     @ApiModelProperty(value = "新用户累计充值金额(总量)")
     private BigDecimal newUserTotalAmount;
 
+    /**
+     * 新用户充值金额(支付宝金额)(自然量)
+     */
+    @ApiModelProperty(value = "支付宝金额")
+    private BigDecimal alipayAmount;
+    /**
+     * 新用户充值金额(微信金额)(自然量)
+     */
+    @ApiModelProperty(value = "微信金额")
+    private BigDecimal wxAmount;
+    /**
+     * 新用户充值金额(米大师金额)(自然量)
+     */
+    @ApiModelProperty(value = "米大师金额")
+    private BigDecimal miMasterAmount;
+
+    @ApiModelProperty(value = "支付宝新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalZfbAmount;
+
+    @ApiModelProperty(value = "微信新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalWxAmount;
+
+    @ApiModelProperty(value = "米大师新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalMdsAmount;
+
+
     /**
      * 首日Roi(总量)
      */

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

@@ -61,6 +61,32 @@ public class GameDataTotalVO {
     @ApiModelProperty(value = "新用户充值人数(总量)")
     private Long newUserAmountNum;
 
+    /**
+     * 新用户充值金额(支付宝金额)
+     */
+    @ApiModelProperty(value = "支付宝金额")
+    private BigDecimal alipayAmount;
+    /**
+     * 新用户充值金额(微信金额)
+     */
+    @ApiModelProperty(value = "微信金额")
+    private BigDecimal wxAmount;
+    /**
+     * 新用户充值金额(米大师金额)
+     */
+    @ApiModelProperty(value = "米大师金额")
+    private BigDecimal miMasterAmount;
+
+
+    @ApiModelProperty(value = "支付宝新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalZfbAmount;
+
+    @ApiModelProperty(value = "微信新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalWxAmount;
+
+    @ApiModelProperty(value = "米大师新用户累计充值金额(自然量)")
+    private BigDecimal natureNewUserTotalMdsAmount;
+
     /**
      * 新用户充值金额(总量)
      */

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataDayTotalVO.java

@@ -121,6 +121,12 @@ public class PitcherDataDayTotalVO {
     @ApiModelProperty(value = "单日付费100+人数")
     private Long hundredUserNum;
 
+    /**
+     * 7日累充500+用户数
+     */
+    @ApiModelProperty(value = "7日累充500+用户数")
+    private Long totalFiveHundredUserCount;
+
     /**
      * 买量新用户累计充值金额
      */

+ 8 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataDayVO.java

@@ -206,6 +206,12 @@ public class PitcherDataDayVO {
     @ApiModelProperty(value = "买量回收率")
     private BigDecimal buyRoi;
 
+    /**
+     * 7日累充500+用户数
+     */
+    @ApiModelProperty(value = "7日累充500+用户数")
+    private Long totalFiveHundredUserCount;
+
     /**
      * 当日回收率
      */
@@ -2154,4 +2160,6 @@ public class PitcherDataDayVO {
     @ApiModelProperty(value = "da1的用户详情")
     private FirstNewUserAgainTrendVO userDetails;
 
+
+
 }

+ 9 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataTotalSumVO.java

@@ -222,6 +222,15 @@ public class PitcherDataTotalSumVO {
     @ApiModelProperty(value = "单日付费100+成本")
     private BigDecimal hundredUserNumCost;
 
+    @ApiModelProperty(value = "支付宝新用户累计充值金额")
+    private BigDecimal newUserTotalZfbAmount;
+
+    @ApiModelProperty(value = "微信新用户累计充值金额")
+    private BigDecimal newUserTotalWxAmount;
+
+    @ApiModelProperty(value = "米大师新用户累计充值金额")
+    private BigDecimal newUserTotalMdsAmount;
+
     /**
      * 买量新用户累计充值金额
      */

+ 10 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PitcherDataTotalVO.java

@@ -233,6 +233,16 @@ public class PitcherDataTotalVO {
     @ApiModelProperty(value = "单日付费100+成本")
     private BigDecimal hundredUserNumCost;
 
+
+    @ApiModelProperty(value = "支付宝新用户累计充值金额")
+    private BigDecimal newUserTotalZfbAmount;
+
+    @ApiModelProperty(value = "微信新用户累计充值金额")
+    private BigDecimal newUserTotalWxAmount;
+
+    @ApiModelProperty(value = "米大师新用户累计充值金额")
+    private BigDecimal newUserTotalMdsAmount;
+
     /**
      * 买量新用户累计充值金额
      */

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 680 - 399
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java


+ 8 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OrderCostMonitorAlarmBySmsServiceImpl.java

@@ -46,12 +46,12 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
     private String phoneNumber;
 
     /**
-     * 10分钟扫一次,每次扫当前时间-半小时
+     * 30分钟扫一次,每次扫当前时间-1小时
      */
     @Override
     public void monitorDataStatus() {
         //获取当前时间前半小时的时间
-        LocalDateTime date = LocalDateTime.now().minusMinutes(30);
+        LocalDateTime date = LocalDateTime.now().minusMinutes(60);
         //查询订单表
         Sql orderSql = getSql(getOrderCountSql(date));
         int count = orderSql.getInt(0);
@@ -68,7 +68,7 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
     @Override
     public void monitorHeadCostStatus() {
         //获取当前时间前半小时的时间
-        LocalDateTime date = LocalDateTime.now().minusMinutes(30);
+        LocalDateTime date = LocalDateTime.now().minusMinutes(60);
         //查询头条广告表
         Sql headCostSql = getSql(getheadCostCountSql(date));
         int newHeadCostCount = headCostSql.getInt(0);
@@ -85,15 +85,15 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
                 }
             }
         }
-        //将新数据存入redis  30分钟
-        redisUtil.setCache(HEADLINE_COST_COUNT, Integer.toString(newHeadCostCount), 60 * 30);
+        //将新数据存入redis  60分钟
+        redisUtil.setCache(HEADLINE_COST_COUNT, Integer.toString(newHeadCostCount), 60 * 60);
 
     }
 
     @Override
     public void monitorTencentCostStatus() {
         //获取当前时间前半小时的时间
-        LocalDateTime date = LocalDateTime.now().minusMinutes(30);
+        LocalDateTime date = LocalDateTime.now().minusMinutes(60);
         //查询腾讯广告表
         Sql tencentCostSql = getSql(getTencentCostSqlSql(date));
         int newTencentCostCount = tencentCostSql.getInt(0);
@@ -108,8 +108,8 @@ public class OrderCostMonitorAlarmBySmsServiceImpl implements IOrderCostMonitorA
                 }
             }
         }
-        //将新数据存入redis  30分钟
-        redisUtil.setCache(TENCENT_COST_COUNT, Integer.toString(newTencentCostCount), 60 * 30);
+        //将新数据存入redis  60分钟
+        redisUtil.setCache(TENCENT_COST_COUNT, Integer.toString(newTencentCostCount), 60 * 60);
     }
 
 

+ 17 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PitcherDataServiceImpl.java

@@ -509,6 +509,8 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
         } else {
             sql = Sqls.create(pitcherDataTotalSqlForParent(criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
         }
+        // 打印SQL
+        System.out.println("Executing SQL: " + sql.getSourceSql());
         //设置自定义回显对象
         sql.setCallback(Sqls.callback.entities());
         sql.setEntity(dao.getEntity(PitcherDataTotalVO.class));
@@ -2385,7 +2387,8 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                     first_role_rate,
                     new_user_total_role_rate,
                     role_num_rate,
-                    new_user_amount_ratio
+                    new_user_amount_ratio,
+                    total_five_hundred_user_count
                 FROM 
                 """ + tableName;
     }
@@ -2876,6 +2879,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                     ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) as today_arpu,
                     ROUND(IF(SUM(amount_num) > 0 , SUM(amount) / SUM(amount_num), 0), 2) as paper_arpu,
                     SUM(hundred_user_num) as hundred_user_num,
+                    SUM(total_five_hundred_user_count) AS total_five_hundred_user_count,
                     ROUND(IF(SUM(hundred_user_num) > 0 , SUM(cost) / SUM(hundred_user_num), 0), 2) as hundred_user_num_cost,
                     ROUND(IF(SUM(cost) > 0 , SUM(da1) / SUM(cost), 0), 4) as roi1,
                     ROUND(IF(SUM(cost) > 0 , SUM(da2) / SUM(cost), 0), 4) as roi2,
@@ -3090,7 +3094,10 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                 	ROUND(IF(new_user_total_amount_num > 0, IFNULL(new_user_order_again, 0) / new_user_total_amount_num, 0), 4) as new_user_again_rate,
                 	IFNULL(role_num, 0) as role_num,
                 	ROUND(IF(register_num > 0, IFNULL(role_num, 0) / register_num, 0), 4) as role_num_rate,
-                	ROUND(IF(role_num > 0, IFNULL(cost, 0) / role_num, 0), 2) as role_num_cost
+                	ROUND(IF(role_num > 0, IFNULL(cost, 0) / role_num, 0), 2) as role_num_cost,
+                	new_user_total_zfb_amount,
+                 	new_user_total_wx_amount,
+                 	new_user_total_mds_amount
                 FROM (
                 	SELECT
                 		pitcher_id,
@@ -3145,7 +3152,10 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                             SUM(m6) / SUM(IF(DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), cost, 0)), 0), 4) as roi180,
                         ROUND(IF(SUM(IF(DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), cost, 0)) > 0 ,
                             SUM(m12) / SUM(IF(DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), cost, 0)), 0), 4) as roi1yaer,
-                    	ROUND(IF(SUM(cost) > 0 , SUM(total) / SUM(cost), 0), 4) as roi_total
+                    	ROUND(IF(SUM(cost) > 0 , SUM(total) / SUM(cost), 0), 4) as roi_total,
+                    	SUM(new_user_total_zfb_amount) AS new_user_total_zfb_amount,
+                         	SUM(new_user_total_wx_amount) AS new_user_total_wx_amount,
+                         	SUM(new_user_total_mds_amount) AS new_user_total_mds_amount
                     FROM
                     	game_ads.ads_pitcher_day
                 """ + criA +
@@ -3211,7 +3221,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                                 user_zx_pitcher_id as f_pitcher_id,
                                 COUNT(DISTINCT role_user_id) as role_num
                             FROM
-                                dw_create_role_detail
+                                game_ads.dw_create_role_detail
                             """ + criRoleNum +
                 """
                                 AND NOT user_agent_id = 0
@@ -3781,6 +3791,9 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
                     ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) as today_arpu,
                     IFNULL(SUM(hundred_user_num), 0) as hundred_user_num,
                     ROUND(IF(SUM(hundred_user_num) > 0 , SUM(cost) / SUM(hundred_user_num), 0), 2) as hundred_user_num_cost,
+                    SUM(new_user_total_zfb_amount) AS new_user_total_zfb_amount,
+                    SUM(new_user_total_wx_amount) AS new_user_total_wx_amount,
+                    SUM(new_user_total_mds_amount) AS new_user_total_mds_amount,
                 """ + pitcherDataTotalRoiSql() +
                 """
                             ROUND(IF(SUM(IF(DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), cost, 0)) > 0 ,

+ 5 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -419,6 +419,10 @@ public class RoleManageServiceImpl implements IRoleManageService {
         if (dto.getLastActiveTimeMax() != null && dto.getLastActiveTimeMin() != null) {
             criA.where().andBetween("DATE(role_active_time)", dto.getLastActiveTimeMin(), dto.getLastActiveTimeMax());
         }
+        //角色最近充值时间
+        if(dto.getRoleLastPayTimeMin() != null && dto.getRoleLastPayTimeMax() != null){
+            criA.where().andBetween("DATE(role_last_pay_time)", dto.getRoleLastPayTimeMin(), dto.getRoleLastPayTimeMax());
+        }
         return criA;
     }
 
@@ -4356,7 +4360,7 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 			a.game_id ,
                 			b.parent_game_id,
                 			b.super_game_id ,
-                			ROW_NUMBER()over(partition by a.source_system , a.role_id, b.parent_game_id order by a.role_level desc,a.combat_num desc) as num
+                			ROW_NUMBER()over(partition by a.source_system , a.role_id, b.super_game_id order by a.role_level desc,a.combat_num desc) as num
                 		FROM dm_game_order.t_game_user_role a
                 		LEFT JOIN (
                 			SELECT

+ 2 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/task/OrderCostMonitorAlarmTask.java

@@ -69,9 +69,9 @@ public class OrderCostMonitorAlarmTask {
 
 
     /**
-     * 任务每10分钟运行一次
+     * 任务每30分钟运行一次
      */
-    @Scheduled(cron = "0 0/10 * * * ? ")
+    @Scheduled(cron = "0 0/30 * * * ? ")
     public void runTask(){
         log.info("订单与消耗监控告警定时任务开始.");
         ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GamePolicyConfigListVO.java

@@ -40,7 +40,7 @@ public class GamePolicyConfigListVO {
     private String superGameName;
 
     /**
-     * 策略类型:1-追踪玩家;2-玩家流失;3-新用户追踪
+     * 策略类型:1-追踪玩家;2-玩家流失;3-新用户追踪; 4-累充追踪
      * 1:单笔充值金额大于XX,并且注册时间在XX小时内的玩家
      * 2:累计充值金额大于XX,并且最近游戏距今时间超过XX小时的玩家
      * 3:新用户注册创角首日充值大于XX的用户

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů