Selaa lähdekoodia

:feat:1、腾讯创意列表 2、游戏月留存

zhangxianyu 3 kuukautta sitten
vanhempi
commit
00601bff86
18 muutettua tiedostoa jossa 7146 lisäystä ja 8 poistoa
  1. 54 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsCreativeDayController.java
  2. 0 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java
  3. 13 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java
  4. 132 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/TencentCreativeDayDTO.java
  5. 479 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveOrderMonth.java
  6. 481 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveOrderMonthParent.java
  7. 497 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRegMonth.java
  8. 497 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRegMonthParent.java
  9. 479 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRoleMonth.java
  10. 479 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRoleMonthParent.java
  11. 308 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/ActiveDataMonthTotalVO.java
  12. 346 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/ActiveDataMonthVO.java
  13. 994 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/TencentCreativeDayTotalVO.java
  14. 872 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/TencentCreativeDayVO.java
  15. 15 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IActiveDataService.java
  16. 25 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsCreativeDayService.java
  17. 721 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsCreativeDayServiceImpl.java
  18. 754 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/IActiveDataServiceImpl.java

+ 54 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsCreativeDayController.java

@@ -0,0 +1,54 @@
+package com.zanxiang.game.data.serve.controller;
+
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.data.serve.pojo.dto.TencentCreativeDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.TencentPromotionDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.TencentPromotionDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentCreativeDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentCreativeDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentPromotionDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentPromotionDayVO;
+import com.zanxiang.game.data.serve.service.IAdsCreativeDayService;
+import com.zanxiang.game.data.serve.service.IAdsPromotionDayService;
+import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author tianhua
+ * @time 2023/7/27
+ * @Description
+ **/
+@Api(tags = {"创意监控"})
+@RestController
+@RequestMapping("/creativeData")
+@Slf4j
+public class AdsCreativeDayController {
+
+
+    @Autowired
+    private IAdsCreativeDayService adsCreativeDayService;
+
+    @ApiOperation(value = "腾讯创意监控数据")
+    @PreAuthorize(permissionKey = "creativeData:adsCreativeDay:day")
+    @PostMapping("/tencent/day")
+    public ResultVO<Page<TencentCreativeDayVO>> getTencentCreativeDayData(@RequestBody TencentCreativeDayDTO dto) {
+        return ResultVO.ok(adsCreativeDayService.getTencentCreativeDayData(dto));
+    }
+
+    @ApiOperation(value = "腾讯创意监控数据总计")
+    @PreAuthorize(permissionKey = "creativeData:adsCreativeDay:total")
+    @PostMapping("/tencent/total")
+    public ResultVO<TencentCreativeDayTotalVO> getTencentCreativeTotalData(@RequestBody TencentCreativeDayDTO dto) {
+        return ResultVO.ok(adsCreativeDayService.getTencentCreativeTotalData(dto));
+    }
+
+
+}

+ 0 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java

@@ -64,7 +64,6 @@ public class AdsPromotionDayController {
         return ResultVO.ok(adsPromotionDayService.getPromotionDayTotalData(dto));
     }
 
-//    @Log(title = "腾讯广告监控")
     @ApiOperation(value = "腾讯广告监控数据")
     @PreAuthorize(permissionKey = "promotionData:adsAdGroupDay:day")
     @PostMapping("/tencent/day")

+ 13 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java

@@ -139,6 +139,19 @@ public class GameDataController {
         return ResultVO.ok(activeDataService.getActiveDataTotal(dto));
     }
 
+    @ApiOperation(value = "留存数据-月")
+//    @PreAuthorize(permissionKey = "gameData:activeDay:activeMonth")
+    @PostMapping("/activeData/month")
+    public ResultVO<Page<ActiveDataMonthVO>> getActiveDataMonth(@RequestBody ActiveDataDayDTO dto) {
+        return ResultVO.ok(activeDataService.getActiveDataMonth(dto));
+    }
+
+    @ApiOperation(value = "留存数据-月总计")
+    @PreAuthorize(permissionKey = "gameData:activeDay:activeMonthTotal")
+    @PostMapping("/activeData/monthTotal")
+    public ResultVO<ActiveDataMonthTotalVO> getActiveMonthDataTotal(@RequestBody ActiveDataTotalDTO dto) {
+        return ResultVO.ok(activeDataService.getActiveMonthDataTotal(dto));
+    }
 
     @ApiOperation(value = "游戏媒体留存数据")
     @PreAuthorize(permissionKey = "gameData:media:activeDay")

+ 132 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/TencentCreativeDayDTO.java

@@ -0,0 +1,132 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @time 2023/7/27
+ * @Description 前端传递的查询参数实体(腾讯创意)
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TencentCreativeDayDTO extends BasePage {
+
+    /**
+     * 消耗开始日期
+     */
+    @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 dynamicCreativeId;
+
+    /**
+     * 创意名称
+     */
+    @ApiModelProperty(value = "创意名称")
+    private String dynamicCreativeName;
+
+    /**
+     * 推广账号名称
+     */
+    @ApiModelProperty(value = "推广账号名称")
+    private String accountName;
+
+    /**
+     * 推广账号ID
+     */
+    @ApiModelProperty(value = "推广账号ID")
+    private Long accountId;
+
+    /**
+     * 投放媒体
+     */
+    @ApiModelProperty(value = "投放媒体")
+    private String accountType;
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
+    /**
+     * 渠道ID
+     */
+    @ApiModelProperty(value = "渠道ID")
+    private List<Long> agentId;
+
+    /**
+     * cp名称
+     */
+    @ApiModelProperty(value = "CP名称")
+    private String cpName;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty(value = "游戏ID")
+    private Long gameId;
+
+    /**
+     * 游戏应用类型
+     */
+    @ApiModelProperty(value = "游戏应用类型")
+    private Long classify;
+
+    /**
+     * 排序字段
+     */
+    @ApiModelProperty(notes = "排序字段")
+    private String sortFiled;
+
+    /**
+     * 排序方式:升序asc;降序desc
+     */
+    @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
+    private String sortType;
+
+}

+ 479 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveOrderMonth.java

@@ -0,0 +1,479 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveOrderMonth.TABLE_NAME)
+@PK({"dt", "gameId", "sourceSystem"})
+public class AdsGameActiveOrderMonth implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "ads_game_active_order_month";
+     
+    /**
+    * 用户注册时间
+    */
+    private LocalDate dt;
+    
+    /**
+    * SDK来源
+    */
+    private String sourceSystem;
+    
+    /**
+    * 游戏ID
+    */
+    private Long gameId;
+    
+    /**
+    * 游戏名称
+    */    
+    @Column
+    private String gameName;
+    
+    /**
+    * 游戏类别
+    */    
+    @Column
+    private Long gameClassify;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+}
+
+

+ 481 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveOrderMonthParent.java

@@ -0,0 +1,481 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveOrderMonthParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "sourceSystem"})
+public class AdsGameActiveOrderMonthParent implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "game_ads_parent.ads_game_active_order_month_parent";
+     
+    /**
+    * 用户注册时间
+    */
+    private LocalDate dt;
+    
+    /**
+    * SDK来源
+    */
+    private String sourceSystem;
+    
+    /**
+    * 游戏ID
+    */
+    private Long parentGameId;
+    
+    /**
+    * 游戏名称
+    */    
+    @Column
+    private String parentGameName;
+    
+    /**
+    * 游戏类别
+    */    
+    @Column
+    private Long parentGameClassify;
+
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+
+}
+
+

+ 497 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRegMonth.java

@@ -0,0 +1,497 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveRegMonth.TABLE_NAME)
+@PK({"dt", "gameId", "sourceSystem"})
+public class AdsGameActiveRegMonth implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "ads_game_active_reg_month";
+
+    /**
+     * 用户注册时间
+     */
+    private LocalDate dt;
+
+    /**
+     * SDK来源
+     */
+    private String sourceSystem;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @Column
+    private String gameName;
+
+    /**
+     * 游戏类别
+     */
+    @Column
+    private Long gameClassify;
+
+    /**
+     * 注册人数
+     */
+    @Column
+    private Long regNum;
+
+    /**
+     * 买量注册人数
+     */
+    @Column
+    private Long buyRegNum;
+
+    /**
+     * 自然量注册人数
+     */
+    @Column
+    private Long natureRegNum;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+}
+
+

+ 497 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRegMonthParent.java

@@ -0,0 +1,497 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveRegMonthParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "sourceSystem"})
+public class AdsGameActiveRegMonthParent implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "game_ads_parent.ads_game_active_reg_month_parent";
+     
+    /**
+    * 用户注册时间
+    */
+    private LocalDate dt;
+    
+    /**
+    * SDK来源
+    */
+    private String sourceSystem;
+    
+    /**
+    * 游戏ID
+    */
+    private Long parentGameId;
+    
+    /**
+    * 游戏名称
+    */    
+    @Column
+    private String parentGameName;
+    
+    /**
+    * 游戏类别
+    */    
+    @Column
+    private Long parentGameClassify;
+    
+    /**
+    * 注册人数
+    */    
+    @Column
+    private Long regNum;
+    
+    /**
+    * 买量注册人数
+    */    
+    @Column
+    private Long buyRegNum;
+    
+    /**
+    * 自然量注册人数
+    */    
+    @Column
+    private Long natureRegNum;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+}
+
+

+ 479 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRoleMonth.java

@@ -0,0 +1,479 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveRoleMonth.TABLE_NAME)
+@PK({"dt", "gameId", "sourceSystem"})
+public class AdsGameActiveRoleMonth implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "ads_game_active_role_month";
+     
+    /**
+    * 用户注册时间
+    */
+    private LocalDate dt;
+    
+    /**
+    * SDK来源
+    */
+    private String sourceSystem;
+    
+    /**
+    * 游戏ID
+    */
+    private Long gameId;
+    
+    /**
+    * 游戏名称
+    */    
+    @Column
+    private String gameName;
+    
+    /**
+    * 游戏类别
+    */    
+    @Column
+    private Long gameClassify;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+}
+
+

+ 479 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameActiveRoleMonthParent.java

@@ -0,0 +1,479 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.Data;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@Table(AdsGameActiveRoleMonthParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "sourceSystem"})
+public class AdsGameActiveRoleMonthParent implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "game_ads_parent.ads_game_active_role_month_parent";
+     
+    /**
+    * 用户注册时间
+    */
+    private LocalDate dt;
+    
+    /**
+    * SDK来源
+    */
+    private String sourceSystem;
+    
+    /**
+    * 游戏ID
+    */
+    private Long parentGameId;
+    
+    /**
+    * 游戏名称
+    */    
+    @Column
+    private String parentGameName;
+    
+    /**
+    * 游戏类别
+    */    
+    @Column
+    private Long parentGameClassify;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String totalM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String buyM24;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @Column
+    private String natureM24;
+
+}
+
+

+ 308 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/ActiveDataMonthTotalVO.java

@@ -0,0 +1,308 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 返回给前端的留存每日数据总计实体
+ **/
+@Data
+public class ActiveDataMonthTotalVO {
+
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m24;
+
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m1Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m2Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m3Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m4Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m5Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m6Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m7Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m8Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m9Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m10Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m11Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m12Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m13Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m14Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m15Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m16Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m17Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m18Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m19Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m20Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m21Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m22Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m23Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+       @ApiModelProperty(value = "第1-24月(活跃人数/留存率)")
+    private ActiveDataTrendVO m24Trend;
+
+   
+
+}

+ 346 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/ActiveDataMonthVO.java

@@ -0,0 +1,346 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @author tianhua
+ * @time 2023/7/12
+ * @Description 返回给前端的留存月数据实体
+ **/
+@Data
+public class ActiveDataMonthVO {
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty(value = "游戏ID")
+    private Long gameId;
+
+    /**
+     * 推广游戏名称
+     */
+    @ApiModelProperty(value = "游戏名称")
+    private String gameName;
+
+    /**
+     * 推广游戏应用类型
+     */
+    @ApiModelProperty(value = "游戏类型")
+    private Long gameClassify;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 注册时间
+     */
+    @ApiModelProperty(value = "注册时间(消耗时间)")
+    private LocalDate dt;
+
+    /**
+     * 注册人数
+     */
+    @ApiModelProperty(value = "注册人数")
+    private Long regNum;
+
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m1;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m2;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m3;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m4;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m5;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m6;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m7;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m8;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m9;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m10;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m11;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m12;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m13;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m14;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m15;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m16;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m17;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m18;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m19;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m20;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m21;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m22;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m23;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m24;
+
+
+   
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m1Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m2Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m3Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m4Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m5Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m6Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m7Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m8Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m9Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m10Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m11Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m12Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m13Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m14Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m15Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m16Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m17Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m18Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m19Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m20Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m21Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m22Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m23Trend;
+
+    /**
+     * 活跃人数/留存率
+     */
+    @ApiModelProperty(value = "第1-24月(展示的数据)")
+    private ActiveDataTrendVO m24Trend;
+
+
+
+}

+ 994 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/TencentCreativeDayTotalVO.java

@@ -0,0 +1,994 @@
+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 创意监控数据总计前端显示对象(腾讯创意)
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TencentCreativeDayTotalVO {
+
+    /**
+     * 今日消耗
+     */
+    @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;
+
+    /**
+     * 新增付费次数成本
+     */
+    @ApiModelProperty(value = "新增付费次数成本 = 消耗 / 新增付费次数")
+    private BigDecimal firstNewUserAmountCountCost;
+
+    /**
+     * 至今付费次数成本
+     */
+    @ApiModelProperty(value = "至今付费次数成本 = 消耗 / 至今付费数")
+    private BigDecimal newUserTotalAmountCountCost;
+
+    /**
+     * 总充值次数成本
+     */
+    @ApiModelProperty(value = "总充值次数成本 = 消耗 / 总充值次数")
+    private BigDecimal totalAmountCountCost;
+
+    /**
+     * 新增付费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;
+
+    /**
+     * 小游戏注册人数
+     */
+    @ApiModelProperty(value = "小游戏注册人数")
+    private Long miniGameRegisterUsers;
+
+    /**
+     * 小游戏注册成本
+     */
+    @ApiModelProperty(value = "小游戏注册成本")
+    private BigDecimal miniGameRegisterCost;
+
+    /**
+     * 小游戏注册率
+     */
+    @ApiModelProperty(value = "小游戏注册率")
+    private BigDecimal miniGameRegisterRate;
+
+    /**
+     * 小游戏付费次数
+     */
+    @ApiModelProperty(value = "小游戏付费次数")
+    private Long miniGamePayingCount;
+
+    /**
+     * 小游戏付费金额
+     */
+    @ApiModelProperty(value = "小游戏付费金额")
+    private BigDecimal miniGamePayingAmount;
+
+    /**
+     * 小游戏首日付费人数
+     */
+    @ApiModelProperty(value = "小游戏首日付费人数")
+    private Long miniGamePayingUsersD1;
+
+    /**
+     * 小游戏首日付费金额
+     */
+    @ApiModelProperty(value = "小游戏首日付费金额")
+    private BigDecimal miniGamePayingAmountD1;
+
+    /**
+     * 小游戏3日付费金额
+     */
+    @ApiModelProperty(value = "小游戏3日付费金额")
+    private BigDecimal miniGamePayingAmountD3;
+
+    /**
+     * 小游戏7日付费金额
+     */
+    @ApiModelProperty(value = "小游戏7日付费金额")
+    private BigDecimal miniGamePayingAmountD7;
+
+    /**
+     * 小游戏14日付费金额
+     */
+    @ApiModelProperty(value = "小游戏14日付费金额")
+    private BigDecimal miniGamePayingAmountD14;
+
+    /**
+     * 小游戏30日付费金额
+     */
+    @ApiModelProperty(value = "小游戏30日付费金额")
+    private BigDecimal miniGamePayingAmountD30;
+
+    /**
+     * 小游戏首次付费人数
+     */
+    @ApiModelProperty(value = "小游戏首次付费人数")
+    private Long miniGameFirstPayingUsers;
+
+    /**
+     * 小游戏首日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏首日付费ROI")
+    private BigDecimal miniGameFirstDayPayingRoi;
+
+    /**
+     * 小游戏付费ROI
+     */
+    @ApiModelProperty(value = "小游戏付费ROI")
+    private BigDecimal miniGamePayingRoi;
+
+    /**
+     * 小游戏付费ARPU
+     */
+    @ApiModelProperty(value = "小游戏付费ARPU")
+    private BigDecimal miniGamePayingArpu;
+
+    /**
+     * 小游戏3日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏3日付费ROI")
+    private BigDecimal miniGamePayD3Roi;
+
+    /**
+     * 小游戏7日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏7日付费ROI")
+    private BigDecimal miniGamePayD7Roi;
+
+    /**
+     * 小游戏14日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏14日付费ROI")
+    private BigDecimal miniGamePayD14Roi;
+
+    /**
+     * 小游戏30日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏30日付费ROI")
+    private BigDecimal miniGamePayD30Roi;
+
+    /**
+     * 小游戏首日付费次数
+     */
+    @ApiModelProperty(value = "小游戏首日付费次数")
+    private Long minigame1dPayCount;
+
+    /**
+     * 小游戏首24小时付费人数
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费人数")
+    private Long minigame24hPayUv;
+
+    /**
+     * 小游戏首24小时付费金额
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费金额")
+    private BigDecimal minigame24hPayAmount;
+
+    /**
+     * 小游戏首24小时付费ROI
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费ROI")
+    private BigDecimal minigame24hPayRoi;
+
+    /**
+     * 小游戏首24小时付费ARPU
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费ARPU")
+    private BigDecimal minigame24hPayArpu;
+
+    /**
+     * ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)
+     */
+    @ApiModelProperty(value = "ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)")
+    private BigDecimal ltvDay1;
+
+    /**
+     * ltv1(实际数据) (首日新用户充值金额 / 注册人数)
+     */
+    @ApiModelProperty(value = "ltv1(实际数据) (首日新用户充值金额 / 注册人数)")
+    private BigDecimal ltvDay1ActualData;
+
+    /**
+     * 每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))
+     */
+    @ApiModelProperty(value = "每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))")
+    private Long subOrderNum;
+
+    /**
+     * 每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )
+     */
+    @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
+    private BigDecimal subOrderAmount;
+
+    /**
+     * 是否删除 1:是 ; 0 否
+     */
+    @ApiModelProperty(value = "是否已删除 1:是 ; 0 否")
+    private Long isDeleted;
+
+    /**
+     * 客户设置的状态
+     */
+    @ApiModelProperty(value = "客户设置的状态")
+    private String configuredStatus;
+
+}

+ 872 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/TencentCreativeDayVO.java

@@ -0,0 +1,872 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @author tianhua
+ * @time 2023/7/27
+ * @Description 创意监控数据前端显示实体对象(腾讯广告)
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class TencentCreativeDayVO {
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private LocalDate dt;
+
+    /**
+     * 广告ID
+     */
+    @ApiModelProperty(value = "广告ID")
+    private Long promotionId;
+
+    /**
+     * 广告名称
+     */
+    @ApiModelProperty(value = "广告名称")
+    private String promotionName;
+
+    /**
+     * 创意id
+     */
+    @ApiModelProperty(value = "创意id")
+    private Long dynamicCreativeId;
+
+    /**
+     * 创意名称
+     */
+    @ApiModelProperty(value = "创意名称")
+    private String dynamicCreativeName;
+
+
+    /**
+     * 推广账号ID
+     */
+    @ApiModelProperty(value = "推广账号ID")
+    private Long accountId;
+
+    /**
+     * 推广账号名称
+     */
+    @ApiModelProperty(value = "推广账号名称")
+    private String accountName;
+
+    /**
+     * 投放媒体
+     */
+    @ApiModelProperty(value = "投放媒体")
+    private String accountType;
+
+    /**
+     * 投手ID
+     */
+    @ApiModelProperty(value = "投手ID")
+    private Long pitcherId;
+
+    /**
+     * 投手名称
+     */
+    @ApiModelProperty(value = "投手名称")
+    private String pitcherName;
+
+    /**
+     * 备注
+     */
+    @ApiModelProperty(value = "备注")
+    private String notes;
+
+    /**
+     * 服务商
+     */
+    @ApiModelProperty(value = "服务商")
+    private String service;
+
+    /**
+     * 余额
+     */
+    @ApiModelProperty(value = "余额")
+    private String balance;
+
+    /**
+     * 渠道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;
+
+    /**
+     * 广告状态
+     */
+    @ApiModelProperty(value = "广告状态")
+    private String status;
+
+    /**
+     * 创意预览
+     */
+    @ApiModelProperty(value = "创意预览")
+    private String creativePreview;
+
+    /**
+     * 推广目标
+     */
+    @ApiModelProperty(value = "推广目标")
+    private String landingType;
+
+    /**
+     * 出价方式
+     */
+    @ApiModelProperty(value = "出价方式")
+    private String pricing;
+
+    /**
+     * 当前出价
+     */
+    @ApiModelProperty(value = "当前出价")
+    private String cpaBid;
+
+    /**
+     * 深度转化ROI系数
+     */
+    @ApiModelProperty(value = "深度转化ROI系数")
+    private String roiGoal;
+
+    /**
+     * 日预算
+     */
+    @ApiModelProperty(value = "日预算")
+    private String budget;
+
+    /**
+     * 投放时间
+     */
+    @ApiModelProperty(value = "投放时间")
+    private String scheduleTime;
+
+    /**
+     * 今日消耗
+     */
+    @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 String convertTarget;
+
+    /**
+     * 转化目标量
+     */
+    @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;
+
+    /**
+     * 新增付费次数成本
+     */
+    @ApiModelProperty(value = "新增付费次数成本 = 消耗 / 新增付费次数")
+    private BigDecimal firstNewUserAmountCountCost;
+
+    /**
+     * 至今付费次数成本
+     */
+    @ApiModelProperty(value = "至今付费次数成本 = 消耗 / 至今付费数")
+    private BigDecimal newUserTotalAmountCountCost;
+
+    /**
+     * 总充值次数成本
+     */
+    @ApiModelProperty(value = "总充值次数成本 = 消耗 / 总充值次数")
+    private BigDecimal totalAmountCountCost;
+
+    /**
+     * 新增付费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,消耗时间的第7天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第7天新用户充值(不显示)")
+    private BigDecimal d7;
+
+    /**
+     * 计划ID,消耗时间的第15天新用户充值(不显示)
+     */
+    @ApiModelProperty(value = "计划ID,消耗时间的第15天新用户充值(不显示)")
+    private BigDecimal d15;
+
+
+
+    /**
+     * 付费趋势第1天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第1天总:金额/人数/增/回/倍(不显示)")
+    private String da1;
+
+    /**
+     * 付费趋势第2天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第2天总:金额/人数/增/回/倍(不显示)")
+    private String da2;
+
+    /**
+     * 付费趋势第3天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第3天总:金额/人数/增/回/倍(不显示)")
+    private String da3;
+
+    /**
+     * 付费趋势第7天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第7天总:金额/人数/增/回/倍(不显示)")
+    private String da7;
+
+    /**
+     * 付费趋势第15天总:金额/人数/增/回/倍(不显示)
+     */
+    @ApiModelProperty(value = "付费趋势第15天总:金额/人数/增/回/倍(不显示)")
+    private String da15;
+
+    /**
+     * 次日数据
+     */
+    @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;
+
+    /**
+     * 小游戏注册人数
+     */
+    @ApiModelProperty(value = "小游戏注册人数")
+    private Long miniGameRegisterUsers;
+
+    /**
+     * 小游戏注册成本
+     */
+    @ApiModelProperty(value = "小游戏注册成本")
+    private BigDecimal miniGameRegisterCost;
+
+    /**
+     * 小游戏注册率
+     */
+    @ApiModelProperty(value = "小游戏注册率")
+    private BigDecimal miniGameRegisterRate;
+
+    /**
+     * 小游戏付费次数
+     */
+    @ApiModelProperty(value = "小游戏付费次数")
+    private Long miniGamePayingCount;
+
+    /**
+     * 小游戏付费金额
+     */
+    @ApiModelProperty(value = "小游戏付费金额")
+    private BigDecimal miniGamePayingAmount;
+
+    /**
+     * 小游戏首日付费人数
+     */
+    @ApiModelProperty(value = "小游戏首日付费人数")
+    private Long miniGamePayingUsersD1;
+
+    /**
+     * 小游戏首日付费金额
+     */
+    @ApiModelProperty(value = "小游戏首日付费金额")
+    private BigDecimal miniGamePayingAmountD1;
+
+    /**
+     * 小游戏3日付费金额
+     */
+    @ApiModelProperty(value = "小游戏3日付费金额")
+    private BigDecimal miniGamePayingAmountD3;
+
+    /**
+     * 小游戏7日付费金额
+     */
+    @ApiModelProperty(value = "小游戏7日付费金额")
+    private BigDecimal miniGamePayingAmountD7;
+
+    /**
+     * 小游戏14日付费金额
+     */
+    @ApiModelProperty(value = "小游戏14日付费金额")
+    private BigDecimal miniGamePayingAmountD14;
+
+    /**
+     * 小游戏30日付费金额
+     */
+    @ApiModelProperty(value = "小游戏30日付费金额")
+    private BigDecimal miniGamePayingAmountD30;
+
+    /**
+     * 小游戏首次付费人数
+     */
+    @ApiModelProperty(value = "小游戏首次付费人数")
+    private Long miniGameFirstPayingUsers;
+
+    /**
+     * 小游戏首日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏首日付费ROI")
+    private BigDecimal miniGameFirstDayPayingRoi;
+
+    /**
+     * 小游戏付费ROI
+     */
+    @ApiModelProperty(value = "小游戏付费ROI")
+    private BigDecimal miniGamePayingRoi;
+
+    /**
+     * 小游戏付费ARPU
+     */
+    @ApiModelProperty(value = "小游戏付费ARPU")
+    private BigDecimal miniGamePayingArpu;
+
+    /**
+     * 小游戏3日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏3日付费ROI")
+    private BigDecimal miniGamePayD3Roi;
+
+    /**
+     * 小游戏7日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏7日付费ROI")
+    private BigDecimal miniGamePayD7Roi;
+
+    /**
+     * 小游戏14日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏14日付费ROI")
+    private BigDecimal miniGamePayD14Roi;
+
+    /**
+     * 小游戏30日付费ROI
+     */
+    @ApiModelProperty(value = "小游戏30日付费ROI")
+    private BigDecimal miniGamePayD30Roi;
+
+    /**
+     * 小游戏首日付费次数
+     */
+    @ApiModelProperty(value = "小游戏首日付费次数")
+    private Long minigame1dPayCount;
+
+    /**
+     * 小游戏首24小时付费人数
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费人数")
+    private Long minigame24hPayUv;
+
+    /**
+     * 小游戏首24小时付费金额
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费金额")
+    private BigDecimal minigame24hPayAmount;
+
+    /**
+     * 小游戏首24小时付费ROI
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费ROI")
+    private BigDecimal minigame24hPayRoi;
+
+    /**
+     * 小游戏首24小时付费ARPU
+     */
+    @ApiModelProperty(value = "小游戏首24小时付费ARPU")
+    private BigDecimal minigame24hPayArpu;
+
+    /**
+     * ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)
+     */
+    @ApiModelProperty(value = "ltv1 (首日付费金额(attribution_game_in_app_ltv1day) / 注册人数)")
+    private BigDecimal ltvDay1;
+
+    /**
+     * ltv1(实际数据) (首日新用户充值金额 / 注册人数)
+     */
+    @ApiModelProperty(value = "ltv1(实际数据) (首日新用户充值金额 / 注册人数)")
+    private BigDecimal ltvDay1ActualData;
+
+    /**
+     * 每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))
+     */
+    @ApiModelProperty(value = "每日扣单数 (广告首日总订单数 - 应用下载广告数据-付费次数(game_pay_count))")
+    private Long subOrderNum;
+
+    /**
+     * 每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )
+     */
+    @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
+    private BigDecimal subOrderAmount;
+
+    /**
+     * 是否删除 1:是 ; 0 否
+     */
+    @ApiModelProperty(value = "是否已删除 1:是 ; 0 否")
+    private Long isDeleted;
+
+    /**
+     * 客户设置的状态
+     */
+    @ApiModelProperty(value = "客户设置的状态")
+    private String configuredStatus;
+
+}

+ 15 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IActiveDataService.java

@@ -3,10 +3,7 @@ package com.zanxiang.game.data.serve.service;
 import com.zanxiang.game.data.serve.pojo.dto.ActiveDataDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.ActiveDataTotalDTO;
 import com.zanxiang.game.data.serve.pojo.dto.MediaActiveDataDayDTO;
-import com.zanxiang.game.data.serve.pojo.vo.ActiveDataDayVO;
-import com.zanxiang.game.data.serve.pojo.vo.ActiveDataTotalVO;
-import com.zanxiang.game.data.serve.pojo.vo.MediaActiveDataDayVO;
-import com.zanxiang.game.data.serve.pojo.vo.MediaActiveDataTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.utils.Page;
 
 public interface IActiveDataService {
@@ -28,4 +25,18 @@ public interface IActiveDataService {
      * @return
      */
     MediaActiveDataTotalVO getMediaActiveDataTotal(MediaActiveDataDayDTO dto);
+
+    /**
+     * 留存数据-月
+     * @param dto
+     * @return
+     */
+    Page<ActiveDataMonthVO> getActiveDataMonth(ActiveDataDayDTO dto);
+
+    /**
+     * 留存数据-月总计
+     * @param dto
+     * @return
+     */
+    ActiveDataMonthTotalVO getActiveMonthDataTotal(ActiveDataTotalDTO dto);
 }

+ 25 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsCreativeDayService.java

@@ -0,0 +1,25 @@
+package com.zanxiang.game.data.serve.service;
+
+import com.zanxiang.game.data.serve.pojo.dto.TencentCreativeDayDTO;
+import com.zanxiang.game.data.serve.pojo.dto.TencentPromotionDayDTO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentCreativeDayTotalVO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentCreativeDayVO;
+import com.zanxiang.game.data.serve.pojo.vo.TencentPromotionDayTotalVO;
+import com.zanxiang.game.data.serve.utils.Page;
+
+
+public interface IAdsCreativeDayService {
+    /**
+     * 腾讯创意监控数据
+     * @param dto
+     * @return
+     */
+    Page<TencentCreativeDayVO> getTencentCreativeDayData(TencentCreativeDayDTO dto);
+
+    /**
+     * 腾讯创意监控数据总计
+     * @param dto
+     * @return
+     */
+    TencentCreativeDayTotalVO getTencentCreativeTotalData(TencentCreativeDayDTO dto);
+}

+ 721 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsCreativeDayServiceImpl.java

@@ -0,0 +1,721 @@
+package com.zanxiang.game.data.serve.service.impl;
+
+import com.github.sd4324530.jtuple.Tuple2;
+import com.google.common.base.CaseFormat;
+import com.zanxiang.game.data.serve.component.DataPowerComponent;
+import com.zanxiang.game.data.serve.pojo.dto.TencentCreativeDayDTO;
+import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
+import com.zanxiang.game.data.serve.pojo.vo.*;
+import com.zanxiang.game.data.serve.service.IAdsCreativeDayService;
+import com.zanxiang.game.data.serve.utils.Page;
+import org.apache.commons.collections4.CollectionUtils;
+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.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.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * packageName com.zanxiang.game.data.serve.service.impl
+ *
+ * @author ZhangXianyu
+ * @date 2025/1/14
+ * @description 创意日数据
+ */
+@Service
+public class AdsCreativeDayServiceImpl implements IAdsCreativeDayService {
+
+
+    @Autowired
+    private Dao dao;
+    @Autowired
+    private DataPowerComponent dataPowerComponent;
+    @Override
+    public Page<TencentCreativeDayVO> getTencentCreativeDayData(TencentCreativeDayDTO dto) {
+        Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
+        List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
+        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+//        ArrayList<Long> userIds = new ArrayList<>();
+//        ArrayList<Long> gameIds = new ArrayList<>();
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled("today_cost");
+        }
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        Criteria criA = myCriTencent(userIds, gameIds, dto, true);
+        Criteria criB = myCriTencent(userIds, gameIds, dto, false);
+        Criteria criOrderBy = Cnd.cri();
+        //拼接排序条件
+        criOrderBy.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        //创建sql语句
+        Sql sql = Sqls.create(getTencentCreativeDayDataSql(criA,criB) + criOrderBy);
+        //添加自定义回传对象
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(TencentCreativeDayVO.class));
+        //设置pager对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        sql.setPager(pager);
+        //执行sql
+        dao.execute(sql);
+        //获取到结果list
+        List<TencentCreativeDayVO> list = sql.getList(TencentCreativeDayVO.class);
+        //分页对象设置总条数
+        Sql sqlCount = Sqls.queryEntity("select count(*) from ads_creative_day" + criA);
+        pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
+
+        //处理List中的每个vo对象缺少的数据
+        list.stream().map(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(), 2, 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(), 2, 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(), 2, 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(), 2, RoundingMode.HALF_UP))
+                    .build());
+
+            //返回最终数据
+            return vo;
+        }).collect(Collectors.toList());
+        //返回查询得结果
+        return new Page<>(list, pager);
+    }
+
+    @Override
+    public TencentCreativeDayTotalVO getTencentCreativeTotalData(TencentCreativeDayDTO dto) {
+        Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
+        List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
+        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+//        ArrayList<Long> userIds = new ArrayList<>();
+//        ArrayList<Long> gameIds = new ArrayList<>();
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getAccountId() != null) {
+            //拼接推广账号Id查询条件
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountName())) {
+            //拼接推广账号名称查询条件
+            cri.where().andLike("account_name", dto.getAccountName());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountType())) {
+            //推广账号类型
+            cri.where().andEquals("account_type", dto.getAccountType());
+        }
+        if (CollectionUtils.isNotEmpty(userIds)) {
+            cri.where().andInList("pitcher_id", userIds);
+        }
+        if (CollectionUtils.isNotEmpty(dto.getAgentId())) {
+            cri.where().andInList("agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andEquals("cp_name", dto.getCpName());
+        }
+        if (CollectionUtils.isNotEmpty(gameIds)) {
+            cri.where().andInList("game_id", gameIds);
+        }
+        if (dto.getClassify() != null) {
+            cri.where().andEquals("classify", dto.getClassify());
+        }
+        if (StringUtils.isNotBlank(dto.getPromotionName())) {
+            cri.where().andLike("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.getDynamicCreativeName())) {
+            cri.where().andLike("dynamic_creative_name", dto.getDynamicCreativeName());
+        }
+        if (dto.getDynamicCreativeId() != null) {
+            cri.where().andEquals("dynamic_creative_id", dto.getDynamicCreativeId());
+        }
+        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 creativeDayTotalSql = Sqls.create(tencentCreativeDayTotalSql() + cri);
+        //设置回传对象
+        creativeDayTotalSql.setCallback(Sqls.callback.entity());
+        creativeDayTotalSql.setEntity(dao.getEntity(TencentCreativeDayTotalVO.class));
+        //执行sql
+        dao.execute(creativeDayTotalSql);
+        //得到结果
+        TencentCreativeDayTotalVO vo = creativeDayTotalSql.getObject(TencentCreativeDayTotalVO.class);
+
+        //计算总数据要根据dynamic_creative_id分组
+        Criteria totalCri = cri;
+        totalCri.getGroupBy().groupBy("dynamic_creative_id");
+        //构建sql
+        Sql tempSql = Sqls.create(tencentCreativeDayTotalTotalDataTempSql() + totalCri);
+        Sql totalSumSql = Sqls.create(tencentCreativeDayTotalTotalDataSumSql() + "(" + tempSql + ") a");
+        //设置回传对象
+        totalSumSql.setCallback(Sqls.callback.entity());
+        totalSumSql.setEntity(dao.getEntity(TencentCreativeDayTotalVO.class));
+        //执行sql
+        dao.execute(totalSumSql);
+        TencentCreativeDayTotalVO tempVO = totalSumSql.getObject(TencentCreativeDayTotalVO.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));
+        //总充值次数成本
+        vo.setTotalAmountCountCost(vo.getTotalAmountCount() == 0L ? BigDecimal.ZERO :
+                vo.getPromotionTotalCost().divide(BigDecimal.valueOf(vo.getTotalAmountCount()), 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(), 2, 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(), 2, 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(), 2, 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(), 2, RoundingMode.HALF_UP))
+                .build());
+
+        return vo;
+    }
+
+
+    /**
+     * 所有为空值的属性都不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);
+    }
+
+
+    /**
+     * 得到计算后的总数据(腾讯广告)
+     *
+     * @return String
+     */
+    private String tencentCreativeDayTotalTotalDataSumSql() {
+        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
+                """;
+    }
+
+
+
+    /**
+     * 用来查询出总计一栏的总数据sql(腾讯广告)
+     *
+     * @return String
+     */
+    private String tencentCreativeDayTotalTotalDataTempSql() {
+        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_creative_day
+                """;
+    }
+
+
+    /**
+     * 查询创意监控每日总计一栏sql(腾讯创意)
+     *
+     * @return String
+     */
+    private String tencentCreativeDayTotalSql() {
+        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) * 1000 / 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,
+                	ROUND(IF(SUM(convert_count) > 0, SUM(today_cost) / SUM(convert_count), 0), 2) 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,
+                	IFNULL(SUM(mini_game_register_users), 0) as mini_game_register_users,
+                    IFNULL(SUM(mini_game_register_cost), 0) as mini_game_register_cost,
+                    ROUND(IF(SUM(click_count) > 0 , SUM(mini_game_register_users) / SUM(click_count), 0), 4) as mini_game_register_rate,
+                    IFNULL(SUM(mini_game_paying_count), 0) as mini_game_paying_count,
+                    IFNULL(SUM(mini_game_paying_amount), 0) as mini_game_paying_amount,
+                    IFNULL(SUM(mini_game_paying_users_d1), 0) as mini_game_paying_users_d1,
+                    IFNULL(SUM(mini_game_paying_amount_d1), 0) as mini_game_paying_amount_d1,
+                    IFNULL(SUM(mini_game_paying_amount_d3), 0) as mini_game_paying_amount_d3,
+                    IFNULL(SUM(mini_game_paying_amount_d7), 0) as mini_game_paying_amount_d7,
+                    IFNULL(SUM(mini_game_paying_amount_d14), 0) as mini_game_paying_amount_d14,
+                    IFNULL(SUM(mini_game_paying_amount_d30), 0) as mini_game_paying_amount_d30,
+                    IFNULL(SUM(mini_game_first_paying_users), 0) as mini_game_first_paying_users,
+                    IFNULL(SUM(mini_game_paying_roi), 0) as mini_game_paying_roi,
+                    IFNULL(SUM(mini_game_paying_arpu), 0) as mini_game_paying_arpu,
+                    IFNULL(SUM(mini_game_first_day_paying_roi), 0) as mini_game_first_day_paying_roi,
+                    IFNULL(SUM(mini_game_pay_d3_roi), 0) as mini_game_pay_d3_roi,
+                    IFNULL(SUM(mini_game_pay_d7_roi), 0) as mini_game_pay_d7_roi,
+                    IFNULL(SUM(mini_game_pay_d14_roi), 0) as mini_game_pay_d14_roi,
+                    IFNULL(SUM(mini_game_pay_d30_roi), 0) as mini_game_pay_d30_roi,
+                    IFNULL(SUM(minigame1d_pay_count), 0) as minigame1d_pay_count,
+                    IFNULL(SUM(minigame24h_pay_uv), 0) as minigame24h_pay_uv,
+                    IFNULL(SUM(minigame24h_pay_amount), 0) as minigame24h_pay_amount,
+                    IFNULL(SUM(minigame24h_pay_roi), 0) as minigame24h_pay_roi,
+                    IFNULL(SUM(minigame24h_pay_arpu), 0) as minigame24h_pay_arpu,
+                    ROUND(IF(SUM(reg_num) > 0, SUM(mini_game_paying_amount_d1) / SUM(reg_num), 0), 2) as ltv_day1,
+                    ROUND(IF(SUM(reg_num) > 0, SUM(first_new_user_amount) / SUM(reg_num), 0), 2) as ltv_day1_actual_data,
+                    (SUM(first_new_user_amount_count) - SUM(first_sub_amount_count)) as sub_order_num,
+                    (SUM(first_new_user_amount) - SUM(first_sub_amount)) as sub_order_amount,
+                    ROUND(IF(SUM(first_new_user_amount_count) > 0, SUM(today_cost) / SUM(first_new_user_amount_count), 0), 2) as first_new_user_amount_count_cost,
+                    ROUND(IF(SUM(new_user_total_amount_count) > 0, SUM(today_cost) / SUM(new_user_total_amount_count), 0), 2) as new_user_total_amount_count_cost
+                FROM
+                	game_ads.ads_creative_day
+                """;
+    }
+
+
+    /**
+     * 获取广告监控数据的SQL(腾讯创意)
+     * @param criA
+     * @param criB
+     * @return
+     */
+    private String getTencentCreativeDayDataSql(Criteria criA, Criteria criB) {
+        return """
+               SELECT
+                              b.*,
+                              c.*
+                              FROM(
+                              	SELECT
+                              	    dynamic_creative_id,
+                              	    MAX(dynamic_creative_name) as dynamic_creative_name,
+                              		MAX(promotion_id) AS promotion_id ,
+                              		MAX(promotion_name) as promotion_name,
+                              		MAX(account_name) as account_name,
+                              		MAX(account_id) as account_id,
+                              		MAX(account_type) as account_type,
+                              		MAX(pitcher_id) as pitcher_id,
+                              		MAX(pitcher_name) as pitcher_name,
+                              		MAX(agent_id) as agent_id,
+                              		MAX(agent_name) as agent_name,
+                              		MAX(agent_key) as agent_key,
+                              		MAX(cp_name) as cp_name,
+                              		MAX(game_id) as game_id,
+                              		MAX(game_name) as game_name,
+                              		MAX(classify) as classify,
+                              		MAX(is_deleted) as is_deleted,
+                              		MAX(configured_status) as configured_status,
+                              		SUM(today_cost) as today_cost,
+                              		SUM(show_count) as show_count,
+                              		round(if(SUM(show_count) > 0, SUM(today_cost) * 1000 / SUM(show_count), 0), 2) as thousand_display_price,
+                              		SUM(click_count) 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,
+                              		SUM(convert_count) as convert_count,
+                              		ROUND(IF(SUM(convert_count) > 0, SUM(today_cost) / SUM(convert_count), 0), 2) as convert_cost,
+                              		round(if(SUM(click_count) > 0, SUM(convert_count) / SUM(click_count), 0), 4) as convert_rate,
+                              		SUM(reg_num) as reg_num,
+                              		SUM(first_role_num) as first_role_num,
+                              		SUM(new_user_total_role_num) 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,
+                              		SUM(first_new_user_amount_count) as first_new_user_amount_count,
+                              		SUM(first_new_user_amount_num) as first_new_user_amount_num,
+                              		SUM(first_new_user_amount) as first_new_user_amount,
+                              		SUM(new_user_total_amount_count) as new_user_total_amount_count,
+                              		SUM(new_user_total_amount_num) as new_user_total_amount_num,
+                              		SUM(new_user_total_amount) as new_user_total_amount,
+                              		round(if(SUM(today_cost) > 0, SUM(first_new_user_amount) / SUM(today_cost), 0), 4) as first_roi,
+                              		SUM(twenty_four_hours_amount) 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,
+                              		SUM(first_new_user_hundred_user_num) 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,
+                              		SUM(first_recharge_fifty_hundred_num) 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,
+                              		SUM(first_new_user_two_hundred_user_num) 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,
+                              		SUM(new_user_total_hundred_user_num) 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,
+                              		SUM(first_ios_amount_num) as first_ios_amount_num,
+                              		SUM(first_ios_amount_count) as first_ios_amount_count,
+                              		SUM(first_ios_amount) 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,
+                              		SUM(first_android_amount_count) as first_android_amount_count,
+                              		SUM(first_android_amount_num) as first_android_amount_num,
+                              		SUM(first_android_amount) 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,
+                              		IFNULL(SUM(mini_game_register_users), 0) as mini_game_register_users,
+                                      IFNULL(SUM(mini_game_register_cost), 0) as mini_game_register_cost,
+                                      ROUND(IF(SUM(click_count) > 0, SUM(mini_game_register_users) / SUM(click_count), 0), 4) as mini_game_register_rate,
+                                      IFNULL(SUM(mini_game_paying_count), 0) as mini_game_paying_count,
+                                      IFNULL(SUM(mini_game_paying_amount), 0) as mini_game_paying_amount,
+                                      IFNULL(SUM(mini_game_paying_users_d1), 0) as mini_game_paying_users_d1,
+                                      IFNULL(SUM(mini_game_paying_amount_d1), 0) as mini_game_paying_amount_d1,
+                                      IFNULL(SUM(mini_game_paying_amount_d3), 0) as mini_game_paying_amount_d3,
+                                      IFNULL(SUM(mini_game_paying_amount_d7), 0) as mini_game_paying_amount_d7,
+                                      IFNULL(SUM(mini_game_paying_amount_d14), 0) as mini_game_paying_amount_d14,
+                                      IFNULL(SUM(mini_game_paying_amount_d30), 0) as mini_game_paying_amount_d30,
+                                      IFNULL(SUM(mini_game_first_paying_users), 0) as mini_game_first_paying_users,
+                                      IFNULL(SUM(mini_game_paying_roi), 0) as mini_game_paying_roi,
+                                      IFNULL(SUM(mini_game_paying_arpu), 0) as mini_game_paying_arpu,
+                                      IFNULL(SUM(mini_game_first_day_paying_roi), 0) as mini_game_first_day_paying_roi,
+                                      IFNULL(SUM(mini_game_pay_d3_roi), 0) as mini_game_pay_d3_roi,
+                                      IFNULL(SUM(mini_game_pay_d7_roi), 0) as mini_game_pay_d7_roi,
+                                      IFNULL(SUM(mini_game_pay_d14_roi), 0) as mini_game_pay_d14_roi,
+                                      IFNULL(SUM(mini_game_pay_d30_roi), 0) as mini_game_pay_d30_roi,
+                                      IFNULL(SUM(minigame1d_pay_count), 0) as minigame1d_pay_count,
+                                      IFNULL(SUM(minigame24h_pay_uv), 0) as minigame24h_pay_uv,
+                                      IFNULL(SUM(minigame24h_pay_amount), 0) as minigame24h_pay_amount,
+                                      IFNULL(SUM(minigame24h_pay_roi), 0) as minigame24h_pay_roi,
+                                      IFNULL(SUM(minigame24h_pay_arpu), 0) as minigame24h_pay_arpu,
+                              	    ROUND(IF(SUM(reg_num) > 0, SUM(mini_game_paying_amount_d1) / SUM(reg_num), 0), 2) as ltv_day1,
+                              	    ROUND(IF(SUM(reg_num) > 0, SUM(first_new_user_amount) / SUM(reg_num), 0), 2) as ltv_day1_actual_data,
+                              	    (SUM(first_new_user_amount_count) - SUM(first_sub_amount_count)) as sub_order_num,
+                              	    (SUM(first_new_user_amount) - SUM(first_sub_amount)) as sub_order_amount,
+                              	    ROUND(IF(SUM(first_new_user_amount_count) > 0, SUM(today_cost) / SUM(first_new_user_amount_count), 0), 2) as first_new_user_amount_count_cost,
+                              	    ROUND(IF(SUM(new_user_total_amount_count) > 0, SUM(today_cost) / SUM(new_user_total_amount_count), 0), 2) as new_user_total_amount_count_cost
+                              	FROM
+                              		game_ads.ads_creative_day
+                                 """ + criA +
+                                 """
+                             ) b
+                                           LEFT JOIN(
+                                               SELECT
+                                               *
+                                               FROM(
+                                               SELECT
+                                                   ROW_NUMBER()over(partition by dynamic_creative_id order by dt desc) as num,
+                                                   dynamic_creative_id,
+                                                   promotion_id,
+                                                   status,
+                                                   creative_preview,
+                                                   landing_type,
+                                                   pricing,
+                                                   cpa_bid,
+                                                   roi_goal,
+                                                   budget,
+                                                   concat(start_time,'/',end_time) as 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,
+                                                   ROUND(IF(total_amount_count > 0, promotion_total_cost / total_amount_count, 0), 2) as total_amount_count_cost,
+                                                   total_recharge_cost
+                                               FROM
+                                                   game_ads.ads_creative_day
+                                                     """ + criB +
+                                                     """
+                                                ) a
+                                                WHERE a.num = 1) c
+                                            ON b.dynamic_creative_id = c.dynamic_creative_id
+                                           """;
+    }
+
+
+
+    /**
+     * 创意监控用到的查询条件(腾讯广告)
+     *
+     * @param dto         前端传递的查询条件
+     * @param needGroupBy 需要聚合分组
+     * @return 查询条件
+     */
+    private Criteria myCriTencent(List<Long> userIds, List<Long> gameIds, TencentCreativeDayDTO dto, Boolean needGroupBy) {
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (dto.getAccountId() != null) {
+            //拼接推广账号Id查询条件
+            cri.where().andEquals("account_id", dto.getAccountId());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountName())) {
+            //拼接推广账号名称查询条件 模糊查询
+            cri.where().andLike("account_name", dto.getAccountName());
+        }
+        if (StringUtils.isNotBlank(dto.getAccountType())) {
+            //推广账号类型
+            cri.where().andEquals("account_type", dto.getAccountType());
+        }
+        if (CollectionUtils.isNotEmpty(userIds)) {
+            cri.where().andInList("pitcher_id", userIds);
+        }
+        if (CollectionUtils.isNotEmpty(dto.getAgentId())) {
+            cri.where().andInList("agent_id", dto.getAgentId());
+        }
+        if (StringUtils.isNotBlank(dto.getCpName())) {
+            cri.where().andEquals("cp_name", dto.getCpName());
+        }
+        if (CollectionUtils.isNotEmpty(gameIds)) {
+            cri.where().andInList("game_id", gameIds);
+        }
+        if (dto.getClassify() != null) {
+            cri.where().andEquals("classify", dto.getClassify());
+        }
+        if (StringUtils.isNotBlank(dto.getPromotionName())) {
+            cri.where().andLike("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.getDynamicCreativeName())) {
+            cri.where().andLike("dynamic_creative_name", dto.getDynamicCreativeName());
+        }
+        if (dto.getDynamicCreativeId() != null) {
+            cri.where().andEquals("dynamic_creative_id", dto.getDynamicCreativeId());
+        }
+        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());
+        }
+        if (needGroupBy) {
+            //拼接分组条件
+            cri.getGroupBy().groupBy("dynamic_creative_id");
+        }
+
+        return cri;
+    }
+
+}

+ 754 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/IActiveDataServiceImpl.java

@@ -45,13 +45,83 @@ public class IActiveDataServiceImpl implements IActiveDataService {
     //存储PitcherGameDataDayVO的映射
     private static final List<Tuple2<Field, Field>> activeDataDayNFieldMapList;
 
+
     //存储PitcherGameDataDayTotalVO的映射
     private static final List<Tuple2<Field, Field>> activeDataDayNTotalFieldMapList;
 
+    //月数据
+    private static final List<Tuple2<Field, Field>> activeDataMonthNFieldMapList;
+    private static final List<Tuple2<Field, Field>> activeDataMonthNTotalFieldMapList;
+
     private static final List<Tuple2<Field, Field>> gameMediaactiveDataDayNFieldMapList;
     private static final List<Tuple2<Field, Field>> gameMediaActiveDataDayNTotalFieldMapList;
 
 
+    static {
+        //解析ActiveDataDayVO的映射
+        Map<String, Field> fieldMap = new HashMap<>();
+        List<Field> dayNFieldList = new ArrayList<>();
+        Class<?> tempClazz = ActiveDataMonthVO.class;
+        while (tempClazz != null) {
+            Field[] fields = tempClazz.getDeclaredFields();
+            for (Field field : fields) {
+                if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
+                    //属性前面的修饰符为static或final不加入map中
+                    continue;
+                }
+                fieldMap.put(field.getName(), field);
+                if (field.getType() == ActiveDataTrendVO.class) {
+                    //存储所有类型为ActiveDataTrendVO属性的映射 以Trend为结尾的
+                    dayNFieldList.add(field);
+                }
+            }
+            tempClazz = tempClazz.getSuperclass();
+        }
+        if (dayNFieldList.isEmpty()) {
+            activeDataMonthNFieldMapList = Collections.emptyList();
+        } else {
+            activeDataMonthNFieldMapList = new ArrayList<>(dayNFieldList.size());
+            for (Field field : dayNFieldList) {
+                field.setAccessible(true);
+                Field sourceField = fieldMap.get(field.getName().replace("Trend", ""));
+                sourceField.setAccessible(true);
+                activeDataMonthNFieldMapList.add(Tuples.of(sourceField, field));
+            }
+        }
+
+        //解析ActiveDataTotalVO的映射
+        Map<String, Field> fieldTotalMap = new HashMap<>();
+        List<Field> dayNTotalFieldList = new ArrayList<>();
+        Class<?> tempTotalClazz = ActiveDataMonthTotalVO.class;
+        while (tempTotalClazz != null) {
+            Field[] fields = tempTotalClazz.getDeclaredFields();
+            for (Field field : fields) {
+                if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
+                    //属性前面的修饰符为static或final不加入map中
+                    continue;
+                }
+                fieldTotalMap.put(field.getName(), field);
+                if (field.getType() == ActiveDataTrendVO.class) {
+                    //存储所有类型为ActiveDataTrendVO属性的映射 以Trend为结尾的
+                    dayNTotalFieldList.add(field);
+                }
+            }
+            tempTotalClazz = tempTotalClazz.getSuperclass();
+        }
+        if (dayNTotalFieldList.isEmpty()) {
+            activeDataDayNTotalFieldMapList = Collections.emptyList();
+        } else {
+            activeDataDayNTotalFieldMapList = new ArrayList<>(dayNTotalFieldList.size());
+            for (Field field : dayNTotalFieldList) {
+                field.setAccessible(true);
+                Field sourceField = fieldTotalMap.get(field.getName().replace("Trend", ""));
+                sourceField.setAccessible(true);
+                activeDataDayNTotalFieldMapList.add(Tuples.of(sourceField, field));
+            }
+        }
+    }
+
+
     static {
         //解析MediaActiveDataDayVO的映射
         Map<String, Field> fieldMap = new HashMap<>();
@@ -169,14 +239,14 @@ public class IActiveDataServiceImpl implements IActiveDataService {
             tempTotalClazz = tempTotalClazz.getSuperclass();
         }
         if (dayNTotalFieldList.isEmpty()) {
-            activeDataDayNTotalFieldMapList = Collections.emptyList();
+            activeDataMonthNTotalFieldMapList = Collections.emptyList();
         } else {
-            activeDataDayNTotalFieldMapList = new ArrayList<>(dayNTotalFieldList.size());
+            activeDataMonthNTotalFieldMapList = new ArrayList<>(dayNTotalFieldList.size());
             for (Field field : dayNTotalFieldList) {
                 field.setAccessible(true);
                 Field sourceField = fieldTotalMap.get(field.getName().replace("Trend", ""));
                 sourceField.setAccessible(true);
-                activeDataDayNTotalFieldMapList.add(Tuples.of(sourceField, field));
+                activeDataMonthNTotalFieldMapList.add(Tuples.of(sourceField, field));
             }
         }
     }
@@ -976,6 +1046,298 @@ public class IActiveDataServiceImpl implements IActiveDataService {
         return voGameData;
     }
 
+    @Override
+    public Page<ActiveDataMonthVO> getActiveDataMonth(ActiveDataDayDTO dto) {
+//        com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
+//        List<Long> userGameIds = dto.getGameId() == null ? poerInfo.second : dto.getGameId();
+        List<Long> userGameIds = new ArrayList<>();
+
+        //默认查询的字段及表名
+        String gameColumn = "game_id";
+        String classifyColumn = "game_classify";
+
+        if (dto.getGameDimension() == null) {
+            //默认子游戏维度
+            dto.setGameDimension(1L);
+        }
+        //默认查询总数据
+        if (StringUtils.isBlank(dto.getTableTypes())) {
+            dto.setTableTypes("total");
+        }
+        //查询的class
+        Class<?> tempClazz = null;
+        //默认查询注册留存
+        String queryTableName = StringUtils.EMPTY;
+        if (StringUtils.isBlank(dto.getActiveTypes())) {
+            dto.setActiveTypes("reg");
+        }
+        switch (dto.getActiveTypes()) {
+            case "reg" -> {
+                queryTableName = "ads_game_active_reg_month";
+                tempClazz = AdsGameActiveRegMonth.class;
+            }
+            case "role" -> {
+                queryTableName = "ads_game_active_role_month";
+                tempClazz = AdsGameActiveRoleMonth.class;
+            }
+            case "amount" -> {
+                queryTableName = "ads_game_active_order_month";
+                tempClazz = AdsGameActiveOrderMonth.class;
+            }
+        }
+        if (dto.getGameDimension() == 2L) {
+            gameColumn = "parent_game_id";
+            classifyColumn = "parent_game_classify";
+            switch (dto.getActiveTypes()) {
+                case "reg" -> {
+                    queryTableName = "game_ads_parent.ads_game_active_reg_month_parent";
+                    tempClazz = AdsGameActiveRegMonthParent.class;
+                }
+                case "role" -> {
+                    queryTableName = "game_ads_parent.ads_game_active_role_month_parent";
+                    tempClazz = AdsGameActiveRoleMonthParent.class;
+                }
+                case "amount" -> {
+                    queryTableName = "game_ads_parent.ads_game_active_order_month_parent";
+                    tempClazz = AdsGameActiveOrderMonthParent.class;
+                }
+            }
+        }
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        //拼接游戏ID
+        if (CollectionUtils.isNotEmpty(userGameIds)) {
+            cri.where().andInList(gameColumn, userGameIds);
+        }
+        //拼接游戏应用类型
+        if (dto.getClassify() != null) {
+            cri.where().andEquals(classifyColumn, dto.getClassify());
+        }
+        //拼接SDK来源
+        if ("reg".equals(dto.getActiveTypes())) {
+            //注册留存只看 ZX_ONE的数据
+            cri.where().andEquals("source_system", "ZX_ONE");
+        } else {
+            if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+                cri.where().andEquals("source_system", dto.getSourceSystem());
+            }
+        }
+        //拼接查询时间
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        //拼接排序条件
+        Criteria orderByCri = Cnd.cri();
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            orderByCri.getOrderBy().orderBy("dt", dto.getSortType());
+        } else {
+            orderByCri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        }
+        //创建sql查询数据
+        Sql sql;
+        if (dto.getGameDimension() == 1L) {
+            sql = Sqls.create(getActiveDataMonthSql(dto.getTableTypes(), queryTableName, cri) + orderByCri);
+        } else {
+            sql = Sqls.create(getActiveDataMonthSqlForParent(dto.getTableTypes(), queryTableName, cri) + orderByCri);
+        }
+        //设置自定义回传类型
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(ActiveDataMonthVO.class));
+        //设置pager对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        sql.setPager(pager);
+        //执行sql
+        dao.execute(sql);
+        //得到结果集list
+        List<ActiveDataMonthVO> list = sql.getList(ActiveDataMonthVO.class);
+        //设置查询总数 (根据表名)
+        pager.setRecordCount(dao.count(tempClazz, cri));
+        List<ActiveDataMonthVO> activeDataMonthVOList = list.stream().map(vo -> {
+            //将string转成 ActiveDataTrendVO 对象
+            formatMonthN(vo, dto.getActiveTypes());
+            return vo;
+        }).collect(Collectors.toList());
+
+        return new Page<>(activeDataMonthVOList, pager);
+    }
+
+    /**
+     * 通过反射赋值留存数据monthN
+     *
+     * @param vo         ActiveDataMonthVO
+     * @param activeType 留存类型 : reg -> 注册留存; role -> 创角留存; amount -> 付费留存
+     */
+    private void formatMonthN(ActiveDataMonthVO vo, String activeType) {
+        if (CollectionUtils.isEmpty(activeDataMonthNFieldMapList)) {
+            return;
+        }
+        if ("reg".equals(activeType)) {
+            //处理注册留存数据
+            activeDataMonthNFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    String dataStr = (String) dayNFieldMapList.getT1().get(vo);
+                    if (StringUtils.isNotBlank(dataStr)) {
+                        String[] temps = dataStr.split("/");
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .activeNum(Long.valueOf(temps[0]))
+                                .regActiveRate(new BigDecimal(temps[1]))
+                                .build());
+                    } else {
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .activeNum(0L)
+                                .regActiveRate(BigDecimal.ZERO)
+                                .build());
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        } else if ("amount".equals(activeType)) {
+            //处理付费留存数据
+            activeDataMonthNFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    //  第N天的新增创角用户,第N天的老活跃用户,第N天的累计创角用户,第N天的累计活跃用户,创角留存率
+                    String dataStr = (String) dayNFieldMapList.getT1().get(vo);
+                    //判断取出的字符串数据是否为空
+                    if (StringUtils.isNotBlank(dataStr)) {
+                        String[] temps = dataStr.split("/");
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .newUserAmountNum(Long.valueOf(temps[0]))
+                                .oldActiveUserNum(Long.valueOf(temps[1]))
+                                .newUserTotalAmountNum(Long.valueOf(temps[2]))
+                                .newActiveUserTotalNum(Long.valueOf(temps[3]))
+                                .amountActiveRate(new BigDecimal(temps[4]))
+                                .build());
+                    } else {
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .newUserAmountNum(0L)
+                                .oldActiveUserNum(0L)
+                                .newUserTotalAmountNum(0L)
+                                .newActiveUserTotalNum(0L)
+                                .amountActiveRate(BigDecimal.ZERO)
+                                .build());
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        } else {
+            //处理创角留存数据
+            activeDataMonthNFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    //第N天的新增付费用户,第N天的老活跃用户,第N天的累计付费用户,第N天的累计活跃用户,付费留存率
+                    String dataStr = (String) dayNFieldMapList.getT1().get(vo);
+                    if (StringUtils.isNotBlank(dataStr)) {
+                        String[] temps = dataStr.split("/");
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .roleNewUserNum(Long.valueOf(temps[0]))
+                                .roleOldActiveUserNum(Long.valueOf(temps[1]))
+                                .roleNewUserTotalNum(Long.valueOf(temps[2]))
+                                .roleNewActiveUserTotalNum(Long.valueOf(temps[3]))
+                                .roleActiveRate(new BigDecimal(temps[4]))
+                                .build());
+                    } else {
+                        dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                                .roleNewUserNum(0L)
+                                .roleOldActiveUserNum(0L)
+                                .roleNewUserTotalNum(0L)
+                                .roleNewActiveUserTotalNum(0L)
+                                .roleActiveRate(BigDecimal.ZERO)
+                                .build());
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
+
+    @Override
+    public ActiveDataMonthTotalVO getActiveMonthDataTotal(ActiveDataTotalDTO dto) {
+        com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
+        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : dto.getGameId();
+
+        //默认查询字段
+        String gameColumn = "game_id";
+        String classifyColumn = "game_classify";
+        String tableName = "game_ads.ads_game_day";
+
+        if (dto.getGameDimension() == null) {
+            //默认查询子游戏维度
+            dto.setGameDimension(1L);
+        }
+        //默认查询总数据
+        if (StringUtils.isBlank(dto.getTableTypes())) {
+            dto.setTableTypes("total");
+        }
+        //默认查询注册留存
+        String queryTableName = StringUtils.EMPTY;
+        if (StringUtils.isBlank(dto.getActiveTypes())) {
+            dto.setActiveTypes("reg");
+        }
+        switch (dto.getActiveTypes()) {
+            case "reg" -> queryTableName = "ads_game_active_reg_month";
+            case "role" -> queryTableName = "ads_game_active_role_month";
+            case "amount" -> queryTableName = "ads_game_active_order_month";
+        }
+        if (dto.getGameDimension() == 2L) {
+            gameColumn = "parent_game_id";
+            classifyColumn = "parent_game_classify";
+            tableName = "game_ads_parent.ads_game_day_parent";
+            switch (dto.getActiveTypes()) {
+                case "reg" -> queryTableName = "game_ads_parent.ads_game_active_reg_month_parent";
+                case "role" -> queryTableName = "game_ads_parent.ads_game_active_role_month_parent";
+                case "amount" -> queryTableName = "game_ads_parent.ads_game_active_order_month_parent";
+            }
+        }
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        //拼接游戏ID
+        if (CollectionUtils.isNotEmpty(gameIds)) {
+            cri.where().andInList(gameColumn, gameIds);
+        }
+        //拼接游戏应用类型
+        if (dto.getClassify() != null) {
+            cri.where().andEquals(classifyColumn, dto.getClassify());
+        }
+        //拼接SDK来源
+        if ("reg".equals(dto.getActiveTypes())) {
+            //注册留存只看 ZX_ONE的数据
+            cri.where().andEquals("source_system", "ZX_ONE");
+        } else {
+            if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+                cri.where().andEquals("source_system", dto.getSourceSystem());
+            }
+        }
+        //拼接查询时间
+        if (dto.getRegisteredBeginDate() != null && dto.getRegisteredEndDate() != null) {
+            cri.where().andBetween("dt", dto.getRegisteredBeginDate(), dto.getRegisteredEndDate());
+        }
+        //创建sql 获取留存数据部分的数据
+        Sql sqlActiveData = Sqls.create(activeDataMonthTotalSql(dto.getTableTypes(), queryTableName) + cri);
+        //设置自定义回传对象
+        sqlActiveData.setCallback(Sqls.callback.entity());
+        sqlActiveData.setEntity(dao.getEntity(ActiveDataMonthTotalVO.class));
+        //执行sql
+        dao.execute(sqlActiveData);
+        //得到每日总计对象
+        ActiveDataMonthTotalVO voActiveData = sqlActiveData.getObject(ActiveDataMonthTotalVO.class);
+        //voActiveData有值时进行映射的取值处理
+        if (StringUtils.isNotBlank(voActiveData.getM1())) {
+            //计算留存dayN数据
+            formatTotalMonthN(voActiveData, dto.getActiveTypes());
+        }
+        //将两个对象的属性结合
+//        copyNullProperties(voActiveData, voGameData);
+        //返回
+        return voActiveData;
+    }
+
     /**
      * 所有为空值的属性都不copy
      *
@@ -1010,6 +1372,90 @@ public class IActiveDataServiceImpl implements IActiveDataService {
         return notNullFieldSet.toArray(notNullField);
     }
 
+
+    /**
+     * 留存每月总计sql(留存monthN数据部分)
+     *
+     * @param type      查询的类型 buy、nature、total
+     * @param tableName 表名
+     * @return String : 查询出来的结果 第n月的 充值金额/充值人数
+     */
+    private String activeDataMonthTotalSql(String type, String tableName) {
+        //修改类型,与数据库字段名相匹配
+        if ("buy".equals(type)) {
+            type = type + "_";
+        } else if ("nature".equals(type)) {
+            type = type + "_";
+        } else {
+            type = "";
+        }
+        //拼接查询条件
+        StringBuilder trendDay = new StringBuilder(StringUtils.EMPTY);
+        trendDay.append("SELECT ");
+        if ("ads_game_active_reg_month".equals(tableName) ||
+                "game_ads_parent.ads_game_active_reg_month_parent".equals(tableName)) {
+            //m1-m23数据
+            for (int month = 1; month < 23; month++) {
+                trendDay.append("""
+                        CONCAT( SUM(CAST(SPLIT_PART(%sm%s, '/', 1) AS BIGINT(20))), '/',
+                                SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), %sreg_num, 0))
+                        ) AS m%s,
+                           """.formatted(type, month, month, type, month));
+            }
+            //m24数据
+            trendDay.append("""
+                    CONCAT( SUM(CAST(SPLIT_PART(%sm24, '/', 1) AS BIGINT(20))), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 24 month) <= Local.now(), %sreg_num, 0))
+                    ) AS m24
+                       """.formatted(type, type));
+        } else if ("ads_game_active_order_month".equals(tableName) ||
+                "game_ads_parent.ads_game_active_role_month_parent".equals(tableName)) {
+
+            //m1-m23数据
+            for (int month = 1; month < 23; month++) {
+                trendDay.append("""
+                        CONCAT( SUM(CAST(SPLIT_PART(%sm%s, '/', 1) AS BIGINT(20))), '/',
+                                SUM(CAST(SPLIT_PART(%sm%s, '/', 2) AS BIGINT(20))), '/',
+                                SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), CAST(SPLIT_PART(%sm%s, '/', 3) AS BIGINT(20)), 0)), '/',
+                                SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), CAST(SPLIT_PART(%sm%s, '/', 4) AS BIGINT(20)), 0))
+                        ) AS m%s,
+                           """.formatted(type, month, type, month, month, type, month, month, type, month, month));
+            }
+            //m24数据
+            trendDay.append("""
+                    CONCAT( SUM(CAST(SPLIT_PART(%sm24, '/', 1) AS BIGINT(20))), '/',
+                            SUM(CAST(SPLIT_PART(%sm24, '/', 2) AS BIGINT(20))), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 24 month) <= Local.now(), CAST(SPLIT_PART(%sm24, '/', 3) AS BIGINT(20)), 0)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 24 month) <= Local.now(), CAST(SPLIT_PART(%sm24, '/', 4) AS BIGINT(20)), 0))
+                    ) AS m24
+                       """.formatted(type, type, type, type));
+        } else {
+            //m1-m23数据
+            for (int month = 1; month < 23; month++) {
+                trendDay.append("""
+                        CONCAT( SUM(CAST(SPLIT_PART(%sm%s, '/', 1) AS BIGINT(20))), '/',
+                                SUM(CAST(SPLIT_PART(%sm%s, '/', 2) AS BIGINT(20))), '/',
+                                SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), CAST(SPLIT_PART(%sm%s, '/', 3) AS BIGINT(20)), 0)), '/',
+                                SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), CAST(SPLIT_PART(%sm%s, '/', 4) AS BIGINT(20)), 0))
+                        ) AS m%s,
+                           """.formatted(type, month, type, month, month, type, month, month, type, month, month));
+            }
+            //m24数据
+            trendDay.append("""
+                    CONCAT( SUM(CAST(SPLIT_PART(%sm24, '/', 1) AS BIGINT(20))), '/',
+                            SUM(CAST(SPLIT_PART(%sm24, '/', 2) AS BIGINT(20))), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 24 month) <= Local.now(), CAST(SPLIT_PART(%sm24, '/', 3) AS BIGINT(20)), 0)), '/',
+                            SUM(IF(DATE_ADD(dt, INTERVAL 24 month) <= Local.now(), CAST(SPLIT_PART(%sm24, '/', 4) AS BIGINT(20)), 0))
+                    ) AS m24
+                       """.formatted(type, type, type, type));
+        }
+        trendDay.append("FROM ");
+        trendDay.append(tableName);
+
+        return trendDay.toString();
+    }
+
+
     /**
      * 留存每日总计sql(留存dayN数据部分)
      *
@@ -1403,6 +1849,82 @@ public class IActiveDataServiceImpl implements IActiveDataService {
         }
     }
 
+
+    /**
+     * 通过反射赋值留存数据总计的monthN
+     * 活跃人数/注册人数(去掉时间没到的数据)
+     *
+     * @param vo         ActiveDataMonthTotalVO
+     * @param activeType 留存类型 : reg -> 注册留存; role -> 创角留存; amount -> 付费留存
+     */
+    private void formatTotalMonthN(ActiveDataMonthTotalVO vo, String activeType) {
+        if (CollectionUtils.isEmpty(activeDataMonthNTotalFieldMapList)) {
+            return;
+        }
+        if ("reg".equals(activeType)) {
+            activeDataMonthNTotalFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    String[] temps = ((String) dayNFieldMapList.getT1().get(vo)).split("/");
+                    //活跃人数
+                    Long activeNum = Long.valueOf(temps[0]);
+                    //注册人数
+                    Long regNum = Long.valueOf(temps[1]);
+                    dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                            .activeNum(activeNum)
+                            .regActiveRate(regNum == 0L ? BigDecimal.ZERO :
+                                    BigDecimal.valueOf(activeNum.doubleValue() / regNum.doubleValue()).setScale(4, RoundingMode.HALF_UP))
+                            .build());
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        } else if ("amount".equals(activeType)) {
+            activeDataMonthNTotalFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    // 第N天新增付费用户数/第N天老活跃用户数/累计到第N天的付费用户数/累计到第N天的活跃人数
+                    String[] temps = ((String) dayNFieldMapList.getT1().get(vo)).split("/");
+                    //累计到第N天的活跃人数(活跃人数)
+                    Long activeUserNum = Long.valueOf(temps[3]);
+                    //累计到第N天的付费人数
+                    Long amountTotalNum = Long.valueOf(temps[2]);
+                    dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                            .newUserAmountNum(Long.valueOf(temps[0]))
+                            .oldActiveUserNum(Long.valueOf(temps[1]))
+                            .newUserTotalAmountNum(amountTotalNum)
+                            .newActiveUserTotalNum(activeUserNum)
+                            .amountActiveRate(amountTotalNum == 0L ? BigDecimal.ZERO :
+                                    BigDecimal.valueOf(activeUserNum.doubleValue() / amountTotalNum.doubleValue())
+                                            .setScale(4, RoundingMode.HALF_UP))
+                            .build());
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        } else {
+            activeDataMonthNTotalFieldMapList.forEach(dayNFieldMapList -> {
+                try {
+                    // 第N天的新增创角用户/第N天的老活跃用户/第N天的累计创角用户/第N天的累计活跃用户
+                    String[] temps = ((String) dayNFieldMapList.getT1().get(vo)).split("/");
+                    //累计到第N天的活跃人数(活跃人数)
+                    Long roleActiveUserNum = Long.valueOf(temps[3]);
+                    //累计到第N天的创角用户数
+                    Long roleTotalNum = Long.valueOf(temps[2]);
+                    dayNFieldMapList.getT2().set(vo, ActiveDataTrendVO.builder()
+                            .roleNewUserNum(Long.valueOf(temps[0]))
+                            .roleOldActiveUserNum(Long.valueOf(temps[1]))
+                            .roleNewUserTotalNum(roleTotalNum)
+                            .roleNewActiveUserTotalNum(roleActiveUserNum)
+                            .roleActiveRate(roleTotalNum == 0L ? BigDecimal.ZERO :
+                                    BigDecimal.valueOf(roleActiveUserNum.doubleValue() / roleTotalNum.doubleValue())
+                                            .setScale(4, RoundingMode.HALF_UP))
+                            .build());
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            });
+        }
+    }
+
     /**
      * 通过反射赋值留存数据总计的dayN
      * 活跃人数/注册人数(去掉时间没到的数据)
@@ -2069,6 +2591,120 @@ public class IActiveDataServiceImpl implements IActiveDataService {
                         """;
     }
 
+    /**
+     * 留存每月数据sql
+     *
+     * @param type      查询的类型 buy -> 买量  ;  nature ->  自然量 ; total -> 总量
+     * @param tableName 查询的表名
+     * @param cri       查询条件
+     * @return String
+     */
+    private String getActiveDataMonthSql(String type, String tableName, Criteria cri) {
+        if ("buy".equals(type)) {
+            return """
+                    SELECT 
+                                                        dt,
+                                                        source_system,
+                                                        game_id,
+                                                        game_name,
+                                                        game_classify,
+                                                        buy_reg_num as reg_num,
+                                                        buy_m1 as m1,
+                                                        buy_m2 as m2,
+                                                        buy_m3 as m3,
+                                                        buy_m4 as m4,
+                                                        buy_m5 as m5,
+                                                        buy_m6 as m6,
+                                                        buy_m7 as m7,
+                                                        buy_m8 as m8,
+                                                        buy_m9 as m9,
+                                                        buy_m10 as m10,
+                                                        buy_m11 as m11,
+                                                        buy_m12 as m12,
+                                                        buy_m13  as m13,
+                                                        buy_m14 as m14,
+                                                        buy_m15 as m15,
+                                                        buy_m16 as m16,
+                                                        buy_m17 as m17,
+                                                        buy_m18 as m18,
+                                                        buy_m19 as m19,
+                                                        buy_m20 as m20,
+                                                        buy_m21 as m21,
+                                                        buy_m22 as m22,
+                                                        buy_m23 as m23,
+                                                        buy_m24 as m24
+                                                    FROM """ +" " + tableName + cri;
+        } else if ("nature".equals(type)) {
+            return """
+                    SELECT
+                                                        dt,
+                                                        source_system,
+                                                        game_id,
+                                                        game_name,
+                                                        game_classify,
+                                                        nature_reg_num as reg_num,
+                                                        nature_m1 as m1,
+                                                        nature_m2 as m2,
+                                                        nature_m3 as m3,
+                                                        nature_m4 as m4,
+                                                        nature_m5 as m5,
+                                                        nature_m6 as m6,
+                                                        nature_m7 as m7,
+                                                        nature_m8 as m8,
+                                                        nature_m9 as m9,
+                                                        nature_m10 as m10,
+                                                        nature_m11 as m11,
+                                                        nature_m12 as m12,
+                                                        nature_m13  as m13,
+                                                        nature_m14 as m14,
+                                                        nature_m15 as m15,
+                                                        nature_m16 as m16,
+                                                        nature_m17 as m17,
+                                                        nature_m18 as m18,
+                                                        nature_m19 as m19,
+                                                        nature_m20 as m20,
+                                                        nature_m21 as m21,
+                                                        nature_m22 as m22,
+                                                        nature_m23 as m23,
+                                                        nature_m24 as m24
+                                                    FROM """ + " "+tableName + cri;
+        }
+        //总量 total
+        return """
+                    SELECT
+                                                        dt,
+                                                        source_system,
+                                                        game_id,
+                                                        game_name,
+                                                        game_classify,
+                                                        reg_num,
+                                                        total_m1 as m1,
+                                                        total_m2 as m2,
+                                                        total_m3 as m3,
+                                                        total_m4 as m4,
+                                                        total_m5 as m5,
+                                                        total_m6 as m6,
+                                                        total_m7 as m7,
+                                                        total_m8 as m8,
+                                                        total_m9 as m9,
+                                                        total_m10 as m10,
+                                                        total_m11 as m11,
+                                                        total_m12 as m12,
+                                                        total_m13  as m13,
+                                                        total_m14 as m14,
+                                                        total_m15 as m15,
+                                                        total_m16 as m16,
+                                                        total_m17 as m17,
+                                                        total_m18 as m18,
+                                                        total_m19 as m19,
+                                                        total_m20 as m20,
+                                                        total_m21 as m21,
+                                                        total_m22 as m22,
+                                                        total_m23 as m23,
+                                                        total_m24 as m24
+                                                    FROM """ + " " +tableName + cri;
+    }
+
     /**
      * 留存每日数据sql-父游戏维度
      *
@@ -2585,6 +3221,121 @@ public class IActiveDataServiceImpl implements IActiveDataService {
                         """;
     }
 
+
+    /**
+     * 留存每日数据sql-父游戏维度
+     *
+     * @param type      查询的类型 buy -> 买量  ;  nature ->  自然量 ; total -> 总量
+     * @param tableName 查询的表名
+     * @param cri       查询条件
+     * @return String
+     */
+    private String getActiveDataMonthSqlForParent(String type, String tableName, Criteria cri) {
+        if ("buy".equals(type)) {
+            return """
+                    SELECT
+                                                        dt,
+                                                        source_system,
+                                                        parent_game_id as game_id,
+                                                        parent_game_name as game_name,
+                                                        parent_game_name_classify as game_classify,
+                                                        buy_reg_num as reg_num,
+                                                        buy_m1 as m1,
+                                                        buy_m2 as m2,
+                                                        buy_m3 as m3,
+                                                        buy_m4 as m4,
+                                                        buy_m5 as m5,
+                                                        buy_m6 as m6,
+                                                        buy_m7 as m7,
+                                                        buy_m8 as m8,
+                                                        buy_m9 as m9,
+                                                        buy_m10 as m10,
+                                                        buy_m11 as m11,
+                                                        buy_m12 as m12,
+                                                        buy_m13  as m13,
+                                                        buy_m14 as m14,
+                                                        buy_m15 as m15,
+                                                        buy_m16 as m16,
+                                                        buy_m17 as m17,
+                                                        buy_m18 as m18,
+                                                        buy_m19 as m19,
+                                                        buy_m20 as m20,
+                                                        buy_m21 as m21,
+                                                        buy_m22 as m22,
+                                                        buy_m23 as m23,
+                                                        buy_m24 as m24
+                                                    FROM """ + " " + tableName + cri;
+        } else if ("nature".equals(type)) {
+            return """
+                    SELECT
+                                                        dt,
+                                                        source_system,
+                                                        parent_game_id as game_id,
+                                                        parent_game_name as game_name,
+                                                        parent_game_name_classify as game_classify,
+                                                        nature_reg_num as reg_num,
+                                                        nature_m1 as m1,
+                                                        nature_m2 as m2,
+                                                        nature_m3 as m3,
+                                                        nature_m4 as m4,
+                                                        nature_m5 as m5,
+                                                        nature_m6 as m6,
+                                                        nature_m7 as m7,
+                                                        nature_m8 as m8,
+                                                        nature_m9 as m9,
+                                                        nature_m10 as m10,
+                                                        nature_m11 as m11,
+                                                        nature_m12 as m12,
+                                                        nature_m13  as m13,
+                                                        nature_m14 as m14,
+                                                        nature_m15 as m15,
+                                                        nature_m16 as m16,
+                                                        nature_m17 as m17,
+                                                        nature_m18 as m18,
+                                                        nature_m19 as m19,
+                                                        nature_m20 as m20,
+                                                        nature_m21 as m21,
+                                                        nature_m22 as m22,
+                                                        nature_m23 as m23,
+                                                        nature_m24 as m24
+                                                    FROM """ + " " + tableName + cri;
+        }
+        //总量 total
+        return """
+                    SELECT
+                                                        dt,
+                                                        source_system,
+                                                        parent_game_id as game_id,
+                                                        parent_game_name as game_name,
+                                                        parent_game_name_classify as game_classify,
+                                                        reg_num,
+                                                        total_m1 as m1,
+                                                        total_m2 as m2,
+                                                        total_m3 as m3,
+                                                        total_m4 as m4,
+                                                        total_m5 as m5,
+                                                        total_m6 as m6,
+                                                        total_m7 as m7,
+                                                        total_m8 as m8,
+                                                        total_m9 as m9,
+                                                        total_m10 as m10,
+                                                        total_m11 as m11,
+                                                        total_m12 as m12,
+                                                        total_m13  as m13,
+                                                        total_m14 as m14,
+                                                        total_m15 as m15,
+                                                        total_m16 as m16,
+                                                        total_m17 as m17,
+                                                        total_m18 as m18,
+                                                        total_m19 as m19,
+                                                        total_m20 as m20,
+                                                        total_m21 as m21,
+                                                        total_m22 as m22,
+                                                        total_m23 as m23,
+                                                        total_m24 as m24
+                                                    FROM """ + " " + tableName + cri;
+    }
+
     /**
      * 游戏数据每日总计一栏(按类型返回sql)
      *