瀏覽代碼

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

zhimo 1 年之前
父節點
當前提交
e0a239b6b8

+ 9 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/PitcherDataController.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.*;
 import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.service.IPitcherDataService;
@@ -29,56 +30,56 @@ public class PitcherDataController {
     private IPitcherDataService pitcherDataService;
 
     @ApiOperation(value = "投手每日数据")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcher:day")
+    @PreAuthorize(permissionKey = "pitcherData:pitcher:day")
     @PostMapping("/pitcher/day")
     public ResultVO<Page<PitcherDataDayVO>> getPitcherDataDay(@RequestBody PitcherDataDayDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherDataDay(dto));
     }
 
     @ApiOperation(value = "投手每日数据总计")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcher:dayTotal")
+    @PreAuthorize(permissionKey = "pitcherData:pitcher:dayTotal")
     @PostMapping("/pitcher/day/total")
     public ResultVO<PitcherDataDayTotalVO> getPitcherDataDayTotal(@RequestBody PitcherDataDayTotalDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherDataDayTotal(dto));
     }
 
     @ApiOperation(value = "投手总数据")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcher:total")
+    @PreAuthorize(permissionKey = "pitcherData:pitcher:total")
     @PostMapping("/pitcher/total")
     public ResultVO<Page<PitcherDataTotalVO>> getPitcherDataTotal(@RequestBody PitcherDataTotalDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherDataTotal(dto));
     }
 
     @ApiOperation(value = "投手总数据总计")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcher:totalSum")
+    @PreAuthorize(permissionKey = "pitcherData:pitcher:totalSum")
     @PostMapping("/pitcher/total/sum")
     public ResultVO<PitcherDataTotalSumVO> getPitcherDataTotalSum(@RequestBody PitcherDataTotalSumDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherDataTotalSum(dto));
     }
 
     @ApiOperation(value = "投手游戏每日数据")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcherGame:day")
+    @PreAuthorize(permissionKey = "pitcherData:pitcherGame:day")
     @PostMapping("/pitcherGame/day")
     public ResultVO<Page<PitcherGameDataDayVO>> getPitcherGameDataDay(@RequestBody PitcherGameDataDayDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherGameDataDay(dto));
     }
 
     @ApiOperation(value = "投手游戏每日数据总计")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcherGame:dayTotal")
+    @PreAuthorize(permissionKey = "pitcherData:pitcherGame:dayTotal")
     @PostMapping("/pitcherGame/day/total")
     public ResultVO<PitcherGameDataDayTotalVO> getPitcherGameDataDayTotal(@RequestBody PitcherGameDataDayTotalDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherGameDataDayTotal(dto));
     }
 
     @ApiOperation(value = "投手游戏总数据")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcherGame:total")
+    @PreAuthorize(permissionKey = "pitcherData:pitcherGame:total")
     @PostMapping("/pitcherGame/total")
     public ResultVO<Page<PitcherGameDataTotalVO>> getPitcherGameDataTotal(@RequestBody PitcherGameDataTotalDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherGameDataTotal(dto));
     }
 
     @ApiOperation(value = "投手游戏总数据总计")
-    //@PreAuthorize(permissionKey = "pitcherData:pitcherGame:totalSum")
+    @PreAuthorize(permissionKey = "pitcherData:pitcherGame:totalSum")
     @PostMapping("/pitcherGame/total/sum")
     public ResultVO<PitcherGameDataTotalSumVO> getPitcherGameDataTotalSum(@RequestBody PitcherGameDataTotalSumDTO dto) {
         return ResultVO.ok(pitcherDataService.getPitcherGameDataTotalSum(dto));

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

@@ -1,9 +1,71 @@
 package com.zanxiang.game.data.serve.pojo.dto;
 
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
 /**
  * @author tianhua
  * @time 2023/8/15
  * @Description 投手总数据查询条件实体
  **/
-public class PitcherDataTotalDTO {
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PitcherDataTotalDTO extends BasePage {
+
+    /**
+     * 消耗开始时间
+     */
+    @ApiModelProperty(value = "消耗开始时间")
+    private LocalDate beginDate;
+
+    /**
+     * 消耗结束时间
+     */
+    @ApiModelProperty(value = "消耗结束时间")
+    private LocalDate endDate;
+
+    /**
+     * 充值开始时间
+     */
+    @ApiModelProperty(value = "充值开始时间")
+    private LocalDate amountBeginDate;
+
+    /**
+     * 充值结束时间
+     */
+    @ApiModelProperty(value = "充值结束时间")
+    private LocalDate amountEndDate;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
+    /**
+     * 排序字段
+     */
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    /**
+     * 排序方式:升序asc;降序desc
+     */
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
+
 }

+ 49 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PitcherDataTotalSumDTO.java

@@ -1,9 +1,58 @@
 package com.zanxiang.game.data.serve.pojo.dto;
 
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
 /**
  * @author tianhua
  * @time 2023/8/15
  * @Description 投手总数据总计查询条件实体
  **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class PitcherDataTotalSumDTO {
+
+    /**
+     * 消耗开始时间
+     */
+    @ApiModelProperty(value = "消耗开始时间")
+    private LocalDate beginDate;
+
+    /**
+     * 消耗结束时间
+     */
+    @ApiModelProperty(value = "消耗结束时间")
+    private LocalDate endDate;
+
+    /**
+     * 充值开始时间
+     */
+    @ApiModelProperty(value = "充值开始时间")
+    private LocalDate amountBeginDate;
+
+    /**
+     * 充值结束时间
+     */
+    @ApiModelProperty(value = "充值结束时间")
+    private LocalDate amountEndDate;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
 }

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

@@ -1,9 +1,604 @@
 package com.zanxiang.game.data.serve.pojo.vo;
 
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
 /**
  * @author tianhua
  * @time 2023/8/15
  * @Description 投手总数据总计实体
  **/
+@Data
 public class PitcherDataTotalSumVO {
+
+    /**
+     * 消耗
+     */
+    @ApiModelProperty(value = "消耗")
+    private BigDecimal cost;
+
+    /**
+     * 推广计划数量
+     */
+    @ApiModelProperty(value = "推广计划数量")
+    private Long planCount;
+
+    /**
+     * 推广账号数量
+     */
+    @ApiModelProperty(value = "推广账号数量")
+    private Long accountCount;
+
+    /**
+     * 推广渠道数量
+     */
+    @ApiModelProperty(value = "推广渠道数量")
+    private Long agentCount;
+
+    /**
+     * 注册人数-通过广告首次登录小游戏的独立用户数
+     */
+    @ApiModelProperty(value = "注册人数-通过广告首次登录小游戏的独立用户数")
+    private Long registerNum;
+
+    /**
+     * 注册成本=实际消耗/注册人数
+     */
+    @ApiModelProperty(value = "注册成本=实际消耗/注册人数")
+    private BigDecimal registerCost;
+
+    /**
+     * 首日创角人数
+     */
+    @ApiModelProperty(value = "首日创角人数")
+    private Long firstRoleNum;
+
+    /**
+     * 新用户累计创角人数
+     */
+    @ApiModelProperty(value = "新用户累计创角人数")
+    private Long newUserTotalRoleNum;
+
+    /**
+     * 创角人数
+     */
+    @ApiModelProperty(value = "创角人数")
+    private Long roleNum;
+
+    /**
+     * 首日创角成本
+     */
+    @ApiModelProperty(value = "首日创角成本")
+    private BigDecimal firstRoleCost;
+
+    /**
+     * 新用户累计创角成本
+     */
+    @ApiModelProperty(value = "新用户累计创角成本")
+    private BigDecimal newUserTotalRoleCost;
+
+    /**
+     * 创角成本
+     */
+    @ApiModelProperty(value = "创角成本")
+    private BigDecimal roleNumCost;
+
+    /**
+     * 首日创角率
+     */
+    @ApiModelProperty(value = "首日创角率")
+    private BigDecimal firstRoleRate;
+
+    /**
+     * 新用户累计创角率
+     */
+    @ApiModelProperty(value = "新用户累计创角率")
+    private BigDecimal newUserTotalRoleRate;
+
+    /**
+     * 创角率
+     */
+    @ApiModelProperty(value = "创角率")
+    private BigDecimal roleNumRate;
+
+    /**
+     * 新用户充值次数
+     */
+    @ApiModelProperty(value = "新用户充值次数")
+    private Long newUserAmountCount;
+
+    /**
+     * 新用户充值人数
+     */
+    @ApiModelProperty(value = "新用户充值人数")
+    private Long newUserAmountNum;
+
+    /**
+     * 新用户充值金额
+     */
+    @ApiModelProperty(value = "新用户充值金额")
+    private BigDecimal newUserAmount;
+
+    /**
+     * 新增付费次数(首日新用户充值次数)
+     */
+    @ApiModelProperty(value = "新增付费次数")
+    private Long firstNewUserAmountCount;
+
+    /**
+     * 新增付费人数(首日新用户充值人数)
+     */
+    @ApiModelProperty(value = "新增付费人数")
+    private Long firstNewUserAmountNum;
+
+    /**
+     * 新增付费金额(首日新用户充值金额)
+     */
+    @ApiModelProperty(value = "新增付费金额")
+    private BigDecimal firstNewUserAmount;
+
+    /**
+     * 账面充值次数
+     */
+    @ApiModelProperty(value = "账面充值次数")
+    private Long amountCount;
+
+    /**
+     * 账面充值人数
+     */
+    @ApiModelProperty(value = "账面充值人数")
+    private Long amountNum;
+
+    /**
+     * 账面充值金额
+     */
+    @ApiModelProperty(value = "账面充值金额")
+    private BigDecimal amount;
+
+    /**
+     * 老用户充值次数(每日)
+     */
+    @ApiModelProperty(value = "老用户充值次数(每日)")
+    private Long oldAmountCount;
+
+    /**
+     * 老用户充值人数(每日)
+     */
+    @ApiModelProperty(value = "老用户充值人数(每日)")
+    private Long oldAmountNum;
+
+    /**
+     * 老用户充值金额(每日)
+     */
+    @ApiModelProperty(value = "老用户充值金额(每日)")
+    private BigDecimal oldAmount;
+
+    /**
+     * 至今充值次数(新用户累积充值次数)
+     */
+    @ApiModelProperty(value = "至今充值次数")
+    private Long newUserTotalAmountCount;
+
+    /**
+     * 至今充值人数(新用户累积充值人数)
+     */
+    @ApiModelProperty(value = "至今充值人数")
+    private Long newUserTotalAmountNum;
+
+    /**
+     * 至今充值金额(新用户累积充值金额)
+     */
+    @ApiModelProperty(value = "至今充值金额")
+    private BigDecimal newUserTotalAmount;
+
+    /**
+     * 单日付费100+人数
+     */
+    @ApiModelProperty(value = "单日付费100+人数")
+    private Long hundredUserNum;
+
+    /**
+     * 单日付费100+成本
+     */
+    @ApiModelProperty(value = "单日付费100+成本")
+    private BigDecimal hundredUserNumCost;
+
+    /**
+     * 买量新用户累计充值金额
+     */
+    @ApiModelProperty(value = "买量新用户累计充值金额")
+    private BigDecimal buyNewUserTotalAmount;
+
+    /**
+     * 买量新用户累计充值人数
+     */
+    @ApiModelProperty(value = "买量新用户累计充值人数")
+    private Long buyNewUserTotalAmountNum;
+
+    /**
+     * 买量新用户累计充值次数
+     */
+    @ApiModelProperty(value = "买量新用户累计充值次数")
+    private Long buyNewUserTotalAmountCount;
+
+    /**
+     * 首日回收率
+     */
+    @ApiModelProperty(value = "首日回收率")
+    private BigDecimal firstRoi;
+
+    /**
+     * 买量回收率
+     */
+    @ApiModelProperty(value = "买量回收率")
+    private BigDecimal buyRoi;
+
+    /**
+     * 当日回收率(至今回收率)
+     */
+    @ApiModelProperty(value = "当日回收率")
+    private BigDecimal todayRoi;
+
+    /**
+     * 毛利额,毛利=新用户-实际消耗
+     */
+    @ApiModelProperty(value = "毛利额,毛利=新用户-实际消耗")
+    private BigDecimal grossProfit;
+
+    /**
+     * 新用户回收率
+     */
+    @ApiModelProperty(value = "新用户回收率")
+    private BigDecimal newUserRoi;
+
+    /**
+     * 首日付费率
+     */
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal firstRate;
+
+    /**
+     * 新用户付费率
+     */
+    @ApiModelProperty(value = "新用户付费率")
+    private BigDecimal newUserAmountRate;
+
+    /**
+     * 买量用户付费率
+     */
+    @ApiModelProperty(value = "买量用户付费率")
+    private BigDecimal buyUserRate;
+
+    /**
+     * 当天付费率
+     */
+    @ApiModelProperty(value = "当天付费率")
+    private BigDecimal todayRate;
+
+    /**
+     * 新用户付费比
+     */
+    @ApiModelProperty(value = "新用户付费比")
+    private BigDecimal newUserAmountRatio;
+
+    /**
+     * 首日客单价
+     */
+    @ApiModelProperty(value = "首日客单价")
+    private BigDecimal firstAvg;
+
+    /**
+     * 新用户客单价
+     */
+    @ApiModelProperty(value = "新用户客单价")
+    private BigDecimal newUserAvg;
+
+    /**
+     * 买量客单价
+     */
+    @ApiModelProperty(value = "买量客单价")
+    private BigDecimal buyAvg;
+
+    /**
+     * 当天客单价
+     */
+    @ApiModelProperty(value = "当天客单价")
+    private BigDecimal todayAvg;
+
+    /**
+     * 账面客单价
+     */
+    @ApiModelProperty(value = "账面客单价")
+    private BigDecimal paperAvg;
+
+    /**
+     * 首日充值成本
+     */
+    @ApiModelProperty(value = "首日充值成本")
+    private BigDecimal firstAmountCost;
+
+    /**
+     * 新用户充值成本
+     */
+    @ApiModelProperty(value = "新用户充值成本")
+    private BigDecimal newUserAmountCost;
+
+    /**
+     * 买量充值成本
+     */
+    @ApiModelProperty(value = "买量充值成本")
+    private BigDecimal buyAmountCost;
+
+    /**
+     * 当天充值成本
+     */
+    @ApiModelProperty(value = "当天充值成本")
+    private BigDecimal todayAmountCost;
+
+    /**
+     * 复充人数
+     */
+    @ApiModelProperty(value = "复充人数")
+    private Long regOrderUserAgain;
+
+    /**
+     * 当天复充率
+     */
+    @ApiModelProperty(value = "当天复充率")
+    private BigDecimal todayAgainRate;
+
+    /**
+     * 新用户复充人数
+     */
+    @ApiModelProperty(value = "新用户复充人数")
+    private Long newUserOrderAgain;
+
+    /**
+     * 新用户复充率
+     */
+    @ApiModelProperty(value = "新用户复充率")
+    private BigDecimal newUserAgainRate;
+
+    /**
+     * 新增注册ARPU
+     */
+    @ApiModelProperty(value = "新增注册ARPU")
+    private BigDecimal newRegArpu;
+
+    /**
+     * 首日付费ARPU
+     */
+    @ApiModelProperty(value = "首日付费ARPU")
+    private BigDecimal firstArpu;
+
+    /**
+     * 新用户付费ARPU
+     */
+    @ApiModelProperty(value = "新用户付费ARPU")
+    private BigDecimal newUserArpu;
+
+    /**
+     * 当天付费ARPU
+     */
+    @ApiModelProperty(value = "当天付费ARPU")
+    private BigDecimal todayArpu;
+
+    /**
+     * 账面arpu
+     */
+    @ApiModelProperty(value = "账面arpu")
+    private BigDecimal paperArpu;
+
+    /**
+     * 1日roi
+     */
+    @ApiModelProperty(value = "1日roi")
+    private BigDecimal roi1;
+
+    /**
+     * 2日roi
+     */
+    @ApiModelProperty(value = "2日roi")
+    private BigDecimal roi2;
+
+    /**
+     * 3日roi
+     */
+    @ApiModelProperty(value = "3日roi")
+    private BigDecimal roi3;
+
+    /**
+     * 4日roi
+     */
+    @ApiModelProperty(value = "4日roi")
+    private BigDecimal roi4;
+
+    /**
+     * 5日roi
+     */
+    @ApiModelProperty(value = "5日roi")
+    private BigDecimal roi5;
+
+    /**
+     * 6日roi
+     */
+    @ApiModelProperty(value = "6日roi")
+    private BigDecimal roi6;
+
+    /**
+     * 7日roi
+     */
+    @ApiModelProperty(value = "7日roi")
+    private BigDecimal roi7;
+
+    /**
+     * 8日roi
+     */
+    @ApiModelProperty(value = "8日roi")
+    private BigDecimal roi8;
+
+    /**
+     * 9日roi
+     */
+    @ApiModelProperty(value = "9日roi")
+    private BigDecimal roi9;
+
+    /**
+     * 10日roi
+     */
+    @ApiModelProperty(value = "10日roi")
+    private BigDecimal roi10;
+
+    /**
+     * 11日roi
+     */
+    @ApiModelProperty(value = "11日roi")
+    private BigDecimal roi11;
+
+    /**
+     * 12日roi
+     */
+    @ApiModelProperty(value = "12日roi")
+    private BigDecimal roi12;
+
+    /**
+     * 13日roi
+     */
+    @ApiModelProperty(value = "13日roi")
+    private BigDecimal roi13;
+
+    /**
+     * 14日roi
+     */
+    @ApiModelProperty(value = "14日roi")
+    private BigDecimal roi14;
+
+    /**
+     * 15日roi
+     */
+    @ApiModelProperty(value = "15日roi")
+    private BigDecimal roi15;
+
+    /**
+     * 16日roi
+     */
+    @ApiModelProperty(value = "16日roi")
+    private BigDecimal roi16;
+
+    /**
+     * 17日roi
+     */
+    @ApiModelProperty(value = "17日roi")
+    private BigDecimal roi17;
+
+    /**
+     * 18日roi
+     */
+    @ApiModelProperty(value = "18日roi")
+    private BigDecimal roi18;
+
+    /**
+     * 19日roi
+     */
+    @ApiModelProperty(value = "19日roi")
+    private BigDecimal roi19;
+
+    /**
+     * 20日roi
+     */
+    @ApiModelProperty(value = "20日roi")
+    private BigDecimal roi20;
+
+    /**
+     * 21日roi
+     */
+    @ApiModelProperty(value = "21日roi")
+    private BigDecimal roi21;
+
+    /**
+     * 22日roi
+     */
+    @ApiModelProperty(value = "22日roi")
+    private BigDecimal roi22;
+
+    /**
+     * 23日roi
+     */
+    @ApiModelProperty(value = "23日roi")
+    private BigDecimal roi23;
+
+    /**
+     * 24日roi
+     */
+    @ApiModelProperty(value = "24日roi")
+    private BigDecimal roi24;
+
+    /**
+     * 25日roi
+     */
+    @ApiModelProperty(value = "25日roi")
+    private BigDecimal roi25;
+
+    /**
+     * 26日roi
+     */
+    @ApiModelProperty(value = "26日roi")
+    private BigDecimal roi26;
+
+    /**
+     * 27日roi
+     */
+    @ApiModelProperty(value = "27日roi")
+    private BigDecimal roi27;
+
+    /**
+     * 28日roi
+     */
+    @ApiModelProperty(value = "28日roi")
+    private BigDecimal roi28;
+
+    /**
+     * 29日roi
+     */
+    @ApiModelProperty(value = "29日roi")
+    private BigDecimal roi29;
+
+    /**
+     * 30日roi
+     */
+    @ApiModelProperty(value = "30日roi")
+    private BigDecimal roi30;
+
+    /**
+     * 60日ROI
+     */
+    @ApiModelProperty(value = "60日ROI")
+    private BigDecimal roi60;
+
+    /**
+     * 90日ROI
+     */
+    @ApiModelProperty(value = "90日ROI")
+    private BigDecimal roi90;
+
+    /**
+     * 180日ROI
+     */
+    @ApiModelProperty(value = "180日ROI")
+    private BigDecimal roi180;
+
+    /**
+     * 1年ROI
+     */
+    @ApiModelProperty(value = "1年ROI")
+    private BigDecimal roi1yaer;
+
+    /**
+     * 总ROI
+     */
+    @ApiModelProperty(value = "总ROI")
+    private BigDecimal roiTotal;
+
 }

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

@@ -1,9 +1,616 @@
 package com.zanxiang.game.data.serve.pojo.vo;
 
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
 /**
  * @author tianhua
  * @time 2023/8/15
  * @Description 投手总数据实体
  **/
+@Data
 public class PitcherDataTotalVO {
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
+    /**
+     * 投手
+     */
+    @ApiModelProperty(value = "投手")
+    private String pitcher;
+
+    /**
+     * 消耗
+     */
+    @ApiModelProperty(value = "消耗")
+    private BigDecimal cost;
+
+    /**
+     * 推广计划数量
+     */
+    @ApiModelProperty(value = "推广计划数量")
+    private Long planCount;
+
+    /**
+     * 推广账号数量
+     */
+    @ApiModelProperty(value = "推广账号数量")
+    private Long accountCount;
+
+    /**
+     * 推广渠道数量
+     */
+    @ApiModelProperty(value = "推广渠道数量")
+    private Long agentCount;
+
+    /**
+     * 注册人数-通过广告首次登录小游戏的独立用户数
+     */
+    @ApiModelProperty(value = "注册人数-通过广告首次登录小游戏的独立用户数")
+    private Long registerNum;
+
+    /**
+     * 注册成本=实际消耗/注册人数
+     */
+    @ApiModelProperty(value = "注册成本=实际消耗/注册人数")
+    private BigDecimal registerCost;
+
+    /**
+     * 首日创角人数
+     */
+    @ApiModelProperty(value = "首日创角人数")
+    private Long firstRoleNum;
+
+    /**
+     * 新用户累计创角人数
+     */
+    @ApiModelProperty(value = "新用户累计创角人数")
+    private Long newUserTotalRoleNum;
+
+    /**
+     * 创角人数
+     */
+    @ApiModelProperty(value = "创角人数")
+    private Long roleNum;
+
+    /**
+     * 首日创角成本
+     */
+    @ApiModelProperty(value = "首日创角成本")
+    private BigDecimal firstRoleCost;
+
+    /**
+     * 新用户累计创角成本
+     */
+    @ApiModelProperty(value = "新用户累计创角成本")
+    private BigDecimal newUserTotalRoleCost;
+
+    /**
+     * 创角成本
+     */
+    @ApiModelProperty(value = "创角成本")
+    private BigDecimal roleNumCost;
+
+    /**
+     * 首日创角率
+     */
+    @ApiModelProperty(value = "首日创角率")
+    private BigDecimal firstRoleRate;
+
+    /**
+     * 新用户累计创角率
+     */
+    @ApiModelProperty(value = "新用户累计创角率")
+    private BigDecimal newUserTotalRoleRate;
+
+    /**
+     * 创角率
+     */
+    @ApiModelProperty(value = "创角率")
+    private BigDecimal roleNumRate;
+
+    /**
+     * 新用户充值次数
+     */
+    @ApiModelProperty(value = "新用户充值次数")
+    private Long newUserAmountCount;
+
+    /**
+     * 新用户充值人数
+     */
+    @ApiModelProperty(value = "新用户充值人数")
+    private Long newUserAmountNum;
+
+    /**
+     * 新用户充值金额
+     */
+    @ApiModelProperty(value = "新用户充值金额")
+    private BigDecimal newUserAmount;
+
+    /**
+     * 新增付费次数(首日新用户充值次数)
+     */
+    @ApiModelProperty(value = "新增付费次数")
+    private Long firstNewUserAmountCount;
+
+    /**
+     * 新增付费人数(首日新用户充值人数)
+     */
+    @ApiModelProperty(value = "新增付费人数")
+    private Long firstNewUserAmountNum;
+
+    /**
+     * 新增付费金额(首日新用户充值金额)
+     */
+    @ApiModelProperty(value = "新增付费金额")
+    private BigDecimal firstNewUserAmount;
+
+    /**
+     * 账面充值次数
+     */
+    @ApiModelProperty(value = "账面充值次数")
+    private Long amountCount;
+
+    /**
+     * 账面充值人数
+     */
+    @ApiModelProperty(value = "账面充值人数")
+    private Long amountNum;
+
+    /**
+     * 账面充值金额
+     */
+    @ApiModelProperty(value = "账面充值金额")
+    private BigDecimal amount;
+
+    /**
+     * 老用户充值次数(每日)
+     */
+    @ApiModelProperty(value = "老用户充值次数(每日)")
+    private Long oldAmountCount;
+
+    /**
+     * 老用户充值人数(每日)
+     */
+    @ApiModelProperty(value = "老用户充值人数(每日)")
+    private Long oldAmountNum;
+
+    /**
+     * 老用户充值金额(每日)
+     */
+    @ApiModelProperty(value = "老用户充值金额(每日)")
+    private BigDecimal oldAmount;
+
+    /**
+     * 至今充值次数(新用户累积充值次数)
+     */
+    @ApiModelProperty(value = "至今充值次数")
+    private Long newUserTotalAmountCount;
+
+    /**
+     * 至今充值人数(新用户累积充值人数)
+     */
+    @ApiModelProperty(value = "至今充值人数")
+    private Long newUserTotalAmountNum;
+
+    /**
+     * 至今充值金额(新用户累积充值金额)
+     */
+    @ApiModelProperty(value = "至今充值金额")
+    private BigDecimal newUserTotalAmount;
+
+    /**
+     * 单日付费100+人数
+     */
+    @ApiModelProperty(value = "单日付费100+人数")
+    private Long hundredUserNum;
+
+    /**
+     * 单日付费100+成本
+     */
+    @ApiModelProperty(value = "单日付费100+成本")
+    private BigDecimal hundredUserNumCost;
+
+    /**
+     * 买量新用户累计充值金额
+     */
+    @ApiModelProperty(value = "买量新用户累计充值金额")
+    private BigDecimal buyNewUserTotalAmount;
+
+    /**
+     * 买量新用户累计充值人数
+     */
+    @ApiModelProperty(value = "买量新用户累计充值人数")
+    private Long buyNewUserTotalAmountNum;
+
+    /**
+     * 买量新用户累计充值次数
+     */
+    @ApiModelProperty(value = "买量新用户累计充值次数")
+    private Long buyNewUserTotalAmountCount;
+
+    /**
+     * 首日回收率
+     */
+    @ApiModelProperty(value = "首日回收率")
+    private BigDecimal firstRoi;
+
+    /**
+     * 买量回收率
+     */
+    @ApiModelProperty(value = "买量回收率")
+    private BigDecimal buyRoi;
+
+    /**
+     * 当日回收率(至今回收率)
+     */
+    @ApiModelProperty(value = "当日回收率")
+    private BigDecimal todayRoi;
+
+    /**
+     * 毛利额,毛利=新用户-实际消耗
+     */
+    @ApiModelProperty(value = "毛利额,毛利=新用户-实际消耗")
+    private BigDecimal grossProfit;
+
+    /**
+     * 新用户回收率
+     */
+    @ApiModelProperty(value = "新用户回收率")
+    private BigDecimal newUserRoi;
+
+    /**
+     * 首日付费率
+     */
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal firstRate;
+
+    /**
+     * 新用户付费率
+     */
+    @ApiModelProperty(value = "新用户付费率")
+    private BigDecimal newUserAmountRate;
+
+    /**
+     * 买量用户付费率
+     */
+    @ApiModelProperty(value = "买量用户付费率")
+    private BigDecimal buyUserRate;
+
+    /**
+     * 当天付费率
+     */
+    @ApiModelProperty(value = "当天付费率")
+    private BigDecimal todayRate;
+
+    /**
+     * 新用户付费比
+     */
+    @ApiModelProperty(value = "新用户付费比")
+    private BigDecimal newUserAmountRatio;
+
+    /**
+     * 首日客单价
+     */
+    @ApiModelProperty(value = "首日客单价")
+    private BigDecimal firstAvg;
+
+    /**
+     * 新用户客单价
+     */
+    @ApiModelProperty(value = "新用户客单价")
+    private BigDecimal newUserAvg;
+
+    /**
+     * 买量客单价
+     */
+    @ApiModelProperty(value = "买量客单价")
+    private BigDecimal buyAvg;
+
+    /**
+     * 当天客单价
+     */
+    @ApiModelProperty(value = "当天客单价")
+    private BigDecimal todayAvg;
+
+    /**
+     * 账面客单价
+     */
+    @ApiModelProperty(value = "账面客单价")
+    private BigDecimal paperAvg;
+
+    /**
+     * 首日充值成本
+     */
+    @ApiModelProperty(value = "首日充值成本")
+    private BigDecimal firstAmountCost;
+
+    /**
+     * 新用户充值成本
+     */
+    @ApiModelProperty(value = "新用户充值成本")
+    private BigDecimal newUserAmountCost;
+
+    /**
+     * 买量充值成本
+     */
+    @ApiModelProperty(value = "买量充值成本")
+    private BigDecimal buyAmountCost;
+
+    /**
+     * 当天充值成本
+     */
+    @ApiModelProperty(value = "当天充值成本")
+    private BigDecimal todayAmountCost;
+
+    /**
+     * 复充人数
+     */
+    @ApiModelProperty(value = "复充人数")
+    private Long regOrderUserAgain;
+
+    /**
+     * 当天复充率
+     */
+    @ApiModelProperty(value = "当天复充率")
+    private BigDecimal todayAgainRate;
+
+    /**
+     * 新用户复充人数
+     */
+    @ApiModelProperty(value = "新用户复充人数")
+    private Long newUserOrderAgain;
+
+    /**
+     * 新用户复充率
+     */
+    @ApiModelProperty(value = "新用户复充率")
+    private BigDecimal newUserAgainRate;
+
+    /**
+     * 新增注册ARPU
+     */
+    @ApiModelProperty(value = "新增注册ARPU")
+    private BigDecimal newRegArpu;
+
+    /**
+     * 首日付费ARPU
+     */
+    @ApiModelProperty(value = "首日付费ARPU")
+    private BigDecimal firstArpu;
+
+    /**
+     * 新用户付费ARPU
+     */
+    @ApiModelProperty(value = "新用户付费ARPU")
+    private BigDecimal newUserArpu;
+
+    /**
+     * 当天付费ARPU
+     */
+    @ApiModelProperty(value = "当天付费ARPU")
+    private BigDecimal todayArpu;
+
+    /**
+     * 账面arpu
+     */
+    @ApiModelProperty(value = "账面arpu")
+    private BigDecimal paperArpu;
+
+    /**
+     * 1日roi
+     */
+    @ApiModelProperty(value = "1日roi")
+    private BigDecimal roi1;
+
+    /**
+     * 2日roi
+     */
+    @ApiModelProperty(value = "2日roi")
+    private BigDecimal roi2;
+
+    /**
+     * 3日roi
+     */
+    @ApiModelProperty(value = "3日roi")
+    private BigDecimal roi3;
+
+    /**
+     * 4日roi
+     */
+    @ApiModelProperty(value = "4日roi")
+    private BigDecimal roi4;
+
+    /**
+     * 5日roi
+     */
+    @ApiModelProperty(value = "5日roi")
+    private BigDecimal roi5;
+
+    /**
+     * 6日roi
+     */
+    @ApiModelProperty(value = "6日roi")
+    private BigDecimal roi6;
+
+    /**
+     * 7日roi
+     */
+    @ApiModelProperty(value = "7日roi")
+    private BigDecimal roi7;
+
+    /**
+     * 8日roi
+     */
+    @ApiModelProperty(value = "8日roi")
+    private BigDecimal roi8;
+
+    /**
+     * 9日roi
+     */
+    @ApiModelProperty(value = "9日roi")
+    private BigDecimal roi9;
+
+    /**
+     * 10日roi
+     */
+    @ApiModelProperty(value = "10日roi")
+    private BigDecimal roi10;
+
+    /**
+     * 11日roi
+     */
+    @ApiModelProperty(value = "11日roi")
+    private BigDecimal roi11;
+
+    /**
+     * 12日roi
+     */
+    @ApiModelProperty(value = "12日roi")
+    private BigDecimal roi12;
+
+    /**
+     * 13日roi
+     */
+    @ApiModelProperty(value = "13日roi")
+    private BigDecimal roi13;
+
+    /**
+     * 14日roi
+     */
+    @ApiModelProperty(value = "14日roi")
+    private BigDecimal roi14;
+
+    /**
+     * 15日roi
+     */
+    @ApiModelProperty(value = "15日roi")
+    private BigDecimal roi15;
+
+    /**
+     * 16日roi
+     */
+    @ApiModelProperty(value = "16日roi")
+    private BigDecimal roi16;
+
+    /**
+     * 17日roi
+     */
+    @ApiModelProperty(value = "17日roi")
+    private BigDecimal roi17;
+
+    /**
+     * 18日roi
+     */
+    @ApiModelProperty(value = "18日roi")
+    private BigDecimal roi18;
+
+    /**
+     * 19日roi
+     */
+    @ApiModelProperty(value = "19日roi")
+    private BigDecimal roi19;
+
+    /**
+     * 20日roi
+     */
+    @ApiModelProperty(value = "20日roi")
+    private BigDecimal roi20;
+
+    /**
+     * 21日roi
+     */
+    @ApiModelProperty(value = "21日roi")
+    private BigDecimal roi21;
+
+    /**
+     * 22日roi
+     */
+    @ApiModelProperty(value = "22日roi")
+    private BigDecimal roi22;
+
+    /**
+     * 23日roi
+     */
+    @ApiModelProperty(value = "23日roi")
+    private BigDecimal roi23;
+
+    /**
+     * 24日roi
+     */
+    @ApiModelProperty(value = "24日roi")
+    private BigDecimal roi24;
+
+    /**
+     * 25日roi
+     */
+    @ApiModelProperty(value = "25日roi")
+    private BigDecimal roi25;
+
+    /**
+     * 26日roi
+     */
+    @ApiModelProperty(value = "26日roi")
+    private BigDecimal roi26;
+
+    /**
+     * 27日roi
+     */
+    @ApiModelProperty(value = "27日roi")
+    private BigDecimal roi27;
+
+    /**
+     * 28日roi
+     */
+    @ApiModelProperty(value = "28日roi")
+    private BigDecimal roi28;
+
+    /**
+     * 29日roi
+     */
+    @ApiModelProperty(value = "29日roi")
+    private BigDecimal roi29;
+
+    /**
+     * 30日roi
+     */
+    @ApiModelProperty(value = "30日roi")
+    private BigDecimal roi30;
+
+    /**
+     * 60日ROI
+     */
+    @ApiModelProperty(value = "60日ROI")
+    private BigDecimal roi60;
+
+    /**
+     * 90日ROI
+     */
+    @ApiModelProperty(value = "90日ROI")
+    private BigDecimal roi90;
+
+    /**
+     * 180日ROI
+     */
+    @ApiModelProperty(value = "180日ROI")
+    private BigDecimal roi180;
+
+    /**
+     * 1年ROI
+     */
+    @ApiModelProperty(value = "1年ROI")
+    private BigDecimal roi1yaer;
+
+    /**
+     * 总ROI
+     */
+    @ApiModelProperty(value = "总ROI")
+    private BigDecimal roiTotal;
+
 }

+ 324 - 279
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -198,13 +198,6 @@ public class GameDataServiceImpl implements IGameDataService {
             dto.setRegisteredBeginDate(LocalDate.now());
             dto.setRegisteredEndDate(LocalDate.now());
         }
-        //如果没有排序条件给默认值
-        if (StringUtils.isBlank(dto.getSortFiled())) {
-            dto.setSortFiled("dt");
-        }
-        if (StringUtils.isBlank(dto.getSortType())) {
-            dto.setSortType(OrderByEnum.DESC.getOrderType());
-        }
         //根据dto拼接查询条件
         Criteria cri = Cnd.cri();
         if (StringUtils.isNotBlank(dto.getGameName())) {
@@ -227,8 +220,15 @@ public class GameDataServiceImpl implements IGameDataService {
             cri.where().andEquals("source_system", dto.getSourceSystem());
         }
         //拼接排序条件
-        cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
-
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            cri.getOrderBy().orderBy("cost_date", dto.getSortFiled());
+            cri.getOrderBy().orderBy("cost", dto.getSortFiled());
+        } else {
+            cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        }
         //编写sql语句 拼接查询条件
         Sql sql = Sqls.create(gameDataDaySql() + cri);
         //设置自定义回显对象
@@ -321,19 +321,11 @@ public class GameDataServiceImpl implements IGameDataService {
             dto.setRechargeBeginDate(LocalDate.now());
             dto.setRechargeEndDate(LocalDate.now());
         }
-        //如果没有排序条件给默认值
-        if (StringUtils.isBlank(dto.getSortFiled())) {
-            //根据游戏id
-            dto.setSortFiled("game_id");
-        }
-        if (StringUtils.isBlank(dto.getSortType())) {
-            dto.setSortType(OrderByEnum.ASC.getOrderType());
-        }
 
         //主表查询条件
-        Criteria criA = myCri(dto, "criA");
+        Criteria criA = myCri(dto, "criA", true);
         //账面相关查询条件 时间条件只和充值时间相关
-        Criteria criB = myCri(dto, "criB");
+        Criteria criB = myCri(dto, "criB", true);
         //账面人数相关 时间只需要充值时间条件,不需要注册时间条件
         Criteria criAmount = myCriRecharge(dto, false);
         //新用户充值人数和新用户复充人数 时间条件需要注册时间和充值时间
@@ -342,6 +334,13 @@ public class GameDataServiceImpl implements IGameDataService {
         Criteria criRoleNum = myCriRole(dto);
         //拼接排序条件
         Criteria orderByCri = Cnd.cri();
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled("cost");
+        }
         orderByCri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
         //创建sql语句 执行sql
         Sql sql = Sqls.create(getGameDataTotalSql(criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
@@ -539,102 +538,272 @@ public class GameDataServiceImpl implements IGameDataService {
             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());
-        }
+        //将查询条件GameDataTotalTotalDTO 复制为 GameDataTotalDTO
+        GameDataTotalDTO totalDTO = new GameDataTotalDTO();
+        copyNullProperties(dto, totalDTO);
+        //主表查询条件
+        Criteria criA = myCri(totalDTO, "criA", false);
+        //账面相关查询条件 时间条件只和充值时间相关
+        Criteria criB = myCri(totalDTO, "criB", false);
+        //账面人数相关 时间只需要充值时间条件,不需要注册时间条件
+        Criteria criAmount = myCriRecharge(totalDTO, false);
+        //新用户充值人数和新用户复充人数 时间条件需要注册时间和充值时间
+        Criteria criNewUser = myCriRecharge(totalDTO, true);
+        //创角人数查询条件
+        Criteria criRoleNum = myCriRole(totalDTO);
+        //创建sql语句 执行sql
+        Sql sql = Sqls.create(gameDataTotalTotalSql() + criA);
+        //设置自定义回显对象
+        sql.setCallback(Sqls.callback.entity());
+        sql.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
+        //执行sql
+        dao.execute(sql);
+        //得到含有部分总数据总计结果的GameDataTotalTotalVO
+        GameDataTotalTotalVO vo = sql.getObject(GameDataTotalTotalVO.class);
+        //处理账面、新用户充值人数、新用户复充人数、创角人数相关数据
+        GameDataTotalTotalVO tempVO = getGameDataTotalSumAmountData(criB, criAmount, criNewUser, criRoleNum);
+        //将两个处理的对象合并
+        copyNullProperties(tempVO, vo);
+        //得到dayN相关数据
+        getGameDataTotalTotalRechargeData(dto, vo);
 
-        Sql gameDataTotalTotalSql = Sqls.create(gameDataTotalTotalSql() + cri);
+        //返回结果
+        return vo;
+    }
+
+    /**
+     * 得到账面相关数据、账面人数、新用户人数、新用户复充人数、创角人数数据(游戏总数据总计)
+     *
+     * @return PitcherDataTotalSumVO
+     */
+    private GameDataTotalTotalVO getGameDataTotalSumAmountData(Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
+        //得到账面相关数据
+        Sql sqlAmountData = Sqls.create(gameDataTotalSumAmountSql() + criB);
         //设置回传对象
-        gameDataTotalTotalSql.setCallback(Sqls.callback.entity());
-        gameDataTotalTotalSql.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
+        sqlAmountData.setCallback(Sqls.callback.entity());
+        sqlAmountData.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
         //执行sql
-        dao.execute(gameDataTotalTotalSql);
-        //得到查询出的结果
-        GameDataTotalTotalVO vo = gameDataTotalTotalSql.getObject(GameDataTotalTotalVO.class);
+        dao.execute(sqlAmountData);
+        GameDataTotalTotalVO vo = sqlAmountData.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);
+        //账面人数数据(总量)
+        Sql sqlAmountNum = Sqls.create("""
+                SELECT
+                    IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criAmount);
         //设置回传对象
-        sqlWithRechargeDate.setCallback(Sqls.callback.entity());
-        sqlWithRechargeDate.setEntity(dao.getEntity(GameDataTotalTotalVO.class));
-        dao.execute(sqlWithRechargeDate);
-        GameDataTotalTotalVO tempVO = sqlWithRechargeDate.getObject(GameDataTotalTotalVO.class);
-
-        //设置查询参数map
-        Map<String, Object> queryMap = new HashMap<>(4);
-        queryMap.put("rechargeBeginDate", dto.getRechargeBeginDate());
-        queryMap.put("rechargeEndDate", dto.getRechargeEndDate());
-        queryMap.put("gameId", dto.getGameId());
-        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
-            queryMap.put("sourceSystem", dto.getSourceSystem());
-        }
-        //账面充值人数(总量、买量、自然量)
-        Long amountNum = getNewUserAmountNum(queryMap, "");
-        Long buyAmountNum = getNewUserAmountNum(queryMap, "buy");
-        Long natureAmountNum = getNewUserAmountNum(queryMap, "nature");
+        sqlAmountNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlAmountNum);
         //设置账面充值人数
-        tempVO.setAmountNum(amountNum);
-        tempVO.setBuyAmountNum(buyAmountNum);
-        tempVO.setNatureAmountNum(natureAmountNum);
-        //设置账面ARPU(总量、买量、自然量)
-        tempVO.setAmountArpu(amountNum == 0L ? BigDecimal.ZERO :
-                tempVO.getAmount().divide(BigDecimal.valueOf(amountNum), 2, RoundingMode.HALF_UP));
-        tempVO.setBuyAmountArpu(buyAmountNum == 0L ? BigDecimal.ZERO :
-                tempVO.getBuyAmount().divide(BigDecimal.valueOf(buyAmountNum), 2, RoundingMode.HALF_UP));
-        tempVO.setNatureAmountArpu(natureAmountNum == 0L ? BigDecimal.ZERO :
-                tempVO.getNatureAmount().divide(BigDecimal.valueOf(natureAmountNum), 2, RoundingMode.HALF_UP));
-        //将两个对象内的数据合并
-        copyNullProperties(tempVO, vo);
-        //获取新用户充值人数相关数据
-        getGameDataTotalTotalRechargeData(dto, vo);
+        vo.setAmountNum(sqlAmountNum.getLong());
+        //账面ARPU
+        vo.setAmountArpu(vo.getAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getAmount().divide(BigDecimal.valueOf(vo.getAmountNum()), 2, RoundingMode.HALF_UP));
+        //账面人数数据(买量)
+        Sql sqlBuyAmountNum = Sqls.create("""
+                SELECT
+                    IFNULL(COUNT(DISTINCT user_id), 0) buy_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criAmount +
+                """
+                 AND NOT agent_id = 0
+                """);
+        //设置回传对象
+        sqlBuyAmountNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlBuyAmountNum);
+        //设置账面充值人数
+        vo.setBuyAmountNum(sqlBuyAmountNum.getLong());
+        //账面ARPU
+        vo.setBuyAmountArpu(vo.getBuyAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getBuyAmount().divide(BigDecimal.valueOf(vo.getBuyAmountNum()), 2, RoundingMode.HALF_UP));
+        //账面人数数据(自然量)
+        Sql sqlNatureAmountNum = Sqls.create("""
+                SELECT
+                    IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criAmount +
+                """
+                 AND agent_id = 0
+                """);
+        //设置回传对象
+        sqlNatureAmountNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNatureAmountNum);
+        //设置账面充值人数
+        vo.setNatureAmountNum(sqlNatureAmountNum.getLong());
+        //账面ARPU
+        vo.setNatureAmountArpu(vo.getNatureAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getNatureAmount().divide(BigDecimal.valueOf(vo.getNatureAmountNum()), 2, RoundingMode.HALF_UP));
+
+        //新用户充值人数(总量)
+        Sql sqlNewUserNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT user_id) new_user_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criNewUser);
+        //设置回传对象
+        sqlNewUserNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNewUserNum);
+        //设置新用户充值人数
+        vo.setNewUserAmountNum(sqlNewUserNum.getLong());
+        //新用户充值人数(买量)
+        Sql sqlBuyNewUserNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT user_id) buy_new_user_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criNewUser +
+                """
+                 AND NOT agent_id = 0
+                """);
+        //设置回传对象
+        sqlBuyNewUserNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlBuyNewUserNum);
+        //设置新用户充值人数
+        vo.setBuyNewUserAmountNum(sqlBuyNewUserNum.getLong());
+        //新用户充值人数(自然量)
+        Sql sqlNatureNewUserNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT user_id) nature_new_user_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criNewUser +
+                """
+                 AND agent_id = 0
+                """);
+        //设置回传对象
+        sqlNatureNewUserNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNatureNewUserNum);
+        //设置新用户充值人数
+        vo.setNatureNewUserAmountNum(sqlNatureNewUserNum.getLong());
+
+        //新用户复充人数(总量)
+        Sql sqlNewUserAgainNum = Sqls.create("""
+                SELECT
+                    COUNT(tempA.num) as new_user_again_num
+                FROM (
+                    SELECT
+                        COUNT(user_id) num
+                    FROM
+                        game_ads.ads_information
+                """ + criNewUser +
+                """
+                GROUP BY user_id
+                HAVING
+                    COUNT(user_id) > 1 ) tempA
+                """);
+        //设置回传对象
+        sqlNewUserAgainNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNewUserAgainNum);
+        //设置新用户复充人数
+        vo.setNewUserAgainNum(sqlNewUserAgainNum.getLong());
+        //新用户复充人数(买量)
+        Sql sqlBuyNewUserAgainNum = Sqls.create("""
+                SELECT
+                    COUNT(tempA.num) as buy_new_user_again_num
+                FROM (
+                    SELECT
+                        COUNT(user_id) num
+                    FROM
+                        game_ads.ads_information
+                """ + criNewUser +
+                """
+                 AND NOT agent_id = 0
+                GROUP BY user_id
+                HAVING
+                    COUNT(user_id) > 1 ) tempA
+                """);
+        //设置回传对象
+        sqlBuyNewUserAgainNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlBuyNewUserAgainNum);
+        //设置新用户复充人数
+        vo.setBuyNewUserAgainNum(sqlBuyNewUserAgainNum.getLong());
+        //新用户复充人数(自然量)
+        Sql sqlNatureNewUserAgainNum = Sqls.create("""
+                SELECT
+                    COUNT(tempA.num) as nature_new_user_again_num
+                FROM (
+                    SELECT
+                        COUNT(user_id) num
+                    FROM
+                        game_ads.ads_information
+                """ + criNewUser +
+                """
+                 AND agent_id = 0
+                GROUP BY user_id
+                HAVING
+                    COUNT(user_id) > 1 ) tempA
+                """);
+        //设置回传对象
+        sqlNatureNewUserAgainNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNatureNewUserAgainNum);
+        //设置新用户复充人数
+        vo.setNatureNewUserAgainNum(sqlNatureNewUserAgainNum.getLong());
+
+        //创角人数(总量)
+        Sql sqlRoleNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT role_user_id) as role_num
+                FROM
+                    dw_create_role_detail
+                """ + criRoleNum);
+        //设置回传对象
+        sqlRoleNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlRoleNum);
+        //设置创角人数
+        vo.setRoleNum(sqlRoleNum.getLong());
+        //创角人数(买量)
+        Sql sqlBuyRoleNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT role_user_id) as role_num
+                FROM
+                    dw_create_role_detail
+                """ + criRoleNum +
+                """
+                 AND NOT user_agent_id = 0
+                """);
+        //设置回传对象
+        sqlBuyRoleNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlBuyRoleNum);
+        //设置创角人数
+        vo.setBuyRoleNum(sqlBuyRoleNum.getLong());
+        //创角人数(自然量)
+        Sql sqlNatureRoleNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT role_user_id) as role_num
+                FROM
+                    dw_create_role_detail
+                """ + criRoleNum +
+                """
+                 AND user_agent_id = 0
+                """);
+        //设置回传对象
+        sqlNatureRoleNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNatureRoleNum);
+        //设置创角人数
+        vo.setNatureRoleNum(sqlNatureRoleNum.getLong());
 
         return vo;
     }
 
     /**
-     * 游戏总数据总计的新用户充值人数相关值得计算方法
+     * 游戏总数据总计的新用户充值人数相关数据的计算方法
      *
      * @param dto 前端查询条件
      * @param vo  返回给前端得实体
@@ -660,12 +829,9 @@ public class GameDataServiceImpl implements IGameDataService {
         DayN dayN = getDayNByTableName(dayNMap, "ads_dayn_game");
 
         //设置买量数据
-        //新用户充值次数、金额、人数
+        //新用户充值次数、金额
         vo.setBuyNewUserAmount(buyDayN == null ? BigDecimal.ZERO : buyDayN.getRechargeMoney());
-        vo.setBuyNewUserAmountNum(getNewUserAmountNum(dayNMap, "buy"));
         vo.setBuyNewUserAmountCount(buyDayN == null ? 0L : buyDayN.getRechargeCount());
-        //新用户复充人数
-        vo.setBuyNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, "buy"));
 
         //老用户充值次数、人数、金额
         vo.setBuyOldUserAmount(vo.getBuyAmount().subtract(vo.getBuyNewUserAmount()));
@@ -702,12 +868,9 @@ public class GameDataServiceImpl implements IGameDataService {
                 vo.getCost().divide(BigDecimal.valueOf(vo.getBuyNewUserAmountNum()), 4, RoundingMode.HALF_UP));
 
         //设置自然量数据
-        //新用户充值次数、金额、人数
+        //新用户充值次数、金额
         vo.setNatureNewUserAmount(natureDayN == null ? BigDecimal.ZERO : natureDayN.getRechargeMoney());
-        vo.setNatureNewUserAmountNum(getNewUserAmountNum(dayNMap, "nature"));
         vo.setNatureNewUserAmountCount(natureDayN == null ? 0L : natureDayN.getRechargeCount());
-        //新用户复充人数
-        vo.setNatureNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, "nature"));
 
         //老用户充值次数、人数、金额
         vo.setNatureOldUserAmount(vo.getNatureAmount().subtract(vo.getNatureNewUserAmount()));
@@ -744,12 +907,9 @@ public class GameDataServiceImpl implements IGameDataService {
                 vo.getCost().divide(BigDecimal.valueOf(vo.getNatureNewUserAmountNum()), 4, RoundingMode.HALF_UP));
 
         //设置总量数据
-        //新用户充值次数、金额、人数
+        //新用户充值次数、金额
         vo.setNewUserAmount(dayN == null ? BigDecimal.ZERO : dayN.getRechargeMoney());
-        vo.setNewUserAmountNum(getNewUserAmountNum(dayNMap, ""));
         vo.setNewUserAmountCount(dayN == null ? 0L : dayN.getRechargeCount());
-        //新用户复充人数
-        vo.setNewUserAgainNum(getNewUserAmountAgainNum(dayNMap, ""));
 
         //老用户充值次数、人数、金额
         vo.setOldUserAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
@@ -785,6 +945,20 @@ public class GameDataServiceImpl implements IGameDataService {
         vo.setNewUserRechargeCost(vo.getNewUserAmountNum() == 0 ? BigDecimal.ZERO :
                 vo.getCost().divide(BigDecimal.valueOf(vo.getNewUserAmountNum()), 4, RoundingMode.HALF_UP));
 
+        //创角率
+        vo.setRoleNumRate(vo.getRegNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getRoleNum().doubleValue() / vo.getRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        vo.setBuyRoleNumRate(vo.getBuyRegNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getBuyRoleNum().doubleValue() / vo.getBuyRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        vo.setNatureRoleNumRate(vo.getNatureRegNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getNatureRoleNum().doubleValue() / vo.getNatureRegNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        //创角成本
+        vo.setRoleNumCost(vo.getRoleNum() == 0L ? BigDecimal.ZERO :
+                vo.getCost().divide(BigDecimal.valueOf(vo.getRoleNum()), 4, RoundingMode.HALF_UP));
+        vo.setBuyRoleNumCost(vo.getBuyRoleNum() == 0L ? BigDecimal.ZERO :
+                vo.getCost().divide(BigDecimal.valueOf(vo.getBuyRoleNum()), 4, RoundingMode.HALF_UP));
+        vo.setNatureRoleNumCost(vo.getNatureRoleNum() == 0L ? BigDecimal.ZERO :
+                vo.getCost().divide(BigDecimal.valueOf(vo.getNatureRoleNum()), 4, RoundingMode.HALF_UP));
     }
 
     /**
@@ -1163,9 +1337,10 @@ public class GameDataServiceImpl implements IGameDataService {
      *
      * @param dto  前端传递的查询条件
      * @param type criA 查询主表  criB 查询账面相关
+     * @param needGroupBy 是否需要分组条件
      * @return 查询条件
      */
-    private Criteria myCri(GameDataTotalDTO dto, String type) {
+    private Criteria myCri(GameDataTotalDTO dto, String type, Boolean needGroupBy) {
         //根据传入的dto拼接查询参数
         Criteria cri = Cnd.cri();
         if (StringUtils.isNotBlank(dto.getGameName())) {
@@ -1196,8 +1371,10 @@ public class GameDataServiceImpl implements IGameDataService {
                 cri.where().andBetween("dt", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
             }
         }
-        //拼接分组条件
-        cri.getGroupBy().groupBy("game_name", "game_id", "game_classify");
+        if (needGroupBy) {
+            //拼接分组条件
+            cri.getGroupBy().groupBy("game_name", "game_id", "game_classify");
+        }
 
         return cri;
     }
@@ -1395,104 +1572,6 @@ public class GameDataServiceImpl implements IGameDataService {
         return dayN;
     }
 
-    /**
-     * 获取新用户充值人数方法
-     *
-     * @param dayNMap 参数Map
-     * @param type    查询的字段类型:buy、nature、总
-     * @return 新用户充值人数
-     */
-    private Long getNewUserAmountNum(Map<String, Object> dayNMap, String type) {
-        //查询新用户充值人数
-        Criteria cri = Cnd.cri();
-        if (dayNMap.get("registerBeginDate") != null && dayNMap.get("registerEndDate") != null) {
-            //拼接注册时间查询条件
-            cri.where().andBetween("reg_time", dayNMap.get("registerBeginDate"), dayNMap.get("registerEndDate"));
-        }
-        if (dayNMap.get("gameId") != null) {
-            //拼接游戏ID查询条件
-            cri.where().andEquals("game_id", dayNMap.get("gameId"));
-        }
-        if (dayNMap.get("sourceSystem") != null) {
-            //拼接SDK来源查询条件
-            cri.where().andEquals("source_system", dayNMap.get("sourceSystem"));
-        }
-        if (dayNMap.get("rechargeBeginDate") != null && dayNMap.get("rechargeEndDate") != null) {
-            //拼接充值时间查询条件
-            cri.where().andBetween("order_time", dayNMap.get("rechargeBeginDate"), dayNMap.get("rechargeEndDate"));
-        }
-        //拼接渠道id条件 取出自然量、买量、总量值
-        if (type.equals("buy")) {
-            cri.where().andNotEquals("agent_id", 0);
-        } else if (type.equals("nature")) {
-            cri.where().andEquals("agent_id", 0);
-        }
-        Sql newUserAmountNumSql = Sqls.create("""
-                    SELECT
-                        COUNT(DISTINCT user_id) num
-                    FROM
-                        game_ads.ads_information
-                """ + cri);
-        newUserAmountNumSql.setCallback(Sqls.callback.longValue());
-        //执行sql
-        dao.execute(newUserAmountNumSql);
-        //得到结果 新用户充值人数
-        return newUserAmountNumSql.getLong();
-    }
-
-    /**
-     * 获取新用户复充人数方法
-     *
-     * @param dayNMap 参数列表
-     * @param type    查询字段类型: buy、nature、总量
-     * @return 新用户复充人数
-     */
-    private Long getNewUserAmountAgainNum(Map<String, Object> dayNMap, String type) {
-        //查询新用户充值人数
-        Criteria cri = Cnd.cri();
-        if (dayNMap.get("registerBeginDate") != null && dayNMap.get("registerEndDate") != null) {
-            //拼接注册时间查询条件
-            cri.where().andBetween("reg_time", dayNMap.get("registerBeginDate"), dayNMap.get("registerEndDate"));
-        }
-        if (dayNMap.get("gameId") != null) {
-            //拼接游戏ID查询条件
-            cri.where().andEquals("game_id", dayNMap.get("gameId"));
-        }
-        if (dayNMap.get("sourceSystem") != null) {
-            //拼接SDK来源查询条件
-            cri.where().andEquals("source_system", dayNMap.get("sourceSystem"));
-        }
-        if (dayNMap.get("rechargeBeginDate") != null && dayNMap.get("rechargeEndDate") != null) {
-            //拼接充值时间查询条件
-            cri.where().andBetween("order_time", dayNMap.get("rechargeBeginDate"), dayNMap.get("rechargeEndDate"));
-        }
-        //拼接渠道id条件 取出自然量、买量、总量值
-        if (type.equals("buy")) {
-            cri.where().andNotEquals("agent_id", 0);
-        } else if (type.equals("nature")) {
-            cri.where().andEquals("agent_id", 0);
-        }
-        Sql newUserAmountAgainNumSql = Sqls.create("""
-                    SELECT
-                        COUNT(a.num)
-                    FROM(
-                        SELECT
-                        	COUNT(user_id) num
-                        FROM
-                        	game_ads.ads_information
-                """ + cri +
-                """
-                           GROUP BY user_id
-                           HAVING COUNT(user_id) > 1
-                           ) a;
-                        """);
-        newUserAmountAgainNumSql.setCallback(Sqls.callback.longValue());
-        //执行sql
-        dao.execute(newUserAmountAgainNumSql);
-        //得到结果 新用户充值人数
-        return newUserAmountAgainNumSql.getLong();
-    }
-
     /**
      * 通过反射来获取Cn的值
      *
@@ -1502,18 +1581,17 @@ public class GameDataServiceImpl implements IGameDataService {
      */
     private Long getCnByNum(Object vo, int num) {
         try {
-
-            Field f = null;
-            if (vo instanceof AdsGameDayAgain) {
-                f = AdsGameDayAgain.class.getDeclaredField(String.format("c%s", num));
-            } else if (vo instanceof AdsGameDayAgainBuy) {
-                f = AdsGameDayAgainBuy.class.getDeclaredField(String.format("buyC%s", num));
-            } else if (vo instanceof AdsGameDayAgainNature) {
-                f = AdsGameDayAgainNature.class.getDeclaredField(String.format("natureC%s", num));
-            }
-            f.setAccessible(true);
-            //返回对应的Cn值
-            return (Long) f.get(vo);
+                Field f = null;
+                if (vo instanceof AdsGameDayAgain) {
+                    f = AdsGameDayAgain.class.getDeclaredField(String.format("c%s", num));
+                } else if (vo instanceof AdsGameDayAgainBuy) {
+                    f = AdsGameDayAgainBuy.class.getDeclaredField(String.format("buyC%s", num));
+                } else if (vo instanceof AdsGameDayAgainNature) {
+                    f = AdsGameDayAgainNature.class.getDeclaredField(String.format("natureC%s", num));
+                }
+                f.setAccessible(true);
+                //返回对应的Cn值
+                return (Long) f.get(vo);
         } catch (Exception e) {
             throw new BaseException("get方法出错,映射出错");
         }
@@ -1522,7 +1600,6 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 通过反射赋值每日趋势
      *
-     * @param vo
      */
     private void formatDayN(GameDataDayVO vo) {
         if (CollectionUtils.isEmpty(dayNFieldMapList)) {
@@ -1547,7 +1624,6 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 通过反射赋值每日总计趋势
      *
-     * @param vo
      */
     private void formatDayNTotal(GameDataDayTotalVO vo) {
         if (CollectionUtils.isEmpty(dayNTotalFieldMapList)) {
@@ -1586,7 +1662,6 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 通过反射赋值游戏首日复充数据
      *
-     * @param vo
      */
     private void formatFirstNewUserAgain(GameDataFirstNewUserAgainVO vo, Long[] usersId) {
         if (CollectionUtils.isEmpty(firstNewUserAgainFieldMapList)) {
@@ -1613,7 +1688,6 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 通过反射赋值游戏首日复充总计数据
      *
-     * @param vo
      */
     private void formatFirstNewUserAgainTotal(GameDataFirstNewUserAgainTotalVO vo, Long[] usersIdTotal) {
         if (CollectionUtils.isEmpty(firstNewUserAgainTotalFieldMapList)) {
@@ -2687,7 +2761,6 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
@@ -2697,7 +2770,6 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
@@ -2707,7 +2779,6 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
@@ -2717,96 +2788,71 @@ public class GameDataServiceImpl implements IGameDataService {
                     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,
-                    
-                    SUM(buy_hundred_user_num) buy_hundred_user_num,
+                    IFNULL(SUM(buy_hundred_user_num), 0) 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,
+                    IFNULL(SUM(buy_first_role_num), 0) buy_first_role_num,
+                    IFNULL(SUM(buy_new_user_total_role_num), 0) 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,
+                    IFNULL(SUM(nature_hundred_user_num), 0) 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,
+                    IFNULL(SUM(nature_first_role_num), 0) nature_first_role_num,
+                    IFNULL(SUM(nature_new_user_total_role_num), 0) 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,
+                    IFNULL(SUM(hundred_user_num), 0) 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,
+                    IFNULL(SUM(first_role_num), 0) first_role_num,
+                    IFNULL(SUM(new_user_total_role_num), 0) 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
                     game_ads.ads_game_day
                 """;
     }
 
     /**
-     * 和充值时间有关的sql
+     * 和充值时间有关的sql(游戏总数据总计账面相关数据)
      *
-     * @return
+     * @return String
      */
-    private String gameDataTotalSqlRecharge() {
+    private String gameDataTotalSumAmountSql() {
         return """
                 SELECT
                     IFNULL(sum(buy_amount_count),0) buy_amount_count,
@@ -2815,13 +2861,11 @@ public class GameDataServiceImpl implements IGameDataService {
                     IFNULL(sum(nature_amount),0) nature_amount,
                     IFNULL(sum(amount_count),0) amount_count,
                     IFNULL(sum(amount),0) amount,
-                    
                     round(if(sum(buy_amount_count) > 0, sum(buy_amount) / sum(buy_amount_count), 0), 2) buy_avg_amount,
                     round(if(sum(nature_amount_count) > 0, sum(nature_amount) / sum(nature_amount_count), 0), 2) nature_avg_amount,
                     round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 2) avg_amount
                 FROM
                     game_ads.ads_game_day
-                                
                 """;
     }
 
@@ -3184,8 +3228,8 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 游戏首日复充
      *
-     * @param dto
-     * @return
+     * @param dto GameDataFirstNewUserAgainDTO
+     * @return Page<GameDataFirstNewUserAgainVO>
      */
     @Override
     public Page<GameDataFirstNewUserAgainVO> getFirstNewUserAgain(GameDataFirstNewUserAgainDTO dto) {
@@ -3267,8 +3311,8 @@ public class GameDataServiceImpl implements IGameDataService {
     /**
      * 游戏首日复充总计
      *
-     * @param dto
-     * @return
+     * @param dto GameDataFirstNewUserAgainTotalDTO
+     * @return GameDataFirstNewUserAgainTotalVO
      */
     @Override
     public GameDataFirstNewUserAgainTotalVO getFirstNewUserAgainTotal(GameDataFirstNewUserAgainTotalDTO dto) {
@@ -5857,4 +5901,5 @@ public class GameDataServiceImpl implements IGameDataService {
 
         private Long h5BuyAmountNum;
     }
+
 }

+ 800 - 22
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PitcherDataServiceImpl.java

@@ -5,6 +5,7 @@ import com.google.gson.Gson;
 import com.zanxiang.game.data.serve.pojo.dto.*;
 import com.zanxiang.game.data.serve.pojo.entity.AdsGamePitcherDay;
 import com.zanxiang.game.data.serve.pojo.entity.AdsPitcherDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsPitcherDayn;
 import com.zanxiang.game.data.serve.pojo.entity.AdsPitcherGameDayn;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.pojo.vo.*;
@@ -291,7 +292,86 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
      */
     @Override
     public Page<PitcherDataTotalVO> getPitcherDataTotal(PitcherDataTotalDTO dto) {
-        return null;
+        //如果注册时间参数为空,默认设置查询当天数据
+        if (dto.getBeginDate() == null || dto.getEndDate() == null) {
+            dto.setBeginDate(LocalDate.now());
+            dto.setEndDate(LocalDate.now());
+        }
+        //如果充值时间参数为空,默认设置查询当天数据
+        if (dto.getAmountBeginDate() == null || dto.getAmountEndDate() == null) {
+            dto.setAmountBeginDate(LocalDate.now());
+            dto.setAmountEndDate(LocalDate.now());
+        }
+        //主表查询条件
+        Criteria criA = myCriPitcher(dto, "criA", true);
+        //账面相关查询条件 时间条件只和充值时间相关
+        Criteria criB = myCriPitcher(dto, "criB", true);
+        //账面人数相关 时间只需要充值时间条件,不需要注册时间条件
+        Criteria criAmount = myCriRechargePitcher(dto, false);
+        //新用户充值人数和新用户复充人数 时间条件需要注册时间和充值时间
+        Criteria criNewUser = myCriRechargePitcher(dto, true);
+        //创角人数查询条件
+        Criteria criRoleNum = myCriRolePitcher(dto);
+        //拼接排序条件
+        Criteria orderByCri = Cnd.cri();
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            orderByCri.getOrderBy().orderBy("pitcher_id", dto.getSortType());
+            orderByCri.getOrderBy().orderBy("cost", dto.getSortType());
+        } else {
+            orderByCri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        }
+        //创建sql语句 执行sql
+        Sql sql = Sqls.create(pitcherDataTotalSql(criA, criB, criAmount, criNewUser, criRoleNum) + orderByCri);
+        //设置自定义回显对象
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(PitcherDataTotalVO.class));
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        sql.setPager(pager);
+        //执行sql
+        dao.execute(sql);
+        //得到结果集list
+        List<PitcherDataTotalVO> list = sql.getList(PitcherDataTotalVO.class);
+        //设置查询总数
+        Sql sqlCount = Sqls.queryEntity("select count(*) from game_ads.ads_pitcher_day" + criA);
+        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
+
+        //获取所有筛选条件内的dayN数据
+        Map<String, String> pitcherDataTotalDayNMap = tempDayNDataPitcher(dto);
+        //根据充值时间修改值
+        List<PitcherDataTotalVO> pitcherDataTotalVOList = list.stream().map(vo -> {
+            //取到dayN数据
+            String dayNStr = pitcherDataTotalDayNMap.get(vo.getPitcherId().toString());
+            //如果为空或不存在
+            if (StringUtils.isBlank(dayNStr)) {
+                dayNStr = "0.00-0";
+            }
+            //新用户充值金额
+            vo.setNewUserAmount(new BigDecimal(dayNStr.split("-")[0]));
+            //新用户充值次数
+            vo.setNewUserAmountCount(Long.parseLong(dayNStr.split("-")[1]));
+            //老用户充值人数、次数、金额
+            vo.setOldAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
+            vo.setOldAmountCount(vo.getAmountCount() - vo.getNewUserAmountCount());
+            vo.setOldAmountNum(vo.getAmountNum() - vo.getNewUserAmountNum());
+            //新用户回收率
+            vo.setNewUserRoi(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                    vo.getNewUserAmount().divide(vo.getCost(), 4, RoundingMode.HALF_UP));
+            //新用户客单价
+            vo.setNewUserAvg(vo.getNewUserAmountCount() == 0L ? BigDecimal.ZERO :
+                    vo.getNewUserAmount().divide(BigDecimal.valueOf(vo.getNewUserAmountCount()), 4, RoundingMode.HALF_UP));
+            //新用户ARPU
+            vo.setNewUserArpu(vo.getNewUserAmountNum() == 0L ? BigDecimal.ZERO :
+                    vo.getNewUserAmount().divide(BigDecimal.valueOf(vo.getNewUserAmountNum()), 4, RoundingMode.HALF_UP));
+
+            return vo;
+        }).collect(Collectors.toList());
+
+        //返回list结果封装到page对象里
+        return new Page<>(pitcherDataTotalVOList, pager);
     }
 
     /**
@@ -301,7 +381,85 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
      */
     @Override
     public PitcherDataTotalSumVO getPitcherDataTotalSum(PitcherDataTotalSumDTO dto) {
-        return null;
+        //如果注册时间参数为空,默认设置查询当天数据
+        if (dto.getBeginDate() == null || dto.getEndDate() == null) {
+            dto.setBeginDate(LocalDate.now());
+            dto.setEndDate(LocalDate.now());
+        }
+        //如果充值时间参数为空,默认设置查询当天数据
+        if (dto.getAmountBeginDate() == null || dto.getAmountEndDate() == null) {
+            dto.setAmountBeginDate(LocalDate.now());
+            dto.setAmountEndDate(LocalDate.now());
+        }
+        //复制PitcherDataTotalSumDTO 到PitcherDataTotalDTO
+        PitcherDataTotalDTO totalDTO = new PitcherDataTotalDTO();
+        copyNullProperties(dto, totalDTO);
+        //主表查询条件
+        Criteria criA = myCriPitcher(totalDTO, "criA", false);
+        //账面相关查询条件 时间条件只和充值时间相关
+        Criteria criB = myCriPitcher(totalDTO, "criB", false);
+        //账面人数相关 时间只需要充值时间条件,不需要注册时间条件
+        Criteria criAmount = myCriRechargePitcher(totalDTO, false);
+        //新用户充值人数和新用户复充人数 时间条件需要注册时间和充值时间
+        Criteria criNewUser = myCriRechargePitcher(totalDTO, true);
+        //创角人数查询条件
+        Criteria criRoleNum = myCriRolePitcher(totalDTO);
+        //创建sql语句 执行sql
+        Sql sql = Sqls.create(pitcherDataTotalSumSql() + criA);
+        //设置自定义回显对象
+        sql.setCallback(Sqls.callback.entity());
+        sql.setEntity(dao.getEntity(PitcherDataTotalSumVO.class));
+        //执行sql
+        dao.execute(sql);
+        //得到结果
+        PitcherDataTotalSumVO vo = sql.getObject(PitcherDataTotalSumVO.class);
+        //得到账面相关数据、账面人数、新用户人数、新用户复充人数、创角人数数据
+        PitcherDataTotalSumVO tempVO = getPitcherDataTotalSumAmountData(criB, criAmount, criNewUser, criRoleNum);
+        //合并两个对象
+        copyNullProperties(tempVO, vo);
+
+        //计算相关指标
+        //新用户充值成本
+        vo.setNewUserAmountCost(vo.getNewUserAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getCost().divide(BigDecimal.valueOf(vo.getNewUserAmountNum()), 2, RoundingMode.HALF_UP));
+        //新用户付费率
+        vo.setNewUserAmountRate(vo.getRegisterNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getRegisterNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        //新用户付费比
+        vo.setNewUserAmountRatio(vo.getAmountNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getNewUserAmountNum().doubleValue() / vo.getAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        //新用户复充率
+        vo.setNewUserAgainRate(vo.getNewUserTotalAmountNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getNewUserOrderAgain().doubleValue() / vo.getNewUserTotalAmountNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        //创角率
+        vo.setRoleNumRate(vo.getRegisterNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getRoleNum().doubleValue() / vo.getRegisterNum().doubleValue()).setScale(4, RoundingMode.HALF_UP));
+        //创角成本
+        vo.setRoleNumCost(vo.getRoleNum() == 0L ? BigDecimal.ZERO :
+                vo.getCost().divide(BigDecimal.valueOf(vo.getRoleNum()), 2, RoundingMode.HALF_UP));
+
+        //获取所有筛选条件内的dayN数据
+        String dayNStr = tempDayNDataTotalPitcher(totalDTO);
+        //新用户充值金额
+        vo.setNewUserAmount(new BigDecimal(dayNStr.split("-")[0]));
+        //新用户充值次数
+        vo.setNewUserAmountCount(Long.parseLong(dayNStr.split("-")[1]));
+        //老用户充值人数、次数、金额
+        vo.setOldAmount(vo.getAmount().subtract(vo.getNewUserAmount()));
+        vo.setOldAmountCount(vo.getAmountCount() - vo.getNewUserAmountCount());
+        vo.setOldAmountNum(vo.getAmountNum() - vo.getNewUserAmountNum());
+        //新用户回收率
+        vo.setNewUserRoi(vo.getCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                vo.getNewUserAmount().divide(vo.getCost(), 4, RoundingMode.HALF_UP));
+        //新用户客单价
+        vo.setNewUserAvg(vo.getNewUserAmountCount() == 0L ? BigDecimal.ZERO :
+                vo.getNewUserAmount().divide(BigDecimal.valueOf(vo.getNewUserAmountCount()), 4, RoundingMode.HALF_UP));
+        //新用户ARPU
+        vo.setNewUserArpu(vo.getNewUserAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getNewUserAmount().divide(BigDecimal.valueOf(vo.getNewUserAmountNum()), 4, RoundingMode.HALF_UP));
+
+        //结果
+        return vo;
     }
 
     /**
@@ -602,7 +760,109 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 得到账面相关数据、账面人数、新用户人数、新用户复充人数、创角人数数据
+     * 得到账面相关数据、账面人数、新用户人数、新用户复充人数、创角人数数据(投手总数据总计)
+     * @param criAmount 账面数据相关查询条件
+     * @return PitcherDataTotalSumVO
+     */
+    private PitcherDataTotalSumVO getPitcherDataTotalSumAmountData(Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
+        //得到账面相关数据
+        Sql sqlAmountData = Sqls.create("""
+                SELECT
+                    IFNULL(SUM(amount), 0) as amount,
+                    IFNULL(SUM(amount_count), 0) as amount_count,
+                    ROUND(IF(SUM(amount_count) > 0 , SUM(amount) / SUM(amount_count), 0), 2) as paper_avg
+                FROM
+                    game_ads.ads_pitcher_day
+                """ + criB);
+        //设置回传对象
+        sqlAmountData.setCallback(Sqls.callback.entity());
+        sqlAmountData.setEntity(dao.getEntity(PitcherDataTotalSumVO.class));
+        //执行sql
+        dao.execute(sqlAmountData);
+        PitcherDataTotalSumVO vo = sqlAmountData.getObject(PitcherDataTotalSumVO.class);
+
+        //账面人数数据
+        Sql sqlAmountNum = Sqls.create("""
+                SELECT
+                    IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criAmount +
+                """
+                AND NOT agent_id = 0
+                """);
+        //设置回传对象
+        sqlAmountNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlAmountNum);
+        //设置账面充值人数
+        vo.setAmountNum(sqlAmountNum.getLong());
+        //账面ARPU
+        vo.setPaperArpu(vo.getAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getAmount().divide(BigDecimal.valueOf(vo.getAmountNum()), 2, RoundingMode.HALF_UP));
+
+        //新用户充值人数
+        Sql sqlNewUserNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT user_id) new_user_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criNewUser +
+                """
+                AND NOT agent_id = 0
+                """);
+        //设置回传对象
+        sqlNewUserNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNewUserNum);
+        //设置新用户充值人数
+        vo.setNewUserAmountNum(sqlNewUserNum.getLong());
+
+        //新用户复充人数
+        Sql sqlNewUserAgainNum = Sqls.create("""
+                SELECT
+                    COUNT(tempA.num) as new_user_order_again
+                FROM (
+                    SELECT
+                        COUNT(user_id) num
+                    FROM
+                        game_ads.ads_information
+                    """ + criNewUser +
+                """
+                AND NOT agent_id = 0
+                GROUP BY user_id
+                HAVING
+                    COUNT(user_id) > 1 ) tempA
+            """);
+        //设置回传对象
+        sqlNewUserAgainNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlNewUserAgainNum);
+        //设置新用户充值人数
+        vo.setNewUserOrderAgain(sqlNewUserAgainNum.getLong());
+
+        //创角人数
+        Sql sqlRoleNum = Sqls.create("""
+                SELECT
+                    COUNT(DISTINCT role_user_id) as role_num
+                FROM
+                    dw_create_role_detail
+                """ + criRoleNum +
+                """
+                AND NOT user_agent_id = 0
+                """);
+        //设置回传对象
+        sqlRoleNum.setCallback(Sqls.callback.longValue());
+        //执行sql
+        dao.execute(sqlRoleNum);
+        //设置创角人数
+        vo.setRoleNum(sqlRoleNum.getLong());
+
+        return vo;
+    }
+
+    /**
+     * 得到账面相关数据、账面人数、新用户人数、新用户复充人数、创角人数数据(投手游戏总数据总计)
      * @param criAmount 账面数据相关查询条件
      * @return PitcherGameDataTotalSumVO
      */
@@ -738,7 +998,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 主表 账面相关 查询条件
+     * 主表 账面相关 查询条件(投手游戏数据相关)
      *
      * @param dto  前端传递的查询条件
      * @param type criA 查询主表  criB 查询账面相关
@@ -789,7 +1049,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 账面充值人数、新用户充值人数、新用户复充人数的查询条件
+     * 账面充值人数、新用户充值人数、新用户复充人数的查询条件(投手游戏数据相关)
      *
      * @param dto         前端传递的查询条件参数实体
      * @param needRegTime 是否需要拼接注册时间
@@ -832,7 +1092,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 创角人数相关查询条件
+     * 创角人数相关查询条件(投手游戏数据相关)
      *
      * @param dto 前端传递的查询条件
      * @return 查询条件
@@ -873,7 +1133,161 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 生成DayN数据方法
+     * 主表 账面相关 查询条件(投手数据相关)
+     *
+     * @param dto  前端传递的查询条件
+     * @param type criA 查询主表  criB 查询账面相关
+     * @param needGroupBy 是否需要分组条件
+     * @return 查询条件
+     */
+    private Criteria myCriPitcher(PitcherDataTotalDTO dto, String type, Boolean needGroupBy) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getPitcherId() != null) {
+            //拼接投手ID
+            cri.where().andEquals("pitcher_id", dto.getPitcherId());
+        }
+        //根据type拼接不同的时间查询条件
+        if (type.equals("criA")) {
+            if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+                //拼接注册日期查询条件
+                cri.where().andBetween("dt", dto.getBeginDate(), dto.getEndDate());
+            }
+        } else if (type.equals("criB")) {
+            if (dto.getAmountBeginDate() != null && dto.getAmountEndDate() != null) {
+                //拼接充值日期查询条件
+                cri.where().andBetween("dt", dto.getAmountBeginDate(), dto.getAmountEndDate());
+            }
+        }
+        //拼接分组条件
+        if (needGroupBy) {
+            cri.getGroupBy().groupBy("pitcher_id");
+        }
+
+        return cri;
+    }
+
+    /**
+     * 账面充值人数、新用户充值人数、新用户复充人数的查询条件(投手数据相关)
+     *
+     * @param dto         前端传递的查询条件参数实体
+     * @param needRegTime 是否需要拼接注册时间
+     * @return 查询条件
+     */
+    private Criteria myCriRechargePitcher(PitcherDataTotalDTO dto, Boolean needRegTime) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getPitcherId() != null) {
+            //拼接投手ID
+            cri.where().andEquals("pitcher_id", dto.getPitcherId());
+        }
+        //拼接不同的时间查询条件
+        if (needRegTime && dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //拼接注册日期查询条件
+            cri.where().andBetween("reg_time", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (dto.getAmountBeginDate() != null && dto.getAmountEndDate() != null) {
+            //拼接充值日期查询条件
+            cri.where().andBetween("order_time", dto.getAmountBeginDate(), dto.getAmountEndDate());
+        }
+
+        return cri;
+    }
+
+    /**
+     * 创角人数相关查询条件(投手数据相关)
+     *
+     * @param dto 前端传递的查询条件
+     * @return 查询条件
+     */
+    private Criteria myCriRolePitcher(PitcherDataTotalDTO dto) {
+        //根据传入的dto拼接查询参数
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getPitcherId() != null) {
+            //拼接投手ID
+            cri.where().andEquals("user_zx_pitcher_id", dto.getPitcherId());
+        }
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //拼接注册日期查询条件
+            cri.where().andBetween("user_dt", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (dto.getAmountBeginDate() != null && dto.getAmountEndDate() != null) {
+            //拼接充值日期查询条件 在充值时间内创角
+            cri.where().andBetween("DATE(role_create_time)", dto.getAmountBeginDate(), dto.getAmountEndDate());
+        }
+
+        return cri;
+    }
+
+    /**
+     * 生成DayN数据方法(投手总数据)
+     *
+     * @param dto       前端查询参数
+     * @return Map
+     */
+    private Map<String, String> tempDayNDataPitcher(PitcherDataTotalDTO dto) {
+
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //拼接注册时间查询条件
+            cri.where().andBetween("dt", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源查询条件
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getPitcherId() != null) {
+            cri.where().andEquals("pitcher_id", dto.getPitcherId());
+        }
+        Sql dayNSql = Sqls.create("""
+                SELECT
+                    dt,
+                    pitcher_id,
+                    source_system,
+                    dayN
+                FROM
+                    game_ads.ads_pitcher_dayn
+                """ + cri);
+
+        //设置回传
+        dayNSql.setCallback(Sqls.callback.entities());
+        dayNSql.setEntity(dao.getEntity(AdsPitcherDayn.class));
+        //执行sql 获取数据到list中
+        dao.execute(dayNSql);
+
+        //将数据库中获取的所有结果封装到一个List中
+        List<AdsPitcherDayn> list = dayNSql.getList(AdsPitcherDayn.class);
+        // pitcherId - dayN(充值金额-充值次数)
+        Map<String, String> tempMap = new HashMap<>();
+
+        //循环遍历 list 按照 gameId 进行存储
+        for (AdsPitcherDayn adsPitcherDayn : list) {
+            if (!tempMap.containsKey(adsPitcherDayn.getPitcherId())) {
+                //Map中没有该投手的相关数据,初始化tempMap
+                tempMap.put(adsPitcherDayn.getPitcherId(), "0.00-0");
+            }
+            //解析每个 adsPitcherGameDayn 的 dayN
+            parseJsonDataPitcher(adsPitcherDayn, tempMap, dto);
+        }
+
+        return tempMap;
+    }
+
+    /**
+     * 生成DayN数据方法(投手游戏总数据)
      *
      * @param dto       前端查询参数
      * @return Map
@@ -943,7 +1357,58 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 计算所有的dayN
+     * 计算所有的dayN(投手总数据总计)
+     *
+     * @param dto       前端查询参数
+     * @return Map
+     */
+    private String tempDayNDataTotalPitcher(PitcherDataTotalDTO dto) {
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //拼接注册时间查询条件
+            cri.where().andBetween("dt", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            //拼接SDK来源查询条件
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getPitcherId() != null) {
+            cri.where().andEquals("pitcher_id", dto.getPitcherId());
+        }
+        Sql dayNSql = Sqls.create("""
+                SELECT
+                    dt,
+                    pitcher_id,
+                    source_system,
+                    dayN
+                FROM
+                    game_ads.ads_pitcher_dayn
+                """ + cri);
+
+        //设置回传
+        dayNSql.setCallback(Sqls.callback.entities());
+        dayNSql.setEntity(dao.getEntity(AdsPitcherDayn.class));
+        //执行sql 获取数据到list中
+        dao.execute(dayNSql);
+
+        //将数据库中获取的所有结果封装到一个List中
+        List<AdsPitcherDayn> list = dayNSql.getList(AdsPitcherDayn.class);
+        //初始化dayN结果
+        Map<String, String> resMap = new HashMap<>();
+        resMap.put("dayN", "0.00-0");
+
+        //循环遍历 list 按照 gameId 进行存储
+        for (AdsPitcherDayn adsPitcherDayn : list) {
+            //解析每个 adsPitcherGameDayn 的 dayN
+            parseJsonDataPitcher(adsPitcherDayn, resMap, dto);
+        }
+        //返回结果
+        return resMap.get("dayN");
+    }
+
+    /**
+     * 计算所有的dayN(投手游戏总数据总计)
      *
      * @param dto       前端查询参数
      * @return Map
@@ -994,12 +1459,55 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
             //解析每个 adsPitcherGameDayn 的 dayN
             parseJsonData(adsPitcherGameDayn, resMap, dto);
         }
-        //返回结果
-        return resMap.get("dayN");
+        //返回结果
+        return resMap.get("dayN");
+    }
+
+    /**
+     * 解析dayN json字符串数据(投手总数据)
+     *
+     * @param adsPitcherDayn 对象
+     * @param resMap      记录最终结果Map
+     * @param dto         前端查询条件
+     */
+    private void parseJsonDataPitcher(AdsPitcherDayn adsPitcherDayn, Map<String, String> resMap, PitcherDataTotalDTO dto) {
+        //将每一个adsDaynGame中的dayN属性值 由json转为 Map 型
+        Gson gson = new Gson();
+        Map<String, String> jsonList = gson.fromJson(adsPitcherDayn.getDayn(), Map.class);
+        //解析 jsonList
+        for (Map.Entry<String, String> entry : jsonList.entrySet()) {
+            //key是充值日期
+            String key = entry.getKey();
+            String value = entry.getValue();
+            //将value按“-”分割
+            String[] resValues = value.split("-");
+            //判断充值日期 在充值日期内的数据进行计算
+            if (DateUtil.parseLocalDate(key).compareTo(dto.getAmountBeginDate()) >= 0
+                    && DateUtil.parseLocalDate(key).compareTo(dto.getAmountEndDate()) <= 0) {
+                //获取原先的dayN的值
+                String[] oldValues;
+                if (resMap.containsKey("dayN")) {
+                    oldValues = resMap.get("dayN").split("-");
+                } else {
+                    oldValues = resMap.get(adsPitcherDayn.getPitcherId()).split("-");
+                }
+                //充值的金额
+                BigDecimal chargeMoney = new BigDecimal(oldValues[0]).add(new BigDecimal(resValues[0])).setScale(2, RoundingMode.HALF_UP);
+                //充值的次数
+                long count = Long.parseLong(oldValues[1]) + Long.parseLong(resValues[1]);
+                //合并成字符串 更新dayN的值
+                String newValue = chargeMoney + "-" + count;
+                if (resMap.containsKey("dayN")) {
+                    resMap.put("dayN", newValue);
+                } else {
+                    resMap.put(adsPitcherDayn.getPitcherId(), newValue);
+                }
+            }
+        }
     }
 
     /**
-     * 解析dayN json字符串数据
+     * 解析dayN json字符串数据(投手游戏总数据)
      *
      * @param adsPitcherGameDayn 对象
      * @param resMap      记录最终结果Map
@@ -1042,7 +1550,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 处理投手游戏每日的DayN
+     * 处理投手每日的DayN(投手每日)
      *
      * @param vo PitcherGameDataDayVO
      */
@@ -1067,7 +1575,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
     
     /**
-     * 处理投手游戏每日的DayN
+     * 处理投手游戏每日的DayN(投手游戏每日)
      *
      * @param vo PitcherGameDataDayVO
      */
@@ -1092,7 +1600,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 处理投手每日总计的DayN
+     * 处理投手每日总计的DayN(投手每日总计)
      *
      * @param vo PitcherDataDayTotalVO
      */
@@ -1130,7 +1638,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 处理投手游戏每日总计的DayN
+     * 处理投手游戏每日总计的DayN(投手游戏每日总计)
      *
      * @param vo PitcherGameDataDayTotalVO
      */
@@ -1168,7 +1676,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 查询投手每日数据SQL
+     * 查询投手每日数据SQL(投手每日)
      * @return String
      */
     private String pitcherDataDaySql() {
@@ -1377,7 +1885,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
     
     /**
-     * 查询投手游戏每日数据SQL
+     * 查询投手游戏每日数据SQL(投手游戏每日)
      * @return String
      */
     private String pitcherGameDataDaySql() {
@@ -1590,7 +2098,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 查询投手每日数据总计SQL
+     * 查询投手每日数据总计SQL(投手每日总计)
      * @return String
      */
     private String pitcherDataDayTotalSql() {
@@ -1762,7 +2270,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 查询投手游戏每日数据总计SQL
+     * 查询投手游戏每日数据总计SQL(投手游戏每日总计)
      * @return String
      */
     private String pitcherGameDataDayTotalSql() {
@@ -1934,7 +2442,7 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 投手游戏每日数据总计付费趋势sql
+     * 投手游戏每日数据总计付费趋势sql(投手游戏每日总计、投手每日总计共用)
      * @return String : Dn的充值金额 / D1-Dn的充值总金额 / Dn的充值人数 /当前消耗(剔除不存在的天数数据) /D1充值金额总和(剔除不存在的天数数据)
      */
     private String getPitcherGameDataDayTotalDayNsql() {
@@ -1999,7 +2507,188 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 查询投手游戏总数据SQL
+     * 查询投手总数据SQL(投手总数据)
+     * @param criA       主表查询条件
+     * @param criB       账面相关查询条件
+     * @param criAmount  账面充值人数查询条件
+     * @param criNewUser 新用户相关查询条件
+     * @param criRoleNum 创角人数相关查询条件
+     * @return String
+     */
+    private String pitcherDataTotalSql(Criteria criA, Criteria criB, Criteria criAmount, Criteria criNewUser, Criteria criRoleNum) {
+        return """
+                SELECT
+                	a.*,
+                	IFNULL(amount, 0) as amount,
+                	IFNULL(amount_count, 0) as amount_count,
+                	IFNULL(amount_num, 0) as amount_num,
+                	IFNULL(paper_avg, 0) as paper_avg,
+                	ROUND(IF(amount_num > 0 , IFNULL(amount, 0) / amount_num, 0), 2) as paper_arpu,
+                	IFNULL(new_user_amount_num, 0) as new_user_amount_num,
+                	ROUND(IF(new_user_amount_num > 0, IFNULL(cost, 0) / new_user_amount_num, 0), 2) as new_user_amount_cost,
+                	ROUND(IF(register_num > 0, IFNULL(new_user_amount_num, 0) / register_num, 0), 4) as new_user_amount_rate,
+                	ROUND(IF(amount_num > 0, IFNULL(new_user_amount_num, 0) / amount_num, 0), 4) as new_user_amount_ratio,
+                	IFNULL(new_user_order_again, 0) as new_user_order_again,
+                	ROUND(IF(new_user_total_amount_num > 0, IFNULL(new_user_order_again, 0) / new_user_total_amount_num, 0), 4) as new_user_again_rate,
+                	IFNULL(role_num, 0) as role_num,
+                	ROUND(IF(register_num > 0, IFNULL(role_num, 0) / register_num, 0), 4) as role_num_rate,
+                	ROUND(IF(role_num > 0, IFNULL(cost, 0) / role_num, 0), 2) as role_num_cost
+                FROM (
+                	SELECT
+                		pitcher_id,
+                		MAX(pitcher) as pitcher,
+                		SUM(cost) as cost,
+                		SUM(plan_count) as plan_count,
+                		SUM(account_count) as account_count,
+                		SUM(agent_count) as agent_count,
+                		SUM(register_num) as register_num,
+                		ROUND(IF(SUM(register_num) > 0, SUM(cost) / SUM(register_num), 0), 2) as register_cost,
+                		SUM(first_role_num) as first_role_num,
+                		SUM(new_user_total_role_num) as new_user_total_role_num,
+                		ROUND(IF(SUM(first_role_num) > 0 , SUM(cost) / SUM(first_role_num), 0), 2) as first_role_cost,
+                		ROUND(IF(SUM(new_user_total_role_num) > 0 , SUM(cost) / SUM(new_user_total_role_num), 0), 2) as new_user_total_role_cost,
+                		ROUND(IF(SUM(register_num) > 0 , SUM(first_role_num) / SUM(register_num), 0), 4) as first_role_rate,
+                		ROUND(IF(SUM(register_num) > 0 , SUM(new_user_total_role_num) / SUM(register_num), 0), 4) as new_user_total_role_rate,
+                		SUM(first_new_user_amount_count) as first_new_user_amount_count,
+                		SUM(first_new_user_amount_num) as first_new_user_amount_num,
+                		SUM(first_new_user_amount) as first_new_user_amount,
+                		SUM(new_user_total_amount_count) as new_user_total_amount_count,
+                		SUM(new_user_total_amount_num) as new_user_total_amount_num,
+                		SUM(new_user_total_amount) as new_user_total_amount,
+                		SUM(buy_new_user_total_amount) as buy_new_user_total_amount,
+                		SUM(buy_new_user_total_amount_num) as buy_new_user_total_amount_num,
+                		SUM(buy_new_user_total_amount_count) as buy_new_user_total_amount_count,
+                		ROUND(IF(SUM(cost) > 0, SUM(first_new_user_amount) / SUM(cost), 0), 4) as first_roi,
+                		ROUND(IF(SUM(cost) > 0, SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) as buy_roi,
+                		ROUND(IF(SUM(cost) > 0, SUM(new_user_total_amount) / SUM(cost), 0), 4) as today_roi,
+                		(SUM(new_user_total_amount) - SUM(cost)) as gross_profit,
+                		ROUND(IF(SUM(register_num) > 0, SUM(first_new_user_amount_num) / SUM(register_num), 0), 4) as first_rate,
+                		ROUND(IF(SUM(register_num) > 0, SUM(buy_new_user_total_amount_num) / SUM(register_num), 0), 4) as buy_user_rate,
+                		ROUND(IF(SUM(register_num) > 0, SUM(new_user_total_amount_num) / SUM(register_num), 0), 4) as today_rate,
+                		ROUND(IF(SUM(first_new_user_amount_count) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_count), 0), 2) as first_avg,
+                		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) as buy_avg,
+                		ROUND(IF(SUM(new_user_total_amount_count) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) as today_avg,
+                		ROUND(IF(SUM(first_new_user_amount_num) > 0 , SUM(cost) / SUM(first_new_user_amount_num), 0), 2) as first_amount_cost,
+                		ROUND(IF(SUM(buy_new_user_total_amount_num) > 0 , SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) as buy_amount_cost,
+                		ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(cost) / SUM(new_user_total_amount_num), 0), 2) as today_amount_cost,
+                		SUM(reg_order_user_again) as reg_order_user_again,
+                		ROUND(IF(SUM(new_user_total_amount_num) > 0 ,SUM(reg_order_user_again) / SUM(new_user_total_amount_num), 0), 4) as today_again_rate,
+                		ROUND(IF(SUM(register_num) > 0 , SUM(new_user_total_amount) / SUM(register_num), 0), 2) as new_reg_arpu,
+                		ROUND(IF(SUM(first_new_user_amount_num) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_num), 0), 2) as first_arpu,
+                		ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) as today_arpu,
+                		SUM(hundred_user_num) as hundred_user_num,
+                		ROUND(IF(SUM(hundred_user_num) > 0 , SUM(cost) / SUM(hundred_user_num), 0), 2) as hundred_user_num_cost,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da1) / SUM(cost), 0), 4) as roi1,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da2) / SUM(cost), 0), 4) as roi2,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da3) / SUM(cost), 0), 4) as roi3,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da4) / SUM(cost), 0), 4) as roi4,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da5) / SUM(cost), 0), 4) as roi5,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da6) / SUM(cost), 0), 4) as roi6,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da7) / SUM(cost), 0), 4) as roi7,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da8) / SUM(cost), 0), 4) as roi8,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da9) / SUM(cost), 0), 4) as roi9,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da10) / SUM(cost), 0), 4) as roi10,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da11) / SUM(cost), 0), 4) as roi11,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da12) / SUM(cost), 0), 4) as roi12,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da13) / SUM(cost), 0), 4) as roi13,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da14) / SUM(cost), 0), 4) as roi14,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da15) / SUM(cost), 0), 4) as roi15,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da16) / SUM(cost), 0), 4) as roi16,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da17) / SUM(cost), 0), 4) as roi17,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da18) / SUM(cost), 0), 4) as roi18,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da19) / SUM(cost), 0), 4) as roi19,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da20) / SUM(cost), 0), 4) as roi20,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da21) / SUM(cost), 0), 4) as roi21,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da22) / SUM(cost), 0), 4) as roi22,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da23) / SUM(cost), 0), 4) as roi23,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da24) / SUM(cost), 0), 4) as roi24,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da25) / SUM(cost), 0), 4) as roi25,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da26) / SUM(cost), 0), 4) as roi26,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da27) / SUM(cost), 0), 4) as roi27,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da28) / SUM(cost), 0), 4) as roi28,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da29) / SUM(cost), 0), 4) as roi29,
+                		ROUND(IF(SUM(cost) > 0 , SUM(da30) / SUM(cost), 0), 4) as roi30,
+                		ROUND(IF(SUM(cost) > 0 , SUM(m2) / SUM(cost), 0), 4) as roi60,
+                		ROUND(IF(SUM(cost) > 0 , SUM(m3) / SUM(cost), 0), 4) as roi90,
+                		ROUND(IF(SUM(cost) > 0 , SUM(m6) / SUM(cost), 0), 4) as roi180,
+                		ROUND(IF(SUM(cost) > 0 , SUM(y1) / SUM(cost), 0), 4) as roi1yaer,
+                		ROUND(IF(SUM(cost) > 0 , SUM(total) / SUM(cost), 0), 4) as roi_total
+                	FROM
+                		game_ads.ads_pitcher_day
+                	""" + criA +
+                """
+            ) a
+            LEFT JOIN (
+                SELECT
+                    pitcher_id as b_pitcher_id,
+                    IFNULL(SUM(amount), 0) as amount,
+                    IFNULL(SUM(amount_count), 0) as amount_count,
+                    ROUND(IF(SUM(amount_count) > 0 , SUM(amount) / SUM(amount_count), 0), 2) as paper_avg
+                FROM
+                    game_ads.ads_pitcher_day
+                """ + criB +
+                """
+            ) b ON a.pitcher_id = b.b_pitcher_id
+            LEFT JOIN (
+                SELECT
+                    pitcher_id as c_pitcher_id,
+                    IFNULL(COUNT(DISTINCT user_id), 0) amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criAmount +
+                """
+                    AND NOT agent_id = 0
+                GROUP BY pitcher_id
+            ) c ON a.pitcher_id = c.c_pitcher_id
+            LEFT JOIN (
+                SELECT
+                    pitcher_id as d_pitcher_id,
+                    COUNT(DISTINCT user_id) new_user_amount_num
+                FROM
+                    game_ads.ads_information
+                """ + criNewUser +
+                """
+                    AND NOT agent_id = 0
+                GROUP BY
+                    pitcher_id
+            ) d ON a.pitcher_id = d.d_pitcher_id
+            LEFT JOIN (
+                SELECT
+                    pitcher_id as e_pitcher_id,
+                    COUNT(tempA.num) as new_user_order_again
+                FROM (
+                    SELECT
+                        pitcher_id,
+                        COUNT(user_id) num
+                    FROM
+                        game_ads.ads_information
+                    """ + criNewUser +
+                """
+                    AND NOT agent_id = 0
+                GROUP BY
+                    user_id,
+                    pitcher_id
+                HAVING
+                    COUNT(user_id) > 1 ) tempA
+            GROUP BY
+                tempA.pitcher_id
+        ) e ON a.pitcher_id = e.e_pitcher_id
+        LEFT JOIN (
+            SELECT
+                user_zx_pitcher_id as f_pitcher_id,
+                COUNT(DISTINCT role_user_id) as role_num
+            FROM
+                dw_create_role_detail
+            """ + criRoleNum +
+                """
+                    AND NOT user_agent_id = 0
+                GROUP BY user_zx_pitcher_id
+            ) f ON a.pitcher_id = f.f_pitcher_id
+            """;
+    }
+
+    /**
+     * 查询投手游戏总数据SQL(投手游戏总数据)
      * @param criA       主表查询条件
      * @param criB       账面相关查询条件
      * @param criAmount  账面充值人数查询条件
@@ -2192,7 +2881,96 @@ public class PitcherDataServiceImpl implements IPitcherDataService {
     }
 
     /**
-     * 查询投手游戏总数据总计SQL
+     * 查询投手总数据总计SQL(投手总数据总计)
+     *
+     * @return String
+     */
+    private String pitcherDataTotalSumSql() {
+        return """
+                SELECT
+                    IFNULL(SUM(cost), 0) as cost,
+                    IFNULL(SUM(plan_count), 0) as plan_count,
+                    IFNULL(SUM(account_count), 0) as account_count,
+                    IFNULL(SUM(agent_count), 0) as agent_count,
+                    IFNULL(SUM(register_num), 0) as register_num,
+                    ROUND(IF(SUM(register_num) > 0, SUM(cost) / SUM(register_num), 0), 2) as register_cost,
+                    IFNULL(SUM(first_role_num), 0) as first_role_num,
+                    IFNULL(SUM(new_user_total_role_num), 0) as new_user_total_role_num,
+                    ROUND(IF(SUM(first_role_num) > 0 , SUM(cost) / SUM(first_role_num), 0), 2) as first_role_cost,
+                    ROUND(IF(SUM(new_user_total_role_num) > 0 , SUM(cost) / SUM(new_user_total_role_num), 0), 2) as new_user_total_role_cost,
+                    ROUND(IF(SUM(register_num) > 0 , SUM(first_role_num) / SUM(register_num), 0), 4) as first_role_rate,
+                    ROUND(IF(SUM(register_num) > 0 , SUM(new_user_total_role_num) / SUM(register_num), 0), 4) as new_user_total_role_rate,
+                    IFNULL(SUM(first_new_user_amount_count), 0) as first_new_user_amount_count,
+                    IFNULL(SUM(first_new_user_amount_num), 0) as first_new_user_amount_num,
+                    IFNULL(SUM(first_new_user_amount), 0) as first_new_user_amount,
+                    IFNULL(SUM(new_user_total_amount_count), 0) as new_user_total_amount_count,
+                    IFNULL(SUM(new_user_total_amount_num), 0) as new_user_total_amount_num,
+                    IFNULL(SUM(new_user_total_amount), 0) as new_user_total_amount,
+                    IFNULL(SUM(buy_new_user_total_amount), 0) as buy_new_user_total_amount,
+                    IFNULL(SUM(buy_new_user_total_amount_num), 0) as buy_new_user_total_amount_num,
+                    IFNULL(SUM(buy_new_user_total_amount_count), 0) as buy_new_user_total_amount_count,
+                    ROUND(IF(SUM(cost) > 0, SUM(first_new_user_amount) / SUM(cost), 0), 4) as first_roi,
+                    ROUND(IF(SUM(cost) > 0, SUM(buy_new_user_total_amount) / SUM(cost), 0), 4) as buy_roi,
+                    ROUND(IF(SUM(cost) > 0, SUM(new_user_total_amount) / SUM(cost), 0), 4) as today_roi,
+                    IFNULL((SUM(new_user_total_amount) - SUM(cost)), 0) as gross_profit,
+                    ROUND(IF(SUM(register_num) > 0, SUM(first_new_user_amount_num) / SUM(register_num), 0), 4) as first_rate,
+                    ROUND(IF(SUM(register_num) > 0, SUM(buy_new_user_total_amount_num) / SUM(register_num), 0), 4) as buy_user_rate,
+                    ROUND(IF(SUM(register_num) > 0, SUM(new_user_total_amount_num) / SUM(register_num), 0), 4) as today_rate,
+                    ROUND(IF(SUM(first_new_user_amount_count) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_count), 0), 2) as first_avg,
+                    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) as buy_avg,
+                    ROUND(IF(SUM(new_user_total_amount_count) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) as today_avg,
+                    ROUND(IF(SUM(first_new_user_amount_num) > 0 , SUM(cost) / SUM(first_new_user_amount_num), 0), 2) as first_amount_cost,
+                    ROUND(IF(SUM(buy_new_user_total_amount_num) > 0 , SUM(cost) / SUM(buy_new_user_total_amount_num), 0), 2) as buy_amount_cost,
+                    ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(cost) / SUM(new_user_total_amount_num), 0), 2) as today_amount_cost,
+                    IFNULL(SUM(reg_order_user_again), 0) as reg_order_user_again,
+                    ROUND(IF(SUM(new_user_total_amount_num) > 0 ,SUM(reg_order_user_again) / SUM(new_user_total_amount_num), 0), 4) as today_again_rate,
+                    ROUND(IF(SUM(register_num) > 0 , SUM(new_user_total_amount) / SUM(register_num), 0), 2) as new_reg_arpu,
+                    ROUND(IF(SUM(first_new_user_amount_num) > 0 , SUM(first_new_user_amount) / SUM(first_new_user_amount_num), 0), 2) as first_arpu,
+                    ROUND(IF(SUM(new_user_total_amount_num) > 0 , SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) as today_arpu,
+                    IFNULL(SUM(hundred_user_num), 0) as hundred_user_num,
+                    ROUND(IF(SUM(hundred_user_num) > 0 , SUM(cost) / SUM(hundred_user_num), 0), 2) as hundred_user_num_cost,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da1) / SUM(cost), 0), 4) as roi1,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da2) / SUM(cost), 0), 4) as roi2,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da3) / SUM(cost), 0), 4) as roi3,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da4) / SUM(cost), 0), 4) as roi4,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da5) / SUM(cost), 0), 4) as roi5,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da6) / SUM(cost), 0), 4) as roi6,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da7) / SUM(cost), 0), 4) as roi7,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da8) / SUM(cost), 0), 4) as roi8,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da9) / SUM(cost), 0), 4) as roi9,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da10) / SUM(cost), 0), 4) as roi10,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da11) / SUM(cost), 0), 4) as roi11,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da12) / SUM(cost), 0), 4) as roi12,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da13) / SUM(cost), 0), 4) as roi13,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da14) / SUM(cost), 0), 4) as roi14,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da15) / SUM(cost), 0), 4) as roi15,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da16) / SUM(cost), 0), 4) as roi16,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da17) / SUM(cost), 0), 4) as roi17,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da18) / SUM(cost), 0), 4) as roi18,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da19) / SUM(cost), 0), 4) as roi19,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da20) / SUM(cost), 0), 4) as roi20,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da21) / SUM(cost), 0), 4) as roi21,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da22) / SUM(cost), 0), 4) as roi22,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da23) / SUM(cost), 0), 4) as roi23,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da24) / SUM(cost), 0), 4) as roi24,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da25) / SUM(cost), 0), 4) as roi25,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da26) / SUM(cost), 0), 4) as roi26,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da27) / SUM(cost), 0), 4) as roi27,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da28) / SUM(cost), 0), 4) as roi28,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da29) / SUM(cost), 0), 4) as roi29,
+                    ROUND(IF(SUM(cost) > 0 , SUM(da30) / SUM(cost), 0), 4) as roi30,
+                    ROUND(IF(SUM(cost) > 0 , SUM(m2) / SUM(cost), 0), 4) as roi60,
+                    ROUND(IF(SUM(cost) > 0 , SUM(m3) / SUM(cost), 0), 4) as roi90,
+                    ROUND(IF(SUM(cost) > 0 , SUM(m6) / SUM(cost), 0), 4) as roi180,
+                    ROUND(IF(SUM(cost) > 0 , SUM(y1) / SUM(cost), 0), 4) as roi1yaer,
+                    ROUND(IF(SUM(cost) > 0 , SUM(total) / SUM(cost), 0), 4) as roi_total
+                FROM
+                    game_ads.ads_pitcher_day
+                """;
+    }
+
+    /**
+     * 查询投手游戏总数据总计SQL(投手游戏总数据总计)
      *
      * @return String
      */

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

@@ -21,7 +21,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 角色权限2> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <dubbo升级3.0, 角色权限3> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +