Kaynağa Gözat

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

bilingfeng 1 yıl önce
ebeveyn
işleme
8b0e007198
22 değiştirilmiş dosya ile 1211 ekleme ve 43 silme
  1. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsGameServerController.java
  2. 12 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/ChoiceListController.java
  3. 42 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameServerListDTO.java
  4. 8 2
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleRechargeRankingDTO.java
  5. 50 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameServerVO.java
  6. 56 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayTotalVO.java
  7. 56 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java
  8. 12 8
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameServerService.java
  9. 55 12
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java
  10. 33 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java
  11. 9 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java
  12. 71 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameAdMonitorController.java
  13. 138 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyAddOrUpdateParam.java
  14. 50 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyBatchOperationParam.java
  15. 34 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyBatchStartParam.java
  16. 44 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyListParam.java
  17. 192 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdPolicyListVO.java
  18. 61 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdRuleConditionVO.java
  19. 32 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameAdMonitorService.java
  20. 228 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAdMonitorServiceImpl.java
  21. 14 9
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAdMonitor.java
  22. 13 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameAdMonitorMapper.java

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

@@ -57,7 +57,7 @@ public class AdsGameServerController {
     }
 
     @ApiOperation(value = "游戏区服每日数据总计一栏")
-    //@PreAuthorize(permissionKey = "gameServer:GameServerSumDay:dayTotal")
+    @PreAuthorize(permissionKey = "gameServer:GameServerSumDay:dayTotal")
     @PostMapping("sum/day/total")
     public ResultVO<GameServerSumDayTotalVO> getGameServerDataSumDayTotal(@RequestBody GameServerSumDayTotalDTO dto) {
         return ResultVO.ok(gameServerService.getGameServerDataSumDayTotal(dto));

+ 12 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/ChoiceListController.java

@@ -2,10 +2,8 @@ package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.data.serve.pojo.dto.ChoiceListDTO;
-import com.zanxiang.game.data.serve.pojo.vo.AccountListVO;
-import com.zanxiang.game.data.serve.pojo.vo.AgentListVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameListVO;
-import com.zanxiang.game.data.serve.pojo.vo.PitcherListVO;
+import com.zanxiang.game.data.serve.pojo.dto.GameServerListDTO;
+import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.service.*;
 import com.zanxiang.module.util.pojo.ResultVO;
 import io.swagger.annotations.Api;
@@ -43,6 +41,9 @@ public class ChoiceListController {
     @Autowired
     private IVipLevelService vipLevelService;
 
+    @Autowired
+    private IGameServerService gameServerService;
+
     @ApiOperation(value = "所有游戏列表")
     @PreAuthorize(permissionKey = "gameData:choice:gameList")
     @PostMapping("/game/list")
@@ -78,4 +79,11 @@ public class ChoiceListController {
         return ResultVO.ok(vipLevelService.getMaxVipLevel());
     }
 
+    @ApiOperation(value = "所有区服列表(原始区服)")
+    @PreAuthorize(permissionKey = "gameData:choice:gameServerList")
+    @PostMapping("/gameServer/list")
+    public ResultVO<List<GameServerVO>> getPitcherList(@RequestBody GameServerListDTO dto) {
+        return ResultVO.ok(gameServerService.getAllGameServer(dto));
+    }
+
 }

+ 42 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameServerListDTO.java

@@ -0,0 +1,42 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 游戏区服下拉列表刷选
+ * @date 2023/11/3 16:24
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameServerListDTO {
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty(value = "游戏ID")
+    private List<Long> gameId;
+
+    /**
+     * 父游戏ID
+     */
+    @ApiModelProperty(value = "父游戏ID")
+    private List<Long> parentGameId;
+
+
+}

+ 8 - 2
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/RoleRechargeRankingDTO.java

@@ -37,13 +37,19 @@ public class RoleRechargeRankingDTO extends BasePage {
      * 子游戏ID
      */
     @ApiModelProperty(value = "子游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 父游戏ID
      */
     @ApiModelProperty(value = "父游戏ID")
-    private Long parentGameId;
+    private List<Long> parentGameIds;
+
+    /**
+     * 超父游戏ID
+     */
+    @ApiModelProperty(value = "超父游戏ID")
+    private Long superGameId;
 
     /**
      * 区服ID(列表)

+ 50 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GameServerVO.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 游戏区服列表数据
+ * @date 2024/1/5 10:59
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameServerVO {
+
+    /**
+     * SDK来源
+     */
+    private String sourceSystem;
+
+    /**
+     * 子游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 子游戏名称
+     */
+    private String gameName;
+
+    /**
+     * 父游戏ID
+     */
+    private Long parentGameId;
+
+    /**
+     * 区服ID
+     */
+    private String serverId;
+
+    /**
+     * 区服名称
+     */
+    private String serverName;
+
+}

+ 56 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayTotalVO.java

@@ -889,4 +889,60 @@ public class PromotionDayTotalVO {
     @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
     private BigDecimal subOrderAmount;
 
+    //------------------------新增7日指标-----------------------------------------
+
+    /**
+     * 7日付费次数(广告)
+     */
+    @ApiModelProperty("7日付费次数(广告)")
+    private Long attributionGamePay7dCount;
+
+    /**
+     * 七日人均付费次数(广告)
+     */
+    @ApiModelProperty("七日人均付费次数(广告)")
+    private Long attributionActivePay7dPerCount;
+
+    /**
+     * 七日付费成本(广告)
+     */
+    @ApiModelProperty("七日付费成本(广告)")
+    private BigDecimal attributionGamePay7dCost;
+
+    /**
+     * 七日付费次数
+     */
+    @ApiModelProperty("七日付费次数")
+    private Long day7AmountCount;
+
+    /**
+     * 七日付费成本
+     */
+    @ApiModelProperty("七日付费成本")
+    private BigDecimal day7AmountPerCost;
+
+    /**
+     * 七日人均付费次数
+     */
+    @ApiModelProperty("七日人均付费次数")
+    private BigDecimal day7AmountPerCount;
+
+    /**
+     * 7日ARPU
+     */
+    @ApiModelProperty("7日ARPU")
+    private BigDecimal day7Arpu;
+
+    /**
+     * 七日付费人数
+     */
+    @ApiModelProperty("七日付费人数")
+    private Long day7AmountNum;
+
+    /**
+     * 七日付费金额
+     */
+    @ApiModelProperty("七日付费金额")
+    private BigDecimal day7Amount;
+
 }

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

@@ -1064,5 +1064,61 @@ public class PromotionDayVO {
      */
     @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
     private BigDecimal subOrderAmount;
+
+    //------------------------新增7日指标-----------------------------------------
+
+    /**
+     * 7日付费次数(广告)
+     */
+    @ApiModelProperty("7日付费次数(广告)")
+    private Long attributionGamePay7dCount;
+
+    /**
+     * 七日人均付费次数(广告)
+     */
+    @ApiModelProperty("七日人均付费次数(广告)")
+    private Long attributionActivePay7dPerCount;
+
+    /**
+     * 七日付费成本(广告)
+     */
+    @ApiModelProperty("七日付费成本(广告)")
+    private BigDecimal attributionGamePay7dCost;
+
+    /**
+     * 七日付费次数
+     */
+    @ApiModelProperty("七日付费次数")
+    private Long day7AmountCount;
+
+    /**
+     * 七日付费成本
+     */
+    @ApiModelProperty("七日付费成本")
+    private BigDecimal day7AmountPerCost;
+
+    /**
+     * 七日人均付费次数
+     */
+    @ApiModelProperty("七日人均付费次数")
+    private BigDecimal day7AmountPerCount;
+
+    /**
+     * 7日ARPU
+     */
+    @ApiModelProperty("7日ARPU")
+    private BigDecimal day7Arpu;
+
+    /**
+     * 七日付费人数
+     */
+    @ApiModelProperty("七日付费人数")
+    private Long day7AmountNum;
+
+    /**
+     * 七日付费金额
+     */
+    @ApiModelProperty("七日付费金额")
+    private BigDecimal day7Amount;
     
 }

+ 12 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameServerService.java

@@ -1,15 +1,12 @@
 package com.zanxiang.game.data.serve.service;
 
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayTotalDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayTotalDTO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayTotalVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerSumDayTotalVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerSumDayVO;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zanxiang.game.data.serve.pojo.dto.*;
+import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.utils.Page;
 
+import java.util.List;
+
 public interface IGameServerService {
 
     /**
@@ -40,4 +37,11 @@ public interface IGameServerService {
      */
     GameServerSumDayTotalVO getGameServerDataSumDayTotal(GameServerSumDayTotalDTO dto);
 
+    /**
+     * 得到所有区服列表
+     * @param dto
+     * @return
+     */
+    List<GameServerVO> getAllGameServer(GameServerListDTO dto);
+
 }

+ 55 - 12
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java

@@ -2,10 +2,7 @@ package com.zanxiang.game.data.serve.service.impl;
 
 import com.google.common.base.CaseFormat;
 import com.zanxiang.game.data.serve.component.DataPowerComponent;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayTotalDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayTotalDTO;
+import com.zanxiang.game.data.serve.pojo.dto.*;
 import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerDay;
 import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerSumDay;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
@@ -13,6 +10,7 @@ import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.service.IGameServerService;
 import com.zanxiang.game.data.serve.utils.Page;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
@@ -22,7 +20,6 @@ import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuples;
 
@@ -373,18 +370,14 @@ public class GameServerServiceImpl implements IGameServerService {
      */
     @Override
     public GameServerSumDayTotalVO getGameServerDataSumDayTotal(GameServerSumDayTotalDTO dto) {
-        /*com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
-        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());*/
+        com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
+        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
 
         //创建查询条件
         Criteria cri = Cnd.cri();
-        /*if (gameIds != null) {
+        if (gameIds != null) {
             //拼接游戏ID查询条件
             cri.where().andInList("game_id", gameIds);
-        }*/
-        if (dto.getGameId() != null) {
-            //拼接游戏ID查询条件
-            cri.where().andEquals("game_id", dto.getGameId());
         }
         if (dto.getBeginDate() != null && dto.getEndDate() != null) {
             //拼接开服时间查询条件
@@ -410,6 +403,33 @@ public class GameServerServiceImpl implements IGameServerService {
         return vo;
     }
 
+    @Override
+    public List<GameServerVO> getAllGameServer(GameServerListDTO dto) {
+        if (StringUtils.isBlank(dto.getSourceSystem())) {
+            dto.setSourceSystem("ZX_ONE");
+        }
+        //创建查询条件
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            cri.where().andInList("game_id", dto.getGameId());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getParentGameId())) {
+            cri.where().andInList("parent_game_id", dto.getParentGameId());
+        }
+        //排序条件
+        cri.getOrderBy().orderBy("game_id", OrderByEnum.ASC.getOrderType());
+        cri.getOrderBy().orderBy("create_time", OrderByEnum.ASC.getOrderType());
+
+        Sql sql = Sqls.create(gameServerSql() + cri);
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(GameServerVO.class));
+        dao.execute(sql);
+        return sql.getList(GameServerVO.class);
+    }
+
     /**
      * 将vo中的原始String数据修改为一个对象
      * @param vo 展示给前端的游戏区服数据
@@ -1394,5 +1414,28 @@ public class GameServerServiceImpl implements IGameServerService {
                         """;
     }
 
+    /**
+     * 获取所有区服sql
+     * @return
+     */
+    private String gameServerSql() {
+        return """
+                SELECT
+                    *
+                FROM (
+                    SELECT
+                        a.source_system ,
+                        a.game_id ,
+                        a.game_name ,
+                        a.server_id ,
+                        a.server_name ,
+                        IFNULL(b.parent_id , a.game_id ) as parent_game_id,
+                        a.create_time
+                    FROM dm_game_order.t_game_server a
+                    LEFT JOIN dm_game_order.t_game b on a.source_system = b.source_system AND a.game_id = b.id
+                ) a
+                """;
+    }
+
 
 }

+ 33 - 3
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -58,6 +58,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         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());
+
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("dt");
@@ -145,6 +146,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         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());
+
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("today_cost");
@@ -228,6 +230,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         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());
+
         //创建查询条件
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {
@@ -1058,7 +1061,16 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                     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,
-                    ROUND(IF(total_amount_count > 0, promotion_total_cost / total_amount_count, 0), 2) as total_amount_count_cost
+                    ROUND(IF(total_amount_count > 0, promotion_total_cost / total_amount_count, 0), 2) as total_amount_count_cost,
+                    attribution_game_pay7d_count,
+                    attribution_active_pay7d_per_count,
+                    attribution_game_pay7d_cost,
+                    day7_amount_count,
+                    day7_amount_per_cost,
+                    day7_amount_per_count,
+                    day7_arpu,
+                    day7_amount_num,
+                    day7_amount
                 FROM
                 	game_ads.ads_promotion_day
                 """;
@@ -1166,7 +1178,16 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                 	    (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
+                	    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,
+                	    SUM(attribution_game_pay7d_count) as attribution_game_pay7d_count,
+                	    SUM(attribution_active_pay7d_per_count) as attribution_active_pay7d_per_count,
+                	    ROUND(if(SUM(attribution_game_pay7d_count) > 0, SUM(today_cost) / SUM(attribution_game_pay7d_count), 0), 2) as attribution_game_pay7d_cost,
+                	    SUM(day7_amount_count) as day7_amount_count,
+                	    ROUND(if(SUM(day7_amount_count) > 0, SUM(today_cost) / SUM(day7_amount_count), 0), 2) as day7_amount_per_cost,
+                	    ROUND(if(SUM(day7_amount_num) > 0, SUM(day7_amount_count) / SUM(day7_amount_num), 0), 2) as day7_amount_per_count,
+                	    ROUND(if(SUM(day7_amount_num) > 0, SUM(day7_amount) / SUM(day7_amount_num), 0), 2) as day7_arpu,
+                	    SUM(day7_amount) as day7_amount,
+                	    SUM(day7_amount_num) as day7_amount_num
                 	FROM
                 		game_ads.ads_promotion_day
                 """ + criA +
@@ -1294,7 +1315,16 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                     (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
+                    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,
+                    SUM(attribution_game_pay7d_count) as attribution_game_pay7d_count,
+                    SUM(attribution_active_pay7d_per_count) as attribution_active_pay7d_per_count,
+                    ROUND(if(SUM(attribution_game_pay7d_count) > 0, SUM(today_cost) / SUM(attribution_game_pay7d_count), 0), 2) as attribution_game_pay7d_cost,
+                    SUM(day7_amount_count) as day7_amount_count,
+                    ROUND(if(SUM(day7_amount_count) > 0, SUM(today_cost) / SUM(day7_amount_count), 0), 2) as day7_amount_per_cost,
+                    ROUND(if(SUM(day7_amount_num) > 0, SUM(day7_amount_count) / SUM(day7_amount_num), 0), 2) as day7_amount_per_count,
+                    ROUND(if(SUM(day7_amount_num) > 0, SUM(day7_amount) / SUM(day7_amount_num), 0), 2) as day7_arpu,
+                    SUM(day7_amount) as day7_amount,
+                    SUM(day7_amount_num) as day7_amount_num
                 FROM
                 	game_ads.ads_promotion_day
                 """;

+ 9 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -54,12 +54,17 @@ public class RoleManageServiceImpl implements IRoleManageService {
         }
         //创建查询条件 给主表使用
         Criteria criA = Cnd.cri();
-        if (dto.getGameId() != null) {
-            criA.where().andEquals("role_reg_game_id", dto.getGameId());
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            //角色注册子游戏
+            criA.where().andInList("role_reg_game_id", dto.getGameId());
         }
-        if (dto.getParentGameId() != null) {
+        if (CollectionUtils.isNotEmpty(dto.getParentGameIds())) {
             //角色注册父游戏
-            criA.where().andEquals("role_reg_parent_game_id", dto.getParentGameId());
+            criA.where().andInList("role_reg_parent_game_id", dto.getParentGameIds());
+        }
+        if (dto.getSuperGameId() != null) {
+            //角色注册超父游戏
+            criA.where().andEquals("role_reg_super_game_id", dto.getSuperGameId());
         }
         if (StringUtils.isNotBlank(dto.getSourceSystem())) {
             criA.where().andEquals("source_system", dto.getSourceSystem());

+ 71 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameAdMonitorController.java

@@ -0,0 +1,71 @@
+package com.zanxiang.game.module.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyAddOrUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchOperationParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchStartParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameAdPolicyListVO;
+import com.zanxiang.game.module.manage.service.IGameAdMonitorService;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:45
+ */
+@Api(tags = "游戏广告监控告警配置")
+@RestController
+@RequestMapping("/ad/policy/config")
+@Slf4j
+public class GameAdMonitorController {
+
+    @Autowired
+    private IGameAdMonitorService gameAdMonitorService;
+
+    @ApiOperation(value = "游戏广告策略配置新增或修改")
+    @PostMapping("/add/or/update")
+    @PreAuthorize(permissionKey = "manage:adPolicy:addOrUpdate")
+    public ResultVO<Boolean> addOrUpdate(@Validated @RequestBody GameAdPolicyAddOrUpdateParam param) {
+        return ResultVO.ok(gameAdMonitorService.addOrUpdate(param));
+    }
+
+    @ApiOperation(value = "游戏广告策略配置批量删除")
+    @DeleteMapping("/delete/{ids}")
+    @PreAuthorize(permissionKey = "manage:adPolicy:delete")
+    public ResultVO<Boolean> addOrUpdate(@PathVariable("ids") List<Long> ids) {
+        return ResultVO.ok(gameAdMonitorService.deleteByIds(ids));
+    }
+
+    @ApiOperation(value = "游戏广告策略配置列表")
+    @PostMapping("/list")
+    @PreAuthorize(permissionKey = "manage:adPolicy:listOfPage")
+    public ResultVO<IPage<GameAdPolicyListVO>> listOfPage(@RequestBody GameAdPolicyListParam param) {
+        return ResultVO.ok(gameAdMonitorService.listOfPage(param));
+    }
+
+    @ApiOperation(value = "游戏广告策略配置批量操作:添加白名单")
+    @PostMapping("/batch/operation")
+    @PreAuthorize(permissionKey = "manage:adPolicy:batchOperation")
+    public ResultVO<Boolean> batchOperation(@Validated @RequestBody GameAdPolicyBatchOperationParam param) {
+        return ResultVO.ok(gameAdMonitorService.batchOperation(param));
+    }
+
+    @ApiOperation(value = "游戏广告策略配置批量操作:启用;暂停")
+    @PostMapping("/batch/start")
+    @PreAuthorize(permissionKey = "manage:adPolicy:batchStart")
+    public ResultVO<Boolean> batchStart(@Validated @RequestBody GameAdPolicyBatchStartParam param) {
+        return ResultVO.ok(gameAdMonitorService.batchStart(param));
+    }
+
+}

+ 138 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyAddOrUpdateParam.java

@@ -0,0 +1,138 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.manage.pojo.vo.GameAdRuleConditionVO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:53
+ */
+@Data
+public class GameAdPolicyAddOrUpdateParam {
+
+    /**
+     * 传id为修改, 不传id为新增
+     */
+    @ApiModelProperty("传id为修改, 不传id为新增")
+    private Long id;
+
+    /**
+     * 规则名称
+     */
+    @NotBlank(message = "规则名不能为空")
+    @ApiModelProperty("规则名称")
+    private String ruleName;
+
+    /**
+     * 规则类型:1-个人规则
+     */
+    @NotNull(message = "规则类型不能为空")
+    @ApiModelProperty("规则类型:1-个人规则")
+    private Integer ruleType;
+
+    /**
+     * 部门类型:1-游戏投放
+     */
+    @NotNull(message = "部门类型不能为空")
+    @ApiModelProperty("部门类型:1-游戏投放")
+    private Integer department;
+
+    /**
+     * 游戏ID(子游戏维度)
+     */
+    @NotNull(message = "游戏不能为空")
+    @ApiModelProperty("游戏ID(子游戏维度)")
+    private Long gameId;
+
+    /**
+     * 媒体类型:1-腾讯;2-头条
+     */
+    @NotNull(message = "媒体类型不能为空")
+    @ApiModelProperty("媒体类型:1-腾讯;2-头条")
+    private Integer mediaType;
+
+    /**
+     * 规则维度:1-默认;2-渠道;3-账号;4-广告
+     */
+    @NotNull(message = "规则维度不能为空")
+    @ApiModelProperty("规则维度:1-默认;2-渠道;3-账号;4-广告")
+    private Integer ruleDimension;
+
+    /**
+     * 生效范围(依据规则维度变化):NULL(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,'-'间隔)
+     */
+    @ApiModelProperty("生效范围(依据规则维度变化):NULL(默认维度:当前创建人的所有广告);其他(对应规则维度的ID集合)")
+    private List<Long> effectiveScope;
+
+    /**
+     * 是否启用
+     */
+    @NotNull(message = "是否启用不能为空")
+    @ApiModelProperty("是否启用")
+    private Boolean isStart;
+
+    /**
+     * 告警方式:1-短信;2-电话;3-钉钉
+     */
+    @NotNull(message = "告警方式不能为空")
+    @ApiModelProperty("告警方式:1-短信;2-电话;3-钉钉")
+    private Integer alarmType;
+
+    /**
+     * 通知频率:单位:分钟/次
+     */
+    @NotNull(message = "通知频率不能为空")
+    @ApiModelProperty("通知频率:单位:分钟/次")
+    private Integer alarmFrequency;
+
+    /**
+     * 通知总次数
+     */
+    @NotNull(message = "通知总次数不能为空")
+    @ApiModelProperty("通知总次数")
+    private Integer alarmCount;
+
+    /**
+     * 操作维度:1-广告
+     */
+    @NotNull(message = "操作维度不能为空")
+    @ApiModelProperty("操作维度:1-广告")
+    private Integer operateDimension;
+
+    /**
+     * 操作类型:1-仅告警通知;2-暂停广告;3-启动广告;4-增加预算;5-减少预算;6-广告置顶标黄;7-广告置顶标红
+     */
+    @NotNull(message = "操作类型不能为空")
+    @ApiModelProperty("操作类型:1-仅告警通知;2-暂停广告;3-启动广告;4-增加预算;5-减少预算;6-广告置顶标黄;7-广告置顶标红")
+    private Integer operateType;
+
+    /**
+     * 执行范围:1-所有广告(不含删除);2-投放中;3-暂停投放;4-预算不足
+     */
+    @NotNull(message = "执行范围不能为空")
+    @ApiModelProperty("执行范围:1-所有广告(不含删除);2-投放中;3-暂停投放;4-预算不足")
+    private Integer executeScope;
+
+    /**
+     * 数据巡视周期:1-实时
+     */
+    @NotNull(message = "数据巡视周期不能为空")
+    @ApiModelProperty("数据数据巡视周期:1-实时巡视周期")
+    private Integer dataVisitsPeriod;
+
+    /**
+     * 规则条件(json存储对象格式,最多可同事设置5个指标条件)
+     */
+    @NotEmpty(message = "规则条件不能为空")
+    @ApiModelProperty("规则条件(最多可同事设置5个指标条件)")
+    private List<GameAdRuleConditionVO> ruleCondition;
+
+}

+ 50 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyBatchOperationParam.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 批量操作参数列表
+ * @date 2023/12/28 15:53
+ */
+@Data
+public class GameAdPolicyBatchOperationParam {
+
+    /**
+     * id列表(需要批量操作的ID)
+     */
+    @NotEmpty(message = "id列表不能传空")
+    @ApiModelProperty("id列表(需要批量操作的ID)")
+    private List<Long> ids;
+
+    /**
+     * 规则下的账号白名单(','间隔)
+     */
+    @ApiModelProperty("规则下的账号白名单")
+    private Set<Long> accountWhitelist;
+
+    /**
+     * 规则下的账号白名单有效时间类型:1-当日有效(自然日);2-长期有效
+     */
+    @ApiModelProperty("规则下的账号白名单有效时间类型:1-当日有效(自然日);2-长期有效")
+    private Integer accountValidTime;
+
+    /**
+     * 规则下的广告白名单(','间隔)
+     */
+    @ApiModelProperty("规则下的广告白名单")
+    private Set<Long> adWhitelist;
+
+    /**
+     * 规则下的广告白名单有效时间类型:1-当日有效(自然日);2-长期有效
+     */
+    @ApiModelProperty("规则下的广告白名单有效时间类型:1-当日有效(自然日);2-长期有效")
+    private Integer adValidTime;
+
+}

+ 34 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyBatchStartParam.java

@@ -0,0 +1,34 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: 批量操作参数列表
+ * @date 2023/12/28 15:53
+ */
+@Data
+public class GameAdPolicyBatchStartParam {
+
+    /**
+     * id列表(需要批量操作的ID)
+     */
+    @NotEmpty(message = "id列表不能传空")
+    @ApiModelProperty("id列表(需要批量操作的ID)")
+    private List<Long> ids;
+
+    /**
+     * 是否启用
+     */
+    @NotNull(message = "启用状态不能为空")
+    @ApiModelProperty("是否启用")
+    private Boolean isStart;
+
+}

+ 44 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyListParam.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.mybatis.entity.GameAdMonitor;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:53
+ */
+@Data
+public class GameAdPolicyListParam extends BaseListDTO<GameAdMonitor> {
+
+    /**
+     * 规则名称
+     */
+    @ApiModelProperty("规则名称")
+    private String ruleName;
+
+    /**
+     * 游戏ID(子游戏维度)
+     */
+    @ApiModelProperty("游戏ID(子游戏维度)")
+    private Long gameId;
+
+    /**
+     * 媒体类型:1-腾讯;2-头条
+     */
+    @ApiModelProperty("媒体类型:1-腾讯;2-头条")
+    private Integer mediaType;
+
+    /**
+     * 是否启用
+     */
+    @NotNull(message = "是否启用不能为空")
+    @ApiModelProperty("是否启用")
+    private Boolean isStart;
+
+}

+ 192 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdPolicyListVO.java

@@ -0,0 +1,192 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/29 16:23
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameAdPolicyListVO {
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(notes = "主键id")
+    private Long id;
+
+    /**
+     * 规则名称
+     */
+    @ApiModelProperty(notes = "规则名称")
+    private String ruleName;
+
+    /**
+     * 规则类型:1-个人规则
+     */
+    @ApiModelProperty(notes = "规则类型:1-个人规则")
+    private Integer ruleType;
+
+    /**
+     * 部门类型:1-游戏投放
+     */
+    @ApiModelProperty(notes = "部门类型:1-游戏投放")
+    private Integer department;
+
+    /**
+     * 游戏ID(子游戏维度)
+     */
+    @ApiModelProperty(notes = "游戏ID(子游戏维度)")
+    private Long gameId;
+
+    /**
+     * 游戏名称(子游戏维度)
+     */
+    @ApiModelProperty(notes = "游戏名称(子游戏维度)")
+    private String gameName;
+
+    /**
+     * 媒体类型:1-腾讯; 2-头条
+     */
+    @ApiModelProperty(notes = "媒体类型:1-腾讯; 2-头条")
+    private Integer mediaType;
+
+    /**
+     * 规则维度:1-默认;2-渠道;3-账号;4-广告
+     */
+    @ApiModelProperty(notes = "规则维度:1-默认;2-渠道;3-账号;4-广告")
+    private Integer ruleDimension;
+
+    /**
+     * 生效范围(依据规则维度变化):0(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,'-'间隔)
+     */
+    @ApiModelProperty(notes = "生效范围(依据规则维度变化):0(默认维度:当前创建人的所有广告);其他(对应规则维度的ID列表")
+    private List<Long> effectiveScope;
+
+    /**
+     * 规则是否启用
+     */
+    @ApiModelProperty(notes = "规则是否启用")
+    private Boolean isStart;
+
+    /**
+     * 告警方式:1-短信;2-电话;3-钉钉
+     */
+    @ApiModelProperty(notes = "告警方式:1-短信;2-电话;3-钉钉")
+    private Integer alarmType;
+
+    /**
+     * 通知频率,单位:分钟/次
+     */
+    @ApiModelProperty(notes = "通知频率,单位:分钟/次")
+    private Integer alarmFrequency;
+
+    /**
+     * 通知总次数
+     */
+    @ApiModelProperty(notes = "通知总次数")
+    private Integer alarmCount;
+
+    /**
+     * 操作维度:1-广告
+     */
+    @ApiModelProperty(notes = "操作维度:1-广告")
+    private Integer operateDimension;
+
+    /**
+     * 操作类型:1-仅告警通知;2-暂停广告;3-启动广告;4-增加预算;5-减少预算;6-广告置顶标黄;7-广告置顶标红
+     */
+    @ApiModelProperty(notes = "操作类型:1-仅告警通知;2-暂停广告;3-启动广告;4-增加预算;5-减少预算;6-广告置顶标黄;7-广告置顶标红")
+    private Integer operateType;
+
+    /**
+     * 执行范围:1-所有广告(不含删除);2-投放中;3-暂停投放;4-预算不足
+     */
+    @ApiModelProperty(notes = "执行范围:1-所有广告(不含删除);2-投放中;3-暂停投放;4-预算不足")
+    private Integer executeScope;
+
+    /**
+     * 数据巡视周期:1-实时
+     */
+    @ApiModelProperty(notes = "数据巡视周期:1-实时")
+    private Integer dataVisitsPeriod;
+
+    /**
+     * 规则条件(json存储对象格式,最多可同事设置5个指标条件)
+     */
+    @ApiModelProperty(notes = "规则条件(json存储对象格式,最多可同事设置5个指标条件)")
+    private List<GameAdRuleConditionVO> ruleCondition;
+
+    /**
+     * 规则下的账号白名单(字符串形式,','间隔)
+     */
+    @ApiModelProperty(notes = "规则下的账号白名单(字符串形式,','间隔)")
+    private String accountWhitelist;
+
+    /**
+     * 规则下的账号白名单有效时间类型:1-当日有效(自然日);2-长期有效
+     */
+    @ApiModelProperty(notes = "规则下的账号白名单有效时间类型:1-当日有效(自然日);2-长期有效")
+    private Integer accountValidTime;
+
+    /**
+     * 规则下的广告白名单(字符串形式,','间隔)
+     */
+    @ApiModelProperty(notes = "规则下的广告白名单(字符串形式,','间隔)")
+    private String adWhitelist;
+
+    /**
+     * 规则下的广告白名单有效时间类型:1-当日有效(自然日);2-长期有效
+     */
+    @ApiModelProperty(notes = "规则下的广告白名单有效时间类型:1-当日有效(自然日);2-长期有效")
+    private Integer adValidTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 创建者
+     */
+    @ApiModelProperty(notes = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建者名称
+     */
+    @ApiModelProperty(notes = "创建者名称")
+    private String createByName;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(notes = "更新时间")
+    private LocalDateTime updateTime;
+
+    /**
+     * 更新者
+     */
+    @ApiModelProperty(notes = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新者名称
+     */
+    @ApiModelProperty(notes = "更新者名称")
+    private String updateByName;
+
+}

+ 61 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdRuleConditionVO.java

@@ -0,0 +1,61 @@
+package com.zanxiang.game.module.manage.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
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/29 13:49
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameAdRuleConditionVO {
+
+    /**
+     * 条件序号
+     */
+    @ApiModelProperty(notes = "条件序号")
+    private Integer id;
+
+    /**
+     * 监控的数据时间段类型:1-今日;2-过去3天(包括今日);3-过去5天(包括今日);4-过去7天(包括今日);
+     * 5-过去3天(不包括今日);6-过去5天(不包括今日);7-过去7天(不包括今日);
+     * 8-广告开始消耗首日(0);9-广告开始消耗(累计3天);10-广告开始消耗(累计5天);11-广告开始消耗(累计7天);
+     */
+    @ApiModelProperty(notes = "监控的数据时间段类型:1-今日;2-过去3天(包括今日);3-过去5天(包括今日);4-过去7天(包括今日);\n" +
+            "                5-过去3天(不包括今日);6-过去5天(不包括今日);7-过去7天(不包括今日);\n" +
+            "                8-广告开始消耗首日(0);9-广告开始消耗(累计3天);10-广告开始消耗(累计5天);11-广告开始消耗(累计7天);")
+    private Integer monitorTimeType;
+
+    /**
+     * 指标类型:1-消耗;2-预算;3-点击率;4-ecpm(千次曝光成本);5-注册;6-注册成本(消耗/注册人数);7-付费人数;8-付费率(付费人数/注册人数)
+     * 9-付费成本(消耗/付费人数);10-arpu(付费金额/注册人数);11-ROI1(首日付费金额/消耗);12-ROI2(?/消耗);13-ROI3;
+     * 14-ROI4;15-ROI5;16-ROI6;17-ROI7;18-LTV1;19-LTV2;20-LTV3;21-LTV4;22-LTV5;23-LTV6;24-LTV7;
+     */
+    @ApiModelProperty(notes = "指标类型:1-消耗;2-预算;3-点击率;4-ecpm(千次曝光成本);5-注册;6-注册成本(消耗/注册人数);7-付费人数;8-付费率(付费人数/注册人数)\n" +
+            "                 9-付费成本(消耗/付费人数);10-arpu(付费金额/注册人数);11-ROI1(首日付费金额/消耗);12-ROI2(?/消耗);13-ROI3;\n" +
+            "                 14-ROI4;15-ROI5;16-ROI6;17-ROI7;18-LTV1;19-LTV2;20-LTV3;21-LTV4;22-LTV5;23-LTV6;24-LTV7;")
+    private Integer dataType;
+
+    /**
+     * 判断条件类型:1-大于;2-大于等于;3-等于;4-小于等于;5-小于
+     */
+    @ApiModelProperty(notes = "1-大于;2-大于等于;3-等于;4-小于等于;5-小于")
+    private Integer conditionType;
+
+    /**
+     * 具体数据数值
+     */
+    @ApiModelProperty(notes = "具体数值")
+    private BigDecimal dataNum;
+
+}

+ 32 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameAdMonitorService.java

@@ -0,0 +1,32 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyAddOrUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchOperationParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchStartParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameAdPolicyListVO;
+import com.zanxiang.game.module.mybatis.entity.GameAdMonitor;
+
+import java.util.List;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:41
+ */
+public interface IGameAdMonitorService extends IService<GameAdMonitor> {
+
+    boolean addOrUpdate(GameAdPolicyAddOrUpdateParam param);
+
+    boolean deleteByIds(List<Long> ids);
+
+    IPage<GameAdPolicyListVO> listOfPage(GameAdPolicyListParam param);
+
+    boolean batchOperation(GameAdPolicyBatchOperationParam param);
+
+    boolean batchStart(GameAdPolicyBatchStartParam param);
+
+}

+ 228 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAdMonitorServiceImpl.java

@@ -0,0 +1,228 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
+import com.zanxiang.erp.security.util.SecurityUtil;
+import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyAddOrUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchOperationParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyBatchStartParam;
+import com.zanxiang.game.module.manage.pojo.params.GameAdPolicyListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameAdPolicyListVO;
+import com.zanxiang.game.module.manage.pojo.vo.GameAdRuleConditionVO;
+import com.zanxiang.game.module.manage.service.IGameAdMonitorService;
+import com.zanxiang.game.module.manage.service.IGameService;
+import com.zanxiang.game.module.mybatis.entity.GameAdMonitor;
+import com.zanxiang.game.module.mybatis.mapper.GameAdMonitorMapper;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:42
+ */
+@Service
+@Slf4j
+public class GameAdMonitorServiceImpl extends ServiceImpl<GameAdMonitorMapper, GameAdMonitor>
+        implements IGameAdMonitorService {
+
+    @Autowired
+    private IGameService gameService;
+
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addOrUpdate(GameAdPolicyAddOrUpdateParam param) {
+        //当前操作人员
+        Long sysUserId = SecurityUtil.getUserId();
+        //当前操作的时间
+        LocalDateTime now = LocalDateTime.now();
+
+        //数据库找出是否含有相同的规则策略
+        int count = this.count(new LambdaQueryWrapper<GameAdMonitor>()
+                .ne(param.getId() != null, GameAdMonitor::getId, param.getId())
+                .eq(GameAdMonitor::getRuleType, param.getRuleType())
+                .eq(GameAdMonitor::getDepartment, param.getDepartment())
+                .eq(GameAdMonitor::getGameId, param.getGameId())
+                .eq(GameAdMonitor::getMediaType, param.getMediaType())
+                .eq(GameAdMonitor::getRuleDimension, param.getRuleDimension())
+                .eq(GameAdMonitor::getEffectiveScope, StringUtils.join(CollectionUtils.isEmpty(param.getEffectiveScope())
+                        ? null : param.getEffectiveScope().toArray(), "-"))
+                .eq(GameAdMonitor::getAlarmType, param.getAlarmType())
+                .eq(GameAdMonitor::getAlarmFrequency, param.getAlarmFrequency())
+                .eq(GameAdMonitor::getAlarmCount, param.getAlarmCount())
+                .eq(GameAdMonitor::getOperateDimension, param.getOperateDimension())
+                .eq(GameAdMonitor::getOperateType, param.getOperateType())
+                .eq(GameAdMonitor::getExecuteScope, param.getExecuteScope())
+                .eq(GameAdMonitor::getDataVisitsPeriod, param.getDataVisitsPeriod())
+                .eq(GameAdMonitor::getRuleCondition, JsonUtil.toString(param.getRuleCondition()))
+                .eq(GameAdMonitor::getEnabled, true)
+        );
+        if (count > 0) {
+            throw new BaseException("该策略规则已经存在,不可重复设置。");
+        }
+
+        GameAdMonitor gameAdMonitor = GameAdMonitor.builder()
+                .ruleName(param.getRuleName())
+                .ruleType(param.getRuleType())
+                .department(param.getDepartment())
+                .gameId(param.getGameId())
+                .mediaType(param.getMediaType())
+                .ruleDimension(param.getRuleDimension())
+                .effectiveScope(StringUtils.join(CollectionUtils.isEmpty(param.getEffectiveScope())
+                        ? null : param.getEffectiveScope().toArray(), "-"))
+                .isStart(param.getIsStart())
+                .alarmType(param.getAlarmType())
+                .alarmFrequency(param.getAlarmFrequency())
+                .alarmCount(param.getAlarmCount())
+                .operateDimension(param.getOperateDimension())
+                .operateType(param.getOperateType())
+                .executeScope(param.getExecuteScope())
+                .dataVisitsPeriod(param.getDataVisitsPeriod())
+                .ruleCondition(JsonUtil.toString(param.getRuleCondition()))
+                .updateBy(sysUserId)
+                .updateTime(now)
+                .build();
+
+        if (param.getId() != null) {
+            //id不为空表示更新
+            return update(new LambdaUpdateWrapper<GameAdMonitor>()
+                    .set(GameAdMonitor::getRuleName, gameAdMonitor.getRuleName())
+                    .set(GameAdMonitor::getRuleType, gameAdMonitor.getRuleType())
+                    .set(GameAdMonitor::getDepartment, gameAdMonitor.getDepartment())
+                    .set(GameAdMonitor::getGameId, gameAdMonitor.getGameId())
+                    .set(GameAdMonitor::getMediaType, gameAdMonitor.getMediaType())
+                    .set(GameAdMonitor::getRuleDimension, gameAdMonitor.getRuleDimension())
+                    .set(GameAdMonitor::getEffectiveScope, gameAdMonitor.getEffectiveScope())
+                    .set(GameAdMonitor::getIsStart, gameAdMonitor.getIsStart())
+                    .set(GameAdMonitor::getAlarmType, gameAdMonitor.getAlarmType())
+                    .set(GameAdMonitor::getAlarmFrequency, gameAdMonitor.getAlarmFrequency())
+                    .set(GameAdMonitor::getAlarmCount, gameAdMonitor.getAlarmCount())
+                    .set(GameAdMonitor::getOperateDimension, gameAdMonitor.getOperateDimension())
+                    .set(GameAdMonitor::getOperateType, gameAdMonitor.getOperateType())
+                    .set(GameAdMonitor::getExecuteScope, gameAdMonitor.getExecuteScope())
+                    .set(GameAdMonitor::getDataVisitsPeriod, gameAdMonitor.getDataVisitsPeriod())
+                    .set(GameAdMonitor::getRuleCondition, gameAdMonitor.getRuleCondition())
+                    .set(GameAdMonitor::getUpdateBy, sysUserId)
+                    .set(GameAdMonitor::getUpdateTime, now)
+                    .eq(GameAdMonitor::getId, param.getId()));
+        }
+        //id为空表示要新建一条规则
+        gameAdMonitor.setCreateBy(sysUserId);
+        gameAdMonitor.setCreateTime(now);
+        return save(gameAdMonitor);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deleteByIds(List<Long> ids) {
+        Long sysUserId = SecurityUtil.getUserId();
+        return update(new LambdaUpdateWrapper<GameAdMonitor>()
+                .set(GameAdMonitor::getEnabled, false)
+                .set(GameAdMonitor::getUpdateBy, sysUserId)
+                .set(GameAdMonitor::getUpdateTime, LocalDateTime.now())
+                .in(GameAdMonitor::getId, ids));
+    }
+
+    @Override
+    public IPage<GameAdPolicyListVO> listOfPage(GameAdPolicyListParam param) {
+        return page(param.toPage(), new LambdaQueryWrapper<GameAdMonitor>()
+                .eq(param.getGameId() != null , GameAdMonitor::getGameId, param.getGameId())
+                .eq(param.getIsStart() != null, GameAdMonitor::getIsStart, param.getIsStart())
+                .like(StringUtils.isNotBlank(param.getRuleName()), GameAdMonitor::getRuleName, param.getRuleName())
+                .eq(param.getMediaType() != null, GameAdMonitor::getMediaType, param.getMediaType())
+                .eq(GameAdMonitor::getEnabled, true))
+                .convert(this::toVO);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean batchOperation(GameAdPolicyBatchOperationParam param) {
+        //当前操作人员
+        Long sysUserId = SecurityUtil.getUserId();
+        return update(new LambdaUpdateWrapper<GameAdMonitor>()
+                .set(GameAdMonitor::getAccountWhitelist, StringUtils.join(CollectionUtils.isEmpty(param.getAccountWhitelist()) ?
+                        null : param.getAccountWhitelist().toArray(), "-"))
+                .set(param.getAccountValidTime() != null, GameAdMonitor::getAccountValidTime, param.getAdValidTime())
+                .set(GameAdMonitor::getAdWhitelist, StringUtils.join(CollectionUtils.isEmpty(param.getAdWhitelist()) ?
+                        null : param.getAdWhitelist(), "-"))
+                .set(param.getAdValidTime() != null, GameAdMonitor::getAdValidTime, param.getAdValidTime())
+                .set(GameAdMonitor::getUpdateBy, sysUserId)
+                .set(GameAdMonitor::getUpdateTime, LocalDateTime.now())
+                .in(GameAdMonitor::getId, param.getIds())
+        );
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean batchStart(GameAdPolicyBatchStartParam param) {
+        //当前操作人员
+        Long sysUserId = SecurityUtil.getUserId();
+        return update(new LambdaUpdateWrapper<GameAdMonitor>()
+                .set(GameAdMonitor::getIsStart, param.getIsStart())
+                .set(GameAdMonitor::getUpdateBy, sysUserId)
+                .set(GameAdMonitor::getUpdateTime, LocalDateTime.now())
+                .in(GameAdMonitor::getId, param.getIds())
+        );
+    }
+
+    private GameAdPolicyListVO toVO(GameAdMonitor vo) {
+        GameDTO game = gameService.getById(vo.getGameId());
+        List<GameAdRuleConditionVO> ruleConditionVOList = JsonUtil.toObj(vo.getRuleCondition(), List.class);
+        return GameAdPolicyListVO.builder()
+                .id(vo.getId())
+                .ruleName(vo.getRuleName())
+                .ruleType(vo.getRuleType())
+                .department(vo.getDepartment())
+                .gameId(vo.getGameId())
+                .gameName(game == null ? null : game.getName())
+                .mediaType(vo.getMediaType())
+                .ruleDimension(vo.getRuleDimension())
+                .effectiveScope(StringUtils.isBlank(vo.getEffectiveScope()) ? null :
+                        Arrays.stream(vo.getEffectiveScope().split("-"))
+                        .map(Long::valueOf).collect(Collectors.toList()))
+                .isStart(vo.getIsStart())
+                .alarmType(vo.getAlarmType())
+                .alarmFrequency(vo.getAlarmFrequency())
+                .alarmCount(vo.getAlarmCount())
+                .operateDimension(vo.getOperateDimension())
+                .operateType(vo.getOperateType())
+                .executeScope(vo.getExecuteScope())
+                .dataVisitsPeriod(vo.getDataVisitsPeriod())
+                .ruleCondition(ruleConditionVOList)
+                .accountWhitelist(StringUtils.isBlank(vo.getAccountWhitelist()) ? null :
+                        vo.getAccountWhitelist().replace("-", ","))
+                .accountValidTime(vo.getAccountValidTime() == null ? null : vo.getAccountValidTime())
+                .adWhitelist(StringUtils.isBlank(vo.getAdWhitelist()) ? null :
+                        vo.getAdWhitelist().replace("-", ","))
+                .adValidTime(vo.getAdValidTime() == null ? null : vo.getAdValidTime())
+                .createTime(vo.getCreateTime())
+                .createBy(vo.getCreateBy())
+                .createByName(sysUserRpc.getById(vo.getCreateBy()).getData().getNickname())
+                .updateTime(vo.getUpdateTime())
+                .updateBy(vo.getUpdateBy())
+                .updateByName(sysUserRpc.getById(vo.getUpdateBy()).getData().getNickname())
+                .build();
+    }
+
+}

+ 14 - 9
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAdMonitor.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
-import java.util.Date;
+import java.time.LocalDateTime;
 import java.io.Serializable;
 
 /**
@@ -19,7 +19,7 @@ import java.io.Serializable;
 @AllArgsConstructor
 @ToString
 @Builder
-@TableName("t_game_applet_shell")
+@TableName("t_game_ad_monitor")
 public class GameAdMonitor implements Serializable {
     private static final long serialVersionUID = 1L;
 
@@ -61,9 +61,14 @@ public class GameAdMonitor implements Serializable {
      private Integer ruleDimension;
     
      /**
-     * 生效范围(依据规则维度变化):ALLADS(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,逗号间隔)
+     * 生效范围(依据规则维度变化):ALLADS(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,'-'间隔)
      */     
      private String effectiveScope;
+
+     /**
+      * 规则是否启用:1-开启; 0-暂停
+      */
+     private Boolean isStart;
     
      /**
      * 告警方式:1-短信;2-电话;3-钉钉
@@ -106,7 +111,7 @@ public class GameAdMonitor implements Serializable {
      private String ruleCondition;
     
      /**
-     * 规则下的账号白名单(字符串形式,逗号隔开
+     * 规则下的账号白名单(字符串形式,'-'间隔
      */     
      private String accountWhitelist;
     
@@ -116,7 +121,7 @@ public class GameAdMonitor implements Serializable {
      private Integer accountValidTime;
     
      /**
-     * 规则下的广告白名单(字符串形式,逗号隔开
+     * 规则下的广告白名单(字符串形式,'-'间隔
      */     
      private String adWhitelist;
     
@@ -128,7 +133,7 @@ public class GameAdMonitor implements Serializable {
      /**
      * 创建时间
      */     
-     private Date createTime;
+     private LocalDateTime createTime;
     
      /**
      * 创建者
@@ -138,7 +143,7 @@ public class GameAdMonitor implements Serializable {
      /**
      * 更新时间
      */     
-     private Date updateTime;
+     private LocalDateTime updateTime;
     
      /**
      * 更新者
@@ -146,9 +151,9 @@ public class GameAdMonitor implements Serializable {
      private Long updateBy;
     
      /**
-     * 规则是否可用:1-可用; 0-不可用
+     * 规则是否删除:1-不删除(可用); 0-删除(不可用)
      */     
-     private Integer enabled;
+     private Boolean enabled;
 
 }
 

+ 13 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameAdMonitorMapper.java

@@ -0,0 +1,13 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.GameAdMonitor;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:40
+ */
+public interface GameAdMonitorMapper extends BaseMapper<GameAdMonitor> {
+}