Ver Fonte

规则引擎功能开发第二版

zhaoxian há 4 anos atrás
pai
commit
ae90775303
32 ficheiros alterados com 1196 adições e 377 exclusões
  1. 3 3
      jeecg-boot-module-system/src/main/resources/application-dev.yml
  2. 2 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventRuleController.java
  3. 13 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventSendController.java
  4. 2 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmMetricValueController.java
  5. 231 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmRuleCampaignRelController.java
  6. 24 14
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventRule.java
  7. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java
  8. 8 6
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmMetricValue.java
  9. 80 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmRuleCampaignRel.java
  10. 44 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/enums/StatusEnum.java
  11. 2 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventMetricMapper.java
  12. 1 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventRuleMapper.java
  13. 20 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmRuleCampaignRelMapper.java
  14. 3 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventRuleMapper.xml
  15. 18 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmRuleCampaignRelMapper.xml
  16. 2 4
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventRuleService.java
  17. 2 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventSendService.java
  18. 14 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmRuleCampaignRelService.java
  19. 177 277
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventRuleServiceImpl.java
  20. 411 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventSendServiceImpl.java
  21. 4 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmMetricValueServiceImpl.java
  22. 19 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmRuleCampaignRelServiceImpl.java
  23. 4 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java
  24. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouCampaignMapper.java
  25. 3 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupMapper.java
  26. 8 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouCampaignMapper.xml
  27. 13 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml
  28. 0 24
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/controller/KuaishouCostGroupController.java
  29. 1 9
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouCostGroup.java
  30. 4 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouCostGroupMapper.java
  31. 55 19
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouCostGroupMapper.xml
  32. 24 7
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouCostGroupServiceImpl.java

+ 3 - 3
jeecg-boot-module-system/src/main/resources/application-dev.yml

@@ -135,9 +135,9 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://139.186.31.213:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
-          username: hcst
-          password: hcst2020
+          url: jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
+          username: root
+          password: root
           driver-class-name: com.mysql.jdbc.Driver
           # 多数据源配置
           #multi-datasource1:

+ 2 - 2
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventRuleController.java

@@ -155,7 +155,7 @@ public class AlarmEventRuleController {
     @AutoLog(value = "预警事件规则表-通过id删除")
     @ApiOperation(value = "预警事件规则表-通过id删除", notes = "预警事件规则表-通过id删除")
     @GetMapping(value = "/delete")
-    public Result<?> delete(String id) {
+    public Result<?> delete(Long id) {
         try {
             alarmEventRuleService.deleteById(id);
         } catch (Exception e) {
@@ -194,7 +194,7 @@ public class AlarmEventRuleController {
     @AutoLog(value = "预警事件规则表-通过id查询")
     @ApiOperation(value = "预警事件规则表-通过id查询", notes = "预警事件规则表-通过id查询")
     @GetMapping(value = "/queryById")
-    public Result<AlarmEventRule> queryById(@RequestParam(name = "id", required = true) String id) {
+    public Result<AlarmEventRule> queryById(@RequestParam(name = "id", required = true) Long id) {
         Result<AlarmEventRule> result = new Result<>();
         AlarmEventRule alarmEventRule = alarmEventRuleService.selectById(id);
         if (alarmEventRule == null) {

+ 13 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmEventSendController.java

@@ -102,6 +102,19 @@ public class AlarmEventSendController {
         return result;
     }
 
+    @GetMapping(value = "/test")
+    public Result<?> add(String type) {
+        Result<AlarmEventSend> result = new Result<>();
+        try {
+            alarmEventSendService.matchAlarmRules(type);
+            result.success("操作成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
     /**
      * 编辑
      *

+ 2 - 2
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmMetricValueController.java

@@ -80,8 +80,8 @@ public class AlarmMetricValueController {
         return result;
     }
 
-    @AutoLog(value = "指标字段记录表-分页列表查询")
-    @ApiOperation(value = "指标字段记录表-分页列表查询", notes = "指标字段记录表-分页列表查询")
+    @AutoLog(value = "指标字段记录表")
+    @ApiOperation(value = "指标字段记录表-分页列表查询", notes = "指标字段记录表")
     @GetMapping(value = "/queryParentChildList")
     public Result<Object> queryParentChildList(AlarmMetricValue alarmMetricValue, HttpServletRequest req) {
         Result<Object> result = null;

+ 231 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/AlarmRuleCampaignRelController.java

@@ -0,0 +1,231 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
+import cn.com.ctop.alarm.modules.service.IAlarmRuleCampaignRelService;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则和计划、组关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-09
+ */
+@Slf4j
+@Api(tags = "规则和计划、组关系表")
+@RestController
+@RequestMapping("/alarm.modules/alarmRuleCampaignRel")
+public class AlarmRuleCampaignRelController {
+    @Autowired
+    private IAlarmRuleCampaignRelService alarmRuleCampaignRelService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param alarmRuleCampaignRel
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则和计划、组关系表-分页列表查询")
+    @ApiOperation(value = "规则和计划、组关系表-分页列表查询", notes = "规则和计划、组关系表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<AlarmRuleCampaignRel>> queryPageList(AlarmRuleCampaignRel alarmRuleCampaignRel,
+                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                             HttpServletRequest req) {
+        Result<IPage<AlarmRuleCampaignRel>> result = new Result<>();
+        QueryWrapper<AlarmRuleCampaignRel> queryWrapper = QueryGenerator.initQueryWrapper(alarmRuleCampaignRel, req.getParameterMap());
+        Page<AlarmRuleCampaignRel> page = new Page<AlarmRuleCampaignRel>(pageNo, pageSize);
+        IPage<AlarmRuleCampaignRel> pageList = alarmRuleCampaignRelService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param alarmRuleCampaignRel
+     * @return
+     */
+    @AutoLog(value = "规则和计划、组关系表-添加")
+    @ApiOperation(value = "规则和计划、组关系表-添加", notes = "规则和计划、组关系表-添加")
+    @PostMapping(value = "/add")
+    public Result<AlarmRuleCampaignRel> add(@RequestBody AlarmRuleCampaignRel alarmRuleCampaignRel) {
+        Result<AlarmRuleCampaignRel> result = new Result<>();
+        try {
+            alarmRuleCampaignRelService.save(alarmRuleCampaignRel);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "规则和计划、组关系表-通过id删除")
+    @ApiOperation(value = "规则和计划、组关系表-通过id删除", notes = "规则和计划、组关系表-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            alarmRuleCampaignRelService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "规则和计划、组关系表-批量删除")
+    @ApiOperation(value = "规则和计划、组关系表-批量删除", notes = "规则和计划、组关系表-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<AlarmRuleCampaignRel> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<AlarmRuleCampaignRel> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.alarmRuleCampaignRelService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "规则和计划、组关系表-通过id查询")
+    @ApiOperation(value = "规则和计划、组关系表-通过id查询", notes = "规则和计划、组关系表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<AlarmRuleCampaignRel> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<AlarmRuleCampaignRel> result = new Result<>();
+        AlarmRuleCampaignRel alarmRuleCampaignRel = alarmRuleCampaignRelService.getById(id);
+        if (alarmRuleCampaignRel == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(alarmRuleCampaignRel);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<AlarmRuleCampaignRel> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                AlarmRuleCampaignRel alarmRuleCampaignRel = JSON.parseObject(deString, AlarmRuleCampaignRel.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(alarmRuleCampaignRel, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<AlarmRuleCampaignRel> pageList = alarmRuleCampaignRelService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则和计划、组关系表列表");
+        mv.addObject(NormalExcelConstants.CLASS, AlarmRuleCampaignRel.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("规则和计划、组关系表列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<AlarmRuleCampaignRel> listAlarmRuleCampaignRels = ExcelImportUtil.importExcel(file.getInputStream(), AlarmRuleCampaignRel.class, params);
+                alarmRuleCampaignRelService.saveBatch(listAlarmRuleCampaignRels);
+                return Result.ok("文件导入成功!数据行数:" + listAlarmRuleCampaignRels.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 24 - 14
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventRule.java

@@ -29,7 +29,6 @@ import java.util.List;
 @Accessors(chain = true)
 @ApiModel(value = "ctop_alarm_event_rule对象", description = "预警事件规则表")
 public class AlarmEventRule {
-
     /**
      * 规则id
      */
@@ -42,12 +41,9 @@ public class AlarmEventRule {
     @Excel(name = "账户编号", width = 15)
     @ApiModelProperty(value = "账户编号")
     private Long accountId;
-    /**
-     * 组编号
-     */
-    @Excel(name = "组编号", width = 15)
-    @ApiModelProperty(value = "组编号")
-    private Long unitId;
+
+    private Long campaignId;
+
     /**
      * 规则名称
      */
@@ -78,6 +74,14 @@ public class AlarmEventRule {
     @Excel(name = "规则状态", width = 15)
     @ApiModelProperty(value = "规则状态")
     private String eventRuleStatus;
+
+    private String appStatus;
+
+    private String createrId;
+
+    private String metricValueCode;
+
+    private String metricValueName;
     /**
      * createTime
      */
@@ -96,11 +100,6 @@ public class AlarmEventRule {
     private Date updateTime;
 
     @TableField(exist = false)
-    private List<AlarmEventMetric> alarmEventMetrics;
-
-    private String createrId;
-
-    @TableField(exist = false)
     private String createrName;
 
     @TableField(exist = false)
@@ -118,8 +117,19 @@ public class AlarmEventRule {
     @TableField(exist = false)
     private String alarmCondition;
 
-    private String metricValueCode;
+    @TableField(exist = false)
+    private String campaignName;
 
-    private String metricValueName;
+    @TableField(exist = false)
+    private Long unitId;
+
+    @TableField(exist = false)
+    private String unitName;
+
+    @TableField(exist = false)
+    private List<AlarmRuleCampaignRel> rel;
+
+    @TableField(exist = false)
+    private List<AlarmEventMetric> alarmEventMetrics;
 
 }

+ 2 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmEventSend.java

@@ -34,6 +34,8 @@ public class AlarmEventSend {
     @TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "主键id")
     private Long alarmSendId;
+
+    private String userId;
     /**
      * 规则id
      */

+ 8 - 6
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmMetricValue.java

@@ -54,12 +54,14 @@ public class AlarmMetricValue {
     @Excel(name = "指标值编码", width = 15)
     @ApiModelProperty(value = "指标值编码")
     private String metricValueCode;
-    /**
-     * metricValueType
-     */
-    @Excel(name = "metricValueType", width = 15)
-    @ApiModelProperty(value = "metricValueType")
-    private String metricValueType;
+    //数据级别;1账户计划组可见,2账户计划可见,3账户可见
+    private String metricValueLevel;
+
+    private String msgValueType;
+
+    private String msgValueUnit;
+
+    private String msgTemplate;
     /**
      * createTime
      */

+ 80 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/AlarmRuleCampaignRel.java

@@ -0,0 +1,80 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 规则和计划、组关系表
+ *alarm_rule_campaign_rel
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-09
+ */
+@Data
+@TableName("ctop_alarm_rule_campaign_rel")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_alarm_rule_campaign_rel对象", description = "规则和计划、组关系表")
+public class AlarmRuleCampaignRel {
+
+    /**
+     * 规则id
+     */
+    @Excel(name = "规则id", width = 15)
+    @ApiModelProperty(value = "规则id")
+    private Long eventRuleId;
+    /**
+     * 账户id
+     */
+    @Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+    private Long accountId;
+    /**
+     * 计划id
+     */
+    @Excel(name = "计划id", width = 15)
+    @ApiModelProperty(value = "计划id")
+    private Long campaignId;
+    @TableField(exist = false)
+    private String campaignName;
+    /**
+     * 组id
+     */
+    @Excel(name = "组id", width = 15)
+    @ApiModelProperty(value = "组id")
+    private Long unitId;
+    @TableField(exist = false)
+    private String unitName;
+    /**
+     * 规则级别 account-账户级;unit-组级;campaign-计划级
+     */
+    @Excel(name = "规则级别 ACCOUNT-账户级;UNIT-组级;CAMPAIGN-计划级", width = 15)
+    @ApiModelProperty(value = "规则级别 account-账户级;unit-组级;campaign-计划级")
+    private String eventRuleLevel;
+    /**
+     * createTime
+     */
+    @Excel(name = "createTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @Excel(name = "updateTime", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 44 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/enums/StatusEnum.java

@@ -0,0 +1,44 @@
+package cn.com.ctop.alarm.modules.enums;
+
+import lombok.Data;
+
+public enum StatusEnum {
+    STATUSM1("-1", "不限"),
+    STATUS1("1", "已暂停"),
+    STATUS3("3", "超预算"),
+    STATUS4("4", "有效"),
+    STATUS5("5", "已删除"),
+    STATUS6("6", "余额不足"),
+    STATUS11("11", "审核中"),
+    STATUS12("12", "审核未通过"),
+    STATUS14("14", "已结束"),
+    STATUS15("15", "已暂停"),
+    STATUS17("17", "组超预算"),
+    STATUS19("19", "未达投放时间"),
+    STATUS20("20", "有效");
+
+    private String name;
+    private String code;
+
+    private StatusEnum(String code, String name) {
+        this.name = name;
+        this.code = code;
+    }
+
+    public static StatusEnum getEnumByCode(String code) {
+        for (StatusEnum em : StatusEnum.values()) {
+            if (em.code.equals(code)) {
+                return em;
+            }
+        }
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 2 - 2
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventMetricMapper.java

@@ -14,7 +14,7 @@ import java.util.List;
  */
 public interface AlarmEventMetricMapper extends BaseMapper<AlarmEventMetric> {
 
-    List<AlarmEventMetric> selectByEventRuleId(String id);
+    List<AlarmEventMetric> selectByEventRuleId(Long id);
 
-    void deleteByRuleId(String id);
+    void deleteByRuleId(Long id);
 }

+ 1 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmEventRuleMapper.java

@@ -16,7 +16,7 @@ public interface AlarmEventRuleMapper extends BaseMapper<AlarmEventRule> {
 
     List<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule);
 
-    AlarmEventRule queryById(String id);
+    AlarmEventRule queryById(Long id);
 
     List<AlarmEventRule> queryRunningRecordPage(AlarmEventRule alarmEventRule);
 }

+ 20 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/AlarmRuleCampaignRelMapper.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则和计划、组关系表
+ * @author: jeecg-boot
+ * @date:   2020-11-09
+ * @cersion: V1.0
+ */
+public interface AlarmRuleCampaignRelMapper extends BaseMapper<AlarmRuleCampaignRel> {
+
+    void deleteByRuleId(Long id);
+
+    List<AlarmRuleCampaignRel> selectByRuleId(Long id);
+}

+ 3 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmEventRuleMapper.xml

@@ -40,7 +40,9 @@
         ORDER BY t2.create_time DESC
     </select>
     <select id="queryById" resultType="cn.com.ctop.alarm.modules.entity.AlarmEventRule">
-       SELECT DISTINCT t1.*,t3.realname AS 'createrName',t2.user_id,t2.user_name,t2.auth_name AS accountName FROM
+       SELECT DISTINCT t1.*,
+       t3.realname AS 'createrName',t2.user_id,t2.user_name,t2.auth_name AS accountName
+       FROM
         ctop_alarm_event_rule t1
         LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
          LEFT JOIN sys_user t3 ON t1.creater_id = t3.id

+ 18 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/AlarmRuleCampaignRelMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.alarm.modules.mapper.AlarmRuleCampaignRelMapper">
+
+    <delete id="deleteByRuleId">
+        delete from ctop_alarm_rule_campaign_rel
+        where event_rule_id = #{id}
+    </delete>
+
+    <select id="selectByRuleId" resultType="cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel">
+       SELECT t1.*,t2.unit_name AS unitName,t3.campaign_name AS campaignName
+       FROM
+        ctop_alarm_rule_campaign_rel t1
+        LEFT JOIN ctop_kuaishou_group t2 ON t1.unit_id =  t2.unit_id
+		LEFT JOIN ctop_kuaishou_campaign t3 ON t1.campaign_id = t3.campaign_id
+        WHERE event_rule_id = #{id}
+    </select>
+</mapper>

+ 2 - 4
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventRuleService.java

@@ -17,13 +17,11 @@ public interface IAlarmEventRuleService extends IService<AlarmEventRule> {
 
     void editAlarmEventRule(JSONObject obj);
 
-    AlarmEventRule selectById(String id);
-
-    void matchAlarmRules(String checkType);
+    AlarmEventRule selectById(Long id);
 
     PageInfo<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule);
 
-    void deleteById(String id);
+    void deleteById(Long id);
 
     PageInfo<AlarmEventRule> queryRunningRecordPage(AlarmEventRule alarmEventRule);
 }

+ 2 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmEventSendService.java

@@ -6,9 +6,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
 /**
  * @Description: 预警事件发送表
  * @Author: jeecg-boot
- * @Date:   2020-10-29
+ * @Date: 2020-10-29
  * @Version: V1.0
  */
 public interface IAlarmEventSendService extends IService<AlarmEventSend> {
 
+    void matchAlarmRules(String checkType);
 }

+ 14 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IAlarmRuleCampaignRelService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则和计划、组关系表
+ * @Author: jeecg-boot
+ * @Date: 2020-11-09
+ * @Version: V1.0
+ */
+public interface IAlarmRuleCampaignRelService extends IService<AlarmRuleCampaignRel> {
+
+}

+ 177 - 277
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventRuleServiceImpl.java

@@ -2,14 +2,15 @@ package cn.com.ctop.alarm.modules.service.impl;
 
 import cn.com.ctop.alarm.modules.entity.AlarmEventMetric;
 import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
-import cn.com.ctop.alarm.modules.entity.AlarmEventSend;
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventMetricMapper;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventRuleMapper;
-import cn.com.ctop.alarm.modules.mapper.AlarmEventSendMapper;
+import cn.com.ctop.alarm.modules.mapper.AlarmRuleCampaignRelMapper;
 import cn.com.ctop.alarm.modules.service.IAlarmEventRuleService;
-import cn.com.ctop.common.module.service.IMessageTemplate;
-import cn.com.ctop.common.module.service.ISendMessageService;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouCampaignMapper;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupMapper;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -18,14 +19,13 @@ import com.github.pagehelper.PageInfo;
 import com.xxl.job.core.enums.NoEn;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.system.vo.LoginUser;
-import org.jeecg.common.util.db.DataSourceCachePool;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.HashOperations;
 import org.springframework.stereotype.Service;
 
 import javax.transaction.Transactional;
-import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 预警事件规则表
@@ -47,13 +47,13 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
     private AlarmEventMetricMapper alarmEventMetricMapper;
 
     @Autowired
-    private AlarmEventSendMapper alarmEventSendMapper;
+    private AlarmRuleCampaignRelMapper alarmRuleCampaignRelMapper;
 
     @Autowired
-    private IMessageTemplate messageTemplate;
+    private KuaiShouCampaignMapper kuaiShouCampaignMapper;
 
     @Autowired
-    private ISendMessageService sendMessageService;
+    private KuaiShouGroupMapper kuaiShouGroupMapper;
 
     @Override
     public PageInfo<AlarmEventRule> selectListPage(AlarmEventRule alarmEventRule) {
@@ -61,9 +61,10 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
     }
 
     @Override
-    public void deleteById(String id) {
+    public void deleteById(Long id) {
         alarmEventRuleMapper.deleteById(id);
         alarmEventMetricMapper.deleteByRuleId(id);
+        alarmRuleCampaignRelMapper.deleteByRuleId(id);
     }
 
     @Override
@@ -73,50 +74,151 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
 
     @Override
     public void addAlarmEventRule(JSONObject obj) {
+        //1。新增rule表
         AlarmEventRule rule = new AlarmEventRule();
-        rule.setAccountId(obj.getLong("accountId"));
-        rule.setUnitId(obj.getLong("unitId"));
-        rule.setEventRuleName(obj.getString("eventRuleName"));
-        rule.setEventRuleLevel(obj.getString("eventRuleLevel"));
-        rule.setCheckFrequency(obj.getString("checkFrequency"));
-        rule.setProcessMethod(obj.getString("processMethod"));
-        rule.setEventRuleStatus(NoEn.NO1.valueStr());
-        rule.setMetricValueCode(obj.getString("metricValueCode"));
-        rule.setMetricValueName(obj.getString("metricValueName"));
-        rule.setCreaterId(obj.getString("createrId"));
-
-        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-        if (!Check.isNull(sysUser)) {
-            rule.setCreaterId(sysUser.getId());
+        reSetRuleEntity(rule, obj);
+        JSONArray metrics = obj.getJSONArray("alarmEventMetric");
+        if (Check.isNull(metrics)) {
+            return;
         }
+        rule.setEventRuleStatus(NoEn.NO1.valueStr());//默认新增为激活状态
         alarmEventRuleMapper.insert(rule);
-        JSONArray metrics = obj.getJSONArray("alarmEventMetric");
+        //2。新增metric表
+        AlarmEventMetric metric = null;
         for (int i = 0; i < metrics.size(); i++) {
-            JSONObject mo = metrics.getJSONObject(i);
-            AlarmEventMetric metric = new AlarmEventMetric();
-            metric.setEventRuleId(rule.getEventRuleId());
-            metric.setMetricValueCode(mo.getString("metricValueCode"));
-            metric.setJudgeType(mo.getString("judgeType"));
-            metric.setJudgeMethod(mo.getString("judgeMethod"));
-            metric.setThreshold(mo.getString("threshold"));
-            metric.setMinThreshold(mo.getString("minThreshold"));
-            metric.setDataRange(mo.getString("dataRange"));
-            metric.setMetricValueCode(mo.getString("metricValueCode"));
-            metric.setMetricValueName(mo.getString("metricValueName"));
+            metric = new AlarmEventMetric();
+            reSetMetricEntity(metric, metrics.getJSONObject(i), rule.getEventRuleId());
             alarmEventMetricMapper.insert(metric);
         }
+        //2。新增rel表
+        //通过指定选择应用
+        JSONArray rels = obj.getJSONArray("rel");
+        if (!Check.isNull(rels)) {
+            addRelByIds(rels, rule);
+        }
     }
 
     @Override
     public void editAlarmEventRule(JSONObject obj) {
+        //1.更改rule表
         AlarmEventRule rule = new AlarmEventRule();
+        reSetRuleEntity(rule, obj);
+        QueryWrapper<AlarmEventRule> ruleWrapper = new QueryWrapper<>();
+        ruleWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
+        alarmEventRuleMapper.update(rule, ruleWrapper);
+        rule.setEventRuleId(obj.getLong("eventRuleId"));
+        //2.更改metric表
+        JSONArray metrics = obj.getJSONArray("alarmEventMetric");
+        if (Check.isNull(metrics)) {
+            return;
+        }
+        AlarmEventMetric metric = null;
+        QueryWrapper<AlarmEventMetric> metricWrapper = null;
+        for (int i = 0; i < metrics.size(); i++) {
+            JSONObject mo = metrics.getJSONObject(i);
+            metric = new AlarmEventMetric();
+            reSetMetricEntity(metric, mo, rule.getEventRuleId());
+            metricWrapper = new QueryWrapper<>();
+            metricWrapper.eq("event_metric_id", mo.getLong("eventMetricId"));
+            metricWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
+            alarmEventMetricMapper.update(metric, metricWrapper);
+        }
+        //3.更改rel表
+        //通过指定,传参ids绑定应用
+        JSONArray rels = obj.getJSONArray("rel");
+        if (!Check.isNull(rels)) {
+            alarmRuleCampaignRelMapper.deleteByRuleId(rule.getEventRuleId());
+            addRelByIds(rels, rule);
+        }
+        /*//通过级别和状态判断应用
+        if (!Check.isNull(obj.getString("appStatus"))) {
+            addRelByStatus(rule, obj.getLong("accountId"));
+        }*/
+    }
+
+    @Override
+    public AlarmEventRule selectById(Long id) {
+        AlarmEventRule alarmEventRule = alarmEventRuleMapper.queryById(id);
+        if (Check.isNull(alarmEventRule)) {
+            return null;
+        }
+        alarmEventRule.setAlarmEventMetrics(alarmEventMetricMapper.selectByEventRuleId(id));
+        if (("CAMPAIGN".equals(alarmEventRule.getEventRuleLevel()) || "UNIT".equals(alarmEventRule.getEventRuleLevel())) && !NoEn.NO1.valueStr().equals(alarmEventRule.getAppStatus())) {
+            alarmEventRule.setRel(alarmRuleCampaignRelMapper.selectByRuleId(id));
+        }
+        return alarmEventRule;
+    }
+
+    //通过状态+level绑定应用
+    private void addRelByStatus(AlarmEventRule rule, Long campaignId) {
+        if ("CAMPAIGN".equals(rule.getEventRuleLevel())) {
+            List<Long> ids = kuaiShouCampaignMapper.queryIdsByPutStatus(rule.getAccountId(), NoEn.NO1.valueStr());
+            if (Check.isNull(ids)) {
+                return;
+            }
+            for (Long id : ids) {
+                AlarmRuleCampaignRel relEntity = new AlarmRuleCampaignRel();
+                relEntity.setEventRuleId(rule.getEventRuleId());
+                relEntity.setAccountId(rule.getAccountId());
+                relEntity.setEventRuleLevel(rule.getEventRuleLevel());
+                relEntity.setCampaignId(id);
+                alarmRuleCampaignRelMapper.insert(relEntity);
+            }
+        }
+        if ("UNIT".equals(rule.getEventRuleLevel())) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("put_status", NoEn.NO1.valueStr());
+            map.put("account_id", rule.getAccountId());
+            if (Check.isNull(campaignId)) {
+                map.put("campaign_id", campaignId);
+            }
+            List<KuaiShouGroup> kuaiShouGroups = kuaiShouGroupMapper.selectByMap(map);
+            if (Check.isNull(kuaiShouGroups)) {
+                return;
+            }
+            for (KuaiShouGroup kuaiShouGroup : kuaiShouGroups) {
+                AlarmRuleCampaignRel relEntity = new AlarmRuleCampaignRel();
+                relEntity.setEventRuleId(rule.getEventRuleId());
+                relEntity.setAccountId(rule.getAccountId());
+                relEntity.setEventRuleLevel(rule.getEventRuleLevel());
+                relEntity.setCampaignId(kuaiShouGroup.getCampaignId());
+                relEntity.setUnitId(kuaiShouGroup.getUnitId());
+                alarmRuleCampaignRelMapper.insert(relEntity);
+            }
+        }
+    }
+
+    //通过指定,传参IDS绑定应用
+    private void addRelByIds(JSONArray rels, AlarmEventRule rule) {
+        for (int k = 0; k < rels.size(); k++) {
+            AlarmRuleCampaignRel relEntity = new AlarmRuleCampaignRel();
+            JSONObject rel = rels.getJSONObject(k);
+            relEntity.setEventRuleId(rule.getEventRuleId());
+            relEntity.setAccountId(rule.getAccountId());
+            relEntity.setEventRuleLevel(rule.getEventRuleLevel());
+            relEntity.setCampaignId(rel.getLong("campaignId"));
+            relEntity.setUnitId(rel.getLong("unitId"));
+            alarmRuleCampaignRelMapper.insert(relEntity);
+        }
+    }
+
+    /**
+     * 规则实体类封装
+     * Message template
+     *
+     * @param
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void reSetRuleEntity(AlarmEventRule rule, JSONObject obj) {
         Long accountId = obj.getLong("accountId");
         if (!Check.isNull(accountId)) {
             rule.setAccountId(accountId);
         }
-        Long unitId = obj.getLong("unitId");
-        if (!Check.isNull(unitId)) {
-            rule.setUnitId(unitId);
+        Long campaignId = obj.getLong("campaignId");
+        if (!Check.isNull(campaignId)) {
+            rule.setCampaignId(campaignId);
         }
         String eventRuleName = obj.getString("eventRuleName");
         if (!Check.isNull(eventRuleName)) {
@@ -136,266 +238,64 @@ public class AlarmEventRuleServiceImpl extends ServiceImpl<AlarmEventRuleMapper,
         }
         String metricValueName = obj.getString("metricValueName");
         if (!Check.isNull(metricValueName)) {
-            rule.setMetricValueCode(metricValueName);
+            rule.setMetricValueName(metricValueName);
         }
         String processMethod = obj.getString("processMethod");
         if (!Check.isNull(processMethod)) {
             rule.setProcessMethod(processMethod);
-
         }
         String eventRuleStatus = obj.getString("eventRuleStatus");
         if (!Check.isNull(eventRuleStatus)) {
             rule.setEventRuleStatus(eventRuleStatus);
         }
+        rule.setCreaterId(obj.getString("createrId"));
         LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         if (!Check.isNull(sysUser)) {
             rule.setCreaterId(sysUser.getId());
         }
-        QueryWrapper<AlarmEventRule> ruleWrapper = new QueryWrapper<>();
-        ruleWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
-        alarmEventRuleMapper.update(rule, ruleWrapper);
-        JSONArray metrics = obj.getJSONArray("alarmEventMetric");
-        if (Check.isNull(metrics)) {
-            return;
-        }
-        for (int i = 0; i < metrics.size(); i++) {
-            JSONObject mo = metrics.getJSONObject(i);
-            AlarmEventMetric metric = new AlarmEventMetric();
-            Long eventRuleId = rule.getEventRuleId();
-            if (!Check.isNull(eventRuleId)) {
-                metric.setEventRuleId(eventRuleId);
-            }
-            String valueCode = mo.getString("metricValueCode");
-            if (!Check.isNull(valueCode)) {
-                metric.setMetricValueCode(valueCode);
-            }
-            String valueName = mo.getString("metricValueName");
-            if (!Check.isNull(valueName)) {
-                metric.setMetricValueName(valueName);
-            }
-            String judgeType = mo.getString("judgeType");
-            if (!Check.isNull(judgeType)) {
-                metric.setJudgeType(judgeType);
-            }
-            String judgeMethod = mo.getString("judgeMethod");
-            if (!Check.isNull(judgeMethod)) {
-                metric.setJudgeMethod(judgeMethod);
-            }
-            String threshold = mo.getString("threshold");
-            if (!Check.isNull(threshold)) {
-                metric.setThreshold(threshold);
-            }
-            String minThreshold = mo.getString("minThreshold");
-            if (!Check.isNull(minThreshold)) {
-                metric.setMinThreshold(minThreshold);
-            }
-            String dataRange = mo.getString("dataRange");
-            if (!Check.isNull(dataRange)) {
-                metric.setDataRange(dataRange);
-            }
-            QueryWrapper<AlarmEventMetric> metricWrapper = new QueryWrapper<>();
-            metricWrapper.eq("event_metric_id", mo.getLong("eventMetricId"));
-            metricWrapper.eq("event_rule_id", obj.getLong("eventRuleId"));
-            alarmEventMetricMapper.update(metric, metricWrapper);
-        }
-    }
-
-    @Override
-    public AlarmEventRule selectById(String id) {
-        AlarmEventRule alarmEventRule = alarmEventRuleMapper.queryById(id);
-        List<AlarmEventMetric> alarmEventMetricList = alarmEventMetricMapper.selectByEventRuleId(id);
-        return alarmEventRule.setAlarmEventMetrics(alarmEventMetricList);
-    }
-
-    @Override
-    public void matchAlarmRules(String checkType) {
-        List<AlarmEventRule> allRules = getAllAlarmRules(checkType);
-        List<JSONObject> accountCosts = getCostInfo("account");
-        if (Check.isNull(allRules) || Check.isNull(accountCosts)) {
-            return;
-        }
-        for (JSONObject cost : accountCosts) {
-            for (AlarmEventRule rule : allRules) {
-                if (cost.getLong("accountId") - rule.getAccountId() == 0) {
-                    matchRules(rule, cost);
-                }
-            }
-        }
-    }
-
-    private void matchRules(AlarmEventRule rule, JSONObject cost) {
-        String rulesMetric = rule.getMetricValueCode();
-        //目标成本
-        BigDecimal value = cost.getBigDecimal(rulesMetric);
-        if (Check.isNull(value)) {
-            log.warn("规则中指标不匹配");
-            return;
-        }
-        //总消耗
-        BigDecimal totalCost = cost.getBigDecimal("totalCost");
-        List<AlarmEventMetric> metrics = rule.getAlarmEventMetrics();
-        if (Check.isNull(metrics)) {
-            return;
-        }
-        boolean flag = true;
-        StringBuffer depletionStr = new StringBuffer();
-        StringBuffer valueStr = new StringBuffer();
-        StringBuffer roiStr = new StringBuffer();
-        if (metrics.size() > 1) {
-            depletionStr.append("消耗");
-            valueStr.append("并且成本");
-            roiStr.append("并且ROI");
-        } else {
-            valueStr.append(metrics.get(0).getMetricValueName());
-        }
-        for (AlarmEventMetric metric : metrics) {
-            if (flag) {
-                //阈值
-                BigDecimal threshold = new BigDecimal(metric.getThreshold());
-                String judgeMethod = metric.getJudgeMethod();
-                String metricValue = metric.getMetricValueCode();
-                String sub = metricValue.substring(metricValue.lastIndexOf("_") + 1);
-                //大于等于
-                if ("GT_EQ".equals(judgeMethod)) {
-                    //判断阈值类型(cost-成本;depletion-消耗;roi)
-                    if ("depletion".equals(sub)) {
-                        flag = totalCost.compareTo(threshold) >= 0;
-                        depletionStr.append("高于").append("账户设置的消耗值:").append(threshold).append("元");
-                        continue;
-                    } else if ("roi".equals(sub)) {
-                        roiStr.append("高于").append("账户设置的ROI:").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
-                        flag = value.compareTo(threshold) >= 0;
-                        continue;
-                    } else {
-                        valueStr.append("高于").append("账户设置的成本价格:").append(threshold).append("元");
-                        flag = value.compareTo(threshold) >= 0;
-                        continue;
-                    }
-                    //小于等于
-                } else if ("LT_EQ".equals(judgeMethod)) {
-                    if ("depletion".equals(sub)) {
-                        depletionStr.append("低于").append("账户设置的消耗值:").append(threshold).append("元");
-                        flag = totalCost.compareTo(threshold) <= 0;
-                        continue;
-                    } else if ("roi".equals(sub)) {
-                        roiStr.append("低于").append("账户设置的ROI:").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
-                        flag = value.compareTo(threshold) <= 0;
-                        continue;
-                    } else {
-                        valueStr.append("低于").append("账户设置的成本价格:").append(threshold).append("元");
-                        flag = value.compareTo(threshold) <= 0;
-                        continue;
-                    }
-                    //介于
-                } else if ("BETWEEN".equals(judgeMethod)) {
-                    BigDecimal minThreshold = new BigDecimal(metric.getMinThreshold());
-                    if ("depletion".equals(sub)) {
-                        flag = (totalCost.compareTo(threshold) > 0) || (totalCost.compareTo(minThreshold) < 0);
-                        if (totalCost.compareTo(threshold) > 0) {
-                            depletionStr.append("高于");
-                        }
-                        if (totalCost.compareTo(minThreshold) < 0) {
-                            depletionStr.append("低于");
-                        }
-                        depletionStr.append("账户设置的消耗区间:").append(minThreshold).append("元-").append(threshold).append("元");
-                        continue;
-                    } else if ("roi".equals(sub)) {
-                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
-                        if (value.compareTo(threshold) > 0) {
-                            roiStr.append("高于");
-                        }
-                        if (value.compareTo(minThreshold) < 0) {
-                            roiStr.append("低于");
-                        }
-                        roiStr.append("账户设置的").append(rule.getMetricValueName()).append("区间:").append(minThreshold.multiply(new BigDecimal(100)).setScale(2)).append("%-").append(threshold.multiply(new BigDecimal(100)).setScale(2)).append("%");
-                        continue;
-                    } else {
-                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
-                        if (value.compareTo(threshold) > 0) {
-                            valueStr.append("高于");
-                        }
-                        if (value.compareTo(minThreshold) < 0) {
-                            valueStr.append("低于");
-                        }
-                        valueStr.append("账户设置的成本区间:").append(minThreshold).append("元-").append(threshold).append("元");
-                        continue;
-                    }
-                } else {
-                    log.warn("缺失判断条件");
-                }
-            } else {
-                break;
-            }
-        }
-        //规则满足,产生预警
-        if (flag) {
-            cost.put("accountName", rule.getAccountName());
-            cost.put("name", rule.getMetricValueName());
-            if (metrics.size() > 1) {
-                if (rule.getMetricValueCode().toLowerCase().contains("roi")) {
-                    cost.put("depletion", depletionStr.append("<br/>").append(roiStr).toString());
-                } else {
-                    cost.put("depletion", depletionStr.append("<br/>").append(valueStr).toString());
-                }
-            } else {
-                cost.put("depletion", valueStr.toString());
-            }
-            String msg = null;
-            if ("SEND".equals(rule.getProcessMethod())) {
-                cost.put("end", "请您及时查看并调整!");
-                msg = messageTemplate.getAlarmCostMessage(cost);
-            } else {
-                cost.put("end", "现已被关停,请您及时查看并调整!");
-                msg = messageTemplate.getAlarmCostMessage(cost);
-            }
-            if (!Check.isNull(msg)) {
-                sendMessageService.sendMessage(rule.getUserId(), msg);
-
-                AlarmEventSend send = new AlarmEventSend();
-                send.setAlarmDetail(msg);
-                send.setAlarmStatus(NoEn.NO1.valueStr());
-                send.setMetricValueCode(rule.getMetricValueCode());
-                send.setEventRuleId(rule.getEventRuleId());
-                send.setAlarmCondition(rule.getMetricValueName() + "预警:" + cost.getString("depletion"));
-                alarmEventSendMapper.insert(send);
-            }
+        if (!Check.isNull(obj.getString("appStatus")) && Check.isNull(obj.getJSONArray("rel"))) {
+            rule.setAppStatus(obj.getString("appStatus"));
         }
     }
 
     /**
-     * 获取成本数据。
-     *
-     * @param code : unit 组级数据,account 账户级数据
-     * @return java.util.List<cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup>
-     * @throws
-     * @author ZHAOXA
-     */
-    private List<JSONObject> getCostInfo(String code) {
-        HashOperations<String, Object, Object> hahs = DataSourceCachePool.getRedisTemplate().opsForHash();
-        return (List<JSONObject>) hahs.get("KS_COST", code);
-    }
-
-    /**
-     * 获取告警规则集合
+     * 填充规则详细实体类
      *
      * @param
-     * @return java.util.List<cn.com.ctop.alarm.modules.entity.AlarmEventRules>
+     * @return void
      * @throws
      * @author ZHAOXA
      */
-    private List<AlarmEventRule> getAllAlarmRules(String checkType) {
-        AlarmEventRule alarmEventRule = new AlarmEventRule();
-        alarmEventRule.setEventRuleStatus(NoEn.NO1.valueStr());
-        alarmEventRule.setCheckFrequency(checkType);
-        List<AlarmEventRule> ruleList = alarmEventRuleMapper.selectListPage(alarmEventRule);
-        if (!Check.isNull(ruleList)) {
-            for (AlarmEventRule rule : ruleList) {
-                QueryWrapper<AlarmEventMetric> metricWrapper = new QueryWrapper<>();
-                metricWrapper.eq("event_rule_id", rule.getEventRuleId());
-                rule.setAlarmEventMetrics(alarmEventMetricMapper.selectList(metricWrapper));
-            }
+    private void reSetMetricEntity(AlarmEventMetric metric, JSONObject mo, Long ruleId) {
+        metric.setEventRuleId(ruleId);
+        String valueCode = mo.getString("metricValueCode");
+        if (!Check.isNull(valueCode)) {
+            metric.setMetricValueCode(valueCode);
+        }
+        String valueName = mo.getString("metricValueName");
+        if (!Check.isNull(valueName)) {
+            metric.setMetricValueName(valueName);
+        }
+        String judgeType = mo.getString("judgeType");
+        if (!Check.isNull(judgeType)) {
+            metric.setJudgeType(judgeType);
+        }
+        String judgeMethod = mo.getString("judgeMethod");
+        if (!Check.isNull(judgeMethod)) {
+            metric.setJudgeMethod(judgeMethod);
+        }
+        String threshold = mo.getString("threshold");
+        if (!Check.isNull(threshold)) {
+            metric.setThreshold(threshold);
+        }
+        String minThreshold = mo.getString("minThreshold");
+        if (!Check.isNull(minThreshold)) {
+            metric.setMinThreshold(minThreshold);
+        }
+        String dataRange = mo.getString("dataRange");
+        if (!Check.isNull(dataRange)) {
+            metric.setDataRange(dataRange);
         }
-        return ruleList;
     }
 
 }

+ 411 - 2
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmEventSendServiceImpl.java

@@ -1,19 +1,428 @@
 package cn.com.ctop.alarm.modules.service.impl;
 
+import cn.com.ctop.alarm.modules.entity.AlarmEventMetric;
+import cn.com.ctop.alarm.modules.entity.AlarmEventRule;
 import cn.com.ctop.alarm.modules.entity.AlarmEventSend;
+import cn.com.ctop.alarm.modules.entity.AlarmMetricValue;
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
+import cn.com.ctop.alarm.modules.enums.StatusEnum;
+import cn.com.ctop.alarm.modules.mapper.AlarmEventMetricMapper;
+import cn.com.ctop.alarm.modules.mapper.AlarmEventRuleMapper;
 import cn.com.ctop.alarm.modules.mapper.AlarmEventSendMapper;
+import cn.com.ctop.alarm.modules.mapper.AlarmMetricValueMapper;
+import cn.com.ctop.alarm.modules.mapper.AlarmRuleCampaignRelMapper;
 import cn.com.ctop.alarm.modules.service.IAlarmEventSendService;
+import cn.com.ctop.common.module.service.IMessageTemplate;
+import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCampaign;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouCampaignMapper;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupMapper;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.enums.NoEn;
+import org.jeecg.common.util.db.DataSourceCachePool;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.HashOperations;
 import org.springframework.stereotype.Service;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 预警事件发送表
+ *
  * @author jeecg-boot
- * @date   2020-10-29
  * @version V1.0
+ * @date 2020-10-29
  */
 @Service
 public class AlarmEventSendServiceImpl extends ServiceImpl<AlarmEventSendMapper, AlarmEventSend> implements IAlarmEventSendService {
 
+    @Autowired
+    private AlarmEventRuleMapper alarmEventRuleMapper;
+
+    @Autowired
+    private AlarmEventMetricMapper alarmEventMetricMapper;
+
+    @Autowired
+    private AlarmRuleCampaignRelMapper alarmRuleCampaignRelMapper;
+
+    @Autowired
+    private AlarmMetricValueMapper alarmMetricValueMapper;
+
+    @Autowired
+    private AlarmEventSendMapper alarmEventSendMapper;
+
+    @Autowired
+    private IMessageTemplate messageTemplate;
+
+    @Autowired
+    private ISendMessageService sendMessageService;
+
+    @Autowired
+    private KuaiShouCampaignMapper kuaiShouCampaignMapper;
+
+    @Autowired
+    private KuaiShouGroupMapper kuaiShouGroupMapper;
+
+    private static JSONObject alarmValue;
+
+    /**
+     * value数据存储到内存
+     *
+     * @param
+     * @return com.alibaba.fastjson.JSONObject
+     * @throws
+     * @author ZHAOXA
+     */
+    private JSONObject getAlarmValue() {
+        if (Check.isNull(alarmValue)) {
+            alarmValue = new JSONObject();
+            List<AlarmMetricValue> valueList = alarmMetricValueMapper.selectList(null);
+            if (!Check.isNull(valueList)) {
+                for (AlarmMetricValue value : valueList) {
+                    alarmValue.put(value.getMetricValueCode(), value);
+                }
+            }
+            return alarmValue;
+        }
+        return alarmValue;
+    }
+
+    @Override
+    public void matchAlarmRules(String checkType) {
+        List<AlarmEventRule> allRules = getAllAlarmRules(checkType);
+        List<JSONObject> accountCosts = getCostInfo("ACCOUNT");
+        List<JSONObject> campaignCosts = getCostInfo("CAMPAIGN");
+        List<JSONObject> unitCosts = getCostInfo("UNIT");
+        if (Check.isNull(allRules)) {
+            return;
+        }
+        //判断账户级
+        for (AlarmEventRule rule : allRules) {
+            for (JSONObject accountCost : accountCosts) {
+                if ("ACCOUNT".equals(rule.getEventRuleLevel()) && accountCost.getLong("accountId") - rule.getAccountId() == 0) {
+                    matchRules(rule, accountCost, "ACCOUNT");
+                }
+            }
+            //判断计划级
+            for (JSONObject campaignCost : campaignCosts) {
+                if ("CAMPAIGN".equals(rule.getEventRuleLevel()) && campaignCost.getLong("accountId") - rule.getAccountId() == 0) {
+                    List<AlarmRuleCampaignRel> rel = rule.getRel();
+                    if (!Check.isNull(rel)) {
+                        for (AlarmRuleCampaignRel campaignRel : rel) {
+                            if (campaignRel.getCampaignId() - campaignCost.getLong("campaignId") == 0) {
+                                rule.setCampaignId(campaignRel.getCampaignId());
+                                rule.setCampaignName(campaignRel.getCampaignName());
+                                matchRules(rule, campaignCost, "CAMPAIGN");
+                            }
+                        }
+                    }
+                }
+            }
+            //判断组级
+            for (JSONObject unitCost : unitCosts) {
+                if ("UNIT".equals(rule.getEventRuleLevel()) && unitCost.getLong("accountId") - rule.getAccountId() == 0) {
+                    List<AlarmRuleCampaignRel> rel = rule.getRel();
+                    if (!Check.isNull(rel)) {
+                        for (AlarmRuleCampaignRel unitRel : rel) {
+                            if (unitRel.getUnitId() - unitCost.getLong("unitId") == 0) {
+                                rule.setCampaignId(unitRel.getCampaignId());
+                                rule.setCampaignName(unitRel.getCampaignName());
+                                rule.setUnitId(unitRel.getUnitId());
+                                rule.setUnitName(unitRel.getUnitName());
+                                matchRules(rule, unitCost, "UNIT");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 匹配规则
+     *
+     * @param
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void matchRules(AlarmEventRule rule, JSONObject cost, String level) {
+        //目标值
+        String goal = cost.getString(rule.getMetricValueCode());
+        if (Check.isNull(goal)) {
+            log.warn("规则中指标不匹配");
+            return;
+        }
+        //总消耗
+        BigDecimal totalCost = cost.getBigDecimal("totalCost");
+        BigDecimal value = new BigDecimal(goal);
+        List<AlarmEventMetric> metrics = rule.getAlarmEventMetrics();
+        if (Check.isNull(metrics)) {
+            return;
+        }
+        //value配置数据
+        JSONObject alarmValue = getAlarmValue();
+        boolean flag = true;
+        StringBuffer _depletion = new StringBuffer();
+        StringBuffer _roi = new StringBuffer();
+        StringBuffer _value = new StringBuffer();
+        for (AlarmEventMetric metric : metrics) {
+            if (flag) {
+                //阈值
+                BigDecimal threshold = new BigDecimal(metric.getThreshold());
+                String judgeMethod = metric.getJudgeMethod();
+                String metricValue = metric.getMetricValueCode();
+                JSONObject valObj = alarmValue.getJSONObject(metricValue);
+                //模板
+                String msgTemplate = valObj.getString("msgTemplate");
+                //单位 元、%
+                String msgValueUnit = valObj.getString("msgValueUnit");
+                //阈值类型 1-字符串,2-数字(BigDecimal),3-百分数',
+                String showValue = getThreshold(valObj.getString("msgValueType"), threshold, msgValueUnit);
+                String judgment = "低于";
+                //大于等于
+                if ("GT_EQ".equals(judgeMethod)) {
+                    judgment = "高于";
+                    //判断阈值类型(cost-成本;depletion-消耗;roi)
+                    if (metricValue.contains("_depletion")) {
+                        flag = totalCost.compareTo(threshold) >= 0;
+                        getMsgTemplate(_depletion, msgTemplate, judgment, "消耗值", showValue);
+                    } else if (metricValue.contains("_roi")) {
+                        flag = value.compareTo(threshold) >= 0;
+                        getMsgTemplate(_roi, msgTemplate, judgment, "ROI", showValue);
+                    } else {
+                        flag = value.compareTo(threshold) >= 0;
+                        getMsgTemplate(_value, msgTemplate, judgment, "阈值", showValue);
+                    }
+                    //小于等于
+                } else if ("LT_EQ".equals(judgeMethod)) {
+                    if (metricValue.contains("_depletion")) {
+                        flag = totalCost.compareTo(threshold) <= 0;
+                        getMsgTemplate(_depletion, msgTemplate, judgment, "消耗值", showValue);
+                    } else if (metricValue.contains("_roi")) {
+                        flag = value.compareTo(threshold) <= 0;
+                        getMsgTemplate(_roi, msgTemplate, judgment, "ROI", showValue);
+                    } else {
+                        flag = value.compareTo(threshold) <= 0;
+                        getMsgTemplate(_value, msgTemplate, judgment, "阈值", showValue);
+                    }
+                    //介于 
+                } else if ("BETWEEN".equals(judgeMethod)) {
+                    BigDecimal minThreshold = new BigDecimal(metric.getMinThreshold());
+                    String minshowValue = getThreshold(valObj.getString("msgValueType"), minThreshold, msgValueUnit);
+                    if (metricValue.contains("_depletion")) {
+                        flag = (totalCost.compareTo(threshold) > 0) || (totalCost.compareTo(minThreshold) < 0);
+                        if (totalCost.compareTo(threshold) > 0) {
+                            judgment = "高于";
+                        }
+                        getMsgTemplate(_depletion, msgTemplate, judgment, "消耗区间", minshowValue.concat("-").concat(showValue));
+                    } else if (metricValue.contains("_roi")) {
+                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
+                        if (value.compareTo(threshold) > 0) {
+                            judgment = "高于";
+                        }
+                        getMsgTemplate(_roi, msgTemplate, judgment, "ROI区间", minshowValue.concat("-").concat(showValue));
+                        continue;
+                    } else {
+                        flag = (value.compareTo(threshold) > 0) || (value.compareTo(minThreshold) < 0);
+                        if (value.compareTo(threshold) > 0) {
+                            judgment = "高于";
+                        }
+                        getMsgTemplate(_value, msgTemplate, judgment, "阈值区间", minshowValue.concat("-").concat(showValue));
+                    }
+                    //等于
+                } else if ("EQ".equals(judgeMethod)) {
+                    judgment = "等于";
+                    flag = value.compareTo(threshold) == 0;
+                    String name = StatusEnum.getEnumByCode(threshold.toString()).getName();
+                    getMsgTemplate(_value, msgTemplate, judgment, "阈值", name);
+                } else {
+                    log.warn("缺失判断条件");
+                    break;
+                }
+            } else {
+                break;
+            }
+        }
+        //规则满足,产生预警
+        if (flag) {
+            String detail = getDetail(_depletion, _roi, _value);
+            String msg = getMsg(level, detail, cost, rule);
+            if (!Check.isNull(msg)) {
+                if ("SEND".equals(rule.getProcessMethod())) {
+                    msg += "请您及时查看并调整!";
+                } else {
+                    msg += "现已被关停,请您及时查看并调整!";
+                }
+                sendMessageService.sendMessage(rule.getUserId(), msg);
+                AlarmEventSend send = new AlarmEventSend();
+                send.setAlarmDetail(msg);
+                send.setAlarmStatus(NoEn.NO1.valueStr());
+                send.setMetricValueCode(rule.getMetricValueCode());
+                send.setEventRuleId(rule.getEventRuleId());
+                send.setAlarmCondition(rule.getMetricValueName().concat("预警:").concat(detail.replace("<br/>", ";")));
+                send.setUserId(rule.getUserId());
+                alarmEventSendMapper.insert(send);
+            }
+        }
+    }
+
+    /**
+     * 判断模板中阈值展示格式(含单位)
+     * 例如:100.0元、55.53%
+     */
+    private String getThreshold(String msgValueType, BigDecimal value, String msgValueUnit) {
+        //1-字符串,2-数字(BigDecimal),3-百分数
+        if ("3".equals(msgValueType)) {
+            return value.multiply(new BigDecimal(100)).setScale(2).toString().concat(msgValueUnit);
+        }
+        return value.toString().concat(msgValueUnit);
+    }
+
+    /**
+     * 匹配消息模板
+     */
+    private void getMsgTemplate(StringBuffer buf, String msgTemplate, String jud, String name, String value) {
+        buf.append(msgTemplate.replace("{judgment}", jud).replace("{name}", name).replace("{value}", value));
+    }
+
+    /**
+     * 组合消息内容
+     */
+    private String getDetail(StringBuffer _depletion, StringBuffer _roi, StringBuffer _value) {
+        StringBuffer detail = new StringBuffer();
+        if (_depletion.length() > 0) {
+            detail.append(_depletion);
+            if (_roi.length() > 0) {
+                detail.append("并且").append(_roi);
+                if (_value.length() > 0) {
+                    detail.append("并且").append(_value);
+                }
+            } else {
+                if (_value.length() > 0) {
+                    detail.append("并且").append(_value);
+                }
+            }
+        } else {
+            if (_roi.length() > 0) {
+                detail.append(_roi);
+                if (_value.length() > 0) {
+                    detail.append("并且").append(_value);
+                }
+            } else {
+                if (_value.length() > 0) {
+                    detail.append(_value);
+                }
+            }
+        }
+        return detail.toString();
+    }
+
+    /**
+     * 整理发送的消息
+     */
+    private String getMsg(String level, String detail, JSONObject cost, AlarmEventRule rule) {
+        StringBuffer header = new StringBuffer();
+        header.append(rule.getMetricValueName()).append("预警").append("<br/>").
+                append("您的账户:").append(cost.getString("accountId")).append(",授权名称为:").append(rule.getAccountName()).append("<br/>");
+        if ("ACCOUNT".equals(level)) {
+            header.append(detail);
+        } else if ("CAMPAIGN".equals(level)) {
+            header.append("计划ID:").append(rule.getCampaignId()).append("计划名称为:").append(rule.getCampaignName()).append("<br/>").append(detail);
+        } else {
+            header.append("计划ID:").append(rule.getCampaignId()).append(",计划名称为:").append(rule.getCampaignName()).append("<br/>")
+                    .append("组ID:").append(rule.getUnitId()).append(",组名称为:").append(rule.getUnitName()).append("<br/>").append(detail);
+        }
+        return header.toString();
+    }
+
+
+    /**
+     * 获取成本数据。
+     *
+     * @param code : unit 组级数据,account 账户级数据
+     * @return java.util.List<cn.com.ctop.kuaishou.modules.report.entity.KuaishouCostGroup>
+     * @throws
+     * @author ZHAOXA
+     */
+    private List<JSONObject> getCostInfo(String code) {
+        HashOperations<String, Object, Object> hahs = DataSourceCachePool.getRedisTemplate().opsForHash();
+        return (List<JSONObject>) hahs.get("KS_COST", code);
+    }
+
+    /**
+     * 获取告警规则集合
+     *
+     * @param
+     * @return java.util.List<cn.com.ctop.alarm.modules.entity.AlarmEventRules>
+     * @throws
+     * @author ZHAOXA
+     */
+    private List<AlarmEventRule> getAllAlarmRules(String checkType) {
+        AlarmEventRule alarmEventRule = new AlarmEventRule();
+        alarmEventRule.setEventRuleStatus(NoEn.NO1.valueStr());
+        alarmEventRule.setCheckFrequency(checkType);
+        List<AlarmEventRule> ruleList = alarmEventRuleMapper.selectListPage(alarmEventRule);
+        if (!Check.isNull(ruleList)) {
+            for (AlarmEventRule rule : ruleList) {
+                rule.setAlarmEventMetrics(alarmEventMetricMapper.selectByEventRuleId(rule.getEventRuleId()));
+                if (!"ACCOUNT".equals(rule.getEventRuleLevel())) {
+                    if (NoEn.NO1.valueStr().equals(rule.getAppStatus())) {
+                        rule.setRel(getRel(rule));
+                    } else {
+                        rule.setRel(alarmRuleCampaignRelMapper.selectByRuleId(rule.getEventRuleId()));
+                    }
+                }
+            }
+        }
+        return ruleList;
+    }
+
+    private List<AlarmRuleCampaignRel> getRel(AlarmEventRule rule) {
+        List<AlarmRuleCampaignRel> relList = new ArrayList<>();
+        AlarmRuleCampaignRel rel = null;
+        if ("CAMPAIGN".equals(rule.getEventRuleLevel())) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("put_status", NoEn.NO1.valueStr());
+            map.put("account_id", rule.getAccountId());
+            List<KuaiShouCampaign> kuaiShouCampaigns = kuaiShouCampaignMapper.selectByMap(map);
+            if (!Check.isNull(kuaiShouCampaigns)) {
+                for (KuaiShouCampaign campaign : kuaiShouCampaigns) {
+                    rel = new AlarmRuleCampaignRel();
+                    rel.setCampaignId(campaign.getCampaignId());
+                    rel.setCampaignName(campaign.getCampaignName());
+                    rel.setEventRuleLevel("CAMPAIGN");
+                    relList.add(rel);
+                }
+            }
+        }
+        if ("UNIT".equals(rule.getEventRuleLevel())) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("putStatus", NoEn.NO1.valueStr());
+            map.put("accountId", rule.getAccountId());
+            if (Check.isNull(rule.getCampaignId())) {
+                map.put("campaignId", rule.getCampaignId());
+            }
+            List<KuaiShouGroup> kuaiShouGroups = kuaiShouGroupMapper.queryByMap(map);
+            if (!Check.isNull(kuaiShouGroups)) {
+                for (KuaiShouGroup kuaiShouGroup : kuaiShouGroups) {
+                    rel = new AlarmRuleCampaignRel();
+                    rel.setCampaignId(kuaiShouGroup.getCampaignId());
+                    rel.setCampaignName(kuaiShouGroup.getCampaignName());
+                    rel.setEventRuleLevel("CAMPAIGN");
+                    rel.setUnitId(kuaiShouGroup.getUnitId());
+                    rel.setUnitName(kuaiShouGroup.getUnitName());
+                    relList.add(rel);
+                }
+            }
+        }
+        return relList;
+    }
 }

+ 4 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmMetricValueServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.ctop.alarm.modules.service.impl;
 import cn.com.ctop.alarm.modules.entity.AlarmMetricValue;
 import cn.com.ctop.alarm.modules.mapper.AlarmMetricValueMapper;
 import cn.com.ctop.alarm.modules.service.IAlarmMetricValueService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.common.api.vo.Result;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,7 +31,9 @@ public class AlarmMetricValueServiceImpl extends ServiceImpl<AlarmMetricValueMap
     @Override
     public Result<Object> queryParentChildList(AlarmMetricValue alarmMetricValue) {
         Result<Object> result = new Result<>();
-        List<AlarmMetricValue> list = alarmMetricValueMapper.selectList(null);
+        QueryWrapper<AlarmMetricValue> wrap = new QueryWrapper<>();
+        wrap.eq("metric_value_level", alarmMetricValue.getMetricValueLevel());
+        List<AlarmMetricValue> list = alarmMetricValueMapper.selectList(wrap);
         List<AlarmMetricValue> resultList = new ArrayList<>();
         Map<Integer, List<AlarmMetricValue>> map = new HashMap<>();
         List<Integer> parents = new ArrayList<>();

+ 19 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/AlarmRuleCampaignRelServiceImpl.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.AlarmRuleCampaignRel;
+import cn.com.ctop.alarm.modules.mapper.AlarmRuleCampaignRelMapper;
+import cn.com.ctop.alarm.modules.service.IAlarmRuleCampaignRelService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 规则和计划、组关系表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-09
+ */
+@Service
+public class AlarmRuleCampaignRelServiceImpl extends ServiceImpl<AlarmRuleCampaignRelMapper, AlarmRuleCampaignRel> implements IAlarmRuleCampaignRelService {
+
+}

+ 4 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaiShouGroup.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.kuaishou.modules.batch.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -44,6 +45,9 @@ public class KuaiShouGroup {
     @Excel(name = "广告活动ID", width = 15)
     @ApiModelProperty(value = "广告活动ID")
     private Long campaignId;
+
+    @TableField(exist = false)
+    private String campaignName;
     /**
      * 广告组ID
      */

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouCampaignMapper.java

@@ -15,4 +15,6 @@ import java.util.List;
 public interface KuaiShouCampaignMapper extends BaseMapper<KuaiShouCampaign> {
 
     void replaceBatch(@Param(value = "campaigns") List<KuaiShouCampaign> campaigns);
+
+    List<Long> queryIdsByPutStatus(Long accountId,String putStatus);
 }

+ 3 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupMapper.java

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 广告组信息
@@ -19,4 +20,6 @@ public interface KuaiShouGroupMapper extends BaseMapper<KuaiShouGroup> {
     List<String> selectWarningGroup(@Param("accountId") Long accountId, @Param("maxBid") Long maxBid);
 
     List<String> selectWarningCpaBid(@Param("accountId") Long accountId, @Param("maxBid") BigDecimal maxDeepCapBid);
+
+    List<KuaiShouGroup> queryByMap(Map<String, Object> map);
 }

+ 8 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouCampaignMapper.xml

@@ -33,4 +33,12 @@
             #{campaign.updateTime})
         </foreach>
     </insert>
+
+    <select id="queryIdsByPutStatus" resultType="java.lang.Long">
+        SELECT campaign_id
+        FROM
+        ctop_kuaishou_campaign
+        WHERE account_id = #{accountId}
+        AND put_status = #{putStatus}
+    </select>
 </mapper>

+ 13 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml

@@ -98,5 +98,18 @@
    group by unit_id
     </select>
 
+    <select id="queryByMap" resultType="cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup">
+        SELECT
+        t1.*,t2.campaign_name as campaignName
+        FROM ctop_kuaishou_group t1
+        LEFT JOIN ctop_kuaishou_campaign t2
+        ON t1.campaign_id = t2.campaign_id
+        WHERE t1.account_id = #{accountId}
+        and t1.put_status = #{putStatus}
+        <if test="campaignId != null">
+            t1.campaign_id = #{campaignId}
+        </if>
+    </select>
+
 
 </mapper>

+ 0 - 24
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/controller/KuaishouCostGroupController.java

@@ -103,30 +103,6 @@ public class KuaishouCostGroupController {
     }
 
     /**
-     * 编辑
-     *
-     * @param kuaishouCostGroup
-     * @return
-     */
-    @AutoLog(value = "快手组级时报统计-编辑")
-    @ApiOperation(value = "快手组级时报统计-编辑", notes = "快手组级时报统计-编辑")
-    @PutMapping(value = "/edit")
-    public Result<KuaishouCostGroup> edit(@RequestBody KuaishouCostGroup kuaishouCostGroup) {
-        Result<KuaishouCostGroup> result = new Result<KuaishouCostGroup>();
-        KuaishouCostGroup kuaishouCostGroupEntity = kuaishouCostGroupService.getById(kuaishouCostGroup.getId());
-        if (kuaishouCostGroupEntity == null) {
-            result.error500("未找到对应实体");
-        } else {
-            boolean ok = kuaishouCostGroupService.updateById(kuaishouCostGroup);
-            if (ok) {
-                result.success("修改成功!");
-            }
-        }
-
-        return result;
-    }
-
-    /**
      * 通过id删除
      *
      * @param id

+ 1 - 9
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouCostGroup.java

@@ -1,7 +1,5 @@
 package cn.com.ctop.kuaishou.modules.report.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -15,7 +13,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 import java.util.Date;
 
 /**
- * 快手组级时报统计
+ * 快手时报统计
  *
  * @author jeecg-boot
  * @version V1.0
@@ -29,12 +27,6 @@ import java.util.Date;
 public class KuaishouCostGroup {
 
     /**
-     * id
-     */
-    @TableId(type = IdType.INPUT)
-    @ApiModelProperty(value = "id")
-    private Long id;
-    /**
      * 账户ID
      */
     @Excel(name = "账户ID", width = 15)

+ 4 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/KuaishouCostGroupMapper.java

@@ -15,9 +15,11 @@ import java.util.List;
  */
 public interface KuaishouCostGroupMapper extends BaseMapper<KuaishouCostGroup> {
 
+    List<JSONObject> queryAccountCostInfo(String nowDate);
+
+    List<JSONObject> queryCampaignCostInfo(String date);
+
     List<JSONObject> queryGroupCostInfo(String date);
 
     int bulkInsert(List<JSONObject> list);
-
-    List<JSONObject> queryAccountCostInfo(String nowDate);
 }

+ 55 - 19
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouCostGroupMapper.xml

@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.kuaishou.modules.report.mapper.KuaishouCostGroupMapper">
-    <select id="queryGroupCostInfo" resultType="com.alibaba.fastjson.JSONObject">
-        SELECT stat_date AS statDate,account_id AS accountId,unit_id AS unitId,ROUND(SUM(charge),3) AS totalCost,
+
+    <select id="queryAccountCostInfo" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        stat_date AS statDate,account_id AS accountId,ROUND(SUM(charge),3) AS totalCost,
+        "account" AS type, sysdate() AS createTime,
         CASE WHEN SUM(bclick) != 0 THEN
         ROUND(SUM(charge)/SUM(bclick),3) ELSE 0 END AS 'actionCost',
         CASE WHEN SUM(activation) != 0 THEN
@@ -10,9 +13,9 @@
         CASE WHEN SUM(event_register) != 0 THEN
         ROUND(SUM(charge)/SUM(event_register),3)  ELSE 0 END AS  registerCost,
         CASE WHEN SUM(event_pay) != 0 THEN
-         ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
+        ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
         CASE WHEN SUM(form_count) != 0 THEN
-         ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
+        ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
         ROUND(SUM(charge)/SUM(event_jin_jian_app) ,3) ELSE 0 END AS finishedCost,
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
@@ -20,15 +23,18 @@
         CASE WHEN SUM(charge) != 0 THEN
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         CASE WHEN SUM(charge) != 0 THEN
-        ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi,
-        "unit" AS type,
-        sysdate() AS createTime
-         FROM ctop_kuaishou_report_hourly_group
+        ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi
+        FROM ctop_kuaishou_report_hourly_account
         WHERE stat_date = #{date}
-        GROUP BY unit_id
+        GROUP BY account_id
     </select>
-    <select id="queryAccountCostInfo" resultType="com.alibaba.fastjson.JSONObject">
-        SELECT stat_date AS statDate,account_id AS accountId,ROUND(SUM(charge),3) AS totalCost,
+
+    <select id="queryCampaignCostInfo" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+        t1.stat_date AS statDate,t1.account_id AS accountId,
+		t1.campaign_id AS campaignId,IFNULL(t2.status,-1) as campaignStatus,
+		"campaign" AS type, sysdate() AS createTime,
+		ROUND(SUM(charge),3) AS totalCost,
         CASE WHEN SUM(bclick) != 0 THEN
         ROUND(SUM(charge)/SUM(bclick),3) ELSE 0 END AS 'actionCost',
         CASE WHEN SUM(activation) != 0 THEN
@@ -36,9 +42,9 @@
         CASE WHEN SUM(event_register) != 0 THEN
         ROUND(SUM(charge)/SUM(event_register),3)  ELSE 0 END AS  registerCost,
         CASE WHEN SUM(event_pay) != 0 THEN
-         ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
+        ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
         CASE WHEN SUM(form_count) != 0 THEN
-         ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
+        ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
         CASE WHEN SUM(event_jin_jian_app) != 0 THEN
         ROUND(SUM(charge)/SUM(event_jin_jian_app) ,3) ELSE 0 END AS finishedCost,
         CASE WHEN SUM(event_credit_grant_app) != 0 THEN
@@ -46,23 +52,53 @@
         CASE WHEN SUM(charge) != 0 THEN
         ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
         CASE WHEN SUM(charge) != 0 THEN
-        ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi,
-        "account" AS type,
-        sysdate() AS createTime
-         FROM ctop_kuaishou_report_hourly_account
+        ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi
+        FROM ctop_kuaishou_report_hourly_campaign t1
+		LEFT JOIN ctop_kuaishou_campaign t2 ON t1.campaign_id = t2.campaign_id
         WHERE stat_date = #{date}
-        GROUP BY account_id
+        GROUP BY t1.campaign_id
+    </select>
+
+    <select id="queryGroupCostInfo" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        stat_date AS statDate,t1.account_id AS accountId,t1.campaign_id AS campaignId,
+        t1.unit_id AS unitId,IFNULL(t2.status,-1) as unitStatus,
+        "unit" AS type, sysdate() AS createTime,
+		ROUND(SUM(charge),3) AS totalCost,
+        CASE WHEN SUM(bclick) != 0 THEN
+        ROUND(SUM(charge)/SUM(bclick),3) ELSE 0 END AS 'actionCost',
+        CASE WHEN SUM(activation) != 0 THEN
+        ROUND(SUM(charge)/SUM(activation),3) ELSE 0 END AS activationCost,
+        CASE WHEN SUM(event_register) != 0 THEN
+        ROUND(SUM(charge)/SUM(event_register),3)  ELSE 0 END AS  registerCost,
+        CASE WHEN SUM(event_pay) != 0 THEN
+        ROUND(SUM(charge) / SUM(event_pay), 3) ELSE 0 END AS  payCost,
+        CASE WHEN SUM(form_count) != 0 THEN
+        ROUND(SUM(charge) / SUM(form_count),3) ELSE 0 END AS  formCost,
+        CASE WHEN SUM(event_jin_jian_app) != 0 THEN
+        ROUND(SUM(charge)/SUM(event_jin_jian_app) ,3) ELSE 0 END AS finishedCost,
+        CASE WHEN SUM(event_credit_grant_app) != 0 THEN
+        ROUND(SUM(charge)/SUM(event_credit_grant_app) ,3)ELSE 0 END AS approvalCost,
+        CASE WHEN SUM(charge) != 0 THEN
+        ROUND(SUM(event_pay_purchase_amount_first_day)/SUM(charge) ,4) ELSE 0 END AS firstDayRoi,
+        CASE WHEN SUM(charge) != 0 THEN
+        ROUND(SUM(event_pay_purchase_amount)/SUM(charge) ,4) ELSE 0 END AS roi
+        FROM ctop_kuaishou_report_hourly_group t1
+		LEFT JOIN ctop_kuaishou_group t2 ON t1.unit_id = t2.unit_id
+        WHERE stat_date = #{date}
+        GROUP BY t1.unit_id
     </select>
 
     <insert id="bulkInsert" parameterType="com.alibaba.fastjson.JSONObject">
         insert into ctop_kuaishou_cost_group (
-        account_id, unit_id, total_cost, total_balance, type,stat_date, action_cost, activation_cost,
+        account_id, campaign_id,unit_id, total_cost, total_balance, type,stat_date, action_cost, activation_cost,
         register_cost, pay_cost, form_cost,finished_cost,approval_cost,first_day_roi,roi,create_time
         )
         values
         <foreach collection="list" item="it" separator=",">
             (
             #{it.accountId},
+            #{it.campaignId},
             #{it.unitId},
             #{it.totalCost},
             #{it.totalBalance},

+ 24 - 7
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouCostGroupServiceImpl.java

@@ -47,23 +47,40 @@ public class KuaishouCostGroupServiceImpl extends ServiceImpl<KuaishouCostGroupM
         Map<String, Object> deleteMap = new HashMap<>();
         deleteMap.put("stat_date", date);
         kuaishouCostGroupMapper.deleteByMap(deleteMap);
-        //组级的数据统计
-//        List<JSONObject> grouplist = kuaishouCostGroupMapper.queryGroupCostInfo(date);
-//        if (!Check.isNull(grouplist)) {
-//            kuaishouCostGroupMapper.bulkInsert(grouplist);
-//        }
+        //获取账户级数据
         List<JSONObject> accountList = kuaishouCostGroupMapper.queryAccountCostInfo(date);
         if (!Check.isNull(accountList)) {
+            //获取账户余额
             getTotalBalance(accountList);
             kuaishouCostGroupMapper.bulkInsert(accountList);
         }
+        //获取计划级数据
+        List<JSONObject> campaignList = kuaishouCostGroupMapper.queryCampaignCostInfo(date);
+        if (!Check.isNull(campaignList)) {
+            kuaishouCostGroupMapper.bulkInsert(campaignList);
+        }
+        //获取组级数据
+        List<JSONObject> grouplist = kuaishouCostGroupMapper.queryGroupCostInfo(date);
+        if (!Check.isNull(grouplist)) {
+            kuaishouCostGroupMapper.bulkInsert(grouplist);
+        }
         Map<String, List<JSONObject>> map = new HashMap<>();
-//        map.put("unit", grouplist);
-        map.put("account", accountList);
+        map.put("ACCOUNT", accountList);
+        map.put("CAMPAIGN", campaignList);
+        map.put("UNIT", grouplist);
+
         HashOperations<String, Object, Object> hash = DataSourceCachePool.getRedisTemplate().opsForHash();
         hash.putAll("KS_COST", map);
     }
 
+    /**
+     * 查询余额
+     *
+     * @param
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
     private void getTotalBalance(List<JSONObject> accountList) {
         for (JSONObject obj : accountList) {
             CtopOauthToken oauthToken = oauthTokenService.getTokenByAccountId(obj.getLong("accountId"));