瀏覽代碼

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

bilingfeng 1 年之前
父節點
當前提交
4b9daa6983
共有 18 個文件被更改,包括 1198 次插入766 次删除
  1. 12 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java
  2. 3 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/OverallSummaryController.java
  3. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/OverallSummaryDTO.java
  4. 1 25
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayDTO.java
  5. 1 25
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayTotalDTO.java
  6. 0 179
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsOverallSummary.java
  7. 99 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayTotalVO.java
  8. 100 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayVO.java
  9. 100 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalTotalVO.java
  10. 100 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataTotalVO.java
  11. 0 66
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/OverallSummaryLineDataVO.java
  12. 67 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java
  13. 18 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/RechargeTrendVO.java
  14. 7 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameDataService.java
  15. 85 165
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java
  16. 534 207
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  17. 4 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/OverallSummaryServiceImpl.java
  18. 66 89
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.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));

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

@@ -1,5 +1,6 @@
 package com.zanxiang.game.data.serve.controller;
 
+import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.data.serve.pojo.dto.OverallSummaryDTO;
 import com.zanxiang.game.data.serve.pojo.vo.OverallSummaryVO;
 import com.zanxiang.game.data.serve.service.IOverallSummaryService;
@@ -33,7 +34,7 @@ public class OverallSummaryController {
     private IOverallSummaryService overallSummaryService;
 
     @ApiOperation(value = "获取整体概况数据")
-    //@PreAuthorize(permissionKey = "gameData:adsOverallSummary:totalData")
+    @PreAuthorize(permissionKey = "gameData:adsOverallSummary:totalData")
     @PostMapping("/totalData")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = OverallSummaryVO.class)})
     public ResultVO<OverallSummaryVO> getOverallSummaryTotalData(@RequestBody OverallSummaryDTO dto) {
@@ -41,7 +42,7 @@ public class OverallSummaryController {
     }
 
     @ApiOperation(value = "获取折线图数据")
-    //@PreAuthorize(permissionKey = "gameData:adsOverallSummary:lineData")
+    @PreAuthorize(permissionKey = "gameData:adsOverallSummary:lineData")
     @PostMapping("/lineData")
     public ResultVO<Map<String,List>> getOverallSummaryLineData(@RequestBody OverallSummaryDTO dto) {
         return ResultVO.ok(overallSummaryService.getOverallSummaryLineData(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;
-
-}

+ 99 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameDataDayTotalVO.java

@@ -1453,4 +1453,103 @@ public class GameDataDayTotalVO {
     @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;
+
 }

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

@@ -1452,4 +1452,104 @@ public class GameDataDayVO {
     @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;
+
 }

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

@@ -683,4 +683,104 @@ public class GameDataTotalTotalVO {
     @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;
+
 }

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

@@ -701,4 +701,104 @@ public class GameDataTotalVO {
     @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,

+ 534 - 207
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -53,7 +53,8 @@ import java.util.stream.Collectors;
 public class GameDataServiceImpl implements IGameDataService {
     private static final List<Tuple2<Field, Field>> dayNFieldMapList;
     private static final List<Tuple2<Field, Field>> dayNTotalFieldMapList;
-    static  {
+
+    static {
         Map<String, Field> fieldMap = new HashMap<>();
         Map<String, Field> fieldTotalMap = new HashMap<>();
         List<Field> dayNFieldList = new ArrayList<>();
@@ -89,29 +90,29 @@ public class GameDataServiceImpl implements IGameDataService {
             tempTotalClazz = tempTotalClazz.getSuperclass();
         }
 
-        if(dayNFieldList.isEmpty()) {
-            dayNFieldMapList  = Collections.emptyList();
+        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();
+        if (dayNTotalFieldList.isEmpty()) {
+            dayNTotalFieldMapList = Collections.emptyList();
         } else {
             dayNTotalFieldMapList = new ArrayList<>(dayNTotalFieldList.size());
-            for(Field dayNTotalField : dayNTotalFieldList) {
+            for (Field dayNTotalField : dayNTotalFieldList) {
                 dayNTotalField.setAccessible(true);
                 Field sourceField = fieldTotalMap.get(dayNTotalField.getName().replace("Trend", ""));
                 sourceField.setAccessible(true);
-                if(sourceField != null) {
+                if (sourceField != null) {
                     dayNTotalFieldMapList.add(Tuples.of(sourceField, dayNTotalField));
                 }
             }
@@ -474,11 +475,82 @@ public class GameDataServiceImpl implements IGameDataService {
      * @return 返回给前端额数据
      */
     public GameDataTotalTotalVO getGameDataTotalTotal(GameDataTotalTotalDTO dto) {
+        //如果注册时间参数为空,默认设置查询当天数据
+        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 null;
+        return vo;
     }
 
     /**
@@ -942,10 +1014,11 @@ public class GameDataServiceImpl implements IGameDataService {
 
     /**
      * 通过反射赋值每日趋势
+     *
      * @param vo
      */
     private void formatDayN(GameDataDayVO vo) {
-        if(CollectionUtils.isEmpty(dayNFieldMapList)) {
+        if (CollectionUtils.isEmpty(dayNFieldMapList)) {
             return;
         }
         dayNFieldMapList.forEach(dayNFieldMap -> {
@@ -966,58 +1039,36 @@ public class GameDataServiceImpl implements IGameDataService {
 
     /**
      * 通过反射赋值每日总计趋势
+     *
      * @param vo
      */
     private void formatDayNTotal(GameDataDayTotalVO vo) {
-        if(CollectionUtils.isEmpty(dayNTotalFieldMapList)) {
+        if (CollectionUtils.isEmpty(dayNTotalFieldMapList)) {
             return;
         }
-
-        //D1的充值金额(买量、自然量、总量)
-        BigDecimal amountD1 = new BigDecimal(vo.getAmountD1().split("/")[0]);
-        BigDecimal buyAmountD1 = new BigDecimal(vo.getBuyAmountD1().split("/")[0]);
-        BigDecimal natureAmountD1 = new BigDecimal(vo.getNatureAmountD1().split("/")[0]);
-
         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]);
-
-                if (temps[3].equals("buy")) {
-                    dayNTotalFieldMap.getT2().set(vo, RechargeTrendVO.builder()
-                            .rechargeMoney(dNAmount)
-                            .rechargeUserCount(Long.valueOf(temps[2]))
-                            .increase(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    dNAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .back(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .multiples(buyAmountD1.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(buyAmountD1, 4, RoundingMode.HALF_UP))
-                            .build());
-                } else if (temps[3].equals("nature")) {
-                    dayNTotalFieldMap.getT2().set(vo, RechargeTrendVO.builder()
-                            .rechargeMoney(dNAmount)
-                            .rechargeUserCount(Long.valueOf(temps[2]))
-                            .increase(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    dNAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .back(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .multiples(natureAmountD1.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(natureAmountD1, 4, RoundingMode.HALF_UP))
-                            .build());
-                } else {
-                    dayNTotalFieldMap.getT2().set(vo, RechargeTrendVO.builder()
-                            .rechargeMoney(dNAmount)
-                            .rechargeUserCount(Long.valueOf(temps[2]))
-                            .increase(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    dNAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .back(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(vo.getCost(), 4, RoundingMode.HALF_UP))
-                            .multiples(amountD1.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
-                                    d1ToDNTotalAmount.divide(amountD1, 4, RoundingMode.HALF_UP))
-                            .build());
-                }
+                //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);
@@ -1266,6 +1317,17 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
@@ -1330,6 +1392,17 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
@@ -1393,7 +1466,18 @@ public class GameDataServiceImpl implements IGameDataService {
                     amount_sum,
                     reg_cost,
                     first_amount_cost as first_new_user_recharge_cost,
-                    total_amount_cost as total_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
@@ -1413,173 +1497,290 @@ public class GameDataServiceImpl implements IGameDataService {
                 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,
-                
+                                
                 """
                 + amountDay("buy_") +
                 """
-                CONCAT(SUM(CAST(SPLIT_PART(buy_amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m1, '/', 2) AS BIGINT)),'/buy') AS buy_amount_m1,
-                CONCAT(SUM(CAST(SPLIT_PART(buy_amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m2, '/', 2) AS BIGINT)),'/buy') AS buy_amount_m2,
-                CONCAT(SUM(CAST(SPLIT_PART(buy_amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m3, '/', 2) AS BIGINT)),'/buy') AS buy_amount_m3,
-                CONCAT(SUM(CAST(SPLIT_PART(buy_amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m6, '/', 2) AS BIGINT)),'/buy') AS buy_amount_m6,
-                CONCAT(SUM(CAST(SPLIT_PART(buy_amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(buy_amount_y1, '/', 2) AS BIGINT)),'/buy') 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)),'/buy') 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,
-                
-                """
+                        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(CAST(SPLIT_PART(nature_amount_m1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m1, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m1, '/', 2) AS BIGINT)),'/nature') AS nature_amount_m1,
-                CONCAT(SUM(CAST(SPLIT_PART(nature_amount_m2 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m2, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m2, '/', 2) AS BIGINT)),'/nature') AS nature_amount_m2,
-                CONCAT(SUM(CAST(SPLIT_PART(nature_amount_m3 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m3, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m3, '/', 2) AS BIGINT)),'/nature') AS nature_amount_m3,
-                CONCAT(SUM(CAST(SPLIT_PART(nature_amount_m6 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m6, '/', 2) AS BIGINT)),'/nature') AS nature_amount_m6,
-                CONCAT(SUM(CAST(SPLIT_PART(nature_amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(nature_amount_y1, '/', 2) AS BIGINT)),'/nature') 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)),'/nature') 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,
-                
-                """
+                        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(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)),'/total') AS amount_m1,
-                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)),'/total') AS amount_m2,
-                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)),'/total') AS amount_m3,
-                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)),'/total') AS amount_m6,
-                CONCAT(SUM(CAST(SPLIT_PART(amount_y1 , '/', 1) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_m6, '/', 6) AS DECIMAL(10, 2))),'/',SUM(CAST(SPLIT_PART(amount_y1, '/', 2) AS BIGINT)),'/total') 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)),'/total') 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
-                                
-                FROM
-                ads_game_day
-                 
-                                
-                """;
+                        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的充值人数
+     * @return String : Dn的充值金额 / D1-Dn的充值总金额 / Dn的充值人数 /当前消耗(剔除不存在的天数数据) /D1充值金额总和(剔除不存在的天数数据)/type
      */
-    private String amountDay(String type){
-
-        //修改拼接字符串
-        String temp;
-        if (type.equals("buy_")) {
-            temp = "buy";
-        } else if (type.equals("nature_")) {
-            temp = "nature";
-        } else {
-            temp = "total";
-        }
-
+    private String amountDay(String type) {
+        //拼接查询条件
         StringBuilder trendDay = new StringBuilder(StringUtils.EMPTY);
         for (int day = 1; day <= 29; day++) {
-            trendDay.append("CONCAT(")
-                    .append("SUM(CAST(SPLIT_PART(")
-                    .append(type)
-                    .append("amount_d")
-                    .append(day)
-                    .append(" , '/', 1) AS DECIMAL(10, 2))), ")
-                    .append("'/', ")
-                    .append("SUM(CAST(SPLIT_PART(")
-                    .append(type)
-                    .append("amount_d")
-                    .append(day)
-                    .append(", '/', 6) AS DECIMAL(10, 2))), ")
-                    .append("'/', ")
-                    .append("SUM(CAST(SPLIT_PART(")
-                    .append(type)
-                    .append("amount_d")
-                    .append(day)
-                    .append(", '/', 2) AS BIGINT))")
-                    .append(",'/")
-                    .append(temp)
-                    .append("'")
-                    .append(") AS ")
-                    .append(type)
-                    .append("amount_d")
-                    .append(day).append(",");
+            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();
     }
 
@@ -1670,13 +1871,139 @@ public class GameDataServiceImpl implements IGameDataService {
                     
                     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
+                    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;
     }