Pārlūkot izejas kodu

修改内容:广告监控总计

lth 1 gadu atpakaļ
vecāks
revīzija
2d2fb425d3

+ 3 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.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.PromotionDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayTotalDTO;
 import com.zanxiang.game.data.serve.pojo.vo.PromotionDayTotalVO;
@@ -31,14 +32,14 @@ public class AdsPromotionDayController {
     private IAdsPromotionDayService adsPromotionDayService;
 
     @ApiOperation(value = "广告监控数据")
-    //@PreAuthorize(permissionKey = "promotionData:adsPromotionDay:day")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:day")
     @PostMapping("/day")
     public ResultVO<Page<PromotionDayVO>> getPromotionDayData(@RequestBody PromotionDayDTO dto){
         return ResultVO.ok(adsPromotionDayService.getPromotionDayData(dto));
     }
 
     @ApiOperation(value = "广告监控数据总计")
-    //@PreAuthorize(permissionKey = "promotionData:adsPromotionDay:total")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:total")
     @PostMapping("/total")
     public ResultVO<PromotionDayTotalVO> getPromotionDayTotalData(@RequestBody PromotionDayTotalDTO dto) {
         return ResultVO.ok(adsPromotionDayService.getPromotionDayTotalData(dto));

+ 11 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayDTO.java

@@ -140,5 +140,16 @@ public class PromotionDayDTO extends BasePage {
     @ApiModelProperty(value = "游戏应用类型")
     private Long classify;
 
+    /**
+     * 排序字段
+     */
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    /**
+     * 排序方式:升序asc;降序desc
+     */
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
 
 }

+ 130 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PromotionDayTotalDTO.java

@@ -1,12 +1,142 @@
 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/7/27
  * @Description 前端传递的查询参数实体
  **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class PromotionDayTotalDTO {
 
+    /**
+     * 消耗开始日期
+     */
+    @ApiModelProperty(value = "消耗开始时间")
+    private LocalDate costBeginDate;
+
+    /**
+     * 消耗结束日期
+     */
+    @ApiModelProperty(value = "消耗结束时间")
+    private LocalDate costEndDate;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 广告ID
+     */
+    @ApiModelProperty(value = "广告ID")
+    private Long promotionId;
+
+    /**
+     * 广告名称
+     */
+    @ApiModelProperty(value = "广告名称")
+    private String promotionName;
+
+    /**
+     * 广告状态
+     */
+    @ApiModelProperty(value = "广告状态")
+    private String status;
+
+    /**
+     * 计划ID
+     */
+    @ApiModelProperty(value = "计划ID")
+    private Long projectId;
+
+    /**
+     * 计划名称
+     */
+    @ApiModelProperty(value = "计划名称")
+    private String projectName;
+
+    /**
+     * 推广账号名称
+     */
+    @ApiModelProperty(value = "推广账号名称")
+    private String accountName;
+
+    /**
+     * 推广账号ID
+     */
+    @ApiModelProperty(value = "推广账号ID")
+    private Long accountId;
+
+    /**
+     * 投放媒体
+     */
+    @ApiModelProperty(value = "投放媒体")
+    private String accountType;
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
+    /**
+     * 投手名称
+     */
+    @ApiModelProperty(value = "投手名称")
+    private String pitcherName;
+
+    /**
+     * 渠道ID
+     */
+    @ApiModelProperty(value = "渠道ID")
+    private Long agentId;
+
+    /**
+     * 渠道名称
+     */
+    @ApiModelProperty(value = "渠道名称")
+    private String agentName;
+
+    /**
+     * 渠道标识
+     */
+    @ApiModelProperty(value = "渠道标识")
+    private String agentKey;
+
+    /**
+     * cp名称
+     */
+    @ApiModelProperty(value = "CP名称")
+    private String cpName;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty(value = "游戏ID")
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @ApiModelProperty(value = "游戏名称")
+    private String gameName;
 
+    /**
+     * 游戏应用类型
+     */
+    @ApiModelProperty(value = "游戏应用类型")
+    private Long classify;
 
 }

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

@@ -1,10 +1,7 @@
 package com.zanxiang.game.data.serve.pojo.vo;
 
 import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
 
@@ -16,9 +13,6 @@ import java.time.LocalDate;
  * @Description 返回给前端的游戏每日数据实体
  **/
 @Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Builder
 public class GameDataDayVO {
 
     /**

+ 788 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayTotalVO.java

@@ -1,9 +1,796 @@
 package com.zanxiang.game.data.serve.pojo.vo;
 
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
 /**
  * @author tianhua
  * @time 2023/7/27
- * @Description 广告监控数据总计
+ * @Description 广告监控数据总计前端显示对象
  **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class PromotionDayTotalVO {
+
+    /**
+     * 今日消耗
+     */
+    @ApiModelProperty(value = "今日消耗")
+    private BigDecimal todayCost;
+
+    /**
+     * 广告总消耗
+     */
+    @ApiModelProperty(value = "广告总消耗")
+    private BigDecimal promotionTotalCost;
+
+    /**
+     * 曝光量
+     */
+    @ApiModelProperty(value = "曝光量")
+    private Long showCount;
+
+    /**
+     * 千次曝光成本
+     */
+    @ApiModelProperty(value = "千次曝光成本")
+    private BigDecimal thousandDisplayPrice;
+
+    /**
+     * 点击量
+     */
+    @ApiModelProperty(value = "点击量")
+    private Long clickCount;
+
+    /**
+     * 点击均价
+     */
+    @ApiModelProperty(value = "点击均价")
+    private BigDecimal avgClickCost;
+
+    /**
+     * 点击率
+     */
+    @ApiModelProperty(value = "点击率")
+    private BigDecimal ctr;
+
+    /**
+     * 转化目标量
+     */
+    @ApiModelProperty(value = "转化目标量")
+    private Long convertCount;
+
+    /**
+     * 转化目标成本
+     */
+    @ApiModelProperty(value = "转化目标成本")
+    private BigDecimal convertCost;
+
+    /**
+     * 目标转化率
+     */
+    @ApiModelProperty(value = "目标转化率")
+    private BigDecimal convertRate;
+
+    /**
+     * 新增用户数
+     */
+    @ApiModelProperty(value = "新增用户数")
+    private Long regNum;
+
+    /**
+     * 广告总注册人数
+     */
+    @ApiModelProperty(value = "广告总注册人数")
+    private Long regTotalNum;
+
+    /**
+     * 总创角人数
+     */
+    @ApiModelProperty(value = "总创角人数")
+    private Long roleTotalNum;
+
+    /**
+     * 首日创角人数
+     */
+    @ApiModelProperty(value = "首日创角人数")
+    private Long firstRoleNum;
+
+    /**
+     * 新用户累计创角人数
+     */
+    @ApiModelProperty(value = "新用户累计创角人数")
+    private Long newUserTotalRoleNum;
+
+    /**
+     * 注册成本
+     */
+    @ApiModelProperty(value = "注册成本")
+    private BigDecimal regCost;
+
+    /**
+     * 总注册成本
+     */
+    @ApiModelProperty(value = "总注册成本")
+    private BigDecimal regTotalCost;
+
+    /**
+     * 首日创角成本
+     */
+    @ApiModelProperty(value = "首日创角成本")
+    private BigDecimal firstRoleCost;
+
+    /**
+     * 新用户创角成本
+     */
+    @ApiModelProperty(value = "新用户创角成本")
+    private BigDecimal newUserTotalRoleCost;
+
+    /**
+     * 总创角成本
+     */
+    @ApiModelProperty(value = "总创角成本")
+    private BigDecimal roleTotalCost;
+
+    /**
+     * 首日创角率
+     */
+    @ApiModelProperty(value = "首日创角率")
+    private BigDecimal firstRoleRate;
+
+    /**
+     * 新用户创角率
+     */
+    @ApiModelProperty(value = "新用户创角率")
+    private BigDecimal newUserTotalRoleRate;
+
+    /**
+     * 总创角率
+     */
+    @ApiModelProperty(value = "总创角率")
+    private BigDecimal roleTotalRate;
+
+    /**
+     * 新增付费次数
+     */
+    @ApiModelProperty(value = "新增付费次数")
+    private Long firstNewUserAmountCount;
+
+    /**
+     * 新增付费人数
+     */
+    @ApiModelProperty(value = "新增付费人数")
+    private Long firstNewUserAmountNum;
+
+    /**
+     * 新增付费金额
+     */
+    @ApiModelProperty(value = "新增付费金额")
+    private BigDecimal firstNewUserAmount;
+
+    /**
+     * 至今付费次数
+     */
+    @ApiModelProperty(value = "至今付费次数")
+    private Long newUserTotalAmountCount;
+
+    /**
+     * 至今付费人数
+     */
+    @ApiModelProperty(value = "至今付费人数")
+    private Long newUserTotalAmountNum;
+
+    /**
+     * 至今付费金额
+     */
+    @ApiModelProperty(value = "至今付费金额")
+    private BigDecimal newUserTotalAmount;
+
+    /**
+     * 总充值次数
+     */
+    @ApiModelProperty(value = "总充值次数")
+    private Long totalAmountCount;
+
+    /**
+     * 总充值人数
+     */
+    @ApiModelProperty(value = "总充值人数")
+    private Long totalAmountNum;
+
+    /**
+     * 总充值金额
+     */
+    @ApiModelProperty(value = "总充值金额")
+    private BigDecimal totalAmount;
+
+    /**
+     * 首日ROI
+     */
+    @ApiModelProperty(value = "首日ROI")
+    private BigDecimal firstRoi;
+
+    /**
+     * 新用户24小时充值金额
+     */
+    @ApiModelProperty(value = "新用户24小时充值金额")
+    private BigDecimal twentyFourHoursAmount;
+
+    /**
+     * 新用户24小时ROI
+     */
+    @ApiModelProperty(value = "新用户24小时ROI")
+    private BigDecimal twentyFourHoursRoi;
+
+    /**
+     * 总ROI
+     */
+    @ApiModelProperty(value = "总ROI")
+    private BigDecimal totalRoi;
+
+    /**
+     * 广告总ROI
+     */
+    @ApiModelProperty(value = "广告总ROI")
+    private BigDecimal promotionTotalRoi;
+
+    /**
+     * 新增付费成本
+     */
+    @ApiModelProperty(value = "新增付费成本")
+    private BigDecimal firstNewUserRechargeCost;
+
+    /**
+     * 至今付费成本
+     */
+    @ApiModelProperty(value = "至今付费成本")
+    private BigDecimal newUserTotalRechargeCost;
+
+    /**
+     * 广告总付费成本
+     */
+    @ApiModelProperty(value = "广告总付费成本")
+    private BigDecimal totalRechargeCost;
+
+    /**
+     * 新增付费ARPPU
+     */
+    @ApiModelProperty(value = "新增付费ARPPU")
+    private BigDecimal firstNewUserArppu;
+
+    /**
+     * 至今付费ARPPU
+     */
+    @ApiModelProperty(value = "至今付费ARPPU")
+    private BigDecimal newUserTotalAmountArppu;
+
+    /**
+     * 新增付费100+用户数
+     */
+    @ApiModelProperty(value = "新增付费100+用户数")
+    private Long firstNewUserHundredUserNum;
+
+    /**
+     * 新增付费200+用户数
+     */
+    @ApiModelProperty(value = "新增付费200+用户数")
+    private Long firstNewUserTwoHundredUserNum;
+
+    /**
+     * 至今付费100+用户数
+     */
+    @ApiModelProperty(value = "至今付费100+用户数")
+    private Long newUserTotalHundredUserNum;
+
+    /**
+     * 首充50~100元用户数
+     */
+    @ApiModelProperty(value = "首充50~100元用户数")
+    private Long firstRechargeFiftyHundredNum;
+
+    /**
+     * 新增付费100+用户付费成本
+     */
+    @ApiModelProperty(value = "新增付费100+用户付费成本")
+    private BigDecimal firstNewUserHundredUserCost;
+
+    /**
+     * 新增付费200+用户付费成本
+     */
+    @ApiModelProperty(value = "新增付费200+用户付费成本")
+    private BigDecimal firstNewUserTwoHundredUserCost;
+
+    /**
+     * 至今付费100+用户付费成本
+     */
+    @ApiModelProperty(value = "至今付费100+用户付费成本")
+    private BigDecimal newUserTotalHundredUserCost;
+
+    /**
+     * 首充50~100元占比
+     */
+    @ApiModelProperty(value = "首充50~100元占比")
+    private BigDecimal firstRechargeFiftyHundredRate;
+
+    /**
+     * 首日IOS付费次数
+     */
+    @ApiModelProperty(value = "首日IOS付费次数")
+    private Long firstIosAmountCount;
+
+    /**
+     * 首日IOS付费人数
+     */
+    @ApiModelProperty(value = "首日IOS付费人数")
+    private Long firstIosAmountNum;
+
+    /**
+     * 首日IOS付费金额
+     */
+    @ApiModelProperty(value = "首日IOS付费金额")
+    private BigDecimal firstIosAmount;
+
+    /**
+     * 首日Android付费次数
+     */
+    @ApiModelProperty(value = "首日Android付费次数")
+    private Long firstAndroidAmountCount;
+
+    /**
+     * 首日Android付费人数
+     */
+    @ApiModelProperty(value = "首日Android付费人数")
+    private Long firstAndroidAmountNum;
+
+    /**
+     * 首日Android付费金额
+     */
+    @ApiModelProperty(value = "首日Android付费金额")
+    private BigDecimal firstAndroidAmount;
+
+    /**
+     * 首日IOS付费人数占比
+     */
+    @ApiModelProperty(value = "首日IOS付费人数占比")
+    private BigDecimal firstIosAmountNumRate;
+
+    /**
+     * 首日IOS付费金额占比
+     */
+    @ApiModelProperty(value = "首日IOS付费金额占比")
+    private BigDecimal firstIosAmountRate;
+
+    /**
+     * 首日IOS付费ROI
+     */
+    @ApiModelProperty(value = "首日IOS付费ROI")
+    private BigDecimal firstIosAmountRoi;
+
+    /**
+     * 首日Android付费人数占比
+     */
+    @ApiModelProperty(value = "首日Android付费人数占比")
+    private BigDecimal firstAndroidAmountNumRate;
+
+    /**
+     * 首日Android付费金额占比
+     */
+    @ApiModelProperty(value = "首日Android付费金额占比")
+    private BigDecimal firstAndroidAmountRate;
+
+    /**
+     * 首日Android付费ROI
+     */
+    @ApiModelProperty(value = "首日Android付费ROI")
+    private BigDecimal firstAndroidAmountRoi;
+
+    /**
+     * 首日付费率
+     */
+    @ApiModelProperty(value = "首日付费率")
+    private BigDecimal firstAmountRate;
+
+    /**
+     * 新增客单价
+     */
+    @ApiModelProperty(value = "新增客单价")
+    private BigDecimal firstNewUserAvgPrice;
+
+    /**
+     * 至今客单价
+     */
+    @ApiModelProperty(value = "至今客单价")
+    private BigDecimal newUserTotalAvgPrice;
+
+    /**
+     * 计划ID,消耗时间的第1天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第1天新用户充值(不显示)")
+    private BigDecimal d1;
+
+    /**
+     * 计划ID,消耗时间的第2天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第2天新用户充值(不显示)")
+    private BigDecimal d2;
+
+    /**
+     * 计划ID,消耗时间的第3天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第3天新用户充值(不显示)")
+    private BigDecimal d3;
+
+    /**
+     * 计划ID,消耗时间的第4天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第4天新用户充值(不显示)")
+    private BigDecimal d4;
+
+    /**
+     * 计划ID,消耗时间的第5天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第5天新用户充值(不显示)")
+    private BigDecimal d5;
+
+    /**
+     * 计划ID,消耗时间的第6天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第6天新用户充值(不显示)")
+    private BigDecimal d6;
+
+    /**
+     * 计划ID,消耗时间的第7天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第7天新用户充值(不显示)")
+    private BigDecimal d7;
+
+    /**
+     * 计划ID,消耗时间的第8天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第8天新用户充值(不显示)")
+    private BigDecimal d8;
+
+    /**
+     * 计划ID,消耗时间的第9天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第9天新用户充值(不显示)")
+    private BigDecimal d9;
+
+    /**
+     * 计划ID,消耗时间的第10天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第10天新用户充值(不显示)")
+    private BigDecimal d10;
+
+    /**
+     * 计划ID,消耗时间的第11天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第11天新用户充值(不显示)")
+    private BigDecimal d11;
+
+    /**
+     * 计划ID,消耗时间的第12天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第12天新用户充值(不显示)")
+    private BigDecimal d12;
+
+    /**
+     * 计划ID,消耗时间的第13天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第13天新用户充值(不显示)")
+    private BigDecimal d13;
+
+    /**
+     * 计划ID,消耗时间的第14天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第14天新用户充值(不显示)")
+    private BigDecimal d14;
+
+    /**
+     * 计划ID,消耗时间的第15天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第15天新用户充值(不显示)")
+    private BigDecimal d15;
+
+    /**
+     * 计划ID,消耗时间的第16天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第16天新用户充值(不显示)")
+    private BigDecimal d16;
+
+    /**
+     * 计划ID,消耗时间的第17天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第17天新用户充值(不显示)")
+    private BigDecimal d17;
+
+    /**
+     * 计划ID,消耗时间的第18天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第18天新用户充值(不显示)")
+    private BigDecimal d18;
+
+    /**
+     * 计划ID,消耗时间的第19天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第19天新用户充值(不显示)")
+    private BigDecimal d19;
+
+    /**
+     * 计划ID,消耗时间的第20天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第20天新用户充值(不显示)")
+    private BigDecimal d20;
+
+    /**
+     * 计划ID,消耗时间的第21天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第21天新用户充值(不显示)")
+    private BigDecimal d21;
+
+    /**
+     * 计划ID,消耗时间的第22天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第22天新用户充值(不显示)")
+    private BigDecimal d22;
+
+    /**
+     * 计划ID,消耗时间的第23天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第23天新用户充值(不显示)")
+    private BigDecimal d23;
+
+    /**
+     * 计划ID,消耗时间的第24天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第24天新用户充值(不显示)")
+    private BigDecimal d24;
+
+    /**
+     * 计划ID,消耗时间的第25天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第25天新用户充值(不显示)")
+    private BigDecimal d25;
+
+    /**
+     * 计划ID,消耗时间的第26天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第26天新用户充值(不显示)")
+    private BigDecimal d26;
+
+    /**
+     * 计划ID,消耗时间的第27天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第27天新用户充值(不显示)")
+    private BigDecimal d27;
+
+    /**
+     * 计划ID,消耗时间的第28天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第28天新用户充值(不显示)")
+    private BigDecimal d28;
+
+    /**
+     * 计划ID,消耗时间的第29天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第29天新用户充值(不显示)")
+    private BigDecimal d29;
+
+    /**
+     * 计划ID,消耗时间的第30天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第30天新用户充值(不显示)")
+    private BigDecimal d30;
+
+    /**
+     * 付费趋势第1天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第1天总:金额/人数/增/回/倍(不显示)")
+    private String da1;
+
+    /**
+     * 付费趋势第2天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第2天总:金额/人数/增/回/倍(不显示)")
+    private String da2;
+
+    /**
+     * 付费趋势第3天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第3天总:金额/人数/增/回/倍(不显示)")
+    private String da3;
+
+    /**
+     * 付费趋势第4天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第4天总:金额/人数/增/回/倍(不显示)")
+    private String da4;
+
+    /**
+     * 付费趋势第5天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第5天总:金额/人数/增/回/倍(不显示)")
+    private String da5;
+
+    /**
+     * 付费趋势第6天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第6天总:金额/人数/增/回/倍(不显示)")
+    private String da6;
+
+    /**
+     * 付费趋势第7天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第7天总:金额/人数/增/回/倍(不显示)")
+    private String da7;
+
+    /**
+     * 付费趋势第8天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第8天总:金额/人数/增/回/倍(不显示)")
+    private String da8;
+
+    /**
+     * 付费趋势第9天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第9天总:金额/人数/增/回/倍(不显示)")
+    private String da9;
+
+    /**
+     * 付费趋势第10天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第10天总:金额/人数/增/回/倍(不显示)")
+    private String da10;
+
+    /**
+     * 付费趋势第11天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第11天总:金额/人数/增/回/倍(不显示)")
+    private String da11;
+
+    /**
+     * 付费趋势第12天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第12天总:金额/人数/增/回/倍(不显示)")
+    private String da12;
+
+    /**
+     * 付费趋势第13天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第13天总:金额/人数/增/回/倍(不显示)")
+    private String da13;
+
+    /**
+     * 付费趋势第14天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第14天总:金额/人数/增/回/倍(不显示)")
+    private String da14;
+
+    /**
+     * 付费趋势第15天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第15天总:金额/人数/增/回/倍(不显示)")
+    private String da15;
+
+    /**
+     * 付费趋势第16天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第16天总:金额/人数/增/回/倍(不显示)")
+    private String da16;
+
+    /**
+     * 付费趋势第17天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第17天总:金额/人数/增/回/倍(不显示)")
+    private String da17;
+
+    /**
+     * 付费趋势第18天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第18天总:金额/人数/增/回/倍(不显示)")
+    private String da18;
+
+    /**
+     * 付费趋势第19天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第19天总:金额/人数/增/回/倍(不显示)")
+    private String da19;
+
+    /**
+     * 付费趋势第20天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第20天总:金额/人数/增/回/倍(不显示)")
+    private String da20;
+
+    /**
+     * 付费趋势第21天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第21天总:金额/人数/增/回/倍(不显示)")
+    private String da21;
+
+    /**
+     * 付费趋势第22天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第22天总:金额/人数/增/回/倍(不显示)")
+    private String da22;
+
+    /**
+     * 付费趋势第23天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第23天总:金额/人数/增/回/倍(不显示)")
+    private String da23;
+
+    /**
+     * 付费趋势第24天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第24天总:金额/人数/增/回/倍(不显示)")
+    private String da24;
+
+    /**
+     * 付费趋势第25天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第25天总:金额/人数/增/回/倍(不显示)")
+    private String da25;
+
+    /**
+     * 付费趋势第26天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第26天总:金额/人数/增/回/倍(不显示)")
+    private String da26;
+
+    /**
+     * 付费趋势第27天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第27天总:金额/人数/增/回/倍(不显示)")
+    private String da27;
+
+    /**
+     * 付费趋势第28天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第28天总:金额/人数/增/回/倍(不显示)")
+    private String da28;
+
+    /**
+     * 付费趋势第29天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第29天总:金额/人数/增/回/倍(不显示)")
+    private String da29;
+
+    /**
+     * 付费趋势第30天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第30天总:金额/人数/增/回/倍(不显示)")
+    private String da30;
+
+    /**
+     * 次日数据
+     */
+    @ApiModelProperty(value = "次日:ROI/付费/倍数")
+    private PromotionRechargeTrendVO d2Trend;
+
+    /**
+     * 3日数据
+     */
+    @ApiModelProperty(value = "3日:ROI/付费/倍数")
+    private PromotionRechargeTrendVO d3Trend;
+
+    /**
+     * 7日数据
+     */
+    @ApiModelProperty(value = "7日:ROI/付费/倍数")
+    private PromotionRechargeTrendVO d7Trend;
+
+    /**
+     * 15日数据
+     */
+    @ApiModelProperty(value = "15日:ROI/付费/倍数")
+    private PromotionRechargeTrendVO d15Trend;
+
 }

+ 2 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java

@@ -7,7 +7,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
-import java.math.BigInteger;
 
 /**
  * @author tianhua
@@ -24,7 +23,7 @@ public class PromotionDayVO {
      * 广告ID
      */
     @ApiModelProperty(value = "广告ID")
-    private BigInteger promotionId;
+    private String promotionId;
 
     /**
      * 广告名称
@@ -36,7 +35,7 @@ public class PromotionDayVO {
      * 计划ID
      */
     @ApiModelProperty(value = "计划ID")
-    private Long projectId;
+    private String projectId;
 
     /**
      * 计划名称

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

@@ -15,18 +15,16 @@ import org.nutz.dao.Dao;
 import org.nutz.dao.Sqls;
 import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.BeanWrapper;
-import org.springframework.beans.BeanWrapperImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.beans.PropertyDescriptor;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author tianhua
@@ -271,40 +269,6 @@ public class OverallSummaryServiceImpl implements IOverallSummaryService {
         return cri;
     }
 
-    /**
-     * 所有为空值的属性都不copy
-     *
-     * @param source 原数据
-     * @param target 目标数据
-     */
-    private void copyNullProperties(Object source, Object target) {
-        BeanUtils.copyProperties(source, target, getNullField(source));
-    }
-
-    /**
-     * 获取属性中为空的字段
-     *
-     * @param target 目标对象
-     * @return 不需要替换的字段数组
-     */
-    private static String[] getNullField(Object target) {
-        BeanWrapper beanWrapper = new BeanWrapperImpl(target);
-        PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
-        Set<String> notNullFieldSet = new HashSet<>();
-        if (propertyDescriptors.length > 0) {
-            for (PropertyDescriptor p : propertyDescriptors) {
-                String name = p.getName();
-                Object value = beanWrapper.getPropertyValue(name);
-                if (Objects.isNull(value)) {
-                    notNullFieldSet.add(name);
-                }
-            }
-        }
-        String[] notNullField = new String[notNullFieldSet.size()];
-
-        return notNullFieldSet.toArray(notNullField);
-    }
-
     /**
      * 检查查询的时间内是否都有数据,没有则赋值默认值0
      *

+ 518 - 21
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -1,9 +1,12 @@
 package com.zanxiang.game.data.serve.service.impl;
 
+import com.google.common.base.CaseFormat;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.pojo.vo.PromotionDayTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.PromotionDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.PromotionRechargeTrendVO;
 import com.zanxiang.game.data.serve.service.IAdsPromotionDayService;
 import com.zanxiang.game.data.serve.utils.Page;
 import lombok.extern.slf4j.Slf4j;
@@ -15,11 +18,21 @@ import org.nutz.dao.pager.Pager;
 import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
 import org.nutz.dao.util.Daos;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.beans.PropertyDescriptor;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author tianhua
@@ -35,11 +48,304 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
 
     @Override
     public Page<PromotionDayVO> getPromotionDayData(PromotionDayDTO dto) {
+        //不传递查询条件默认查询当天数据
+        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
+            dto.setCostBeginDate(LocalDate.now());
+            dto.setCostEndDate(LocalDate.now());
+        }
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled("today_cost");
+        }
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        Criteria cri = myCri(dto);
+        //创建sql语句
+        Sql sql = Sqls.create(getPromotionDayDataSql() + cri);
+        //添加自定义回传对象
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(PromotionDayVO.class));
+        //设置pager对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        sql.setPager(pager);
+        //执行sql
+        dao.execute(sql);
+        //获取到结果list
+        List<PromotionDayVO> list = sql.getList(PromotionDayVO.class);
+        //分页对象设置总条数
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_promotion_day" + cri);
+        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
+
+        //处理List中的每个vo对象缺少的数据
+        list.stream().map(vo ->{
+                    //记录最近有数据的LocalDate
+                    LocalDate latestDate = dto.getCostEndDate();
+                    Boolean hasDataDate = findDate(vo.getPromotionId(), latestDate);
+                    while (!hasDataDate) {
+                        latestDate = latestDate.minusDays(1);
+                        hasDataDate = findDate(vo.getPromotionId(), latestDate);
+                    }
+                    //构建查询条件
+                    Criteria totalCri = Cnd.cri();
+                    totalCri.where().andEquals("dt", latestDate);
+                    totalCri.where().andEquals("promotion_id", vo.getPromotionId());
+                    //查询出最近一条包含总数据的记录
+                    Sql totalDataSql = Sqls.create(getTotalDataSql() + totalCri);
+                    //设置回传对象
+                    totalDataSql.setCallback(Sqls.callback.entity());
+                    totalDataSql.setEntity(dao.getEntity(PromotionDayVO.class));
+                    //执行sql
+                    dao.execute(totalDataSql);
+                    //得到对象
+                    PromotionDayVO tempVO = totalDataSql.getObject(PromotionDayVO.class);
+                    //将两个对象内容合并
+                    copyNullProperties(tempVO, vo);
+
+                    //计算d2(次日)数据
+                    vo.setD2Trend(PromotionRechargeTrendVO.builder()
+                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD2().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                            .rechargeMoney(vo.getD2())
+                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD2().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                            .build());
+                    //计算d3数据
+                    vo.setD3Trend(PromotionRechargeTrendVO.builder()
+                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD3().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                            .rechargeMoney(vo.getD3())
+                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD3().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                            .build());
+                    //计算d7数据
+                    vo.setD7Trend(PromotionRechargeTrendVO.builder()
+                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD7().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                            .rechargeMoney(vo.getD7())
+                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD7().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                            .build());
+                    //计算d15数据
+                    vo.setD15Trend(PromotionRechargeTrendVO.builder()
+                            .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD15().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                            .rechargeMoney(vo.getD15())
+                            .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                                    vo.getD15().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                            .build());
+
+                    //返回最终数据
+                    return vo;
+                }).collect(Collectors.toList());
+
+        //返回查询得结果
+        return new Page<>(list, pager);
+    }
+
+    /**
+     * 广告监控数据总计一栏
+     *
+     * @param dto
+     * @return
+     */
+    @Override
+    public PromotionDayTotalVO getPromotionDayTotalData(PromotionDayTotalDTO dto) {
         //不传递查询条件默认查询当天数据
         if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
             dto.setCostBeginDate(LocalDate.now());
             dto.setCostEndDate(LocalDate.now());
         }
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getAccountId() != null) {
+            //拼接推广账号Id查询条件
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountName())) {
+            //拼接推广账号名称查询条件
+            cri.where().andEquals("account_name", dto.getAccountName());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountType())) {
+            //推广账号类型
+            cri.where().andEquals("account_type", dto.getAccountType());
+        }
+        if (dto.getPitcherId() != null) {
+            cri.where().andEquals("pitcher_id", dto.getPitcherId());
+        }
+        if (StringUtils.isNotBlank(dto.getPitcherName())) {
+            cri.where().andEquals("pitcher_name", dto.getPitcherName());
+        }
+        if (dto.getAgentId() != null) {
+            cri.where().andEquals("agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getAgentKey())) {
+            cri.where().andEquals("agent_key", dto.getAgentKey());
+        }
+        if (StringUtils.isNotBlank(dto.getAgentName())) {
+            cri.where().andEquals("agent_name", dto.getAgentName());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andEquals("cp_name", dto.getCpName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            cri.where().andEquals("game_name", dto.getGameName());
+        }
+        if (dto.getGameId() != null) {
+            cri.where().andEquals("game_id", dto.getGameId());
+        }
+        if (dto.getClassify() != null) {
+            cri.where().andEquals("classify", dto.getClassify());
+        }
+        if (StringUtils.isNotBlank(dto.getPromotionName())) {
+            cri.where().andEquals("promotion_name", dto.getPromotionName());
+        }
+        if (dto.getPromotionId() != null) {
+            cri.where().andEquals("promotion_id", dto.getPromotionId());
+        }
+        if (StringUtils.isNotBlank(dto.getStatus())) {
+            cri.where().andEquals("status", dto.getStatus());
+        }
+        if (StringUtils.isNotBlank(dto.getProjectName())) {
+            cri.where().andEquals("project_name", dto.getProjectName());
+        }
+        if (dto.getProjectId() != null) {
+            cri.where().andEquals("project_id", dto.getProjectId());
+        }
+        if (dto.getCostBeginDate() != null && dto.getCostEndDate() != null) {
+            cri.where().andBetween("dt", dto.getCostBeginDate(), dto.getCostEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        //创建sql
+        Sql promotionDayTotalSql = Sqls.create(promotionDayTotalSql() + cri);
+        //设置回传对象
+        promotionDayTotalSql.setCallback(Sqls.callback.entity());
+        promotionDayTotalSql.setEntity(dao.getEntity(PromotionDayTotalVO.class));
+        //执行sql
+        dao.execute(promotionDayTotalSql);
+        //得到结果
+        PromotionDayTotalVO vo = promotionDayTotalSql.getObject(PromotionDayTotalVO.class);
+
+        //计算总数据要根据promotionId分组
+        Criteria totalCri = cri;
+        totalCri.getGroupBy().groupBy("promotion_id");
+        //构建sql
+        Sql tempSql = Sqls.create(promotionDayTotalTotalDataTempSql() + totalCri);
+        Sql totalSumSql = Sqls.create(promotionDayTotalTotalDataSumSql() + "(" + tempSql + ") a");
+        //设置回传对象
+        totalSumSql.setCallback(Sqls.callback.entity());
+        totalSumSql.setEntity(dao.getEntity(PromotionDayTotalVO.class));
+        //执行sql
+        dao.execute(totalSumSql);
+        PromotionDayTotalVO tempVO = totalSumSql.getObject(PromotionDayTotalVO.class);
+        //将取到的值赋值vo
+        copyNullProperties(tempVO, vo);
+
+        //如果没有tempVO,返回默认值0
+        if (tempVO.getPromotionTotalCost() == null) {
+            //计算总数据
+            //总注册成本
+            vo.setRegTotalCost(BigDecimal.ZERO);
+            //总创角成本
+            vo.setRoleTotalCost(BigDecimal.ZERO);
+            //总创角率
+            vo.setRoleTotalRate(BigDecimal.ZERO);
+            //广告总ROI
+            vo.setPromotionTotalRoi(BigDecimal.ZERO);
+            //总付费成本
+            vo.setTotalRechargeCost(BigDecimal.ZERO);
+            //计算d2,d3,d7,d15数据
+            //计算d2(次日)数据
+            vo.setD2Trend(PromotionRechargeTrendVO.builder()
+                    .roi(BigDecimal.ZERO)
+                    .rechargeMoney(BigDecimal.ZERO)
+                    .multiples(BigDecimal.ZERO)
+                    .build());
+            //计算d3数据
+            vo.setD3Trend(PromotionRechargeTrendVO.builder()
+                    .roi(BigDecimal.ZERO)
+                    .rechargeMoney(BigDecimal.ZERO)
+                    .multiples(BigDecimal.ZERO)
+                    .build());
+            //计算d7数据
+            vo.setD7Trend(PromotionRechargeTrendVO.builder()
+                    .roi(BigDecimal.ZERO)
+                    .rechargeMoney(BigDecimal.ZERO)
+                    .multiples(BigDecimal.ZERO)
+                    .build());
+            //计算d15数据
+            vo.setD15Trend(PromotionRechargeTrendVO.builder()
+                    .roi(BigDecimal.ZERO)
+                    .rechargeMoney(BigDecimal.ZERO)
+                    .multiples(BigDecimal.ZERO)
+                    .build());
+
+            return vo;
+        }
+
+        //计算总数据
+        //总注册成本
+        vo.setRegTotalCost(vo.getRegTotalNum() == 0L ? BigDecimal.ZERO :
+                vo.getPromotionTotalCost().divide(BigDecimal.valueOf(vo.getRegTotalNum()), 2, RoundingMode.HALF_UP));
+        //总创角成本
+        vo.setRoleTotalCost(vo.getRoleTotalNum() == 0L ? BigDecimal.ZERO :
+                vo.getPromotionTotalCost().divide(BigDecimal.valueOf(vo.getRoleTotalNum()), 2, RoundingMode.HALF_UP));
+        //总创角率
+        vo.setRoleTotalRate(vo.getRegTotalNum() == 0L ? BigDecimal.ZERO :
+                BigDecimal.valueOf(vo.getRoleTotalNum()).divide(BigDecimal.valueOf(vo.getRegTotalNum()), 4, RoundingMode.HALF_UP));
+        //广告总ROI
+        vo.setPromotionTotalRoi(vo.getPromotionTotalCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                vo.getTotalAmount().divide(vo.getPromotionTotalCost(), 4, RoundingMode.HALF_UP));
+        //总付费成本
+        vo.setTotalRechargeCost(vo.getTotalAmountNum() == 0L ? BigDecimal.ZERO :
+                vo.getPromotionTotalCost().divide(BigDecimal.valueOf(vo.getTotalAmountNum()), 2, RoundingMode.HALF_UP));
+
+        //计算d2,d3,d7,d15数据
+        //计算d2(次日)数据
+        vo.setD2Trend(PromotionRechargeTrendVO.builder()
+                .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD2().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                .rechargeMoney(vo.getD2())
+                .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD2().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                .build());
+        //计算d3数据
+        vo.setD3Trend(PromotionRechargeTrendVO.builder()
+                .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD3().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                .rechargeMoney(vo.getD3())
+                .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD3().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                .build());
+        //计算d7数据
+        vo.setD7Trend(PromotionRechargeTrendVO.builder()
+                .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD7().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                .rechargeMoney(vo.getD7())
+                .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD7().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                .build());
+        //计算d15数据
+        vo.setD15Trend(PromotionRechargeTrendVO.builder()
+                .roi(vo.getTodayCost().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD15().divide(vo.getTodayCost(), 4, RoundingMode.HALF_UP))
+                .rechargeMoney(vo.getD15())
+                .multiples(vo.getD1().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
+                        vo.getD15().divide(vo.getD1(), 4, RoundingMode.HALF_UP))
+                .build());
+
+        return vo;
+    }
+
+    /**
+     * 广告监控用到的查询条件
+     *
+     * @param dto 前端传递的查询条件
+     * @return 查询条件
+     */
+    private Criteria myCri(PromotionDayDTO dto) {
         //创建查询条件
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {
@@ -104,29 +410,79 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         }
         //拼接分组条件
         cri.getGroupBy().groupBy("promotion_id");
-        //创建sql语句
-        Sql sql = Sqls.create(getPromotionDayDataSql() + cri );
-        //添加自定义回传对象
-        sql.setCallback(Sqls.callback.entities());
-        sql.setEntity(dao.getEntity(PromotionDayVO.class));
-        //设置pager对象
-        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
-        sql.setPager(pager);
-        //执行sql
+        //拼接排序条件
+        cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+
+
+        return cri;
+    }
+
+    /**
+     * 用来判断当前日期有没有数据
+     *
+     * @param promotionId 查询的广告id
+     * @param latestDate  时间参数
+     * @return Boolean
+     */
+    private Boolean findDate(String promotionId, LocalDate latestDate) {
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        cri.where().andEquals("promotion_id", Long.valueOf(promotionId));
+        cri.where().andEquals("dt", latestDate);
+        Sql sql = Sqls.create("""
+                SELECT
+                    promotion_id
+                FROM
+                    game_ads.ads_promotion_day
+                """ + cri);
+        sql.setCallback(Sqls.callback.str());
         dao.execute(sql);
-        //获取到结果list
-        List<PromotionDayVO> list = sql.getList(PromotionDayVO.class);
-        //分页对象设置总条数
-        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_promotion_day" + cri);
-        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
+        String tempStr = sql.getString();
+        //查询结果判断
+        if (tempStr != null) {
+            return true;
+        }
+        return false;
+    }
 
-        //返回查询得结果
-        return new Page<>(list,pager);
+    /**
+     * 所有为空值的属性都不copy
+     *
+     * @param source 原数据
+     * @param target 目标数据
+     */
+    private void copyNullProperties(Object source, Object target) {
+        BeanUtils.copyProperties(source, target, getNullField(source));
     }
 
     /**
-     * 查询广告监控数据
-     * @return
+     * 获取属性中为空的字段
+     *
+     * @param target 目标对象
+     * @return 不需要替换的字段数组
+     */
+    private static String[] getNullField(Object target) {
+        BeanWrapper beanWrapper = new BeanWrapperImpl(target);
+        PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
+        Set<String> notNullFieldSet = new HashSet<>();
+        if (propertyDescriptors.length > 0) {
+            for (PropertyDescriptor p : propertyDescriptors) {
+                String name = p.getName();
+                Object value = beanWrapper.getPropertyValue(name);
+                if (Objects.isNull(value)) {
+                    notNullFieldSet.add(name);
+                }
+            }
+        }
+        String[] notNullField = new String[notNullFieldSet.size()];
+
+        return notNullFieldSet.toArray(notNullField);
+    }
+
+    /**
+     * 查询广告监控数据sql
+     *
+     * @return String
      */
     private String getPromotionDayDataSql() {
         return """
@@ -201,6 +557,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                 	round(if(SUM(reg_num) > 0, SUM(first_new_user_amount_num) / SUM(reg_num), 0), 4) as first_amount_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_new_user_avg_price,
                 	round(if(SUM(new_user_total_amount_count) > 0, SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) as new_user_total_avg_price,
+                	SUM(d1) as d1,
                 	SUM(d2) as d2,
                 	SUM(d3) as d3,
                 	SUM(d7) as d7,
@@ -210,8 +567,148 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                 """;
     }
 
-    @Override
-    public PromotionDayTotalVO getPromotionDayTotalData(PromotionDayTotalDTO dto) {
-        return null;
+    /**
+     * 查询广告每日里总数据sql
+     *
+     * @return String
+     */
+    private String getTotalDataSql() {
+        return """
+                SELECT
+                    status,
+                    creative_preview,
+                    landing_type,
+                    pricing,
+                    cpa_bid,
+                    roi_goal,
+                    budget,
+                    schedule_time,
+                    notes,
+                    service,
+                    balance,
+                    promotion_total_cost,
+                    convert_target,
+                    reg_total_num,
+                    role_total_num,
+                    reg_total_cost,
+                    role_total_cost,
+                    role_total_rate,
+                    total_amount_count,
+                    total_amount_num,
+                    total_amount,
+                    promotion_total_roi,
+                    total_recharge_cost
+                FROM
+                    game_ads.ads_promotion_day
+                """;
+    }
+
+    /**
+     * 查询广告监控每日总计一栏sql
+     *
+     * @return String
+     */
+    private String promotionDayTotalSql() {
+        return """
+                SELECT
+                    IFNULL(SUM(today_cost), 0) as today_cost,
+                	IFNULL(SUM(show_count), 0) as show_count,
+                	round(if(SUM(show_count) > 0, SUM(today_cost) / SUM(show_count), 0), 2) as thousand_display_price,
+                	IFNULL(SUM(click_count), 0) as click_count,
+                	round(if(SUM(click_count) > 0, SUM(today_cost) / SUM(click_count), 0), 2) as avg_click_cost,
+                	round(if(SUM(show_count) > 0, SUM(click_count) / SUM(show_count), 0), 4) as ctr,
+                	IFNULL(SUM(convert_count), 0) as convert_count,
+                	IFNULL(SUM(convert_cost), 0) as convert_cost,
+                	round(if(SUM(click_count) > 0, SUM(convert_count) / SUM(click_count), 0), 4) as convert_rate,
+                	IFNULL(SUM(reg_num), 0) as reg_num,
+                	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(reg_num) > 0, SUM(today_cost) / SUM(reg_num), 0), 2) as reg_cost,
+                	round(if(SUM(first_role_num) > 0, SUM(today_cost) / SUM(first_role_num), 0), 2) as first_role_cost,
+                	round(if(SUM(new_user_total_role_num) > 0, SUM(today_cost) / SUM(new_user_total_role_num), 0), 2) as new_user_total_role_cost,
+                	round(if(SUM(reg_num) > 0, SUM(first_role_num) / SUM(reg_num), 0), 4) as first_role_rate,
+                	round(if(SUM(reg_num) > 0, SUM(new_user_total_role_num) / SUM(reg_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,
+                	round(if(SUM(today_cost) > 0, SUM(first_new_user_amount) / SUM(today_cost), 0), 4) as first_roi,
+                	IFNULL(SUM(twenty_four_hours_amount), 0) as twenty_four_hours_amount,
+                	round(if(SUM(today_cost) > 0, SUM(twenty_four_hours_amount) / SUM(today_cost), 0), 4) as twenty_four_hours_roi,
+                	round(if(SUM(today_cost) > 0, SUM(new_user_total_amount) / SUM(today_cost), 0), 4) as total_roi,
+                	round(if(SUM(first_new_user_amount_num) > 0, SUM(today_cost) / SUM(first_new_user_amount_num), 0), 2) as first_new_user_recharge_cost,
+                	round(if(SUM(new_user_total_amount_num) > 0, SUM(today_cost) / SUM(new_user_total_amount_num), 0), 2) as new_user_total_recharge_cost,
+                	round(if(SUM(first_new_user_amount_num) > 0, SUM(first_new_user_amount) / SUM(first_new_user_amount_num), 0), 2) as first_new_user_arppu,
+                	round(if(SUM(new_user_total_amount_num) > 0, SUM(new_user_total_amount) / SUM(new_user_total_amount_num), 0), 2) as new_user_total_amount_arppu,
+                	IFNULL(SUM(first_new_user_hundred_user_num), 0) as first_new_user_hundred_user_num,
+                	round(if(SUM(first_new_user_hundred_user_num) > 0, SUM(today_cost) / SUM(first_new_user_hundred_user_num), 0), 2) as first_new_user_hundred_user_cost,
+                	IFNULL(SUM(first_recharge_fifty_hundred_num), 0) as first_recharge_fifty_hundred_num,
+                	round(if(SUM(new_user_total_amount_num) > 0, SUM(first_recharge_fifty_hundred_num) / SUM(new_user_total_amount_num), 0), 4) as first_recharge_fifty_hundred_rate,
+                	IFNULL(SUM(first_new_user_two_hundred_user_num), 0) as first_new_user_two_hundred_user_num,
+                	round(if(SUM(first_new_user_two_hundred_user_num) > 0, SUM(today_cost) / SUM(first_new_user_two_hundred_user_num), 0), 2) as first_new_user_two_hundred_user_cost,
+                	IFNULL(SUM(new_user_total_hundred_user_num), 0) as new_user_total_hundred_user_num,
+                	round(if(SUM(new_user_total_hundred_user_num) > 0, SUM(today_cost) / SUM(new_user_total_hundred_user_num), 0), 2) as new_user_total_hundred_user_cost,
+                	IFNULL(SUM(first_ios_amount_num), 0) as first_ios_amount_num,
+                	IFNULL(SUM(first_ios_amount_count), 0) as first_ios_amount_count,
+                	IFNULL(SUM(first_ios_amount), 0) as first_ios_amount,
+                	round(if(SUM(first_new_user_amount_num) > 0, SUM(first_ios_amount_num) / SUM(first_new_user_amount_num), 0), 4) as first_ios_amount_num_rate,
+                	round(if(SUM(first_new_user_amount) > 0, SUM(first_ios_amount) / SUM(first_new_user_amount), 0), 4) as first_ios_amount_rate,
+                	round(if(SUM(today_cost)> 0, SUM(first_ios_amount) / SUM(today_cost), 0), 4) as first_ios_amount_roi,
+                	IFNULL(SUM(first_android_amount_count), 0) as first_android_amount_count,
+                	IFNULL(SUM(first_android_amount_num), 0) as first_android_amount_num,
+                	IFNULL(SUM(first_android_amount), 0) as first_android_amount,
+                	round(if(SUM(first_new_user_amount_num) > 0,SUM(first_android_amount_num) / SUM(first_new_user_amount_num), 0), 4) as first_android_amount_num_rate,
+                	round(if(SUM(first_new_user_amount) > 0, SUM(first_android_amount) / SUM(first_new_user_amount), 0), 4) as first_android_amount_rate,
+                	round(if(SUM(today_cost) > 0, SUM(first_android_amount) / SUM(today_cost), 0), 4) as first_android_amount_roi,
+                	round(if(SUM(reg_num) > 0, SUM(first_new_user_amount_num) / SUM(reg_num), 0), 4) as first_amount_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_new_user_avg_price,
+                	round(if(SUM(new_user_total_amount_count) > 0, SUM(new_user_total_amount) / SUM(new_user_total_amount_count), 0), 2) as new_user_total_avg_price,
+                	IFNULL(SUM(d1), 0) as d1,
+                	IFNULL(SUM(d2), 0) as d2,
+                	IFNULL(SUM(d3), 0) as d3,
+                	IFNULL(SUM(d7), 0) as d7,
+                	IFNULL(SUM(d15), 0) as d15
+                FROM
+                	game_ads.ads_promotion_day
+                """;
+    }
+
+    /**
+     * 用来查询出总计一栏的总数据sql
+     *
+     * @return String
+     */
+    private String promotionDayTotalTotalDataTempSql() {
+        return """
+                SELECT
+                    MAX(promotion_total_cost) promotion_total_cost,
+                    MAX(reg_total_num) reg_total_num,
+                    MAX(role_total_num) role_total_num,
+                    MAX(total_amount_count) total_amount_count,
+                    MAX(total_amount_num) total_amount_num,
+                    MAX(total_amount) total_amount
+                FROM
+                    game_ads.ads_promotion_day
+                """;
+    }
+
+    /**
+     * 得到计算后的总数据
+     *
+     * @return String
+     */
+    private String promotionDayTotalTotalDataSumSql() {
+        return """
+                SELECT
+                    IFNULL(SUM(promotion_total_cost), 0) promotion_total_cost,
+                    IFNULL(SUM(reg_total_num), 0) reg_total_num,
+                    IFNULL(SUM(role_total_num), 0) role_total_num,
+                    IFNULL(SUM(total_amount_count), 0) total_amount_count,
+                    IFNULL(SUM(total_amount_num), 0) total_amount_num,
+                    IFNULL(SUM(total_amount), 0) total_amount
+                FROM
+                """;
     }
 }