Bladeren bron

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

zhangxianyu 9 maanden geleden
bovenliggende
commit
bc71425eff
51 gewijzigde bestanden met toevoegingen van 1404 en 306 verwijderingen
  1. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentAppApiUserAgentQueryRpcDTO.java
  2. 1 1
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentRoleRegisterAppApiRpcDTO.java
  3. 7 5
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserAppApiRpcDTO.java
  4. 4 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppUserAgentQueryRpcDTO.java
  5. 2 0
      game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtUserActiveAppRpcDTO.java
  6. 50 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/OceanengineAppController.java
  7. 82 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppOrderLogDTO.java
  8. 60 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppUserLogDTO.java
  9. 2 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppUserLog.java
  10. 9 5
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppApiUser.java
  11. 2 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/ActionTypeEnum.java
  12. 100 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppOrderLogVO.java
  13. 33 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppOrderSplitLogVO.java
  14. 63 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppUserLogVO.java
  15. 21 8
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppApiBackRpcImpl.java
  16. 9 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java
  17. 3 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackService.java
  18. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppOrderLogService.java
  19. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppOrderSplitLogService.java
  20. 5 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppUserLogService.java
  21. 4 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppApiRoleRegisterService.java
  22. 3 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppCallbackService.java
  23. 18 13
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackServiceImpl.java
  24. 84 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderLogServiceImpl.java
  25. 34 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderSplitLogServiceImpl.java
  26. 62 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppUserLogServiceImpl.java
  27. 49 44
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiOrderServiceImpl.java
  28. 89 4
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiRoleRegisterServiceImpl.java
  29. 45 46
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiUserServiceImpl.java
  30. 21 11
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppCallbackServiceImpl.java
  31. 17 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/order/GameServerSonMergeMapper.java
  32. 41 6
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/BigRDTO.java
  33. 149 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/order/GameServerSonMerge.java
  34. 80 6
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsRoleAmountDataParent.java
  35. 39 79
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/BigRVO.java
  36. 19 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IGameServerSonMergeService.java
  37. 69 53
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountDataParentServiceImpl.java
  38. 1 1
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerServiceImpl.java
  39. 34 0
      game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerSonMergeServiceImpl.java
  40. 11 11
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java
  41. 10 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/Game.java
  42. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  43. 2 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/adapter/WebHandlerAdapter.java
  44. 10 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/AppletController.java
  45. 6 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/UserLoginVO.java
  46. 10 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameAppletService.java
  47. 2 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CallBackServiceImpl.java
  48. 24 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameAppletServiceImpl.java
  49. 2 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  50. 1 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java
  51. 2 4
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

+ 2 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentAppApiUserAgentQueryRpcDTO.java

@@ -10,6 +10,8 @@ public class TencentAppApiUserAgentQueryRpcDTO implements Serializable {
 
     private Long gameId;
 
+    private String userId;
+
     /**
      * 设备唯一编号IMEI
      */

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

@@ -34,7 +34,7 @@ public class TencentRoleRegisterAppApiRpcDTO implements Serializable {
      */
     private Long adAccountId;
     /**
-     * 注册时间
+     * 创角时间
      */
     private LocalDateTime registerTime;
 

+ 7 - 5
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TencentUserAppApiRpcDTO.java

@@ -36,11 +36,6 @@ public class TencentUserAppApiRpcDTO implements Serializable {
      */
     private LocalDateTime registerTime;
 
-    /**
-     * 关注时间
-     */
-    private LocalDateTime subscribeTime;
-
     /**
      * 渠道号
      */
@@ -74,4 +69,11 @@ public class TencentUserAppApiRpcDTO implements Serializable {
      * IOS设备CAID
      */
     private String caid;
+
+    private String regIp;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
 }

+ 4 - 0
game-back/game-back-base/src/main/java/com/zanxiang/game/back/base/pojo/dto/TtAppUserAgentQueryRpcDTO.java

@@ -10,6 +10,10 @@ public class TtAppUserAgentQueryRpcDTO implements Serializable {
 
     private Long gameId;
 
+    private Long userId;
+
+    private String mac;
+
     /**
      * 设备唯一编号IMEI
      */

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

@@ -70,4 +70,6 @@ public class TtUserActiveAppRpcDTO implements Serializable {
      * IOS设备CAID
      */
     private String caid;
+
+    private String regIp;
 }

+ 50 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/OceanengineAppController.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.back.serve.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppOrderLogDTO;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppUserLogDTO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderSplitLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
+import com.zanxiang.game.back.serve.service.*;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequestMapping("/oceanengineApp")
+@Api("头条APP回传策略")
+public class OceanengineAppController {
+    @Autowired
+    private IGameOceanengineAppUserLogService gameOceanengineAppUserLogService;
+    @Autowired
+    private IGameOceanengineAppOrderLogService gameOceanengineAppOrderLogService;
+    @Autowired
+    private IGameOceanengineAppOrderSplitLogService gameOceanengineAppOrderSplitLogService;
+
+    @PreAuthorize(permissionKey = "gameBack:oceanengineApp:orderLogs")
+    @PostMapping("/orderLogs")
+    @ApiOperation(value = "头条订单回传日志列表")
+    public ResultVO<IPage<GameOceanengineAppOrderLogVO>> oceanengineAppOrderLogList(@RequestBody GameOceanengineAppOrderLogDTO dto) {
+        return ResultVO.ok(gameOceanengineAppOrderLogService.oceanengineAppOrderLogList(dto));
+    }
+
+    @PreAuthorize(permissionKey = "gameBack:oceanengineApp:orderLogs")
+    @GetMapping("/orderSplitList/{orderId}")
+    public ResultVO<List<GameOceanengineAppOrderSplitLogVO>> orderSplitList(@PathVariable("orderId") String orderId) {
+        return ResultVO.ok(gameOceanengineAppOrderSplitLogService.listByOrderNo(Collections.singletonList(orderId)));
+    }
+
+    @PreAuthorize(permissionKey = "gameBack:oceanengineApp:userLogs")
+    @PostMapping("/userLogs")
+    @ApiOperation(value = "头条用户回传日志列表")
+    public ResultVO<IPage<GameOceanengineAppUserLogVO>> oceanengineAppUserLogList(@RequestBody GameOceanengineAppUserLogDTO dto) {
+        return ResultVO.ok(gameOceanengineAppUserLogService.oceanengineAppUserLogList(dto));
+    }
+}

+ 82 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppOrderLogDTO.java

@@ -0,0 +1,82 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineOrderSplitLogVO;
+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;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineAppOrderLogDTO extends BaseListDTO<GameOceanengineAppOrderLog> {
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户设备mac地址")
+    private String mac;
+
+    @ApiModelProperty("设备唯一编号IMEI")
+    private String imei;
+
+    @ApiModelProperty("设备OAID")
+    private String oaid;
+
+    @ApiModelProperty("安卓id, (仅安卓设备才有值)")
+    private String androidId;
+
+    @ApiModelProperty("IOS设备IDFA")
+    private String idfa;
+
+    @ApiModelProperty("IOS设备CAID")
+    private String caid;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty("支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消")
+    private Integer orderStatus;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate regTimeBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate regTimeEnd;
+
+    @ApiModelProperty("回传状态 -1:回传失败;0:未回传;1:回传")
+    private Integer backStatus;
+
+    @ApiModelProperty("角色名")
+    private String roleName;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMin;
+
+    @ApiModelProperty("充值到支付的间隔时间(分)")
+    private Long regPayIntervalTimeMax;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
+
+}

+ 60 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameOceanengineAppUserLogDTO.java

@@ -0,0 +1,60 @@
+package com.zanxiang.game.back.serve.pojo.dto;
+
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+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 GameOceanengineAppUserLogDTO extends BaseListDTO<GameOceanengineAppUserLog> {
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户设备mac地址")
+    private String mac;
+
+    @ApiModelProperty("设备唯一编号IMEI")
+    private String imei;
+
+    @ApiModelProperty("设备OAID")
+    private String oaid;
+
+    @ApiModelProperty("安卓id, (仅安卓设备才有值)")
+    private String androidId;
+
+    @ApiModelProperty("IOS设备IDFA")
+    private String idfa;
+
+    @ApiModelProperty("IOS设备CAID")
+    private String caid;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate activeTimeBegin;
+
+    @ApiModelProperty("注册时间")
+    private LocalDate activeTimeEnd;
+}

+ 2 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameOceanengineAppUserLog.java

@@ -86,5 +86,7 @@ public class GameOceanengineAppUserLog implements Serializable {
 
     private LocalDateTime createTime;
 
+    private String ip;
+
 
 }

+ 9 - 5
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameTencentAppApiUser.java

@@ -53,11 +53,6 @@ public class GameTencentAppApiUser implements Serializable {
      */
     private LocalDateTime registerTime;
 
-    /**
-     * 关注时间
-     */
-    private LocalDateTime subscribeTime;
-
     /**
      * 用户设备mac地址
      */
@@ -109,5 +104,14 @@ public class GameTencentAppApiUser implements Serializable {
      */
     private Long backPolicyId;
 
+    private String ip;
+
+    /**
+     * 数据源ID
+     */
+    private Long userActionSetId;
+
+    private Long callbackId;
+
 
 }

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

@@ -9,7 +9,8 @@ public enum ActionTypeEnum {
     REGISTER("REGISTER","注册"),
     PURCHASE("PURCHASE","付费"),
     CREATE_ROLE("CREATE_ROLE","创角"),
-    COMPLETE_ORDER("COMPLETE_ORDER","下单");
+    COMPLETE_ORDER("COMPLETE_ORDER","下单"),
+    ACTIVATE_APP("ACTIVATE_APP", "激活应用");
 
 
     private String ActionType;

+ 100 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppOrderLogVO.java

@@ -0,0 +1,100 @@
+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;
+import java.util.List;
+
+/**
+ * 头条订单上报日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameOceanengineAppOrderLogVO {
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户设备mac地址")
+    private String mac;
+
+    @ApiModelProperty("设备唯一编号IMEI")
+    private String imei;
+
+    @ApiModelProperty("设备OAID")
+    private String oaid;
+
+    @ApiModelProperty("安卓id, (仅安卓设备才有值)")
+    private String androidId;
+
+    @ApiModelProperty("IOS设备IDFA")
+    private String idfa;
+
+    @ApiModelProperty("IOS设备CAID")
+    private String caid;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("回传策略ID")
+    private Long backPolicyId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty("订单金额(分)")
+    private Long amount;
+
+    @ApiModelProperty("支付状态,0 : 预下单, 1 : 待支付,2 : 支付成功,-1 : 已取消")
+    private Integer orderStatus;
+
+    @ApiModelProperty("下单时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("支付时间")
+    private LocalDateTime payTime;
+
+    @ApiModelProperty("注册时间")
+    private LocalDateTime regTime;
+
+    @ApiModelProperty("回传状态 -1:回传失败;0:未回传;1:回传")
+    private Integer backStatus;
+
+    @ApiModelProperty("角色ID")
+    private String roleId;
+
+    @ApiModelProperty("角色名")
+    private String roleName;
+
+    @ApiModelProperty("注册到付费的间隔时间")
+    private String regPayIntervalTime;
+
+    @ApiModelProperty("是否是首单")
+    private Boolean isFirstOrder;
+
+    @ApiModelProperty("回传金额")
+    private Long backMoney;
+
+    @ApiModelProperty("回传日志")
+    private String backMsg;
+
+    @ApiModelProperty("回传拆分订单")
+    private List<GameOceanengineAppOrderSplitLogVO> splitOrderList;
+}

+ 33 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppOrderSplitLogVO.java

@@ -0,0 +1,33 @@
+package com.zanxiang.game.back.serve.pojo.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+public class GameOceanengineAppOrderSplitLogVO {
+
+    private Long id;
+
+    private LocalDate backDay;
+
+    private String orderNo;
+
+    private Integer backIndex;
+
+    private Integer backCount;
+
+    private BigDecimal splitMoney;
+
+    private LocalDateTime backTime;
+
+    private LocalDateTime executeTime;
+
+    private Integer backStatus;
+
+    private String backErrorMsg;
+
+    private LocalDateTime createTime;
+}

+ 63 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameOceanengineAppUserLogVO.java

@@ -0,0 +1,63 @@
+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 GameOceanengineAppUserLogVO {
+    @ApiModelProperty("主键ID")
+    private Long id;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户设备mac地址")
+    private String mac;
+
+    @ApiModelProperty("设备唯一编号IMEI")
+    private String imei;
+
+    @ApiModelProperty("设备OAID")
+    private String oaid;
+
+    @ApiModelProperty("安卓id, (仅安卓设备才有值)")
+    private String androidId;
+
+    @ApiModelProperty("IOS设备IDFA")
+    private String idfa;
+
+    @ApiModelProperty("IOS设备CAID")
+    private String caid;
+
+    @ApiModelProperty("游戏ID")
+    private Long gameId;
+
+    @ApiModelProperty("广告账号ID")
+    private Long accountId;
+
+    @ApiModelProperty("渠道标识")
+    private String agentKey;
+
+    @ApiModelProperty("渠道名称")
+    private String agentName;
+
+    @ApiModelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("注册/激活时间")
+    private LocalDateTime activeTime;
+
+    @ApiModelProperty("回传状态")
+    private Integer backStatus;
+}

+ 21 - 8
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TencentAppApiBackRpcImpl.java

@@ -59,13 +59,14 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
                 && StringUtils.isBlank(dto.getCaid())) {
             return ResultVO.fail("找不到用户唯一标识");
         }
-        GameTencentAppApiUser gameTencentUser = GameTencentAppApiUser.builder()
+        GameTencentAppApiUser userLog = GameTencentAppApiUser.builder()
                 .userId(dto.getUserId())
                 .adAccountId(dto.getAdAccountId())
                 .gameId(dto.getGameId())
                 .channel(dto.getChannel())
-                .subscribeTime(dto.getSubscribeTime())
                 .registerTime(dto.getRegisterTime())
+                .ip(dto.getRegIp())
+                .userActionSetId(dto.getUserActionSetId())
                 .mac(dto.getMac())
                 .imei(dto.getImei())
                 .oaid(dto.getOaid())
@@ -75,7 +76,10 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
                 .isBack(BackStatusEnum.NO.getBackStatus())
                 .createTime(LocalDateTime.now())
                 .build();
-        gameTencentAppApiUserService.save(gameTencentUser);
+
+        GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(userLog.getGameId(), userLog.getImei(), userLog.getOaid(), userLog.getAndroidId(), userLog.getIdfa(), userLog.getCaid(), userLog.getIp(), userLog.getRegisterTime());
+        userLog.setCallbackId(callback == null ? -1L : callback.getId());
+        gameTencentAppApiUserService.save(userLog);
         return ResultVO.ok(true);
         // 激活现在默认不回传了,等创角的时候一起回传
         // return ResultVO.ok(gameTencentAppApiUserService.userBack(gameTencentUser, false));
@@ -83,7 +87,7 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
 
     @Override
     public ResultVO<Boolean> backRoleRegister(TencentRoleRegisterAppApiRpcDTO dto) {
-        log.error("腾讯 APP创角回传收到:{}", JsonUtil.toString(dto));
+        log.error("腾讯 APP-API 创角回传收到:{}", JsonUtil.toString(dto));
         if (StringUtils.isBlank(dto.getMac())) {
             dto.setMac("");
         }
@@ -134,9 +138,9 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
     @Override
     public ResultVO<Boolean> backOrder(TencentOrderAppApiRpcDTO dto) {
         if (Objects.equals(OrderStatusEnum.SUCCESS_PAY.getValue(), dto.getOrderStatus())) {
-            log.error("腾讯 APP订单回传收到:{}。", JsonUtil.toString(dto));
+            log.error("腾讯 APP-API 订单回传收到:{}。", JsonUtil.toString(dto));
         } else {
-            log.error("腾讯H5订单回传收到:{}。订单未支付,直接过滤", JsonUtil.toString(dto));
+            log.error("腾讯 APP-API 订单回传收到:{}。订单未支付,直接过滤", JsonUtil.toString(dto));
             return ResultVO.ok(true);
         }
         if (StringUtils.isBlank(dto.getMac())) {
@@ -204,7 +208,16 @@ public class TencentAppApiBackRpcImpl implements ITencentAppApiBackRpc {
 
     @Override
     public ResultVO<String> queryUserAgentFromCallback(TencentAppApiUserAgentQueryRpcDTO dto) {
-        GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(dto.getGameId(), dto.getImei(), dto.getOaid(), dto.getAndroidId(), dto.getIdfa(), dto.getCaid());
-        return ResultVO.ok(callback == null ? null : callback.getAgentKey());
+        GameTencentAppApiUser user = gameTencentAppApiUserService.getOne(new LambdaQueryWrapper<GameTencentAppApiUser>()
+                .eq(GameTencentAppApiUser::getGameId, dto.getGameId())
+                .eq(GameTencentAppApiUser::getUserId, dto.getUserId())
+                .orderByDesc(GameTencentAppApiUser::getCreateTime)
+                .last("limit 1")
+        );
+        if(user == null || user.getCallbackId() == null || user.getCallbackId() < 1) {
+            return ResultVO.ok(null);
+        }
+        GameTencentAppCallback callback = gameTencentAppCallbackService.getById(user.getCallbackId());
+        return ResultVO.ok(callback.getAgentKey());
     }
 }

+ 9 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -92,6 +92,7 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
                 .accountId(dto.getAccountReport().getAccountId())
                 .agentKey(dto.getAgentKey())
                 .activeTime(dto.getActiveTime())
+                .ip(dto.getRegIp())
                 .backStatus(BackStatusEnum.NO.getBackStatus())
                 .createTime(LocalDateTime.now())
                 .build();
@@ -268,7 +269,14 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
 
     @Override
     public ResultVO<String> queryUserAgentFromCallback(TtAppUserAgentQueryRpcDTO dto) {
-        GameOceanengineAppCallback callback = gameOceanengineAppCallbackService.getUserCallback(dto.getGameId(), dto.getImei(), dto.getOaid(), dto.getAndroidId(), dto.getIdfa(), dto.getCaid());
+        GameOceanengineAppUserLog userLog = gameOceanengineAppUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppUserLog>()
+                        .eq(GameOceanengineAppUserLog::getGameId, dto.getGameId())
+                .eq(GameOceanengineAppUserLog::getUserId, dto.getUserId())
+        );
+        if (userLog == null) {
+            return ResultVO.fail("找不到用户. gameId: " + dto.getGameId() + ", userId: " + dto.getUserId());
+        }
+        GameOceanengineAppCallback callback = gameOceanengineAppCallbackService.getUserCallback(dto.getGameId(), dto.getOaid(), dto.getMac(), dto.getIdfa(), dto.getCaid(), userLog.getIp(), userLog.getActiveTime());
         return ResultVO.ok(callback == null ? null : callback.getAgentKey());
     }
 

+ 3 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameOceanengineAppCallbackService.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppCallbackDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppCallback;
 
+import java.time.LocalDateTime;
+
 public interface IGameOceanengineAppCallbackService extends IService<GameOceanengineAppCallback> {
 
     boolean callback(GameOceanengineAppCallbackDTO dto);
 
-    GameOceanengineAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid);
+    GameOceanengineAppCallback getUserCallback(Long gameId, String oaid, String mac, String idfa, String caid, String ip, LocalDateTime regTime);
 }

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

@@ -1,9 +1,12 @@
 package com.zanxiang.game.back.serve.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppOrderLogDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderLogVO;
 
 import java.time.LocalDateTime;
 
@@ -12,4 +15,6 @@ public interface IGameOceanengineAppOrderLogService extends IService<GameOceanen
     boolean callback(GameOceanengineAppOrderLog orderLog);
 
     Tuple2<BackStatusEnum, String> doCallback(GameOceanengineAppOrderLog orderLog, LocalDateTime backTime, Long backMoney);
+
+    IPage<GameOceanengineAppOrderLogVO> oceanengineAppOrderLogList(GameOceanengineAppOrderLogDTO dto);
 }

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

@@ -2,6 +2,11 @@ package com.zanxiang.game.back.serve.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderSplitLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderSplitLogVO;
+
+import java.util.Collection;
+import java.util.List;
 
 public interface IGameOceanengineAppOrderSplitLogService extends IService<GameOceanengineAppOrderSplitLog> {
+    List<GameOceanengineAppOrderSplitLogVO> listByOrderNo(Collection<String> orderNos);
 }

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

@@ -1,9 +1,14 @@
 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.GameOceanengineAppUserLogDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
 
 public interface IGameOceanengineAppUserLogService extends IService<GameOceanengineAppUserLog> {
 
     boolean callback(GameOceanengineAppUserLog userLog, boolean mustBack);
+
+    IPage<GameOceanengineAppUserLogVO> oceanengineAppUserLogList(GameOceanengineAppUserLogDTO dto);
 }

+ 4 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppApiRoleRegisterService.java

@@ -3,7 +3,11 @@ package com.zanxiang.game.back.serve.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppApiRoleRegister;
 
+import java.util.List;
+
 public interface IGameTencentAppApiRoleRegisterService extends IService<GameTencentAppApiRoleRegister> {
 
     boolean roleRegisterBack(GameTencentAppApiRoleRegister roleRegisterLog);
+
+    boolean tencentUserReport(List<Long> ids);
 }

+ 3 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/IGameTencentAppCallbackService.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentAppCallbackDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppCallback;
 
+import java.time.LocalDateTime;
+
 public interface IGameTencentAppCallbackService extends IService<GameTencentAppCallback> {
 
     boolean callback(GameTencentAppCallbackDTO dto);
 
-    GameTencentAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid);
+    GameTencentAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid, String ip, LocalDateTime regTime);
 }

+ 18 - 13
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppCallbackServiceImpl.java

@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 @Slf4j
 @Service
@@ -63,24 +64,28 @@ implements IGameOceanengineAppCallbackService {
     }
 
     @Override
-    public GameOceanengineAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid) {
+    public GameOceanengineAppCallback getUserCallback(Long gameId, String oaid, String mac, String idfa, String caid, String ip, LocalDateTime regTime) {
         LambdaQueryWrapper<GameOceanengineAppCallback> qw = new LambdaQueryWrapper<GameOceanengineAppCallback>()
+                .lt(GameOceanengineAppCallback::getTs, DateUtil.localDateTimeToMilli(regTime))
                 .eq(GameOceanengineAppCallback::getGameId, gameId)
                 .orderByDesc(GameOceanengineAppCallback::getTs)
                 .last("limit 1");
-        if (StringUtils.isNoneBlank(imei) || StringUtils.isNoneBlank(android) || StringUtils.isNoneBlank(oaid)) {
-            qw.and(and -> {
-                and.eq(StringUtils.isNoneBlank(imei), GameOceanengineAppCallback::getImei, StringUtils.isBlank(imei) ? null : Md5Util.encrypt32(imei).toLowerCase())
-                        .or().eq(StringUtils.isNoneBlank(android), GameOceanengineAppCallback::getAndroidid, StringUtils.isBlank(android) ? null : Md5Util.encrypt32(android).toLowerCase())
-                        .or().eq(StringUtils.isNoneBlank(oaid), GameOceanengineAppCallback::getOaid, oaid)
-                        .or().eq(StringUtils.isNoneBlank(oaid), GameOceanengineAppCallback::getOaidMd5, StringUtils.isBlank(oaid) ? null : Md5Util.encrypt32(oaid).toLowerCase());
-            });
-        } else if (StringUtils.isNoneBlank(idfa)) {
-            qw.and(and -> {
-                and.eq(GameOceanengineAppCallback::getIdfaMd5, StringUtils.isBlank(idfa) ? null : Md5Util.encrypt32(idfa).toLowerCase())
+
+        qw.and(and -> {
+            if(StringUtils.isNoneBlank(oaid)) {
+                and.or().eq(GameOceanengineAppCallback::getOaid, oaid)
+                        .or().eq(GameOceanengineAppCallback::getOaidMd5, Md5Util.encrypt32(oaid).toLowerCase());
+            }
+            if (StringUtils.isNoneBlank(idfa)) {
+                and.or().eq(GameOceanengineAppCallback::getIdfaMd5, Md5Util.encrypt32(idfa).toLowerCase())
                         .or().eq(GameOceanengineAppCallback::getIdfa, idfa);
-            });
-        }
+            }
+            and.or().eq(StringUtils.isNoneBlank(mac), GameOceanengineAppCallback::getMac, StringUtils.isBlank(oaid) ? null : Md5Util.encrypt32(mac.replaceAll(":","").toUpperCase()).toLowerCase())
+                    .or().and(StringUtils.isNoneBlank(ip), tmp -> {
+                        tmp.ge(GameOceanengineAppCallback::getTs, DateUtil.localDateTimeToMilli(regTime.plusDays(2)))
+                                .eq(GameOceanengineAppCallback::getIp, ip);
+                    });
+        });
         return getOne(qw);
     }
 }

+ 84 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderLogServiceImpl.java

@@ -3,30 +3,46 @@ 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.github.sd4324530.jtuple.Tuple2;
 import com.github.sd4324530.jtuple.Tuple3;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppOrderLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppOrderLogDTO;
 import com.zanxiang.game.back.serve.pojo.entity.*;
 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.*;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderLogVO;
 import com.zanxiang.game.back.serve.service.*;
 import com.zanxiang.game.back.serve.utils.BackPolicyUtil;
+import com.zanxiang.game.back.serve.utils.OrderUtil;
+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.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
 public class GameOceanengineAppOrderLogServiceImpl extends ServiceImpl<GameOceanengineAppOrderLogMapper, GameOceanengineAppOrderLog>
-implements IGameOceanengineAppOrderLogService {
+        implements IGameOceanengineAppOrderLogService {
 
     @Autowired
     private IGameBackPolicyService gameBackPolicyService;
@@ -36,6 +52,8 @@ implements IGameOceanengineAppOrderLogService {
     private IGameOceanengineAppBackLogService gameOceanengineAppBackLogService;
     @Autowired
     private IGameOceanengineAppOrderSplitLogService gameOceanengineAppOrderSplitLogService;
+    @DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
+    private IAgentRpc agentRpc;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -164,6 +182,71 @@ implements IGameOceanengineAppOrderLogService {
         return Tuple2.with(backStatus, errMsg);
     }
 
+    @Override
+    public IPage<GameOceanengineAppOrderLogVO> oceanengineAppOrderLogList(GameOceanengineAppOrderLogDTO dto) {
+        IPage<GameOceanengineAppOrderLog> page = page(dto.toPage(), new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
+                .eq(StringUtils.isNotBlank(dto.getUserId()), GameOceanengineAppOrderLog::getUserId, dto.getUserId())
+                .eq(StringUtils.isNotBlank(dto.getMac()), GameOceanengineAppOrderLog::getMac, dto.getMac())
+                .eq(StringUtils.isNotBlank(dto.getImei()), GameOceanengineAppOrderLog::getImei, dto.getImei())
+                .eq(StringUtils.isNotBlank(dto.getOaid()), GameOceanengineAppOrderLog::getOaid, dto.getOaid())
+                .eq(StringUtils.isNotBlank(dto.getAndroidId()), GameOceanengineAppOrderLog::getAndroidId, dto.getAndroidId())
+                .eq(StringUtils.isNotBlank(dto.getIdfa()), GameOceanengineAppOrderLog::getIdfa, dto.getIdfa())
+                .eq(StringUtils.isNotBlank(dto.getCaid()), GameOceanengineAppOrderLog::getCaid, dto.getCaid())
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameOceanengineAppOrderLog::getAgentKey, dto.getAgentKey())
+                .ge(dto.getRegTimeBegin() != null, GameOceanengineAppOrderLog::getRegTime, dto.getRegTimeBegin() == null ? null : LocalDateTime.of(dto.getRegTimeBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getRegTimeEnd() != null, GameOceanengineAppOrderLog::getRegTime, dto.getRegTimeEnd() == null ? null : LocalDateTime.of(dto.getRegTimeEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameOceanengineAppOrderLog::getGameId, dto.getGameId())
+                .eq(null != dto.getAccountId(), GameOceanengineAppOrderLog::getAccountId, dto.getAccountId())
+                .eq(StringUtils.isNotBlank(dto.getOrderNo()), GameOceanengineAppOrderLog::getOrderNo, dto.getOrderNo())
+                .eq(null != dto.getBackStatus(), GameOceanengineAppOrderLog::getBackStatus, dto.getBackStatus())
+                .eq(dto.getIsFirstOrder() != null, GameOceanengineAppOrderLog::getIsFirstOrder, dto.getIsFirstOrder())
+                .eq(null != dto.getOrderStatus(), GameOceanengineAppOrderLog::getOrderStatus, dto.getOrderStatus())
+                .like(StringUtils.isNotBlank(dto.getRoleName()), GameOceanengineAppOrderLog::getRoleName, dto.getRoleName())
+                .apply(dto.getRegPayIntervalTimeMin() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, reg_time, pay_time), null) >= {0}", dto.getRegPayIntervalTimeMin())
+                .apply(dto.getRegPayIntervalTimeMax() != null, "if(pay_time is not null, TIMESTAMPDIFF(minute, reg_time, pay_time), null) <= {0}", dto.getRegPayIntervalTimeMax())
+                .orderByDesc(GameOceanengineAppOrderLog::getCreateTime)
+        );
+        IPage<GameOceanengineAppOrderLogVO> 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<GameOceanengineAppOrderLogVO> toVOBatch(List<GameOceanengineAppOrderLog> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        List<GameOceanengineAppOrderSplitLogVO> orderSplitList = gameOceanengineAppOrderSplitLogService.listByOrderNo(logList.stream().map(GameOceanengineAppOrderLog::getOrderNo).collect(Collectors.toSet()));
+        Set<String> agentKeys = logList.stream().map(GameOceanengineAppOrderLog::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 -> {
+            GameOceanengineAppOrderLogVO vo = toVOSimple(log);
+            if (StringUtils.isNotBlank(log.getAgentKey())) {
+                AgentRpcVO agent = agentMap.get(log.getAgentKey());
+                if (agent != null) {
+                    vo.setAgentName(agent.getAgentName());
+                }
+
+            }
+            List<GameOceanengineAppOrderSplitLogVO> splitList = orderSplitList.stream().filter(obj -> obj.getOrderNo().equals(log.getOrderNo())).collect(Collectors.toList());
+            vo.setSplitOrderList(splitList);
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
+    private GameOceanengineAppOrderLogVO toVOSimple(GameOceanengineAppOrderLog log) {
+        if (log == null) {
+            return null;
+        }
+        GameOceanengineAppOrderLogVO vo = BeanUtil.copy(log, GameOceanengineAppOrderLogVO.class);
+        vo.setRegPayIntervalTime(OrderUtil.regPayIntervalTime(log.getPayTime(), log.getRegTime()));
+        return vo;
+    }
+
     private GameOceanengineAppUserLog userLog(GameOceanengineAppOrderLog orderLog) {
         return gameOceanengineAppUserLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppUserLog>()
                 .eq(GameOceanengineAppUserLog::getGameId, orderLog.getGameId())

+ 34 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppOrderSplitLogServiceImpl.java

@@ -1,14 +1,48 @@
 package com.zanxiang.game.back.serve.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.back.serve.dao.mapper.GameOceanengineAppOrderSplitLogMapper;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderSplitLog;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppOrderSplitLog;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderSplitLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppOrderSplitLogVO;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppOrderSplitLogService;
+import com.zanxiang.module.util.NumberUtil;
+import com.zanxiang.module.util.bean.BeanUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Slf4j
 @Service
 public class GameOceanengineAppOrderSplitLogServiceImpl extends ServiceImpl<GameOceanengineAppOrderSplitLogMapper, GameOceanengineAppOrderSplitLog>
 implements IGameOceanengineAppOrderSplitLogService {
+    @Override
+    public List<GameOceanengineAppOrderSplitLogVO> listByOrderNo(Collection<String> orderNos) {
+        if (CollectionUtils.isEmpty(orderNos)) {
+            return Collections.emptyList();
+        }
+        return list(new LambdaQueryWrapper<GameOceanengineAppOrderSplitLog>()
+                .in(GameOceanengineAppOrderSplitLog::getOrderNo, orderNos)
+                .orderByAsc(GameOceanengineAppOrderSplitLog::getBackIndex)
+        ).stream().map(this::toVOSimple).collect(Collectors.toList());
+    }
+
+    private GameOceanengineAppOrderSplitLogVO toVOSimple(GameOceanengineAppOrderSplitLog log) {
+        if (log == null) {
+            return null;
+        }
+        GameOceanengineAppOrderSplitLogVO vo = BeanUtil.copy(log, GameOceanengineAppOrderSplitLogVO.class);
+        if (log.getSplitMoney() != null) {
+            vo.setSplitMoney(NumberUtil.divide100(new BigDecimal(log.getSplitMoney())));
+        }
+        return vo;
+    }
 }

+ 62 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineAppUserLogServiceImpl.java

@@ -2,23 +2,38 @@ 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.GameOceanengineAppUserLogMapper;
 import com.zanxiang.game.back.serve.oceanengine.MiniGameCallback;
-import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppBackLog;
+import com.zanxiang.game.back.serve.pojo.dto.GameOceanengineAppUserLogDTO;
+import com.zanxiang.game.back.serve.pojo.entity.*;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineAppUserLog;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
+import com.zanxiang.game.back.serve.pojo.vo.GameOceanengineAppUserLogVO;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppBackLogService;
 import com.zanxiang.game.back.serve.service.IGameOceanengineAppUserLogService;
 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.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -40,6 +55,52 @@ implements IGameOceanengineAppUserLogService {
         );
     }
 
+    @Override
+    public IPage<GameOceanengineAppUserLogVO> oceanengineAppUserLogList(GameOceanengineAppUserLogDTO dto) {
+        IPage<GameOceanengineAppUserLog> page = page(dto.toPage(), new LambdaQueryWrapper<GameOceanengineAppUserLog>()
+                .eq(StringUtils.isNotBlank(dto.getUserId()), GameOceanengineAppUserLog::getUserId, dto.getUserId())
+                .eq(StringUtils.isNotBlank(dto.getMac()), GameOceanengineAppUserLog::getMac, dto.getMac())
+                .eq(StringUtils.isNotBlank(dto.getImei()), GameOceanengineAppUserLog::getImei, dto.getImei())
+                .eq(StringUtils.isNotBlank(dto.getOaid()), GameOceanengineAppUserLog::getOaid, dto.getOaid())
+                .eq(StringUtils.isNotBlank(dto.getAndroidId()), GameOceanengineAppUserLog::getAndroidId, dto.getAndroidId())
+                .eq(StringUtils.isNotBlank(dto.getIdfa()), GameOceanengineAppUserLog::getIdfa, dto.getIdfa())
+                .eq(StringUtils.isNotBlank(dto.getCaid()), GameOceanengineAppUserLog::getCaid, dto.getCaid())
+                .eq(StringUtils.isNotBlank(dto.getAgentKey()), GameOceanengineAppUserLog::getAgentKey, dto.getAgentKey())
+                .ge(dto.getActiveTimeBegin() != null, GameOceanengineAppUserLog::getActiveTime, dto.getActiveTimeBegin() == null ? null : LocalDateTime.of(dto.getActiveTimeBegin(), LocalTime.MIDNIGHT))
+                .le(dto.getActiveTimeEnd() != null, GameOceanengineAppUserLog::getActiveTime, dto.getActiveTimeEnd() == null ? null : LocalDateTime.of(dto.getActiveTimeEnd(), LocalTime.MAX))
+                .eq(null != dto.getGameId(), GameOceanengineAppUserLog::getGameId, dto.getGameId())
+                .eq(null != dto.getAccountId(), GameOceanengineAppUserLog::getAccountId, dto.getAccountId())
+                .eq(null != dto.getBackStatus(), GameOceanengineAppUserLog::getBackStatus, dto.getBackStatus())
+                .orderByDesc(GameOceanengineAppUserLog::getCreateTime)
+        );
+        IPage<GameOceanengineAppUserLogVO> 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<GameOceanengineAppUserLogVO> toVOBatch(List<GameOceanengineAppUserLog> logList) {
+        if (CollectionUtils.isEmpty(logList)) {
+            return Collections.emptyList();
+        }
+        Set<String> agentKeys = logList.stream().map(GameOceanengineAppUserLog::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 -> {
+            GameOceanengineAppUserLogVO vo = BeanUtil.copy(log, GameOceanengineAppUserLogVO.class);
+            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(GameOceanengineAppUserLog userLog, boolean mustBack) {
         // 是否已经回传过
         if (!mustBack && gameOceanengineAppBackLogService.count(new LambdaQueryWrapper<GameOceanengineAppBackLog>()

+ 49 - 44
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiOrderServiceImpl.java

@@ -6,6 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.sd4324530.jtuple.Tuple2;
 import com.github.sd4324530.jtuple.Tuple3;
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
+import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAccountIdRpcDTO;
+import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
+import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentAppApiOrderMapper;
 import com.zanxiang.game.back.serve.pojo.TencentAppReport;
@@ -21,9 +25,11 @@ import com.zanxiang.module.util.NumberUtil;
 import com.zanxiang.module.util.URIUtil;
 import com.zanxiang.module.util.encryption.Md5Util;
 import com.zanxiang.module.util.exception.BaseException;
+import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
@@ -39,6 +45,8 @@ import java.util.concurrent.atomic.AtomicLong;
 public class GameTencentAppApiOrderServiceImpl extends ServiceImpl<GameTencentAppApiOrderMapper, GameTencentAppApiOrder>
 implements IGameTencentAppApiOrderService {
 
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
     @Autowired
     private IGameTencentAppApiBackLogService gameTencentAppApiBackLogService;
     @Autowired
@@ -195,68 +203,65 @@ implements IGameTencentAppApiOrderService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Tuple2<BackStatusEnum, String> doCallback(GameTencentAppApiOrder orderLog, LocalDateTime backTime, Long backMoney) {
-
-        GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(orderLog.getGameId(), orderLog.getImei(), orderLog.getOaid(), orderLog.getAndroidId(), orderLog.getIdfa(), orderLog.getCaid());
-        if(callback == null) {
-            return Tuple2.with(BackStatusEnum.FAILED, "找不到监测链接");
+        GameTencentAppApiUser user = gameTencentAppApiUserService.getOne(new LambdaQueryWrapper<GameTencentAppApiUser>()
+                .eq(GameTencentAppApiUser::getGameId, orderLog.getGameId())
+                .eq(GameTencentAppApiUser::getUserId, orderLog.getUserId())
+                .eq(GameTencentAppApiUser::getAdAccountId, orderLog.getAdAccountId())
+                .orderByDesc(GameTencentAppApiUser::getCreateTime)
+                .last("limit 1")
+        );
+        if (user != null) {
+            if (user.getCallbackId() == null || user.getCallbackId() < 1) {
+                return Tuple2.with(BackStatusEnum.FAILED, "用户匹配不到广告");
+            }
+        } else  {
+            return Tuple2.with(BackStatusEnum.FAILED, "找不到用户");
         }
-        String callbackUrl = URIUtil.decodeURIComponent(callback.getCallback());
+        GameTencentAppCallback callback = gameTencentAppCallbackService.getById(user.getCallbackId());
 
-        Map<String, Object> actionParam = new HashMap<>(2);
-        actionParam.put("claim_type", 4);
-        actionParam.put("value", backMoney);
-        TencentAppReport reportData = TencentAppReport.builder()
-                .actions(Collections.singletonList(TencentAppReport.Action.builder()
-                        .action_time(DateUtil.localDateTimeToSecond(orderLog.getRegisterTime()))
-                        .userr_id(TencentAppReport.UserId.builder()
-                                .hash_imei(StringUtils.isBlank(orderLog.getImei()) ? null : Md5Util.encrypt32(orderLog.getImei().toLowerCase()).toLowerCase())
-                                .hash_oaid(StringUtils.isBlank(orderLog.getOaid()) ? null : Md5Util.encrypt32(orderLog.getOaid()).toLowerCase())
-                                .hash_android_id(StringUtils.isBlank(orderLog.getAndroidId()) ? null : Md5Util.encrypt32(orderLog.getAndroidId()).toLowerCase())
-                                .hash_idfa(StringUtils.isBlank(orderLog.getIdfa()) ? null : Md5Util.encrypt32(orderLog.getIdfa().toUpperCase()).toLowerCase())
-                                .caid(orderLog.getCaid())
+        Map<String, Object> actionParams = new HashMap<>();
+        actionParams.put("value", backMoney);
+        DataReportOfAccountIdRpcDTO dataReportOfAccountIdRpcDTO = DataReportOfAccountIdRpcDTO.builder()
+                .accountId(user.getAdAccountId())
+                .userActionSetId(user.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(backTime)
+                        .actionType(ActionTypeEnum.PURCHASE.getActionType())
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .hashImei(StringUtils.isBlank(user.getImei()) ? null : Md5Util.encrypt32(user.getImei().toLowerCase()).toLowerCase())
+                                .hashIdfa(StringUtils.isBlank(user.getOaid()) ? null : Md5Util.encrypt32(user.getIdfa().toLowerCase()).toLowerCase())
+                                .hashOaid(StringUtils.isBlank(user.getOaid()) ? null : Md5Util.encrypt32(user.getOaid().toLowerCase()).toLowerCase())
                                 .build())
-                        .action_type("PURCHASE")
-                        .trace(callback.getClickId())
-                        .action_param(actionParam)
-                        .build()))
+                        .trace(UserActionRpcDTO.TraceRpcDTO.builder()
+                                .clickId(callback.getClickId())
+                                .build())
+                        .actionParam(actionParams)
+                        .build())
                 .build();
 
-
-        BackStatusEnum backStatus;
-        String backLog;
-        try {
-            ResponseEntity<String> response = restTemplate.postForEntity(callbackUrl, reportData, String.class);
-            if (response.getStatusCode().is2xxSuccessful()) {
-                backStatus = BackStatusEnum.SUCCESS;
-                backLog = "回传成功";
-            } else {
-                backStatus = BackStatusEnum.FAILED;
-                backLog = "回传识别,失败信息:" + response.getBody();
-            }
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            backStatus = BackStatusEnum.FAILED;
-            backLog = "回传识别,失败原因:" + e.getMessage();
-        }
-
-        String actionType = ActionTypeEnum.PURCHASE.getActionType();
-
         GameTencentAppApiBackLog gameTencentBackLog = GameTencentAppApiBackLog.builder()
                 .gameId(orderLog.getGameId())
                 .userId(orderLog.getUserId())
                 .adAccountId(orderLog.getAdAccountId())
                 .actionTime(backTime)
                 .createTime(LocalDateTime.now())
-                .actionType(actionType)
+                .actionType(ActionTypeEnum.PURCHASE.getActionType())
                 .orderId(orderLog.getOrderId())
                 .imei(orderLog.getImei())
                 .oaid(orderLog.getOaid())
                 .androidId(orderLog.getAndroidId())
                 .idfa(orderLog.getIdfa())
                 .caid(orderLog.getCaid())
-                .backLog(backLog)
-                .actionParam(actionParam.toString())
+                .actionParam(actionParams.toString())
                 .build();
+        ResultVO<Boolean> result = userActionSetRpc.reportByAccountId(dataReportOfAccountIdRpcDTO);
+        BackStatusEnum backStatus = BackStatusEnum.FAILED;
+        if (result.isSuccess()) {
+            backStatus = BackStatusEnum.SUCCESS;
+            gameTencentBackLog.setBackLog("回传成功");
+        } else {
+            gameTencentBackLog.setBackLog(result.getMsg());
+        }
         gameTencentAppApiBackLogService.save(gameTencentBackLog);
         return Tuple2.with(backStatus, gameTencentBackLog.getBackLog());
     }

+ 89 - 4
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiRoleRegisterServiceImpl.java

@@ -3,35 +3,70 @@ package com.zanxiang.game.back.serve.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
+import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAccountIdRpcDTO;
+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.game.back.serve.dao.mapper.GameTencentAppApiRoleRegisterMapper;
 import com.zanxiang.game.back.serve.pojo.entity.*;
+import com.zanxiang.game.back.serve.pojo.enums.ActionTypeEnum;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.*;
+import com.zanxiang.module.util.encryption.Md5Util;
+import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @Slf4j
 @Service
 public class GameTencentAppApiRoleRegisterServiceImpl extends ServiceImpl<GameTencentAppApiRoleRegisterMapper, GameTencentAppApiRoleRegister>
 implements IGameTencentAppApiRoleRegisterService {
 
+    @Autowired
+    private IGameTencentAppApiBackLogService gameTencentAppApiBackLogService;
     @Autowired
     private IGameTencentAppApiUserService gameTencentAppApiUserService;
+    @Autowired
+    private IGameTencentAppCallbackService gameTencentAppCallbackService;
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean roleRegisterBack(GameTencentAppApiRoleRegister roleRegisterLog) {
-        BackStatusEnum backStatus = doCallback(roleRegisterLog);
+        Tuple2<BackStatusEnum, String> backStatus = doCallback(roleRegisterLog);
         return update(new LambdaUpdateWrapper<GameTencentAppApiRoleRegister>()
-                .set(GameTencentAppApiRoleRegister::getIsBack, backStatus.getBackStatus())
+                .set(GameTencentAppApiRoleRegister::getIsBack, backStatus.first.getBackStatus())
+                .set(GameTencentAppApiRoleRegister::getBackLog, backStatus.second)
                 .eq(GameTencentAppApiRoleRegister::getId, roleRegisterLog.getId())
         );
     }
 
+    @Override
+    public boolean tencentUserReport(List<Long> ids) {
+        listByIds(ids).forEach(roleRegisterLog -> {
+            Tuple2<BackStatusEnum, String> backStatus = doCallback(roleRegisterLog);
+            update(new LambdaUpdateWrapper<GameTencentAppApiRoleRegister>()
+                    .set(GameTencentAppApiRoleRegister::getIsBack, backStatus.first.getBackStatus())
+                    .set(GameTencentAppApiRoleRegister::getBackLog, backStatus.second)
+                    .eq(GameTencentAppApiRoleRegister::getId, roleRegisterLog.getId())
+            );
+        });
+        return true;
+    }
 
-    private BackStatusEnum doCallback(GameTencentAppApiRoleRegister roleRegisterLog) {
+    private Tuple2<BackStatusEnum, String> doCallback(GameTencentAppApiRoleRegister roleRegisterLog) {
         GameTencentAppApiUser user = gameTencentAppApiUserService.getOne(new LambdaQueryWrapper<GameTencentAppApiUser>()
                 .eq(GameTencentAppApiUser::getGameId, roleRegisterLog.getGameId())
                 .eq(GameTencentAppApiUser::getUserId, roleRegisterLog.getUserId())
@@ -40,10 +75,60 @@ implements IGameTencentAppApiRoleRegisterService {
                 .last("limit 1")
         );
         if (user != null) {
+            if (user.getCallbackId() == null || user.getCallbackId() < 1) {
+                return Tuple2.with(BackStatusEnum.FAILED, "用户匹配不到广告");
+            }
             if (BackStatusEnum.NO.getBackStatus().equals(user.getIsBack())) {
                 gameTencentAppApiUserService.userBack(user, true);
+            } else {
+                // 注册已回传,则默认认为创角也回传了
+                return Tuple2.with(BackStatusEnum.NO, "用户第二+次创角不回传");
             }
+        } else  {
+            return Tuple2.with(BackStatusEnum.FAILED, "找不到用户");
+        }
+
+        GameTencentAppCallback callback = gameTencentAppCallbackService.getById(user.getCallbackId());
+
+        DataReportOfAccountIdRpcDTO dataReportOfAccountIdRpcDTO = DataReportOfAccountIdRpcDTO.builder()
+                .accountId(user.getAdAccountId())
+                .userActionSetId(user.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(roleRegisterLog.getRegisterTime())
+                        .actionType(ActionTypeEnum.CREATE_ROLE.getActionType())
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .hashImei(StringUtils.isBlank(user.getImei()) ? null : Md5Util.encrypt32(user.getImei().toLowerCase()).toLowerCase())
+                                .hashIdfa(StringUtils.isBlank(user.getOaid()) ? null : Md5Util.encrypt32(user.getIdfa().toLowerCase()).toLowerCase())
+                                .hashOaid(StringUtils.isBlank(user.getOaid()) ? null : Md5Util.encrypt32(user.getOaid().toLowerCase()).toLowerCase())
+                                .build())
+                        .trace(UserActionRpcDTO.TraceRpcDTO.builder()
+                                .clickId(callback.getClickId())
+                                .build())
+                        .build())
+                .build();
+
+        GameTencentAppApiBackLog gameTencentBackLog = GameTencentAppApiBackLog.builder()
+                .gameId(roleRegisterLog.getGameId())
+                .userId(roleRegisterLog.getUserId())
+                .adAccountId(roleRegisterLog.getAdAccountId())
+                .actionTime(roleRegisterLog.getRegisterTime())
+                .createTime(LocalDateTime.now())
+                .actionType(ActionTypeEnum.CREATE_ROLE.getActionType())
+                .imei(roleRegisterLog.getImei())
+                .oaid(roleRegisterLog.getOaid())
+                .androidId(roleRegisterLog.getAndroidId())
+                .idfa(roleRegisterLog.getIdfa())
+                .caid(roleRegisterLog.getCaid())
+                .build();
+        ResultVO<Boolean> result = userActionSetRpc.reportByAccountId(dataReportOfAccountIdRpcDTO);
+        BackStatusEnum backStatus = BackStatusEnum.FAILED;
+        if (result.isSuccess()) {
+            backStatus = BackStatusEnum.SUCCESS;
+            gameTencentBackLog.setBackLog("回传成功");
+        } else {
+            gameTencentBackLog.setBackLog(result.getMsg());
         }
-        return BackStatusEnum.NO;
+        gameTencentAppApiBackLogService.save(gameTencentBackLog);
+        return Tuple2.with(backStatus, gameTencentBackLog.getBackLog());
     }
 }

+ 45 - 46
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppApiUserServiceImpl.java

@@ -3,8 +3,12 @@ package com.zanxiang.game.back.serve.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.sd4324530.jtuple.Tuple2;
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
+import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAccountIdRpcDTO;
+import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
+import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentAppApiUserMapper;
-import com.zanxiang.game.back.serve.pojo.TencentAppReport;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppApiBackLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppApiUser;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentAppCallback;
@@ -13,19 +17,17 @@ import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.service.IGameTencentAppApiBackLogService;
 import com.zanxiang.game.back.serve.service.IGameTencentAppApiUserService;
 import com.zanxiang.game.back.serve.service.IGameTencentAppCallbackService;
-import com.zanxiang.module.util.DateUtil;
-import com.zanxiang.module.util.URIUtil;
 import com.zanxiang.module.util.encryption.Md5Util;
+import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
 
 import java.time.LocalDateTime;
-import java.util.Collections;
 import java.util.List;
 
 @Slf4j
@@ -38,13 +40,16 @@ implements IGameTencentAppApiUserService {
     private IGameTencentAppCallbackService gameTencentAppCallbackService;
     @Autowired
     private RestTemplate restTemplate;
+    @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
+    private IUserActionSetRpc userActionSetRpc;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean userBack(GameTencentAppApiUser userLog, boolean mustBack) {
-        BackStatusEnum backStatus = doCallback(userLog, mustBack);
+        Tuple2<BackStatusEnum, String> backStatus = doCallback(userLog, mustBack);
         return update(new LambdaUpdateWrapper<GameTencentAppApiUser>()
-                .set(GameTencentAppApiUser::getIsBack, backStatus.getBackStatus())
+                .set(GameTencentAppApiUser::getIsBack, backStatus.first.getBackStatus())
+                .set(GameTencentAppApiUser::getBackLog, backStatus.second)
                 .eq(GameTencentAppApiUser::getId, userLog.getId())
         );
     }
@@ -52,9 +57,10 @@ implements IGameTencentAppApiUserService {
     @Override
     public boolean tencentUserReport(List<Long> ids) {
         listByIds(ids).forEach(userLog -> {
-            BackStatusEnum backStatus = doCallback(userLog, true);
+            Tuple2<BackStatusEnum, String> backStatus = doCallback(userLog, true);
             update(new LambdaUpdateWrapper<GameTencentAppApiUser>()
-                    .set(GameTencentAppApiUser::getIsBack, backStatus.getBackStatus())
+                    .set(GameTencentAppApiUser::getIsBack, backStatus.first.getBackStatus())
+                    .set(GameTencentAppApiUser::getBackLog, backStatus.second)
                     .eq(GameTencentAppApiUser::getId, userLog.getId())
             );
         });
@@ -62,7 +68,7 @@ implements IGameTencentAppApiUserService {
     }
 
 
-    private BackStatusEnum doCallback(GameTencentAppApiUser userLog, boolean mustBack) {
+    private Tuple2<BackStatusEnum, String> doCallback(GameTencentAppApiUser userLog, boolean mustBack) {
         boolean isBack = mustBack ? false : gameTencentAppApiBackLogService.count(new LambdaQueryWrapper<GameTencentAppApiBackLog>()
                 .eq(GameTencentAppApiBackLog::getGameId, userLog.getGameId())
                 .eq(GameTencentAppApiBackLog::getUserId, userLog.getUserId())
@@ -70,46 +76,31 @@ implements IGameTencentAppApiUserService {
                 .eq(GameTencentAppApiBackLog::getBackLog, "回传成功")
         ) > 0;
         if (isBack) {
-            return BackStatusEnum.NO;
+            return Tuple2.with(BackStatusEnum.SUCCESS, "回传成功");
         }
-        GameTencentAppCallback callback = gameTencentAppCallbackService.getUserCallback(userLog.getGameId(), userLog.getImei(), userLog.getOaid(), userLog.getAndroidId(), userLog.getIdfa(), userLog.getCaid());
-        if(callback == null) {
-            return BackStatusEnum.FAILED;
+        if (userLog.getCallbackId() == null || userLog.getCallbackId() < 1) {
+            return Tuple2.with(BackStatusEnum.FAILED, "用户匹配不到广告");
         }
-        String callbackUrl = URIUtil.decodeURIComponent(callback.getCallback());
 
-        TencentAppReport reportData = TencentAppReport.builder()
-                .actions(Collections.singletonList(TencentAppReport.Action.builder()
-                        .action_time(DateUtil.localDateTimeToSecond(userLog.getRegisterTime()))
-                        .userr_id(TencentAppReport.UserId.builder()
-                                .hash_imei(StringUtils.isBlank(userLog.getImei()) ? null : Md5Util.encrypt32(userLog.getImei().toLowerCase()).toLowerCase())
-                                .hash_oaid(StringUtils.isBlank(userLog.getOaid()) ? null : Md5Util.encrypt32(userLog.getOaid()).toLowerCase())
-                                .hash_android_id(StringUtils.isBlank(userLog.getAndroidId()) ? null : Md5Util.encrypt32(userLog.getAndroidId()).toLowerCase())
-                                .hash_idfa(StringUtils.isBlank(userLog.getIdfa()) ? null : Md5Util.encrypt32(userLog.getIdfa().toUpperCase()).toLowerCase())
-                                .caid(userLog.getCaid())
+        GameTencentAppCallback callback = gameTencentAppCallbackService.getById(userLog.getCallbackId());
+
+        DataReportOfAccountIdRpcDTO dataReportOfAccountIdRpcDTO = DataReportOfAccountIdRpcDTO.builder()
+                .accountId(userLog.getAdAccountId())
+                .userActionSetId(userLog.getUserActionSetId())
+                .action(UserActionRpcDTO.builder()
+                        .actionTime(userLog.getRegisterTime())
+                        .actionType(ActionTypeEnum.ACTIVATE_APP.getActionType())
+                        .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
+                                .hashImei(StringUtils.isBlank(userLog.getImei()) ? null : Md5Util.encrypt32(userLog.getImei().toLowerCase()).toLowerCase())
+                                .hashIdfa(StringUtils.isBlank(userLog.getOaid()) ? null : Md5Util.encrypt32(userLog.getIdfa().toLowerCase()).toLowerCase())
+                                .hashOaid(StringUtils.isBlank(userLog.getOaid()) ? null : Md5Util.encrypt32(userLog.getOaid().toLowerCase()).toLowerCase())
+                                .build())
+                        .trace(UserActionRpcDTO.TraceRpcDTO.builder()
+                                .clickId(callback.getClickId())
                                 .build())
-                        .action_type("ACTIVATE_APP")
-                        .trace(callback.getClickId())
-                        .build()))
+                        .build())
                 .build();
 
-        BackStatusEnum backStatus;
-        String backLog;
-        try {
-            ResponseEntity<String> response = restTemplate.postForEntity(callbackUrl, reportData, String.class);
-            if (response.getStatusCode().is2xxSuccessful()) {
-                backStatus = BackStatusEnum.SUCCESS;
-                backLog = "回传成功";
-            } else {
-                backStatus = BackStatusEnum.FAILED;
-                backLog = "回传识别,失败信息:" + response.getBody();
-            }
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            backStatus = BackStatusEnum.FAILED;
-            backLog = "回传识别,失败原因:" + e.getMessage();
-        }
-
         GameTencentAppApiBackLog gameTencentBackLog = GameTencentAppApiBackLog.builder()
                 .gameId(userLog.getGameId())
                 .userId(userLog.getUserId())
@@ -122,9 +113,17 @@ implements IGameTencentAppApiUserService {
                 .androidId(userLog.getAndroidId())
                 .idfa(userLog.getIdfa())
                 .caid(userLog.getCaid())
-                .backLog(backLog)
                 .build();
+        ResultVO<Boolean> result = userActionSetRpc.reportByAccountId(dataReportOfAccountIdRpcDTO);
+
+        BackStatusEnum backStatus = BackStatusEnum.FAILED;
+        if (result.isSuccess()) {
+            backStatus = BackStatusEnum.SUCCESS;
+            gameTencentBackLog.setBackLog("回传成功");
+        } else {
+            gameTencentBackLog.setBackLog(result.getMsg());
+        }
         gameTencentAppApiBackLogService.save(gameTencentBackLog);
-        return backStatus;
+        return Tuple2.with(backStatus, gameTencentBackLog.getBackLog());
     }
 }

+ 21 - 11
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentAppCallbackServiceImpl.java

@@ -13,7 +13,6 @@ import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.encryption.Md5Util;
-import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -25,6 +24,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 
 @Slf4j
 @Service
@@ -64,20 +64,30 @@ implements IGameTencentAppCallbackService {
     }
 
     @Override
-    public GameTencentAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid) {
+    public GameTencentAppCallback getUserCallback(Long gameId, String imei, String oaid, String android, String idfa, String caid, String ip, LocalDateTime regTime) {
         LambdaQueryWrapper<GameTencentAppCallback> qw = new LambdaQueryWrapper<GameTencentAppCallback>()
+                .lt(GameTencentAppCallback::getClickTime, DateUtil.localDateTimeToSecond(regTime))
                 .eq(GameTencentAppCallback::getGameId, gameId)
                 .orderByDesc(GameTencentAppCallback::getClickTime)
                 .last("limit 1");
-        if (StringUtils.isNoneBlank(imei) || StringUtils.isNoneBlank(android) || StringUtils.isNoneBlank(oaid)) {
-            qw.and(and -> {
-                and.eq(StringUtils.isNoneBlank(imei), GameTencentAppCallback::getMuid, StringUtils.isBlank(imei) ? null : Md5Util.encrypt32(imei.toLowerCase()).toLowerCase())
-                        .or().eq(StringUtils.isNoneBlank(android), GameTencentAppCallback::getHashAndroidId, StringUtils.isBlank(android) ? null : Md5Util.encrypt32(android).toLowerCase())
-                        .or().eq(StringUtils.isNoneBlank(oaid), GameTencentAppCallback::getHashOaid, StringUtils.isBlank(oaid) ? null : Md5Util.encrypt32(oaid).toLowerCase());
-            });
-        } else if (StringUtils.isNoneBlank(idfa)) {
-            qw.eq(GameTencentAppCallback::getMuid, Md5Util.encrypt32(idfa).toLowerCase());
-        }
+        qw.and(and -> {
+            if(StringUtils.isNoneBlank(imei)) {
+                and.or().eq(GameTencentAppCallback::getMuid, Md5Util.encrypt32(imei.toLowerCase()).toLowerCase());
+            }
+            if(StringUtils.isNoneBlank(android)) {
+                and.or().eq(GameTencentAppCallback::getHashAndroidId, Md5Util.encrypt32(android).toLowerCase());
+            }
+            if(StringUtils.isNoneBlank(oaid)) {
+                and.or().eq(GameTencentAppCallback::getHashOaid, Md5Util.encrypt32(oaid).toLowerCase());
+            }
+            if(StringUtils.isNoneBlank(idfa)) {
+                and.or().eq(GameTencentAppCallback::getMuid, Md5Util.encrypt32(idfa.toUpperCase()).toLowerCase());
+            }
+            and.or().and(StringUtils.isNoneBlank(ip), tmp -> {
+                        tmp.ge(GameTencentAppCallback::getClickTime, DateUtil.localDateTimeToSecond(regTime.plusDays(2)))
+                                .eq(GameTencentAppCallback::getIp, ip);
+                    });
+        });
         return getOne(qw);
     }
 }

+ 17 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/dao/mapper/game/order/GameServerSonMergeMapper.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.gs.data.serve.dao.mapper.game.order;
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 游戏区服合服子服记录表 映射层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Mapper
+public interface GameServerSonMergeMapper extends BaseMapper<GameServerSonMerge> {
+
+
+}

+ 41 - 6
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/dto/BigRDTO.java

@@ -4,25 +4,60 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.time.LocalDate;
 import java.util.List;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class BigRDTO extends BaseListDTO {
-    @NotBlank
-    @ApiModelProperty(notes = "SDK来源")
+    @NotNull(message = "SDK来源必填")
+    @ApiModelProperty(notes = "必填:SDK来源;默认ZX_ONE")
     private String sourceSystem;
     @ApiModelProperty("排序字段")
     private String sortFiled;
     @ApiModelProperty("排序类型:升序 true;降序 false")
     private Boolean sortAsc = true;
 
-    @ApiModelProperty("统计日期开始")
+    @ApiModelProperty("充值统计日期开始")
     private LocalDate dtBegin;
-    @ApiModelProperty("统计日期结束")
+    @ApiModelProperty("充值统计日期结束")
     private LocalDate dtEnd;
-    @ApiModelProperty("gs id列表")
+    @ApiModelProperty("gs id 列表")
     private List<Long> gsIdList;
+
+    @ApiModelProperty("父游戏id")
+    private Long parentGameId;
+
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    @ApiModelProperty("角色创建日期开始")
+    private LocalDate roleCreateDayBegin;
+    @ApiModelProperty("角色创建日期结束")
+    private LocalDate roleCreateDayEnd;
+
+    @ApiModelProperty("超父游戏id")
+    private Integer superGameId;
+    @ApiModelProperty("角色当前所在区服id列表")
+    private List<String> serverIdList;
+
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayBegin;
+    @ApiModelProperty("服务日期开始")
+    private LocalDate serveDayEnd;
+
+    @ApiModelProperty("服务状态:1:服务中;2:服务完成")
+    private Integer serveStatus;
+
+    @NotNull(message = "角色来源必填")
+    @ApiModelProperty("必填:角色来源:1:区服指派;2:角色指派")
+    private Integer roleSource;
+
+    @ApiModelProperty("人工判断角色退游状态:0:未退游;1:退游")
+    private Integer humanRemoveGameStatus;
+
+    @ApiModelProperty("系统判断角色退游状态:0:未退游;1:退游")
+    private Integer systemRemoveGameStatus;
+
 }

+ 149 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/order/GameServerSonMerge.java

@@ -0,0 +1,149 @@
+package com.zanxiang.game.gs.data.serve.pojo.entity.game.order;
+
+import lombok.Data;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.Builder;
+import com.mybatisflex.annotation.Column;
+import com.mybatisflex.annotation.Table;
+
+import java.lang.Long;
+import java.time.LocalDateTime;
+import java.lang.String;
+import java.lang.Integer;
+
+/**
+ * 游戏区服合服子服记录表 实体类。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(value = "t_game_server_son_merge")
+public class GameServerSonMerge {
+
+    /**
+     * 主键
+     */
+    @Column(value = "id")
+    private Long id;
+
+    /**
+     * SDK来源
+     */
+    @Column(value = "source_system")
+    private String sourceSystem;
+
+    /**
+     * 合服包含的子服列表
+     */
+    @Column(value = "son_server_ids")
+    private String sonServerIds;
+
+    /**
+     * 超父游戏ID
+     */
+    @Column(value = "game_id")
+    private Long gameId;
+
+    /**
+     * 区服id
+     */
+    @Column(value = "server_id")
+    private String serverId;
+
+    /**
+     * 区服名称
+     */
+    @Column(value = "server_name")
+    private String serverName;
+
+    /**
+     * 区服冠名
+     */
+    @Column(value = "nick_name")
+    private String nickName;
+
+    /**
+     * 开服时间
+     */
+    @Column(value = "start_time")
+    private LocalDateTime startTime;
+
+    /**
+     * 0正常1删除
+     */
+    @Column(value = "is_delete")
+    private Integer isDelete;
+
+    /**
+     * 创建者id
+     */
+    @Column(value = "create_by")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @Column(value = "create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者id
+     */
+    @Column(value = "update_by")
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    @Column(value = "update_time")
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否原始服:1是,0否
+     */
+    @Column(value = "is_source_server")
+    private Integer isSourceServer;
+
+    /**
+     * 合服的主服ID
+     */
+    @Column(value = "main_server_id")
+    private String mainServerId;
+
+    /**
+     * 是否参与过合服:1是,0否
+     */
+    @Column(value = "is_merge")
+    private Integer isMerge;
+
+    /**
+     * 合服包含的原始服列表
+     */
+    @Column(value = "source_server_ids")
+    private String sourceServerIds;
+
+    /**
+     * 合服时间
+     */
+    @Column(value = "merge_time")
+    private LocalDateTime mergeTime;
+
+    /**
+     * gsID
+     */
+    @Column(value = "gs_ids")
+    private String gsIds;
+
+    /**
+     * 客服id
+     */
+    @Column(value = "customer_ids")
+    private String customerIds;
+
+
+}

+ 80 - 6
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/entity/game/parent/AdsRoleAmountDataParent.java

@@ -9,6 +9,7 @@ import com.mybatisflex.annotation.Table;
 
 import java.math.BigDecimal;
 import java.lang.Long;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.lang.String;
 import java.lang.Integer;
@@ -25,8 +26,6 @@ import java.lang.Integer;
 @AllArgsConstructor
 @Table(value = "ads_role_amount_data_parent")
 public class AdsRoleAmountDataParent {
-    @Column(value = "game_id")
-    private String gameId;
 
     /**
      * 角色ID
@@ -34,6 +33,24 @@ public class AdsRoleAmountDataParent {
     @Column(value = "role_id")
     private String roleId;
 
+    /**
+     * gs_id
+     */
+    @Column(value = "gs_id")
+    private Long gsId;
+
+    /**
+     * gs 开始服务时间
+     */
+    @Column(value = "gs_start_time")
+    private LocalDate gsStartTime;
+
+    /**
+     * 子游戏ID
+     */
+    @Column(value = "game_id")
+    private Long gameId;
+
     /**
      * 角色名称
      */
@@ -50,7 +67,7 @@ public class AdsRoleAmountDataParent {
      * 父游戏ID
      */
     @Column(value = "parent_game_id")
-    private Integer parentGameId;
+    private Long parentGameId;
 
     /**
      * 父用户ID
@@ -148,10 +165,67 @@ public class AdsRoleAmountDataParent {
     @Column(value = "proportion")
     private BigDecimal proportion;
 
-
+    /**
+     * 角色ID拼接游戏ID
+     */
     @Column(value = "concat_game")
     private String concatGame;
 
-    @Column(value = "gs_id")
-    private Long gsId;
+    /**
+     * 每个gs的充值
+     */
+    @Column(value = "gs_amount")
+    private BigDecimal gsAmount;
+
+    /**
+     * 每个gs的充值次数
+     */
+    @Column(value = "gs_count")
+    private Integer gsCount;
+
+    /**
+     * gs服务结束时间
+     */
+    @Column(value = "gs_end_time")
+    private LocalDate gsEndTime;
+
+    /**
+     * 原始区服ID
+     */
+    @Column(value = "source_server_id")
+    private String sourceServerId;
+
+    /**
+     * 当前区服ID
+     */
+    @Column(value = "end_server_id")
+    private String endServerId;
+
+    /**
+     * 超父游戏ID
+     */
+    @Column(value = "super_game_id")
+    private Long superGameId;
+
+    /**
+     * 区服指派GS
+     */
+    @Column(value = "gs_id_server")
+    private String gsIdServer;
+
+    /**
+     * 区服指派GS充值金额
+     */
+    @Column(value = "server_amount")
+    private BigDecimal serverAmount;
+
+    /**
+     * 区服指派GS充值次数
+     */
+    @Column(value = "server_count")
+    private Integer serverCount;
+
+    @Column(value = "is_remove_game")
+    private Integer isRemoveGame;
+
 }

+ 39 - 79
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/BigRVO.java

@@ -1,9 +1,11 @@
 package com.zanxiang.game.gs.data.serve.pojo.vo;
 
+import com.mybatisflex.annotation.Column;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -14,62 +16,36 @@ public class BigRVO {
     @ApiModelProperty("角色ID")
     private String roleId;
 
-    /**
-     * 角色名称
-     */
     @ApiModelProperty("角色名称")
     private String roleName;
+    @ApiModelProperty("超父游戏id")
+    private Long superGameId;
+    @ApiModelProperty("当前区服ID")
+    private String endServerId;
 
-    /**
-     * 区服ID
-     */
-    @ApiModelProperty("区服ID")
-    private String serverId;
+    @ApiModelProperty("当前区服名称")
+    private String endServerName;
 
-    @ApiModelProperty("区服名称")
-    private String serverName;
-
-    /**
-     * 父游戏ID
-     */
     @ApiModelProperty("父游戏ID")
     private Integer parentGameId;
     @ApiModelProperty("父游戏名称")
     private String parentGameName;
 
-    /**
-     * 父用户ID
-     */
     @ApiModelProperty("父用户ID")
     private Long associationUserId;
 
-    /**
-     * 角色vip
-     */
     @ApiModelProperty("角色vip")
     private Integer roleVip;
 
-    /**
-     * 角色等级
-     */
     @ApiModelProperty("角色等级")
     private Integer roleLevel;
 
-    /**
-     * 角色攻击力
-     */
     @ApiModelProperty("角色攻击力")
     private Long combatNum;
 
-    /**
-     * 国家
-     */
     @ApiModelProperty("国家")
     private String country;
 
-    /**
-     * 角色创建时间
-     */
     @ApiModelProperty("角色创建时间")
     private LocalDateTime roleTime;
     @ApiModelProperty("角色创角天数")
@@ -79,87 +55,42 @@ public class BigRVO {
     @ApiModelProperty("角色最近活跃时间距今")
     private Long roleActiveDayDiff;
 
-    /**
-     * 角色首充金额
-     */
     @ApiModelProperty("角色首充金额")
     private BigDecimal firstAmount;
 
-    /**
-     * 创角24小时付费金额
-     */
     @ApiModelProperty("创角24小时付费金额")
     private BigDecimal roleHourAmount;
 
-    /**
-     * 角色最近充值金额
-     */
     @ApiModelProperty("角色最近充值金额")
     private BigDecimal lastAmount;
 
-    /**
-     * 角色最近充值时间
-     */
     @ApiModelProperty("角色最近充值时间")
     private LocalDateTime lastOrderTime;
 
-    /**
-     * 角色最近充值产品
-     */
     @ApiModelProperty("角色最近充值产品")
     private String productName;
 
-    /**
-     * 角色累计充值金额
-     */
     @ApiModelProperty("角色累计充值金额")
     private BigDecimal totalAmount;
 
-    /**
-     * 角色累计充值次数
-     */
     @ApiModelProperty("角色累计充值次数")
     private Integer totalCnt;
 
-    /**
-     * 角色最近活跃时间
-     */
     @ApiModelProperty("角色最近活跃时间")
     private LocalDateTime activeTime;
 
-    /**
-     * 小程序充值金额
-     */
     @ApiModelProperty("小程序充值金额")
     private BigDecimal appAmount;
 
-    /**
-     * 角色转端充值比
-     */
     @ApiModelProperty("角色转端充值比")
     private BigDecimal proportion;
 
-    /**
-     * 角色当天充值金额
-     */
     @ApiModelProperty("角色当天充值金额")
     private BigDecimal todayAmount;
-
-    /**
-     * 角色当天充值次数
-     */
     @ApiModelProperty("角色当天充值次数")
     private Integer todayCount;
-
-    /**
-     * 游戏充值比
-     */
     @ApiModelProperty("游戏充值比")
     private BigDecimal gameProportion;
-
-    /**
-     * 区服充值比
-     */
     @ApiModelProperty("区服充值比")
     private BigDecimal serverProportion;
 
@@ -168,6 +99,35 @@ public class BigRVO {
     @ApiModelProperty("GS ID")
     private Long gsId;
 
-    @ApiModelProperty("GS组名称")
-    private List<String> gsGroupName;
+    @ApiModelProperty("GS服务中的付费金额")
+    private BigDecimal gsAmount;
+
+    @ApiModelProperty("GS服务中的付费次数")
+    private Long gsCount;
+
+    @ApiModelProperty("区服指派GS充值金额")
+    private BigDecimal serverAmount;
+
+    @ApiModelProperty("区服指派GS充值次数")
+    private Integer serverCount;
+
+    @ApiModelProperty("GS服务时间-开始")
+    private LocalDate gsStartTime;
+    @ApiModelProperty("GS服务时间-结束")
+    private LocalDate gsEndTime;
+
+    @ApiModelProperty("GS服务天数")
+    private Long gsServeDays;
+
+    @ApiModelProperty("GS服务状态:0:服务中;1:服务完成")
+    private Boolean serveStatus;
+
+    @ApiModelProperty("角色来源:1:区服指派;2:角色指派")
+    private Integer roleSource;
+
+    @ApiModelProperty("角色人工判断退游状态:0:未退游;1:退游")
+    private Integer humanRemoveGameStatus;
+
+    @ApiModelProperty("角色系统判断退游状态:0:未退游;1:退游")
+    private Integer systemRemoveGameStatus;
 }

+ 19 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IGameServerSonMergeService.java

@@ -0,0 +1,19 @@
+package com.zanxiang.game.gs.data.serve.service;
+
+
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
+import com.mybatisflex.core.service.IService;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 游戏区服合服子服记录表 服务层。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+public interface IGameServerSonMergeService extends IService<GameServerSonMerge> {
+    Map<Long, Map<String, String>> gameServerMap(String sourceSystem, Collection<String> serverIdList);
+
+}

+ 69 - 53
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountDataParentServiceImpl.java

@@ -8,21 +8,22 @@ import com.mybatisflex.core.row.Row;
 import com.mybatisflex.spring.service.impl.ServiceImpl;
 import com.zanxiang.game.gs.data.serve.dao.mapper.game.parent.AdsRoleAmountDataParentMapper;
 import com.zanxiang.game.gs.data.serve.pojo.dto.BigRDTO;
-import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.RoleOperate;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataParent;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountDataTodayParent;
 import com.zanxiang.game.gs.data.serve.pojo.vo.BigRVO;
 import com.zanxiang.game.gs.data.serve.pojo.vo.PageVO;
 import com.zanxiang.game.gs.data.serve.service.*;
+import com.zanxiang.module.util.DateUtil;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -47,6 +48,8 @@ public class AdsRoleAmountDataParentServiceImpl extends ServiceImpl<AdsRoleAmoun
     @Resource
     private IGameService gameService;
     @Resource
+    private IGameServerSonMergeService serverSonMergeService;
+    @Resource
     private IGameServerService gameServerService;
     @Resource
     private IGameAuthRoleGroupService authRoleGroupService;
@@ -74,59 +77,77 @@ public class AdsRoleAmountDataParentServiceImpl extends ServiceImpl<AdsRoleAmoun
             return PageVO.empty(dto);
         }
         List<BigRVO> records = paginate.getRecords();
-        Set<String> serverIdList = records.stream().map(BigRVO::getServerId).collect(Collectors.toSet());
+        Set<String> serverIdList = records.stream().map(BigRVO::getEndServerId).collect(Collectors.toSet());
         Set<Integer> parentGameIdList = records.stream().map(BigRVO::getParentGameId).collect(Collectors.toSet());
         Set<Long> gsIdList = records.stream().map(BigRVO::getGsId).collect(Collectors.toSet());
         //父游戏名称
         Map<Integer, String> parentGameMap = gameService.gameNameMap(dto.getSourceSystem(), parentGameIdList);
         //区服名称
-        Map<Integer, Map<String, String>> serverMap = gameServerService.gameServerMap(dto.getSourceSystem(), serverIdList);
+        Map<Long, Map<String, String>> serverMap = serverSonMergeService.gameServerMap(dto.getSourceSystem(), serverIdList);
         //GS名称查询
         Map<Long, String> sysUserMap = CollectionUtils.isEmpty(gsIdList) ? null : sysUserService.getSysUserMap(gsIdList);
         //GS组名称
-        Map<Long, List<String>> gsGroupMap = authRoleGroupService.getGsGroupMap(dto.getSourceSystem(), gsIdList);
+//        Map<Long, List<String>> gsGroupMap = authRoleGroupService.getGsGroupMap(dto.getSourceSystem(), gsIdList);
         records.forEach(record -> {
             Long gsId = record.getGsId();
-            record.setGsName(null == gsId ? null : sysUserMap != null ? sysUserMap.get(gsId) : null);
-            record.setGsGroupName(null == gsId ? null : gsGroupMap.get(gsId));
+            record.setGsName(0 == gsId ? null : sysUserMap != null ? sysUserMap.get(gsId) : null);
+//            record.setGsGroupName(null == gsId ? null : gsGroupMap.get(gsId));
             record.setParentGameName(parentGameMap.get(record.getParentGameId()));
-            record.setServerName(null == serverMap.get(record.getGameId()) ? null : serverMap.get(record.getGameId()).get(record.getServerId()));
+            record.setEndServerName(null == serverMap.get(record.getSuperGameId()) ? null : serverMap.get(record.getSuperGameId()).get(record.getEndServerId()));
+            if (null != record.getGsStartTime()) {
+                record.setGsServeDays(record.getGsEndTime().isBefore(LocalDate.now()) ? DateUtil.intervalOfDays(record.getGsStartTime(), record.getGsEndTime())
+                        : DateUtil.intervalOfDays(record.getGsStartTime(), LocalDate.now()));
+                record.setServeStatus(record.getGsEndTime().isBefore(LocalDate.now()));
+            }
+            record.setRoleSource(0 == record.getGsId() ? 1 : 2);
         });
         return new PageVO<>(paginate);
     }
 
     private static QueryWrapper getBigRWrapper(BigRDTO dto) {
         return QueryWrapper.create()
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
                 .select(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
                 .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)
-                .select(dateDiff(currentDate(), ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME).as("role_create_day_diff"))
-                .select(dateDiff(currentDate(), ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME).as("role_active_day_diff"))
-                .select(dateDiff(currentDate(), ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME).as("last_order_day_diff"))
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
-                .select(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME)
+                .select(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM).as(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY).as(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME.getName()))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)).as("role_create_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME)).as("role_active_day_diff"))
+                .select(dateDiff(currentDate(), max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME)).as("last_order_day_diff"))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION).as(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME).as(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_COUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_END_TIME.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SOURCE_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.END_SERVER_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID).as(ADS_ROLE_AMOUNT_DATA_PARENT.SUPER_GAME_ID.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.IS_REMOVE_GAME).as("human_remove_game_status"))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER).as(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID_SERVER.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_AMOUNT.getName()))
+                .select(max(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT).as(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_COUNT.getName()))
                 .select(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_COUNT).as(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_COUNT.getName()))
                 .select(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_AMOUNT).as(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_AMOUNT.getName()))
                 .select(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_AMOUNT).divide(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.SERVER_AMOUNT)).as(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.SERVER_PROPORTION.getName()))
                 .select(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.TODAY_AMOUNT).divide(sum(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.GAME_AMOUNT)).as(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.GAME_PROPORTION.getName()))
+                .select("IF(TIMESTAMPDIFF(HOUR, max(ads_role_amount_data_parent.active_time), NOW()) > 72,IF(TIMESTAMPDIFF(HOUR, max(ads_role_amount_data_parent.last_order_time), NOW()) < 72 , 0, 1) , 0) as system_remove_game_status")
                 .from(ADS_ROLE_AMOUNT_DATA_PARENT)
                 .leftJoin(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT)
                 .on(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID.eq(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.GAME_ID)
@@ -134,30 +155,25 @@ public class AdsRoleAmountDataParentServiceImpl extends ServiceImpl<AdsRoleAmoun
                 .and(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID.isNotNull().or(ADS_ROLE_AMOUNT_DATA_TODAY_PARENT.SERVER_ID.isNotNull()))
                 .ge(AdsRoleAmountDataTodayParent::getDay, dto.getDtBegin())
                 .le(AdsRoleAmountDataTodayParent::getDay, dto.getDtBegin())
+                .ge(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayBegin() ? null : LocalDateTime.of(dto.getRoleCreateDayBegin(), LocalTime.MIDNIGHT), null != dto.getRoleCreateDayBegin())
+                .le(AdsRoleAmountDataParent::getRoleTime, null == dto.getRoleCreateDayEnd() ? null : LocalDateTime.of(dto.getRoleCreateDayEnd(), LocalTime.MAX), null != dto.getRoleCreateDayEnd())
                 .in(AdsRoleAmountDataParent::getGsId, dto.getGsIdList(), CollectionUtils.isNotEmpty(dto.getGsIdList()))
+                .eq(AdsRoleAmountDataParent::getParentGameId, dto.getParentGameId(), null != dto.getParentGameId())
+                .like(AdsRoleAmountDataParent::getRoleName, dto.getRoleName(), StringUtils.isNotBlank(dto.getRoleName()))
+                .eq(AdsRoleAmountDataParent::getSuperGameId, dto.getSuperGameId(), null != dto.getSuperGameId())
+                .in(AdsRoleAmountDataParent::getEndServerId, dto.getServerIdList(), CollectionUtils.isNotEmpty(dto.getServerIdList()))
+                .ge(AdsRoleAmountDataParent::getGsStartTime, dto.getServeDayBegin(), null != dto.getServeDayBegin())
+                .le(AdsRoleAmountDataParent::getGsEndTime, dto.getServeDayEnd(), null != dto.getServeDayEnd())
+                .ge(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 1 == dto.getServeStatus())
+                .le(AdsRoleAmountDataParent::getGsEndTime, LocalDate.now(), null != dto.getServeStatus() && 2 == dto.getServeStatus())
+                .ne(AdsRoleAmountDataParent::getGsId, 0, null != dto.getRoleSource() && 2 == dto.getRoleSource())
+                .isNotNull(AdsRoleAmountDataParent::getGsIdServer, null != dto.getRoleSource() && 1 == dto.getRoleSource())
+                .eq(AdsRoleAmountDataParent::getIsRemoveGame, dto.getHumanRemoveGameStatus(), null != dto.getHumanRemoveGameStatus())
+                .and(wrapper -> wrapper.and("'system_remove_game_status' = ?", dto.getSystemRemoveGameStatus()), null != dto.getSystemRemoveGameStatus())
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GAME_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_NAME)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.SERVER_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.PARENT_GAME_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ASSOCIATION_USER_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_LEVEL)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_VIP)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.COMBAT_NUM)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.COUNTRY)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_TIME)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.FIRST_AMOUNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_HOUR_AMOUNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_AMOUNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.LAST_ORDER_TIME)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.PRODUCT_NAME)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_AMOUNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.TOTAL_CNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ACTIVE_TIME)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.APP_AMOUNT)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.PROPORTION)
                 .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_ID)
-                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.CONCAT_GAME)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.GS_START_TIME)
+                .groupBy(ADS_ROLE_AMOUNT_DATA_PARENT.ROLE_ID)
                 .orderBy(dto.getSortFiled(), dto.getSortAsc());
     }
 }

+ 1 - 1
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerServiceImpl.java

@@ -26,6 +26,6 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
                 .eq(GameServer::getSourceSystem, sourceSystem)
                 .in(GameServer::getServerId, serverIdList))
                 .stream()
-                .collect(Collectors.groupingBy(GameServer::getGameId, Collectors.toMap(GameServer::getServerId, GameServer::getServerName)));
+                .collect(Collectors.groupingBy(GameServer::getSupperGameId, Collectors.toMap(GameServer::getServerId, GameServer::getServerName)));
     }
 }

+ 34 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/GameServerSonMergeServiceImpl.java

@@ -0,0 +1,34 @@
+package com.zanxiang.game.gs.data.serve.service.impl;
+
+
+import com.mybatisflex.core.query.QueryWrapper;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServer;
+import org.springframework.stereotype.Service;
+import com.zanxiang.game.gs.data.serve.service.IGameServerSonMergeService;
+import com.zanxiang.game.gs.data.serve.pojo.entity.game.order.GameServerSonMerge;
+import com.zanxiang.game.gs.data.serve.dao.mapper.game.order.GameServerSonMergeMapper;
+import com.mybatisflex.spring.service.impl.ServiceImpl;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 游戏区服合服子服记录表 服务层实现。
+ *
+ * @author shaosong
+ * @since 1.0
+ */
+@Service
+public class GameServerSonMergeServiceImpl extends ServiceImpl<GameServerSonMergeMapper, GameServerSonMerge> implements IGameServerSonMergeService {
+
+    @Override
+    public Map<Long, Map<String, String>> gameServerMap(String sourceSystem, Collection<String> serverIdList) {
+        return list(new QueryWrapper()
+                .eq(GameServerSonMerge::getSourceSystem, sourceSystem)
+                .in(GameServerSonMerge::getServerId, serverIdList)
+                .and("main_server_id = son_server_ids"))
+                .stream()
+                .collect(Collectors.groupingBy(GameServerSonMerge::getGameId, Collectors.toMap(GameServerSonMerge::getServerId, GameServerSonMerge::getServerName)));
+    }
+}

+ 11 - 11
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -84,9 +84,9 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
     }
 
     private void gameServerAssign(GameServerAssignParam param, GameServer gameServer) {
-        if (Objects.equals(gameServer.getIsSourceServer(), Boolean.FALSE)) {
-            return;
-        }
+//        if (Objects.equals(gameServer.getIsSourceServer(), Boolean.FALSE)) {
+//            return;
+//        }
         //老的指派人员id
         String oldUserIds = null;
         if (Objects.equals(param.getAssignType(), GameServerAssignEnum.GAME_SERVER_ASSIGN_GS)) {
@@ -351,16 +351,16 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
         GameServerListVO gameServerListVO = BeanUtil.copy(gameServer, GameServerListVO.class);
         GameSupper gameSupper = gameSupperService.getById(gameServer.getGameId());
         gameServerListVO.setGameName(gameSupper == null ? null : gameSupper.getName());
+        //指派客服
+        if (Strings.isNotBlank(gameServer.getCustomerIds())) {
+            gameServerListVO.setCustomerList(this.getUserBeanList(gameServer.getCustomerIds()));
+        }
+        //指派GS
+        if (Strings.isNotBlank(gameServer.getGsIds())) {
+            gameServerListVO.setGsList(this.getUserBeanList(gameServer.getGsIds()));
+        }
         //原始区服, 直接返回
         if (Objects.equals(gameServer.getIsSourceServer(), Boolean.TRUE)) {
-            //指派客服
-            if (Strings.isNotBlank(gameServer.getCustomerIds())) {
-                gameServerListVO.setCustomerList(this.getUserBeanList(gameServer.getCustomerIds()));
-            }
-            //指派GS
-            if (Strings.isNotBlank(gameServer.getGsIds())) {
-                gameServerListVO.setGsList(this.getUserBeanList(gameServer.getGsIds()));
-            }
             return gameServerListVO;
         }
         //合服

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

@@ -48,6 +48,11 @@ public class Game implements Serializable {
      */
     private Boolean isPut;
 
+    /**
+     * 投放类型, 0 : 导量APP, 1 : 头条直投APP,  2 : 腾讯直投APP, 3 : 头条私域投APP, 4 : 腾讯私域投APP
+     */
+    private Integer putType;
+
     /**
      * 游戏标签
      */
@@ -153,4 +158,9 @@ public class Game implements Serializable {
      */
     private BigDecimal rechargeRebate;
 
+    /**
+     * 是否使用监测链接
+     */
+    private Boolean isMonitorLink;
+
 }

+ 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服务启动成功 <斗罗归因判断问题解决01> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决token重复重现的问题> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 2 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/adapter/WebHandlerAdapter.java

@@ -70,7 +70,8 @@ public class WebHandlerAdapter implements HandlerInterceptor {
         //签名验证
         GameExt gameExt = gameExtService.getByGameAppId(gameId);
         if (gameExt == null || Strings.isBlank(gameExt.getAppKey())) {
-            log.error("非法参数, 游戏id对应的前端密钥appKey不存在");
+            log.error("非法参数, 游戏id对应的前端密钥appKey不存在, gameId : {}, sign : {}, timestamp : {}, os : {}, deviceType : {}",
+                    gameId, sign, timestamp, os, deviceType);
             throw new BaseException(HttpStatusEnum.INVALID_PARAMS.getMsg());
         }
         String str = "appKey=" + gameExt.getAppKey() + "&gameId=" + gameId + "&timestamp=" + timestamp;

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

@@ -1,5 +1,6 @@
 package com.zanxiang.game.module.sdk.controller;
 
+import com.zanxiang.game.module.sdk.annotation.PushDataCheck;
 import com.zanxiang.game.module.sdk.annotation.UnSignCheck;
 import com.zanxiang.game.module.sdk.pojo.param.MiniAppPayParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
@@ -43,6 +44,15 @@ public class AppletController {
     @Autowired
     private IPayApplicationService payApplicationService;
 
+    @UnSignCheck
+    @PushDataCheck
+    @ApiOperation(value = "获取微信小游戏token")
+    @GetMapping("/get/applet/accessToken")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = String.class)})
+    public ResultVO<Map<String, String>> getAppletToken(@RequestParam String gameId) {
+        return ResultVO.ok(gameAppletService.getAppletToken(gameId));
+    }
+
     @UnSignCheck
     @ApiOperation(value = "小程序客服消息认证")
     @GetMapping("/applet/custom/msg/{appId}")

+ 6 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/UserLoginVO.java

@@ -94,4 +94,10 @@ public class UserLoginVO {
      */
     @ApiModelProperty(notes = "是否注册用户")
     private Boolean regUser;
+
+    /**
+     * 微信小游戏的accessToken
+     */
+    @ApiModelProperty(notes = "微信小游戏的accessToken")
+    private String accessToken;
 }

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

@@ -6,6 +6,8 @@ import com.zanxiang.game.module.sdk.pojo.dto.GameAppletDTO;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.pojo.vo.GameInitVO;
 
+import java.util.Map;
+
 /**
  * @author : lingfeng
  * @time : 2022-07-08
@@ -13,6 +15,14 @@ import com.zanxiang.game.module.sdk.pojo.vo.GameInitVO;
  */
 public interface IGameAppletService extends IService<GameApplet> {
 
+    /**
+     * 根据游戏外部唯一标志获取微信小游戏token
+     *
+     * @param gameAppId : CP游戏包唯一标识
+     * @return : 微信小游戏 appId, token
+     */
+    Map<String, String> getAppletToken(String gameAppId);
+
     /**
      * applet味精检查
      *

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

@@ -26,6 +26,7 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -477,7 +478,7 @@ public class CallBackServiceImpl implements ICallBackService {
                 .orderId(platformOrderDTO.getOrderId())
                 .agentKey(agent.getAgentKey())
                 .backPolicyId(agent.getBackPolicyId())
-                .rechargeMoney(platformOrderDTO.getAmount().longValue() * 100)
+                .rechargeMoney(platformOrderDTO.getAmount().multiply(new BigDecimal(100)).longValue())
                 .orderStatus(platformOrderDTO.getStatus())
                 .regTime(user.getCreateTime())
                 .createTime(platformOrderDTO.getCreateTime())

+ 24 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameAppletServiceImpl.java

@@ -17,6 +17,7 @@ import com.zanxiang.game.module.sdk.pojo.vo.GameInitVO;
 import com.zanxiang.game.module.sdk.service.IGameAppletService;
 import com.zanxiang.game.module.sdk.service.IGameExtService;
 import com.zanxiang.game.module.sdk.service.IGameService;
+import com.zanxiang.game.module.sdk.service.api.WxApiService;
 import com.zanxiang.game.module.sdk.service.pay.MiPayService;
 import com.zanxiang.game.module.sdk.util.SignUtil;
 import com.zanxiang.module.util.JsonUtil;
@@ -58,6 +59,29 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
     @Autowired
     private MiPayService miPayService;
 
+    @Autowired
+    private WxApiService wxApiService;
+
+    @Autowired
+    private IGameAppletService gameAppletService;
+
+    @Override
+    public Map<String, String> getAppletToken(String gameAppId) {
+        GameExt gameExt = gameExtService.getByGameAppId(gameAppId);
+        if (gameExt == null) {
+            throw new BaseException("参数错误, 游戏配置信息不存在");
+        }
+        GameAppletDTO gameAppletDTO = gameAppletService.getByGameId(gameExt.getGameId());
+        if (gameAppletDTO == null) {
+            throw new BaseException("参数错误, 微信小游戏配置信息不存在");
+        }
+        String accessToken = wxApiService.getAccessToken(gameAppletDTO.getAppId(), gameAppletDTO.getAppSecret());
+        Map<String, String> resultMap = new HashMap<>(2);
+        resultMap.put("appId", gameAppletDTO.getAppId());
+        resultMap.put("accessToken", accessToken);
+        return resultMap;
+    }
+
     @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);

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

@@ -145,6 +145,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
             //返回登录信息
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
             userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE, request));
+            userLoginVO.setAccessToken(wxApiService.getAccessToken(gameAppletDTO.getAppId(), gameAppletDTO.getAppSecret()));
             log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
             return ResultVO.ok(userLoginVO);
         }
@@ -153,6 +154,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //返回登录信息
         UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
         userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.TRUE, request));
+        userLoginVO.setAccessToken(wxApiService.getAccessToken(gameAppletDTO.getAppId(), gameAppletDTO.getAppSecret()));
         log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
         return ResultVO.ok(userLoginVO);
     }

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

@@ -113,6 +113,7 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
         map.put("orderId", orderInfo.getCpOrderId());
         map.put("ext", URIUtil.encodeURIComponent(orderInfo.getExt()));
         map.put("sign", this.paySign(orderInfo.getGameId(), map));
+        map.put("orderId2", orderInfo.getOrderId());
         //url
         String url = URIUtil.fillUrlParams(cpPaybackUrl, map, false);
         String resultStr;

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

@@ -303,8 +303,8 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     private UserToken tokenSave(Long userId, String token, Integer deviceType) {
         String lockKey = RedisKeyConstant.TOKEN_CREATE_LOCK + userId + "_" + deviceType;
         //上锁
-        if (!distributedLockComponent.doLock(lockKey, 0L, 3L, TimeUnit.MINUTES)) {
-            throw new BaseException("token创建中, 请勿重复请求!");
+        if (!distributedLockComponent.doLock(lockKey, 0L, 1L, TimeUnit.MINUTES)) {
+            throw new BaseException("操作频繁, 请1分钟后重试!");
         }
         try {
             UserToken userToken = UserToken.builder()
@@ -319,8 +319,6 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             return userToken;
         } catch (Exception e) {
             throw new BaseException("创建token异常!");
-        } finally {
-            distributedLockComponent.unlock(lockKey);
         }
     }