浏览代码

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

zhimo 1 年之前
父节点
当前提交
ca19702a1c
共有 34 个文件被更改,包括 2026 次插入851 次删除
  1. 12 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java
  2. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/OverallSummaryDTO.java
  3. 1 25
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayDTO.java
  4. 1 25
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayTotalDTO.java
  5. 0 179
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsOverallSummary.java
  6. 392 107
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayTotalVO.java
  7. 135 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java
  8. 173 9
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalTotalVO.java
  9. 173 9
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalVO.java
  10. 0 66
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/OverallSummaryLineDataVO.java
  11. 67 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java
  12. 18 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTrendVO.java
  13. 7 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameDataService.java
  14. 85 165
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java
  15. 671 138
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  16. 4 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OverallSummaryServiceImpl.java
  17. 66 89
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java
  18. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  19. 8 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java
  20. 5 10
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameDTO.java
  21. 24 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/UserListVO.java
  22. 2 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserRoleService.java
  23. 3 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserService.java
  24. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IUserService.java
  25. 81 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java
  26. 10 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/User.java
  27. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  28. 9 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/UserController.java
  29. 8 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameUserRoleService.java
  30. 0 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameServiceImpl.java
  31. 18 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java
  32. 19 6
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  33. 13 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/PerformOrderServiceImpl.java
  34. 9 7
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

+ 12 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java

@@ -36,7 +36,7 @@ public class GameDataController {
     private IGameDataService gameDataService;
 
     @ApiOperation(value = "游戏每日数据")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:day")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:day")
     @PostMapping("/day")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameDataDayVO.class)})
     public ResultVO<Page<GameDataDayVO>> getGameDataDay(@RequestBody GameDataDayDTO dto) {
@@ -44,7 +44,7 @@ public class GameDataController {
     }
 
     @ApiOperation(value = "游戏每日数据总计")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:dayTotal")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:dayTotal")
     @PostMapping("/day/total")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameDataDayVO.class)})
     public ResultVO<GameDataDayTotalVO> getGameDataDay(@RequestBody GameDataDayTotalDTO dto) {
@@ -57,14 +57,22 @@ public class GameDataController {
     public ResultVO<Page<GameDataH5VO>> getH5Recharge(@RequestBody GameDataH5DTO dto) {
         return ResultVO.ok(gameDataService.getH5Recharge(dto));
     }
+
     @ApiOperation(value = "游戏总数据")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:total")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:total")
     @PostMapping("/total")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameDataTotalVO.class)})
     public ResultVO<Page<GameDataTotalVO>> getGameDataTotal(@RequestBody GameDataTotalDTO dto) {
         return ResultVO.ok(gameDataService.getGameDataTotal(dto));
     }
 
+    @ApiOperation(value = "游戏总数据总计")
+    //@PreAuthorize(permissionKey = "gameData:adsGameDay:totalTotal")
+    @PostMapping("/total/total")
+    public ResultVO<GameDataTotalTotalVO> getGameDataTotalTotal(@RequestBody GameDataTotalTotalDTO dto) {
+        return ResultVO.ok(gameDataService.getGameDataTotalTotal(dto));
+    }
+
     @ApiOperation(value = "每日流水贡献")
     @PreAuthorize(permissionKey = "gameData:adsGameDay:water")
     @PostMapping("/water")
@@ -73,7 +81,7 @@ public class GameDataController {
     }
 
     @ApiOperation(value = "游戏每日复充数据")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:again")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:again")
     @PostMapping("/again")
     public ResultVO<Map<LocalDate, List<GameDataAgainDayVO>>> getGameDataAgainDay(@RequestBody GameDataAgainDayDTO dto) throws Exception {
         return ResultVO.ok(gameDataService.getGameDataAgainDay(dto));

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

@@ -42,7 +42,7 @@ public class OverallSummaryDTO {
      * 渠道ID
      */
     @ApiModelProperty(value = "推广渠道")
-    private Long agentId;
+    private Long[] agentId;
 
     /**
      * 游戏ID

+ 1 - 25
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayDTO.java

@@ -92,29 +92,11 @@ public class PromotionDayDTO extends BasePage {
     @ApiModelProperty(value = "投手ID")
     private Long pitcherId;
 
-    /**
-     * 投手名称
-     */
-    @ApiModelProperty(value = "投手名称")
-    private String pitcherName;
-
     /**
      * 渠道ID
      */
     @ApiModelProperty(value = "渠道ID")
-    private Long agentId;
-
-    /**
-     * 渠道名称
-     */
-    @ApiModelProperty(value = "渠道名称")
-    private String agentName;
-
-    /**
-     * 渠道标识
-     */
-    @ApiModelProperty(value = "渠道标识")
-    private String agentKey;
+    private Long[] agentId;
 
     /**
      * cp名称
@@ -128,12 +110,6 @@ public class PromotionDayDTO extends BasePage {
     @ApiModelProperty(value = "游戏ID")
     private Long gameId;
 
-    /**
-     * 游戏名称
-     */
-    @ApiModelProperty(value = "游戏名称")
-    private String gameName;
-
     /**
      * 游戏应用类型
      */

+ 1 - 25
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayTotalDTO.java

@@ -91,29 +91,11 @@ public class PromotionDayTotalDTO {
     @ApiModelProperty(value = "投手ID")
     private Long pitcherId;
 
-    /**
-     * 投手名称
-     */
-    @ApiModelProperty(value = "投手名称")
-    private String pitcherName;
-
     /**
      * 渠道ID
      */
     @ApiModelProperty(value = "渠道ID")
-    private Long agentId;
-
-    /**
-     * 渠道名称
-     */
-    @ApiModelProperty(value = "渠道名称")
-    private String agentName;
-
-    /**
-     * 渠道标识
-     */
-    @ApiModelProperty(value = "渠道标识")
-    private String agentKey;
+    private Long[] agentId;
 
     /**
      * cp名称
@@ -127,12 +109,6 @@ public class PromotionDayTotalDTO {
     @ApiModelProperty(value = "游戏ID")
     private Long gameId;
 
-    /**
-     * 游戏名称
-     */
-    @ApiModelProperty(value = "游戏名称")
-    private String gameName;
-
     /**
      * 游戏应用类型
      */

+ 0 - 179
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsOverallSummary.java

@@ -1,179 +0,0 @@
-package com.zanxiang.game.data.serve.pojo.entity;
-
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.nutz.dao.entity.annotation.Column;
-import org.nutz.dao.entity.annotation.PK;
-import org.nutz.dao.entity.annotation.Table;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDate;
-
-/**
- * <p>
- * 整体概括
- * </p>
- *
- * @author
- * @since 2023-06-30
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
-@Table(AdsOverallSummary.TABLE_NAME)
-@PK({"dt", "agentId", "accountId", "sourceSystem"})
-public class AdsOverallSummary implements Serializable {
-    private static final long serialVersionUID = 1L;
-    public static final String TABLE_NAME = "ads_overall_summary";
-
-    /**
-     * 日期(用户注册时间)
-     */
-    private LocalDate dt;
-
-    /**
-     * 渠道ID
-     */
-    private Long agentId;
-
-    /**
-     * 广告账号
-     */
-    private Long accountId;
-
-    /**
-     * SDK来源
-     */
-    private String sourceSystem;
-
-    /**
-     * 投手ID
-     */
-    @Column
-    private Long pitcherId;
-
-    /**
-     * 游戏ID
-     */
-    @Column
-    private Long gameId;
-
-    /**
-     * 今日新增玩家数量
-     */
-    @Column
-    private Long todayPlayerCount;
-
-    /**
-     * 昨日新增玩家数量
-     */
-    @Column
-    private Long yesterdayPlayerCount;
-
-    /**
-     * 今日消耗
-     */
-    @Column
-    private BigDecimal todayTotalCost;
-
-    /**
-     * 昨日消耗
-     */
-    @Column
-    private BigDecimal yesterdayTotalCost;
-
-    /**
-     * 首日新用户充值
-     */
-    @Column
-    private BigDecimal firstNewUserAmount;
-
-    /**
-     * 今日新用户充值
-     */
-    @Column
-    private BigDecimal todayNewPlayerAmount;
-
-    /**
-     * 今日账面充值
-     */
-    @Column
-    private BigDecimal todayAmount;
-
-    /**
-     * 今日账面充值(买量)
-     */
-    @Column
-    private BigDecimal todayBuyAmount;
-
-    /**
-     * 今日账面充值(自然量)
-     */
-    @Column
-    private BigDecimal todayNatureAmount;
-
-    /**
-     * 昨日新用户充值
-     */
-    @Column
-    private BigDecimal yesterdayNewPlayerAmount;
-
-    /**
-     * 昨日账面充值
-     */
-    @Column
-    private BigDecimal yesterdayAmount;
-
-    /**
-     * 今日新增渠道数量
-     */
-    @Column
-    private Long todayAgentCount;
-
-    /**
-     * 昨日新增渠道数量
-     */
-    @Column
-    private Long yesterdayAgentCount;
-
-    /**
-     * 今日新增游戏数量
-     */
-    @Column
-    private Long todayGameCount;
-
-    /**
-     * 昨日新增游戏数量
-     */
-    @Column
-    private Long yesterdayGameCount;
-
-    /**
-     * 首日回本率
-     */
-    @Column
-    private BigDecimal firstRoi;
-
-    /**
-     * 7日回本率
-     */
-    @Column
-    private BigDecimal d7TotalRoi;
-
-    /**
-     * 30日回本率
-     */
-    @Column
-    private BigDecimal d30TotalRoi;
-
-    /**
-     * 总回本率
-     */
-    @Column
-    private BigDecimal totalRoi;
-
-}

+ 392 - 107
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayTotalVO.java

@@ -1,10 +1,7 @@
 package com.zanxiang.game.data.serve.pojo.vo;
 
 import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
 
@@ -14,9 +11,6 @@ import java.math.BigDecimal;
  * @Description 游戏每日数据总计一栏
  **/
 @Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
 public class GameDataDayTotalVO {
 
     /**
@@ -673,6 +667,12 @@ public class GameDataDayTotalVO {
     @ApiModelProperty(value = "(不展示)付费趋势:6个月(买量)金额/人数/增/回/倍")
     private String buyAmountM6;
 
+    /**
+     * 付费趋势:1年(买量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:1年(买量)金额/人数/增/回/倍")
+    private String buyAmountY1;
+
     /**
      * 付费趋势:总(买量)金额/人数/增/回/倍(不展示)
      */
@@ -877,6 +877,12 @@ public class GameDataDayTotalVO {
     @ApiModelProperty(value = "(不展示)付费趋势:6个月(自然量)金额/人数/增/回/倍")
     private String natureAmountM6;
 
+    /**
+     * 付费趋势:1年(自然量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:1年(自然量)金额/人数/增/回/倍")
+    private String natureAmountY1;
+
     /**
      * 付费趋势:总(自然量)金额/人数/增/回/倍(不展示)
      */
@@ -1081,190 +1087,469 @@ public class GameDataDayTotalVO {
     @ApiModelProperty(value = "(不展示)付费趋势:6个月(总量)金额/人数/增/回/倍")
     private String amountM6;
 
+    /**
+     * 付费趋势:1年(总量)金额/人数/增/回/倍(不展示)
+     */
+    @ApiModelProperty(value = "(不展示)付费趋势:1年(总量)金额/人数/增/回/倍")
+    private String amountY1;
+
     /**
      * 付费趋势:总(总量)金额/人数/增/回/倍(不展示)
      */
     @ApiModelProperty(value = "(不展示)付费趋势:总(总量)金额/人数/增/回/倍")
     private String amountSum;
 
-    /**
-     * 付费趋势:1天(买量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:1天(买量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountD1Trend;
 
-    /**
-     * 付费趋势:3天(买量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:3天(买量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD2Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountD3Trend;
 
-    /**
-     * 付费趋势:5天(买量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:5天(买量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD4Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountD5Trend;
 
-    /**
-     * 付费趋势:7天(买量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:7天(买量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD6Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountD7Trend;
 
-    /**
-     * 付费趋势:15天(买量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:15天(买量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD8Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD9Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD10Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD11Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD12Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD13Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD14Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountD15Trend;
 
-    /**
-     * 付费趋势:1个月(买量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD16Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD17Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD18Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD19Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD20Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD21Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD22Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD23Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD24Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD25Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD26Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD27Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD28Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountD29Trend;
+
     @ApiModelProperty(value = "付费趋势:1个月(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountM1Trend;
 
-    /**
-     * 付费趋势:2个月(买量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:2个月(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountM2Trend;
 
-    /**
-     * 付费趋势:3个月(买量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:3个月(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountM3Trend;
 
-    /**
-     * 付费趋势:6个月(买量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:6个月(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountM6Trend;
 
-    /**
-     * 付费趋势:总(买量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1年(买量)金额/人数/增/回/倍")
+    private RechargeTrendVO buyAmountY1Trend;
+
     @ApiModelProperty(value = "付费趋势:总(买量)金额/人数/增/回/倍")
     private RechargeTrendVO buyAmountSumTrend;
 
-    /**
-     * 付费趋势:1天(自然量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:1天(自然量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountD1Trend;
 
-    /**
-     * 付费趋势:3天(自然量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:3天(自然量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD2Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountD3Trend;
 
-    /**
-     * 付费趋势:5天(自然量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:5天(自然量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD4Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountD5Trend;
 
-    /**
-     * 付费趋势:7天(自然量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:7天(自然量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD6Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountD7Trend;
 
-    /**
-     * 付费趋势:15天(自然量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:15天(自然量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD8Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD9Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD10Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD11Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD12Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD13Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD14Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountD15Trend;
 
-    /**
-     * 付费趋势:1个月(自然量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD16Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD17Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD18Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD19Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD20Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD21Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD22Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD23Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD24Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD25Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD26Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD27Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD28Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountD29Trend;
+
     @ApiModelProperty(value = "付费趋势:1个月(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountM1Trend;
 
-    /**
-     * 付费趋势:2个月(自然量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:2个月(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountM2Trend;
 
-    /**
-     * 付费趋势:3个月(自然量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:3个月(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountM3Trend;
 
-    /**
-     * 付费趋势:6个月(自然量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:6个月(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountM6Trend;
 
+    @ApiModelProperty(value = "付费趋势:1年(自然量)金额/人数/增/回/倍")
+    private RechargeTrendVO natureAmountY1Trend;
+
     /**
      * 付费趋势:总(自然量)金额/人数/增/回/倍(展示数据)
      */
     @ApiModelProperty(value = "付费趋势:总(自然量)金额/人数/增/回/倍")
     private RechargeTrendVO natureAmountSumTrend;
 
-    /**
-     * 付费趋势:1天(总量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:1天(总量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountD1Trend;
 
-    /**
-     * 付费趋势:3天(总量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:3天(总量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD2Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountD3Trend;
 
-    /**
-     * 付费趋势:5天(总量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD4Trend;
+
     @ApiModelProperty(value = "付费趋势:5天(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountD5Trend;
 
-    /**
-     * 付费趋势:7天(总量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:7天(总量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD6Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountD7Trend;
 
-    /**
-     * 付费趋势:15天(总量)金额/人数/增/回/倍(展示数据)
-     */
-    @ApiModelProperty(value = "付费趋势:15天(总量)金额/人数/增/回/倍")
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD8Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD9Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD10Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD11Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD12Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD13Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD14Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountD15Trend;
 
-    /**
-     * 付费趋势:1个月(总量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD16Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD17Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD18Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD19Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD20Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD21Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD22Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD23Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD24Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD25Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD26Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD27Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD28Trend;
+
+    @ApiModelProperty(value = "付费趋势:1~29天(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountD29Trend;
+
     @ApiModelProperty(value = "付费趋势:1个月(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountM1Trend;
 
-    /**
-     * 付费趋势:2个月(总量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:2个月(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountM2Trend;
 
-    /**
-     * 付费趋势:3个月(总量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:3个月(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountM3Trend;
 
-    /**
-     * 付费趋势:6个月(总量)金额/人数/增/回/倍(展示数据)
-     */
     @ApiModelProperty(value = "付费趋势:6个月(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountM6Trend;
 
-    /**
-     * 付费趋势:总(总量)金额/人数/增/回/倍(展示数据)
-     */
+    @ApiModelProperty(value = "付费趋势:1年(总量)金额/人数/增/回/倍")
+    private RechargeTrendVO amountY1Trend;
+
     @ApiModelProperty(value = "付费趋势:总(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountSumTrend;
 
+    @ApiModelProperty(value = "注册成本(总量) = 消耗 / 注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(value = "总回收率(总量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal totalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(总量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal firstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(总量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal totalRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(买量) = 消耗 / 注册人数")
+    private BigDecimal buyRegCost;
+
+    @ApiModelProperty(value = "总回收率(买量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal buyTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(买量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal buyFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(买量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal buyTotalRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(自然量) = 消耗 / 注册人数")
+    private BigDecimal natureRegCost;
+
+    @ApiModelProperty(value = "总回收率(自然量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal natureTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(自然量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal natureFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(自然量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal natureTotalRechargeCost;
+
+    @ApiModelProperty(value = "单日付费100+人数(总量)")
+    private Long hundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(总量)")
+    private BigDecimal hundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(总量)")
+    private Long firstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(总量)")
+    private Long roleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(总量)")
+    private Long newUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(总量)")
+    private BigDecimal firstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(总量)")
+    private BigDecimal roleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(总量)")
+    private BigDecimal newUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(总量)")
+    private BigDecimal firstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(总量)")
+    private BigDecimal roleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(总量)")
+    private BigDecimal newUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(买量)")
+    private Long buyHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(买量)")
+    private BigDecimal buyHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(买量)")
+    private Long buyFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(买量)")
+    private Long buyRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(买量)")
+    private Long buyNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(买量)")
+    private BigDecimal buyFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(买量)")
+    private BigDecimal buyRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(买量)")
+    private BigDecimal buyNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(买量)")
+    private BigDecimal buyFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(买量)")
+    private BigDecimal buyRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(买量)")
+    private BigDecimal buyNewUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(自然量)")
+    private Long natureHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(自然量)")
+    private BigDecimal natureHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(自然量)")
+    private Long natureFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(自然量)")
+    private Long natureRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(自然量)")
+    private Long natureNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(自然量)")
+    private BigDecimal natureFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(自然量)")
+    private BigDecimal natureRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(自然量)")
+    private BigDecimal natureFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(自然量)")
+    private BigDecimal natureRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumRate;
+
 }

+ 135 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java

@@ -1416,5 +1416,140 @@ public class GameDataDayVO {
     @ApiModelProperty(value = "付费趋势:总(总量)金额/人数/增/回/倍")
     private RechargeTrendVO amountSumTrend;
 
+    @ApiModelProperty(value = "注册成本(总量) = 消耗 / 注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(value = "总回收率(总量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal totalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(总量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal firstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(总量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal totalRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(买量) = 消耗 / 注册人数")
+    private BigDecimal buyRegCost;
+
+    @ApiModelProperty(value = "总回收率(买量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal buyTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(买量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal buyFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(买量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal buyTotalRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(自然量) = 消耗 / 注册人数")
+    private BigDecimal natureRegCost;
+
+    @ApiModelProperty(value = "总回收率(自然量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal natureTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(自然量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal natureFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(自然量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal natureTotalRechargeCost;
+
+
+    @ApiModelProperty(value = "单日付费100+人数(总量)")
+    private Long hundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(总量)")
+    private BigDecimal hundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(总量)")
+    private Long firstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(总量)")
+    private Long roleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(总量)")
+    private Long newUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(总量)")
+    private BigDecimal firstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(总量)")
+    private BigDecimal roleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(总量)")
+    private BigDecimal newUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(总量)")
+    private BigDecimal firstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(总量)")
+    private BigDecimal roleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(总量)")
+    private BigDecimal newUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(买量)")
+    private Long buyHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(买量)")
+    private BigDecimal buyHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(买量)")
+    private Long buyFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(买量)")
+    private Long buyRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(买量)")
+    private Long buyNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(买量)")
+    private BigDecimal buyFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(买量)")
+    private BigDecimal buyRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(买量)")
+    private BigDecimal buyNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(买量)")
+    private BigDecimal buyFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(买量)")
+    private BigDecimal buyRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(买量)")
+    private BigDecimal buyNewUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(自然量)")
+    private Long natureHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(自然量)")
+    private BigDecimal natureHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(自然量)")
+    private Long natureFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(自然量)")
+    private Long natureRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(自然量)")
+    private Long natureNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(自然量)")
+    private BigDecimal natureFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(自然量)")
+    private BigDecimal natureRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(自然量)")
+    private BigDecimal natureFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(自然量)")
+    private BigDecimal natureRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumRate;
 
 }

+ 173 - 9
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalTotalVO.java

@@ -134,16 +134,19 @@ public class GameDataTotalTotalVO {
     private BigDecimal buyNewUserTotalAmount;
 
     /**
-     * 首日付费率(买量)
+     * 首日Roi(买量)
      */
-    @ApiModelProperty(value = "首日付费率(买量)")
+    @ApiModelProperty(value = "首日Roi(买量)")
     private BigDecimal buyFirstRoi;
 
+    @ApiModelProperty(value = "首日付费率(买量)")
+    private BigDecimal buyFirstAmountRate;
+
     /**
      * 当天付费率(买量)
      */
     @ApiModelProperty(value = "当天付费率(买量)")
-    private BigDecimal buyTodayRoi;
+    private BigDecimal buyTodayAmountRate;
 
     /**
      * 新用户付费率(买量)
@@ -326,16 +329,19 @@ public class GameDataTotalTotalVO {
     private BigDecimal natureNewUserTotalAmount;
 
     /**
-     * 首日付费率(自然量)
+     * 首日Roi(自然量)
      */
-    @ApiModelProperty(value = "首日付费率(自然量)")
+    @ApiModelProperty(value = "首日Roi(自然量)")
     private BigDecimal natureFirstRoi;
 
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal natureFirstAmountRate;
+
     /**
      * 当天付费率(自然量)
      */
     @ApiModelProperty(value = "当天付费率(自然量)")
-    private BigDecimal natureTodayRoi;
+    private BigDecimal natureTodayAmountRate;
 
     /**
      * 新用户付费率(自然量)
@@ -518,16 +524,19 @@ public class GameDataTotalTotalVO {
     private BigDecimal newUserTotalAmount;
 
     /**
-     * 首日付费率(总量)
+     * 首日Roi(总量)
      */
-    @ApiModelProperty(value = "首日付费率(总量)")
+    @ApiModelProperty(value = "首日Roi(总量)")
     private BigDecimal firstRoi;
 
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal firstAmountRate;
+
     /**
      * 当天付费率(总量)
      */
     @ApiModelProperty(value = "当天付费率(总量)")
-    private BigDecimal todayRoi;
+    private BigDecimal todayAmountRate;
 
     /**
      * 新用户付费率(总量)
@@ -619,4 +628,159 @@ public class GameDataTotalTotalVO {
     @ApiModelProperty(value = "新用户付费ARPU(总量)")
     private BigDecimal newUserAmountArpu;
 
+
+    @ApiModelProperty(value = "注册成本(总量) = 消耗 / 注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(value = "总回收率(总量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal totalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(总量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal firstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(总量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal totalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(总量) = 新用户充值今日 / 消耗")
+    private BigDecimal newUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(总量) = 消耗 / 新用户充值人数")
+    private BigDecimal newUserRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(买量) = 消耗 / 注册人数")
+    private BigDecimal buyRegCost;
+
+    @ApiModelProperty(value = "总回收率(买量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal buyTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(买量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal buyFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(买量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal buyTotalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(买量) = 新用户充值今日 / 消耗")
+    private BigDecimal buyNewUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(买量) = 消耗 / 新用户充值人数")
+    private BigDecimal buyNewUserRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(自然量) = 消耗 / 注册人数")
+    private BigDecimal natureRegCost;
+
+    @ApiModelProperty(value = "总回收率(自然量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal natureTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(自然量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal natureFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(自然量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal natureTotalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(自然量) = 新用户充值今日 / 消耗")
+    private BigDecimal natureNewUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(自然量) = 消耗 / 新用户充值人数")
+    private BigDecimal natureNewUserRechargeCost;
+
+
+    @ApiModelProperty(value = "单日付费100+人数(总量)")
+    private Long hundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(总量)")
+    private BigDecimal hundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(总量)")
+    private Long firstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(总量)")
+    private Long roleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(总量)")
+    private Long newUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(总量)")
+    private BigDecimal firstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(总量)")
+    private BigDecimal roleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(总量)")
+    private BigDecimal newUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(总量)")
+    private BigDecimal firstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(总量)")
+    private BigDecimal roleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(总量)")
+    private BigDecimal newUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(买量)")
+    private Long buyHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(买量)")
+    private BigDecimal buyHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(买量)")
+    private Long buyFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(买量)")
+    private Long buyRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(买量)")
+    private Long buyNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(买量)")
+    private BigDecimal buyFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(买量)")
+    private BigDecimal buyRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(买量)")
+    private BigDecimal buyNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(买量)")
+    private BigDecimal buyFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(买量)")
+    private BigDecimal buyRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(买量)")
+    private BigDecimal buyNewUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(自然量)")
+    private Long natureHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(自然量)")
+    private BigDecimal natureHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(自然量)")
+    private Long natureFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(自然量)")
+    private Long natureRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(自然量)")
+    private Long natureNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(自然量)")
+    private BigDecimal natureFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(自然量)")
+    private BigDecimal natureRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(自然量)")
+    private BigDecimal natureFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(自然量)")
+    private BigDecimal natureRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumRate;
+
 }

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

@@ -152,16 +152,19 @@ public class GameDataTotalVO {
     private BigDecimal buyNewUserTotalAmount;
 
     /**
-     * 首日付费率(买量)
+     * 首日Roi(买量)
      */
-    @ApiModelProperty(value = "首日付费率(买量)")
+    @ApiModelProperty(value = "首日Roi(买量)")
     private BigDecimal buyFirstRoi;
 
+    @ApiModelProperty(value = "首日付费率(买量)")
+    private BigDecimal buyFirstAmountRate;
+
     /**
      * 当天付费率(买量)
      */
     @ApiModelProperty(value = "当天付费率(买量)")
-    private BigDecimal buyTodayRoi;
+    private BigDecimal buyTodayAmountRate;
 
     /**
      * 新用户付费率(买量)
@@ -344,16 +347,19 @@ public class GameDataTotalVO {
     private BigDecimal natureNewUserTotalAmount;
 
     /**
-     * 首日付费率(自然量)
+     * 首日Roi(自然量)
      */
-    @ApiModelProperty(value = "首日付费率(自然量)")
+    @ApiModelProperty(value = "首日Roi(自然量)")
     private BigDecimal natureFirstRoi;
 
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal natureFirstAmountRate;
+
     /**
      * 当天付费率(自然量)
      */
     @ApiModelProperty(value = "当天付费率(自然量)")
-    private BigDecimal natureTodayRoi;
+    private BigDecimal natureTodayAmountRate;
 
     /**
      * 新用户付费率(自然量)
@@ -536,16 +542,19 @@ public class GameDataTotalVO {
     private BigDecimal newUserTotalAmount;
 
     /**
-     * 首日付费率(总量)
+     * 首日Roi(总量)
      */
-    @ApiModelProperty(value = "首日付费率(总量)")
+    @ApiModelProperty(value = "首日Roi(总量)")
     private BigDecimal firstRoi;
 
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal firstAmountRate;
+
     /**
      * 当天付费率(总量)
      */
     @ApiModelProperty(value = "当天付费率(总量)")
-    private BigDecimal todayRoi;
+    private BigDecimal todayAmountRate;
 
     /**
      * 新用户付费率(总量)
@@ -637,4 +646,159 @@ public class GameDataTotalVO {
     @ApiModelProperty(value = "新用户付费ARPU(总量)")
     private BigDecimal newUserAmountArpu;
 
+
+    @ApiModelProperty(value = "注册成本(总量) = 消耗 / 注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(value = "总回收率(总量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal totalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(总量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal firstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(总量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal totalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(总量) = 新用户充值今日 / 消耗")
+    private BigDecimal newUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(总量) = 消耗 / 新用户充值人数")
+    private BigDecimal newUserRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(买量) = 消耗 / 注册人数")
+    private BigDecimal buyRegCost;
+
+    @ApiModelProperty(value = "总回收率(买量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal buyTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(买量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal buyFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(买量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal buyTotalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(买量) = 新用户充值今日 / 消耗")
+    private BigDecimal buyNewUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(买量) = 消耗 / 新用户充值人数")
+    private BigDecimal buyNewUserRechargeCost;
+
+    @ApiModelProperty(value = "注册成本(自然量) = 消耗 / 注册人数")
+    private BigDecimal natureRegCost;
+
+    @ApiModelProperty(value = "总回收率(自然量) = 新用户累计充值金额 / 消耗")
+    private BigDecimal natureTotalRoi;
+
+    @ApiModelProperty(value = "首日充值成本(自然量) = 消耗 / 首日新用户充值人数")
+    private BigDecimal natureFirstNewUserRechargeCost;
+
+    @ApiModelProperty(value = "总充值成本(自然量) = 消耗 / 新用户累计充值人数")
+    private BigDecimal natureTotalRechargeCost;
+
+    @ApiModelProperty(value = "新用户回收率(自然量) = 新用户充值今日 / 消耗")
+    private BigDecimal natureNewUserRechargeRate;
+
+    @ApiModelProperty(value = "新用户充值成本(自然量) = 消耗 / 新用户充值人数")
+    private BigDecimal natureNewUserRechargeCost;
+
+
+    @ApiModelProperty(value = "单日付费100+人数(总量)")
+    private Long hundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(总量)")
+    private BigDecimal hundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(总量)")
+    private Long firstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(总量)")
+    private Long roleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(总量)")
+    private Long newUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(总量)")
+    private BigDecimal firstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(总量)")
+    private BigDecimal roleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(总量)")
+    private BigDecimal newUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(总量)")
+    private BigDecimal firstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(总量)")
+    private BigDecimal roleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(总量)")
+    private BigDecimal newUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(买量)")
+    private Long buyHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(买量)")
+    private BigDecimal buyHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(买量)")
+    private Long buyFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(买量)")
+    private Long buyRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(买量)")
+    private Long buyNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(买量)")
+    private BigDecimal buyFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(买量)")
+    private BigDecimal buyRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(买量)")
+    private BigDecimal buyNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(买量)")
+    private BigDecimal buyFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(买量)")
+    private BigDecimal buyRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(买量)")
+    private BigDecimal buyNewUserTotalRoleNumRate;
+
+    @ApiModelProperty(value = "单日付费100+人数(自然量)")
+    private Long natureHundredUserNum;
+
+    @ApiModelProperty(value = "单日付费100+成本 = 消耗 / 单日付费100+人数(自然量)")
+    private BigDecimal natureHundredUserNumCost;
+
+    @ApiModelProperty(value = "首日创角人数(自然量)")
+    private Long natureFirstRoleNum;
+
+    @ApiModelProperty(value = "创角人数(自然量)")
+    private Long natureRoleNum;
+
+    @ApiModelProperty(value = "新用户累计创角人数(自然量)")
+    private Long natureNewUserTotalRoleNum;
+
+    @ApiModelProperty(value = "首日创角人数成本(自然量)")
+    private BigDecimal natureFirstRoleNumCost;
+
+    @ApiModelProperty(value = "创角人数成本(自然量)")
+    private BigDecimal natureRoleNumCost;
+
+    @ApiModelProperty(value = "新用户累计创角人数成本(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumCost;
+
+    @ApiModelProperty(value = "首日创角率(自然量)")
+    private BigDecimal natureFirstRoleNumRate;
+
+    @ApiModelProperty(value = "创角率(自然量)")
+    private BigDecimal natureRoleNumRate;
+
+    @ApiModelProperty(value = "新用户累计创角率(自然量)")
+    private BigDecimal natureNewUserTotalRoleNumRate;
+
 }

+ 0 - 66
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/OverallSummaryLineDataVO.java

@@ -1,66 +0,0 @@
-package com.zanxiang.game.data.serve.pojo.vo;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.time.LocalDate;
-
-/**
- * @author tianhua
- * @time 2023/7/5
- * @Description 整体概况折线图前端展示数据实体
- **/
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-public class OverallSummaryLineDataVO {
-
-    /**
-     * 日期
-     */
-    @ApiModelProperty(value = "日期")
-    private LocalDate dt;
-
-    /**
-     * 消耗
-     */
-    @ApiModelProperty(value = "消耗")
-    private BigDecimal cost;
-
-    /**
-     * 充值
-     */
-    @ApiModelProperty(value = "充值")
-    private BigDecimal amount;
-
-    /**
-     * 买量充值
-     */
-    @ApiModelProperty(value = "买量充值")
-    private BigDecimal buyAmount;
-
-    /**
-     * 自然量充值
-     */
-    @ApiModelProperty(value = "自然量充值")
-    private BigDecimal natureAmount;
-
-    /**
-     * 首日ROI
-     */
-    @ApiModelProperty(value = "首日ROI")
-    private BigDecimal firstRoi;
-
-    /**
-     * 新增用户
-     */
-    @ApiModelProperty(value = "新增用户")
-    private Long playerAccount;
-
-
-}

+ 67 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java

@@ -960,5 +960,72 @@ public class PromotionDayVO {
      */
     @ApiModelProperty(value = "15日:ROI/付费/倍数")
     private PromotionRechargeTrendVO d15Trend;
+
+
+    /**
+     * 注册人数 (应用下载广告数据-激活数)
+     */
+    @ApiModelProperty(value = "注册人数 (应用下载广告数据-激活数)")
+    private Long active;
+
+    /**
+     * 注册成本 (应用下载广告数据-激活成本)
+     */
+    @ApiModelProperty(value = "注册成本 (应用下载广告数据-激活成本)")
+    private BigDecimal activeCost;
+
+    /**
+     * 首日转化数 (转化数据-转化数)
+     */
+    @ApiModelProperty(value = "首日转化数 (转化数据-转化数)")
+    private Long firstConvertCount;
+
+    /**
+     * 首日转化成本 (转化数据-转化成本)
+     */
+    @ApiModelProperty(value = "首日转化成本 (转化数据-转化成本)")
+    private BigDecimal firstConvertCost;
+
+    /**
+     * 首次付费率 (应用下载广告数据-首次付费率)
+     */
+    @ApiModelProperty(value = "首次付费率 (应用下载广告数据-首次付费率)")
+    private BigDecimal firstActivePayRate;
+
+    /**
+     * 首日付费金额(当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额)
+     */
+    @ApiModelProperty(value = "首日付费金额(当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额)")
+    private BigDecimal firstAttributionGameInAppLtv1day;
+
+    /**
+     * 首日付费ROI (当日付费ROI)
+     */
+    @ApiModelProperty(value = "首日付费ROI (当日付费ROI)")
+    private BigDecimal firstAttributionGameInAppRoi1day;
+
+    /**
+     * 付费次数 (应用下载广告数据-付费次数)
+     */
+    @ApiModelProperty(value = "付费次数 (应用下载广告数据-付费次数)")
+    private Long gamePayCount;
+
+    /**
+     * ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)
+     */
+    @ApiModelProperty(value = "ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)")
+    private BigDecimal ltvDay1;
+
+    /**
+     * 每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))
+     */
+    @ApiModelProperty(value = "每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))")
+    private Long subOrderNum;
+
+    /**
+     * 每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )
+     */
+    @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
+    private BigDecimal subOrderAmount;
     
 }

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

@@ -13,21 +13,39 @@ import java.math.BigDecimal;
 @AllArgsConstructor
 @Builder
 public class RechargeTrendVO {
+    /**
+     * 充值人数
+     */
     @ApiModelProperty(notes = "充值人数")
     private Long rechargeUserCount;
 
+    /**
+     * 充值金额
+     */
     @ApiModelProperty(notes = "充值金额")
     private BigDecimal rechargeMoney;
 
+    /**
+     * 增
+     */
     @ApiModelProperty(notes = "增")
     private BigDecimal increase;
 
+    /**
+     * 回
+     */
     @ApiModelProperty(notes = "回")
     private BigDecimal back;
 
+    /**
+     * 倍
+     */
     @ApiModelProperty(notes = "倍")
     private BigDecimal multiples;
 
+    /**
+     * 总充值金额
+     */
     @ApiModelProperty(notes = "总充值金额")
     private BigDecimal rechargeMoneyTotal;
 }

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

@@ -31,6 +31,13 @@ public interface IGameDataService {
      */
     Page<GameDataTotalVO> getGameDataTotal(GameDataTotalDTO dto);
 
+    /**
+     * 游戏总数据总计一栏
+     * @param dto
+     * @return
+     */
+    GameDataTotalTotalVO getGameDataTotalTotal(GameDataTotalTotalDTO dto);
+
     /**
      * 游戏流水数据
      * @param dto

+ 85 - 165
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java

@@ -219,58 +219,75 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
 
     private void setDayTotalRechargeTrend(GamePromoteDayTotalVO item) {
         BigDecimal trendDay1Money = new BigDecimal(item.getTrendDay1().split("/")[0]);
-        item.setRechargeTrendDay1(getSumRechargeTrendVO(item.getTrendDay1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay2(getSumRechargeTrendVO(item.getTrendDay2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay3(getSumRechargeTrendVO(item.getTrendDay3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay4(getSumRechargeTrendVO(item.getTrendDay4(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay5(getSumRechargeTrendVO(item.getTrendDay5(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay6(getSumRechargeTrendVO(item.getTrendDay6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay7(getSumRechargeTrendVO(item.getTrendDay7(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay8(getSumRechargeTrendVO(item.getTrendDay8(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay9(getSumRechargeTrendVO(item.getTrendDay9(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay10(getSumRechargeTrendVO(item.getTrendDay10(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay11(getSumRechargeTrendVO(item.getTrendDay11(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay12(getSumRechargeTrendVO(item.getTrendDay12(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay13(getSumRechargeTrendVO(item.getTrendDay13(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay14(getSumRechargeTrendVO(item.getTrendDay14(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay15(getSumRechargeTrendVO(item.getTrendDay15(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay16(getSumRechargeTrendVO(item.getTrendDay16(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay17(getSumRechargeTrendVO(item.getTrendDay17(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay18(getSumRechargeTrendVO(item.getTrendDay18(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay19(getSumRechargeTrendVO(item.getTrendDay19(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay20(getSumRechargeTrendVO(item.getTrendDay20(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay21(getSumRechargeTrendVO(item.getTrendDay21(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay22(getSumRechargeTrendVO(item.getTrendDay22(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay23(getSumRechargeTrendVO(item.getTrendDay23(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay24(getSumRechargeTrendVO(item.getTrendDay24(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay25(getSumRechargeTrendVO(item.getTrendDay25(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay26(getSumRechargeTrendVO(item.getTrendDay26(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay27(getSumRechargeTrendVO(item.getTrendDay27(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay28(getSumRechargeTrendVO(item.getTrendDay28(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay29(getSumRechargeTrendVO(item.getTrendDay29(), trendDay1Money, item.getCost()));
-
-        item.setRechargeTrendMonth1(getSumRechargeTrendVO(item.getTrendMonth1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth2(getSumRechargeTrendVO(item.getTrendMonth2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth3(getSumRechargeTrendVO(item.getTrendMonth3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth6(getSumRechargeTrendVO(item.getTrendMonth6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendYear1(getSumRechargeTrendVO(item.getTrendYear1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendTotal(getSumRechargeTrendVO(item.getTrendTotal(), trendDay1Money, item.getCost()));
+        item.setRechargeTrendDay1(getSumRechargeTrendVO(item.getTrendDay1()));
+        item.setRechargeTrendDay2(getSumRechargeTrendVO(item.getTrendDay2()));
+        item.setRechargeTrendDay3(getSumRechargeTrendVO(item.getTrendDay3()));
+        item.setRechargeTrendDay4(getSumRechargeTrendVO(item.getTrendDay4()));
+        item.setRechargeTrendDay5(getSumRechargeTrendVO(item.getTrendDay5()));
+        item.setRechargeTrendDay6(getSumRechargeTrendVO(item.getTrendDay6()));
+        item.setRechargeTrendDay7(getSumRechargeTrendVO(item.getTrendDay7()));
+        item.setRechargeTrendDay8(getSumRechargeTrendVO(item.getTrendDay8()));
+        item.setRechargeTrendDay9(getSumRechargeTrendVO(item.getTrendDay9()));
+        item.setRechargeTrendDay10(getSumRechargeTrendVO(item.getTrendDay10()));
+        item.setRechargeTrendDay11(getSumRechargeTrendVO(item.getTrendDay11()));
+        item.setRechargeTrendDay12(getSumRechargeTrendVO(item.getTrendDay12()));
+        item.setRechargeTrendDay13(getSumRechargeTrendVO(item.getTrendDay13()));
+        item.setRechargeTrendDay14(getSumRechargeTrendVO(item.getTrendDay14()));
+        item.setRechargeTrendDay15(getSumRechargeTrendVO(item.getTrendDay15()));
+        item.setRechargeTrendDay16(getSumRechargeTrendVO(item.getTrendDay16()));
+        item.setRechargeTrendDay17(getSumRechargeTrendVO(item.getTrendDay17()));
+        item.setRechargeTrendDay18(getSumRechargeTrendVO(item.getTrendDay18()));
+        item.setRechargeTrendDay19(getSumRechargeTrendVO(item.getTrendDay19()));
+        item.setRechargeTrendDay20(getSumRechargeTrendVO(item.getTrendDay20()));
+        item.setRechargeTrendDay21(getSumRechargeTrendVO(item.getTrendDay21()));
+        item.setRechargeTrendDay22(getSumRechargeTrendVO(item.getTrendDay22()));
+        item.setRechargeTrendDay23(getSumRechargeTrendVO(item.getTrendDay23()));
+        item.setRechargeTrendDay24(getSumRechargeTrendVO(item.getTrendDay24()));
+        item.setRechargeTrendDay25(getSumRechargeTrendVO(item.getTrendDay25()));
+        item.setRechargeTrendDay26(getSumRechargeTrendVO(item.getTrendDay26()));
+        item.setRechargeTrendDay27(getSumRechargeTrendVO(item.getTrendDay27()));
+        item.setRechargeTrendDay28(getSumRechargeTrendVO(item.getTrendDay28()));
+        item.setRechargeTrendDay29(getSumRechargeTrendVO(item.getTrendDay29()));
+
+        item.setRechargeTrendMonth1(getSumRechargeTrendVO(item.getTrendMonth1()));
+        item.setRechargeTrendMonth2(getSumRechargeTrendVO(item.getTrendMonth2()));
+        item.setRechargeTrendMonth3(getSumRechargeTrendVO(item.getTrendMonth3()));
+        item.setRechargeTrendMonth6(getSumRechargeTrendVO(item.getTrendMonth6()));
+        item.setRechargeTrendYear1(getSumRechargeTrendVO(item.getTrendYear1()));
+
+        String[] trendDayResult = item.getTrendTotal().split("/");
+        BigDecimal dayTotalRecharge = new BigDecimal(trendDayResult[1]);
+        BigDecimal dayRecharge = new BigDecimal(trendDayResult[0]);
+        BigDecimal cost = item.getCost();
+        item.setRechargeTrendTotal(RechargeTrendVO.builder()
+                .rechargeMoney(new BigDecimal(trendDayResult[0]))
+                .rechargeUserCount(Long.valueOf(trendDayResult[2]))
+                .rechargeMoneyTotal(dayTotalRecharge)
+                .increase(cost.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO : dayRecharge.divide(cost, 4, RoundingMode.DOWN))
+                .back(cost.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO : dayTotalRecharge.divide(cost, 4, RoundingMode.DOWN))
+                .multiples(trendDay1Money.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO : dayTotalRecharge.divide(trendDay1Money, 4, RoundingMode.DOWN))
+                .build());
     }
 
-    private RechargeTrendVO getSumRechargeTrendVO(String trendDay, BigDecimal trendDay1Money, BigDecimal cost) {
+    private RechargeTrendVO getSumRechargeTrendVO(String trendDay) {
         String[] trendDayResult = trendDay.split("/");
         BigDecimal dayTotalRecharge = new BigDecimal(trendDayResult[1]);
         BigDecimal dayRecharge = new BigDecimal(trendDayResult[0]);
+        BigDecimal currCost = new BigDecimal(trendDayResult[3]);
+        BigDecimal currDay1 = new BigDecimal(trendDayResult[4]);
         return RechargeTrendVO.builder()
                 .rechargeMoney(dayRecharge)
                 .rechargeUserCount(Long.valueOf(trendDayResult[2]))
                 .rechargeMoneyTotal(dayTotalRecharge)
-                .increase(cost.compareTo(BigDecimal.ZERO) == 0 ?
-                        BigDecimal.ZERO:dayRecharge.divide(cost,4, RoundingMode.DOWN))
-                .back(cost.compareTo(BigDecimal.ZERO) == 0 ?
-                        BigDecimal.ZERO:dayTotalRecharge.divide(cost,4, RoundingMode.DOWN))
-                .multiples(trendDay1Money.compareTo(BigDecimal.ZERO) == 0 ?
-                        BigDecimal.ZERO:dayTotalRecharge.divide(trendDay1Money,4, RoundingMode.DOWN))
+                .increase(currCost.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO:dayRecharge.divide(currCost,4, RoundingMode.DOWN))
+                .back(currCost.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO:dayTotalRecharge.divide(currCost,4, RoundingMode.DOWN))
+                .multiples(currDay1.compareTo(BigDecimal.ZERO) == 0 ?
+                        BigDecimal.ZERO:dayTotalRecharge.divide(currDay1,4, RoundingMode.DOWN))
                 .build();
     }
 
@@ -372,9 +389,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         showSql.setParam("rechargeEndDay", dto.getRechargeEndDay());
         //循环总数据的每条数据
         List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
-
-            setTotalRechargeTrend(item);
-
             showSql.setParam("sourceSystem", item.getSourceSystem());
             showSql.setParam("agentId", item.getAgentId());
             showSql.setParam("accountId", item.getAccountId());
@@ -488,46 +502,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
         return new Page<>(hasRechargeDayList, pager);
     }
 
-    private void setTotalRechargeTrend(GamePromoteTotalVO item) {
-        BigDecimal trendDay1Money = new BigDecimal(item.getTrendDay1().split("/")[0]);
-        item.setRechargeTrendDay1(getSumRechargeTrendVO(item.getTrendDay1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay2(getSumRechargeTrendVO(item.getTrendDay2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay3(getSumRechargeTrendVO(item.getTrendDay3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay4(getSumRechargeTrendVO(item.getTrendDay4(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay5(getSumRechargeTrendVO(item.getTrendDay5(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay6(getSumRechargeTrendVO(item.getTrendDay6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay7(getSumRechargeTrendVO(item.getTrendDay7(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay8(getSumRechargeTrendVO(item.getTrendDay8(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay9(getSumRechargeTrendVO(item.getTrendDay9(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay10(getSumRechargeTrendVO(item.getTrendDay10(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay11(getSumRechargeTrendVO(item.getTrendDay11(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay12(getSumRechargeTrendVO(item.getTrendDay12(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay13(getSumRechargeTrendVO(item.getTrendDay13(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay14(getSumRechargeTrendVO(item.getTrendDay14(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay15(getSumRechargeTrendVO(item.getTrendDay15(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay16(getSumRechargeTrendVO(item.getTrendDay16(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay17(getSumRechargeTrendVO(item.getTrendDay17(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay18(getSumRechargeTrendVO(item.getTrendDay18(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay19(getSumRechargeTrendVO(item.getTrendDay19(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay20(getSumRechargeTrendVO(item.getTrendDay20(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay21(getSumRechargeTrendVO(item.getTrendDay21(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay22(getSumRechargeTrendVO(item.getTrendDay22(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay23(getSumRechargeTrendVO(item.getTrendDay23(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay24(getSumRechargeTrendVO(item.getTrendDay24(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay25(getSumRechargeTrendVO(item.getTrendDay25(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay26(getSumRechargeTrendVO(item.getTrendDay26(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay27(getSumRechargeTrendVO(item.getTrendDay27(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay28(getSumRechargeTrendVO(item.getTrendDay28(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay29(getSumRechargeTrendVO(item.getTrendDay29(), trendDay1Money, item.getCost()));
-
-        item.setRechargeTrendMonth1(getSumRechargeTrendVO(item.getTrendMonth1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth2(getSumRechargeTrendVO(item.getTrendMonth2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth3(getSumRechargeTrendVO(item.getTrendMonth3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth6(getSumRechargeTrendVO(item.getTrendMonth6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendYear1(getSumRechargeTrendVO(item.getTrendYear1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendTotal(getSumRechargeTrendVO(item.getTrendTotal(), trendDay1Money, item.getCost()));
-    }
-
     @Override
     public Map<LocalDate, List<AgentDayAgainVO>> accountAgentDayAgain(AgentDayAgainDTO dto) {
 
@@ -821,50 +795,9 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                 BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getOldUserRechargeCount()), 4, RoundingMode.DOWN));
         gamePromoteTotalSumVO.setShowRechargeCountCost(gamePromoteTotalSumVO.getShowRechargeCount() == 0 ?
                 BigDecimal.ZERO : gamePromoteTotalSumVO.getCost().divide(BigDecimal.valueOf(gamePromoteTotalSumVO.getShowRechargeCount()), 4, RoundingMode.DOWN));
-        setTotalSumRechargeTrend(gamePromoteTotalSumVO);
         return gamePromoteTotalSumVO;
     }
 
-    private void setTotalSumRechargeTrend(GamePromoteTotalSumVO item) {
-        BigDecimal trendDay1Money = new BigDecimal(item.getTrendDay1().split("/")[0]);
-        item.setRechargeTrendDay1(getSumRechargeTrendVO(item.getTrendDay1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay2(getSumRechargeTrendVO(item.getTrendDay2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay3(getSumRechargeTrendVO(item.getTrendDay3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay4(getSumRechargeTrendVO(item.getTrendDay4(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay5(getSumRechargeTrendVO(item.getTrendDay5(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay6(getSumRechargeTrendVO(item.getTrendDay6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay7(getSumRechargeTrendVO(item.getTrendDay7(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay8(getSumRechargeTrendVO(item.getTrendDay8(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay9(getSumRechargeTrendVO(item.getTrendDay9(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay10(getSumRechargeTrendVO(item.getTrendDay10(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay11(getSumRechargeTrendVO(item.getTrendDay11(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay12(getSumRechargeTrendVO(item.getTrendDay12(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay13(getSumRechargeTrendVO(item.getTrendDay13(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay14(getSumRechargeTrendVO(item.getTrendDay14(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay15(getSumRechargeTrendVO(item.getTrendDay15(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay16(getSumRechargeTrendVO(item.getTrendDay16(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay17(getSumRechargeTrendVO(item.getTrendDay17(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay18(getSumRechargeTrendVO(item.getTrendDay18(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay19(getSumRechargeTrendVO(item.getTrendDay19(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay20(getSumRechargeTrendVO(item.getTrendDay20(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay21(getSumRechargeTrendVO(item.getTrendDay21(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay22(getSumRechargeTrendVO(item.getTrendDay22(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay23(getSumRechargeTrendVO(item.getTrendDay23(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay24(getSumRechargeTrendVO(item.getTrendDay24(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay25(getSumRechargeTrendVO(item.getTrendDay25(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay26(getSumRechargeTrendVO(item.getTrendDay26(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay27(getSumRechargeTrendVO(item.getTrendDay27(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay28(getSumRechargeTrendVO(item.getTrendDay28(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendDay29(getSumRechargeTrendVO(item.getTrendDay29(), trendDay1Money, item.getCost()));
-
-        item.setRechargeTrendMonth1(getSumRechargeTrendVO(item.getTrendMonth1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth2(getSumRechargeTrendVO(item.getTrendMonth2(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth3(getSumRechargeTrendVO(item.getTrendMonth3(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendMonth6(getSumRechargeTrendVO(item.getTrendMonth6(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendYear1(getSumRechargeTrendVO(item.getTrendYear1(), trendDay1Money, item.getCost()));
-        item.setRechargeTrendTotal(getSumRechargeTrendVO(item.getTrendTotal(), trendDay1Money, item.getCost()));
-    }
-
     private SimpleCriteria getSimpleCriteria(GamePromoteTotalSumDTO dto) {
         SimpleCriteria cri = Cnd.cri();
         // 组装条件
@@ -1212,11 +1145,21 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                          """
                 +trendDay()+
                         """
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 2) AS BIGINT))) AS trend_month1,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 2) AS BIGINT))) AS trend_month2,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 2) AS BIGINT))) AS trend_month3,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 2) AS BIGINT))) AS trend_month6,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT))) AS trend_year1,
+                         CONCAT(SUM(CAST(SPLIT_PART(amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 2) AS BIGINT)),'/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 29 DAY) > CURRENT_DATE(), 0, cost)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 29 DAY) > CURRENT_DATE(), 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))) AS trend_month1,
+                         CONCAT(SUM(CAST(SPLIT_PART(amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 2) AS BIGINT)),'/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 59 DAY) > CURRENT_DATE(), 0, cost)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 59 DAY) > CURRENT_DATE(), 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))) AS trend_month2,
+                         CONCAT(SUM(CAST(SPLIT_PART(amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 2) AS BIGINT)),'/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 89 DAY) > CURRENT_DATE(), 0, cost)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 89 DAY) > CURRENT_DATE(), 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))) AS trend_month3,
+                         CONCAT(SUM(CAST(SPLIT_PART(amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 2) AS BIGINT)),'/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 179 DAY) > CURRENT_DATE(), 0, cost)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 179 DAY) > CURRENT_DATE(), 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))) AS trend_month6,
+                         CONCAT(SUM(CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT)),'/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 359 DAY) > CURRENT_DATE(), 0, cost)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 359 DAY) > CURRENT_DATE(), 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))) AS trend_year1,
                          CONCAT(SUM(CAST(SPLIT_PART(amount_sum , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 2) AS BIGINT))) AS trend_total,
                     round(if(sum(register_num) > 0, sum(first_new_user_amount_num) / sum(register_num), 0), 4) as first_recharge_rate,
                     round(if(sum(register_num) > 0, sum(buy_new_user_total_amount_num) / sum(register_num), 0), 4) as buy_user_recharge_rate,
@@ -1242,23 +1185,18 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                         """;
     }
 
-    private String trendDay(){
+    private String trendDay() {
         StringBuilder trendDay = new StringBuilder(StringUtils.EMPTY);
+        LocalDate now = LocalDate.now();
         for (int day = 1; day <= 29; day++) {
-            trendDay.append("CONCAT(")
-                    .append("SUM(CAST(SPLIT_PART(amount_d")
-                    .append(day)
-                    .append(" , '/', 1) AS DECIMAL(10, 2))), ")
-                    .append("'/', ")
-                    .append("SUM(CAST(SPLIT_PART(amount_d")
-                    .append(day)
-                    .append(", '/', 6) AS DECIMAL(10, 2))), ")
-                    .append("'/', ")
-                    .append("SUM(CAST(SPLIT_PART(amount_d")
-                    .append(day)
-                    .append(", '/', 2) AS BIGINT))")
-                    .append(") AS trend_day")
-                    .append(day).append(",");
+            trendDay.append("""
+                    CONCAT(
+                        SUM(CAST(SPLIT_PART(amount_d%s , '/', 1) AS DECIMAL(10, 2))), '/',
+                        SUM(CAST(SPLIT_PART(amount_d%s, '/', 6) AS DECIMAL(10, 2))), '/',
+                        SUM(CAST(SPLIT_PART(amount_d%s, '/', 2) AS BIGINT)), '/',
+                        SUM(IF(DATE_ADD(dt, INTERVAL %s DAY) > '%s', 0, cost)), '/',
+                        SUM(IF(DATE_ADD(dt, INTERVAL %s DAY) > '%s', 0, CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2))))
+                    ) AS trend_day%s,""".formatted(day, day, day, day - 1, now,day-1,now,day));
         }
         return trendDay.toString();
     }
@@ -1362,15 +1300,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m6, '/', 6)) / sum(cost), 0), 4) as roi_day180,
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_y1, '/', 6)) / sum(cost), 0), 4) as roi_year1,
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_sum, '/', 6)) / sum(cost), 0), 4) as roi_total,
-                          """
-                            +trendDay()+
-                          """
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 2) AS BIGINT))) AS trend_month1,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 2) AS BIGINT))) AS trend_month2,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 2) AS BIGINT))) AS trend_month3,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 2) AS BIGINT))) AS trend_month6,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT))) AS trend_year1,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_sum , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 2) AS BIGINT))) AS trend_total,
                 	round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as today_recharge_rate,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
@@ -1486,15 +1415,6 @@ public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m6, '/', 6)) / sum(cost), 0), 4) as roi_day180,
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_y1, '/', 6)) / sum(cost), 0), 4) as roi_year1,
                          round(if(sum(cost) > 0, sum(SPLIT_PART(amount_sum, '/', 6)) / sum(cost), 0), 4) as roi_total,
-                        """
-                +trendDay()+
-                        """
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m1, '/', 2) AS BIGINT))) AS trend_month1,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m2, '/', 2) AS BIGINT))) AS trend_month2,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m3, '/', 2) AS BIGINT))) AS trend_month3,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 2) AS BIGINT))) AS trend_month6,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT))) AS trend_year1,
-                         CONCAT(SUM(CAST(SPLIT_PART(amount_sum , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_sum, '/', 2) AS BIGINT))) AS trend_total,
                 	round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
                 	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as today_recharge_rate,
                 	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,

+ 671 - 138
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -52,10 +52,16 @@ import java.util.stream.Collectors;
 @Slf4j
 public class GameDataServiceImpl implements IGameDataService {
     private static final List<Tuple2<Field, Field>> dayNFieldMapList;
-    static  {
+    private static final List<Tuple2<Field, Field>> dayNTotalFieldMapList;
+
+    static {
         Map<String, Field> fieldMap = new HashMap<>();
+        Map<String, Field> fieldTotalMap = new HashMap<>();
         List<Field> dayNFieldList = new ArrayList<>();
+        List<Field> dayNTotalFieldList = new ArrayList<>();
         Class<?> tempClazz = GameDataDayVO.class;
+        Class<?> tempTotalClazz = GameDataDayTotalVO.class;
+
         while (tempClazz != null) {
             Field[] fields = tempClazz.getDeclaredFields();
             for (Field field : fields) {
@@ -69,19 +75,48 @@ public class GameDataServiceImpl implements IGameDataService {
             }
             tempClazz = tempClazz.getSuperclass();
         }
-        if(dayNFieldList.isEmpty()) {
-            dayNFieldMapList  = Collections.emptyList();
+
+        while (tempTotalClazz != null) {
+            Field[] fields = tempTotalClazz.getDeclaredFields();
+            for (Field field : fields) {
+                if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
+                    continue;
+                }
+                fieldTotalMap.put(field.getName(), field);
+                if (field.getType() == RechargeTrendVO.class) {
+                    dayNTotalFieldList.add(field);
+                }
+            }
+            tempTotalClazz = tempTotalClazz.getSuperclass();
+        }
+
+        if (dayNFieldList.isEmpty()) {
+            dayNFieldMapList = Collections.emptyList();
         } else {
             dayNFieldMapList = new ArrayList<>(dayNFieldList.size());
-            for(Field dayNField : dayNFieldList) {
+            for (Field dayNField : dayNFieldList) {
                 dayNField.setAccessible(true);
                 Field sourceField = fieldMap.get(dayNField.getName().replace("Trend", ""));
                 sourceField.setAccessible(true);
-                if(sourceField != null) {
+                if (sourceField != null) {
                     dayNFieldMapList.add(Tuples.of(sourceField, dayNField));
                 }
             }
         }
+
+        if (dayNTotalFieldList.isEmpty()) {
+            dayNTotalFieldMapList = Collections.emptyList();
+        } else {
+            dayNTotalFieldMapList = new ArrayList<>(dayNTotalFieldList.size());
+            for (Field dayNTotalField : dayNTotalFieldList) {
+                dayNTotalField.setAccessible(true);
+                Field sourceField = fieldTotalMap.get(dayNTotalField.getName().replace("Trend", ""));
+                sourceField.setAccessible(true);
+                if (sourceField != null) {
+                    dayNTotalFieldMapList.add(Tuples.of(sourceField, dayNTotalField));
+                }
+            }
+        }
     }
 
     @Autowired
@@ -183,6 +218,9 @@ public class GameDataServiceImpl implements IGameDataService {
             //拼接SDK来源
             cri.where().andEquals("source_system", dto.getSourceSystem());
         }
+        if (dto.getGameClassify() != null) {
+            cri.where().andEquals("game_classify", dto.getGameClassify());
+        }
         if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
             //拼接查询时间
             cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
@@ -195,8 +233,12 @@ public class GameDataServiceImpl implements IGameDataService {
         gameDataDayTotalsql.setEntity(dao.getEntity(GameDataDayTotalVO.class));
         //执行sql
         dao.execute(gameDataDayTotalsql);
-
-        return gameDataDayTotalsql.getObject(GameDataDayTotalVO.class);
+        //得到每日总计对象
+        GameDataDayTotalVO vo = gameDataDayTotalsql.getObject(GameDataDayTotalVO.class);
+        if (vo.getAmountD1() != null) {
+            formatDayNTotal(vo);
+        }
+        return vo;
     }
 
     /**
@@ -328,6 +370,13 @@ public class GameDataServiceImpl implements IGameDataService {
             vo.setBuyNewUserAmountArpu(vo.getBuyNewUserAmountNum().compareTo(0L) == 0 ? BigDecimal.ZERO :
                     BigDecimal.valueOf(vo.getBuyNewUserAmount().doubleValue() / vo.getBuyNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
+            //新用户回收率
+            vo.setBuyNewUserRechargeRate(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                    vo.getBuyNewUserAmount().divide(vo.getCost(), 4, RoundingMode.HALF_UP));
+            //新用户充值成本
+            vo.setBuyNewUserRechargeCost(vo.getBuyNewUserAmountNum() == 0 ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getBuyNewUserAmountNum()), 4, RoundingMode.HALF_UP));
+
             //设置自然量数据
             //新用户充值次数、金额、人数
             vo.setNatureNewUserAmount(natureDayN == null ? BigDecimal.ZERO : natureDayN.getRechargeMoney());
@@ -363,6 +412,13 @@ public class GameDataServiceImpl implements IGameDataService {
             vo.setNatureNewUserAmountArpu(vo.getNatureNewUserAmountNum().compareTo(0L) == 0 ? BigDecimal.ZERO :
                     BigDecimal.valueOf(vo.getNatureNewUserAmount().doubleValue() / vo.getNatureNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
+            //新用户回收率
+            vo.setNatureNewUserRechargeRate(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                    vo.getNatureNewUserAmount().divide(vo.getCost(), 4, RoundingMode.HALF_UP));
+            //新用户充值成本
+            vo.setNatureNewUserRechargeCost(vo.getNatureNewUserAmountNum() == 0 ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getNatureNewUserAmountNum()), 4, RoundingMode.HALF_UP));
+
             //设置总量数据
             //新用户充值次数、金额、人数
             vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
@@ -398,6 +454,13 @@ public class GameDataServiceImpl implements IGameDataService {
             vo.setNewUserAmountArpu(vo.getNewUserAmountNum().compareTo(0L) == 0 ? BigDecimal.ZERO :
                     BigDecimal.valueOf(vo.getNewUserAmount().doubleValue() / vo.getNewUserAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
 
+            //新用户回收率
+            vo.setNewUserRechargeRate(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                    vo.getNewUserAmount().divide(vo.getCost(), 4, RoundingMode.HALF_UP));
+            //新用户充值成本
+            vo.setNewUserRechargeCost(vo.getNewUserAmountNum() == 0 ? BigDecimal.ZERO :
+                    vo.getCost().divide(BigDecimal.valueOf(vo.getNewUserAmountNum()), 4, RoundingMode.HALF_UP));
+
             return vo;
         }).collect(Collectors.toList());
 
@@ -412,7 +475,82 @@ public class GameDataServiceImpl implements IGameDataService {
      * @return 返回给前端额数据
      */
     public GameDataTotalTotalVO getGameDataTotalTotal(GameDataTotalTotalDTO dto) {
-        return null;
+        //如果注册时间参数为空,默认设置查询当天数据
+        if (dto.getRegisteredBeginDate() == null || dto.getRegisteredEndDate() == null) {
+            dto.setRegisteredBeginDate(LocalDate.now());
+            dto.setRegisteredEndDate(LocalDate.now());
+        }
+        //如果充值时间参数为空,默认设置查询当天数据
+        if (dto.getRechargeBeginDate() == null || dto.getRechargeEndDate() == null) {
+            dto.setRechargeBeginDate(LocalDate.now());
+            dto.setRechargeEndDate(LocalDate.now());
+        }
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            //拼接游戏名称查询条件
+            cri.where().andEquals("game_name", dto.getGameName());
+        }
+        if (dto.getGameId() != null) {
+            //拼接游戏id查询条件
+            cri.where().andEquals("game_id", dto.getGameId());
+        }
+        if (dto.getGameClassify() != null) {
+            //拼接游戏类型查询条件
+            cri.where().andEquals("game_classify", dto.getGameClassify());
+        }
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            //拼接注册日期查询条件
+            cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+
+        Sql gameDataTotalTotalSql = Sqls.create(gameDataTotalTotalSql() + cri);
+        //设置回传对象
+        gameDataTotalTotalSql.setCallback(Sqls.callback.entity());
+        gameDataTotalTotalSql.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
+        //执行sql
+        dao.execute(gameDataTotalTotalSql);
+        //得到查询出的结果
+        GameDataTotalTotalVO vo = gameDataTotalTotalSql.getObject(GameDataTotalTotalVO.class);
+
+        //查询充值时间相关数据
+        //查询条件
+        Criteria criRc = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            //拼接游戏名称查询条件
+            criRc.where().andEquals("game_name", dto.getGameName());
+        }
+        if (dto.getGameClassify() != null) {
+            //拼接游戏类型查询条件
+            criRc.where().andEquals("game_classify", dto.getGameClassify());
+        }
+        if (dto.getGameId() != null) {
+            //拼接游戏id查询条件
+            criRc.where().andEquals("game_id", dto.getGameId());
+        }
+        if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
+            //拼接充值日期查询条件
+            criRc.where().andBetween("dt", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            criRc.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        //创建sql语句
+        Sql sqlWithRechargeDate = Sqls.create(gameDataTotalSqlRecharge() + criRc);
+        //设置回传对象
+        sqlWithRechargeDate.setCallback(Sqls.callback.entity());
+        sqlWithRechargeDate.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
+        dao.execute(sqlWithRechargeDate);
+        GameDataTotalTotalVO tempVO = sqlWithRechargeDate.getObject(GameDataTotalTotalVO.class);
+        //将两个对象内的数据合并
+        copyNullProperties(tempVO, vo);
+
+        return vo;
     }
 
     /**
@@ -874,8 +1012,13 @@ public class GameDataServiceImpl implements IGameDataService {
         }
     }
 
+    /**
+     * 通过反射赋值每日趋势
+     *
+     * @param vo
+     */
     private void formatDayN(GameDataDayVO vo) {
-        if(CollectionUtils.isEmpty(dayNFieldMapList)) {
+        if (CollectionUtils.isEmpty(dayNFieldMapList)) {
             return;
         }
         dayNFieldMapList.forEach(dayNFieldMap -> {
@@ -895,46 +1038,42 @@ public class GameDataServiceImpl implements IGameDataService {
     }
 
     /**
-     * 通过反射使用set方法 得到复充趋势的值
+     * 通过反射赋值每日总计趋势
      *
-     * @param vo        需要操作的对象
-     * @param timeType  D1-D30 , M1-M6
-     * @param tableType buy、nature 总
+     * @param vo
      */
-    private void setAgainContentByNum(GameDataDayVO vo, String timeType, String tableType) {
-        try {
-            //反射得到复充趋势数据字符串
-            Field f;
-            if (StringUtils.isNotBlank(tableType)) {
-                f = vo.getClass().getDeclaredField(tableType + "Amount" + timeType);
-            } else {
-                f = vo.getClass().getDeclaredField("amount" + timeType);
-            }
-            f.setAccessible(true);
-            //分割数据
-            String[] strs = f.get(vo).toString().split("/");
-
-            //反射得到set方法
-            Field field;
-            if (StringUtils.isNotBlank(tableType)) {
-                field = vo.getClass().getDeclaredField(tableType + "Amount" + timeType + "Trend");
-            } else {
-                field = vo.getClass().getDeclaredField("amount" + timeType + "Trend");
-            }
-
-            field.setAccessible(true);
-            //赋值
-            field.set(vo, RechargeTrendVO.builder()
-                    .rechargeMoney(new BigDecimal(strs[0]))
-                    .rechargeUserCount(Long.valueOf(strs[1]))
-                    .increase(new BigDecimal(strs[2]))
-                    .back(new BigDecimal(strs[3]))
-                    .multiples(new BigDecimal(strs[4]))
-                    .build());
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new BaseException("get/set 方法出错,映射出错");
+    private void formatDayNTotal(GameDataDayTotalVO vo) {
+        if (CollectionUtils.isEmpty(dayNTotalFieldMapList)) {
+            return;
         }
+        dayNTotalFieldMapList.forEach(dayNTotalFieldMap -> {
+            try {
+                //得到需要计算的值
+                String[] temps = ((String) dayNTotalFieldMap.getT1().get(vo)).split("/");
+                //dn的金额总计
+                BigDecimal dNAmount = new BigDecimal(temps[0]);
+                //d1-dn的金额总计
+                BigDecimal d1ToDNTotalAmount = new BigDecimal(temps[1]);
+                //d1-dn的消耗总计(排除了未到时间的cost)
+                BigDecimal d1ToDNTotalCost = new BigDecimal(temps[3]);
+                //d1的金额总计(排除了未到时间的d1)
+                BigDecimal d1Amount = new BigDecimal(temps[4]);
+                //赋值
+                dayNTotalFieldMap.getT2().set(vo, RechargeTrendVO.builder()
+                        .rechargeMoney(dNAmount)
+                        .rechargeUserCount(Long.valueOf(temps[2]))
+                        .increase(d1ToDNTotalCost.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                dNAmount.divide(d1ToDNTotalCost, 4, RoundingMode.HALF_UP))
+                        .back(d1ToDNTotalCost.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                d1ToDNTotalAmount.divide(d1ToDNTotalCost, 4, RoundingMode.HALF_UP))
+                        .multiples(d1Amount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                d1ToDNTotalAmount.divide(d1Amount, 4, RoundingMode.HALF_UP))
+                        .build());
+
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        });
     }
 
     /**
@@ -1127,6 +1266,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     buy_new_user_total_amount_count,
                     buy_new_user_total_amount_num,
                     buy_new_user_total_amount,
+                    buy_total_roi,
                     buy_first_roi,
                     buy_first_amount_rate,
                     buy_today_amount_rate,
@@ -1174,6 +1314,20 @@ public class GameDataServiceImpl implements IGameDataService {
                     buy_amount_m6,
                     buy_amount_y1,
                     buy_amount_sum,
+                    buy_reg_cost,
+                    buy_first_amount_cost as buy_first_new_user_recharge_cost,
+                    buy_total_amount_cost as buy_total_recharge_cost,
+                    buy_hundred_user_num,
+                    buy_hundred_user_num_cost,
+                    buy_first_role_num,
+                    buy_role_num,
+                    buy_new_user_total_role_num,
+                    round(IF(buy_first_role_num > 0, cost / buy_first_role_num, 0), 2) buy_first_role_num_cost,
+                    round(IF(buy_role_num > 0, cost / buy_role_num, 0), 2) buy_role_num_cost,
+                    round(IF(buy_new_user_total_role_num >0, cost / buy_new_user_total_role_num, 0), 2) buy_new_user_total_role_num_cost,
+                    round(IF(buy_reg_num >0, buy_first_role_num / buy_reg_num, 0), 4) buy_first_role_num_rate,
+                    round(IF(buy_reg_num >0, buy_role_num / buy_reg_num, 0), 4) buy_role_num_rate,
+                    round(IF(buy_reg_num >0, buy_new_user_total_role_num / buy_reg_num, 0), 4) buy_new_user_total_role_num_rate,
                         
                     nature_first_new_user_amount_count,
                     nature_first_new_user_amount_num,
@@ -1187,6 +1341,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     nature_new_user_total_amount_count,
                     nature_new_user_total_amount_num,
                     nature_new_user_total_amount,
+                    nature_total_roi,
                     nature_first_roi,
                     nature_first_amount_rate,
                     nature_today_amount_rate,
@@ -1234,6 +1389,20 @@ public class GameDataServiceImpl implements IGameDataService {
                     nature_amount_m6,
                     nature_amount_y1,
                     nature_amount_sum,
+                    nature_reg_cost,
+                    nature_first_amount_cost as nature_first_new_user_recharge_cost,
+                    nature_total_amount_cost as nature_total_recharge_cost,
+                    nature_hundred_user_num,
+                    nature_hundred_user_num_cost,
+                    nature_first_role_num,
+                    nature_role_num,
+                    nature_new_user_total_role_num,
+                    round(IF(nature_first_role_num > 0, cost / nature_first_role_num, 0), 2) nature_first_role_num_cost,
+                    round(IF(nature_role_num > 0, cost / nature_role_num, 0), 2) nature_role_num_cost,
+                    round(IF(nature_new_user_total_role_num >0, cost / nature_new_user_total_role_num, 0), 2) nature_new_user_total_role_num_cost,
+                    round(IF(nature_reg_num >0, nature_first_role_num / nature_reg_num, 0), 4) nature_first_role_num_rate,
+                    round(IF(nature_reg_num >0, nature_role_num / nature_reg_num, 0), 4) nature_role_num_rate,
+                    round(IF(nature_reg_num >0, nature_new_user_total_role_num / nature_reg_num, 0), 4) nature_new_user_total_role_num_rate,
                         
                     first_new_user_amount_count,
                     first_new_user_amount_num,
@@ -1247,6 +1416,7 @@ public class GameDataServiceImpl implements IGameDataService {
                     new_user_total_amount_count,
                     new_user_total_amount_num,
                     new_user_total_amount,
+                    total_roi,
                     first_roi,
                     first_amount_rate,
                     today_amount_rate,
@@ -1293,7 +1463,21 @@ public class GameDataServiceImpl implements IGameDataService {
                     amount_m3,
                     amount_m6,
                     amount_y1,
-                    amount_sum
+                    amount_sum,
+                    reg_cost,
+                    first_amount_cost as first_new_user_recharge_cost,
+                    total_amount_cost as total_recharge_cost,
+                    hundred_user_num,
+                    hundred_user_num_cost,
+                    first_role_num,
+                    role_num,
+                    new_user_total_role_num,
+                    round(IF(first_role_num > 0, cost / first_role_num, 0), 2) first_role_num_cost,
+                    round(IF(role_num > 0, cost / role_num, 0), 2) role_num_cost,
+                    round(IF(new_user_total_role_num >0, cost / new_user_total_role_num, 0), 2) new_user_total_role_num_cost,
+                    round(IF(reg_num >0, first_role_num / reg_num, 0), 4) first_role_num_rate,
+                    round(IF(reg_num >0, role_num / reg_num, 0), 4) role_num_rate,
+                    round(IF(reg_num >0, new_user_total_role_num / reg_num, 0), 4) new_user_total_role_num_rate
                     
                 FROM
                     ads_game_day
@@ -1308,92 +1492,296 @@ public class GameDataServiceImpl implements IGameDataService {
     private String gameDataDayTotalSql() {
         return """
                 SELECT
-                SUM(cost) cost,
-                                
-                SUM(buy_reg_num) buy_reg_num,
-                SUM(nature_reg_num) nature_reg_num,
-                SUM(reg_num) reg_num,
+                IFNULL(SUM(cost), 0) cost,
                                 
-                SUM(buy_first_new_user_amount_count) buy_first_new_user_amount_count,
-                SUM(buy_first_new_user_amount_num) buy_first_new_user_amount_num,
-                SUM(buy_first_new_user_amount) buy_first_new_user_amount,
-                SUM(buy_old_user_count) buy_old_user_count,
-                SUM(buy_old_user_num) buy_old_user_num,
-                SUM(buy_old_user_amount) buy_old_user_amount,
-                SUM(buy_amount_count) buy_amount_count,
-                SUM(buy_amount_num) buy_amount_num,
-                SUM(buy_amount) buy_amount,
-                SUM(buy_new_user_total_amount_count) buy_new_user_total_amount_count,
-                SUM(buy_new_user_total_amount_num) buy_new_user_total_amount_num,
-                SUM(buy_new_user_total_amount) buy_new_user_total_amount,
-                round(if(SUM(cost) > 0 , SUM(buy_first_new_user_amount) / SUM(cost) ,0), 4) buy_first_roi,
-                round(if(SUM(buy_reg_num) > 0 , SUM(buy_first_new_user_amount_num) / SUM(buy_reg_num) ,0), 4) buy_first_amount_rate,
-                round(if(SUM(buy_reg_num) > 0, SUM(buy_new_user_total_amount_num) / SUM(buy_reg_num), 0) ,4) buy_today_amount_rate,
-                round(if(SUM(buy_amount_num) > 0 , SUM(buy_first_new_user_amount_num) / SUM(buy_amount_num) ,0), 4) buy_new_user_rate,
-                round(if(SUM(buy_first_new_user_amount_count) > 0, SUM(buy_first_new_user_amount) / SUM(buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
-                round(if(SUM(buy_new_user_total_amount_count) > 0, SUM(buy_new_user_total_amount) / SUM(buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
-                round(if(SUM(buy_amount_count) > 0, SUM(buy_amount) / SUM(buy_amount_count), 0), 2) buy_avg_amount,
-                round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(buy_reg_order_user_again) / SUM(buy_new_user_total_amount_num), 0), 4) buy_user_again_rate,
-                round(if(SUM(buy_reg_num) > 0, SUM(buy_new_user_total_amount) / SUM(buy_reg_num), 0), 2) buy_reg_user_arpu,
-                round(if(SUM(buy_first_new_user_amount_num) > 0 , SUM(buy_first_new_user_amount) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_amount_arpu,
-                round(if(SUM(buy_new_user_total_amount_num) > 0 , SUM(buy_new_user_total_amount) / SUM(buy_new_user_total_amount_num), 0), 2) buy_today_amount_arpu,
-                round(if(SUM(buy_amount_num) > 0, SUM(buy_amount) / SUM(buy_amount_num), 0), 2) buy_amount_arpu,
-
-                SUM(nature_first_new_user_amount_count) nature_first_new_user_amount_count,
-                SUM(nature_first_new_user_amount_num) nature_first_new_user_amount_num,
-                SUM(nature_first_new_user_amount) nature_first_new_user_amount,
-                SUM(nature_old_user_count) nature_old_user_count,
-                SUM(nature_old_user_num) nature_old_user_num,
-                SUM(nature_old_user_amount) nature_old_user_amount,
-                SUM(nature_amount_count) nature_amount_count,
-                SUM(nature_amount_num) nature_amount_num,
-                SUM(nature_amount) nature_amount,
-                SUM(nature_new_user_total_amount_count) nature_new_user_total_amount_count,
-                SUM(nature_new_user_total_amount_num) nature_new_user_total_amount_num,
-                SUM(nature_new_user_total_amount) nature_new_user_total_amount,
-                round(if(SUM(cost) > 0 , SUM(nature_first_new_user_amount) / SUM(cost) ,0), 4) nature_first_roi,
-                round(if(SUM(nature_reg_num) > 0 , SUM(nature_first_new_user_amount_num) / SUM(nature_reg_num) ,0), 4) nature_first_amount_rate,
-                round(if(SUM(nature_reg_num) > 0, SUM(nature_new_user_total_amount_num) / SUM(nature_reg_num), 0) ,4) nature_today_amount_rate,
-                round(if(SUM(nature_amount_num) > 0 , SUM(nature_first_new_user_amount_num) / SUM(nature_amount_num) ,0), 4) nature_new_user_rate,
-                round(if(SUM(nature_first_new_user_amount_count) > 0, SUM(nature_first_new_user_amount) / SUM(nature_first_new_user_amount_count), 0), 2) nature_first_avg_amount,
-                round(if(SUM(nature_new_user_total_amount_count) > 0, SUM(nature_new_user_total_amount) / SUM(nature_new_user_total_amount_count), 0), 2) nature_today_avg_amount,
-                round(if(SUM(nature_amount_count) > 0, SUM(nature_amount) / SUM(nature_amount_count), 0), 2) nature_avg_amount,
-                round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(nature_reg_order_user_again) / SUM(nature_new_user_total_amount_num), 0), 4) nature_user_again_rate,
-                round(if(SUM(nature_reg_num) > 0, SUM(nature_new_user_total_amount) / SUM(nature_reg_num), 0), 2) nature_reg_user_arpu,
-                round(if(SUM(nature_first_new_user_amount_num) > 0 , SUM(nature_first_new_user_amount) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_amount_arpu,
-                round(if(SUM(nature_new_user_total_amount_num) > 0 , SUM(nature_new_user_total_amount) / SUM(nature_new_user_total_amount_num), 0), 2) nature_today_amount_arpu,
-                round(if(SUM(nature_amount_num) > 0, SUM(nature_amount) / SUM(nature_amount_num), 0), 2) nature_amount_arpu,
+                IFNULL(SUM(buy_reg_num), 0) buy_reg_num,
+                IFNULL(SUM(nature_reg_num), 0) nature_reg_num,
+                IFNULL(SUM(reg_num), 0) reg_num,
                                 
-                SUM(first_new_user_amount_count) first_new_user_amount_count,
-                SUM(first_new_user_amount_num) first_new_user_amount_num,
-                SUM(first_new_user_amount) first_new_user_amount,
-                SUM(old_user_count) old_user_count,
-                SUM(old_user_num) old_user_num,
-                SUM(old_user_amount) old_user_amount,
-                SUM(amount_count) amount_count,
-                SUM(amount_num) amount_num,
-                SUM(amount) amount,
-                SUM(new_user_total_amount_count) new_user_total_amount_count,
-                SUM(new_user_total_amount_num) new_user_total_amount_num,
-                SUM(new_user_total_amount) new_user_total_amount,
-                round(if(SUM(cost) > 0 , SUM(first_new_user_amount) / SUM(cost) ,0), 4) first_roi,
-                round(if(SUM(reg_num) > 0 , SUM(first_new_user_amount_num) / SUM(reg_num) ,0), 4) first_amount_rate,
-                round(if(SUM(reg_num) > 0, SUM(new_user_total_amount_num) / SUM(reg_num), 0) ,4) today_amount_rate,
-                round(if(SUM(amount_num) > 0 , SUM(first_new_user_amount_num) / SUM(amount_num) ,0), 4) new_user_rate,
-                round(if(SUM(first_new_user_amount_count) > 0, SUM(first_new_user_amount) / SUM(first_new_user_amount_count), 0), 2) first_avg_amount,
-                round(if(SUM(new_user_total_amount_count) > 0, SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) today_avg_amount,
-                round(if(SUM(amount_count) > 0, SUM(amount) / SUM(amount_count), 0), 2) avg_amount,
-                round(if(SUM(new_user_total_amount_num) > 0, SUM(reg_order_user_again) / SUM(new_user_total_amount_num), 0), 4) user_again_rate,
-                round(if(SUM(reg_num) > 0, SUM(new_user_total_amount) / SUM(reg_num), 0), 2) reg_user_arpu,
-                round(if(SUM(first_new_user_amount_num) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_num), 0), 2) first_amount_arpu,
-                round(if(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) today_amount_arpu,
-                round(if(SUM(amount_num) > 0, SUM(amount) / SUM(amount_num), 0), 2) amount_arpu
-                                
-                FROM
-                ads_game_day
-                 
-                                
-                """;
+                """
+                + amountDay("buy_") +
+                """
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now() , CAST(SPLIT_PART(buy_amount_m1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS buy_amount_m1,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now() , CAST(SPLIT_PART(buy_amount_m2 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m2, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m2, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS buy_amount_m2,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now() , CAST(SPLIT_PART(buy_amount_m3 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m3, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m3, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS buy_amount_m3,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now() , CAST(SPLIT_PART(buy_amount_m6 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m6, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_m6, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS buy_amount_m6,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now() , CAST(SPLIT_PART(buy_amount_y1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_y1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_y1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS buy_amount_y1,
+                        CONCAT(
+                        	SUM(CAST(SPLIT_PART(buy_amount_sum , '/', 1) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_sum, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_sum, '/', 2) AS BIGINT)), '/',
+                            SUM(cost), '/',
+                            SUM(CAST(SPLIT_PART(buy_amount_d1 , '/', 1) AS DECIMAL(10, 2)))
+                            ) AS buy_amount_sum,
+                        IFNULL(SUM(buy_first_new_user_amount_count), 0) buy_first_new_user_amount_count,
+                        IFNULL(SUM(buy_first_new_user_amount_num), 0) buy_first_new_user_amount_num,
+                        IFNULL(SUM(buy_first_new_user_amount), 0) buy_first_new_user_amount,
+                        IFNULL(SUM(buy_old_user_count), 0) buy_old_user_count,
+                        IFNULL(SUM(buy_old_user_num), 0) buy_old_user_num,
+                        IFNULL(SUM(buy_old_user_amount), 0) buy_old_user_amount,
+                        IFNULL(SUM(buy_amount_count), 0) buy_amount_count,
+                        IFNULL(SUM(buy_amount_num), 0) buy_amount_num,
+                        IFNULL(SUM(buy_amount), 0) buy_amount,
+                        IFNULL(SUM(buy_new_user_total_amount_count), 0) buy_new_user_total_amount_count,
+                        IFNULL(SUM(buy_new_user_total_amount_num), 0) buy_new_user_total_amount_num,
+                        IFNULL(SUM(buy_new_user_total_amount), 0) buy_new_user_total_amount,
+                        round(if(SUM(cost) > 0 , SUM(buy_first_new_user_amount) / SUM(cost) ,0), 4) buy_first_roi,
+                        round(if(SUM(buy_reg_num) > 0 , SUM(buy_first_new_user_amount_num) / SUM(buy_reg_num) ,0), 4) buy_first_amount_rate,
+                        round(if(SUM(buy_reg_num) > 0, SUM(buy_new_user_total_amount_num) / SUM(buy_reg_num), 0) ,4) buy_today_amount_rate,
+                        round(if(SUM(buy_amount_num) > 0 , SUM(buy_first_new_user_amount_num) / SUM(buy_amount_num) ,0), 4) buy_new_user_rate,
+                        round(if(SUM(buy_first_new_user_amount_count) > 0, SUM(buy_first_new_user_amount) / SUM(buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
+                        round(if(SUM(buy_new_user_total_amount_count) > 0, SUM(buy_new_user_total_amount) / SUM(buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
+                        round(if(SUM(buy_amount_count) > 0, SUM(buy_amount) / SUM(buy_amount_count), 0), 2) buy_avg_amount,
+                        round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(buy_reg_order_user_again) / SUM(buy_new_user_total_amount_num), 0), 4) buy_user_again_rate,
+                        round(if(SUM(buy_reg_num) > 0, SUM(buy_new_user_total_amount) / SUM(buy_reg_num), 0), 2) buy_reg_user_arpu,
+                        round(if(SUM(buy_first_new_user_amount_num) > 0 , SUM(buy_first_new_user_amount) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_amount_arpu,
+                        round(if(SUM(buy_new_user_total_amount_num) > 0 , SUM(buy_new_user_total_amount) / SUM(buy_new_user_total_amount_num), 0), 2) buy_today_amount_arpu,
+                        round(if(SUM(buy_amount_num) > 0, SUM(buy_amount) / SUM(buy_amount_num), 0), 2) buy_amount_arpu,
+                        round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) buy_reg_cost,
+                        round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_new_user_recharge_cost,
+                        round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) buy_total_recharge_cost,
+                        round(if(SUM(cost) > 0, SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) buy_total_roi,
+                        SUM(buy_hundred_user_num) buy_hundred_user_num,
+                        round(IF(SUM(buy_hundred_user_num) > 0, SUM(cost) / SUM(buy_hundred_user_num), 0), 2) buy_hundred_user_num_cost,
+                        SUM(buy_first_role_num) buy_first_role_num,
+                        SUM(buy_role_num) buy_role_num,
+                        SUM(buy_new_user_total_role_num) buy_new_user_total_role_num,
+                        round(IF(SUM(buy_first_role_num) > 0, SUM(cost) / SUM(buy_first_role_num), 0), 2) buy_first_role_num_cost,
+                        round(IF(SUM(buy_role_num) > 0, SUM(cost) / SUM(buy_role_num), 0), 2) buy_role_num_cost,
+                        round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) buy_new_user_total_role_num_cost,
+                        round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) buy_first_role_num_rate,
+                        round(IF(SUM(buy_reg_num) >0, SUM(buy_role_num) / SUM(buy_reg_num), 0), 4) buy_role_num_rate,
+                        round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) buy_new_user_total_role_num_rate,
+                                        
+                        """
+                + amountDay("nature_") +
+                """
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now() , CAST(SPLIT_PART(nature_amount_m1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS nature_amount_m1,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now() , CAST(SPLIT_PART(nature_amount_m2 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m2, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m2, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS nature_amount_m2,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now() , CAST(SPLIT_PART(nature_amount_m3 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m3, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m3, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS nature_amount_m3,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now() , CAST(SPLIT_PART(nature_amount_m6 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m6, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_m6, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS nature_amount_m6,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now() , CAST(SPLIT_PART(nature_amount_y1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_y1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_y1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS nature_amount_y1,
+                        CONCAT(
+                        	SUM(CAST(SPLIT_PART(nature_amount_sum , '/', 1) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_sum, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_sum, '/', 2) AS BIGINT)), '/',
+                            SUM(cost), '/',
+                            SUM(CAST(SPLIT_PART(nature_amount_d1 , '/', 1) AS DECIMAL(10, 2)))
+                            ) AS nature_amount_sum,
+                        IFNULL(SUM(nature_first_new_user_amount_count), 0) nature_first_new_user_amount_count,
+                        IFNULL(SUM(nature_first_new_user_amount_num), 0) nature_first_new_user_amount_num,
+                        IFNULL(SUM(nature_first_new_user_amount), 0) nature_first_new_user_amount,
+                        IFNULL(SUM(nature_old_user_count), 0) nature_old_user_count,
+                        IFNULL(SUM(nature_old_user_num), 0) nature_old_user_num,
+                        IFNULL(SUM(nature_old_user_amount), 0) nature_old_user_amount,
+                        IFNULL(SUM(nature_amount_count), 0) nature_amount_count,
+                        IFNULL(SUM(nature_amount_num), 0) nature_amount_num,
+                        IFNULL(SUM(nature_amount), 0) nature_amount,
+                        IFNULL(SUM(nature_new_user_total_amount_count), 0) nature_new_user_total_amount_count,
+                        IFNULL(SUM(nature_new_user_total_amount_num), 0) nature_new_user_total_amount_num,
+                        IFNULL(SUM(nature_new_user_total_amount), 0) nature_new_user_total_amount,
+                        round(if(SUM(cost) > 0 , SUM(nature_first_new_user_amount) / SUM(cost) ,0), 4) nature_first_roi,
+                        round(if(SUM(nature_reg_num) > 0 , SUM(nature_first_new_user_amount_num) / SUM(nature_reg_num) ,0), 4) nature_first_amount_rate,
+                        round(if(SUM(nature_reg_num) > 0, SUM(nature_new_user_total_amount_num) / SUM(nature_reg_num), 0) ,4) nature_today_amount_rate,
+                        round(if(SUM(nature_amount_num) > 0 , SUM(nature_first_new_user_amount_num) / SUM(nature_amount_num) ,0), 4) nature_new_user_rate,
+                        round(if(SUM(nature_first_new_user_amount_count) > 0, SUM(nature_first_new_user_amount) / SUM(nature_first_new_user_amount_count), 0), 2) nature_first_avg_amount,
+                        round(if(SUM(nature_new_user_total_amount_count) > 0, SUM(nature_new_user_total_amount) / SUM(nature_new_user_total_amount_count), 0), 2) nature_today_avg_amount,
+                        round(if(SUM(nature_amount_count) > 0, SUM(nature_amount) / SUM(nature_amount_count), 0), 2) nature_avg_amount,
+                        round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(nature_reg_order_user_again) / SUM(nature_new_user_total_amount_num), 0), 4) nature_user_again_rate,
+                        round(if(SUM(nature_reg_num) > 0, SUM(nature_new_user_total_amount) / SUM(nature_reg_num), 0), 2) nature_reg_user_arpu,
+                        round(if(SUM(nature_first_new_user_amount_num) > 0 , SUM(nature_first_new_user_amount) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_amount_arpu,
+                        round(if(SUM(nature_new_user_total_amount_num) > 0 , SUM(nature_new_user_total_amount) / SUM(nature_new_user_total_amount_num), 0), 2) nature_today_amount_arpu,
+                        round(if(SUM(nature_amount_num) > 0, SUM(nature_amount) / SUM(nature_amount_num), 0), 2) nature_amount_arpu,
+                        round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) nature_reg_cost,
+                        round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_new_user_recharge_cost,
+                        round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) nature_total_recharge_cost,
+                        round(if(SUM(cost) > 0, SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) nature_total_roi,
+                        SUM(nature_hundred_user_num) nature_hundred_user_num,
+                        round(IF(SUM(nature_hundred_user_num) > 0, SUM(cost) / SUM(nature_hundred_user_num), 0), 2) nature_hundred_user_num_cost,
+                        SUM(nature_first_role_num) nature_first_role_num,
+                        SUM(nature_role_num) nature_role_num,
+                        SUM(nature_new_user_total_role_num) nature_new_user_total_role_num,
+                        round(IF(SUM(nature_first_role_num) > 0, SUM(cost) / SUM(nature_first_role_num), 0), 2) nature_first_role_num_cost,
+                        round(IF(SUM(nature_role_num) > 0, SUM(cost) / SUM(nature_role_num), 0), 2) nature_role_num_cost,
+                        round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) nature_new_user_total_role_num_cost,
+                        round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) nature_first_role_num_rate,
+                        round(IF(SUM(nature_reg_num) >0, SUM(nature_role_num) / SUM(nature_reg_num), 0), 4) nature_role_num_rate,
+                        round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) nature_new_user_total_role_num_rate,
+                                        
+                        """
+                + amountDay("") +
+                """
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now() , CAST(SPLIT_PART(amount_m1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(amount_m1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_m1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 29 day) <= LocalDate.now(), CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS amount_m1,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now() , CAST(SPLIT_PART(amount_m2 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(amount_m2, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_m2, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 59 day) <= LocalDate.now(), CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS amount_m2,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now() , CAST(SPLIT_PART(amount_m3 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(amount_m3, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_m3, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 89 day) <= LocalDate.now(), CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS amount_m3,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now() , CAST(SPLIT_PART(amount_m6 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_m6, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 179 day) <= LocalDate.now(), CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS amount_m6,
+                        CONCAT(
+                        	SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now() , CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2)), 0 )), '/',
+                            SUM(CAST(SPLIT_PART(amount_y1, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), cost, 0)), '/',
+                            SUM(IF( DATE_ADD(dt, INTERVAL 1 year) <= LocalDate.now(), CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                            ) AS amount_y1,
+                        CONCAT(
+                        	SUM(CAST(SPLIT_PART(amount_sum , '/', 1) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_sum, '/', 6) AS DECIMAL(10, 2))), '/',
+                            SUM(CAST(SPLIT_PART(amount_sum, '/', 2) AS BIGINT)), '/',
+                            SUM(cost), '/',
+                            SUM(CAST(SPLIT_PART(amount_d1 , '/', 1) AS DECIMAL(10, 2)))
+                            ) AS amount_sum,
+                        IFNULL(SUM(first_new_user_amount_count), 0) first_new_user_amount_count,
+                        IFNULL(SUM(first_new_user_amount_num), 0) first_new_user_amount_num,
+                        IFNULL(SUM(first_new_user_amount), 0) first_new_user_amount,
+                        IFNULL(SUM(old_user_count), 0) old_user_count,
+                        IFNULL(SUM(old_user_num), 0) old_user_num,
+                        IFNULL(SUM(old_user_amount), 0) old_user_amount,
+                        IFNULL(SUM(amount_count), 0) amount_count,
+                        IFNULL(SUM(amount_num), 0) amount_num,
+                        IFNULL(SUM(amount), 0) amount,
+                        IFNULL(SUM(new_user_total_amount_count), 0) new_user_total_amount_count,
+                        IFNULL(SUM(new_user_total_amount_num), 0) new_user_total_amount_num,
+                        IFNULL(SUM(new_user_total_amount), 0) new_user_total_amount,
+                        round(if(SUM(cost) > 0 , SUM(first_new_user_amount) / SUM(cost) ,0), 4) first_roi,
+                        round(if(SUM(reg_num) > 0 , SUM(first_new_user_amount_num) / SUM(reg_num) ,0), 4) first_amount_rate,
+                        round(if(SUM(reg_num) > 0, SUM(new_user_total_amount_num) / SUM(reg_num), 0) ,4) today_amount_rate,
+                        round(if(SUM(amount_num) > 0 , SUM(first_new_user_amount_num) / SUM(amount_num) ,0), 4) new_user_rate,
+                        round(if(SUM(first_new_user_amount_count) > 0, SUM(first_new_user_amount) / SUM(first_new_user_amount_count), 0), 2) first_avg_amount,
+                        round(if(SUM(new_user_total_amount_count) > 0, SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) today_avg_amount,
+                        round(if(SUM(amount_count) > 0, SUM(amount) / SUM(amount_count), 0), 2) avg_amount,
+                        round(if(SUM(new_user_total_amount_num) > 0, SUM(reg_order_user_again) / SUM(new_user_total_amount_num), 0), 4) user_again_rate,
+                        round(if(SUM(reg_num) > 0, SUM(new_user_total_amount) / SUM(reg_num), 0), 2) reg_user_arpu,
+                        round(if(SUM(first_new_user_amount_num) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_num), 0), 2) first_amount_arpu,
+                        round(if(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) today_amount_arpu,
+                        round(if(SUM(amount_num) > 0, SUM(amount) / SUM(amount_num), 0), 2) amount_arpu,
+                        round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
+                        round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+                        round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost,
+                        round(if(SUM(cost) > 0, SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+                        SUM(hundred_user_num) hundred_user_num,
+                        round(IF(SUM(hundred_user_num) > 0, SUM(cost) / SUM(hundred_user_num), 0), 2) hundred_user_num_cost,
+                        SUM(first_role_num) first_role_num,
+                        SUM(role_num) role_num,
+                        SUM(new_user_total_role_num) new_user_total_role_num,
+                        round(IF(SUM(first_role_num) > 0, SUM(cost) / SUM(first_role_num), 0), 2) first_role_num_cost,
+                        round(IF(SUM(role_num) > 0, SUM(cost) / SUM(role_num), 0), 2) role_num_cost,
+                        round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+                        round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
+                        round(IF(SUM(reg_num) >0, SUM(role_num) / SUM(reg_num), 0), 4) role_num_rate,
+                        round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
+                                        
+                        FROM
+                        ads_game_day
+                         
+                                        
+                        """;
+    }
+
+    /**
+     * 游戏每日总计趋势sql
+     *
+     * @param type 输入的参数表示选择表的类型
+     * @return String : Dn的充值金额 / D1-Dn的充值总金额 / Dn的充值人数 /当前消耗(剔除不存在的天数数据) /D1充值金额总和(剔除不存在的天数数据)/type
+     */
+    private String amountDay(String type) {
+        //拼接查询条件
+        StringBuilder trendDay = new StringBuilder(StringUtils.EMPTY);
+        for (int day = 1; day <= 29; day++) {
+            trendDay.append("""
+                    CONCAT(
+                    SUM(IF( DATE_ADD(dt, INTERVAL %s day) <= LocalDate.now()  , CAST(SPLIT_PART(%samount_d%s , '/', 1) AS DECIMAL(10, 2)), 0 )),'/',
+                    SUM(CAST(SPLIT_PART( %samount_d%s, '/', 6) AS DECIMAL(10, 2))),'/',
+                    SUM(CAST(SPLIT_PART(%samount_d%s, '/', 2) AS BIGINT)),'/',
+                    SUM(IF( DATE_ADD(dt, INTERVAL %s day) <= LocalDate.now(),  cost, 0)),'/',
+                    SUM(IF( DATE_ADD(dt, INTERVAL %s day) <= LocalDate.now(),  CAST(SPLIT_PART(%samount_d1 , '/', 1) AS DECIMAL(10, 2)) , 0))
+                    ) AS %samount_d%s ,
+                       """.formatted(day - 1, type, day, type, day, type, day, day - 1, day - 1, type, type, day));
+        }
+
+        return trendDay.toString();
     }
 
     /**
@@ -1433,12 +1821,15 @@ public class GameDataServiceImpl implements IGameDataService {
                     sum(a.new_user_total_amount_num) new_user_total_amount_num,
                     sum(a.new_user_total_amount) new_user_total_amount,
                     
-                    round(if(sum(a.buy_reg_num) > 0 ,sum(a.buy_first_new_user_amount_num) / sum(a.buy_reg_num), 0), 4) buy_first_roi,
-                    round(if(sum(a.buy_reg_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.buy_reg_num), 0), 4) buy_today_roi,
-                    round(if(sum(a.nature_reg_num) > 0 ,sum(a.nature_first_new_user_amount_num) / sum(a.nature_reg_num), 0), 4) nature_first_roi,
-                    round(if(sum(a.nature_reg_num) > 0, sum(a.nature_new_user_total_amount_num) / sum(a.nature_reg_num), 0), 4) nature_today_roi,
-                    round(if(sum(a.reg_num) > 0 ,sum(a.first_new_user_amount_num) / sum(a.reg_num), 0), 4) first_roi,
-                    round(if(sum(a.reg_num) > 0, sum(a.new_user_total_amount_num) / sum(a.reg_num), 0), 4) today_roi,
+                    round(if(SUM(a.cost) > 0 , SUM(buy_first_new_user_amount) / SUM(a.cost) ,0), 4) buy_first_roi,
+                    round(if(sum(a.buy_reg_num) > 0 ,sum(a.buy_first_new_user_amount_num) / sum(a.buy_reg_num), 0), 4) buy_first_amount_rate,
+                    round(if(sum(a.buy_reg_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.buy_reg_num), 0), 4) buy_today_amount_rate,
+                    round(if(SUM(a.cost) > 0 , SUM(a.nature_first_new_user_amount) / SUM(a.cost) ,0), 4) nature_first_roi,
+                    round(if(sum(a.nature_reg_num) > 0 ,sum(a.nature_first_new_user_amount_num) / sum(a.nature_reg_num), 0), 4) nature_first_amount_rate,
+                    round(if(sum(a.nature_reg_num) > 0, sum(a.nature_new_user_total_amount_num) / sum(a.nature_reg_num), 0), 4) nature_today_amount_rate,
+                    round(if(SUM(a.cost) > 0 , SUM(first_new_user_amount) / SUM(a.cost) ,0), 4) first_roi,
+                    round(if(sum(a.reg_num) > 0 ,sum(a.first_new_user_amount_num) / sum(a.reg_num), 0), 4) first_amount_rate,
+                    round(if(sum(a.reg_num) > 0, sum(a.new_user_total_amount_num) / sum(a.reg_num), 0), 4) today_amount_rate,
                     
                     round(if(sum(a.buy_first_new_user_amount_count) > 0, sum(a.buy_first_new_user_amount) / sum(a.buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
                     round(if(sum(a.buy_new_user_total_amount_count) > 0, sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
@@ -1464,13 +1855,155 @@ public class GameDataServiceImpl implements IGameDataService {
                     
                     round(if(sum(a.reg_num) > 0 , sum(a.new_user_total_amount) / sum(a.reg_num), 0), 2) reg_user_arpu,
                     round(if(sum(a.first_new_user_amount_num) > 0 , sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 2) first_amount_arpu,
-                    round(if(sum(a.new_user_total_amount_num) > 0 , sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 2) today_amount_arpu
+                    round(if(sum(a.new_user_total_amount_num) > 0 , sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 2) today_amount_arpu,
+                    
+                    round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) buy_reg_cost,
+                    round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) nature_reg_cost,
+                    round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
+                    
+                    round(if(SUM(cost) > 0 , SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) buy_total_roi,
+                    round(if(SUM(cost) > 0 , SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) nature_total_roi,
+                    round(if(SUM(cost) > 0 , SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+                    
+                    round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_new_user_recharge_cost,
+                    round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_new_user_recharge_cost,
+                    round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+                    
+                    round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) buy_total_recharge_cost,
+                    round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) nature_total_recharge_cost,
+                    round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost,
+                    
+                    SUM(buy_hundred_user_num) buy_hundred_user_num,
+                    round(IF(SUM(buy_hundred_user_num) > 0, SUM(cost) / SUM(buy_hundred_user_num), 0), 2) buy_hundred_user_num_cost,
+                    SUM(buy_first_role_num) buy_first_role_num,
+                    SUM(buy_role_num) buy_role_num,
+                    SUM(buy_new_user_total_role_num) buy_new_user_total_role_num,
+                    round(IF(SUM(buy_first_role_num) > 0, SUM(cost) / SUM(buy_first_role_num), 0), 2) buy_first_role_num_cost,
+                    round(IF(SUM(buy_role_num) > 0, SUM(cost) / SUM(buy_role_num), 0), 2) buy_role_num_cost,
+                    round(IF(SUM(buy_new_user_total_role_num) >0, SUM(cost) / SUM(buy_new_user_total_role_num), 0), 2) buy_new_user_total_role_num_cost,
+                    round(IF(SUM(buy_reg_num) >0, SUM(buy_first_role_num) / SUM(buy_reg_num), 0), 4) buy_first_role_num_rate,
+                    round(IF(SUM(buy_reg_num) >0, SUM(buy_role_num) / SUM(buy_reg_num), 0), 4) buy_role_num_rate,
+                    round(IF(SUM(buy_reg_num) >0, SUM(buy_new_user_total_role_num) / SUM(buy_reg_num), 0), 4) buy_new_user_total_role_num_rate,
+                    
+                    SUM(nature_hundred_user_num) nature_hundred_user_num,
+                    round(IF(SUM(nature_hundred_user_num) > 0, SUM(cost) / SUM(nature_hundred_user_num), 0), 2) nature_hundred_user_num_cost,
+                    SUM(nature_first_role_num) nature_first_role_num,
+                    SUM(nature_role_num) nature_role_num,
+                    SUM(nature_new_user_total_role_num) nature_new_user_total_role_num,
+                    round(IF(SUM(nature_first_role_num) > 0, SUM(cost) / SUM(nature_first_role_num), 0), 2) nature_first_role_num_cost,
+                    round(IF(SUM(nature_role_num) > 0, SUM(cost) / SUM(nature_role_num), 0), 2) nature_role_num_cost,
+                    round(IF(SUM(nature_new_user_total_role_num) >0, SUM(cost) / SUM(nature_new_user_total_role_num), 0), 2) nature_new_user_total_role_num_cost,
+                    round(IF(SUM(nature_reg_num) >0, SUM(nature_first_role_num) / SUM(nature_reg_num), 0), 4) nature_first_role_num_rate,
+                    round(IF(SUM(nature_reg_num) >0, SUM(nature_role_num) / SUM(nature_reg_num), 0), 4) nature_role_num_rate,
+                    round(IF(SUM(nature_reg_num) >0, SUM(nature_new_user_total_role_num) / SUM(nature_reg_num), 0), 4) nature_new_user_total_role_num_rate,
+                   
+                    SUM(hundred_user_num) hundred_user_num,
+                    round(IF(SUM(hundred_user_num) > 0, SUM(cost) / SUM(hundred_user_num), 0), 2) hundred_user_num_cost,
+                    SUM(first_role_num) first_role_num,
+                    SUM(role_num) role_num,
+                    SUM(new_user_total_role_num) new_user_total_role_num,
+                    round(IF(SUM(first_role_num) > 0, SUM(cost) / SUM(first_role_num), 0), 2) first_role_num_cost,
+                    round(IF(SUM(role_num) > 0, SUM(cost) / SUM(role_num), 0), 2) role_num_cost,
+                    round(IF(SUM(new_user_total_role_num) >0, SUM(cost) / SUM(new_user_total_role_num), 0), 2) new_user_total_role_num_cost,
+                    round(IF(SUM(reg_num) >0, SUM(first_role_num) / SUM(reg_num), 0), 4) first_role_num_rate,
+                    round(IF(SUM(reg_num) >0, SUM(role_num) / SUM(reg_num), 0), 4) role_num_rate,
+                    round(IF(SUM(reg_num) >0, SUM(new_user_total_role_num) / SUM(reg_num), 0), 4) new_user_total_role_num_rate
                     
                 FROM
                     ads_game_day a
                 """;
     }
 
+    /**
+     * 游戏总数据总计一栏sql
+     *
+     * @return String
+     */
+    private String gameDataTotalTotalSql() {
+        return """
+                SELECT
+                    IFNULL(sum(buy_reg_num), 0) buy_reg_num,
+                    IFNULL(sum(nature_reg_num), 0) nature_reg_num,
+                    IFNULL(sum(reg_num), 0) reg_num,
+                    IFNULL(sum(cost), 0) cost,
+                    
+                    IFNULL(sum(buy_first_new_user_amount_count), 0) buy_first_new_user_amount_count,
+                    IFNULL(sum(buy_first_new_user_amount_num), 0) buy_first_new_user_amount_num,
+                    IFNULL(sum(buy_first_new_user_amount), 0) buy_first_new_user_amount,
+                    IFNULL(sum(nature_first_new_user_amount_count), 0) nature_first_new_user_amount_count,
+                    IFNULL(sum(nature_first_new_user_amount_num), 0) nature_first_new_user_amount_num,
+                    IFNULL(sum(nature_first_new_user_amount), 0) nature_first_new_user_amount,
+                    IFNULL(sum(first_new_user_amount_count), 0) first_new_user_amount_count,
+                    IFNULL(sum(first_new_user_amount_num), 0) first_new_user_amount_num,
+                    IFNULL(sum(first_new_user_amount), 0) first_new_user_amount,
+                    
+                    IFNULL(sum(buy_new_user_total_amount_count), 0) buy_new_user_total_amount_count,
+                    IFNULL(sum(buy_new_user_total_amount_num), 0) buy_new_user_total_amount_num,
+                    IFNULL(sum(buy_new_user_total_amount), 0) buy_new_user_total_amount,
+                    IFNULL(sum(nature_new_user_total_amount_count), 0) nature_new_user_total_amount_count,
+                    IFNULL(sum(nature_new_user_total_amount_num), 0) nature_new_user_total_amount_num,
+                    IFNULL(sum(nature_new_user_total_amount), 0) nature_new_user_total_amount,
+                    IFNULL(sum(new_user_total_amount_count), 0) new_user_total_amount_count,
+                    IFNULL(sum(new_user_total_amount_num), 0) new_user_total_amount_num,
+                    IFNULL(sum(new_user_total_amount), 0) new_user_total_amount,
+                    
+                    round(if(SUM(cost) > 0 , SUM(buy_first_new_user_amount) / SUM(cost) ,0), 4) buy_first_roi,
+                    round(if(sum(buy_reg_num) > 0 ,sum(buy_first_new_user_amount_num) / sum(buy_reg_num), 0), 4) buy_first_amount_rate,
+                    round(if(sum(buy_reg_num) > 0, sum(buy_new_user_total_amount_num) / sum(buy_reg_num), 0), 4) buy_today_amount_rate,
+                    round(if(SUM(cost) > 0 , SUM(nature_first_new_user_amount) / SUM(cost) ,0), 4) nature_first_roi,
+                    round(if(sum(nature_reg_num) > 0 ,sum(nature_first_new_user_amount_num) / sum(nature_reg_num), 0), 4) nature_first_amount_rate,
+                    round(if(sum(nature_reg_num) > 0, sum(nature_new_user_total_amount_num) / sum(nature_reg_num), 0), 4) nature_today_amount_rate,
+                    round(if(SUM(cost) > 0 , SUM(first_new_user_amount) / SUM(cost) ,0), 4) first_roi,
+                    round(if(sum(reg_num) > 0 ,sum(first_new_user_amount_num) / sum(reg_num), 0), 4) first_amount_rate,
+                    round(if(sum(reg_num) > 0, sum(new_user_total_amount_num) / sum(reg_num), 0), 4) today_amount_rate,
+                    
+                    round(if(sum(buy_first_new_user_amount_count) > 0, sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_count), 0), 2) buy_first_avg_amount,
+                    round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 2) buy_today_avg_amount,
+                    
+                    round(if(sum(nature_first_new_user_amount_count) > 0, sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_count), 0), 2) nature_first_avg_amount,
+                    round(if(sum(nature_new_user_total_amount_count) > 0, sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_count), 0), 2) nature_today_avg_amount,
+                    
+                    round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 2) first_avg_amount,
+                    round(if(sum(new_user_total_amount_count) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_count), 0), 2) today_avg_amount,
+                    
+                    
+                    round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_reg_order_user_again) / sum(buy_new_user_total_amount_num), 0), 4) buy_today_again_rate,
+                    round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_reg_order_user_again) / sum(nature_new_user_total_amount_num), 0), 4) nature_today_again_rate,
+                    round(if(sum(new_user_total_amount_num) > 0 , sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) today_again_rate,
+                    
+                    round(if(sum(buy_reg_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_reg_num), 0), 2) buy_reg_user_arpu,
+                    round(if(sum(buy_first_new_user_amount_num) > 0 , sum(buy_first_new_user_amount) / sum(buy_first_new_user_amount_num), 0), 2) buy_first_amount_arpu,
+                    round(if(sum(buy_new_user_total_amount_num) > 0 , sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_num), 0), 2) buy_today_amount_arpu,
+                    
+                    round(if(sum(nature_reg_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_reg_num), 0), 2) nature_reg_user_arpu,
+                    round(if(sum(nature_first_new_user_amount_num) > 0 , sum(nature_first_new_user_amount) / sum(nature_first_new_user_amount_num), 0), 2) nature_first_amount_arpu,
+                    round(if(sum(nature_new_user_total_amount_num) > 0 , sum(nature_new_user_total_amount) / sum(nature_new_user_total_amount_num), 0), 2) nature_today_amount_arpu,
+                    
+                    round(if(sum(reg_num) > 0 , sum(new_user_total_amount) / sum(reg_num), 0), 2) reg_user_arpu,
+                    round(if(sum(first_new_user_amount_num) > 0 , sum(first_new_user_amount) / sum(first_new_user_amount_num), 0), 2) first_amount_arpu,
+                    round(if(sum(new_user_total_amount_num) > 0 , sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 2) today_amount_arpu,
+                    
+                    round(if(SUM(buy_reg_num) > 0, SUM(cost) / SUM(buy_reg_num), 0), 2) buy_reg_cost,
+                    round(if(SUM(nature_reg_num) > 0, SUM(cost) / SUM(nature_reg_num), 0), 2) nature_reg_cost,
+                    round(if(SUM(reg_num) > 0, SUM(cost) / SUM(reg_num), 0), 2) reg_cost,
+                    
+                    round(if(SUM(cost) > 0 , SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) buy_total_roi,
+                    round(if(SUM(cost) > 0 , SUM(nature_new_user_total_amount) / SUM(cost), 0), 4) nature_total_roi,
+                    round(if(SUM(cost) > 0 , SUM(new_user_total_amount) / SUM(cost), 0), 4) total_roi,
+                    
+                    round(if(SUM(buy_first_new_user_amount_num) > 0, SUM(cost) / SUM(buy_first_new_user_amount_num), 0), 2) buy_first_new_user_recharge_cost,
+                    round(if(SUM(nature_first_new_user_amount_num) > 0, SUM(cost) / SUM(nature_first_new_user_amount_num), 0), 2) nature_first_new_user_recharge_cost,
+                    round(if(SUM(first_new_user_amount_num) > 0, SUM(cost) / SUM(first_new_user_amount_num), 0), 2) first_new_user_recharge_cost,
+                    
+                    round(if(SUM(buy_new_user_total_amount_num) > 0, SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) buy_total_recharge_cost,
+                    round(if(SUM(nature_new_user_total_amount_num) > 0, SUM(cost) / SUM(nature_new_user_total_amount_num), 0), 2) nature_total_recharge_cost,
+                    round(if(SUM(new_user_total_amount_num) > 0, SUM(cost) / SUM(new_user_total_amount_num), 0), 2) total_recharge_cost
+                    
+                FROM
+                    game_ads.ads_game_day
+                """;
+    }
+
     /**
      * 和充值时间有关的sql
      *

+ 4 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OverallSummaryServiceImpl.java

@@ -22,6 +22,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -94,8 +95,8 @@ public class OverallSummaryServiceImpl implements IOverallSummaryService {
         overallSummaryVO.setYesterdayAmount(getResultBySql("today_amount-ads_overall_summary_amount", yesterdayCri));
         //查询今日新用户充值
         overallSummaryVO.setTodayNewPlayerAmount(getResultBySql("today_new_user_amount-ads_overall_summary_amount", todayCri));
-        //查询昨日新用户充值
-        overallSummaryVO.setYesterdayNewPlayerAmount(getResultBySql("today_new_user_amount-ads_overall_summary_amount", yesterdayCri));
+        //查询昨日新用户充值(昨日的首日新用户充值)
+        overallSummaryVO.setYesterdayNewPlayerAmount(getResultBySql("today_first_new_user_amount-ads_overall_summary_amount", yesterdayCri));
 
         //计算消耗相关数据
         //查询消耗总计
@@ -215,7 +216,7 @@ public class OverallSummaryServiceImpl implements IOverallSummaryService {
         }
         if (dto.getAgentId() != null) {
             //拼接渠道查询条件
-            cri.where().andEquals("agent_id", dto.getAgentId());
+            cri.where().andInList("agent_id", Arrays.asList(dto.getAgentId()));
         }
         if (dto.getAccountId() != null) {
             //拼接广告账户查询条件

+ 66 - 89
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -28,10 +28,7 @@ import java.beans.PropertyDescriptor;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -46,6 +43,11 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
     @Autowired
     private Dao dao;
 
+    /**
+     * 广告监控数据
+     * @param dto
+     * @return
+     */
     @Override
     public Page<PromotionDayVO> getPromotionDayData(PromotionDayDTO dto) {
         //不传递查询条件默认查询当天数据
@@ -78,66 +80,66 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
 
         //处理List中的每个vo对象缺少的数据
-        list.stream().map(vo ->{
-                    //记录最近有数据的LocalDate
-                    LocalDate latestDate = dto.getCostEndDate();
-                    Boolean hasDataDate = findDate(vo.getPromotionId(), latestDate);
-                    while (!hasDataDate) {
-                        latestDate = latestDate.minusDays(1);
-                        hasDataDate = findDate(vo.getPromotionId(), latestDate);
-                    }
-                    //构建查询条件
-                    Criteria totalCri = Cnd.cri();
-                    totalCri.where().andEquals("dt", latestDate);
-                    totalCri.where().andEquals("promotion_id", vo.getPromotionId());
-                    //查询出最近一条包含总数据的记录
-                    Sql totalDataSql = Sqls.create(getTotalDataSql() + totalCri);
-                    //设置回传对象
-                    totalDataSql.setCallback(Sqls.callback.entity());
-                    totalDataSql.setEntity(dao.getEntity(PromotionDayVO.class));
-                    //执行sql
-                    dao.execute(totalDataSql);
-                    //得到对象
-                    PromotionDayVO tempVO = totalDataSql.getObject(PromotionDayVO.class);
-                    //将两个对象内容合并
-                    copyNullProperties(tempVO, vo);
+        list.stream().map(vo -> {
+            //记录最近有数据的LocalDate
+            LocalDate latestDate = dto.getCostEndDate();
+            Boolean hasDataDate = findDate(vo.getPromotionId(), latestDate);
+            while (!hasDataDate) {
+                latestDate = latestDate.minusDays(1);
+                hasDataDate = findDate(vo.getPromotionId(), latestDate);
+            }
+            //构建查询条件
+            Criteria totalCri = Cnd.cri();
+            totalCri.where().andEquals("dt", latestDate);
+            totalCri.where().andEquals("promotion_id", vo.getPromotionId());
+            //查询出最近一条包含总数据的记录
+            Sql totalDataSql = Sqls.create(getTotalDataSql() + totalCri);
+            //设置回传对象
+            totalDataSql.setCallback(Sqls.callback.entity());
+            totalDataSql.setEntity(dao.getEntity(PromotionDayVO.class));
+            //执行sql
+            dao.execute(totalDataSql);
+            //得到对象
+            PromotionDayVO tempVO = totalDataSql.getObject(PromotionDayVO.class);
+            //将两个对象内容合并
+            copyNullProperties(tempVO, vo);
 
-                    //计算d2(次日)数据
-                    vo.setD2Trend(PromotionRechargeTrendVO.builder()
-                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD2().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
-                            .rechargeMoney(vo.getD2())
-                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD2().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
-                            .build());
-                    //计算d3数据
-                    vo.setD3Trend(PromotionRechargeTrendVO.builder()
-                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD3().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
-                            .rechargeMoney(vo.getD3())
-                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD3().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
-                            .build());
-                    //计算d7数据
-                    vo.setD7Trend(PromotionRechargeTrendVO.builder()
-                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD7().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
-                            .rechargeMoney(vo.getD7())
-                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD7().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
-                            .build());
-                    //计算d15数据
-                    vo.setD15Trend(PromotionRechargeTrendVO.builder()
-                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD15().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
-                            .rechargeMoney(vo.getD15())
-                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    vo.getD15().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
-                            .build());
+            //计算d2(次日)数据
+            vo.setD2Trend(PromotionRechargeTrendVO.builder()
+                    .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD2().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                    .rechargeMoney(vo.getD2())
+                    .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD2().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                    .build());
+            //计算d3数据
+            vo.setD3Trend(PromotionRechargeTrendVO.builder()
+                    .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD3().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                    .rechargeMoney(vo.getD3())
+                    .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD3().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                    .build());
+            //计算d7数据
+            vo.setD7Trend(PromotionRechargeTrendVO.builder()
+                    .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD7().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                    .rechargeMoney(vo.getD7())
+                    .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD7().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                    .build());
+            //计算d15数据
+            vo.setD15Trend(PromotionRechargeTrendVO.builder()
+                    .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD15().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                    .rechargeMoney(vo.getD15())
+                    .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                            vo.getD15().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                    .build());
 
-                    //返回最终数据
-                    return vo;
-                }).collect(Collectors.toList());
+            //返回最终数据
+            return vo;
+        }).collect(Collectors.toList());
 
         //返回查询得结果
         return new Page<>(list, pager);
@@ -173,24 +175,12 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         if (dto.getPitcherId() != null) {
             cri.where().andEquals("pitcher_id", dto.getPitcherId());
         }
-        if (StringUtils.isNotBlank(dto.getPitcherName())) {
-            cri.where().andEquals("pitcher_name", dto.getPitcherName());
-        }
         if (dto.getAgentId() != null) {
-            cri.where().andEquals("agent_id", dto.getAgentId());
-        }
-        if (StringUtils.isNotBlank(dto.getAgentKey())) {
-            cri.where().andEquals("agent_key", dto.getAgentKey());
-        }
-        if (StringUtils.isNotBlank(dto.getAgentName())) {
-            cri.where().andEquals("agent_name", dto.getAgentName());
+            cri.where().andInList("agent_id", Arrays.asList(dto.getAgentId()));
         }
         if (StringUtils.isNotBlank(dto.getCpName())) {
             cri.where().andEquals("cp_name", dto.getCpName());
         }
-        if (StringUtils.isNotBlank(dto.getGameName())) {
-            cri.where().andEquals("game_name", dto.getGameName());
-        }
         if (dto.getGameId() != null) {
             cri.where().andEquals("game_id", dto.getGameId());
         }
@@ -363,24 +353,12 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         if (dto.getPitcherId() != null) {
             cri.where().andEquals("pitcher_id", dto.getPitcherId());
         }
-        if (StringUtils.isNotBlank(dto.getPitcherName())) {
-            cri.where().andEquals("pitcher_name", dto.getPitcherName());
-        }
         if (dto.getAgentId() != null) {
-            cri.where().andEquals("agent_id", dto.getAgentId());
-        }
-        if (StringUtils.isNotBlank(dto.getAgentKey())) {
-            cri.where().andEquals("agent_key", dto.getAgentKey());
-        }
-        if (StringUtils.isNotBlank(dto.getAgentName())) {
-            cri.where().andEquals("agent_name", dto.getAgentName());
+            cri.where().andInList("agent_id", Arrays.asList(dto.getAgentId()));
         }
         if (StringUtils.isNotBlank(dto.getCpName())) {
             cri.where().andEquals("cp_name", dto.getCpName());
         }
-        if (StringUtils.isNotBlank(dto.getGameName())) {
-            cri.where().andEquals("game_name", dto.getGameName());
-        }
         if (dto.getGameId() != null) {
             cri.where().andEquals("game_id", dto.getGameId());
         }
@@ -413,7 +391,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         //拼接排序条件
         cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
 
-
         return cri;
     }
 

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

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 实名认证列表修改> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 小游戏玩家导量到H5游戏3> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 8 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java

@@ -136,4 +136,12 @@ public class UserController {
     public ResultVO<UserWeChatVO> getUserWeChat(@RequestParam Long userId) {
         return ResultVO.ok(userService.getUserWeChat(userId));
     }
+
+    @ApiOperation(value = "小游戏玩家导量到H5游戏")
+    @PatchMapping(value = "/applet/to/h5")
+    @PreAuthorize(permissionKey = "manage:user:appletToH5")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> appletToH5(@RequestParam Long userId, @RequestParam String mobile) {
+        return ResultVO.ok(userService.appletToH5(userId, mobile));
+    }
 }

+ 5 - 10
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameDTO.java

@@ -32,16 +32,6 @@ public class GameDTO {
      */
     private Long category;
 
-    /**
-     * H5游戏跳转地址
-     */
-    private String h5GameUrl;
-
-    /**
-     * H5游戏登录logo图片
-     */
-    private String h5LoginLogo;
-
     /**
      * 游戏是否投放
      */
@@ -72,6 +62,11 @@ public class GameDTO {
      */
     private Long h5GameId;
 
+    /**
+     * H5游戏相关配置
+     */
+    private String h5GameConfig;
+
     /**
      * 导量游戏id
      */

+ 24 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/UserListVO.java

@@ -194,4 +194,28 @@ public class UserListVO {
     @ApiModelProperty(notes = "注册充值时间差")
     private Long regPayTimeDiff;
 
+    /**
+     * 关联游戏id
+     */
+    @ApiModelProperty(notes = "关联游戏id")
+    private Long relationGameId;
+
+    /**
+     * 关联游戏名称
+     */
+    @ApiModelProperty(notes = "关联游戏名称")
+    private String relationGameName;
+
+    /**
+     * 关联用户id
+     */
+    @ApiModelProperty(notes = "关联用户id")
+    private Long relationUserId;
+
+    /**
+     * 关联建立时间
+     */
+    @ApiModelProperty(notes = "关联建立时间")
+    private LocalDateTime relationCreateTime;
+
 }

+ 2 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserRoleService.java

@@ -1,6 +1,7 @@
 package com.zanxiang.game.module.manage.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.manage.pojo.dto.GameUserRoleDTO;
 import com.zanxiang.game.module.manage.pojo.params.GameUserRoleListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserRoleListVO;
@@ -14,7 +15,7 @@ import java.util.List;
  * @time : 2022-07-01
  * @description : 玩家角色
  */
-public interface IGameUserRoleService {
+public interface IGameUserRoleService extends IService<GameUserRole> {
 
     /**
      * 获取用户最近的游戏角色

+ 3 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserService.java

@@ -1,16 +1,18 @@
 package com.zanxiang.game.module.manage.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.manage.pojo.params.GameUserListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserVO;
+import com.zanxiang.game.module.mybatis.entity.GameUser;
 
 /**
  * @author : lingfeng
  * @time : 2022-07-04
  * @description : 玩家游戏
  */
-public interface IGameUserService {
+public interface IGameUserService extends IService<GameUser> {
 
     /**
      * 查询玩家游戏列表

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IUserService.java

@@ -21,6 +21,15 @@ import java.util.Map;
  */
 public interface IUserService extends IService<User> {
 
+    /**
+     * 小游戏导量到H5
+     *
+     * @param userId 用户id
+     * @param mobile 移动
+     * @return {@link Boolean}
+     */
+    Boolean appletToH5(Long userId, String mobile);
+
     /**
      * 获取用户微信
      *

+ 81 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java

@@ -24,6 +24,7 @@ import com.zanxiang.game.module.manage.pojo.vo.UserVO;
 import com.zanxiang.game.module.manage.pojo.vo.UserWeChatVO;
 import com.zanxiang.game.module.manage.service.*;
 import com.zanxiang.game.module.mybatis.entity.Agent;
+import com.zanxiang.game.module.mybatis.entity.GameUser;
 import com.zanxiang.game.module.mybatis.entity.GameUserRole;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.mapper.UserMapper;
@@ -75,6 +76,86 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @DubboReference(providedBy = CorpServer.SERVER_DUBBO_NAME)
     private ICorpExternalUserServiceRpc corpExternalUserServiceRpc;
 
+    @Autowired
+    private IGameUserService gameUserService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean appletToH5(Long userId, String mobile) {
+        //用户信息
+        User user = super.getById(userId);
+        if (user == null) {
+            throw new BaseException("参数错误, 用户信息不存在");
+        }
+        //查询H5游戏
+        GameDTO h5GameDTO = gameService.getById(gameService.getById(user.getGameId()).getH5GameId());
+        if (h5GameDTO == null) {
+            throw new BaseException("参数错误, 关联H5游戏信息不存在");
+        }
+        //判断手机号是否被该游戏其他用户绑定
+        int count = super.count(new LambdaQueryWrapper<User>()
+                .eq(User::getGameId, h5GameDTO.getId())
+                .eq(User::getMobile, mobile));
+        if (count > 0) {
+            throw new BaseException("参数错误, 该手机号已被该游戏其他玩家信息绑定");
+        }
+        //复制用户信息
+        User h5User = BeanUtil.copy(user, User.class);
+        h5User.setId(null);
+        h5User.setGameId(h5GameDTO.getId());
+        h5User.setMobile(mobile);
+        h5User.setRelationUserId(user.getId());
+        h5User.setRelationCreateTime(LocalDateTime.now());
+        super.save(h5User);
+        //复制玩家信息
+        GameUser gameUser = gameUserService.getOne(new LambdaQueryWrapper<GameUser>()
+                .eq(GameUser::getUserId, user.getId())
+                .eq(GameUser::getGameId, user.getGameId()));
+        if (gameUser == null) {
+            throw new BaseException("参数错误, 玩家游戏信息不存在");
+        }
+        GameUser h5GameUser = GameUser.builder()
+                .userId(h5User.getId())
+                .gameId(h5User.getGameId())
+                .nickname(gameUser.getNickname())
+                .regTime(gameUser.getRegTime())
+                .createTime(gameUser.getCreateTime())
+                .updateTime(gameUser.getUpdateTime())
+                .build();
+        gameUserService.save(h5GameUser);
+        //复制角色
+        List<GameUserRole> gameUserRoleList = gameUserRoleService.list(new LambdaQueryWrapper<GameUserRole>()
+                .eq(GameUserRole::getUserId, user.getId())
+                .eq(GameUserRole::getGameId, user.getGameId()));
+        if (CollectionUtils.isEmpty(gameUserRoleList)) {
+            throw new BaseException("参数错误, 用户不存在角色信息");
+        }
+        List<GameUserRole> h5GameUserRoleList = gameUserRoleList.stream().map(gameUserRole -> GameUserRole.builder()
+                .userId(h5User.getId())
+                .gameUserId(h5GameUser.getId())
+                .gameId(h5User.getGameId())
+                .serverId(gameUserRole.getServerId())
+                .serverName(gameUserRole.getServerName())
+                .roleId(gameUserRole.getRoleId())
+                .roleName(gameUserRole.getRoleName())
+                .roleLevel(gameUserRole.getRoleLevel())
+                .roleVipLevel(gameUserRole.getRoleVipLevel())
+                .rolePower(gameUserRole.getRolePower())
+                .os(gameUserRole.getOs())
+                .regTime(gameUserRole.getCreateTime())
+                .createTime(gameUserRole.getCreateTime())
+                .updateTime(gameUserRole.getUpdateTime())
+                .lastLoginTime(gameUserRole.getLastLoginTime())
+                .build()
+        ).collect(Collectors.toList());
+        gameUserRoleService.saveBatch(h5GameUserRoleList);
+        //用户更新
+        return super.update(new LambdaUpdateWrapper<User>()
+                .set(User::getRelationUserId, h5User.getId())
+                .set(User::getRelationCreateTime, LocalDateTime.now())
+                .eq(User::getId, userId));
+    }
+
     @Override
     public UserWeChatVO getUserWeChat(Long userId) {
         User user = super.getById(userId);

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

@@ -171,6 +171,16 @@ public class User implements Serializable {
      */
     private Long shareUserId;
 
+    /**
+     * 关联的用户id
+     */
+    private Long relationUserId;
+
+    /**
+     * 关联建立的时间
+     */
+    private LocalDateTime relationCreateTime;
+
     /**
      * 获取用户显示手机号
      *

+ 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服务启动成功 <dubbo升级3.0, 1111> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <dubbo升级3.0, 小游戏导量H5上线> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 9 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/UserController.java

@@ -2,6 +2,7 @@ package com.zanxiang.game.module.sdk.controller;
 
 
 import com.zanxiang.game.module.sdk.annotation.ValidLogin;
+import com.zanxiang.game.module.sdk.enums.DataTypeEnum;
 import com.zanxiang.game.module.sdk.pojo.param.*;
 import com.zanxiang.game.module.sdk.pojo.vo.CustomerVO;
 import com.zanxiang.game.module.sdk.pojo.vo.GameShareVO;
@@ -20,6 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Objects;
+
 /**
  * @author : lingfeng
  * @time : 2022-06-16
@@ -95,7 +98,12 @@ public class UserController {
     @PostMapping("/update/game/role")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
     public ResultVO<Boolean> updateUserGameRole(@Validated @RequestBody GameUserRoleUpdateParam param, @ValidLogin UserData userData) {
-        return ResultVO.ok(gameUserRoleService.updateUserGameRole(param, userData));
+        Boolean result = gameUserRoleService.updateUserGameRole(param, userData);
+        //创建角色通知监听服务
+        if (Objects.equals(param.getDataType(), DataTypeEnum.TYPE_CREATE_ROLE.getDateType())) {
+            gameUserRoleService.callListenIn(param, userData);
+        }
+        return ResultVO.ok(result);
     }
 
 }

+ 8 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameUserRoleService.java

@@ -16,4 +16,12 @@ public interface IGameUserRoleService extends IService<GameUserRole> {
      * @return {@link Boolean}
      */
     Boolean updateUserGameRole(GameUserRoleUpdateParam param, UserData userData);
+
+    /**
+     * 通知监听服务
+     *
+     * @param param    参数
+     * @param userData 用户数据
+     */
+    void callListenIn(GameUserRoleUpdateParam param, UserData userData);
 }

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

@@ -15,6 +15,4 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class GameServiceImpl extends ServiceImpl<GameMapper, Game> implements IGameService {
-
-
 }

+ 18 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java

@@ -23,8 +23,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
 
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
@@ -36,6 +39,9 @@ import java.util.concurrent.TimeUnit;
 @Service
 public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, GameUserRole> implements IGameUserRoleService {
 
+    @Autowired
+    private RestTemplate restTemplate;
+
     @Autowired
     private IGameUserService gameUserService;
 
@@ -151,4 +157,16 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         //释放锁
         distributedLockComponent.unlock(RedisKeyConstant.ROLE_UPDATE_KEY + "_" + userData.getUserId());
     }
+
+    @Override
+    public void callListenIn(GameUserRoleUpdateParam param, UserData userData) {
+        Map<String, String> map = new HashMap<>(2);
+        map.put("json", JsonUtil.toString(param));
+        map.put("userData", JsonUtil.toString(userData));
+        //创角通知监听服务
+        try {
+            restTemplate.postForObject("http://47.99.157.216:9000/game/roleReport", map, Object.class);
+        } catch (Exception ignored) {
+        }
+    }
 }

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

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
-import com.zanxiang.game.module.mybatis.entity.GameExt;
-import com.zanxiang.game.module.mybatis.entity.User;
-import com.zanxiang.game.module.mybatis.entity.UserCard;
-import com.zanxiang.game.module.mybatis.entity.UserShare;
+import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.SmsTypeEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.GameAppletDTO;
@@ -90,6 +87,9 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Autowired
     private IUserAgentLogService userAgentLogService;
 
+    @Autowired
+    private IGameService gameService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData) {
@@ -217,8 +217,18 @@ public class LoginServiceImpl implements IRegisterLoginService {
             }
             //渠道更新和回传判断
             agentService.userAgentUpdate(user, userData.getChannel());
+            UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
+            Game game = gameService.getById(user.getGameId());
+            //判断是否导量用户
+            if (user.getRelationUserId() != null && game.getGuideGameId() != null) {
+                User relationUser = userService.getById(user.getRelationUserId());
+                if (relationUser != null) {
+                    //导量用户返回原有的用户id
+                    userLoginVO.setUserId(relationUser.getId());
+                }
+            }
             //返回登录信息
-            return ResultVO.ok(this.createUserLoginVO(user, userData));
+            return ResultVO.ok(userLoginVO);
         }
         //用户注册
         user = userCreateSave(userData, mobile, null, mobile, null, null);
@@ -279,6 +289,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
     }
 
     private UserLoginVO createUserLoginVO(User user, UserData userData) {
+        //补全 userData 中的用户id
+        if (userData.getUserId() == null) {
+            userData.setUserId(user.getId());
+        }
         //获取token
         String userToken = userTokenService.getUserToken(user.getId(), userData.getDeviceType());
         //插入用户登录记录
@@ -307,7 +321,6 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean loginOut(UserData userData) {
-        User user = userService.getById(userData.getUserId());
         //新增用户退出记录
         return userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_OUT.getLoginType());
     }

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

@@ -69,6 +69,9 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
     @Autowired
     private IGameAppletService gameAppletService;
 
+    @Autowired
+    private IGameService gameService;
+
     @Override
     @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
     public Boolean pushCp(PlatformOrderDTO orderInfo) {
@@ -82,9 +85,18 @@ public class PerformOrderServiceImpl implements IPerformOrderService {
             log.error("充值回调CP失败, 游戏拓展信息中的回调地址为空!");
             return false;
         }
+        //用户信息
+        User user = userService.getById(orderInfo.getUserId());
+        //游戏信息
+        Game game = gameService.getById(orderInfo.getGameId());
         //回调CP
         Map<String, String> map = new HashMap<>(9);
-        map.put("userId", String.valueOf(orderInfo.getUserId()));
+        //用户存在关联用户id, 且游戏存在导量游戏id, 判定为导量用户, 提交CP原始用户id
+        if (user.getRelationUserId() != null && game.getGuideGameId() != null) {
+            map.put("userId", String.valueOf(user.getRelationUserId()));
+        } else {
+            map.put("userId", String.valueOf(orderInfo.getUserId()));
+        }
         map.put("money", orderInfo.getAmount().stripTrailingZeros().toPlainString());
         map.put("time", String.valueOf(System.currentTimeMillis()));
         map.put("serverId", orderInfo.getServerId());

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

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.util.DateUtils;
-import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.entity.GameExt;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserToken;
@@ -56,9 +55,6 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     @Autowired
     private IUserLoginLogService userLoginLogService;
 
-    @Autowired
-    private IGameService gameService;
-
     @Override
     public ResultVO<Long> cpTokenCheck(String appId, Long userId, String token, String sign) {
         //查询登录签名
@@ -67,10 +63,18 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
             log.error("token验证失败 , 游戏拓展信息不存在, appId : {}, userId : {}", appId, userId);
             return ResultVO.fail(TokenCheckEnum.PARAM_LACK.getMsg());
         }
+        //用户信息
+        User user = userService.getById(userId);
         //查询token是否存在
         UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
                 .eq(UserToken::getToken, token)
                 .eq(UserToken::getUserId, userId));
+        //导量用户携带的是 relationUserId 匹配的token
+        if (userToken == null && user.getRelationUserId() != null) {
+            userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
+                    .eq(UserToken::getToken, token)
+                    .eq(UserToken::getUserId, user.getRelationUserId()));
+        }
         //判断token是否存在, 并且没有过期
         if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
             log.error("token验证失败 , token不存在或者已经失效, appId : {}, userId : {}, token : {}", appId, userId, token);
@@ -104,8 +108,6 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     @Override
     public Boolean userTokenExpireTimeCheck(UserData userData) {
         log.error("缓存token验证请求 userData : {}", JsonUtil.toString(userData));
-        //微信小游戏, 解决前端没有checkSession的问题, 临时方案, 每次都重新登录
-        Game game = gameService.getById(userData.getGameId());
         //判断是否存在用户id或者token是否存在
         if (userData.getUserId() == null || Strings.isBlank(userData.getToken())) {
             return Boolean.FALSE;
@@ -141,7 +143,7 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         boolean result = expireTime > endTime;
         //token未过期, 记录登录日志
         if (result) {
-            userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_REG.getLoginType());
+            userLoginLogService.createUserLoginLog(userData, LoginTypeEnum.LOGIN_IN.getLoginType());
         }
         return result;
     }