Преглед изворни кода

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

Letianhua пре 1 година
родитељ
комит
326e531196
67 измењених фајлова са 1927 додато и 100 уклоњено
  1. 1 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentOrderDTO.java
  2. 60 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterRpcDTO.java
  3. 1 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderRpcDTO.java
  4. 56 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java
  5. 8 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentMiniGameBackRpc.java
  6. 3 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentUserActionBackRpc.java
  7. 6 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITtMiniGameBackRpc.java
  8. 17 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/config/NacosDynamicParamConfig.java
  9. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameOceanengineRoleRegisterLogMapper.java
  10. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentMiniGameRoleRegisterMapper.java
  11. 7 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/dao/mapper/GameTencentRoleRegisterMapper.java
  12. 47 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineRoleRegisterLogDTO.java
  13. 51 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameRoleRegisterDTO.java
  14. 77 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentRoleRegisterDTO.java
  15. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineOrderLog.java
  16. 80 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java
  17. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameOrder.java
  18. 75 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameRoleRegister.java
  19. 1 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentOrder.java
  20. 89 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentRoleRegister.java
  21. 1 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/ActionTypeEnum.java
  22. 60 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineRoleRegisterLogVO.java
  23. 2 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineUserLogVO.java
  24. 77 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameRoleRegisterVO.java
  25. 86 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentRoleRegisterVO.java
  26. 53 3
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java
  27. 29 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java
  28. 30 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java
  29. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineRoleRegisterLogService.java
  30. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameBackLogService.java
  31. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameRoleRegisterService.java
  32. 18 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentRoleRegisterService.java
  33. 8 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  34. 181 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java
  35. 3 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineUserLogServiceImpl.java
  36. 19 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameBackLogServiceImpl.java
  37. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java
  38. 152 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java
  39. 187 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java
  40. 19 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/IPayBoxRpc.java
  41. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  42. 19 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/PayBoxRpcImpl.java
  43. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfUserServiceImpl.java
  44. 11 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Game.java
  45. 71 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/ListenCall.java
  46. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/User.java
  47. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/ListenCallMapper.java
  48. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  49. 7 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/AppletController.java
  50. 13 6
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAliApiService.java
  51. 10 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java
  52. 13 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IListenCallService.java
  53. 9 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IPayApplicationService.java
  54. 26 29
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AliApiServiceImpl.java
  55. 83 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  56. 2 9
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameAppletServiceImpl.java
  57. 6 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java
  58. 19 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/ListenCallServiceImpl.java
  59. 6 8
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  60. 25 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PayApplicationServiceImpl.java
  61. 1 6
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java
  62. 1 13
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserCardServiceImpl.java
  63. 1 6
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserServiceImpl.java
  64. 3 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java
  65. 12 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/PayBaseService.java
  66. 1 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java
  67. 4 4
      game-module/game-module-sdk/src/main/resources/logback.xml

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

@@ -88,7 +88,7 @@ public class TencentOrderDTO implements Serializable {
      */
     private String clickId;
 
-    private Long roleId;
+    private String roleId;
 
     private String roleName;
 }

+ 60 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterRpcDTO.java

@@ -0,0 +1,60 @@
+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 TencentRoleRegisterRpcDTO 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;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+
+    private String roleId;
+
+    private String roleName;
+}

+ 1 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtOrderRpcDTO.java

@@ -65,7 +65,7 @@ public class TtOrderRpcDTO implements Serializable {
      */
     private LocalDateTime payTime;
 
-    private Long roleId;
+    private String roleId;
 
     private String roleName;
 }

+ 56 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtRoleRegisterRpcDTO.java

@@ -0,0 +1,56 @@
+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 TtRoleRegisterRpcDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+
+
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 微信小游戏上报组件
+     */
+    private TtAccountRpcDTO accountReport;
+    /**
+     * 小游戏 appId
+     */
+    private String wechatAppId;
+    /**
+     * 小游戏 openId
+     */
+    private String wechatOpenId;
+    /**
+     * 小游戏 unionId
+     */
+    private String wechatUnionId;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+
+    private String roleId;
+
+    private String roleName;
+    /**
+     * 激活/注册时间
+     */
+    private LocalDateTime registerTime;
+}

+ 8 - 1
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/rpc/ITencentMiniGameBackRpc.java

@@ -1,11 +1,13 @@
 package com.zanxiang.game.back.base.rpc;
 
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
 /**
- * 腾讯小游戏回传
+ * 腾讯小游戏回传(文档中的方案 B)
+ * 文档地址:https://docs.qq.com/doc/DRkpGUU5jSFVxQVFN
  */
 public interface ITencentMiniGameBackRpc {
     /**
@@ -17,4 +19,9 @@ public interface ITencentMiniGameBackRpc {
      * 用户回传
      */
     ResultVO<Boolean> backUser(TencentUserDTO dto);
+
+    /**
+     * 用户回传
+     */
+    ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto);
 }

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

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.base.rpc;
 
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
@@ -17,4 +18,6 @@ public interface ITencentUserActionBackRpc {
      * 用户回传
      */
     ResultVO<Boolean> backUser(TencentUserDTO dto);
+
+    ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto);
 }

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

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.base.rpc;
 
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
@@ -19,4 +20,9 @@ public interface ITtMiniGameBackRpc {
      * 用户下单、支付上报
      */
     ResultVO<Boolean> orderReport(TtOrderRpcDTO dto);
+
+    /**
+     * 创角上报
+     */
+    ResultVO<Boolean> roleRegisterReport(TtRoleRegisterRpcDTO dto);
 }

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

@@ -0,0 +1,17 @@
+package com.zanxiang.game.back.serve.config;
+
+import lombok.Getter;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Component
+@RefreshScope
+public class NacosDynamicParamConfig {
+    /**
+     * 按关键行为回传的广告账号列表
+     */
+    @Value("${nacos.dynamic.backOfKeyAccountIds:test}")
+    private String backOfKeyAccountIds;
+}

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

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

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

+ 47 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineRoleRegisterLogDTO.java

@@ -0,0 +1,47 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineRoleRegisterLogDTO extends BaseListDTO<GameOceanengineRoleRegisterLog> {
+    @ApiModelProperty("小游戏ID")
+    private String appId;
+
+    @ApiModelProperty("用户OpenID")
+    private String openId;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeEnd;
+}

+ 51 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentMiniGameRoleRegisterDTO.java

@@ -0,0 +1,51 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
+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;
+
+import java.time.LocalDate;
+
+/**
+ * 游戏腾讯用户表
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentMiniGameRoleRegisterDTO extends BaseListDTO<GameTencentMiniGameRoleRegister> {
+    @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;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerTimeEnd;
+
+    @ApiModelProperty("角色ID")
+    private String roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+}

+ 77 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameTencentRoleRegisterDTO.java

@@ -0,0 +1,77 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentRoleRegister;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 游戏腾讯订单表
+ * </p>
+ *
+ * @author auto
+ * @since 2023-06-01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameTencentRoleRegisterDTO extends BaseListDTO<GameTencentRoleRegister> {
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String channel;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * openid
+     */
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    @ApiModelProperty("-1:回传失败;0:未回传;1:回传")
+    private Integer isBack;
+
+    /**
+     * 数据源ID
+     */
+    @ApiModelProperty("数据源ID")
+    private Long userActionSetId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate registerEnd;
+}

+ 1 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineOrderLog.java

@@ -87,7 +87,7 @@ public class GameOceanengineOrderLog implements Serializable {
      */
     private Integer backStatus;
 
-    private Long roleId;
+    private String roleId;
 
     private String roleName;
 

+ 80 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineRoleRegisterLog.java

@@ -0,0 +1,80 @@
+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;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@TableName("t_game_oceanengine_role_register_log")
+public class GameOceanengineRoleRegisterLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 小游戏 id
+     */
+    private String appId;
+    /**
+     * 用户 open_id
+     */
+    private String openId;
+    /**
+     * 用户 union_id
+     */
+    private String unionId;
+    /**
+     * 游戏 id
+     */
+    private Long gameId;
+    /**
+     * 广告账号_id
+     */
+    private Long accountId;
+    /**
+     * 广告回传 token
+     */
+    private String accountReportToken;
+    /**
+     * 广告回传 url
+     */
+    private String accountReportUrl;
+    /**
+     * 渠道标识
+     */
+    private String agentKey;
+    /**
+     * 角色 id
+     */
+    private String roleId;
+    /**
+     * 角色名称
+     */
+    private String roleName;
+    /**
+     * 支付时间
+     */
+    private LocalDateTime registerTime;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+    /**
+     * 下单时间
+     */
+    private LocalDateTime createTime;
+
+}

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

@@ -101,7 +101,7 @@ public class GameTencentMiniGameOrder implements Serializable {
 
     private LocalDateTime createTime;
 
-    private Long roleId;
+    private String roleId;
 
     private String roleName;
 

+ 75 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentMiniGameRoleRegister.java

@@ -0,0 +1,75 @@
+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_role_register")
+public class GameTencentMiniGameRoleRegister 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;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    private String clickId;
+    /**
+     * 回传状态
+     */
+    private Integer backStatus;
+
+    private LocalDateTime createTime;
+
+    private String roleId;
+
+    private String roleName;
+
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    private String backMsg;
+}

+ 1 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentOrder.java

@@ -113,7 +113,7 @@ public class GameTencentOrder implements Serializable {
      */
     private String backLog;
 
-    private Long roleId;
+    private String roleId;
 
     private String roleName;
 

+ 89 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentRoleRegister.java

@@ -0,0 +1,89 @@
+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_role_register")
+public class GameTencentRoleRegister implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 回传策略ID
+     */
+    private Long backPolicyId;
+    /**
+     * 渠道号
+     */
+    private String channel;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    private LocalDateTime registerTime;
+
+    /**
+     * openid
+     */
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    private Integer isBack;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+
+    private LocalDateTime createTime;
+
+    /**
+     * 回传日志
+     */
+    private String backLog;
+
+    private String roleId;
+
+    private String roleName;
+
+    private String backMsg;
+}

+ 1 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/ActionTypeEnum.java

@@ -8,6 +8,7 @@ import lombok.Getter;
 public enum ActionTypeEnum {
     REGISTER("REGISTER","注册"),
     PURCHASE("PURCHASE","付费"),
+    CREATE_ROLE("CREATE_ROLE","创角"),
     COMPLETE_ORDER("COMPLETE_ORDER","下单");
 
 

+ 60 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineRoleRegisterLogVO.java

@@ -0,0 +1,60 @@
+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;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineRoleRegisterLogVO {
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("小游戏ID")
+    private String appId;
+
+    @ApiModelProperty("用户OpenID")
+    private String openId;
+
+    @ApiModelProperty("用户UnionID")
+    private String unionId;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("广告回传Token")
+    private String accountReportToken;
+
+    @ApiModelProperty("广告回传URL")
+    private String accountReportUrl;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    @ApiModelProperty("角色 id")
+    private String roleId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("注册/激活时间")
+    private LocalDateTime registerTime;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+}

+ 2 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineUserLogVO.java

@@ -50,10 +50,10 @@ public class GameOceanengineUserLogVO {
     private String clueToken;
 
     @ApiModelProperty("头条2.0-项目ID")
-    private Long projectId;
+    private String projectId;
 
     @ApiModelProperty("头条2.0-广告ID")
-    private Long promotionId;
+    private String promotionId;
 
     @ApiModelProperty("请求ID")
     private String reqId;

+ 77 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentMiniGameRoleRegisterVO.java

@@ -0,0 +1,77 @@
+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 GameTencentMiniGameRoleRegisterVO {
+    private Long id;
+
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String agentKey;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty("注册时间")
+    private LocalDateTime registerTime;
+
+    /**
+     * 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;
+
+    private String roleId;
+
+    private String roleName;
+}

+ 86 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameTencentRoleRegisterVO.java

@@ -0,0 +1,86 @@
+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 GameTencentRoleRegisterVO {
+    private Long id;
+
+    /**
+     * 渠道号
+     */
+    @ApiModelProperty("渠道号")
+    private String channel;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    /**
+     * 广告账号ID
+     */
+    @ApiModelProperty("广告账号ID")
+    private Long adAccountId;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty("注册时间")
+    private LocalDateTime registerTime;
+
+    /**
+     * openid
+     */
+    @ApiModelProperty("openid")
+    private String wechatOpenid;
+
+    /**
+     * appid
+     */
+    @ApiModelProperty("appid")
+    private String wechatAppId;
+
+    /**
+     * 0:未回传;1:回传
+     */
+    @ApiModelProperty("回传状态 -1:回传失败;0:未回传;1:已回传")
+    private Integer isBack;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 回传日志
+     */
+    @ApiModelProperty("回传日志")
+    private String backLog;
+
+    @ApiModelProperty("回传日志")
+    private String backMsg;
+
+    private String roleId;
+
+    private String roleName;
+}

+ 53 - 3
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentMiniGameBackRpcImpl.java

@@ -2,13 +2,16 @@ package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 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.GameTencentMiniGameRoleRegister;
 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.IGameTencentMiniGameRoleRegisterService;
 import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -27,6 +30,8 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
     private IGameTencentMiniGameOrderService gameTencentMiniGameOrderService;
     @Autowired
     private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+    @Autowired
+    private IGameTencentMiniGameRoleRegisterService gameTencentMiniGameRoleRegisterService;
 
     @Override
     public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
@@ -45,6 +50,15 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
                 .eq(GameTencentMiniGameOrder::getWechatOpenid, dto.getWechatOpenid())
                 .last("limit 1")
         ) == null;
+        GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                .select(GameTencentMiniGameUser::getBackStatus, GameTencentMiniGameUser::getClickId)
+                .eq(GameTencentMiniGameUser::getGameId, dto.getGameId())
+                .eq(GameTencentMiniGameUser::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentMiniGameUser::getWechatOpenid, dto.getWechatOpenid())
+                .eq(GameTencentMiniGameUser::getAdAccountId, dto.getAdAccountId())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+                .last("limit 1")
+        );
         GameTencentMiniGameOrder orderLog = GameTencentMiniGameOrder.builder()
                 .adAccountId(dto.getAdAccountId())
                 .gameId(dto.getGameId())
@@ -61,13 +75,18 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
                 .createTime(LocalDateTime.now())
                 .backStatus(BackStatusEnum.NO.getBackStatus())
                 .backPolicyId(dto.getBackPolicyId())
-                .clickId(dto.getClickId())
+                .clickId(userLog == null ? null : userLog.getClickId())
                 .roleId(dto.getRoleId())
                 .roleName(dto.getRoleName())
                 .isFirstOrder(isFirstOrder)
                 .build();
         gameTencentMiniGameOrderService.save(orderLog);
-        return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog, false, null));
+        if (userLog == null) {
+            log.error("腾讯小游戏订单回传失败,找不到回传的用户 orderId: {}", orderLog.getOrderId());
+            return ResultVO.fail("找不到回传用户");
+        } else {
+            return ResultVO.ok(gameTencentMiniGameOrderService.orderBack(orderLog, false, null));
+        }
     }
 
     @Override
@@ -86,6 +105,37 @@ public class TencentMiniGameBackRpcImpl implements ITencentMiniGameBackRpc {
                 .createTime(LocalDateTime.now())
                 .build();
         gameTencentMiniGameUserService.save(userLog);
-        return ResultVO.ok(gameTencentMiniGameUserService.userBack(userLog, false));
+        return ResultVO.ok(true);
+        // 激活现在默认不回传了,等创角的时候一起回传
+        // return ResultVO.ok(gameTencentMiniGameUserService.userBack(userLog, false));
+    }
+
+    @Override
+    public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto) {
+        log.error("腾讯小游戏创角回传收到:{}", JsonUtil.toString(dto));
+        GameTencentMiniGameUser userLog = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                .select(GameTencentMiniGameUser::getBackStatus, GameTencentMiniGameUser::getClickId)
+                .eq(GameTencentMiniGameUser::getGameId, dto.getGameId())
+                .eq(GameTencentMiniGameUser::getWechatAppId, dto.getWechatAppId())
+                .eq(GameTencentMiniGameUser::getWechatOpenid, dto.getWechatOpenid())
+                .eq(GameTencentMiniGameUser::getAdAccountId, dto.getAdAccountId())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+                .last("limit 1")
+        );
+        GameTencentMiniGameRoleRegister roleRegisterLog = GameTencentMiniGameRoleRegister.builder()
+                .agentKey(dto.getChannel())
+                .gameId(dto.getGameId())
+                .adAccountId(dto.getAdAccountId())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .clickId(userLog == null ? null : userLog.getClickId())
+                .registerTime(dto.getRegisterTime())
+                .backStatus(BackStatusEnum.NO.getBackStatus())
+                .createTime(LocalDateTime.now())
+                .roleId(dto.getRoleId())
+                .roleName(dto.getRoleName())
+                .build();
+        gameTencentMiniGameRoleRegisterService.save(roleRegisterLog);
+        return ResultVO.ok(gameTencentMiniGameRoleRegisterService.roleRegisterBack(roleRegisterLog));
     }
 }

+ 29 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentUserActionBackRpcImpl.java

@@ -3,14 +3,16 @@ package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
+import com.zanxiang.game.back.base.pojo.dto.TencentRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 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.GameTencentRoleRegister;
 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.IGameTencentRoleRegisterService;
 import com.zanxiang.game.back.serve.service.IGameTencentUserService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -29,6 +31,8 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
     private IGameTencentOrderService gameTencentOrderService;
     @Autowired
     private IGameTencentUserService gameTencentUserService;
+    @Autowired
+    private IGameTencentRoleRegisterService gameTencentRoleRegisterService;
 
     @Override
     public ResultVO<Boolean> backOrder(TencentOrderDTO dto) {
@@ -89,6 +93,29 @@ public class TencentUserActionBackRpcImpl implements ITencentUserActionBackRpc {
                 .createTime(LocalDateTime.now())
                 .build();
         gameTencentUserService.save(gameTencentUser);
-        return ResultVO.ok(gameTencentUserService.userBack(gameTencentUser, false));
+        return ResultVO.ok(true);
+        // 激活现在默认不回传了,等创角的时候一起回传
+        // return ResultVO.ok(gameTencentUserService.userBack(gameTencentUser, false));
+    }
+
+    @Override
+    public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterRpcDTO dto) {
+        log.error("腾讯H5创角回传收到:{}", JsonUtil.toString(dto));
+        GameTencentRoleRegister roleRegister = GameTencentRoleRegister.builder()
+                .backPolicyId(dto.getBackPolicyId())
+                .channel(dto.getChannel())
+                .gameId(dto.getGameId())
+                .adAccountId(dto.getAdAccountId())
+                .registerTime(dto.getRegisterTime())
+                .wechatAppId(dto.getWechatAppId())
+                .wechatOpenid(dto.getWechatOpenid())
+                .isBack(BackStatusEnum.NO.getBackStatus())
+                .userActionSetId(dto.getUserActionSetId())
+                .createTime(LocalDateTime.now())
+                .roleId(dto.getRoleId())
+                .roleName(dto.getRoleName())
+                .build();
+        gameTencentRoleRegisterService.save(roleRegister);
+        return ResultVO.ok(gameTencentRoleRegisterService.roleRegisterBack(roleRegister));
     }
 }

+ 30 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtMiniGameBackRpcImpl.java

@@ -2,13 +2,16 @@ package com.zanxiang.game.back.serve.rpc.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.back.base.pojo.dto.TtOrderRpcDTO;
+import com.zanxiang.game.back.base.pojo.dto.TtRoleRegisterRpcDTO;
 import com.zanxiang.game.back.base.pojo.dto.TtUserActiveRpcDTO;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 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.GameOceanengineRoleRegisterLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.IGameOceanengineOrderLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineRoleRegisterLogService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -26,6 +29,8 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
     private IGameOceanengineUserLogService gameOceanengineUserLogService;
     @Autowired
     private IGameOceanengineOrderLogService gameOceanengineOrderLogService;
+    @Autowired
+    private IGameOceanengineRoleRegisterLogService gameOceanengineRoleRegisterLogService;
 
     @Override
     public ResultVO<Boolean> userActiveReport(TtUserActiveRpcDTO dto) {
@@ -48,7 +53,9 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
                 .createTime(LocalDateTime.now())
                 .build();
         gameOceanengineUserLogService.save(userLog);
-        return ResultVO.ok(gameOceanengineUserLogService.callback(userLog, false));
+        return ResultVO.ok(true);
+        // 激活现在默认不回传了,等创角的时候一起回传
+        // return ResultVO.ok(gameOceanengineUserLogService.callback(userLog, false));
     }
 
     @Override
@@ -91,4 +98,26 @@ public class TtMiniGameBackRpcImpl implements ITtMiniGameBackRpc {
         gameOceanengineOrderLogService.save(orderLog);
         return ResultVO.ok(gameOceanengineOrderLogService.callback(orderLog, false, null));
     }
+
+    @Override
+    public ResultVO<Boolean> roleRegisterReport(TtRoleRegisterRpcDTO dto) {
+        log.error("头条小游戏创角回传收到:{}", JsonUtil.toString(dto));
+        GameOceanengineRoleRegisterLog roleRegisterLog = GameOceanengineRoleRegisterLog.builder()
+                .appId(dto.getWechatAppId())
+                .openId(dto.getWechatOpenId())
+                .unionId(dto.getWechatUnionId())
+                .gameId(dto.getGameId())
+                .accountId(dto.getAccountReport().getAccountId())
+                .accountReportToken(dto.getAccountReport().getReportToken())
+                .accountReportUrl(dto.getAccountReport().getReportUrl())
+                .agentKey(dto.getAgentKey())
+                .roleId(dto.getRoleId())
+                .roleName(dto.getRoleName())
+                .registerTime(dto.getRegisterTime())
+                .backStatus(BackStatusEnum.NO.getBackStatus())
+                .createTime(LocalDateTime.now())
+                .build();
+        gameOceanengineRoleRegisterLogService.save(roleRegisterLog);
+        return ResultVO.ok(gameOceanengineRoleRegisterLogService.callback(roleRegisterLog));
+    }
 }

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineRoleRegisterLogService.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.GameOceanengineRoleRegisterLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineRoleRegisterLogVO;
+
+import java.util.List;
+
+public interface IGameOceanengineRoleRegisterLogService extends IService<GameOceanengineRoleRegisterLog> {
+
+    boolean callback(GameOceanengineRoleRegisterLog roleRegisterLog);
+
+    IPage<GameOceanengineRoleRegisterLogVO> oceanengineUserLogList(GameOceanengineRoleRegisterLogDTO dto);
+
+    boolean oceanengineUserReport(List<Long> ids);
+}

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

@@ -3,6 +3,7 @@ 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.GameTencentMiniGameRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 
@@ -11,4 +12,6 @@ public interface IGameTencentMiniGameBackLogService extends IService<GameTencent
     BackStatusEnum userBack(GameTencentMiniGameUser userLog);
 
     BackStatusEnum orderBack(GameTencentMiniGameOrder orderLog);
+
+    BackStatusEnum roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog);
 }

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentMiniGameRoleRegisterService.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.GameTencentMiniGameRoleRegisterDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameRoleRegisterVO;
+
+import java.util.List;
+
+public interface IGameTencentMiniGameRoleRegisterService extends IService<GameTencentMiniGameRoleRegister> {
+
+    boolean roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog);
+
+    IPage<GameTencentMiniGameRoleRegisterVO> listOfPage(GameTencentMiniGameRoleRegisterDTO dto);
+
+    boolean doReport(List<Long> userLogIds);
+}

+ 18 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentRoleRegisterService.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.GameTencentRoleRegisterDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentRoleRegister;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentRoleRegisterVO;
+
+import java.util.List;
+
+public interface IGameTencentRoleRegisterService extends IService<GameTencentRoleRegister> {
+
+    boolean roleRegisterBack(GameTencentRoleRegister roleRegisterLog);
+
+    IPage<GameTencentRoleRegisterVO> tencentLogList(GameTencentRoleRegisterDTO dto);
+
+    boolean tencentUserReport(List<Long> ids);
+}

+ 8 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.sd4324530.jtuple.Tuple3;
 import com.github.sd4324530.jtuple.Tuples;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
+import com.zanxiang.game.back.serve.config.NacosDynamicParamConfig;
 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;
@@ -37,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -59,6 +61,8 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
     private IGameOceanengineBackLogService gameOceanengineBackLogService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;
+    @Autowired
+    private NacosDynamicParamConfig dynamicParamConfig;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -341,11 +345,14 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                     .build());
             return BackStatusEnum.FAILED;
         }
+        Set<Long> keyAccountIds = StringUtils.isBlank(dynamicParamConfig.getBackOfKeyAccountIds()) ? Collections.emptySet() :
+                Arrays.stream(dynamicParamConfig.getBackOfKeyAccountIds().split(",")).map(Long::parseLong).collect(Collectors.toSet());
+        Integer eventType = keyAccountIds.contains(orderLog.getAccountId()) ? MiniGameCallback.EventType.GAME_ADDICTION.getEventType() : MiniGameCallback.EventType.ACTIVE_PAY.getEventType();
         MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
                 .clue_token(userLog.getClueToken())
                 .open_id(orderLog.getOpenId())
                 .union_id(orderLog.getUnionId())
-                .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE_PAY.getEventType()))
+                .event_type(String.valueOf(eventType))
                 .props(MiniGameCallback.MiniGameCallbackRequest.MiniGameCallbackRequestProps.builder()
                         .pay_amount(orderLog.getBackMoney())
                         .build())

+ 181 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineRoleRegisterLogServiceImpl.java

@@ -0,0 +1,181 @@
+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.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineRoleRegisterLogMapper;
+import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
+import com.zanxiang.game.back.serve.oceanengine.OceanengineCallbackException;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineRoleRegisterLogDTO;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineUserLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineBackLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineRoleRegisterLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineUserLog;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineRoleRegisterLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineUserLogVO;
+import com.zanxiang.game.back.serve.service.IGameOceanengineBackLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineRoleRegisterLogService;
+import com.zanxiang.game.back.serve.service.IGameOceanengineUserLogService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+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.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class GameOceanengineRoleRegisterLogServiceImpl extends ServiceImpl<GameOceanengineRoleRegisterLogMapper, GameOceanengineRoleRegisterLog>
+        implements IGameOceanengineRoleRegisterLogService {
+
+    @Autowired
+    private MiniGameCallback miniGameCallback;
+    @Autowired
+    private IGameOceanengineUserLogService gameOceanengineUserLogService;
+    @Autowired
+    private IGameOceanengineBackLogService gameOceanengineBackLogService;
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean callback(GameOceanengineRoleRegisterLog roleRegisterLog) {
+        BackStatusEnum backStatus = doCallback(roleRegisterLog);
+        return update(new LambdaUpdateWrapper<GameOceanengineRoleRegisterLog>()
+                .set(GameOceanengineRoleRegisterLog::getBackStatus, backStatus.getBackStatus())
+                .eq(GameOceanengineRoleRegisterLog::getId, roleRegisterLog.getId())
+        );
+    }
+
+    @Override
+    public IPage<GameOceanengineRoleRegisterLogVO> oceanengineUserLogList(GameOceanengineRoleRegisterLogDTO dto) {
+        IPage<GameOceanengineRoleRegisterLog> page = page(dto.toPage(), new LambdaQueryWrapper<GameOceanengineRoleRegisterLog>()
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameOceanengineRoleRegisterLog::getAgentKey, dto.getAgentKey())
+                .ge(dto.getRegisterTimeBegin() != null, GameOceanengineRoleRegisterLog::getRegisterTime, dto.getRegisterTimeBegin() == null ? null : LocalDateTime.of(dto.getRegisterTimeBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getRegisterTimeEnd() != null, GameOceanengineRoleRegisterLog::getRegisterTime, dto.getRegisterTimeEnd() == null ? null : LocalDateTime.of(dto.getRegisterTimeEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameOceanengineRoleRegisterLog::getGameId, dto.getGameId())
+                .eq(null != dto.getAccountId(), GameOceanengineRoleRegisterLog::getAccountId, dto.getAccountId())
+                .eq(StringUtils.isNotBlank(dto.getAppId()), GameOceanengineRoleRegisterLog::getAppId, dto.getAppId())
+                .eq(StringUtils.isNotBlank(dto.getOpenId()), GameOceanengineRoleRegisterLog::getOpenId, dto.getOpenId())
+                .eq(null != dto.getBackStatus(), GameOceanengineRoleRegisterLog::getBackStatus, dto.getBackStatus())
+                .eq(StringUtils.isNotBlank(dto.getRoleName()), GameOceanengineRoleRegisterLog::getRoleName, dto.getRoleName())
+                .orderByDesc(GameOceanengineRoleRegisterLog::getCreateTime)
+        );
+        IPage<GameOceanengineRoleRegisterLogVO> result = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
+        if (CollectionUtils.isEmpty(page.getRecords())) {
+            return result;
+        }
+        result.setRecords(toVOBatch(page.getRecords()));
+        return result;
+    }
+
+    private List<GameOceanengineRoleRegisterLogVO> toVOBatch(List<GameOceanengineRoleRegisterLog> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        Set<String> agentKeys = logList.stream().map(GameOceanengineRoleRegisterLog::getAgentKey).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+        Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
+                .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
+        return logList.stream().map(log -> {
+            GameOceanengineRoleRegisterLogVO vo = BeanUtil.copy(log, GameOceanengineRoleRegisterLogVO.class);
+            if (StringUtils.isNotBlank(log.getAgentKey())) {
+                AgentRpcVO agent = agentMap.get(log.getAgentKey());
+                if (agent != null) {
+                    vo.setAgentName(agent.getAgentName());
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean oceanengineUserReport(List<Long> ids) {
+        listByIds(ids).forEach(this::callback);
+        return true;
+    }
+
+    private BackStatusEnum doCallback(GameOceanengineRoleRegisterLog roleRegisterLog) {
+        GameOceanengineUserLog userLog = gameOceanengineUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineUserLog>()
+                .eq(GameOceanengineUserLog::getGameId, roleRegisterLog.getGameId())
+                .eq(GameOceanengineUserLog::getAppId, roleRegisterLog.getAppId())
+                .eq(GameOceanengineUserLog::getOpenId, roleRegisterLog.getOpenId())
+                .eq(GameOceanengineUserLog::getAccountId, roleRegisterLog.getAccountId())
+                .orderByDesc(GameOceanengineUserLog::getCreateTime)
+                .last("limit 1")
+        );
+        if (userLog == null) {
+            gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
+                    .appId(roleRegisterLog.getAppId())
+                    .openId(roleRegisterLog.getOpenId())
+                    .unionId(roleRegisterLog.getUnionId())
+                    .gameId(roleRegisterLog.getGameId())
+                    .accountId(roleRegisterLog.getAccountId())
+                    .clueToken("")
+                    .eventType(String.valueOf(MiniGameCallback.EventType.ACTIVE_REGISTER.getEventType()))
+                    .eventLogId(roleRegisterLog.getId())
+                    .createTime(LocalDateTime.now())
+                    .backStatus(BackStatusEnum.FAILED.getBackStatus())
+                    .errMsg("找不到用户注册信息")
+                    .build());
+            return BackStatusEnum.FAILED;
+        }
+        if (BackStatusEnum.NO.getBackStatus().equals(userLog.getBackStatus())) {
+            // 回传用户激活
+            gameOceanengineUserLogService.callback(userLog, true);
+        } else {
+            // 注册已回传,则默认认为创角也回传了
+            return BackStatusEnum.NO;
+        }
+        MiniGameCallback.MiniGameCallbackRequest request = MiniGameCallback.MiniGameCallbackRequest.builder()
+                .clue_token(userLog.getClueToken())
+                .open_id(roleRegisterLog.getOpenId())
+                .union_id(roleRegisterLog.getUnionId())
+                .event_type(String.valueOf(MiniGameCallback.EventType.ACTIVE_REGISTER.getEventType()))
+                .build();
+        BackStatusEnum backStatus = BackStatusEnum.SUCCESS;
+        String errMsg = null;
+        try {
+            miniGameCallback.doCallback(userLog.getAccountReportUrl(), userLog.getAccountReportToken(), request);
+        } catch (OceanengineCallbackException e) {
+            log.error(e.getMessage(), e);
+            backStatus = BackStatusEnum.FAILED;
+            errMsg = e.getMsg();
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            backStatus = BackStatusEnum.FAILED;
+            errMsg = "系统异常:" + e.getMessage();
+        }
+        gameOceanengineBackLogService.save(GameOceanengineBackLog.builder()
+                .appId(roleRegisterLog.getAppId())
+                .openId(roleRegisterLog.getOpenId())
+                .unionId(roleRegisterLog.getUnionId())
+                .gameId(roleRegisterLog.getGameId())
+                .accountId(roleRegisterLog.getAccountId())
+                .clueToken(userLog.getClueToken())
+                .eventType(request.getEvent_type())
+                .eventLogId(roleRegisterLog.getId())
+                .createTime(LocalDateTime.now())
+                .backStatus(backStatus.getBackStatus())
+                .errMsg(errMsg)
+                .build());
+        return backStatus;
+    }
+}

+ 3 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineUserLogServiceImpl.java

@@ -95,6 +95,8 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
         return logList.stream().map(log -> {
             GameOceanengineUserLogVO vo = BeanUtil.copy(log, GameOceanengineUserLogVO.class);
+            vo.setProjectId(log.getProjectId() == null ? null : log.getProjectId().toString());
+            vo.setPromotionId(log.getPromotionId() == null ? null : log.getPromotionId().toString());
             if (StringUtils.isNotBlank(log.getAgentKey())) {
                 AgentRpcVO agent = agentMap.get(log.getAgentKey());
                 if (agent != null) {
@@ -119,6 +121,7 @@ public class GameOceanengineUserLogServiceImpl extends ServiceImpl<GameOceanengi
                 .eq(GameOceanengineBackLog::getAppId, userLog.getAppId())
                 .eq(GameOceanengineBackLog::getOpenId, userLog.getOpenId())
                 .eq(GameOceanengineBackLog::getAccountId, userLog.getAccountId())
+                .eq(GameOceanengineBackLog::getEventType, MiniGameCallback.EventType.ACTIVE.getEventType())
                 .eq(GameOceanengineBackLog::getBackStatus, BackStatusEnum.SUCCESS)
         ) > 0;
         if (isBack) {

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

@@ -6,6 +6,7 @@ import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameBackLogMapper;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameRoleRegister;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
 import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
@@ -77,6 +78,24 @@ public class GameTencentMiniGameBackLogServiceImpl extends ServiceImpl<GameTence
         return BackStatusEnum.getByValue(backLog.getBackStatus());
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BackStatusEnum roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        GameTencentMiniGameBackLog backLog = GameTencentMiniGameBackLog.builder()
+                .gameId(roleRegisterLog.getGameId())
+                .adAccountId(roleRegisterLog.getAdAccountId())
+                .clickId(roleRegisterLog.getClickId())
+                .actionTime(roleRegisterLog.getRegisterTime())
+                .wechatOpenid(roleRegisterLog.getWechatOpenid())
+                .wechatAppId(roleRegisterLog.getWechatAppId())
+                .actionType(ActionTypeEnum.CREATE_ROLE.getActionType())
+                .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) {

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

@@ -1,6 +1,7 @@
 package com.zanxiang.game.back.serve.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,12 +16,14 @@ 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.entity.GameTencentMiniGameUser;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum;
 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.service.IGameTencentMiniGameUserService;
 import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
 import com.zanxiang.game.back.serve.utils.OrderUtil;
 import com.zanxiang.game.module.base.ServerInfo;
@@ -58,6 +61,8 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
     @Autowired
     private IGameTencentMiniGameBackLogService gameTencentMiniGameBackLogService;
     @Autowired
+    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+    @Autowired
     private IGameBackPolicyService gameBackPolicyService;
     @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
     private IAgentRpc agentRpc;

+ 152 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameRoleRegisterServiceImpl.java

@@ -0,0 +1,152 @@
+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.plugins.pagination.Page;
+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.game.back.serve.dao.mapper.GameTencentMiniGameRoleRegisterMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameRoleRegisterDTO;
+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.GameTencentMiniGameRoleRegister;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameUser;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
+import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameRoleRegisterVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameUserVO;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameRoleRegisterService;
+import com.zanxiang.game.back.serve.service.IGameTencentMiniGameUserService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+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.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class GameTencentMiniGameRoleRegisterServiceImpl extends ServiceImpl<GameTencentMiniGameRoleRegisterMapper, GameTencentMiniGameRoleRegister>
+        implements IGameTencentMiniGameRoleRegisterService {
+
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
+    @Autowired
+    private IGameTencentMiniGameBackLogService gameTencentMiniGameBackLogService;
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+    @Autowired
+    private IGameTencentMiniGameUserService gameTencentMiniGameUserService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean roleRegisterBack(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        if (StringUtils.isBlank(roleRegisterLog.getClickId())) {
+            return false;
+        }
+        BackStatusEnum backStatus = doCallback(roleRegisterLog);
+        return update(new LambdaUpdateWrapper<GameTencentMiniGameRoleRegister>()
+                .set(GameTencentMiniGameRoleRegister::getBackStatus, backStatus.getBackStatus())
+                .eq(GameTencentMiniGameRoleRegister::getId, roleRegisterLog.getId())
+        );
+    }
+
+
+    @Override
+    public IPage<GameTencentMiniGameRoleRegisterVO> listOfPage(GameTencentMiniGameRoleRegisterDTO dto) {
+        IPage<GameTencentMiniGameRoleRegister> page = page(dto.toPage(), new LambdaQueryWrapper<GameTencentMiniGameRoleRegister>()
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameTencentMiniGameRoleRegister::getAgentKey, dto.getAgentKey())
+                .ge(dto.getRegisterTimeBegin() != null, GameTencentMiniGameRoleRegister::getRegisterTime, dto.getRegisterTimeBegin() == null ? null : LocalDateTime.of(dto.getRegisterTimeBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getRegisterTimeEnd() != null, GameTencentMiniGameRoleRegister::getRegisterTime, dto.getRegisterTimeEnd() == null ? null : LocalDateTime.of(dto.getRegisterTimeEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameTencentMiniGameRoleRegister::getGameId, dto.getGameId())
+                .eq(null != dto.getAdAccountId(), GameTencentMiniGameRoleRegister::getAdAccountId, dto.getAdAccountId())
+                .eq(StringUtils.isNotBlank(dto.getWechatAppId()), GameTencentMiniGameRoleRegister::getWechatAppId, dto.getWechatAppId())
+                .eq(StringUtils.isNotBlank(dto.getWechatOpenid()), GameTencentMiniGameRoleRegister::getWechatOpenid, dto.getWechatOpenid())
+                .eq(null != dto.getBackStatus(), GameTencentMiniGameRoleRegister::getBackStatus, dto.getBackStatus())
+                .orderByDesc(GameTencentMiniGameRoleRegister::getCreateTime)
+        );
+        IPage<GameTencentMiniGameRoleRegisterVO> result = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
+        if (CollectionUtils.isEmpty(page.getRecords())) {
+            return result;
+        }
+        result.setRecords(toVOBatch(page.getRecords()));
+        return result;
+    }
+
+    @Override
+    public boolean doReport(List<Long> userLogIds) {
+        listByIds(userLogIds).forEach(userLog -> {
+            BackStatusEnum backStatus = doCallback(userLog);
+            update(new LambdaUpdateWrapper<GameTencentMiniGameRoleRegister>()
+                    .set(GameTencentMiniGameRoleRegister::getBackStatus, backStatus.getBackStatus())
+                    .eq(GameTencentMiniGameRoleRegister::getId, userLog.getId())
+            );
+        });
+        return true;
+    }
+
+    private List<GameTencentMiniGameRoleRegisterVO> toVOBatch(List<GameTencentMiniGameRoleRegister> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        Set<String> agentKeys = logList.stream().map(GameTencentMiniGameRoleRegister::getAgentKey).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+        Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
+                .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
+        return logList.stream().map(log -> {
+            GameTencentMiniGameRoleRegisterVO vo = toVOSimple(log);
+            if (StringUtils.isNotBlank(log.getAgentKey())) {
+                AgentRpcVO agent = agentMap.get(log.getAgentKey());
+                if (agent != null) {
+                    vo.setAgentName(agent.getAgentName());
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
+    private BackStatusEnum doCallback(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        GameTencentMiniGameUser user = gameTencentMiniGameUserService.getOne(new LambdaQueryWrapper<GameTencentMiniGameUser>()
+                .eq(GameTencentMiniGameUser::getGameId, roleRegisterLog.getGameId())
+                .eq(GameTencentMiniGameUser::getWechatAppId, roleRegisterLog.getWechatAppId())
+                .eq(GameTencentMiniGameUser::getWechatOpenid, roleRegisterLog.getWechatOpenid())
+                .eq(GameTencentMiniGameUser::getAdAccountId, roleRegisterLog.getAdAccountId())
+                .orderByDesc(GameTencentMiniGameUser::getCreateTime)
+                .last("limit 1")
+        );
+        if (user != null) {
+            if (BackStatusEnum.NO.getBackStatus().equals(user.getBackStatus())) {
+                gameTencentMiniGameUserService.userBack(user, true);
+            } else {
+                // 注册已回传,则默认认为创角也回传了
+                return BackStatusEnum.NO;
+            }
+        }
+        return gameTencentMiniGameBackLogService.roleRegisterBack(roleRegisterLog);
+    }
+
+    private GameTencentMiniGameRoleRegisterVO toVOSimple(GameTencentMiniGameRoleRegister roleRegisterLog) {
+        if (roleRegisterLog == null) {
+            return null;
+        }
+        return BeanUtil.copy(roleRegisterLog, GameTencentMiniGameRoleRegisterVO.class);
+    }
+}

+ 187 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentRoleRegisterServiceImpl.java

@@ -0,0 +1,187 @@
+package com.zanxiang.game.back.serve.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.game.back.serve.dao.mapper.GameTencentRoleRegisterMapper;
+import com.zanxiang.game.back.serve.pojo.dto.GameTencentRoleRegisterDTO;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentRoleRegister;
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
+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.GameTencentRoleRegisterVO;
+import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
+import com.zanxiang.game.back.serve.service.IGameTencentRoleRegisterService;
+import com.zanxiang.game.back.serve.service.IGameTencentUserService;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.vo.AgentRpcVO;
+import com.zanxiang.game.module.base.rpc.IAgentRpc;
+import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+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.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class GameTencentRoleRegisterServiceImpl extends ServiceImpl<GameTencentRoleRegisterMapper, GameTencentRoleRegister>
+        implements IGameTencentRoleRegisterService {
+
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+    @Autowired
+    private IGameTencentBackLogService gameTencentBackLogService;
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
+    @Autowired
+    private IGameTencentUserService gameTencentUserService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean roleRegisterBack(GameTencentRoleRegister roleRegisterLog) {
+        BackStatusEnum backStatus = doCallback(roleRegisterLog);
+        return update(new LambdaUpdateWrapper<GameTencentRoleRegister>()
+                .set(GameTencentRoleRegister::getIsBack, backStatus.getBackStatus())
+                .eq(GameTencentRoleRegister::getId, roleRegisterLog.getId())
+        );
+    }
+
+
+    @Override
+    public IPage<GameTencentRoleRegisterVO> tencentLogList(GameTencentRoleRegisterDTO dto) {
+        IPage<GameTencentRoleRegister> page = page(dto.toPage(), new LambdaQueryWrapper<GameTencentRoleRegister>()
+                .eq(StringUtils.isNotBlank(dto.getChannel()), GameTencentRoleRegister::getChannel, dto.getChannel())
+                .ge(dto.getRegisterBegin() != null, GameTencentRoleRegister::getRegisterTime, dto.getRegisterBegin() == null ? null : LocalDateTime.of(dto.getRegisterBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getRegisterEnd() != null, GameTencentRoleRegister::getRegisterTime, dto.getRegisterEnd() == null ? null : LocalDateTime.of(dto.getRegisterEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameTencentRoleRegister::getGameId, dto.getGameId())
+                .eq(null != dto.getAdAccountId(), GameTencentRoleRegister::getAdAccountId, dto.getAdAccountId())
+                .eq(StringUtils.isNotBlank(dto.getWechatAppId()), GameTencentRoleRegister::getWechatAppId, dto.getWechatAppId())
+                .eq(StringUtils.isNotBlank(dto.getWechatOpenid()), GameTencentRoleRegister::getWechatOpenid, dto.getWechatOpenid())
+                .eq(null != dto.getIsBack(), GameTencentRoleRegister::getIsBack, dto.getIsBack())
+                .orderByDesc(GameTencentRoleRegister::getCreateTime)
+        );
+
+        IPage<GameTencentRoleRegisterVO> result = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
+        if (CollectionUtils.isEmpty(page.getRecords())) {
+            return result;
+        }
+        result.setRecords(toVOBatch(page.getRecords()));
+        return result;
+    }
+
+    @Override
+    public boolean tencentUserReport(List<Long> ids) {
+        listByIds(ids).forEach(roleRegisterLog -> {
+            BackStatusEnum backStatus = doCallback(roleRegisterLog);
+            update(new LambdaUpdateWrapper<GameTencentRoleRegister>()
+                    .set(GameTencentRoleRegister::getIsBack, backStatus.getBackStatus())
+                    .eq(GameTencentRoleRegister::getId, roleRegisterLog.getId())
+            );
+        });
+        return true;
+    }
+
+    private List<GameTencentRoleRegisterVO> toVOBatch(List<GameTencentRoleRegister> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        Set<String> agentKeys = logList.stream().map(GameTencentRoleRegister::getChannel).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+        Map<String, AgentRpcVO> agentMap = CollectionUtils.isEmpty(agentKeys) ? Collections.emptyMap() : agentRpc.getByAgentKeys(new ArrayList<>(agentKeys))
+                .getData().stream().collect(Collectors.toMap(AgentRpcVO::getAgentKey, Function.identity()));
+        return logList.stream().map(log -> {
+            GameTencentRoleRegisterVO vo = BeanUtil.copy(log, GameTencentRoleRegisterVO.class);
+            if (StringUtils.isNotBlank(log.getChannel())) {
+                AgentRpcVO agent = agentMap.get(log.getChannel());
+                if (agent != null) {
+                    vo.setAgentName(agent.getAgentName());
+                }
+            }
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
+
+    private BackStatusEnum doCallback(GameTencentRoleRegister roleRegisterLog) {
+        GameTencentUser user = gameTencentUserService.getOne(new LambdaQueryWrapper<GameTencentUser>()
+                .eq(GameTencentUser::getGameId, roleRegisterLog.getGameId())
+                .eq(GameTencentUser::getWechatAppId, roleRegisterLog.getWechatAppId())
+                .eq(GameTencentUser::getWechatOpenid, roleRegisterLog.getWechatOpenid())
+                .eq(GameTencentUser::getAdAccountId, roleRegisterLog.getAdAccountId())
+                .orderByDesc(GameTencentUser::getCreateTime)
+                .last("limit 1")
+        );
+        if (user != null) {
+            if (BackStatusEnum.NO.getBackStatus().equals(user.getIsBack())) {
+                gameTencentUserService.userBack(user, true);
+            } else {
+                // 注册已回传,则默认认为创角也回传了
+                return BackStatusEnum.NO;
+            }
+        }
+        Map<String, Object> actionParam = new HashMap<>(2);
+        actionParam.put("claim_type", 0);
+        DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
+                .appId(roleRegisterLog.getWechatAppId())
+                .userActionSetId(roleRegisterLog.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(roleRegisterLog.getRegisterTime())
+                        .actionType(ActionTypeEnum.CREATE_ROLE.getActionType())
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .wechatAppId(roleRegisterLog.getWechatAppId())
+                                .wechatOpenid(roleRegisterLog.getWechatOpenid())
+                                .build())
+                        .actionParam(actionParam)
+                        .build())
+                .build();
+
+        GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
+                .gameId(roleRegisterLog.getGameId())
+                .adAccountId(roleRegisterLog.getAdAccountId())
+                .actionTime(roleRegisterLog.getRegisterTime())
+                .createTime(LocalDateTime.now())
+                .actionType(ActionTypeEnum.CREATE_ROLE.getActionType())
+                .wechatAppId(roleRegisterLog.getWechatAppId())
+                .wechatOpenid(roleRegisterLog.getWechatOpenid())
+                .userActionSetId(roleRegisterLog.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;
+    }
+}

+ 19 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/IPayBoxRpc.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.module.base.rpc;
+
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 支付盒子
+ */
+public interface IPayBoxRpc {
+
+    /**
+     * 支付盒子封禁
+     *
+     * @param appId : 支付盒子应用appId
+     * @return : 返回结果
+     */
+    ResultVO<Boolean> payBoxBan(String appId);
+}

+ 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服务启动成功 <客服系统, 新增授权接口3> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <客服系统, 新增授权接口4> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 19 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/PayBoxRpcImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.module.manage.rpc.impl;
+
+import com.zanxiang.game.module.base.rpc.IPayBoxRpc;
+import com.zanxiang.module.util.pojo.ResultVO;
+import org.apache.dubbo.config.annotation.DubboService;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 支付盒子
+ */
+@DubboService
+public class PayBoxRpcImpl implements IPayBoxRpc {
+
+    @Override
+    public ResultVO<Boolean> payBoxBan(String appId) {
+        return null;
+    }
+}

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

@@ -59,7 +59,7 @@ public class KfUserServiceImpl extends ServiceImpl<KfUserMapper, KfUser> impleme
         paramMap.put("Authorization", URIUtil.encodeURIComponent(SecurityUtil.getToken()));
         paramMap.put("appId", gameApplet.getAppId());
         paramMap.put("gameName", gameApplet.getAppName());
-        String uri = URIUtil.fillUrlParams("http://47.99.91.240:9001/scan/code/auto", paramMap, false);
+        String uri = URIUtil.fillUrlParams("http://47.99.157.216:8020/scan/code/auto", paramMap, false);
         return restTemplate.getForObject(uri, String.class);
     }
 

+ 11 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Game.java

@@ -121,4 +121,15 @@ public class Game implements Serializable {
      * ios游戏id
      */
     private Long iosGameId;
+
+    /**
+     * 导量游戏id
+     */
+    private String guideGameIds;
+
+    /**
+     * 是否通用包游戏
+     */
+    private Boolean isCommonGame;
+
 }

+ 71 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/ListenCall.java

@@ -0,0 +1,71 @@
+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 : 2024-01-16
+ * @description : 监听呼叫
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_listen_call")
+public class ListenCall implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 人员id
+     */
+    private Long userId;
+
+    /**
+     * 人员名称
+     */
+    private String userName;
+
+    /**
+     * 钉钉号
+     */
+    private String dingTalkNum;
+
+    /**
+     * 手机号
+     */
+    private String phoneNum;
+
+    /**
+     * 状态, 0 : 可用, 1 : 不可用
+     */
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/User.java

@@ -176,6 +176,11 @@ public class User implements Serializable {
      */
     private Long relationUserId;
 
+    /**
+     * 关联游戏id
+     */
+    private Long relationGameId;
+
     /**
      * 关联建立的时间
      */

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/ListenCallMapper.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.ListenCall;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 监听呼叫
+ */
+public interface ListenCallMapper extends BaseMapper<ListenCall> {
+}

+ 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服务启动成功 <兼容客服支付, 且发送指定客服消息, 优化阿里云市场接口> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <兼容ios通用客户端, 新增创角回传--01> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 7 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/AppletController.java

@@ -71,4 +71,11 @@ public class AppletController {
     public String wxAppletPayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException {
         return payApplicationService.appletStoreNotify(request, response);
     }
+
+    @UnSignCheck
+    @ApiOperation(value = "小程序接口封禁回调")
+    @GetMapping("/applet/pay/application/ban")
+    public ResultVO<Boolean> payApplicationBan(@RequestParam String orderId, @RequestParam String appId) {
+        return ResultVO.ok(payApplicationService.payApplicationBan(orderId, appId));
+    }
 }

+ 13 - 6
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IAliApiService.java

@@ -11,16 +11,23 @@ import reactor.util.function.Tuple2;
 public interface IAliApiService {
 
     /**
-     * 阿里实名认证, 仅用在测试环境
+     * 监听呼叫
      *
-     * @param cardName : 名字
-     * @param cardId   : 身份证
-     * @return : 返回检测结果
+     * @param gameId : 游戏id
+     * @param param  : 模块参数
+     */
+    void listenCall(Long gameId, String param);
+
+    /**
+     * 语音呼叫
+     *
+     * @param param  : 模块参数
+     * @param mobile : 手机号
      */
-    Tuple2<Boolean, String> authenticationCheck(String cardName, String cardId);
+    void phoneCall(String param, String mobile);
 
     /**
-     * 阿里实名认证, 包含归属地, 用在生产环境
+     * 阿里实名认证
      *
      * @param cardName : 名字
      * @param cardId   : 身份证

+ 10 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/ICallBackService.java

@@ -1,7 +1,9 @@
 package com.zanxiang.game.module.sdk.service;
 
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
 
 import java.util.Map;
 
@@ -20,6 +22,14 @@ public interface ICallBackService {
      */
     void userCallBack(User user, Map<String, String> urlParamMap);
 
+    /**
+     * 创角回传
+     *
+     * @param gameUserRole : 角色信息
+     * @param userData     : 用户信息
+     */
+    void roleCallBack(GameUserRole gameUserRole, UserData userData);
+
     /**
      * 订单回传
      *

+ 13 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IListenCallService.java

@@ -0,0 +1,13 @@
+package com.zanxiang.game.module.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 监听呼叫
+ */
+public interface IListenCallService extends IService<ListenCall> {
+
+}

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

@@ -19,6 +19,15 @@ import java.util.Map;
  */
 public interface IPayApplicationService extends IService<PayApplication> {
 
+    /**
+     * 支付盒子应用禁用
+     *
+     * @param orderId : 订单id
+     * @param appId   : 应用id
+     * @return : 返回结果
+     */
+    Boolean payApplicationBan(String orderId, String appId);
+
     /**
      * 获得支付应用程序
      *

+ 26 - 29
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AliApiServiceImpl.java

@@ -1,16 +1,20 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
 import cn.hutool.http.ContentType;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zanxiang.game.module.base.pojo.enums.StatusEnum;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
 import com.zanxiang.game.module.sdk.pojo.result.CardCheckResult;
 import com.zanxiang.game.module.sdk.pojo.result.IpCheckResult;
 import com.zanxiang.game.module.sdk.service.IAliApiService;
+import com.zanxiang.game.module.sdk.service.IListenCallService;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
@@ -18,7 +22,7 @@ import org.springframework.web.util.UriComponentsBuilder;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuples;
 
-import java.util.UUID;
+import java.util.List;
 
 /**
  * @author : lingfeng
@@ -32,12 +36,28 @@ public class AliApiServiceImpl implements IAliApiService {
     @Autowired
     private RestTemplate restTemplate;
 
+    @Autowired
+    private IListenCallService listenCallService;
+
     /**
      * 云市场应用标识
      */
     private final String APP_CODE = "f395b1587fc04a49a975f908660fb1e9";
 
-    public void phoneCall(String param) {
+    @Override
+    public void listenCall(Long gameId, String param) {
+        List<ListenCall> listenCallList = listenCallService.list(new LambdaQueryWrapper<ListenCall>()
+                .eq(ListenCall::getGameId, gameId)
+                .eq(ListenCall::getStatus, StatusEnum.YES.getCode())
+        );
+        if (CollectionUtils.isEmpty(listenCallList)) {
+            return;
+        }
+        listenCallList.forEach(listenCall -> this.phoneCall(param, listenCall.getPhoneNum()));
+    }
+
+    @Override
+    public void phoneCall(String param, String mobile) {
         RestTemplate restTemplate = new RestTemplate();
         String host = "https://jumfixed.market.alicloudapi.com/voice-notify/send";
         HttpHeaders headers = new HttpHeaders();
@@ -45,7 +65,7 @@ public class AliApiServiceImpl implements IAliApiService {
         headers.set("Content-Type", ContentType.FORM_URLENCODED.getValue());
         //参数
         MultiValueMap<String, String> requestParams = new LinkedMultiValueMap<>();
-        requestParams.add("mobile", "13100690278");
+        requestParams.add("mobile", mobile);
         requestParams.add("templateId", "JMJNAWUQOJP9");
         requestParams.add("param", param);
         String result = null;
@@ -59,29 +79,6 @@ public class AliApiServiceImpl implements IAliApiService {
         log.error("阿里语音呼叫结果, result : {}", result);
     }
 
-    @Override
-    public Tuple2<Boolean, String> authenticationCheck(String cardName, String cardId) {
-        String host = "https://dskj.market.alicloudapi.com/platform/check/verified";
-        String url = host + "?certCode=" + cardId + "&realName=" + cardName;
-        HttpHeaders headers = new HttpHeaders();
-        headers.set("Authorization", "APPCODE " + this.APP_CODE);
-        headers.set("X-Ca-Nonce", UUID.randomUUID().toString());
-        HttpEntity httpEntity = new HttpEntity<>(headers);
-        CardCheckResult result;
-        try {
-            String resultStr = restTemplate.postForObject(url, httpEntity, String.class);
-            result = JsonUtil.toObj(resultStr, CardCheckResult.class);
-        } catch (Exception e) {
-            log.error("请求阿里实名认证接口异常(OLD), cardName : {}, cardId : {}, e : {}", cardName, cardId, e.getMessage());
-            throw new BaseException("请求阿里实名认证接口异常");
-        }
-        if (result == null || !result.isSuccess()) {
-            log.error("请求阿里实名认证接口返回值为空(OLD), cardName : {}, cardId : {}, result : {}", cardName, cardId, JsonUtil.toString(result));
-            throw new BaseException("实名认证失败");
-        }
-        return Tuples.of(result.isPast(), Strings.EMPTY);
-    }
-
     @Override
     public Tuple2<Boolean, String> userCardCheck(String cardName, String cardId) {
         String url = "https://eid.shumaidata.com/eid/check";
@@ -98,11 +95,11 @@ public class AliApiServiceImpl implements IAliApiService {
             String body = responseEntity.getBody();
             result = JsonUtil.toObj(body, CardCheckResult.class);
         } catch (Exception e) {
-            log.error("请求阿里实名认证接口异常(NEW), cardName : {}, cardId : {}, e : {}", cardName, cardId, e.getMessage());
+            log.error("请求阿里实名认证接口异常, cardName : {}, cardId : {}, e : {}", cardName, cardId, e.getMessage());
             throw new BaseException("请求阿里实名认证接口异常");
         }
         if (result == null || result.isFail()) {
-            log.error("请求阿里实名认证接口返回值为空(NEW),cardName : {},cardId : {}, result : {}", cardName, cardId, JsonUtil.toString(result));
+            log.error("请求阿里实名认证接口返回值为空,cardName : {},cardId : {}, result : {}", cardName, cardId, JsonUtil.toString(result));
             throw new BaseException("实名认证失败");
         }
         log.error("实名认证结果, result : {}", JsonUtil.toString(result));

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

@@ -11,6 +11,7 @@ import com.zanxiang.game.module.base.pojo.enums.AccountTypeEnum;
 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;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.service.*;
 import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -110,6 +111,52 @@ public class CallBackServiceImpl implements ICallBackService {
         }
     }
 
+    @Override
+    public void roleCallBack(GameUserRole gameUserRole, UserData userData) {
+        //判断游戏是否开启广告回传, 未开启, 不回传
+        GameExt gameExt = gameExtService.getByGameId(userData.getGameId());
+        if (!Objects.equals(gameExt.getAdCallBackSwitch(), Boolean.TRUE)) {
+            return;
+        }
+        //用户信息
+        User user = userService.getById(userData.getUserId());
+        //用户渠道信息
+        Agent agent = agentService.getAgentByChannel(user.getChannel());
+        if (agent == null) {
+            return;
+        }
+        //查询小游戏信息或者H5游戏相关公众号信息
+        GameApplet gameApplet = gameAppletService.getOne(new LambdaQueryWrapper<GameApplet>()
+                .eq(GameApplet::getGameId, user.getGameId()));
+        log.error("用户创角回传, userId : {}", user.getId());
+        try {
+            //腾讯H5回传
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.TENCENT_H5.getValue())) {
+                TencentRoleRegisterRpcDTO tencentRoleRegisterRpcDTO = this.transform(user, agent, gameApplet, gameUserRole);
+                tencentUserActionBackRpc.backRoleRegister(tencentRoleRegisterRpcDTO);
+                gameBackLogService.addLog(user.getId(), gameUserRole.getRoleId(), "腾讯H5创角回传提交", JsonUtil.toString(tencentRoleRegisterRpcDTO));
+            }
+            //腾讯小游戏回传
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.TENCENT_MINI_GAME.getValue())) {
+                TencentRoleRegisterRpcDTO tencentRoleRegisterRpcDTO = this.transform(user, agent, gameApplet, gameUserRole);
+                tencentMiniGameBackRpc.backRoleRegister(tencentRoleRegisterRpcDTO);
+                gameBackLogService.addLog(user.getId(), gameUserRole.getRoleId(), "腾讯小游戏创角回传提交", JsonUtil.toString(tencentRoleRegisterRpcDTO));
+            }
+            //头条回传
+            if (Objects.equals(agent.getAccountType(), AccountTypeEnum.BYTE.getValue())) {
+                Game game = gameService.getById(user.getGameId());
+                //判断是微信小游戏
+                if (Objects.equals(game.getCategory(), GameCategoryEnum.CATEGORY_WX_APPLET.getId())) {
+                    TtRoleRegisterRpcDTO ttRoleRegisterRpcDTO = this.transform(user, agent, gameUserRole, gameApplet);
+                    ttMiniGameBackRpc.roleRegisterReport(ttRoleRegisterRpcDTO);
+                    gameBackLogService.addLog(user.getId(), gameUserRole.getRoleId(), "头条创角回传提交", JsonUtil.toString(ttRoleRegisterRpcDTO));
+                }
+            }
+        } catch (Exception e) {
+            log.error("创角回传异常, userId : {}, e : {}", user.getId(), e.getMessage());
+        }
+    }
+
     @Override
     public void orderCallBack(PlatformOrderDTO platformOrderDTO) {
         //判断游戏是否开启广告回传, 未开启, 不回传
@@ -160,6 +207,40 @@ public class CallBackServiceImpl implements ICallBackService {
         }
     }
 
+    private TencentRoleRegisterRpcDTO transform(User user, Agent agent, GameApplet gameApplet, GameUserRole gameUserRole) {
+        return TencentRoleRegisterRpcDTO.builder()
+                .backPolicyId(agent.getBackPolicyId())
+                .gameId(gameUserRole.getGameId())
+                .adAccountId(agent.getAccountId())
+                .registerTime(gameUserRole.getCreateTime())
+                .channel(agent.getAgentKey())
+                .wechatOpenid(user.getOpenId())
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .userActionSetId(agent.getUserActionSetId())
+                .roleId(gameUserRole.getRoleId())
+                .roleName(gameUserRole.getRoleName())
+                .build();
+    }
+
+    private TtRoleRegisterRpcDTO transform(User user, Agent agent, GameUserRole gameUserRole, GameApplet gameApplet) {
+        TtAccountRpcDTO ttAccountRpcDTO = TtAccountRpcDTO.builder()
+                .accountId(agent.getAccountId())
+                .reportToken(agent.getReportToken())
+                .reportUrl(agent.getReportUrl())
+                .build();
+        return TtRoleRegisterRpcDTO.builder()
+                .gameId(gameUserRole.getGameId())
+                .backPolicyId(agent.getBackPolicyId())
+                .accountReport(ttAccountRpcDTO)
+                .wechatAppId(gameApplet == null ? null : gameApplet.getAppId())
+                .wechatOpenId(user.getOpenId())
+                .agentKey(agent.getAgentKey())
+                .roleId(gameUserRole.getRoleId())
+                .roleName(gameUserRole.getRoleName())
+                .registerTime(gameUserRole.getCreateTime())
+                .build();
+    }
+
     private TencentUserDTO transform(User user, Agent agent, GameApplet gameApplet) {
         return TencentUserDTO.builder()
                 .backPolicyId(agent.getBackPolicyId())
@@ -209,6 +290,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .orderStatus(platformOrderDTO.getStatus())
                 .payTime(platformOrderDTO.getPayTime())
                 .userActionSetId(agent.getUserActionSetId())
+                .roleId(platformOrderDTO.getRoleId())
                 .roleName(platformOrderDTO.getRoleName())
                 .build();
     }
@@ -232,6 +314,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .createTime(platformOrderDTO.getCreateTime())
                 .payTime(platformOrderDTO.getPayTime())
                 .regTime(regTime)
+                .roleId(platformOrderDTO.getRoleId())
                 .roleName(platformOrderDTO.getRoleName())
                 .build();
     }

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

@@ -78,14 +78,12 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
 
     @Override
     public String appletMsgCheck(String appId, String signature, String timestamp, String nonce, String echoStr) throws Exception {
-        log.error("验证参数, appId : {}, signature : {}, timestamp : {}, nonce : {}, echoStr : {}", appId, signature, timestamp, nonce, echoStr);
         GameAppletDTO gameAppletDTO = this.getByAppId(appId);
         GameAppletDTO.MsgConfigBean msgConfigBean = gameAppletDTO.getMsgConfigBean();
         if (msgConfigBean == null) {
             throw new BaseException("参数错误, 小游戏应用缺少消息推送配置");
         }
         String mySignature = SignUtil.SHA1(msgConfigBean.getMsgPushToken(), timestamp, nonce);
-        log.error("计算出来的签名, signature : {},  mySignature : {}", signature, mySignature);
         if (!Objects.equals(mySignature, signature)) {
             throw new BaseException("验证签名不匹配");
         }
@@ -94,8 +92,6 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
 
     @Override
     public String appletMsg(String appId, String signature, String timestamp, String nonce, String postData) throws Exception {
-        log.error("接收到事件消息, appId : {}, signature : {}, timestamp : {}, nonce : {}, postData : {}",
-                appId, signature, timestamp, nonce, postData);
         String result = HttpStatusEnum.SUCCESS.getMsg();
         if (Strings.isBlank(postData)) {
             return result;
@@ -134,7 +130,6 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
     }
 
     private String miPayMessage(AppletMsgDTO appletMsgDTO, GameAppletDTO gameAppletDTO) {
-        log.error("米大师支付回调 appletMsgDTO : {}", JsonUtil.toString(appletMsgDTO));
         Map<String, Object> failResultMap = new HashMap<>(2);
         failResultMap.put("ErrCode", 99999L);
         failResultMap.put("ErrMsg", "internal error");
@@ -152,9 +147,7 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
         }
         //支付内容
         String payload = miniGame.getPayload();
-        log.error("-----------> 支付信息 payload : {}", payload);
         AppletMsgDTO.PayloadBean payloadBean = JsonUtil.toObj(payload, AppletMsgDTO.PayloadBean.class);
-        log.error("-----------> payload 对象转换成功 payloadBean : {}", JsonUtil.toString(payloadBean));
         if (payloadBean == null) {
             log.error("米大师支付回调参数错误, 没有支付信息 appletMsgDTO : {}", JsonUtil.toString(appletMsgDTO));
             return failResult;
@@ -176,7 +169,6 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
                     mySign, miniGame.getPayEventSig(), appKey);
             return failResult;
         }
-        log.error("米大师支付回调签名匹配成功, 开始计算业务数据--------------->");
         //更新订单信息
         Boolean miPayNotifyResult = miPayService.miPayNotify(payloadBean.getOutTradeNo(),
                 Tuples.of(weChatPayInfo.getMchOrderNo(), weChatPayInfo.getTransactionId()));
@@ -202,7 +194,8 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
 
     private String customLinkMessage(GameAppletDTO gameAppletDTO, UserDTO userDTO) {
         //判断是否配置了第三方客服链接
-        KfLink kfLink = kfLinkService.getById(gameAppletDTO.getAppId());
+        KfLink kfLink = kfLinkService.getOne(new LambdaQueryWrapper<KfLink>()
+                .eq(KfLink::getAppId, gameAppletDTO.getAppId()));
         if (kfLink == null || Strings.isBlank(kfLink.getCustomLink())) {
             return HttpStatusEnum.SUCCESS.getMsg();
         }

+ 6 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java

@@ -58,6 +58,9 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
     @Autowired
     private IUserTokenService userTokenService;
 
+    @Autowired
+    private ICallBackService callBackService;
+
     @Value("${spring.kafka.game-sdk.gameRoleActiveTopic}")
     private String gameRoleActiveTopic;
 
@@ -113,7 +116,7 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                     .set(param.getRoleVipLevel() != null, GameUserRole::getRoleVipLevel, param.getRoleVipLevel())
                     .set(param.getRolePower() != null, GameUserRole::getRolePower, param.getRolePower())
                     .set(GameUserRole::getUpdateTime, param.getRoleGradeUpdateTime() == null || param.getRoleGradeUpdateTime() <= 0 ? LocalDateTime.now() : DateUtil.secondToLocalDateTime(param.getRoleGradeUpdateTime()))
-                    .set(param.getExtra() != null, GameUserRole :: getExtra, JsonUtil.toString(param.getExtra()))
+                    .set(param.getExtra() != null, GameUserRole::getExtra, JsonUtil.toString(param.getExtra()))
                     .eq(GameUserRole::getUserId, userData.getUserId())
                     .eq(GameUserRole::getGameId, userData.getGameId())
                     .eq(GameUserRole::getRoleId, param.getRoleId()));
@@ -173,6 +176,8 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
                 .setSql("role_count=role_count+" + 1)
                 .set(User::getUpdateTime, LocalDateTime.now())
                 .eq(User::getId, gameUser.getUserId()));
+        //用户创角回传
+        callBackService.roleCallBack(userRole, userData);
         //释放锁
         distributedLockComponent.unlock(RedisKeyConstant.ROLE_UPDATE_KEY + "_" + userData.getUserId());
     }

+ 19 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/ListenCallServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.module.sdk.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
+import com.zanxiang.game.module.mybatis.mapper.ListenCallMapper;
+import com.zanxiang.game.module.sdk.service.IListenCallService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 监听呼叫
+ */
+@Slf4j
+@Service
+public class ListenCallServiceImpl extends ServiceImpl<ListenCallMapper, ListenCall> implements IListenCallService {
+
+}

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

@@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
-import com.zanxiang.game.module.mybatis.entity.*;
+import com.zanxiang.game.module.mybatis.entity.GameExt;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.entity.UserCard;
+import com.zanxiang.game.module.mybatis.entity.UserShare;
 import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.SmsTypeEnum;
@@ -94,9 +97,6 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Autowired
     private IUserAgentLogService userAgentLogService;
 
-    @Autowired
-    private IGameService gameService;
-
     @Autowired
     private IGameUserRoleService gameUserRoleService;
 
@@ -252,16 +252,14 @@ public class LoginServiceImpl implements IRegisterLoginService {
     }
 
     private Tuple2<Boolean, Long> userGuideCheck(User user) {
-        //游戏信息
-        Game game = gameService.getById(user.getGameId());
         //非导量用户
-        if (user.getRelationUserId() == null || game.getGuideGameId() == null) {
+        if (user.getRelationUserId() == null) {
             return Tuples.of(Boolean.FALSE, 0L);
         }
         //导量用户信息
         User relationUser = userService.getById(user.getRelationUserId());
         //确定导量匹配
-        if (relationUser != null && Objects.equals(relationUser.getRelationUserId(), user.getId())) {
+        if (relationUser != null) {
             try {
                 //监测角色是否导全, 或者导过之后又跑去小程序创建了其他角色
                 gameUserRoleService.userGuideGameRoleCheck(user, relationUser);

+ 25 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PayApplicationServiceImpl.java

@@ -2,7 +2,9 @@ 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.ServerInfo;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.base.rpc.IPayBoxRpc;
 import com.zanxiang.game.module.mybatis.entity.PayApplication;
 import com.zanxiang.game.module.mybatis.entity.PayMerchant;
 import com.zanxiang.game.module.mybatis.mapper.PayApplicationMapper;
@@ -11,7 +13,9 @@ import com.zanxiang.game.module.sdk.constant.WxPayConstants;
 import com.zanxiang.game.module.sdk.pojo.dto.PayApplicationDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.PayBoxDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.PayMerchantDTO;
+import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
 import com.zanxiang.game.module.sdk.pojo.param.MiniAppPayParam;
+import com.zanxiang.game.module.sdk.service.IOrderService;
 import com.zanxiang.game.module.sdk.service.IPayApplicationService;
 import com.zanxiang.game.module.sdk.service.IPayBoxService;
 import com.zanxiang.game.module.sdk.service.IPayMerchantService;
@@ -29,6 +33,7 @@ import com.zanxiang.module.web.util.IpUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -55,9 +60,15 @@ import java.util.Objects;
 @Service
 public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper, PayApplication> implements IPayApplicationService {
 
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IPayBoxRpc payBoxRpc;
+
     @Autowired
     private WxApiService wxApiService;
 
+    @Autowired
+    private IOrderService orderService;
+
     @Autowired
     private IPayMerchantService payMerchantService;
 
@@ -76,6 +87,20 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
     @Value("${payConfig.wxPay.appletNotifyUrl}")
     private String notifyUrl;
 
+    @Override
+    public Boolean payApplicationBan(String orderId, String appId) {
+        PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
+        if (platformOrderDTO == null) {
+            return Boolean.FALSE;
+        }
+        try {
+            payBoxRpc.payBoxBan(appId);
+        } catch (Exception e) {
+            log.error("调用后台支付盒子应用禁用异常, appId : {}, e : {}", appId, e.getMessage());
+        }
+        return Boolean.TRUE;
+    }
+
     @Override
     public PayApplicationDTO getPayApplicationByAppId(String appId) {
         PayApplication payApplication = super.getOne(new LambdaQueryWrapper<PayApplication>()

+ 1 - 6
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java

@@ -69,9 +69,6 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
     @Autowired
     private IGameAppletService gameAppletService;
 
-    @Autowired
-    private IGameService gameService;
-
     @Override
     @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
     public Boolean pushCp(PlatformOrderDTO orderInfo) {
@@ -87,12 +84,10 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
         }
         //用户信息
         User user = userService.getById(orderInfo.getUserId());
-        //游戏信息
-        Game game = gameService.getById(orderInfo.getGameId());
         //回调CP
         Map<String, String> map = new HashMap<>(9);
         //用户存在关联用户id, 且游戏存在导量游戏id, 判定为导量用户, 提交CP原始用户id
-        if (user.getRelationUserId() != null && game.getGuideGameId() != null) {
+        if (user.getRelationUserId() != null) {
             map.put("userId", String.valueOf(user.getRelationUserId()));
         } else {
             map.put("userId", String.valueOf(orderInfo.getUserId()));

+ 1 - 13
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserCardServiceImpl.java

@@ -17,7 +17,6 @@ import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 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 reactor.util.function.Tuple2;
@@ -46,12 +45,6 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
     @Autowired
     private IAliApiService aliApiService;
 
-    /**
-     * 服务器域名
-     */
-    @Value("${server.domain}")
-    private String serverUrl;
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
@@ -77,12 +70,7 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
             return ResultVO.fail(HttpStatusEnum.CARD_ID_ERROR.getMsg());
         }
         //阿里实名认证
-        Tuple2<Boolean, String> tuple2;
-        if (this.serverUrl.contains("test")) {
-            tuple2 = aliApiService.authenticationCheck(cardName, cardId);
-        } else {
-            tuple2 = aliApiService.userCardCheck(cardName, cardId);
-        }
+        Tuple2<Boolean, String> tuple2 = aliApiService.userCardCheck(cardName, cardId);
         //实名认证失败
         if (!tuple2.getT1()) {
             return ResultVO.fail(HttpStatusEnum.AUTHENTICATION_FAIL.getMsg());

+ 1 - 6
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserServiceImpl.java

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
-import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.entity.GameExt;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserCard;
@@ -50,9 +49,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Autowired
     private IUserCardService userCardService;
 
-    @Autowired
-    private IGameService gameService;
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<Boolean> findPassword(FindPasswordParam param, UserData userData) {
@@ -192,8 +188,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
                 .token(userData.getToken())
                 .build();
         //判断用户是否为导量H5用户, 修正用户id
-        Game game = gameService.getById(user.getGameId());
-        if (user.getRelationUserId() != null && game.getGuideGameId() != null) {
+        if (user.getRelationUserId() != null) {
             userVO.setUserId(user.getRelationUserId());
         }
         log.error("获取用户详情返回用户信息, userVO : {}", JsonUtil.toString(userVO));

+ 3 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java

@@ -203,6 +203,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", "");
         } catch (Exception e) {
             log.error("支付宝H5支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
+            this.listenCall(product.getGameId(), "支付宝H5支付");
             throw new BaseException("支付宝H5支付异常");
         }
         //请求失败
@@ -306,6 +307,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "");
         } catch (Exception e) {
             log.error("支付宝pc端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
+            this.listenCall(product.getGameId(), "支付宝pc端支付");
             throw new BaseException("支付宝pc端支付异常");
         }
         if (!ResponseChecker.success(response)) {
@@ -327,6 +329,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee());
         } catch (Exception e) {
             log.error("支付宝app端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
+            this.listenCall(product.getGameId(), "支付宝app端支付");
             throw new BaseException("支付宝app端支付异常");
         }
         if (!ResponseChecker.success(response)) {

+ 12 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/PayBaseService.java

@@ -9,6 +9,7 @@ import com.zanxiang.game.module.sdk.listener.OrderPaySuccessEvent;
 import com.zanxiang.game.module.sdk.pojo.dto.GamePayWayDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.ProductPayParamDTO;
+import com.zanxiang.game.module.sdk.service.IAliApiService;
 import com.zanxiang.game.module.sdk.service.IGamePayWayService;
 import com.zanxiang.game.module.sdk.service.IOrderService;
 import com.zanxiang.game.module.sdk.util.RedisUtil;
@@ -51,6 +52,9 @@ public abstract class PayBaseService {
     @Autowired
     private RedisUtil<String> redisUtil;
 
+    @Lazy
+    @Autowired
+    private IAliApiService aliApiService;
 
     /**
      * 创建订单支付参数
@@ -124,6 +128,14 @@ public abstract class PayBaseService {
         log.error("订单添加过期缓存, orderId : {}, expire : {}", orderId, expire);
     }
 
+    public void listenCall(Long gameId, String param) {
+        try {
+            aliApiService.listenCall(gameId, param);
+        } catch (Exception e) {
+            log.error("监听呼叫调用异常, gameId : {}, param : {}", gameId.toString(), param);
+        }
+    }
+
     /**
      * 支付调起
      *

+ 1 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

@@ -351,6 +351,7 @@ public class WxPayService extends PayBaseService {
             throw new BaseException("微信小程序支付下单失败");
         } catch (Exception e) {
             log.error("微信支付通信异常, 订单号:{}, e : {}", product.getOutTradeNo(), e.getMessage());
+            this.listenCall(product.getGameId(), "微信支付通道");
             throw new BaseException("微信小程序支付下单异常");
         }
     }

+ 4 - 4
game-module/game-module-sdk/src/main/resources/logback.xml

@@ -20,8 +20,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30天 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -42,8 +42,8 @@
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
             <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
-            <!-- 日志最大的历史 60天 -->
-            <maxHistory>60</maxHistory>
+            <!-- 日志最大的历史 30天 -->
+            <maxHistory>30</maxHistory>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>