Parcourir la source

游戏广告策略配置

Letianhua il y a 1 an
Parent
commit
50b70a8ebd

+ 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();
+    }
+
+}

+ 0 - 1
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameAdMonitor.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
 import java.time.LocalDateTime;
-import java.util.Date;
 import java.io.Serializable;
 
 /**