Ver código fonte

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

shishaosong 1 ano atrás
pai
commit
07fac0cf50
15 arquivos alterados com 659 adições e 85 exclusões
  1. 16 1
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/BackPolicyController.java
  2. 57 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java
  3. 65 16
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java
  4. 35 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackUnitEnum.java
  5. 59 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java
  6. 26 0
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java
  7. 5 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java
  8. 6 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java
  9. 5 2
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java
  10. 94 48
      game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java
  11. 10 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java
  12. 3 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/GameDataController.java
  13. 7 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java
  14. 7 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsPromotionDayService.java
  15. 264 9
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

+ 16 - 1
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/controller/BackPolicyController.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.back.serve.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.back.serve.pojo.dto.*;
+import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum;
 import com.zanxiang.game.back.serve.pojo.vo.*;
 import com.zanxiang.game.back.serve.service.*;
 import com.zanxiang.module.util.exception.BaseException;
@@ -13,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.math.BigDecimal;
 import java.util.List;
 
 @RestController
@@ -62,6 +62,10 @@ public class BackPolicyController {
     }
 
     private void checkDTO(GameBackPolicyDTO dto) {
+        BackUnitEnum backUnit = BackUnitEnum.getByValue(dto.getBackUnit());
+        if (backUnit == null) {
+            dto.setBackUnit(BackUnitEnum.UNIT_ONCE.getValue());
+        }
         if (dto.getFirstMinMoney().compareTo(dto.getFirstMaxMoney()) >= 0) {
             throw new BaseException("首充的大额金额必须大于小额金额");
         }
@@ -71,5 +75,16 @@ public class BackPolicyController {
         if (dto.getRegPayIntervalTime() != null && dto.getRegPayIntervalTime() <= 0) {
             throw new BaseException("注册充值回传的最大间隔时间不能小于 1");
         }
+        if (dto.getMarkUpOrder() == null) {
+            dto.setMarkUpOrder(false);
+        }
+        if (dto.getMarkUpOrder()) {
+            if (dto.getRegPayIntervalTime() == null) {
+                throw new BaseException("开启补单后必需填充值注册回传最大间隔时间");
+            }
+            if (dto.getMarkUpOrderMinMoney().compareTo(dto.getMarkUpOrderMaxMoney()) >= 0) {
+                throw new BaseException("首充的大额金额必须大于小额金额");
+            }
+        }
     }
 }

+ 57 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/dto/GameBackPolicyDTO.java

@@ -35,6 +35,9 @@ public class GameBackPolicyDTO implements Serializable {
     @ApiModelProperty("回传策略名")
     private String backPolicyName;
 
+    @ApiModelProperty("回传类型(1:首单、次单、2:首日、次日)")
+    private Integer backUnit;
+
     /**
      * 首充-小额判定金额(小于等于)
      */
@@ -157,5 +160,59 @@ public class GameBackPolicyDTO implements Serializable {
     @ApiModelProperty("注册充值回传的最大间隔时间(超时不回传)")
     private Long regPayIntervalTime;
 
+    /**
+     * 是否补单
+     */
+    @ApiModelProperty("是否补单")
+    private Boolean markUpOrder;
+
+    /**
+     * 补单-小额判定金额(小于等于)
+     */
+    @ApiModelProperty("补单-小额判定金额(小于等于)")
+    private BigDecimal markUpOrderMinMoney;
+
+    /**
+     * 补单-小额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-小额回传方式(概率/比例)")
+    private Integer markUpOrderMinMoneyType;
+
+    /**
+     * 补单-小额回传概率/比例
+     */
+    @ApiModelProperty("补单-小额回传概率/比例")
+    private String markUpOrderMinMoneyRate;
+
+    /**
+     * 补单-大额判定金额(大于等于)
+     */
+    @ApiModelProperty("补单-大额判定金额(大于等于)")
+    private BigDecimal markUpOrderMaxMoney;
+
+    /**
+     * 补单-大额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-大额回传方式(概率/比例)")
+    private Integer markUpOrderMaxMoneyType;
+
+    /**
+     * 补单-大额回传概率/比例
+     */
+    @ApiModelProperty("补单-大额回传概率/比例")
+    private String markUpOrderMaxMoneyRate;
+
+    /**
+     * 补单-其它金额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-其它金额回传方式(概率/比例)")
+    private Integer markUpOrderOtherMoneyType;
+
+    /**
+     * 补单-其它金额回传概率/比例
+     */
+    @ApiModelProperty("补单-其它金额回传概率/比例")
+    private String markUpOrderOtherMoneyRate;
+
 
 }

+ 65 - 16
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/entity/GameBackPolicy.java

@@ -38,82 +38,82 @@ public class GameBackPolicy implements Serializable {
     private String backPolicyName;
 
     /**
-     * 首充-小额判定金额(小于等于)
+     * 首充/日-小额判定金额(小于等于)
      */
     private Long firstMinMoney;
 
     /**
-     * 首充-小额回传方式(概率/比例)
+     * 首充/日-小额回传方式(概率/比例)
      */
     private Integer firstMinMoneyType;
 
     /**
-     * 首充-小额回传概率/比例
+     * 首充/日-小额回传概率/比例
      */
     private String firstMinMoneyRate;
 
     /**
-     * 首充-大额判定金额(大于等于)
+     * 首充/日-大额判定金额(大于等于)
      */
     private Long firstMaxMoney;
 
     /**
-     * 首充-大额回传方式(概率/比例)
+     * 首充/日-大额回传方式(概率/比例)
      */
     private Integer firstMaxMoneyType;
 
     /**
-     * 首充-大额回传概率/比例
+     * 首充/日-大额回传概率/比例
      */
     private String firstMaxMoneyRate;
 
     /**
-     * 首充-其它金额回传方式(概率/比例)
+     * 首充/日-其它金额回传方式(概率/比例)
      */
     private Integer firstOtherMoneyType;
 
     /**
-     * 首充-其它金额回传概率/比例
+     * 首充/日-其它金额回传概率/比例
      */
     private String firstOtherMoneyRate;
 
     /**
-     * 次单-小额判定金额(小于等于)
+     * 次单/日-小额判定金额(小于等于)
      */
     private Long rechargeMinMoney;
 
     /**
-     * 次单-小额回传方式(概率/比例)
+     * 次单/日-小额回传方式(概率/比例)
      */
     private Integer rechargeMinMoneyType;
 
     /**
-     * 次单-小额回传概率/比例
+     * 次单/日-小额回传概率/比例
      */
     private String rechargeMinMoneyRate;
 
     /**
-     * 次单-大额判定金额(大于等于)
+     * 次单/日-大额判定金额(大于等于)
      */
     private Long rechargeMaxMoney;
 
     /**
-     * 次单-大额回传方式(概率/比例)
+     * 次单/日-大额回传方式(概率/比例)
      */
     private Integer rechargeMaxMoneyType;
 
     /**
-     * 次单-大额回传概率/比例
+     * 次单/日-大额回传概率/比例
      */
     private String rechargeMaxMoneyRate;
 
     /**
-     * 次单-其它金额回传方式(概率/比例)
+     * 次单/日-其它金额回传方式(概率/比例)
      */
     private Integer rechargeOtherMoneyType;
 
     /**
-     * 次单-其它金额回传概率/比例
+     * 次单/日-其它金额回传概率/比例
      */
     private String rechargeOtherMoneyRate;
 
@@ -132,5 +132,54 @@ public class GameBackPolicy implements Serializable {
 
     private Long regPayIntervalTime;
 
+    /**
+     * 回传类型(1:首单、次单、2:首日、次日)
+     */
+    private Integer backUnit;
+
+    /**
+     * 是否补单
+     */
+    private Boolean markUpOrder;
+    /**
+     * 补单-小额判定金额(小于等于)
+     */
+    private Long markUpOrderMinMoney;
+
+    /**
+     * 补单-小额回传方式(概率/比例)
+     */
+    private Integer markUpOrderMinMoneyType;
+
+    /**
+     * 补单-小额回传概率/比例
+     */
+    private String markUpOrderMinMoneyRate;
+
+    /**
+     * 补单-大额判定金额(大于等于)
+     */
+    private Long markUpOrderMaxMoney;
+
+    /**
+     * 补单-大额回传方式(概率/比例)
+     */
+    private Integer markUpOrderMaxMoneyType;
+
+    /**
+     * 补单-大额回传概率/比例
+     */
+    private String markUpOrderMaxMoneyRate;
+
+    /**
+     * 补单-其它金额回传方式(概率/比例)
+     */
+    private Integer markUpOrderOtherMoneyType;
+
+    /**
+     * 补单-其它金额回传概率/比例
+     */
+    private String markUpOrderOtherMoneyRate;
+
 
 }

+ 35 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/enums/BackUnitEnum.java

@@ -0,0 +1,35 @@
+package com.zanxiang.game.back.serve.pojo.enums;
+
+import lombok.Getter;
+
+import java.util.Objects;
+
+@Getter
+public enum BackUnitEnum {
+    /**
+     * 未回传
+     */
+    UNIT_ONCE(1),
+    /**
+     * 回传成功
+     */
+    UNIT_DAY(2);
+
+    private final Integer value;
+
+    BackUnitEnum(Integer value) {
+        this.value = value;
+    }
+
+    public static BackUnitEnum getByValue(Integer value) {
+        if (value == null) {
+            return null;
+        }
+        for (BackUnitEnum backUnit : BackUnitEnum.values()) {
+            if (Objects.equals(backUnit.getValue(), value)) {
+                return backUnit;
+            }
+        }
+        return null;
+    }
+}

+ 59 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/pojo/vo/GameBackPolicyVO.java

@@ -31,6 +31,9 @@ public class GameBackPolicyVO implements Serializable {
     @ApiModelProperty("回传策略名")
     private String backPolicyName;
 
+    @ApiModelProperty("回传类型(1:首单、次单、2:首日、次日)")
+    private Integer backUnit;
+
     /**
      * 首充-小额判定金额(小于等于)
      */
@@ -138,7 +141,63 @@ public class GameBackPolicyVO implements Serializable {
     private Long createBy;
 
     private String createName;
+
+    @ApiModelProperty("充值注册最大间隔时间(超时不回传)")
     private Long regPayIntervalTime;
 
+    /**
+     * 是否补单
+     */
+    @ApiModelProperty("是否补单")
+    private Boolean markUpOrder;
+
+    /**
+     * 补单-小额判定金额(小于等于)
+     */
+    @ApiModelProperty("补单-小额判定金额(小于等于)")
+    private BigDecimal markUpOrderMinMoney;
+
+    /**
+     * 补单-小额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-小额回传方式(概率/比例)")
+    private Integer markUpOrderMinMoneyType;
+
+    /**
+     * 补单-小额回传概率/比例
+     */
+    @ApiModelProperty("补单-小额回传概率/比例")
+    private String markUpOrderMinMoneyRate;
+
+    /**
+     * 补单-大额判定金额(大于等于)
+     */
+    @ApiModelProperty("补单-大额判定金额(大于等于)")
+    private BigDecimal markUpOrderMaxMoney;
+
+    /**
+     * 补单-大额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-大额回传方式(概率/比例)")
+    private Integer markUpOrderMaxMoneyType;
+
+    /**
+     * 补单-大额回传概率/比例
+     */
+    @ApiModelProperty("补单-大额回传概率/比例")
+    private String markUpOrderMaxMoneyRate;
+
+    /**
+     * 补单-其它金额回传方式(概率/比例)
+     */
+    @ApiModelProperty("补单-其它金额回传方式(概率/比例)")
+    private Integer markUpOrderOtherMoneyType;
+
+    /**
+     * 补单-其它金额回传概率/比例
+     */
+    @ApiModelProperty("补单-其它金额回传概率/比例")
+    private String markUpOrderOtherMoneyRate;
+
 
 }

+ 26 - 0
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameBackPolicyServiceImpl.java

@@ -99,6 +99,16 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .createBy(SecurityUtil.getUserId())
                 .createTime(LocalDateTime.now())
                 .regPayIntervalTime(dto.getRegPayIntervalTime())
+                .backUnit(dto.getBackUnit())
+                .markUpOrder(dto.getMarkUpOrder())
+                .markUpOrderMinMoney(dto.getMarkUpOrderMinMoney() == null ? null : NumberUtil.multiply100(dto.getMarkUpOrderMinMoney()).longValue())
+                .markUpOrderMinMoneyType(dto.getMarkUpOrderMinMoneyType())
+                .markUpOrderMinMoneyRate(dto.getMarkUpOrderMinMoneyRate())
+                .markUpOrderMaxMoney(dto.getMarkUpOrderMaxMoney() == null ? null : NumberUtil.multiply100(dto.getMarkUpOrderMaxMoney()).longValue())
+                .markUpOrderMaxMoneyType(dto.getFirstMaxMoneyType())
+                .markUpOrderMaxMoneyRate(dto.getMarkUpOrderMaxMoneyRate())
+                .markUpOrderOtherMoneyType(dto.getFirstOtherMoneyType())
+                .markUpOrderOtherMoneyRate(dto.getMarkUpOrderMaxMoneyRate())
                 .build();
         return gameBackPolicyService.save(backPolicy);
     }
@@ -134,6 +144,16 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
                 .createTime(old.getCreateTime())
                 .updateBy(SecurityUtil.getUserId())
                 .updateTime(LocalDateTime.now())
+                .backUnit(dto.getBackUnit())
+                .markUpOrder(dto.getMarkUpOrder())
+                .markUpOrderMinMoney(dto.getMarkUpOrderMinMoney() == null ? null : NumberUtil.multiply100(dto.getMarkUpOrderMinMoney()).longValue())
+                .markUpOrderMinMoneyType(dto.getMarkUpOrderMinMoneyType())
+                .markUpOrderMinMoneyRate(dto.getMarkUpOrderMinMoneyRate())
+                .markUpOrderMaxMoney(dto.getMarkUpOrderMaxMoney() == null ? null : NumberUtil.multiply100(dto.getMarkUpOrderMaxMoney()).longValue())
+                .markUpOrderMaxMoneyType(dto.getFirstMaxMoneyType())
+                .markUpOrderMaxMoneyRate(dto.getMarkUpOrderMaxMoneyRate())
+                .markUpOrderOtherMoneyType(dto.getFirstOtherMoneyType())
+                .markUpOrderOtherMoneyRate(dto.getMarkUpOrderMaxMoneyRate())
                 .build();
 
         return gameBackPolicyService.updateById(backPolicy);
@@ -161,6 +181,12 @@ public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper,
         vo.setFirstMaxMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getFirstMaxMoney())));
         vo.setRechargeMinMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getRechargeMinMoney())));
         vo.setRechargeMaxMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getRechargeMaxMoney())));
+        if (gameBackPolicy.getMarkUpOrderMinMoney() != null) {
+            vo.setMarkUpOrderMinMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getMarkUpOrderMinMoney())));
+        }
+        if (gameBackPolicy.getMarkUpOrderMaxMoney() != null) {
+            vo.setMarkUpOrderMaxMoney(NumberUtil.divide100(new BigDecimal(gameBackPolicy.getMarkUpOrderMaxMoney())));
+        }
         return vo;
     }
 

+ 5 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameOceanengineOrderLogServiceImpl.java

@@ -75,13 +75,16 @@ public class GameOceanengineOrderLogServiceImpl extends ServiceImpl<GameOceaneng
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderNo(), gameBackPolicy, orderLog.getAmount(),
                         orderLog.getIsFirstOrder(),
                         orderLog.getPayTime(), orderLog.getRegTime(),
-                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
+                        (backUnit, isFirstOrder, firstDay, markUpTime) -> Long.valueOf(list(new LambdaQueryWrapper<GameOceanengineOrderLog>()
                                         .eq(GameOceanengineOrderLog::getGameId, orderLog.getGameId())
                                         .eq(GameOceanengineOrderLog::getAppId, orderLog.getAppId())
                                         .eq(GameOceanengineOrderLog::getAccountId, orderLog.getAccountId())
                                         .eq(GameOceanengineOrderLog::getBackPolicyId, gameBackPolicy.getId())
                                         .eq(GameOceanengineOrderLog::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
-                                        .eq(GameOceanengineOrderLog::getIsFirstOrder, isFirstOrder)
+                                        .eq(isFirstOrder != null, GameOceanengineOrderLog::getIsFirstOrder, isFirstOrder)
+                                        .apply(firstDay != null && firstDay, "date(reg_time) = date(pay_time)")
+                                        .apply(firstDay != null && !firstDay, "date(reg_time) != date(pay_time)")
+                                        .apply(markUpTime != null, "TIMESTAMPDIFF(MINUTE, reg_time, pay_time) > {0}", markUpTime)
                                         .ne(GameOceanengineOrderLog::getOrderNo, orderLog.getOrderNo())
                                         .orderByDesc(GameOceanengineOrderLog::getCreateTime)
                                         .last("limit " + backUnit)

+ 6 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentMiniGameOrderServiceImpl.java

@@ -13,6 +13,7 @@ import com.zanxiang.game.back.base.pojo.enums.OrderStatusEnum;
 import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameOrderMapper;
 import com.zanxiang.game.back.serve.pojo.dto.GameTencentMiniGameOrderDTO;
 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
+import com.zanxiang.game.back.serve.pojo.entity.GameOceanengineOrderLog;
 import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameOrder;
 import com.zanxiang.game.back.serve.pojo.enums.BackStatusEnum;
 import com.zanxiang.game.back.serve.pojo.vo.GameTencentMiniGameOrderVO;
@@ -81,13 +82,16 @@ public class GameTencentMiniGameOrderServiceImpl extends ServiceImpl<GameTencent
                 // 此处是否是首单用 limit 2。因为在执行判断之前订单已入库,所以库里只有一笔才是首单
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
                         orderLog.getIsFirstOrder(), orderLog.getPayTime(), orderLog.getRegisterTime(),
-                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
+                        (backUnit, isFirstOrder, firstDay, markUpTime) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentMiniGameOrder>()
                                         .eq(GameTencentMiniGameOrder::getGameId, orderLog.getGameId())
                                         .eq(GameTencentMiniGameOrder::getWechatAppId, orderLog.getWechatAppId())
                                         .eq(GameTencentMiniGameOrder::getAdAccountId, orderLog.getAdAccountId())
                                         .eq(GameTencentMiniGameOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
                                         .eq(GameTencentMiniGameOrder::getBackPolicyId, gameBackPolicy.getId())
-                                        .eq(GameTencentMiniGameOrder::getIsFirstOrder, isFirstOrder)
+                                        .eq(isFirstOrder != null, GameTencentMiniGameOrder::getIsFirstOrder, isFirstOrder)
+                                        .apply(firstDay != null && firstDay, "date(register_time) = date(pay_time)")
+                                        .apply(firstDay != null && !firstDay, "date(register_time) != date(pay_time)")
+                                        .apply(markUpTime != null, "TIMESTAMPDIFF(MINUTE, register_time, pay_time) > {0}", markUpTime)
                                         .ne(GameTencentMiniGameOrder::getOrderId, orderLog.getOrderId())
                                         .orderByDesc(GameTencentMiniGameOrder::getCreateTime)
                                         .last("limit " + backUnit)

+ 5 - 2
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/service/impl/GameTencentOrderServiceImpl.java

@@ -91,13 +91,16 @@ public class GameTencentOrderServiceImpl extends ServiceImpl<GameTencentOrderMap
                 GameBackPolicy gameBackPolicy = gameBackPolicyService.getById(orderLog.getBackPolicyId());
                 doBack = BackPolicyUtil.backOrder(orderLog.getOrderId(), gameBackPolicy, orderLog.getRechargeMoney(),
                         orderLog.getIsFirstOrder(), orderLog.getPayTime(), orderLog.getRegisterTime(),
-                        (backUnit, isFirstOrder) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentOrder>()
+                        (backUnit, isFirstOrder, firstDay, markUpTime) -> Long.valueOf(list(new LambdaQueryWrapper<GameTencentOrder>()
                                         .eq(GameTencentOrder::getGameId, orderLog.getGameId())
                                         .eq(GameTencentOrder::getWechatAppId, orderLog.getWechatAppId())
                                         .eq(GameTencentOrder::getAdAccountId, orderLog.getAdAccountId())
                                         .eq(GameTencentOrder::getBackPolicyId, gameBackPolicy.getId())
                                         .eq(GameTencentOrder::getOrderStatus, OrderStatusEnum.SUCCESS_PAY.getValue())
-                                        .eq(GameTencentOrder::getIsFirstOrder, isFirstOrder)
+                                        .eq(isFirstOrder != null, GameTencentOrder::getIsFirstOrder, isFirstOrder)
+                                        .apply(firstDay != null && firstDay, "date(register_time) = date(pay_time)")
+                                        .apply(firstDay != null && !firstDay, "date(register_time) != date(pay_time)")
+                                        .apply(markUpTime != null, "TIMESTAMPDIFF(MINUTE, register_time, pay_time) > {0}", markUpTime)
                                         .ne(GameTencentOrder::getOrderId, orderLog.getOrderId())
                                         .orderByDesc(GameTencentOrder::getCreateTime)
                                         .last("limit " + backUnit)

+ 94 - 48
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/utils/BackPolicyUtil.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.back.serve.utils;
 import com.github.sd4324530.jtuple.Tuple2;
 import com.github.sd4324530.jtuple.Tuples;
 import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
+import com.zanxiang.game.back.serve.pojo.enums.BackUnitEnum;
 import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.NumberUtil;
@@ -36,56 +37,101 @@ public class BackPolicyUtil {
             log.error("订单 id[{}]通过回传策略[null]判断后,是否回传:{}.", orderId, true);
             return true;
         }
-        log.error("----orderId: {}, backPolicy: {}, money: {}", orderId, JsonUtil.toString(gameBackPolicy), rechargeMoney);
-        if (payTime != null && gameBackPolicy.getRegPayIntervalTime() != null) {
-            long regPayIntervalMinute = (DateUtil.localDateTimeToSecond(payTime) - DateUtil.localDateTimeToSecond(regTime)) / 60;
-            if (regPayIntervalMinute > gameBackPolicy.getRegPayIntervalTime()) {
-                log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,不回传{}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime());
-                return false;
-            }
-        }
-        Integer firstType;
-        String firstRate;
-        Integer rechargeType;
-        String rechargeRate;
-        if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) {
-            // 小于首充金额
-            firstType = gameBackPolicy.getFirstMinMoneyType();
-            firstRate = gameBackPolicy.getFirstMinMoneyRate();
-        } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) {
-            firstType = gameBackPolicy.getFirstMaxMoneyType();
-            firstRate = gameBackPolicy.getFirstMaxMoneyRate();
-        } else {
-            firstType = gameBackPolicy.getFirstOtherMoneyType();
-            firstRate = gameBackPolicy.getFirstOtherMoneyRate();
-        }
-        if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) {
-            rechargeType = gameBackPolicy.getRechargeMinMoneyType();
-            rechargeRate = gameBackPolicy.getRechargeMinMoneyRate();
-        } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) {
-            rechargeType = gameBackPolicy.getRechargeMaxMoneyType();
-            rechargeRate = gameBackPolicy.getRechargeMaxMoneyRate();
-        } else {
-            rechargeType = gameBackPolicy.getRechargeOtherMoneyType();
-            rechargeRate = gameBackPolicy.getRechargeOtherMoneyRate();
-        }
-        boolean firstPolicy = false;
+        BackUnitEnum backUnit = gameBackPolicy.getBackUnit() == null ? BackUnitEnum.UNIT_ONCE : BackUnitEnum.getByValue(gameBackPolicy.getBackUnit());
+
+        Boolean firstPolicy = null, firstDay = null;
+        Long markUpTime = null;
         Integer backType;
         String backRate;
-        if (firstType.equals(rechargeType) && firstRate.equalsIgnoreCase(rechargeRate)) {
-            // 回传内容相同,不需要区分是不是首单
-            backType = firstType;
-            backRate = firstRate;
+        if (gameBackPolicy.getRegPayIntervalTime() != null
+                && ((DateUtil.localDateTimeToSecond(payTime) - DateUtil.localDateTimeToSecond(regTime)) / 60) > gameBackPolicy.getRegPayIntervalTime()) {
+            if (gameBackPolicy.getMarkUpOrder() != null && gameBackPolicy.getMarkUpOrder()) {
+                markUpTime = gameBackPolicy.getRegPayIntervalTime();
+                if (rechargeMoney <= gameBackPolicy.getMarkUpOrderMinMoney()) {
+                    // 小额
+                    backType = gameBackPolicy.getMarkUpOrderMinMoneyType();
+                    backRate = gameBackPolicy.getMarkUpOrderMinMoneyRate();
+                } else if (rechargeMoney >= gameBackPolicy.getMarkUpOrderMaxMoney()) {
+                    // 大额
+                    backType = gameBackPolicy.getMarkUpOrderMaxMoneyType();
+                    backRate = gameBackPolicy.getMarkUpOrderMaxMoneyRate();
+                } else {
+                    backType = gameBackPolicy.getMarkUpOrderOtherMoneyType();
+                    backRate = gameBackPolicy.getMarkUpOrderOtherMoneyRate();
+                }
+                log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,走补单逻辑 {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime());
+            } else {
+                log.error("订单 id[{}]通过回传策略[{}]判断后,超过注册充值间隔时间,不回穿 {}.", orderId, gameBackPolicy.getId(), gameBackPolicy.getRegPayIntervalTime());
+                return false;
+            }
         } else {
-            if (isFirstOrder) {
-                log.error("订单{}是首单", orderId);
-                backType = firstType;
-                backRate = firstRate;
-                firstPolicy = true;
+            if (backUnit == BackUnitEnum.UNIT_ONCE) {
+                if (isFirstOrder) {
+                    firstPolicy = true;
+                    if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) {
+                        // 小额
+                        backType = gameBackPolicy.getFirstMinMoneyType();
+                        backRate = gameBackPolicy.getFirstMinMoneyRate();
+                    } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) {
+                        // 大额
+                        backType = gameBackPolicy.getFirstMaxMoneyType();
+                        backRate = gameBackPolicy.getFirstMaxMoneyRate();
+                    } else {
+                        backType = gameBackPolicy.getFirstOtherMoneyType();
+                        backRate = gameBackPolicy.getFirstOtherMoneyRate();
+                    }
+                    log.error("订单 id[{}]通过回传策略[{}]判断后,正常回传. 首单:{}, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), true, backType, backRate);
+                } else {
+                    firstPolicy = false;
+                    if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) {
+                        // 小额
+                        backType = gameBackPolicy.getRechargeMinMoneyType();
+                        backRate = gameBackPolicy.getRechargeMinMoneyRate();
+                    } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) {
+                        // 大额
+                        backType = gameBackPolicy.getRechargeMaxMoneyType();
+                        backRate = gameBackPolicy.getRechargeMaxMoneyRate();
+                    } else {
+                        backType = gameBackPolicy.getRechargeOtherMoneyType();
+                        backRate = gameBackPolicy.getRechargeOtherMoneyRate();
+                    }
+                    log.error("订单 id[{}]通过回传策略[{}]判断后,正常回传. 首单:{}, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), false, backType, backRate);
+                }
+            } else if (backUnit == BackUnitEnum.UNIT_DAY) {
+                long intervalDays = DateUtil.intervalOfDays(regTime.toLocalDate(), payTime.toLocalDate());
+                if (intervalDays == 0) {
+                    firstDay = true;
+                    if (rechargeMoney <= gameBackPolicy.getFirstMinMoney()) {
+                        // 小额
+                        backType = gameBackPolicy.getFirstMinMoneyType();
+                        backRate = gameBackPolicy.getFirstMinMoneyRate();
+                    } else if (rechargeMoney >= gameBackPolicy.getFirstMaxMoney()) {
+                        // 大额
+                        backType = gameBackPolicy.getFirstMaxMoneyType();
+                        backRate = gameBackPolicy.getFirstMaxMoneyRate();
+                    } else {
+                        backType = gameBackPolicy.getFirstOtherMoneyType();
+                        backRate = gameBackPolicy.getFirstOtherMoneyRate();
+                    }
+                    log.error("订单 id[{}]通过回传策略[{}]判断后,正常回传. 首日:{}, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), true, backType, backRate);
+                } else {
+                    firstDay = false;
+                    if (rechargeMoney <= gameBackPolicy.getRechargeMinMoney()) {
+                        // 小额
+                        backType = gameBackPolicy.getRechargeMinMoneyType();
+                        backRate = gameBackPolicy.getRechargeMinMoneyRate();
+                    } else if (rechargeMoney >= gameBackPolicy.getRechargeMaxMoney()) {
+                        // 大额
+                        backType = gameBackPolicy.getRechargeMaxMoneyType();
+                        backRate = gameBackPolicy.getRechargeMaxMoneyRate();
+                    } else {
+                        backType = gameBackPolicy.getRechargeOtherMoneyType();
+                        backRate = gameBackPolicy.getRechargeOtherMoneyRate();
+                    }
+                    log.error("订单 id[{}]通过回传策略[{}]判断后,正常回传. 首日:{}, backType: {}, backRate: {}", orderId, gameBackPolicy.getId(), false, backType, backRate);
+                }
             } else {
-                log.error("订单{}不是首单", orderId);
-                backType = rechargeType;
-                backRate = rechargeRate;
+                throw new RuntimeException("未知的回传单位:" + backUnit);
             }
         }
         if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_FIXED_RATE)) {
@@ -101,7 +147,7 @@ public class BackPolicyUtil {
                 log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), true);
                 return true;
             }
-            int isBackCount = lastBackFunction.getLastBackCount(backCount + ignoreCount - 1, firstPolicy);
+            int isBackCount = lastBackFunction.getLastBackCount(backCount + ignoreCount - 1, firstPolicy, firstDay, markUpTime);
             log.error("订单 id[{}]通过回传策略[{}]判断后,是否回传:{}.", orderId, gameBackPolicy.getId(), (isBackCount < backCount));
             return isBackCount < backCount;
         } else if (Objects.equals(backType, GameBackPolicy.POLICY_TYPE_RANDOM_RATE)) {
@@ -151,6 +197,6 @@ public class BackPolicyUtil {
     }
 
     public interface LastBackFunction {
-        int getLastBackCount(int backUnit, boolean isFirstOrder);
+        int getLastBackCount(int backUnit, Boolean isFirstOrder, Boolean firstDay, Long markUpTime);
     }
 }

+ 10 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsPromotionDayController.java

@@ -1,5 +1,6 @@
 package com.zanxiang.game.data.serve.controller;
 
+import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayTotalDTO;
 import com.zanxiang.game.data.serve.pojo.vo.PromotionDayTotalVO;
@@ -31,17 +32,24 @@ public class AdsPromotionDayController {
     private IAdsPromotionDayService adsPromotionDayService;
 
     @ApiOperation(value = "广告监控数据")
-    //@PreAuthorize(permissionKey = "promotionData:adsPromotionDay:day")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:day")
     @PostMapping("/day")
     public ResultVO<Page<PromotionDayVO>> getPromotionDayData(@RequestBody PromotionDayDTO dto){
         return ResultVO.ok(adsPromotionDayService.getPromotionDayData(dto));
     }
 
     @ApiOperation(value = "广告监控数据总计")
-    //@PreAuthorize(permissionKey = "promotionData:adsPromotionDay:total")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:total")
     @PostMapping("/total")
     public ResultVO<PromotionDayTotalVO> getPromotionDayTotalData(@RequestBody PromotionDayTotalDTO dto) {
         return ResultVO.ok(adsPromotionDayService.getPromotionDayTotalData(dto));
     }
 
+    @ApiOperation(value = "广告监控每日数据")
+    @PreAuthorize(permissionKey = "promotionData:adsPromotionDay:dayList")
+    @PostMapping("/day/list")
+    public ResultVO<Page<PromotionDayVO>> getPromotionDayListData(@RequestBody PromotionDayDTO dto){
+        return ResultVO.ok(adsPromotionDayService.getPromotionDayListData(dto));
+    }
+
 }

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

@@ -59,7 +59,7 @@ public class GameDataController {
     }
 
     @ApiOperation(value = "游戏总数据")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:total")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:total")
     @PostMapping("/total")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameDataTotalVO.class)})
     public ResultVO<Page<GameDataTotalVO>> getGameDataTotal(@RequestBody GameDataTotalDTO dto) {
@@ -67,8 +67,8 @@ public class GameDataController {
     }
 
     @ApiOperation(value = "游戏总数据总计")
-    //@PreAuthorize(permissionKey = "gameData:adsGameDay:totalTotal")
-    @PostMapping("/total/total")
+    @PreAuthorize(permissionKey = "gameData:adsGameDay:totalSum")
+    @PostMapping("/total/sum")
     public ResultVO<GameDataTotalTotalVO> getGameDataTotalTotal(@RequestBody GameDataTotalTotalDTO dto) {
         return ResultVO.ok(gameDataService.getGameDataTotalTotal(dto));
     }

+ 7 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 
 /**
  * @author tianhua
@@ -19,6 +20,12 @@ import java.math.BigDecimal;
 @Builder
 public class PromotionDayVO {
 
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "时间")
+    private LocalDate dt;
+
     /**
      * 广告ID
      */

+ 7 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IAdsPromotionDayService.java

@@ -22,4 +22,11 @@ public interface IAdsPromotionDayService {
      */
     PromotionDayTotalVO getPromotionDayTotalData(PromotionDayTotalDTO dto);
 
+    /**
+     * 广告监控每日数据
+     * @param dto
+     * @return
+     */
+    Page<PromotionDayVO> getPromotionDayListData(PromotionDayDTO dto);
+
 }

+ 264 - 9
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -1,6 +1,5 @@
 package com.zanxiang.game.data.serve.service.impl;
 
-import com.google.common.base.CaseFormat;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PromotionDayTotalDTO;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
@@ -9,6 +8,7 @@ import com.zanxiang.game.data.serve.pojo.vo.PromotionDayVO;
 import com.zanxiang.game.data.serve.pojo.vo.PromotionRechargeTrendVO;
 import com.zanxiang.game.data.serve.service.IAdsPromotionDayService;
 import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
@@ -43,8 +44,99 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
     @Autowired
     private Dao dao;
 
+    /**
+     * 广告监控每日数据列表
+     *
+     * @param dto
+     * @return
+     */
+    public Page<PromotionDayVO> getPromotionDayListData(PromotionDayDTO dto) {
+        //不传递查询条件默认查询当天数据
+        if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
+            dto.setCostBeginDate(LocalDate.now());
+            dto.setCostEndDate(LocalDate.now());
+        }
+        //如果没有排序条件给默认值
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            dto.setSortFiled("todayCost");
+        }
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        Criteria cri = myCri(dto, false);
+        //创建sql语句
+        Sql sql = Sqls.create(getPromotionDayListSql() + cri);
+        //添加自定义回传对象
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(PromotionDayVO.class));
+        //设置pager对象
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        sql.setPager(pager);
+        //执行sql
+        dao.execute(sql);
+        //获取到结果list
+        List<PromotionDayVO> list = sql.getList(PromotionDayVO.class);
+        //分页对象设置总条数
+        Sql sqlCount = Sqls.create("select count(*) from ads_promotion_day" + cri);
+        sqlCount.setCallback(Sqls.callback.integer());
+        //执行sql
+        dao.execute(sqlCount);
+        pager.setRecordCount(sqlCount.getInt());
+
+        //处理List中的每个vo对象缺少的数据
+        list.stream().map(vo -> {
+
+            //总充值次数成本
+            vo.setTotalAmountCountCost(vo.getTotalAmountCount() == 0L ? BigDecimal.ZERO :
+                    vo.getPromotionTotalCost().divide(BigDecimal.valueOf(vo.getTotalAmountCount()), 2, RoundingMode.HALF_UP));
+
+            //计算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());
+
+        //排序
+        listSort(dto, list);
+
+        //返回查询得结果
+        return new Page<>(list, pager);
+    }
+
     /**
      * 广告监控数据
+     *
      * @param dto
      * @return
      */
@@ -57,12 +149,12 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         }
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
-            dto.setSortFiled("today_cost");
+            dto.setSortFiled("todayCost");
         }
         if (StringUtils.isBlank(dto.getSortType())) {
             dto.setSortType(OrderByEnum.DESC.getOrderType());
         }
-        Criteria cri = myCri(dto);
+        Criteria cri = myCri(dto, true);
         //创建sql语句
         Sql sql = Sqls.create(getPromotionDayDataSql() + cri);
         //添加自定义回传对象
@@ -145,6 +237,9 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
             return vo;
         }).collect(Collectors.toList());
 
+        //排序
+        listSort(dto, list);
+
         //返回查询得结果
         return new Page<>(list, pager);
     }
@@ -339,10 +434,11 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
     /**
      * 广告监控用到的查询条件
      *
-     * @param dto 前端传递的查询条件
+     * @param dto         前端传递的查询条件
+     * @param needGroupBy 需要聚合分组
      * @return 查询条件
      */
-    private Criteria myCri(PromotionDayDTO dto) {
+    private Criteria myCri(PromotionDayDTO dto, Boolean needGroupBy) {
         //创建查询条件
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {
@@ -393,10 +489,10 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         if (StringUtils.isNotBlank(dto.getSourceSystem())) {
             cri.where().andEquals("source_system", dto.getSourceSystem());
         }
-        //拼接分组条件
-        cri.getGroupBy().groupBy("promotion_id");
-        //拼接排序条件
-        cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
+        if (needGroupBy) {
+            //拼接分组条件
+            cri.getGroupBy().groupBy("promotion_id");
+        }
 
         return cri;
     }
@@ -463,6 +559,165 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         return notNullFieldSet.toArray(notNullField);
     }
 
+    /**
+     * 排序
+     * @param dto 前端传递的查询条件
+     * @param list 排序后的list
+     */
+    private void listSort(PromotionDayDTO dto, List<PromotionDayVO> list) {
+        try {
+            //得到排序字段得反射
+            Field field = PromotionDayVO.class.getDeclaredField(dto.getSortFiled());
+            field.setAccessible(true);
+            //是否升序
+            boolean isASC = !dto.getSortType().equals("desc");
+
+            list.sort((o1, o2) -> {
+                try {
+                    //字段属性得get方法得到的值
+                    Object value1 = field.get(o1);
+                    Object value2 = field.get(o2);
+                    if (value1 instanceof BigDecimal num1 && value2 instanceof BigDecimal num2) {
+                        return isASC ? num1.compareTo(num2) : num2.compareTo(num1);
+                    } else if (value1 instanceof Long l1 && value2 instanceof Long l2) {
+                        return isASC ? l1.compareTo(l2) : l2.compareTo(l1);
+                    }
+                } catch (IllegalAccessException e) {
+                    throw new BaseException("排序出错");
+                }
+                return 0;
+            });
+        } catch (NoSuchFieldException e) {
+            throw new BaseException("排序出错");
+        }
+    }
+
+    /**
+     * 广告监控每日数据sql
+     *
+     * @return String
+     */
+    private String getPromotionDayListSql() {
+        return """
+                SELECT
+                    dt,
+                    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,
+                    total_recharge_cost,
+                	promotion_id,
+                	promotion_name,
+                	project_id,
+                	project_name,
+                	account_name,
+                	account_id,
+                	account_type,
+                	pitcher_id,
+                	pitcher_name,
+                	agent_id,
+                	agent_name,
+                	agent_key,
+                	cp_name,
+                	game_id,
+                	game_name,
+                	classify,
+                	today_cost,
+                	show_count,
+                	thousand_display_price,
+                	click_count,
+                	avg_click_cost,
+                	ctr,
+                	convert_count,
+                	convert_cost,
+                	convert_rate,
+                	reg_num,
+                	first_role_num,
+                	new_user_total_role_num,
+                	reg_cost,
+                	first_role_cost,
+                	new_user_total_role_cost,
+                	first_role_rate,
+                	new_user_total_role_rate,
+                	first_new_user_amount_count,
+                	first_new_user_amount_num,
+                	first_new_user_amount,
+                	new_user_total_amount_count,
+                	new_user_total_amount_num,
+                	new_user_total_amount,
+                	first_roi,
+                	twenty_four_hours_amount,
+                	twenty_four_hours_roi,
+                	total_roi,
+                	first_new_user_recharge_cost,
+                	new_user_total_recharge_cost,
+                	first_new_user_arppu,
+                	new_user_total_amount_arppu,
+                	first_new_user_hundred_user_num,
+                	first_new_user_hundred_user_cost,
+                	first_recharge_fifty_hundred_num,
+                	first_recharge_fifty_hundred_rate,
+                	first_new_user_two_hundred_user_num,
+                	first_new_user_two_hundred_user_cost,
+                	new_user_total_hundred_user_num,
+                	new_user_total_hundred_user_cost,
+                	first_ios_amount_num,
+                	first_ios_amount_count,
+                	first_ios_amount,
+                	first_ios_amount_num_rate,
+                	first_ios_amount_rate,
+                	first_ios_amount_roi,
+                	first_android_amount_count,
+                	first_android_amount_num,
+                	first_android_amount,
+                	first_android_amount_num_rate,
+                	first_android_amount_rate,
+                	first_android_amount_roi,
+                	first_amount_rate,
+                	first_new_user_avg_price,
+                	new_user_total_avg_price,
+                	d1,
+                	d2,
+                	d3,
+                	d7,
+                	d15,
+                	active,
+                    active_cost,
+                    first_convert_count,
+                    first_convert_cost,
+                    first_active_pay_rate,
+                    first_attribution_game_in_app_ltv1day,
+                    first_attribution_game_in_app_roi1day,
+                    game_pay_count,
+                    ROUND(IF(game_pay_count > 0, today_cost / game_pay_count, 0), 2) as game_pay_count_cost,
+                    ltv_day1,
+                    sub_order_num,
+                    sub_order_amount,
+                    ROUND(IF(first_new_user_amount_count > 0, today_cost / first_new_user_amount_count, 0), 2) as first_new_user_amount_count_cost,
+                    ROUND(IF(new_user_total_amount_count > 0, today_cost / new_user_total_amount_count, 0), 2) as new_user_total_amount_count_cost
+                FROM
+                	game_ads.ads_promotion_day
+                """;
+    }
+
     /**
      * 查询广告监控数据sql
      *