Преглед на файлове

修改内容:推广数据

shishaosong преди 1 година
родител
ревизия
2abdb1988c

+ 41 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AccountAgentDayController.java

@@ -0,0 +1,41 @@
+package com.zanxiang.game.data.serve.controller;
+
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteTotalDTO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteTotalVO;
+import com.zanxiang.game.data.serve.service.IAccountAgentDayService;
+import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.pojo.ResultVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/promote")
+public class AccountAgentDayController {
+    @Autowired
+    private IAccountAgentDayService accountAgentDayService;
+
+    @PreAuthorize(permissionKey = "gameData:accountAgent:day")
+    @GetMapping("/day")
+    public ResultVO<Page<GamePromoteDayVO>> accountAgentDay(GamePromoteDayDTO dto) {
+        return ResultVO.ok(accountAgentDayService.accountAgentDay(dto));
+    }
+
+    @PreAuthorize(permissionKey = "gameData:accountAgent:dayTotal")
+    @GetMapping("/day/total")
+    public ResultVO<GamePromoteDayTotalVO> accountAgentDayTotal(GamePromoteDayTotalDTO dto) {
+        return ResultVO.ok(accountAgentDayService.accountAgentDayTotal(dto));
+    }
+
+    @PreAuthorize(permissionKey = "gameData:accountAgent:total")
+    @GetMapping("/total")
+    public ResultVO<Page<GamePromoteTotalVO>> accountAgentTotal(GamePromoteTotalDTO dto) {
+        return ResultVO.ok(accountAgentDayService.accountAgentTotal(dto));
+    }
+}

+ 41 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteDayDTO.java

@@ -0,0 +1,41 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteDayDTO extends BasePage<AdsAccountAgentDay> {
+    @ApiModelProperty(notes = "投手id")
+    private Long sysUserId;
+    @ApiModelProperty(notes = "推广账号ID")
+    private String accountId;
+
+    @ApiModelProperty(notes = "投放渠道Id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "cp名")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏名")
+    private String gameName;
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameType;
+
+    @ApiModelProperty(notes = "消耗开始日期")
+    private LocalDate beginDay;
+    @ApiModelProperty(notes = "消耗结束日期")
+    private LocalDate endDay;
+
+
+}

+ 36 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteDayTotalDTO.java

@@ -0,0 +1,36 @@
+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;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteDayTotalDTO {
+    @ApiModelProperty(notes = "投手id")
+    private Long sysUserId;
+    @ApiModelProperty(notes = "推广账号ID")
+    private String accountId;
+
+    @ApiModelProperty(notes = "投放渠道Id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "cp名")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏名")
+    private String gameName;
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameType;
+
+    @ApiModelProperty(notes = "消耗开始日期")
+    private LocalDate beginDay;
+    @ApiModelProperty(notes = "消耗结束日期")
+    private LocalDate endDay;
+}

+ 43 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GamePromoteTotalDTO.java

@@ -0,0 +1,43 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteTotalDTO extends BasePage<AdsAccountAgentDay> {
+    @ApiModelProperty(notes = "投手id")
+    private Long sysUserId;
+    @ApiModelProperty(notes = "推广账号ID")
+    private String accountId;
+
+    @ApiModelProperty(notes = "投放渠道Id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "cp名")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏名")
+    private String gameName;
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameType;
+
+    @ApiModelProperty(notes = "消耗开始日期")
+    private LocalDate costBeginDay;
+    @ApiModelProperty(notes = "消耗结束日期")
+    private LocalDate costEndDay;
+
+    @ApiModelProperty(notes = "充值开始日期")
+    private LocalDate rechargeBeginDay;
+    @ApiModelProperty(notes = "充值结束日期")
+    private LocalDate rechargeEndDay;
+}

+ 214 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayTotalVO.java

@@ -0,0 +1,214 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteDayTotalVO {
+    @ApiModelProperty(notes = "消耗")
+    private BigDecimal cost;
+
+    @ApiModelProperty(notes = "广告计划数量")
+    private Long adPlanCount;
+
+    @ApiModelProperty(notes = "曝光数")
+    private Long viewCount;
+
+    @ApiModelProperty(notes = "点击数")
+    private Long clickCount;
+
+    @ApiModelProperty(notes = "转化量")
+    private Long convertCount;
+
+    @ApiModelProperty(notes = "转化率(目标转化率)=转化量/点击量100%")
+    private BigDecimal convertRate;
+
+    @ApiModelProperty(notes = "平均转化成本=实际消耗/转化量")
+    private BigDecimal avgConvertCost;
+
+    @ApiModelProperty(notes = "深度转化量")
+    private Long deepConvertCount;
+
+    @ApiModelProperty(notes = "深度转化成本=实际消耗/深度转化量")
+    private BigDecimal deepConvertCost;
+
+    @ApiModelProperty(notes = "深度转化率=深度转化量/转化量100%")
+    private BigDecimal deepConvertRate;
+
+    @ApiModelProperty(notes = "千次曝光成本=实际消耗/曝光量1000")
+    private BigDecimal thousandViewCost;
+
+    @ApiModelProperty(notes = "点击率=点击量/曝光量100%")
+    private BigDecimal clickRate;
+
+    @ApiModelProperty(notes = "平均点击均价=实际消耗/点击量")
+    private BigDecimal avgClickCost;
+
+    @ApiModelProperty(notes = "应用下载量")
+    private Long appDownloadCount;
+
+    @ApiModelProperty(notes = "应用下载成本=实际消耗/安卓下载开始数")
+    private BigDecimal appDownloadCost;
+
+    @ApiModelProperty(notes = "应用下载率=安卓下载开始数/点击数")
+    private BigDecimal appDownloadRate;
+
+    @ApiModelProperty(notes = "应用下载完成量")
+    private Long downloadFinish;
+
+    @ApiModelProperty(notes = "应用安装量")
+    private Long appInstallCount;
+
+    @ApiModelProperty(notes = "应用安装成本=实际消耗/安卓安装完成数")
+    private BigDecimal appInstallCost;
+
+    @ApiModelProperty(notes = "应用安装率=安卓安装完成数/安卓下载完成数")
+    private BigDecimal appInstallRate;
+
+    @ApiModelProperty(notes = "应用下载完成成本=实际消耗/安卓下载完成数")
+    private BigDecimal downloadFinishCost;
+
+    @ApiModelProperty(notes = "应用下载完成率=安卓下载完成数/安卓下载开始数")
+    private BigDecimal downloadFinishRate;
+
+    @ApiModelProperty(notes = "应用激活数")
+    private Long appActiveCount;
+
+    @ApiModelProperty(notes = "应用激活成本=实际消耗/激活数")
+    private BigDecimal appActiveCost;
+
+    @ApiModelProperty(notes = "应用激活率=激活数/点击数100%")
+    private BigDecimal appActiveRate;
+
+    @ApiModelProperty(notes = "注册人数")
+    private Long regUserCount;
+
+    @ApiModelProperty(notes = "注册成本=实际消耗/注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(notes = "首日新用户充值次数")
+    private Long firstUserRechargeCount;
+
+    @ApiModelProperty(notes = "首日新用户充值人数")
+    private Long firstUserRechargeUser;
+
+    @ApiModelProperty(notes = "首日新用户充值金额")
+    private BigDecimal firstUserRechargeMoney;
+
+    @ApiModelProperty(notes = "老用户充值次数")
+    private Long oldUserRechargeCount;
+
+    @ApiModelProperty(notes = "老用户充值人数")
+    private Long oldUserRechargeUser;
+
+    @ApiModelProperty(notes = "老用户充值金额")
+    private BigDecimal oldUserRechargeMoney;
+
+    @ApiModelProperty(notes = "账面充值次数")
+    private Long showRechargeCount;
+
+    @ApiModelProperty(notes = "账面充值人数")
+    private Long showRechargeUser;
+
+    @ApiModelProperty(notes = "账面充值金额")
+    private BigDecimal showRechargeMoney;
+
+    @ApiModelProperty(notes = "新用户累计充值次数")
+    private Long newUserRechargeCount;
+
+    @ApiModelProperty(notes = "新用户累计充值人数")
+    private Long newUserRechargeUser;
+
+    @ApiModelProperty(notes = "新用户累计充值金额")
+    private BigDecimal newUserRechargeMoney;
+
+    @ApiModelProperty(notes = "首日ROI=首日新用户充值金额/实际消耗")
+    private BigDecimal firstRecoveryRate;
+
+    @ApiModelProperty(notes = "当日回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal todayRecoveryRate;
+
+    @ApiModelProperty(notes = "买量回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal buyRecoveryRate;
+
+    @ApiModelProperty(notes = "毛利额=新用户累计充值金额-实际消耗")
+    private BigDecimal grossMargin;
+
+    @ApiModelProperty(notes = "3日ROI=新用户3日累计充值金额/实际消耗")
+    private BigDecimal roiDay3;
+
+    @ApiModelProperty(notes = "5日ROI=新用户5日累计充值金额/实际消耗")
+    private BigDecimal roiDay5;
+
+    @ApiModelProperty(notes = "7日ROI=新用户7日累计充值金额/实际消耗")
+    private BigDecimal roiDay7;
+
+    @ApiModelProperty(notes = "15日ROI=新用户15日累计充值金额/实际消耗")
+    private BigDecimal roiDay15;
+
+    @ApiModelProperty(notes = "30日ROI=新用户30日累计充值金额/实际消耗")
+    private BigDecimal roiDay30;
+
+    @ApiModelProperty(notes = "60日ROI=新用户60日累计充值金额/实际消耗")
+    private BigDecimal roiDay60;
+
+    @ApiModelProperty(notes = "180日ROI=新用户180日累计充值金额/实际消耗")
+    private BigDecimal roiDay180;
+
+    @ApiModelProperty(notes = "一年ROI=新用户一年累计充值金额/实际消耗")
+    private BigDecimal roiYear1;
+
+    @ApiModelProperty(notes = "首日付费率=首日新用户充值人数/注册人数")
+    private BigDecimal firstRechargeRate;
+
+    @ApiModelProperty(notes = "买量用户付费率=新用户累计充值人数/注册人数")
+    private BigDecimal buyUserRechargeRate;
+
+    @ApiModelProperty(notes = "新用户付费比=首日新用户充值人数/账面充值人数")
+    private BigDecimal newUserRechargeRate;
+
+    @ApiModelProperty(notes = "首日客单价=首日新用户充值金额/首日新用户充值次数")
+    private BigDecimal avgFirstUserRecharge;
+
+    @ApiModelProperty(notes = "买量客单价=新用户累计充值金额/新用户累计充值次数")
+    private BigDecimal avgBuyUserRecharge;
+
+    @ApiModelProperty(notes = "账面客单价=账面充值金额/账面充值次数")
+    private BigDecimal avgShowUserRecharge;
+
+    @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
+    private BigDecimal firstRechargeCost;
+
+    @ApiModelProperty(notes = "买量充值成本=实际消耗/新用户累计充值人数")
+    private BigDecimal buyUserRechargeCost;
+
+    @ApiModelProperty(notes = "复充率=新用户复充人数/新用户累计充值人数")
+    private BigDecimal repeatRechargeRate;
+
+    @ApiModelProperty(notes = "新增注册Arpu=新用户累计充值金额/注册人数")
+    private BigDecimal newRegArpu;
+
+    @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
+    private BigDecimal firstRechargeArpu;
+
+    @ApiModelProperty(notes = "买付费Arpu=新用户累计充值金额/新用户累计充值人数")
+    private BigDecimal todayRechargeArpu;
+
+    @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
+    private BigDecimal showRechargeArpu;
+
+    @ApiModelProperty(notes = "单日付费100+人数")
+    private String hundredUserNum;
+
+    @ApiModelProperty(notes = "单日付费100+成本")
+    private String hundredUserNumCost;
+}

+ 266 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteDayVO.java

@@ -0,0 +1,266 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteDayVO {
+    private String id;
+
+    @ApiModelProperty(notes = "渠道id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "渠道名称")
+    private String agentName;
+
+    @ApiModelProperty(notes = "推广账号ID")
+    private String accountId;
+
+    @ApiModelProperty(notes = "投手名")
+    private String sysUserName;
+
+    @ApiModelProperty(notes = "cp名")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏名")
+    private String gameName;
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameType;
+
+    @ApiModelProperty(notes = "消耗日期")
+    private LocalDate costDay;
+
+    @ApiModelProperty(notes = "投手id")
+    private Long sysUserId;
+
+    @ApiModelProperty(notes = "消耗")
+    private BigDecimal cost;
+
+    @ApiModelProperty(notes = "广告计划数量")
+    private Long adPlanCount;
+
+    @ApiModelProperty(notes = "曝光数")
+    private Long viewCount;
+
+    @ApiModelProperty(notes = "点击数")
+    private Long clickCount;
+
+    @ApiModelProperty(notes = "转化量")
+    private Long convertCount;
+
+    @ApiModelProperty(notes = "转化率(目标转化率)=转化量/点击量100%")
+    private BigDecimal convertRate;
+
+    @ApiModelProperty(notes = "平均转化成本=实际消耗/转化量")
+    private BigDecimal avgConvertCost;
+
+    @ApiModelProperty(notes = "深度转化量")
+    private Long deepConvertCount;
+
+    @ApiModelProperty(notes = "深度转化成本=实际消耗/深度转化量")
+    private BigDecimal deepConvertCost;
+
+    @ApiModelProperty(notes = "深度转化率=深度转化量/转化量100%")
+    private BigDecimal deepConvertRate;
+
+    @ApiModelProperty(notes = "千次曝光成本=实际消耗/曝光量1000")
+    private BigDecimal thousandViewCost;
+
+    @ApiModelProperty(notes = "点击率=点击量/曝光量100%")
+    private BigDecimal clickRate;
+
+    @ApiModelProperty(notes = "平均点击均价=实际消耗/点击量")
+    private BigDecimal avgClickCost;
+
+    @ApiModelProperty(notes = "应用下载量")
+    private Long appDownloadCount;
+
+    @ApiModelProperty(notes = "应用下载成本=实际消耗/安卓下载开始数")
+    private BigDecimal appDownloadCost;
+
+    @ApiModelProperty(notes = "应用下载率=安卓下载开始数/点击数")
+    private BigDecimal appDownloadRate;
+
+    @ApiModelProperty(notes = "应用下载完成量")
+    private Long downloadFinish;
+
+    @ApiModelProperty(notes = "应用安装量")
+    private Long appInstallCount;
+
+    @ApiModelProperty(notes = "应用安装成本=实际消耗/安卓安装完成数")
+    private BigDecimal appInstallCost;
+
+    @ApiModelProperty(notes = "应用安装率=安卓安装完成数/安卓下载完成数")
+    private BigDecimal appInstallRate;
+
+    @ApiModelProperty(notes = "应用下载完成成本=实际消耗/安卓下载完成数")
+    private BigDecimal downloadFinishCost;
+
+    @ApiModelProperty(notes = "应用下载完成率=安卓下载完成数/安卓下载开始数")
+    private BigDecimal downloadFinishRate;
+
+    @ApiModelProperty(notes = "应用激活数")
+    private Long appActiveCount;
+
+    @ApiModelProperty(notes = "应用激活成本=实际消耗/激活数")
+    private BigDecimal appActiveCost;
+
+    @ApiModelProperty(notes = "应用激活率=激活数/点击数100%")
+    private BigDecimal appActiveRate;
+
+    @ApiModelProperty(notes = "注册人数")
+    private Long regUserCount;
+
+    @ApiModelProperty(notes = "注册成本=实际消耗/注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(notes = "首日新用户充值次数")
+    private Long firstUserRechargeCount;
+
+    @ApiModelProperty(notes = "首日新用户充值人数")
+    private Long firstUserRechargeUser;
+
+    @ApiModelProperty(notes = "首日新用户充值金额")
+    private BigDecimal firstUserRechargeMoney;
+
+    @ApiModelProperty(notes = "老用户充值次数")
+    private Long oldUserRechargeCount;
+
+    @ApiModelProperty(notes = "老用户充值人数")
+    private Long oldUserRechargeUser;
+
+    @ApiModelProperty(notes = "老用户充值金额")
+    private BigDecimal oldUserRechargeMoney;
+
+    @ApiModelProperty(notes = "账面充值次数")
+    private Long showRechargeCount;
+
+    @ApiModelProperty(notes = "账面充值人数")
+    private Long showRechargeUser;
+
+    @ApiModelProperty(notes = "账面充值金额")
+    private BigDecimal showRechargeMoney;
+
+    @ApiModelProperty(notes = "新用户累计充值次数")
+    private Long newUserRechargeCount;
+
+    @ApiModelProperty(notes = "新用户累计充值人数")
+    private Long newUserRechargeUser;
+
+    @ApiModelProperty(notes = "新用户累计充值金额")
+    private BigDecimal newUserRechargeMoney;
+
+    @ApiModelProperty(notes = "首日ROI=首日新用户充值金额/实际消耗")
+    private BigDecimal firstRecoveryRate;
+
+    @ApiModelProperty(notes = "当日回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal todayRecoveryRate;
+
+    @ApiModelProperty(notes = "买量回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal buyRecoveryRate;
+
+    @ApiModelProperty(notes = "毛利额=新用户累计充值金额-实际消耗")
+    private BigDecimal grossMargin;
+
+    @ApiModelProperty(notes = "3日ROI=新用户3日累计充值金额/实际消耗")
+    private BigDecimal roiDay3;
+
+    @ApiModelProperty(notes = "5日ROI=新用户5日累计充值金额/实际消耗")
+    private BigDecimal roiDay5;
+
+    @ApiModelProperty(notes = "7日ROI=新用户7日累计充值金额/实际消耗")
+    private BigDecimal roiDay7;
+
+    @ApiModelProperty(notes = "15日ROI=新用户15日累计充值金额/实际消耗")
+    private BigDecimal roiDay15;
+
+    @ApiModelProperty(notes = "30日ROI=新用户30日累计充值金额/实际消耗")
+    private BigDecimal roiDay30;
+
+    @ApiModelProperty(notes = "60日ROI=新用户60日累计充值金额/实际消耗")
+    private BigDecimal roiDay60;
+
+    @ApiModelProperty(notes = "180日ROI=新用户180日累计充值金额/实际消耗")
+    private BigDecimal roiDay180;
+
+    @ApiModelProperty(notes = "一年ROI=新用户一年累计充值金额/实际消耗")
+    private BigDecimal roiYear1;
+
+    @ApiModelProperty(notes = "首日付费率=首日新用户充值人数/注册人数")
+    private BigDecimal firstRechargeRate;
+
+    @ApiModelProperty(notes = "买量用户付费率=新用户累计充值人数/注册人数")
+    private BigDecimal buyUserRechargeRate;
+
+    @ApiModelProperty(notes = "新用户付费比=首日新用户充值人数/账面充值人数")
+    private BigDecimal newUserRechargeRate;
+
+    @ApiModelProperty(notes = "首日客单价=首日新用户充值金额/首日新用户充值次数")
+    private BigDecimal avgFirstUserRecharge;
+
+    @ApiModelProperty(notes = "买量客单价=新用户累计充值金额/新用户累计充值次数")
+    private BigDecimal avgBuyUserRecharge;
+
+    @ApiModelProperty(notes = "账面客单价=账面充值金额/账面充值次数")
+    private BigDecimal avgShowUserRecharge;
+
+    @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
+    private BigDecimal firstRechargeCost;
+
+    @ApiModelProperty(notes = "买量充值成本=实际消耗/新用户累计充值人数")
+    private BigDecimal buyUserRechargeCost;
+
+    @ApiModelProperty(notes = "复充率=新用户复充人数/新用户累计充值人数")
+    private BigDecimal repeatRechargeRate;
+
+    @ApiModelProperty(notes = "新增注册Arpu=新用户累计充值金额/注册人数")
+    private BigDecimal newRegArpu;
+
+    @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
+    private BigDecimal firstRechargeArpu;
+
+    @ApiModelProperty(notes = "买付费Arpu=新用户累计充值金额/新用户累计充值人数")
+    private BigDecimal todayRechargeArpu;
+
+    @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
+    private BigDecimal showRechargeArpu;
+
+    @ApiModelProperty(notes = "付费趋势:1天")
+    private String rechargeTrendDay1;
+
+    @ApiModelProperty(notes = "付费趋势:3天")
+    private String rechargeTrendDay3;
+
+    @ApiModelProperty(notes = "付费趋势:7天")
+    private String rechargeTrendDay7;
+
+    @ApiModelProperty(notes = "付费趋势:15天")
+    private String rechargeTrendDay15;
+
+    @ApiModelProperty(notes = "付费趋势:1个月")
+    private String rechargeTrendMonth1;
+
+    @ApiModelProperty(notes = "付费趋势:2个月")
+    private String rechargeTrendMonth2;
+
+    @ApiModelProperty(notes = "付费趋势:3个月")
+    private String rechargeTrendMonth3;
+
+    @ApiModelProperty(notes = "付费趋势:总")
+    private String rechargeTrendTotal;
+
+    @ApiModelProperty(notes = "单日付费100+人数")
+    private String hundredUserNum;
+
+    @ApiModelProperty(notes = "单日付费100+成本")
+    private String hundredUserNumCost;
+}

+ 245 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GamePromoteTotalVO.java

@@ -0,0 +1,245 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GamePromoteTotalVO {
+    private String id;
+
+    @ApiModelProperty(notes = "渠道id")
+    private Long agentId;
+
+    @ApiModelProperty(notes = "推广账号ID")
+    private String accountId;
+
+    @ApiModelProperty(notes = "投手名")
+    private String sysUserName;
+
+    @ApiModelProperty(notes = "cp名")
+    private String cpName;
+
+    @ApiModelProperty(notes = "游戏名")
+    private String gameName;
+    @ApiModelProperty(notes = "游戏应用类型")
+    private String gameType;
+
+    @ApiModelProperty(notes = "投手id")
+    private Long sysUserId;
+
+    @ApiModelProperty(notes = "消耗")
+    private BigDecimal cost;
+
+    @ApiModelProperty(notes = "广告计划数量")
+    private Long adPlanCount;
+
+    @ApiModelProperty(notes = "曝光数")
+    private Long viewCount;
+
+    @ApiModelProperty(notes = "点击数")
+    private Long clickCount;
+
+    @ApiModelProperty(notes = "转化量")
+    private Long convertCount;
+
+    @ApiModelProperty(notes = "转化率(目标转化率)=转化量/点击量100%")
+    private BigDecimal convertRate;
+
+    @ApiModelProperty(notes = "平均转化成本=实际消耗/转化量")
+    private BigDecimal avgConvertCost;
+
+    @ApiModelProperty(notes = "深度转化量")
+    private Long deepConvertCount;
+
+    @ApiModelProperty(notes = "深度转化成本=实际消耗/深度转化量")
+    private BigDecimal deepConvertCost;
+
+    @ApiModelProperty(notes = "深度转化率=深度转化量/转化量100%")
+    private BigDecimal deepConvertRate;
+
+    @ApiModelProperty(notes = "千次曝光成本=实际消耗/曝光量1000")
+    private BigDecimal thousandViewCost;
+
+    @ApiModelProperty(notes = "点击率=点击量/曝光量100%")
+    private BigDecimal clickRate;
+
+    @ApiModelProperty(notes = "平均点击均价=实际消耗/点击量")
+    private BigDecimal avgClickCost;
+
+    @ApiModelProperty(notes = "应用下载量")
+    private Long appDownloadCount;
+
+    @ApiModelProperty(notes = "应用下载成本=实际消耗/安卓下载开始数")
+    private BigDecimal appDownloadCost;
+
+    @ApiModelProperty(notes = "应用下载率=安卓下载开始数/点击数")
+    private BigDecimal appDownloadRate;
+
+    @ApiModelProperty(notes = "应用下载完成量")
+    private Long downloadFinish;
+
+    @ApiModelProperty(notes = "应用安装量")
+    private Long appInstallCount;
+
+    @ApiModelProperty(notes = "应用安装成本=实际消耗/安卓安装完成数")
+    private BigDecimal appInstallCost;
+
+    @ApiModelProperty(notes = "应用安装率=安卓安装完成数/安卓下载完成数")
+    private BigDecimal appInstallRate;
+
+    @ApiModelProperty(notes = "应用下载完成成本=实际消耗/安卓下载完成数")
+    private BigDecimal downloadFinishCost;
+
+    @ApiModelProperty(notes = "应用下载完成率=安卓下载完成数/安卓下载开始数")
+    private BigDecimal downloadFinishRate;
+
+    @ApiModelProperty(notes = "应用激活数")
+    private Long appActiveCount;
+
+    @ApiModelProperty(notes = "应用激活成本=实际消耗/激活数")
+    private BigDecimal appActiveCost;
+
+    @ApiModelProperty(notes = "应用激活率=激活数/点击数100%")
+    private BigDecimal appActiveRate;
+
+    @ApiModelProperty(notes = "注册人数")
+    private Long regUserCount;
+
+    @ApiModelProperty(notes = "注册成本=实际消耗/注册人数")
+    private BigDecimal regCost;
+
+    @ApiModelProperty(notes = "首日新用户充值次数")
+    private Long firstUserRechargeCount;
+
+    @ApiModelProperty(notes = "首日新用户充值人数")
+    private Long firstUserRechargeUser;
+
+    @ApiModelProperty(notes = "首日新用户充值金额")
+    private BigDecimal firstUserRechargeMoney;
+
+    @ApiModelProperty(notes = "新用户充值次数")
+    private Long userRechargeCount;
+
+    @ApiModelProperty(notes = "新用户充值人数")
+    private Long userRechargeUser;
+
+    @ApiModelProperty(notes = "新用户充值金额")
+    private BigDecimal userRechargeMoney;
+
+    @ApiModelProperty(notes = "老用户充值次数")
+    private Long oldUserRechargeCount;
+
+    @ApiModelProperty(notes = "老用户充值人数")
+    private Long oldUserRechargeUser;
+
+    @ApiModelProperty(notes = "老用户充值金额")
+    private BigDecimal oldUserRechargeMoney;
+
+    @ApiModelProperty(notes = "账面充值次数")
+    private Long showRechargeCount;
+
+    @ApiModelProperty(notes = "账面充值人数")
+    private Long showRechargeUser;
+
+    @ApiModelProperty(notes = "账面充值金额")
+    private BigDecimal showRechargeMoney;
+
+    @ApiModelProperty(notes = "新用户累计充值次数")
+    private Long newUserRechargeCount;
+
+    @ApiModelProperty(notes = "新用户累计充值人数")
+    private Long newUserRechargeUser;
+
+    @ApiModelProperty(notes = "新用户累计充值金额")
+    private BigDecimal newUserRechargeMoney;
+
+    @ApiModelProperty(notes = "首日ROI=首日新用户充值金额/实际消耗")
+    private BigDecimal firstRecoveryRate;
+
+    @ApiModelProperty(notes = "当日回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal todayRecoveryRate;
+
+    @ApiModelProperty(notes = "买量回收率=新用户累计充值金额/实际消耗")
+    private BigDecimal buyRecoveryRate;
+
+    @ApiModelProperty(notes = "毛利额=新用户累计充值金额-实际消耗")
+    private BigDecimal grossMargin;
+
+    @ApiModelProperty(notes = "3日ROI=新用户3日累计充值金额/实际消耗")
+    private BigDecimal roiDay3;
+
+    @ApiModelProperty(notes = "5日ROI=新用户5日累计充值金额/实际消耗")
+    private BigDecimal roiDay5;
+
+    @ApiModelProperty(notes = "7日ROI=新用户7日累计充值金额/实际消耗")
+    private BigDecimal roiDay7;
+
+    @ApiModelProperty(notes = "15日ROI=新用户15日累计充值金额/实际消耗")
+    private BigDecimal roiDay15;
+
+    @ApiModelProperty(notes = "30日ROI=新用户30日累计充值金额/实际消耗")
+    private BigDecimal roiDay30;
+
+    @ApiModelProperty(notes = "60日ROI=新用户60日累计充值金额/实际消耗")
+    private BigDecimal roiDay60;
+
+    @ApiModelProperty(notes = "180日ROI=新用户180日累计充值金额/实际消耗")
+    private BigDecimal roiDay180;
+
+    @ApiModelProperty(notes = "一年ROI=新用户一年累计充值金额/实际消耗")
+    private BigDecimal roiYear1;
+
+    @ApiModelProperty(notes = "首日付费率=首日新用户充值人数/注册人数")
+    private BigDecimal firstRechargeRate;
+
+    @ApiModelProperty(notes = "买量用户付费率=新用户累计充值人数/注册人数")
+    private BigDecimal buyUserRechargeRate;
+
+    @ApiModelProperty(notes = "新用户付费比=首日新用户充值人数/账面充值人数")
+    private BigDecimal newUserRechargeRate;
+
+    @ApiModelProperty(notes = "首日客单价=首日新用户充值金额/首日新用户充值次数")
+    private BigDecimal avgFirstUserRecharge;
+
+    @ApiModelProperty(notes = "买量客单价=新用户累计充值金额/新用户累计充值次数")
+    private BigDecimal avgBuyUserRecharge;
+
+    @ApiModelProperty(notes = "账面客单价=账面充值金额/账面充值次数")
+    private BigDecimal avgShowUserRecharge;
+
+    @ApiModelProperty(notes = "首日充值成本=实际消耗/首日新用户充值人数")
+    private BigDecimal firstRechargeCost;
+
+    @ApiModelProperty(notes = "买量充值成本=实际消耗/新用户累计充值人数")
+    private BigDecimal buyUserRechargeCost;
+
+    @ApiModelProperty(notes = "复充率=新用户复充人数/新用户累计充值人数")
+    private BigDecimal repeatRechargeRate;
+
+    @ApiModelProperty(notes = "新增注册Arpu=新用户累计充值金额/注册人数")
+    private BigDecimal newRegArpu;
+
+    @ApiModelProperty(notes = "首日付费Arpu=首日新用户充值金额/首日新用户充值人数")
+    private BigDecimal firstRechargeArpu;
+
+    @ApiModelProperty(notes = "买付费Arpu=新用户累计充值金额/新用户累计充值人数")
+    private BigDecimal todayRechargeArpu;
+
+    @ApiModelProperty(notes = "账面Arpu=账面充值金额/账面充值人数")
+    private BigDecimal showRechargeArpu;
+
+    @ApiModelProperty(notes = "单日付费100+人数")
+    private String hundredUserNum;
+
+    @ApiModelProperty(notes = "单日付费100+成本")
+    private String hundredUserNumCost;
+}

+ 32 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAccountAgentDayService.java

@@ -0,0 +1,32 @@
+package com.zanxiang.game.data.serve.service;
+
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteTotalDTO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteTotalVO;
+import com.zanxiang.game.data.serve.utils.Page;
+
+public interface IAccountAgentDayService {
+    /**
+     * 推广每日数据
+     * @param dto
+     * @return
+     */
+    Page<GamePromoteDayVO> accountAgentDay(GamePromoteDayDTO dto);
+
+    /**
+     * 推广每日数据总计栏
+     * @param dto
+     * @return
+     */
+    GamePromoteDayTotalVO accountAgentDayTotal(GamePromoteDayTotalDTO dto);
+
+    /**
+     * 推广总数据
+     * @param dto
+     * @return
+     */
+    Page<GamePromoteTotalVO> accountAgentTotal(GamePromoteTotalDTO dto);
+}

+ 535 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AccountAgentDayServiceImpl.java

@@ -0,0 +1,535 @@
+package com.zanxiang.game.data.serve.service.impl;
+
+import com.google.gson.Gson;
+import com.zanxiang.erp.security.util.SecurityUtil;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteTotalDTO;
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameDay;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteTotalVO;
+import com.zanxiang.game.data.serve.service.IAccountAgentDayService;
+import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.DateUtil;
+import lombok.Builder;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.nutz.dao.Cnd;
+import org.nutz.dao.Dao;
+import org.nutz.dao.Sqls;
+import org.nutz.dao.entity.Entity;
+import org.nutz.dao.pager.Pager;
+import org.nutz.dao.sql.Criteria;
+import org.nutz.dao.sql.GroupBy;
+import org.nutz.dao.sql.Sql;
+import org.nutz.dao.util.Daos;
+import org.nutz.dao.util.cri.SimpleCriteria;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
+    @Autowired
+    private Dao dao;
+
+    @Override
+    public Page<GamePromoteDayVO> accountAgentDay(GamePromoteDayDTO dto) {
+        Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
+        sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
+        dto.setSysUserId(sysUserId);
+        if (null == dto.getBeginDay() || null == dto.getEndDay()){
+            dto.setBeginDay(LocalDate.now());
+            dto.setEndDay(LocalDate.now());
+        }
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        // 组装条件
+        if (null != dto.getSysUserId()) {
+            cri.where().andEquals("pitcher_id", dto.getSysUserId());
+        }
+        if (null != dto.getAccountId()) {
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (null != dto.getAgentId()) {
+            cri.where().andEquals("agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andLike("game_cp", dto.getCpName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            cri.where().andLike("game_name", dto.getGameName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameType())) {
+            cri.where().andEquals("game_type", dto.getGameType());
+        }
+        if (null != dto.getBeginDay()) {
+            cri.where().and("dt", ">=", dto.getBeginDay());
+        }
+        if (null != dto.getEndDay()) {
+            cri.where().and("dt", "<=", dto.getEndDay());
+        }
+        Sql sql = Sqls.queryEntity(accountAgentDaySql() + "$condition" + " order by dt desc");
+        sql.setPager(pager);
+        Entity<GamePromoteDayVO> entity = dao.getEntity(GamePromoteDayVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        dao.execute(sql);
+        pager.setRecordCount(dao.count(AdsAccountAgentDay.class, cri));
+        return new Page<>(sql.getList(GamePromoteDayVO.class), pager);
+    }
+
+    @Override
+    public GamePromoteDayTotalVO accountAgentDayTotal(GamePromoteDayTotalDTO dto) {
+        Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
+        sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
+        dto.setSysUserId(sysUserId);
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        // 组装条件
+        if (null != dto.getSysUserId()) {
+            cri.where().andEquals("pitcher_id", dto.getSysUserId());
+        }
+        if (null != dto.getAccountId()) {
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (null != dto.getAgentId()) {
+            cri.where().andEquals("agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andLike("game_cp", dto.getCpName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            cri.where().andLike("game_name", dto.getGameName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameType())) {
+            cri.where().andEquals("game_type", dto.getGameType());
+        }
+        if (null != dto.getBeginDay()) {
+            cri.where().and("dt", ">=", dto.getBeginDay());
+        }
+        if (null != dto.getEndDay()) {
+            cri.where().and("dt", "<=", dto.getEndDay());
+        }
+        Sql sql = Sqls.queryEntity(accountAgentDayTotalSql() + "$condition");
+        Entity<GamePromoteDayTotalVO> entity = dao.getEntity(GamePromoteDayTotalVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        dao.execute(sql);
+        return sql.getObject(GamePromoteDayTotalVO.class);
+    }
+
+    @Override
+    public Page<GamePromoteTotalVO> accountAgentTotal(GamePromoteTotalDTO dto) {
+        boolean hasRechargeDate = true;
+        Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
+        sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
+        dto.setSysUserId(sysUserId);
+        if (null == dto.getCostEndDay() || null == dto.getCostBeginDay()){
+            dto.setCostBeginDay(LocalDate.now());
+            dto.setCostEndDay(LocalDate.now());
+        }
+        if (null == dto.getRechargeEndDay() || null == dto.getRechargeBeginDay()){
+            hasRechargeDate = false;
+            dto.setRechargeEndDay(dto.getCostEndDay());
+            dto.setRechargeBeginDay(dto.getCostBeginDay());
+        }
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        // 创建一个 Criteria 接口实例
+        SimpleCriteria cri = Cnd.cri();
+        // 组装条件
+        if (null != dto.getSysUserId()) {
+            cri.where().andEquals("a.pitcher_id", dto.getSysUserId());
+        }
+        if (null != dto.getAccountId()) {
+            cri.where().andEquals("a.account_id", dto.getAccountId());
+        }
+        if (null != dto.getAgentId()) {
+            cri.where().andEquals("a.agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andLike("a.game_cp", dto.getCpName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameName())) {
+            cri.where().andLike("a.game_name", dto.getGameName());
+        }
+        if (StringUtils.isNotBlank(dto.getGameType())) {
+            cri.where().andEquals("a.game_type", dto.getGameType());
+        }
+        if (null != dto.getCostBeginDay()) {
+            cri.where().and("a.dt", ">=", dto.getCostBeginDay());
+        }
+        if (null != dto.getCostEndDay()) {
+            cri.where().and("a.dt", "<=", dto.getCostEndDay());
+        }
+        cri.groupBy("a.account_id,a.agent_id");
+        Sql sql = Sqls.queryEntity(accountAgentTotalSql() + "$condition");
+        sql.setPager(pager);
+        Entity<GamePromoteTotalVO> entity = dao.getEntity(GamePromoteTotalVO.class);
+        sql.setEntity(entity).setCondition(cri);
+        sql.setParam("rechargeBeginDay",dto.getRechargeBeginDay());
+        sql.setParam("rechargeEndDay",dto.getRechargeEndDay());
+        dao.execute(sql);
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_account_agent_day a " + "$condition");
+        sqlCount.setCondition(cri);
+        pager.setRecordCount((int) Daos.queryCount(dao,sqlCount));
+        List<GamePromoteTotalVO> list = sql.getList(GamePromoteTotalVO.class);
+
+        //存在充值时间,获取表ads_dayn_amount的json数据
+        if (hasRechargeDate) {
+            Map<String, Object> dayNMap = new HashMap<>(4);
+            dayNMap.put("beginDay", dto.getRechargeBeginDay());
+            dayNMap.put("endDay", dto.getRechargeEndDay());
+
+            //循环总数据的每条数据
+            List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
+                Sql sqlDayN = Sqls.queryString("select dayN from ads_dayn_amount where " +
+                        "dt>=@beginDay and dt<=@endDay " +
+                        "and account_id = @accountId " +
+                        "and agent_id = @agentId");
+                dayNMap.put("accountId", item.getAccountId());
+                dayNMap.put("agentId", item.getAgentId());
+                sqlDayN.setParams(dayNMap);
+                dao.execute(sqlDayN);
+                List<String> dayNList = sqlDayN.getList(String.class);
+                DayN dayN = null;
+                //ads_dayn_amount存在充值数据
+                if (!CollectionUtils.isEmpty(dayNList)) {
+                    Gson gson = new Gson();
+                    List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
+
+                    Map<String, String> resultMap = new HashMap<>();
+                    resultMap.put("dayN", "0.00-0-0");
+                    for (Map<String, String> jsonMap : jsonList) {
+                        for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
+                            String key = entry.getKey();
+                            String value = entry.getValue();
+                            String[] parts = value.split("-");
+                            if (DateUtil.parseLocalDate(key).compareTo(dto.getRechargeBeginDay()) >= 0
+                                    && DateUtil.parseLocalDate(key).compareTo(dto.getRechargeEndDay()) <= 0) {
+                                String[] existingParts = resultMap.get("dayN").split("-");
+                                BigDecimal money = new BigDecimal(existingParts[0]).add(new BigDecimal(parts[0]));
+                                int count = Integer.parseInt(existingParts[1]) + Integer.parseInt(parts[1]);
+                                int num = Integer.parseInt(existingParts[2]) + Integer.parseInt(parts[2]);
+                                String newValue = money + "-" + count + "-" + num;
+                                resultMap.put("dayN", newValue);
+                            }
+                        }
+                    }
+                    if (!resultMap.isEmpty() && !resultMap.get("dayN").isEmpty()) {
+                        String[] parts = resultMap.get("dayN").split("-");
+                        dayN = DayN.builder()
+                                .rechargeMoney(new BigDecimal(parts[0]))
+                                .rechargeCount(Long.valueOf(parts[1]))
+                                .rechargeNum(Long.valueOf(parts[2]))
+                                .build();
+                    }
+                }
+                //充值时间范围内存在充值数据
+                if (null != dayN) {
+                    item.setUserRechargeMoney(dayN.getRechargeMoney());
+                    item.setUserRechargeCount(dayN.getRechargeCount());
+                    item.setUserRechargeUser(dayN.getRechargeNum());
+
+                    item.setOldUserRechargeMoney(item.getShowRechargeMoney().subtract(dayN.getRechargeMoney()));
+                    item.setOldUserRechargeCount(item.getShowRechargeCount() - dayN.getRechargeCount());
+                    item.setOldUserRechargeUser(item.getShowRechargeUser() - dayN.getRechargeNum());
+                }
+                return item;
+            }).collect(Collectors.toList());
+            return new Page<>(hasRechargeDayList, pager);
+        }
+        return new Page<>(list, pager);
+    }
+
+    /**
+     * 推广每日数据SQL
+     * @return
+     */
+    private String accountAgentDaySql() {
+        return """
+                select
+                	concat( dt, account_id, agent_id ) AS id,
+                	agent_id,
+                	agent_name,
+                	account_id,
+                	agent_id,
+                	pitcher AS sys_user_name,
+                	game_cp AS cp_name,
+                	game_name,
+                	game_type,
+                	dt AS cost_day,
+                	pitcher_id AS sys_user_id,
+                	cost,
+                	plan_count AS ad_plan_count,
+                	view_count,
+                	click_count,
+                	change_count AS convert_count,
+                	change_rate AS convert_rate,
+                	avg_change_price AS avg_convert_cost,
+                	depth_change_count AS deep_convert_count,
+                	depth_change_rate AS deep_convert_rate,
+                	avg_depth_change_price AS deep_convert_cost,
+                	thousand_display_price AS thousand_view_cost,
+                	click_rate,
+                	avg_click_price AS avg_click_cost,
+                	download_start AS app_download_count,
+                	download_start_cost AS app_download_cost,
+                	download_start_rate AS app_download_rate,
+                	download_finish,
+                	download_finish_cost,
+                	download_finish_rate,
+                	install_finish AS app_install_count,
+                	install_finish_cost AS app_install_cost,
+                	install_finish_rate AS app_install_rate,
+                	active AS app_active_count,
+                	active_cost AS app_active_cost,
+                	active_rate AS app_active_rate,
+                	register_num AS reg_user_count,
+                	register_cost AS reg_cost,
+                	first_new_user_amount_count AS first_user_recharge_count,
+                	first_new_user_amount_num AS first_user_recharge_user,
+                	first_new_user_amount AS first_user_recharge_money,
+                	amount_count AS show_recharge_count,
+                	amount_num AS show_recharge_user,
+                	amount AS show_recharge_money,
+                	old_amount_count AS old_user_recharge_count,
+                	old_amount_num AS old_user_recharge_user,
+                	old_amount AS old_user_recharge_money,
+                	new_user_total_amount_count AS new_user_recharge_count,
+                	new_user_total_amount_num AS new_user_recharge_user,
+                	new_user_total_amount AS new_user_recharge_money,
+                	today_roi AS today_recovery_rate,
+                	first_roi AS first_recovery_rate,
+                	buy_roi AS buy_recovery_rate,
+                	gross_profit AS gross_margin,
+                	roi3 AS roi_day3,
+                	roi5 AS roi_day5,
+                	roi7 AS roi_day7,
+                	roi15 AS roi_day15,
+                	roi30 AS roi_day30,
+                	roi60 AS roi_day60,
+                	roi180 AS roi_day180,
+                	roi1yaer AS roi_year1,
+                	first_rate AS first_recharge_rate,
+                	buy_user_rate AS buy_user_recharge_rate,
+                	today_rate AS new_user_recharge_rate,
+                	first_avg AS avg_first_user_recharge,
+                	buy_avg AS avg_buy_user_recharge,
+                	paper_avg AS avg_show_user_recharge,
+                	first_amount_cost AS first_recharge_cost,
+                	buy_amount_cost AS buy_user_recharge_cost,
+                	today_again_rate AS repeat_recharge_rate,
+                	new_reg_arpu,
+                	first_arpu AS first_recharge_arpu,
+                	today_arpu AS today_recharge_arpu,
+                	paper_arpu AS show_recharge_arpu,
+                	amount_d1 AS recharge_trend_day1,
+                	amount_d3 AS recharge_trend_day3,
+                	amount_d7 AS recharge_trend_day7,
+                	amount_d15 AS recharge_trend_day15,
+                	amount_m1 AS recharge_trend_month1,
+                	amount_m2 AS recharge_trend_month2,
+                	amount_m3 AS recharge_trend_month3,
+                	amount_sum AS recharge_trend_total,
+                	hundred_user_num,
+                	hundred_user_num_cost
+                from
+                	ads_account_agent_day
+                """;
+    }
+
+    /**
+     * 推广每日数据总计SQL
+     * @return
+     */
+    private String accountAgentDayTotalSql() {
+        return """
+                select
+                	sum(cost) as cost,
+                	sum(plan_count) as ad_plan_count,
+                	sum(view_count) as view_count,
+                	sum(click_count) as click_count,
+                	sum(change_count) as convert_count,
+                	round(if(sum(click_count) > 0, sum(change_count) / sum(click_count), 0), 4) as convert_rate,
+                	round(if(sum(change_count) > 0, sum(cost) / sum(change_count), 0), 2) as avg_convert_cost,
+                	sum(depth_change_count) as deep_convert_count,
+                	round(if(sum(change_count) > 0, sum(depth_change_count) / sum(change_count), 0), 4) as deep_convert_rate,
+                	round(if(sum(depth_change_count) > 0, sum(cost) / sum(depth_change_count), 0), 2) as deep_convert_cost,
+                	round(if(sum(view_count) > 0, sum(cost) / sum(view_count) * 1000, 0), 2) as thousand_view_cost,
+                	round(if(sum(view_count) > 0, sum(click_count) / sum(view_count), 0), 4) as click_rate,
+                	round(if(sum(click_count) > 0, sum(cost) / sum(click_count), 0), 2) as avg_click_cost,
+                	sum(download_start) as app_download_count,
+                	round(if(sum(download_start) > 0, sum(cost) / sum(download_start), 0), 2) as app_download_cost,
+                	round(if(sum(click_count) > 0, sum(download_start) / sum(click_count), 0), 4) as app_download_rate,
+                	sum(download_finish) as download_finish,
+                	round(if(sum(download_finish) > 0, sum(cost) / sum(download_finish), 0), 2) as download_finish_cost,
+                	round(if(sum(download_start) > 0, sum(download_finish) / sum(download_start), 0), 4) as download_finish_rate,
+                	sum(install_finish) as app_install_count,
+                	round(if(sum(install_finish) > 0, sum(cost) / sum(install_finish), 0), 2) as app_install_cost,
+                	round(if(sum(download_finish) > 0, sum(install_finish) / sum(download_finish), 0), 4) as app_install_rate,
+                	sum(active) as app_active_count,
+                	round(if(sum(active) > 0, sum(cost) / sum(active), 0), 2) as app_active_cost,
+                	round(if(sum(click_count) > 0, sum(active) / sum(click_count), 0), 4) as app_active_rate,
+                	sum(register_num) as reg_user_count,
+                	round(if(sum(register_num) > 0, sum(cost) / sum(register_num), 0), 2) as reg_cost,
+                	sum(first_new_user_amount_count) as first_user_recharge_count,
+                	sum(first_new_user_amount_num) as first_user_recharge_user,
+                	sum(first_new_user_amount) as first_user_recharge_money,
+                	sum(amount_count) as show_recharge_count,
+                	sum(amount_num) as show_recharge_user,
+                	sum(amount) as show_recharge_money,
+                	sum(old_amount_count) as old_user_recharge_count,
+                	sum(old_amount_num) as old_user_recharge_user,
+                	sum(old_amount) as old_user_recharge_money,
+                	sum(new_user_total_amount_count) as new_user_recharge_count,
+                	sum(new_user_total_amount_num) as new_user_recharge_user,
+                	sum(new_user_total_amount) as new_user_recharge_money,
+                	round(if(sum(cost) > 0, sum(first_new_user_amount) / sum(cost), 0), 4) as first_recovery_rate,
+                	round(if(sum(cost) > 0, sum(new_user_total_amount) / sum(cost), 0), 4) as today_recovery_rate,
+                	round(if(sum(cost) > 0, sum(buy_new_user_total_amount) / sum(cost), 0), 4) as buy_recovery_rate,
+                	sum(gross_profit) as gross_margin,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d3, '/', 1)) / sum(cost), 0), 4) as roi_day3,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d5, '/', 1)) / sum(cost), 0), 4) as roi_day5,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d7, '/', 1)) / sum(cost), 0), 4) as roi_day7,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d15, '/', 1)) / sum(cost), 0), 4) as roi_day15,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m1, '/', 1)) / sum(cost), 0), 4) as roi_day30,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m2, '/', 1)) / sum(cost), 0), 4) as roi_day60,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m6, '/', 1)) / sum(cost), 0), 4) as roi_day180,
+                	round(if(sum(cost) > 0, sum(SPLIT_PART(amount_y1, '/', 1)) / sum(cost), 0), 4) as roi_year1,
+                	round(if(sum(register_num) > 0, sum(first_new_user_amount_num) / sum(register_num), 0), 4) as first_recharge_rate,
+                	round(if(sum(register_num) > 0, sum(buy_new_user_total_amount_num) / sum(register_num), 0), 4) as buy_user_recharge_rate,
+                	round(if(sum(register_num) > 0, sum(new_user_total_amount_num) / sum(register_num), 0), 4) as new_user_recharge_rate,
+                	round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
+                	round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
+                	round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 4) as avg_show_user_recharge,
+                	round(if(sum(first_new_user_amount_num) > 0, sum(cost) / sum(first_new_user_amount_num), 0), 4) as first_recharge_cost,
+                	round(if(sum(buy_new_user_total_amount_num) > 0, sum(cost) / sum(buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
+                	round(if(sum(new_user_total_amount_num) > 0, sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
+                	round(if(sum(register_num) > 0, sum(new_user_total_amount) / sum(register_num), 0), 4) 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), 4) as first_recharge_arpu,
+                	round(if(sum(new_user_total_amount_num) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 4) as today_recharge_arpu,
+                	round(if(sum(amount_num) > 0, sum(amount) / sum(amount_num), 0), 4) as show_recharge_arpu,
+                	sum(hundred_user_num) as hundred_user_num,
+                	round(if(sum(hundred_user_num) > 0, sum(cost) / sum(hundred_user_num), 0), 4) as hundred_user_num_cost
+                from
+                	ads_account_agent_day
+                """;
+    }
+
+    /**
+     * 推广总数据SQL
+     * @return
+     */
+    private String accountAgentTotalSql() {
+        return """
+                select
+                	concat(a.account_id, a.agent_id) as id,
+                	a.account_id,
+                	a.agent_id,
+                	max(a.agent_name) as agent_name,
+                	max(a.account_type) as account_type,
+                	max(a.pitcher) as sys_user_name,
+                	max(a.game_cp) as cp_name,
+                	max(a.game_name) as game_name,
+                	max(a.game_type) as game_type,
+                	max(a.pitcher_id) as sys_user_id,
+                	sum(a.cost) as cost,
+                	sum(a.plan_count) as ad_plan_count,
+                	sum(a.view_count) as view_count,
+                	sum(a.click_count) as click_count,
+                	sum(a.change_count) as convert_count,
+                	round(if(sum(a.click_count) > 0, sum(a.change_count) / sum(a.click_count), 0), 4) as convert_rate,
+                	round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 2) as avg_convert_cost,
+                	sum(a.depth_change_count) as deep_convert_count,
+                	round(if(sum(a.change_count) > 0, sum(a.depth_change_count) / sum(a.change_count), 0), 4) as deep_convert_rate,
+                	round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 2) as deep_convert_cost,
+                	round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 2) as thousand_view_cost,
+                	round(if(sum(a.view_count) > 0, sum(a.click_count) / sum(a.view_count), 0), 4) as click_rate,
+                	round(if(sum(a.click_count) > 0, sum(a.cost) / sum(a.click_count), 0), 2) as avg_click_cost,
+                	sum(a.download_start) as app_download_count,
+                	round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 2) as app_download_cost,
+                	round(if(sum(a.click_count) > 0, sum(a.download_start) / sum(a.click_count), 0), 4) as app_download_rate,
+                	sum(a.download_finish) as download_finish,
+                	round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 2) as download_finish_cost,
+                	round(if(sum(a.download_start) > 0, sum(a.download_finish) / sum(a.download_start), 0), 4) as download_finish_rate,
+                	sum(a.install_finish) as app_install_count,
+                	round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 2) as app_install_cost,
+                	round(if(sum(a.download_finish) > 0, sum(a.install_finish) / sum(a.download_finish), 0), 4) as app_install_rate,
+                	sum(a.active) as app_active_count,
+                	round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 2) as app_active_cost,
+                	round(if(sum(a.click_count) > 0, sum(a.active) / sum(a.click_count), 0), 4) as app_active_rate,
+                	sum(a.register_num) as reg_user_count,
+                	round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 2) as reg_cost,
+                	sum(a.first_new_user_amount_count) as first_user_recharge_count,
+                	sum(a.first_new_user_amount_num) as first_user_recharge_user,
+                	sum(a.first_new_user_amount) as first_user_recharge_money,
+                	sum(a.first_new_user_amount_count) as user_recharge_count,
+                	sum(a.first_new_user_amount_num) as user_recharge_user,
+                	sum(a.first_new_user_amount) as user_recharge_money,
+                	sum(b.amount_count) as show_recharge_count,
+                	sum(b.amount_num) as show_recharge_user,
+                	sum(b.amount) as show_recharge_money,
+                	sum(a.old_amount_count) as old_user_recharge_count,
+                	sum(a.old_amount_num) as old_user_recharge_user,
+                	sum(a.old_amount) as old_user_recharge_money,
+                	sum(a.new_user_total_amount_count) as new_user_recharge_count,
+                	sum(a.new_user_total_amount_num) as new_user_recharge_user,
+                	sum(a.new_user_total_amount) as new_user_recharge_money,
+                	round(if(sum(a.cost) > 0, sum(a.first_new_user_amount) / sum(a.cost), 0), 4) as first_recovery_rate,
+                	round(if(sum(a.cost) > 0, sum(a.new_user_total_amount) / sum(a.cost), 0), 4) as today_recovery_rate,
+                	round(if(sum(a.cost) > 0, sum(a.buy_new_user_total_amount) / sum(a.cost), 0), 4) as buy_recovery_rate,
+                	sum(a.gross_profit) as gross_margin,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d3, '/', 1)) / sum(a.cost), 0), 4) as roi_day3,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d5, '/', 1)) / sum(a.cost), 0), 4) as roi_day5,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d7, '/', 1)) / sum(a.cost), 0), 4) as roi_day7,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d15, '/', 1)) / sum(a.cost), 0), 4) as roi_day15,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m1, '/', 1)) / sum(a.cost), 0), 4) as roi_day30,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m2, '/', 1)) / sum(a.cost), 0), 4) as roi_day60,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m6, '/', 1)) / sum(a.cost), 0), 4) as roi_day180,
+                	round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_y1, '/', 1)) / sum(a.cost), 0), 4) as roi_year1,
+                	round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
+                	round(if(sum(a.register_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.register_num), 0), 4) as buy_user_recharge_rate,
+                	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as new_user_recharge_rate,
+                	round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
+                	round(if(sum(a.buy_new_user_total_amount_count) > 0, sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
+                	round(if(sum(a.amount_count) > 0, sum(a.amount) / sum(a.amount_count), 0), 4) as avg_show_user_recharge,
+                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
+                	round(if(sum(a.buy_new_user_total_amount_num) > 0, sum(a.cost) / sum(a.buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
+                	round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
+                	round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
+                	round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,
+                	round(if(sum(a.amount_num) > 0, sum(a.amount) / sum(a.amount_num), 0), 4) as show_recharge_arpu,
+                	sum(a.hundred_user_num) as hundred_user_num,
+                	round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
+                from
+                	ads_account_agent_day a
+                left join game_ads.ads_account_agent_day b on
+                	b.pitcher_id = a.pitcher_id
+                	and b.agent_id = a.agent_id
+                	and b.account_id = a.account_id
+                	and b.dt >= @rechargeBeginDay
+                	and b.dt <= @rechargeEndDay
+                """;
+    }
+
+    @Data
+    @Builder
+    public static class DayN{
+        private BigDecimal rechargeMoney;
+        private Long rechargeCount;
+        private Long rechargeNum;
+    }
+}