Sfoglia il codice sorgente

Merge branch 'package' of GameCenter/game-center into dev

Letianhua 1 anno fa
parent
commit
8fc1c7ad70
13 ha cambiato i file con 1004 aggiunte e 12 eliminazioni
  1. 56 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayTotalVO.java
  2. 56 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/PromotionDayVO.java
  3. 33 3
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java
  4. 63 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameAdMonitorController.java
  5. 165 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyAddOrUpdateParam.java
  6. 59 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyBatchOperationParam.java
  7. 44 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameAdPolicyListParam.java
  8. 192 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdPolicyListVO.java
  9. 59 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameAdRuleConditionVO.java
  10. 28 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameAdMonitorService.java
  11. 222 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameAdMonitorServiceImpl.java
  12. 14 9
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAdMonitor.java
  13. 13 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameAdMonitorMapper.java

+ 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) )")
     @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
     private BigDecimal subOrderAmount;
     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) )")
     @ApiModelProperty(value = "每日扣单金额  (广告首日总金额 - 当日付费金额-所选时间范围内的激活用户,激活当日在APP内的付费金额(attribution_game_in_app_ltv1day) )")
     private BigDecimal subOrderAmount;
     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;
     
     
 }
 }

+ 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();
         Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+
         //如果没有排序条件给默认值
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("dt");
             dto.setSortFiled("dt");
@@ -145,6 +146,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
         Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+
         //如果没有排序条件给默认值
         //如果没有排序条件给默认值
         if (StringUtils.isBlank(dto.getSortFiled())) {
         if (StringUtils.isBlank(dto.getSortFiled())) {
             dto.setSortFiled("today_cost");
             dto.setSortFiled("today_cost");
@@ -228,6 +230,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
         Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> userIds = dto.getPitcherId() == null ? poerInfo.first : Collections.singletonList(dto.getPitcherId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
         List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+
         //创建查询条件
         //创建查询条件
         Criteria cri = Cnd.cri();
         Criteria cri = Cnd.cri();
         if (dto.getAccountId() != null) {
         if (dto.getAccountId() != null) {
@@ -1058,7 +1061,16 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                     sub_order_amount,
                     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(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(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
                 FROM
                 	game_ads.ads_promotion_day
                 	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_count) - SUM(first_sub_amount_count)) as sub_order_num,
                 	    (SUM(first_new_user_amount) - SUM(first_sub_amount)) as sub_order_amount,
                 	    (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(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
                 	FROM
                 		game_ads.ads_promotion_day
                 		game_ads.ads_promotion_day
                 """ + criA +
                 """ + 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_count) - SUM(first_sub_amount_count)) as sub_order_num,
                     (SUM(first_new_user_amount) - SUM(first_sub_amount)) as sub_order_amount,
                     (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(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
                 FROM
                 	game_ads.ads_promotion_day
                 	game_ads.ads_promotion_day
                 """;
                 """;

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

@@ -0,0 +1,63 @@
+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.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(@RequestBody GameAdPolicyBatchOperationParam param) {
+        return ResultVO.ok(gameAdMonitorService.batchOperation(param));
+    }
+
+}

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

@@ -0,0 +1,165 @@
+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.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @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;
+
+    /**
+     * 生效范围(依据规则维度变化):ALLADS(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,'-'间隔)
+     */
+    @NotEmpty
+    @ApiModelProperty("生效范围(依据规则维度变化):0(默认维度:当前创建人的所有广告);其他(对应规则维度的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;
+
+    /**
+     * 规则下的账号白名单(','间隔)
+     */
+    @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;
+
+}

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

@@ -0,0 +1,59 @@
+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;
+import java.util.Set;
+
+/**
+ * @author tianhua
+ * @version 1.0
+ * @description: TODO
+ * @date 2023/12/28 15:53
+ */
+@Data
+public class GameAdPolicyBatchOperationParam {
+
+    /**
+     * id列表(需要批量操作的ID)
+     */
+    @NotEmpty(message = "id列表不能传空")
+    @ApiModelProperty("id列表(需要批量操作的ID)")
+    private List<Long> ids;
+
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean isStart;
+
+    /**
+     * 规则下的账号白名单(','间隔)
+     */
+    @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;
+
+}

+ 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-渠道;1-账号;1-广告
+     */
+    @ApiModelProperty(notes = "规则维度:1-默认;2-渠道;1-账号;1-广告")
+    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;
+
+}

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

@@ -0,0 +1,59 @@
+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;
+
+/**
+ * @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 Long dataNum;
+
+}

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

@@ -0,0 +1,28 @@
+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.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);
+}

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

@@ -0,0 +1,222 @@
+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.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(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(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()))
+                .accountWhitelist(CollectionUtils.isEmpty(param.getAccountWhitelist()) ? null :
+                        StringUtils.join(param.getAccountWhitelist().toArray(), "-"))
+                .accountValidTime(param.getAccountValidTime() == null ? null : param.getAccountValidTime())
+                .adWhitelist(CollectionUtils.isEmpty(param.getAdWhitelist()) ? null :
+                        StringUtils.join(param.getAdWhitelist().toArray(), "-"))
+                .adValidTime(param.getAdValidTime() == null ? null : param.getAdValidTime())
+                .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::getAccountWhitelist, gameAdMonitor.getAccountWhitelist())
+                    .set(GameAdMonitor::getAccountValidTime, gameAdMonitor.getAccountValidTime())
+                    .set(GameAdMonitor::getAdWhitelist, gameAdMonitor.getAdWhitelist())
+                    .set(GameAdMonitor::getAdValidTime, gameAdMonitor.getAdValidTime())
+                    .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(param.getIsStart() != null, GameAdMonitor::getIsStart, param.getIsStart())
+                .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())
+        );
+    }
+
+    private GameAdPolicyListVO toVO(GameAdMonitor vo) {
+        GameDTO game = gameService.getById(vo.getId());
+        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(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 com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 import lombok.*;
 
 
-import java.util.Date;
+import java.time.LocalDateTime;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
@@ -19,7 +19,7 @@ import java.io.Serializable;
 @AllArgsConstructor
 @AllArgsConstructor
 @ToString
 @ToString
 @Builder
 @Builder
-@TableName("t_game_applet_shell")
+@TableName("t_game_ad_monitor")
 public class GameAdMonitor implements Serializable {
 public class GameAdMonitor implements Serializable {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
@@ -61,9 +61,14 @@ public class GameAdMonitor implements Serializable {
      private Integer ruleDimension;
      private Integer ruleDimension;
     
     
      /**
      /**
-     * 生效范围(依据规则维度变化):ALLADS(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,逗号间隔)
+     * 生效范围(依据规则维度变化):ALLADS(默认维度:当前创建人的所有广告);其他(对应规则维度的ID字符串,'-'间隔)
      */     
      */     
      private String effectiveScope;
      private String effectiveScope;
+
+     /**
+      * 规则是否启用:1-开启; 0-暂停
+      */
+     private Boolean isStart;
     
     
      /**
      /**
      * 告警方式:1-短信;2-电话;3-钉钉
      * 告警方式:1-短信;2-电话;3-钉钉
@@ -106,7 +111,7 @@ public class GameAdMonitor implements Serializable {
      private String ruleCondition;
      private String ruleCondition;
     
     
      /**
      /**
-     * 规则下的账号白名单(字符串形式,逗号隔开
+     * 规则下的账号白名单(字符串形式,'-'间隔
      */     
      */     
      private String accountWhitelist;
      private String accountWhitelist;
     
     
@@ -116,7 +121,7 @@ public class GameAdMonitor implements Serializable {
      private Integer accountValidTime;
      private Integer accountValidTime;
     
     
      /**
      /**
-     * 规则下的广告白名单(字符串形式,逗号隔开
+     * 规则下的广告白名单(字符串形式,'-'间隔
      */     
      */     
      private String adWhitelist;
      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;
      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> {
+}