ソースを参照

Merge branch 'master' of http://git.tjyourong.com.cn/ctop/adsp-boot

zhaoxian 4 年 前
コミット
15df3bb717
100 ファイル変更7095 行追加137 行削除
  1. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  2. 0 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java
  3. 241 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java
  4. 386 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountTemplateController.java
  5. 270 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountThresholdController.java
  6. 257 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleBaseController.java
  7. 248 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleConditionController.java
  8. 346 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java
  9. 257 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleIndicatorController.java
  10. 79 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleSwitchController.java
  11. 404 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java
  12. 58 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleAccountTemplate.java
  13. 67 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleAccountThreshold.java
  14. 83 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleBase.java
  15. 63 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleCondition.java
  16. 89 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleGroup.java
  17. 88 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleIndicator.java
  18. 63 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleTemplate.java
  19. 100 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/vo/TemplateAppliedVo.java
  20. 0 2
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/enums/StatusEnum.java
  21. 20 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleAccountTemplateMapper.java
  22. 28 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleAccountThresholdMapper.java
  23. 17 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleBaseMapper.java
  24. 15 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleConditionMapper.java
  25. 17 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleGroupMapper.java
  26. 19 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleIndicatorMapper.java
  27. 17 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleTemplateMapper.java
  28. 49 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleAccountTemplateMapper.xml
  29. 37 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleAccountThresholdMapper.xml
  30. 5 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleBaseMapper.xml
  31. 5 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleConditionMapper.xml
  32. 5 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleGroupMapper.xml
  33. 22 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleIndicatorMapper.xml
  34. 5 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleTemplateMapper.xml
  35. 24 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountTemplateService.java
  36. 26 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountThresholdService.java
  37. 14 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleBaseService.java
  38. 14 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleConditionService.java
  39. 18 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java
  40. 24 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleIndicatorService.java
  41. 49 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleTemplateService.java
  42. 123 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleAccountTemplateServiceImpl.java
  43. 140 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleAccountThresholdServiceImpl.java
  44. 19 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleBaseServiceImpl.java
  45. 19 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleConditionServiceImpl.java
  46. 776 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  47. 31 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleIndicatorServiceImpl.java
  48. 539 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleTemplateServiceImpl.java
  49. 234 0
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataAccountController.java
  50. 150 0
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataCreativeController.java
  51. 150 0
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataPlanController.java
  52. 150 0
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataTargetController.java
  53. 77 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataAccount.java
  54. 41 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataCreative.java
  55. 93 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataPlan.java
  56. 77 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java
  57. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/entity/UserAllocation.java
  58. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataAccountMapper.java
  59. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataCreativeMapper.java
  60. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataPlanMapper.java
  61. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataTargetMapper.java
  62. 112 96
      module-common/src/main/java/cn/com/ctop/common/module/mapper/SysUserMapper.java
  63. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  64. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataAccountMapper.xml
  65. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataCreativeMapper.xml
  66. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataPlanMapper.xml
  67. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataTargetMapper.xml
  68. 7 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/SysUserMapper.xml
  69. 6 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  70. 16 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataAccountService.java
  71. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataCreativeService.java
  72. 13 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataPlanService.java
  73. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataTargetService.java
  74. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  75. 60 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataAccountServiceImpl.java
  76. 18 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataCreativeServiceImpl.java
  77. 20 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataPlanServiceImpl.java
  78. 18 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataTargetServiceImpl.java
  79. 10 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  80. 5 0
      module-job-bytedance/pom.xml
  81. 28 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java
  82. 6 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceCheckAccountLandingPageJob.java
  83. 120 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceCheckAccountMonitoringLinkJob.java
  84. 33 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDancePlanRuleDataJob.java
  85. 6 1
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceMonitoringLinksCheckJob.java
  86. 46 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceRuleDataJobDistribute.java
  87. 40 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/RuleDataAccountCleanJob.java
  88. 6 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  89. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAgentAccount.java
  90. 12 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceCreativeController.java
  91. 8 4
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAdvertisePlan.java
  92. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java
  93. 1 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCreativeService.java
  94. 33 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  95. 6 16
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCreativeServiceImpl.java
  96. 2 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IReportService.java
  97. 7 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IRuleByteDanceAccountService.java
  98. 136 6
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java
  99. 45 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/RuleByteDanceAccountServiceImpl.java
  100. 0 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java

+ 1 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -59,6 +59,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/sys/mLogin", "anon");
         filterChainDefinitionMap.put("/sys/login", "anon");
         filterChainDefinitionMap.put("/sys/wxlogin", "anon");
+        filterChainDefinitionMap.put("/ctop/rule/**", "anon");
         //第三方登录
         filterChainDefinitionMap.put("/thirdLogin/**", "anon");
         //获取加密串

+ 0 - 6
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/WpsFileController.java

@@ -1,7 +1,6 @@
 package org.jeecg.modules.wps.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
-import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.service.ISysRoleExtService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -81,11 +80,6 @@ public class WpsFileController {
 		if(null!=name&&!"".equals(name.trim())){
 			queryWrapper.like("name",name);
 		}
-		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		String roleCode = sysRoleService.getRoleCodeByUserId(sysUser.getId());
-		if(null==roleCode||!roleCode.equals(CtopRoleCodeConstant.COMMON_ROLE_CODE_ADMIN)){
-			queryWrapper.eq("creator",sysUser.getId());
-		}
 		Page<WpsFile> page = new Page<>(pageNo, pageSize);
 		IPage<WpsFile> pageList = wpsFileService.page(page, queryWrapper);
 		result.setSuccess(true);

+ 241 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java

@@ -0,0 +1,241 @@
+package cn.com.ctop.alarm.modules.constant;
+
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * TODO
+ *
+ * @ClassName MatchLogic
+ * @Author ZHAOXA
+ * @date 2020-11-17 10:54
+ */
+@Slf4j
+public class MatchLogic {
+
+    /**
+     * @param type      数据类型
+     * @param condition 条件
+     * @param threshold 阈值
+     * @param value     比对值
+     * @return boolean
+     * @throws
+     * @author ZHAOXA
+     */
+    public static boolean matchCondition(String type, String condition, String threshold, String value, JSONObject obj) {
+        try {
+            if (Check.isNull(threshold)) {
+                return false;
+            }
+            if (Check.isNull(value)) {
+                obj.put("isNull", true);
+                return true;
+            }
+            obj.put("isNull", false);
+            if ("number".equals(type)) {
+                BigDecimal bigThr = new BigDecimal(threshold);
+                BigDecimal bigVal = new BigDecimal(value);
+                switch (condition) {
+                    case "equal":
+                        return bigVal.compareTo(bigThr) == 0;
+                    case "not_equal":
+                        return bigVal.compareTo(bigThr) != 0;
+                    case "greater":
+                        return bigVal.compareTo(bigThr) > 0;
+                    case "less":
+                        return bigVal.compareTo(bigThr) < 0;
+                    case "greater_equal":
+                        return bigVal.compareTo(bigThr) >= 0;
+                    case "less_equal":
+                        return bigVal.compareTo(bigThr) <= 0;
+                    default:
+                        log.warn("关系不匹配");
+                        break;
+                }
+            } else if ("string".equals(type)) {
+                switch (condition) {
+                    case "equal":
+                        return value.equals(threshold);
+                    case "not_equal":
+                        return !value.equals(threshold);
+                    case "contain":
+                        return !value.contains(threshold);
+                    case "no_contain":
+                        return !value.contains(threshold);
+                    default:
+                        log.warn("关系不匹配");
+                        break;
+                }
+            } else {
+                if (value.contains("[") && threshold.contains("[")) {
+                    List<String> values = strToList(value);
+                    if ("contain".equals(condition)) {
+                        for (String v : values) {
+                            if (!threshold.contains(v)) {
+                                return true;
+                            }
+                        }
+                    } else {
+                        for (String v : values) {
+                            if (threshold.contains(v)) {
+                                return true;
+                            }
+                        }
+                    }
+                } else {
+                    List<String> thresholdArr = strToList(threshold);
+                    if ("contain".equals(condition)) {
+                        for (String t : thresholdArr) {
+                            if (t.contains(value)) {
+                                return true;
+                            }
+                        }
+                    } else {
+                        return !threshold.contains(value);
+                    }
+                }
+
+            }
+        } catch (Exception e) {
+            log.error("条件匹配异常,入参为:type={},condition={},threshold={},value={},", type, condition, threshold, value, e);
+        }
+        return false;
+    }
+
+    /**
+     * 整理发送的消息
+     */
+    public static String getMsg(RuleGroup ruleGroup, JSONObject user, JSONObject obj, boolean isPause, String accountName) {
+        Long creativeId = obj.getLong("creativeId");
+        Long planId = obj.getLong("planId");
+        Long accountId = obj.getLong("accountId");
+        boolean isNull = obj.getBoolean("isNull");
+        StringBuffer header = new StringBuffer();
+        header.append(ruleGroup.getGroupName()).append("预警").append("<br/>").
+                append("预警账户:").append(accountId).append(",授权名称为:").append(accountName).append("<br/>");
+        if (!Check.isNull(planId) && !Check.isNull(creativeId)) {
+            header.append("预警计划:").append(planId).append("<br/>").append("预警创意:").append(creativeId).append("<br/>");
+        } else if (!Check.isNull(planId) && Check.isNull(creativeId)) {
+            header.append("预警计划:").append(planId).append("<br/>");
+        } else if (!Check.isNull(creativeId)) {
+            header.append("预警创意:").append(creativeId).append("<br/>");
+        }
+        if (isNull) {
+            header.append("该规则未匹配到投放数据").append("<br/>");
+        }
+        if (isPause) {
+            header.append("现已被关停,请您及时查看并调整!");
+        } else {
+            header.append("请您及时查看并调整!");
+        }
+        return header.toString();
+    }
+
+    /**
+     * 整理发送的消息
+     */
+    public static String getMessage(String ruleGroupName, Long accountId, String accountName, String type, String codes, boolean isNull) {
+        StringBuffer buf = new StringBuffer();
+        buf.append(ruleGroupName).append("预警").append("<br/>").
+                append("所属账户:").append(accountId).append(",授权名称为:").append(accountName).append("<br/>");
+        if ("plan".equals(type)) {
+            buf.append("预警的计划:").append(codes).append("<br/>");
+        } else if ("creative".equals(type)) {
+            buf.append("预警的创意:").append(codes).append("<br/>");
+        }
+        if (isNull) {
+            buf.append("该规则未匹配到投放数据").append("<br/>");
+        }
+        return buf.toString();
+    }
+
+    //拆分逗号拼接数据
+    public static List<String> strToList(String strings) {
+        List<String> ids = null;
+        try {
+            if (Check.isNull(strings)) {
+                return null;
+            }
+            JSONObject job = new JSONObject();
+            job.put("list", strings);
+            ids = new ArrayList<>();
+            JSONArray idList = job.getJSONArray("list");
+            for (Object id : idList) {
+                ids.add(String.valueOf(id));
+            }
+        } catch (Exception e) {
+            log.error("数据({})转list异常", strings, e);
+        }
+        return ids;
+    }
+
+    public static JSONArray getSendData(JSONArray accountDatas, JSONArray planDatas, JSONArray creativeDatas, JSONArray targetDatas) {
+        JSONArray sendData = new JSONArray();
+        if (!Check.isNull(accountDatas) && Check.isNull(planDatas) && Check.isNull(creativeDatas) && Check.isNull(targetDatas)) {
+            sendData = accountDatas;
+        } else {
+            if (!Check.isNull(planDatas) && Check.isNull(creativeDatas) && Check.isNull(targetDatas)) {
+                sendData = planDatas;
+            } else if (!Check.isNull(creativeDatas) && Check.isNull(planDatas) && Check.isNull(targetDatas)) {
+                sendData = creativeDatas;
+            } else if (!Check.isNull(targetDatas) && Check.isNull(planDatas) && Check.isNull(creativeDatas)) {
+                sendData = targetDatas;
+            } else if (!Check.isNull(planDatas) && !Check.isNull(creativeDatas) && !Check.isNull(targetDatas)) {
+                for (int i = 0; i < planDatas.size(); i++) {
+                    Long pplanId = planDatas.getJSONObject(i).getLong("planId");
+                    for (int k = 0; k < targetDatas.size(); k++) {
+                        Long tplanId = targetDatas.getJSONObject(k).getLong("planId");
+                        for (int j = 0; j < creativeDatas.size(); j++) {
+                            Long cplanId = creativeDatas.getJSONObject(j).getLong("planId");
+                            if (cplanId == tplanId && cplanId == pplanId) {
+                                sendData.add(creativeDatas.getJSONObject(j));
+                            }
+                        }
+                    }
+                }
+            } else if (!Check.isNull(planDatas) && !Check.isNull(targetDatas) && Check.isNull(creativeDatas)) {
+                for (int i = 0; i < planDatas.size(); i++) {
+                    Long pplanId = planDatas.getJSONObject(i).getLong("planId");
+                    for (int k = 0; k < targetDatas.size(); k++) {
+                        Long tplanId = targetDatas.getJSONObject(k).getLong("planId");
+                        if (tplanId == pplanId) {
+                            sendData.add(targetDatas.getJSONObject(k));
+                        }
+                    }
+                }
+            } else if (!Check.isNull(planDatas) && Check.isNull(targetDatas) && !Check.isNull(creativeDatas)) {
+                for (int i = 0; i < planDatas.size(); i++) {
+                    Long pplanId = planDatas.getJSONObject(i).getLong("planId");
+                    for (int k = 0; k < creativeDatas.size(); k++) {
+                        Long cplanId = creativeDatas.getJSONObject(k).getLong("planId");
+                        if (cplanId == pplanId) {
+                            sendData.add(creativeDatas.getJSONObject(k));
+                        }
+                    }
+                }
+            } else if (Check.isNull(planDatas) && !Check.isNull(targetDatas) && !Check.isNull(creativeDatas)) {
+                for (int i = 0; i < targetDatas.size(); i++) {
+                    Long tplanId = targetDatas.getJSONObject(i).getLong("planId");
+                    for (int k = 0; k < creativeDatas.size(); k++) {
+                        Long cplanId = creativeDatas.getJSONObject(k).getLong("planId");
+                        if (cplanId == tplanId) {
+                            sendData.add(creativeDatas.getJSONObject(k));
+                        }
+                    }
+                }
+            }
+        }
+        return sendData;
+
+
+    }
+
+
+}

+ 386 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountTemplateController.java

@@ -0,0 +1,386 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import cn.com.ctop.alarm.modules.entity.vo.TemplateAppliedVo;
+import cn.com.ctop.alarm.modules.service.IRuleAccountTemplateService;
+import cn.com.ctop.alarm.modules.service.IRuleAccountThresholdService;
+import cn.com.ctop.alarm.modules.service.IRuleTemplateService;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.service.ISysRoleExtService;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+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.*;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Api(tags = "规则模板")
+@RestController
+@RequestMapping("/ruleAccountTemplate")
+public class RuleAccountTemplateController {
+    @Autowired
+    private IRuleAccountTemplateService ruleAccountTemplateService;
+    @Autowired
+    private IRuleTemplateService templateService;
+    @Autowired
+    private IRuleAccountThresholdService accountThresholdService;
+
+    @Autowired
+    private ISysRoleExtService sysRoleService;
+
+    /**
+     * 查询账户下关联的模板
+     *
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    @GetMapping(value = "/getTemplateApplied")
+    public Result<PageInfo<TemplateAppliedVo>> getTemplateApplied(int pageNo, int pageSize, Long accountId, String projectName, String userName) {
+        Result<PageInfo<TemplateAppliedVo>> result = new Result<>();
+        try {
+            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            String roleCode = sysRoleService.getRoleCodeByUserId(sysUser.getId());
+            Map<String, Object> requestMap = new JSONObject();
+            if (!"admin".equals(roleCode)) {
+                requestMap.put("userId", sysUser.getId());
+            }
+            if (!Check.isNull(accountId)) {
+                requestMap.put("accountId", accountId);
+            }
+
+            if (!Check.isNull(projectName)) {
+                requestMap.put("projectName", projectName);
+            }
+            if (!Check.isNull(userName)) {
+                requestMap.put("userName", userName);
+            }
+            PageHelper.startPage(pageNo, pageSize);
+            List<TemplateAppliedVo> list = ruleAccountTemplateService.getTemplateApplied(requestMap);
+
+            PageInfo<TemplateAppliedVo> pageInfo = new PageInfo<>(list);
+            result.setSuccess(true);
+            result.setResult(pageInfo);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+    }
+
+
+    @GetMapping(value = "/checkAccountTemplate")
+    public Result<JSONObject> checkAccountTemplate(Long accountId) {
+        Result<JSONObject> result = new Result<>();
+        JSONObject returnJson = new JSONObject();
+        QueryWrapper<RuleAccountTemplate> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        RuleAccountTemplate ruleAccountTemplate = ruleAccountTemplateService.getOne(queryWrapper);
+        if (!Check.isNull(ruleAccountTemplate)) {
+            RuleTemplate ruleTemplate = templateService.getById(ruleAccountTemplate.getTemplateId());
+            returnJson.put("isApplication", true);
+            if (!Check.isNull(ruleTemplate)) {
+                returnJson.put("templateName", ruleTemplate.getTemplateName());
+            }
+        } else {
+            returnJson.put("isApplication", false);
+        }
+
+        result.setSuccess(true);
+        result.setResult(returnJson);
+        return result;
+    }
+
+
+    /**
+     * 推送 模板应用到某个账户
+     *
+     * @param ruleAccountTemplate
+     * @return
+     */
+    @PostMapping(value = "/pushTemplateToAccount")
+    public Result pushTemplateToAccount(@RequestBody RuleAccountTemplate ruleAccountTemplate) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(ruleAccountTemplate.getAccountId())) {
+                throw new Exception("请选择需要推送的账户");
+            }
+
+            if (Check.isNull(ruleAccountTemplate.getTemplateId())) {
+                throw new Exception("请选择需要推送的模板");
+            }
+
+            JSONObject returnJson = ruleAccountTemplateService.pushTemplateToAccount(ruleAccountTemplate.getAccountId(), ruleAccountTemplate.getTemplateId());
+            result.setSuccess(true);
+            result.setResult(returnJson);
+        } catch (Exception e) {
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        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 {
+            RuleAccountTemplate accountTemplate = ruleAccountTemplateService.getById(id);
+            if (!Check.isNull(accountTemplate)) {
+                Map<String, Object> deleteMap = new HashMap<>();
+                deleteMap.put("account_id", accountTemplate.getAccountId());
+                accountThresholdService.removeByMap(deleteMap);
+                ruleAccountTemplateService.removeById(id);
+            }
+        } catch (Exception e) {
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleAccountTemplate
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则模板-分页列表查询")
+    @ApiOperation(value = "规则模板-分页列表查询", notes = "规则模板-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RuleAccountTemplate>> queryPageList(RuleAccountTemplate ruleAccountTemplate,
+                                                            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                            HttpServletRequest req) {
+        Result<IPage<RuleAccountTemplate>> result = new Result<>();
+        QueryWrapper<RuleAccountTemplate> queryWrapper = QueryGenerator.initQueryWrapper(ruleAccountTemplate, req.getParameterMap());
+        Page<RuleAccountTemplate> page = new Page<RuleAccountTemplate>(pageNo, pageSize);
+        IPage<RuleAccountTemplate> pageList = ruleAccountTemplateService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+
+    @GetMapping(value = "/getRelationAccountById")
+    public Result<JSONObject> getRelationAccountById(Long id) {
+        Result<JSONObject> result = new Result<>();
+        JSONObject returnJson = new JSONObject();
+        QueryWrapper<RuleAccountTemplate> accountTemplateQueryWrapper = new QueryWrapper<>();
+        accountTemplateQueryWrapper.eq("template_id", id);
+        List<RuleAccountTemplate> list = ruleAccountTemplateService.list(accountTemplateQueryWrapper);
+        returnJson.put("relationCount", list.size());
+        result.setSuccess(true);
+        result.setResult(returnJson);
+        return result;
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param ruleAccountTemplate
+     * @return
+     */
+    @AutoLog(value = "规则模板-添加")
+    @ApiOperation(value = "规则模板-添加", notes = "规则模板-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleAccountTemplate> add(@RequestBody RuleAccountTemplate ruleAccountTemplate) {
+        Result<RuleAccountTemplate> result = new Result<>();
+        try {
+            ruleAccountTemplateService.save(ruleAccountTemplate);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleAccountTemplate
+     * @return
+     */
+    @AutoLog(value = "规则模板-编辑")
+    @ApiOperation(value = "规则模板-编辑", notes = "规则模板-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleAccountTemplate> edit(@RequestBody RuleAccountTemplate ruleAccountTemplate) {
+        Result<RuleAccountTemplate> result = new Result<RuleAccountTemplate>();
+        RuleAccountTemplate ruleAccountTemplateEntity = ruleAccountTemplateService.getById(ruleAccountTemplate.getId());
+        if (ruleAccountTemplateEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleAccountTemplateService.updateById(ruleAccountTemplate);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "规则模板-批量删除")
+    @ApiOperation(value = "规则模板-批量删除", notes = "规则模板-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<RuleAccountTemplate> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleAccountTemplate> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleAccountTemplateService.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<RuleAccountTemplate> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleAccountTemplate> result = new Result<>();
+        RuleAccountTemplate ruleAccountTemplate = ruleAccountTemplateService.getById(id);
+        if (ruleAccountTemplate == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleAccountTemplate);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleAccountTemplate> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleAccountTemplate ruleAccountTemplate = JSON.parseObject(deString, RuleAccountTemplate.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleAccountTemplate, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleAccountTemplate> pageList = ruleAccountTemplateService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则模板列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleAccountTemplate.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<RuleAccountTemplate> listRuleAccountTemplates = ExcelImportUtil.importExcel(file.getInputStream(), RuleAccountTemplate.class, params);
+                ruleAccountTemplateService.saveBatch(listRuleAccountTemplates);
+                return Result.ok("文件导入成功!数据行数:" + listRuleAccountTemplates.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("文件导入失败!");
+    }
+
+}

+ 270 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountThresholdController.java

@@ -0,0 +1,270 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountThreshold;
+import cn.com.ctop.alarm.modules.service.IRuleAccountThresholdService;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+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.*;
+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-15
+ */
+@Slf4j
+@Api(tags = "规则关联账户 阈值")
+@RestController
+@RequestMapping("/ruleAccountThreshold")
+public class RuleAccountThresholdController {
+    @Autowired
+    private IRuleAccountThresholdService ruleAccountThresholdService;
+
+
+    @PostMapping(value = "/fillThreshold")
+    public Result<JSONObject> fillThreshold(@RequestBody JSONObject requestJson) {
+        Result<JSONObject> result = new Result<>();
+        try {
+            if (Check.isNull(requestJson)) {
+                throw new Exception("入参为空");
+            }
+            JSONObject returnJson = ruleAccountThresholdService.fillThreshold(requestJson);
+            result.setSuccess(true);
+            result.setResult(returnJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+    }
+
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleAccountThreshold
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则关联账户 阈值-分页列表查询")
+    @ApiOperation(value = "规则关联账户 阈值-分页列表查询", notes = "规则关联账户 阈值-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RuleAccountThreshold>> queryPageList(RuleAccountThreshold ruleAccountThreshold,
+                                                             @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                             HttpServletRequest req) {
+        Result<IPage<RuleAccountThreshold>> result = new Result<>();
+        QueryWrapper<RuleAccountThreshold> queryWrapper = QueryGenerator.initQueryWrapper(ruleAccountThreshold, req.getParameterMap());
+        Page<RuleAccountThreshold> page = new Page<RuleAccountThreshold>(pageNo, pageSize);
+        IPage<RuleAccountThreshold> pageList = ruleAccountThresholdService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ruleAccountThreshold
+     * @return
+     */
+    @AutoLog(value = "规则关联账户 阈值-添加")
+    @ApiOperation(value = "规则关联账户 阈值-添加", notes = "规则关联账户 阈值-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleAccountThreshold> add(@RequestBody RuleAccountThreshold ruleAccountThreshold) {
+        Result<RuleAccountThreshold> result = new Result<>();
+        try {
+            ruleAccountThresholdService.save(ruleAccountThreshold);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleAccountThreshold
+     * @return
+     */
+    @AutoLog(value = "规则关联账户 阈值-编辑")
+    @ApiOperation(value = "规则关联账户 阈值-编辑", notes = "规则关联账户 阈值-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleAccountThreshold> edit(@RequestBody RuleAccountThreshold ruleAccountThreshold) {
+        Result<RuleAccountThreshold> result = new Result<RuleAccountThreshold>();
+        RuleAccountThreshold ruleAccountThresholdEntity = ruleAccountThresholdService.getById(ruleAccountThreshold.getId());
+        if (ruleAccountThresholdEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleAccountThresholdService.updateById(ruleAccountThreshold);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        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 {
+            ruleAccountThresholdService.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<RuleAccountThreshold> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleAccountThreshold> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleAccountThresholdService.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<RuleAccountThreshold> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleAccountThreshold> result = new Result<>();
+        RuleAccountThreshold ruleAccountThreshold = ruleAccountThresholdService.getById(id);
+        if (ruleAccountThreshold == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleAccountThreshold);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleAccountThreshold> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleAccountThreshold ruleAccountThreshold = JSON.parseObject(deString, RuleAccountThreshold.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleAccountThreshold, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleAccountThreshold> pageList = ruleAccountThresholdService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则关联账户 阈值列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleAccountThreshold.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<RuleAccountThreshold> listRuleAccountThresholds = ExcelImportUtil.importExcel(file.getInputStream(), RuleAccountThreshold.class, params);
+                ruleAccountThresholdService.saveBatch(listRuleAccountThresholds);
+                return Result.ok("文件导入成功!数据行数:" + listRuleAccountThresholds.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("文件导入失败!");
+    }
+
+}

+ 257 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleBaseController.java

@@ -0,0 +1,257 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleBase;
+import cn.com.ctop.alarm.modules.service.IRuleAccountThresholdService;
+import cn.com.ctop.alarm.modules.service.IRuleBaseService;
+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.*;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 基础规则
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Api(tags = "基础规则")
+@RestController
+@RequestMapping("/ruleBase")
+public class RuleBaseController {
+    @Autowired
+    private IRuleBaseService ruleBaseService;
+    @Autowired
+    private IRuleAccountThresholdService ruleAccountThresholdService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleBase
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "基础规则-分页列表查询")
+    @ApiOperation(value = "基础规则-分页列表查询", notes = "基础规则-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RuleBase>> queryPageList(RuleBase ruleBase,
+                                                 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                 HttpServletRequest req) {
+        Result<IPage<RuleBase>> result = new Result<>();
+        QueryWrapper<RuleBase> queryWrapper = QueryGenerator.initQueryWrapper(ruleBase, req.getParameterMap());
+        Page<RuleBase> page = new Page<RuleBase>(pageNo, pageSize);
+        IPage<RuleBase> pageList = ruleBaseService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ruleBase
+     * @return
+     */
+    @AutoLog(value = "基础规则-添加")
+    @ApiOperation(value = "基础规则-添加", notes = "基础规则-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleBase> add(@RequestBody RuleBase ruleBase) {
+        Result<RuleBase> result = new Result<>();
+        try {
+            ruleBaseService.save(ruleBase);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleBase
+     * @return
+     */
+    @AutoLog(value = "基础规则-编辑")
+    @ApiOperation(value = "基础规则-编辑", notes = "基础规则-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleBase> edit(@RequestBody RuleBase ruleBase) {
+        Result<RuleBase> result = new Result<RuleBase>();
+        RuleBase ruleBaseEntity = ruleBaseService.getById(ruleBase.getId());
+        if (ruleBaseEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleBaseService.updateById(ruleBase);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        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 {
+            ruleBaseService.removeById(id);
+            Map<String, Object> deleteMap = new HashMap<>();
+            deleteMap.put("rule_id", id);
+            ruleAccountThresholdService.removeByMap(deleteMap);
+
+
+        } 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<RuleBase> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleBase> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleBaseService.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<RuleBase> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleBase> result = new Result<>();
+        RuleBase ruleBase = ruleBaseService.getById(id);
+        if (ruleBase == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleBase);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleBase> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleBase ruleBase = JSON.parseObject(deString, RuleBase.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleBase, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleBase> pageList = ruleBaseService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "基础规则列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleBase.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<RuleBase> listRuleBases = ExcelImportUtil.importExcel(file.getInputStream(), RuleBase.class, params);
+                ruleBaseService.saveBatch(listRuleBases);
+                return Result.ok("文件导入成功!数据行数:" + listRuleBases.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("文件导入失败!");
+    }
+
+}

+ 248 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleConditionController.java

@@ -0,0 +1,248 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleCondition;
+import cn.com.ctop.alarm.modules.service.IRuleConditionService;
+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.*;
+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-16
+ */
+@Slf4j
+@Api(tags = "规则运算符配置表")
+@RestController
+@RequestMapping("/rule/ruleCondition")
+public class RuleConditionController {
+    @Autowired
+    private IRuleConditionService ruleConditionService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleCondition
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则运算符配置表-分页列表查询")
+    @ApiOperation(value = "规则运算符配置表-分页列表查询", notes = "规则运算符配置表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<List<RuleCondition>> queryPageList(RuleCondition ruleCondition,
+                                                      @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                      HttpServletRequest req) {
+        Result<List<RuleCondition>> result = new Result<>();
+        QueryWrapper<RuleCondition> queryWrapper = QueryGenerator.initQueryWrapper(ruleCondition, req.getParameterMap());
+
+        List<RuleCondition> list = ruleConditionService.list(queryWrapper);
+        result.setSuccess(true);
+        result.setResult(list);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ruleCondition
+     * @return
+     */
+    @AutoLog(value = "规则运算符配置表-添加")
+    @ApiOperation(value = "规则运算符配置表-添加", notes = "规则运算符配置表-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleCondition> add(@RequestBody RuleCondition ruleCondition) {
+        Result<RuleCondition> result = new Result<>();
+        try {
+            ruleConditionService.save(ruleCondition);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleCondition
+     * @return
+     */
+    @AutoLog(value = "规则运算符配置表-编辑")
+    @ApiOperation(value = "规则运算符配置表-编辑", notes = "规则运算符配置表-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleCondition> edit(@RequestBody RuleCondition ruleCondition) {
+        Result<RuleCondition> result = new Result<RuleCondition>();
+        RuleCondition ruleConditionEntity = ruleConditionService.getById(ruleCondition.getId());
+        if (ruleConditionEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleConditionService.updateById(ruleCondition);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        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 {
+            ruleConditionService.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<RuleCondition> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleCondition> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleConditionService.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<RuleCondition> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleCondition> result = new Result<>();
+        RuleCondition ruleCondition = ruleConditionService.getById(id);
+        if (ruleCondition == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleCondition);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleCondition> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleCondition ruleCondition = JSON.parseObject(deString, RuleCondition.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleCondition, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleCondition> pageList = ruleConditionService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则运算符配置表列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleCondition.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<RuleCondition> listRuleConditions = ExcelImportUtil.importExcel(file.getInputStream(), RuleCondition.class, params);
+                ruleConditionService.saveBatch(listRuleConditions);
+                return Result.ok("文件导入成功!数据行数:" + listRuleConditions.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("文件导入失败!");
+    }
+
+}

+ 346 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java

@@ -0,0 +1,346 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import cn.com.ctop.alarm.modules.service.IRuleAccountThresholdService;
+import cn.com.ctop.alarm.modules.service.IRuleBaseService;
+import cn.com.ctop.alarm.modules.service.IRuleGroupService;
+import cn.com.ctop.alarm.modules.service.IRuleTemplateService;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.PutMapping;
+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.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则组
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Api(tags = "规则组")
+@RestController
+@RequestMapping("/ruleGroup")
+public class RuleGroupController {
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+    @Autowired
+    private IRuleBaseService ruleBaseService;
+    @Autowired
+    private IRuleAccountThresholdService ruleAccountThresholdService;
+    @Autowired
+    private IRuleTemplateService ruleTemplateService;
+
+
+    /**
+     * 创建规则组
+     *
+     * @param requestJson
+     * @return
+     */
+
+    @PostMapping(value = "/createRuleGroup")
+    public Result createRuleGroup(@RequestBody JSONObject requestJson) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(requestJson)) {
+                throw new Exception("请输出需要创建的参数");
+            }
+            JSONObject returnJson = ruleGroupService.createRuleGroup(requestJson);
+            if (returnJson.getInteger("code") == 0) {
+                result.setSuccess(true);
+                result.setMessage(returnJson.getString("message"));
+            } else {
+                result.setSuccess(false);
+                result.setMessage(returnJson.getString("message"));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        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 {
+            RuleGroup ruleGroup = ruleGroupService.getById(id);
+            if (!Check.isNull(ruleGroup)) {
+                JSONArray ruleIds = JSONArray.parseArray(ruleGroup.getRuleIds());
+                for (int i = 0; i < ruleIds.size(); i++) {
+                    Long ruleId = ruleIds.getLong(i);
+                    ruleBaseService.removeById(ruleId);
+                    Map<String, Object> deleteMap = new HashMap<>();
+                    deleteMap.put("rule_id", ruleId);
+                    ruleAccountThresholdService.removeByMap(deleteMap);
+                }
+                Long templateId = ruleGroup.getTemplateId();
+                RuleTemplate ruleTemplate = ruleTemplateService.getById(templateId);
+                if (!Check.isNull(ruleTemplate)) {
+                    JSONArray newGroupIds = new JSONArray();
+                    JSONArray groupIds = JSONArray.parseArray(ruleTemplate.getGroupIds());
+                    Iterator<Object> o = groupIds.iterator();
+                    while (o.hasNext()) {
+                        String groupId = String.valueOf(o.next());
+                        if (groupId.equals(id)) {
+                            continue;
+                        }
+                        newGroupIds.add(Long.valueOf(groupId));
+                    }
+                    ruleTemplate.setGroupIds(newGroupIds.toJSONString());
+                    ruleTemplateService.updateById(ruleTemplate);
+                }
+                ruleGroupService.removeById(id);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("删除失败", e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleGroup
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则组-分页列表查询")
+    @ApiOperation(value = "规则组-分页列表查询", notes = "规则组-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RuleGroup>> queryPageList(RuleGroup ruleGroup,
+                                                  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                  HttpServletRequest req) {
+        Result<IPage<RuleGroup>> result = new Result<>();
+        QueryWrapper<RuleGroup> queryWrapper = QueryGenerator.initQueryWrapper(ruleGroup, req.getParameterMap());
+        Page<RuleGroup> page = new Page<RuleGroup>(pageNo, pageSize);
+        IPage<RuleGroup> pageList = ruleGroupService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ruleGroup
+     * @return
+     */
+    @AutoLog(value = "规则组-添加")
+    @ApiOperation(value = "规则组-添加", notes = "规则组-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleGroup> add(@RequestBody RuleGroup ruleGroup) {
+        Result<RuleGroup> result = new Result<>();
+        try {
+            ruleGroupService.save(ruleGroup);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    @GetMapping(value = "/checkRules")
+    public Result<RuleGroup> checkRules() {
+        Result<RuleGroup> result = new Result<>();
+        try {
+            ruleGroupService.checkRules();
+            result.success("成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleGroup
+     * @return
+     */
+    @AutoLog(value = "规则组-编辑")
+    @ApiOperation(value = "规则组-编辑", notes = "规则组-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleGroup> edit(@RequestBody RuleGroup ruleGroup) {
+        Result<RuleGroup> result = new Result<RuleGroup>();
+        RuleGroup ruleGroupEntity = ruleGroupService.getById(ruleGroup.getId());
+        if (ruleGroupEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleGroupService.updateById(ruleGroup);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "规则组-批量删除")
+    @ApiOperation(value = "规则组-批量删除", notes = "规则组-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<RuleGroup> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleGroup> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleGroupService.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<RuleGroup> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleGroup> result = new Result<>();
+        RuleGroup ruleGroup = ruleGroupService.getById(id);
+        if (ruleGroup == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleGroup);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleGroup> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleGroup ruleGroup = JSON.parseObject(deString, RuleGroup.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleGroup, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleGroup> pageList = ruleGroupService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则组列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleGroup.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<RuleGroup> listRuleGroups = ExcelImportUtil.importExcel(file.getInputStream(), RuleGroup.class, params);
+                ruleGroupService.saveBatch(listRuleGroups);
+                return Result.ok("文件导入成功!数据行数:" + listRuleGroups.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("文件导入失败!");
+    }
+
+}

+ 257 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleIndicatorController.java

@@ -0,0 +1,257 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleIndicator;
+import cn.com.ctop.alarm.modules.service.IRuleIndicatorService;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.*;
+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-14
+ */
+@Slf4j
+@Api(tags = "规则指标信息")
+@RestController
+@RequestMapping("/ruleIndicator")
+public class RuleIndicatorController {
+    @Autowired
+    private IRuleIndicatorService ruleIndicatorService;
+
+
+    @AutoLog(value = "规则指标信息-分页列表查询")
+    @ApiOperation(value = "规则指标信息-分页列表查询", notes = "规则指标信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<JSONArray> queryPageList(RuleIndicator ruleIndicator) {
+        Result<JSONArray> result = new Result<>();
+        Integer mediaType = ruleIndicator.getMediaType();
+        QueryWrapper<RuleIndicator> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("media_type", mediaType);
+        queryWrapper.groupBy("dimension");
+        List<RuleIndicator> list = ruleIndicatorService.list(queryWrapper);
+        JSONArray dataArr = new JSONArray();
+        for (RuleIndicator indicator : list) {
+            String dimension = indicator.getDimension();
+            JSONObject dimensionJson = new JSONObject();
+            QueryWrapper<RuleIndicator> queryWrapperData = new QueryWrapper();
+            queryWrapperData.eq("media_type", mediaType);
+            queryWrapperData.eq("dimension", dimension);
+            List<RuleIndicator> dataList = ruleIndicatorService.list(queryWrapperData);
+            if (!Check.isNull(dataList)) {
+                dimensionJson.put("dimension", dimension);
+                // 获取指标名称
+                String dimensionName = ruleIndicatorService.getRuleIndicatorNameByMediaTypeAndDimension(mediaType, dimension);
+                dimensionJson.put("dimensionName", dimensionName);
+                dimensionJson.put("dimensionList", dataList);
+                dataArr.add(dimensionJson);
+            }
+        }
+        result.setSuccess(true);
+        result.setResult(dataArr);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ruleIndicator
+     * @return
+     */
+    @AutoLog(value = "规则指标信息-添加")
+    @ApiOperation(value = "规则指标信息-添加", notes = "规则指标信息-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleIndicator> add(@RequestBody RuleIndicator ruleIndicator) {
+        Result<RuleIndicator> result = new Result<>();
+        try {
+            ruleIndicatorService.save(ruleIndicator);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleIndicator
+     * @return
+     */
+    @AutoLog(value = "规则指标信息-编辑")
+    @ApiOperation(value = "规则指标信息-编辑", notes = "规则指标信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleIndicator> edit(@RequestBody RuleIndicator ruleIndicator) {
+        Result<RuleIndicator> result = new Result<RuleIndicator>();
+        RuleIndicator ruleIndicatorEntity = ruleIndicatorService.getById(ruleIndicator.getId());
+        if (ruleIndicatorEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleIndicatorService.updateById(ruleIndicator);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        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 {
+            ruleIndicatorService.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<RuleIndicator> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleIndicator> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleIndicatorService.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<RuleIndicator> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleIndicator> result = new Result<>();
+        RuleIndicator ruleIndicator = ruleIndicatorService.getById(id);
+        if (ruleIndicator == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleIndicator);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleIndicator> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleIndicator ruleIndicator = JSON.parseObject(deString, RuleIndicator.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleIndicator, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleIndicator> pageList = ruleIndicatorService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则指标信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleIndicator.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<RuleIndicator> listRuleIndicators = ExcelImportUtil.importExcel(file.getInputStream(), RuleIndicator.class, params);
+                ruleIndicatorService.saveBatch(listRuleIndicators);
+                return Result.ok("文件导入成功!数据行数:" + listRuleIndicators.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("文件导入失败!");
+    }
+
+}

+ 79 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleSwitchController.java

@@ -0,0 +1,79 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.IUserAllocationService;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/rule/switch/")
+public class RuleSwitchController {
+
+    @Autowired
+    IUserAllocationService userAllocationService;
+
+    /**
+     *  账户添加内广监测链接预警
+     */
+    @PostMapping(value = "/onOrOffMonitoringLink")
+    public Result<Object> onOrOffMonitoringLink(@RequestParam Long accountId, @RequestParam String switchType){
+        Result<Object> result=new Result<>();
+        UserAllocation userAllocation=new UserAllocation();
+        userAllocation.setAccountId(accountId);
+        UpdateWrapper<UserAllocation> wrapper=new UpdateWrapper<>();
+        //开启预警
+        if(switchType.equals("on")){
+            wrapper.set("landing_page",0);
+            wrapper.setEntity(userAllocation);
+            boolean update = userAllocationService.update(wrapper);
+            if(update){
+                result.success("监测链接预警开启成功");
+            }
+        }else if(switchType.equals("off")){
+            wrapper.set("landing_page",1);
+            wrapper.setEntity(userAllocation);
+            boolean update = userAllocationService.update(wrapper);
+            if(update){
+                result.success("监测链接预警关闭成功");
+            }
+        }else {
+            result.error500("未知操作");
+        }
+        return result;
+    }
+
+    /**
+     *  账户添加落地页链接预警
+     */
+    @PostMapping(value = "/onOrOffLandingPage")
+    public Result<Object> onOrOffLandingPage(@RequestParam Long accountId, @RequestParam String switchType){
+        Result<Object> result=new Result<>();
+        UserAllocation userAllocation=new UserAllocation();
+        userAllocation.setAccountId(accountId);
+        UpdateWrapper<UserAllocation> wrapper=new UpdateWrapper<>();
+        //开启预警
+        if(switchType.equals("on")){
+            wrapper.set("landing_page",0);
+            wrapper.setEntity(userAllocation);
+            boolean update = userAllocationService.update(wrapper);
+            if(update){
+                result.success("落地页链接预警开启成功");
+            }
+        }else if(switchType.equals("off")){
+            wrapper.set("landing_page",1);
+            wrapper.setEntity(userAllocation);
+            boolean update = userAllocationService.update(wrapper);
+            if(update){
+                result.success("落地页链接预警关闭成功");
+            }
+        }else {
+            result.error500("未知操作");
+        }
+        return result;
+    }
+}

+ 404 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java

@@ -0,0 +1,404 @@
+package cn.com.ctop.alarm.modules.controller;
+
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import cn.com.ctop.alarm.modules.service.*;
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.*;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Api(tags = "规则模板")
+@RestController
+@RequestMapping("/ruleTemplate")
+public class RuleTemplateController {
+    @Autowired
+    private IRuleTemplateService ruleTemplateService;
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+    @Autowired
+    private IRuleBaseService ruleBaseService;
+    @Autowired
+    private IRuleAccountThresholdService ruleAccountThresholdService;
+    @Autowired
+    private IRuleAccountTemplateService accountTemplateService;
+
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "规则模板-通过id查询")
+    @ApiOperation(value = "规则模板-通过id查询", notes = "规则模板-通过id查询")
+    @GetMapping(value = "/queryDetailById")
+    public Result<JSONObject> queryDetailById(@RequestParam(name = "id", required = true) String id) {
+        Result<JSONObject> result = new Result<>();
+        try {
+            JSONObject ruleTemplateJson = ruleTemplateService.queryDetailById(id);
+            result.setSuccess(true);
+            result.setResult(ruleTemplateJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+
+        return result;
+    }
+
+
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "规则模板-通过id查询")
+    @ApiOperation(value = "规则模板-通过id查询", notes = "规则模板-通过id查询")
+    @GetMapping(value = "/previewTemplate")
+    public Result<JSONObject> previewTemplate(@RequestParam(name = "id", required = true) String id) {
+        Result<JSONObject> result = new Result<>();
+        try {
+            JSONObject ruleTemplateJson = ruleTemplateService.previewTemplate(id);
+            result.setSuccess(true);
+            result.setResult(ruleTemplateJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+
+        return result;
+    }
+
+    /**
+     * 根据 模板id  账户id 查询详情
+     *
+     * @param
+     * @return
+     */
+
+    @GetMapping(value = "/queryDetailByAccountIdAndTemplateId")
+    public Result<JSONObject> queryDetailByAccountIdAndTemplateId(Long accountId, Long templateId) {
+        Result<JSONObject> result = new Result<>();
+        try {
+            JSONObject ruleTemplateJson = ruleTemplateService.queryDetailByAccountIdAndTemplateId(accountId, templateId);
+            result.setSuccess(true);
+            result.setResult(ruleTemplateJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 分页列表查询
+     *
+     * @param ruleTemplate
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @AutoLog(value = "规则模板-分页列表查询")
+    @ApiOperation(value = "规则模板-分页列表查询", notes = "规则模板-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<RuleTemplate>> queryPageList(RuleTemplate ruleTemplate,
+                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                     @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                     HttpServletRequest req) {
+        Result<IPage<RuleTemplate>> result = new Result<>();
+        String templateName = ruleTemplate.getTemplateName();
+        ruleTemplate.setTemplateName(null);
+        QueryWrapper<RuleTemplate> queryWrapper = QueryGenerator.initQueryWrapper(ruleTemplate, req.getParameterMap());
+        if (!Check.isNull(templateName)) {
+            queryWrapper.like("template_name", templateName);
+        }
+        Page<RuleTemplate> page = new Page<RuleTemplate>(pageNo, pageSize);
+        IPage<RuleTemplate> pageList = ruleTemplateService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param requestJson
+     * @return
+     */
+    @AutoLog(value = "创建规则模板")
+
+    @PostMapping(value = "/createTemplate")
+    public Result createTemplate(@RequestBody JSONObject requestJson) {
+        Result result = new Result<>();
+        try {
+            if (Check.isNull(requestJson)) {
+                throw new Exception("请传入模板入参");
+            }
+            JSONObject returnJson = ruleTemplateService.createTemplate(requestJson);
+            if (returnJson.getInteger("code") == 0) {
+                result.setSuccess(true);
+                result.setMessage(returnJson.getString("message"));
+            } else {
+                result.setSuccess(false);
+                result.setMessage(returnJson.getString("message"));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+    }
+
+
+    /**
+     * 添加
+     *
+     * @param ruleTemplate
+     * @return
+     */
+    @AutoLog(value = "规则模板-添加")
+    @ApiOperation(value = "规则模板-添加", notes = "规则模板-添加")
+    @PostMapping(value = "/add")
+    public Result<RuleTemplate> add(@RequestBody RuleTemplate ruleTemplate) {
+        Result<RuleTemplate> result = new Result<>();
+        try {
+            ruleTemplateService.save(ruleTemplate);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ruleTemplate
+     * @return
+     */
+    @AutoLog(value = "规则模板-编辑")
+    @ApiOperation(value = "规则模板-编辑", notes = "规则模板-编辑")
+    @PutMapping(value = "/edit")
+    public Result<RuleTemplate> edit(@RequestBody RuleTemplate ruleTemplate) {
+        Result<RuleTemplate> result = new Result<RuleTemplate>();
+        RuleTemplate ruleTemplateEntity = ruleTemplateService.getById(ruleTemplate.getId());
+        if (ruleTemplateEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ruleTemplateService.updateById(ruleTemplate);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        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 {
+            RuleTemplate ruleTemplate = ruleTemplateService.getById(id);
+            if (!Check.isNull(ruleTemplate)) {
+                QueryWrapper<RuleGroup> groupQueryWrapper = new QueryWrapper<>();
+                groupQueryWrapper.eq("template_id", id);
+                List<RuleGroup> groupList = ruleGroupService.list(groupQueryWrapper);
+                if (!Check.isNull(groupList)) {
+                    for (RuleGroup group : groupList) {
+                        JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
+                        if (Check.isNull(ruleIds)) {
+                            continue;
+                        }
+                        for (int i = 0; i < ruleIds.size(); i++) {
+                            Long ruleId = ruleIds.getLong(i);
+                            ruleBaseService.removeById(ruleId);
+                            Map<String, Object> deleteMap = new HashMap<>();
+                            deleteMap.put("rule_id", ruleId);
+                            ruleAccountThresholdService.removeByMap(deleteMap);
+                        }
+                        ruleGroupService.removeById(group.getId());
+                    }
+                }
+
+                Map<String, Object> deleteMap = new HashMap<>();
+                deleteMap.put("template_id", id);
+                accountTemplateService.removeByMap(deleteMap);
+                ruleTemplateService.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<RuleTemplate> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<RuleTemplate> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ruleTemplateService.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<RuleTemplate> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<RuleTemplate> result = new Result<>();
+        RuleTemplate ruleTemplate = ruleTemplateService.getById(id);
+        if (ruleTemplate == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ruleTemplate);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<RuleTemplate> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                RuleTemplate ruleTemplate = JSON.parseObject(deString, RuleTemplate.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ruleTemplate, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<RuleTemplate> pageList = ruleTemplateService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "规则模板列表");
+        mv.addObject(NormalExcelConstants.CLASS, RuleTemplate.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<RuleTemplate> listRuleTemplates = ExcelImportUtil.importExcel(file.getInputStream(), RuleTemplate.class, params);
+                ruleTemplateService.saveBatch(listRuleTemplates);
+                return Result.ok("文件导入成功!数据行数:" + listRuleTemplates.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("文件导入失败!");
+    }
+
+}

+ 58 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleAccountTemplate.java

@@ -0,0 +1,58 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Data
+@TableName("ctop_rule_account_template")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_account_template对象", description = "规则模板")
+public class RuleAccountTemplate {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 账户id
+     */
+    @Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+    private Long accountId;
+    /**
+     * 模板id
+     */
+    @Excel(name = "模板id", width = 15)
+    @ApiModelProperty(value = "模板id")
+    private Long templateId;
+
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 67 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleAccountThreshold.java

@@ -0,0 +1,67 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则关联账户 阈值
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Data
+@TableName("ctop_rule_account_threshold")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_account_threshold对象", description = "规则关联账户 阈值")
+public class RuleAccountThreshold {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 账户id
+     */
+    @Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+    private Long accountId;
+
+    private Long groupId; // 组id
+    private String batchNo; // 批次号
+
+    /**
+     * 规则id
+     */
+    @Excel(name = "规则id", width = 15)
+    @ApiModelProperty(value = "规则id")
+    private Long ruleId;
+    /**
+     * 阈值
+     */
+    @Excel(name = "阈值", width = 15)
+    @ApiModelProperty(value = "阈值")
+    private String threshold;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 83 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleBase.java

@@ -0,0 +1,83 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 基础规则
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Data
+@TableName("ctop_rule_base")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_base对象", description = "基础规则")
+public class RuleBase {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    private Long groupId;
+
+    /**
+     * 规则名称
+     */
+    @Excel(name = "规则名称", width = 15)
+    @ApiModelProperty(value = "规则名称")
+    private String ruleName;
+    /**
+     * 指标code
+     */
+    @Excel(name = "指标code", width = 15)
+    @ApiModelProperty(value = "指标code")
+    private String indicatorCode;
+    /**
+     * 判断条件 大于 等于 小于等
+     */
+    @Excel(name = "判断条件 大于 等于 小于等", width = 15)
+    @ApiModelProperty(value = "判断条件 大于 等于 小于等")
+    private String ruleCondition;
+    /**
+     * 阈值 比较值
+     */
+    @Excel(name = "阈值 比较值", width = 15)
+    @ApiModelProperty(value = "阈值 比较值")
+    private String threshold;
+    /**
+     * 规则维度 账户、计划、组、创意等维度
+     */
+    @Excel(name = "规则维度 账户、计划、组、创意等维度", width = 15)
+    @ApiModelProperty(value = "规则维度 账户、计划、组、创意等维度")
+    private String ruleDimension;
+
+    private Integer variableType;// 变量类型
+    private Integer judgeFormat;// 判断类型
+    private Integer isUnlimited;//  是否支持不限  true 是 false 否
+
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 63 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleCondition.java

@@ -0,0 +1,63 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则运算符配置表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-16
+ */
+@Data
+@TableName("ctop_rule_condition")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_condition对象", description = "规则运算符配置表")
+public class RuleCondition {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 运算名称
+     */
+    @Excel(name = "运算名称", width = 15)
+    @ApiModelProperty(value = "运算名称")
+    private String conditionName;
+    /**
+     * 运算符
+     */
+    @Excel(name = "运算符", width = 15)
+    @ApiModelProperty(value = "运算符")
+    private String ruleCondition;
+    /**
+     * 数据类型
+     */
+    @Excel(name = "数据类型", width = 15)
+    @ApiModelProperty(value = "数据类型")
+    private String dataType;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 89 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleGroup.java

@@ -0,0 +1,89 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+import java.util.List;
+
+/**
+ * 规则组
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Data
+@TableName("ctop_rule_group")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_group对象", description = "规则组")
+public class RuleGroup {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    private Long templateId;
+    /**
+     * 规则id列表
+     */
+    @Excel(name = "规则id列表", width = 15)
+    @ApiModelProperty(value = "规则id列表")
+    private String ruleIds;
+    private String groupName;
+    /**
+     * 规则类型 group为组合规则 base 为单条规则
+     */
+    @Excel(name = "规则类型 group为组合规则 base 为单条规则", width = 15)
+    @ApiModelProperty(value = "规则类型 group为组合规则 base 为单条规则")
+    private String ruleType;
+    /**
+     * 规则关系 当rule_type 为group时必填 and同时命中  or 命中一条
+     */
+    @Excel(name = "规则关系 当rule_type 为group时必填 and同时命中  or 命中一条", width = 15)
+    @ApiModelProperty(value = "规则关系 当rule_type 为group时必填 and同时命中  or 命中一条")
+    private String ruleRelationship;
+    /**
+     * 操作内容:SEND发送,PAUSE关停并发送
+     */
+    private String operate;
+    /**
+     * 预警发送方式: SMS:短信,WeChat:企业微信,EMAIL:电子邮件,TEL:电话
+     */
+    private String sendType;
+
+    /**
+     * 规则解释
+     */
+    private String remark;
+
+
+    private Integer isRequired;//  是否必填  true 是 false 否
+    private Integer isCopy;//  是否可复制  true 是 false 否
+
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private List<RuleBase> ruleBaseList;
+
+}

+ 88 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleIndicator.java

@@ -0,0 +1,88 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则指标信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-14
+ */
+@Data
+@TableName("ctop_rule_indicator")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_indicator对象", description = "规则指标信息")
+public class RuleIndicator {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 1:头条2:快手
+     */
+    @Excel(name = "1:头条2:快手", width = 15)
+    @ApiModelProperty(value = "1:头条2:快手")
+    private Integer mediaType;
+    /**
+     * 指标名称
+     */
+    @Excel(name = "指标名称", width = 15)
+    @ApiModelProperty(value = "指标名称")
+    private String name;
+    /**
+     * 指标code(数据库字段名称)
+     */
+    @Excel(name = "指标code(数据库字段名称)", width = 15)
+    @ApiModelProperty(value = "指标code(数据库字段名称)")
+    private String code;
+    /**
+     * 数据类型
+     */
+    @Excel(name = "数据类型", width = 15)
+    @ApiModelProperty(value = "数据类型")
+    private String dataType;
+    private String modelType;
+    /**
+     * 数据单位
+     */
+    @Excel(name = "数据单位", width = 15)
+    @ApiModelProperty(value = "数据单位")
+    private String dataUnit;
+    /**
+     * 数据维度
+     */
+    @Excel(name = "数据维度", width = 15)
+    @ApiModelProperty(value = "数据维度")
+    private String dimension;
+    /**
+     * 对应数据字典id
+     */
+    @Excel(name = "对应数据字典id", width = 15)
+    @ApiModelProperty(value = "对应数据字典id")
+    private String dictId;
+    /**
+     * 对应数据表名称
+     */
+    @Excel(name = "对应数据表名称", width = 15)
+    @ApiModelProperty(value = "对应数据表名称")
+    private String tableName;
+    private Integer status;
+    private Integer sort;
+    private Date createTime;
+    private Date updateTime;
+}

+ 63 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleTemplate.java

@@ -0,0 +1,63 @@
+package cn.com.ctop.alarm.modules.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Data
+@TableName("ctop_rule_template")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_rule_template对象", description = "规则模板")
+public class RuleTemplate {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+    private Long id;
+    /**
+     * 1:头条2:快手
+     */
+    @Excel(name = "1:头条2:快手", width = 15)
+    @ApiModelProperty(value = "1:头条2:快手")
+    private Integer mediaType;
+    /**
+     * 模板名称
+     */
+    @Excel(name = "模板名称", width = 15)
+    @ApiModelProperty(value = "模板名称")
+    private String templateName;
+    /**
+     * 规则组集合
+     */
+    @Excel(name = "规则组集合", width = 15)
+    @ApiModelProperty(value = "规则组集合")
+    private String groupIds;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+}

+ 100 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/vo/TemplateAppliedVo.java

@@ -0,0 +1,100 @@
+package cn.com.ctop.alarm.modules.entity.vo;
+
+public class TemplateAppliedVo {
+    private Long id;
+    private Long accountId;
+    private String authName;
+    private Long templateId;
+    private String templateName;
+    private Long projectId;
+    private String projectName;
+    private String userId;
+    private String userName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(Long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getAuthName() {
+        return authName;
+    }
+
+    public void setAuthName(String authName) {
+        this.authName = authName;
+    }
+
+    public Long getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(Long templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public void setTemplateName(String templateName) {
+        this.templateName = templateName;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Long projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateAppliedVo{" +
+                "id=" + id +
+                ", accountId=" + accountId +
+                ", authName='" + authName + '\'' +
+                ", templateId=" + templateId +
+                ", templateName='" + templateName + '\'' +
+                ", projectId=" + projectId +
+                ", projectName='" + projectName + '\'' +
+                ", userId='" + userId + '\'' +
+                ", userName='" + userName + '\'' +
+                '}';
+    }
+}

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

@@ -1,7 +1,5 @@
 package cn.com.ctop.alarm.modules.enums;
 
-import lombok.Data;
-
 public enum StatusEnum {
     STATUSM1("-1", "不限"),
     STATUS1("1", "已暂停"),

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

@@ -0,0 +1,20 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import cn.com.ctop.alarm.modules.entity.vo.TemplateAppliedVo;
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则模板
+ * @author: jeecg-boot
+ * @date:   2020-11-15
+ * @cersion: V1.0
+ */
+public interface RuleAccountTemplateMapper extends BaseMapper<RuleAccountTemplate> {
+
+    List<TemplateAppliedVo> getTemplateApplied(@Param("params") Map<String, Object> requestMap);
+}

+ 28 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleAccountThresholdMapper.java

@@ -0,0 +1,28 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountThreshold;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 规则关联账户 阈值
+ *
+ * @author: jeecg-boot
+ * @date: 2020-11-15
+ * @cersion: V1.0
+ */
+public interface RuleAccountThresholdMapper extends BaseMapper<RuleAccountThreshold> {
+
+    List<RuleAccountThreshold> selectByAccountId(Long accountId);
+
+    List<Long> selectGroupIdsByAccountId(Long accountId);
+
+    List<String> selectbatchNosByGroupIdId(Long accountId, Long groupId);
+
+    List<RuleAccountThreshold> selectCopyThresholdByAccountId(Long accountId, Long groupId, String batchNo);
+    List<String> getBatchNo(@Param("accountId") Long accountId, @Param("groupId") Long groupId);
+
+    List<RuleAccountThreshold> selectBatchNoByAccountId(Long accountId);
+}

+ 17 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleBaseMapper.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.alarm.modules.entity.RuleBase;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 基础规则
+ * @author: jeecg-boot
+ * @date:   2020-11-15
+ * @cersion: V1.0
+ */
+public interface RuleBaseMapper extends BaseMapper<RuleBase> {
+
+}

+ 15 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleConditionMapper.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import cn.com.ctop.alarm.modules.entity.RuleCondition;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则运算符配置表
+ *
+ * @author: jeecg-boot
+ * @date: 2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleConditionMapper extends BaseMapper<RuleCondition> {
+
+}

+ 17 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleGroupMapper.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则组
+ * @author: jeecg-boot
+ * @date:   2020-11-15
+ * @cersion: V1.0
+ */
+public interface RuleGroupMapper extends BaseMapper<RuleGroup> {
+
+}

+ 19 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleIndicatorMapper.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import cn.com.ctop.alarm.modules.entity.RuleIndicator;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 规则指标信息
+ *
+ * @author: jeecg-boot
+ * @date: 2020-11-14
+ * @cersion: V1.0
+ */
+public interface RuleIndicatorMapper extends BaseMapper<RuleIndicator> {
+
+    String getRuleIndicatorNameByMediaTypeAndDimension(@Param("mediaType") Integer mediaType, @Param("dimension") String dimension);
+
+    String getDataTypeByRuleDimensionAndIndicatorCode(@Param("ruleDimension") String ruleDimension,@Param("indicatorCode") String indicatorCode);
+}

+ 17 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleTemplateMapper.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.alarm.modules.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则模板
+ * @author: jeecg-boot
+ * @date:   2020-11-15
+ * @cersion: V1.0
+ */
+public interface RuleTemplateMapper extends BaseMapper<RuleTemplate> {
+
+}

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

@@ -0,0 +1,49 @@
+<?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.RuleAccountTemplateMapper">
+
+    <select id="getTemplateApplied" parameterType="Map"
+            resultType="cn.com.ctop.alarm.modules.entity.vo.TemplateAppliedVo">
+        select
+        t1.id id,
+        t1.account_id accountId,
+        t2.auth_name authName,
+        t1.template_id templateId,
+        (
+        SELECT
+        template_name
+        FROM
+        ctop_rule_template
+        WHERE
+        id = t1.template_id
+        ) as templateName,
+        t3.id projectId,
+        t3.project_name projectName,
+        t2.user_id userId,
+        t4.realname userName
+        FROM
+        ctop_rule_account_template t1
+        LEFT JOIN ctop_user_allocation t2 ON t1.account_id = t2.account_id
+        LEFT JOIN ctop_project t3 ON t2.project_id = t3.id
+        left join sys_user t4 on t2.user_id = t4.id
+        where 1 = 1
+        <if test="params.userId !=null and params.userId !='' ">
+            and t2.user_id = #{params.userId}
+        </if>
+
+        <if test="params.accountId !=null and params.accountId !='' ">
+            and t2.account_id = #{params.accountId}
+        </if>
+
+        <if test="params.accountId !=null and params.accountId !='' ">
+            and t2.account_id = #{params.accountId}
+        </if>
+        <if test="params.projectName !=null and params.projectName !='' ">
+            and t3.project_name like concat(concat('%',#{params.projectName}),'%')
+        </if>
+        <if test="params.userName !=null and params.userName !='' ">
+            and t4.realname like concat(concat('%',#{params.userName}),'%')
+        </if>
+    </select>
+
+</mapper>

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

@@ -0,0 +1,37 @@
+<?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.RuleAccountThresholdMapper">
+
+    <select id="selectByAccountId" resultType="cn.com.ctop.alarm.modules.entity.RuleAccountThreshold">
+       SELECT * FROM ctop_rule_account_threshold
+       WHERE account_id = #{accountId}
+       AND  (batch_no ='' or batch_no is null)
+    </select>
+    <select id="selectGroupIdsByAccountId" resultType="java.lang.Long">
+       SELECT group_id FROM `ctop_rule_account_threshold`
+        WHERE (batch_no !='' and batch_no is not null)
+        and  account_id = #{accountId}
+        group by group_id
+    </select>
+    <select id="selectbatchNosByGroupIdId" resultType="java.lang.String">
+       SELECT batch_no FROM `ctop_rule_account_threshold`
+        WHERE  (batch_no !='' and batch_no is not null)
+        and account_id = #{accountId}
+        and group_id = #{groupId}
+        GROUP BY batch_no
+    </select>
+    <select id="selectCopyThresholdByAccountId" resultType="cn.com.ctop.alarm.modules.entity.RuleAccountThreshold">
+       SELECT * FROM ctop_rule_account_threshold
+        WHERE account_id = #{accountId}
+        and group_id = #{groupId}
+        and batch_no = #{batchNo}
+    </select>
+
+    <select id="getBatchNo" resultType="java.lang.String">
+    select batch_no from ctop_rule_account_threshold
+    where  account_id = #{accountId}
+    and group_id = #{groupId}
+    and (batch_no !='' and batch_no is not null)
+    group by batch_no
+    </select>
+</mapper>

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

@@ -0,0 +1,5 @@
+<?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.RuleBaseMapper">
+
+</mapper>

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

@@ -0,0 +1,5 @@
+<?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.RuleConditionMapper">
+
+</mapper>

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

@@ -0,0 +1,5 @@
+<?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.RuleGroupMapper">
+
+</mapper>

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

@@ -0,0 +1,22 @@
+<?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.RuleIndicatorMapper">
+
+    <select id="getRuleIndicatorNameByMediaTypeAndDimension" resultType="java.lang.String">
+      select  dimension_name
+      from ctop_rule_media_dimension
+      where  media_type = #{mediaType}
+      and dimension = #{dimension}
+      limit 1
+    </select>
+
+    <select id="getDataTypeByRuleDimensionAndIndicatorCode" resultType="java.lang.String">
+      select  data_type
+      from ctop_rule_indicator
+      where  code = #{indicatorCode}
+      and dimension = #{ruleDimension}
+      limit 1
+    </select>
+
+
+</mapper>

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

@@ -0,0 +1,5 @@
+<?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.RuleTemplateMapper">
+
+</mapper>

+ 24 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountTemplateService.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+import cn.com.ctop.alarm.modules.entity.vo.TemplateAppliedVo;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 规则模板
+ * @Author: jeecg-boot
+ * @Date: 2020-11-15
+ * @Version: V1.0
+ */
+public interface IRuleAccountTemplateService extends IService<RuleAccountTemplate> {
+
+    // 推送模板到账户下
+    JSONObject pushTemplateToAccount(Long accountId, Long templateId) throws Exception;
+
+    // 查询 名下账户 应用的模板
+    List<TemplateAppliedVo> getTemplateApplied(Map<String, Object> requestMap);
+}

+ 26 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountThresholdService.java

@@ -0,0 +1,26 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountThreshold;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * @Description: 规则关联账户 阈值
+ * @Author: jeecg-boot
+ * @Date: 2020-11-15
+ * @Version: V1.0
+ */
+public interface IRuleAccountThresholdService extends IService<RuleAccountThreshold> {
+
+    /**
+     * 阈值填充
+     *
+     * @param requestJson
+     * @return
+     */
+    JSONObject fillThreshold(JSONObject requestJson) throws Exception;
+
+    List<String> getBatchNo(Long accountId, Long groupId);
+}

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

@@ -0,0 +1,14 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleBase;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 基础规则
+ * @Author: jeecg-boot
+ * @Date:   2020-11-15
+ * @Version: V1.0
+ */
+public interface IRuleBaseService extends IService<RuleBase> {
+
+}

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

@@ -0,0 +1,14 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleCondition;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则运算符配置表
+ * @Author: jeecg-boot
+ * @Date: 2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleConditionService extends IService<RuleCondition> {
+
+}

+ 18 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则组
+ * @Author: jeecg-boot
+ * @Date: 2020-11-15
+ * @Version: V1.0
+ */
+public interface IRuleGroupService extends IService<RuleGroup> {
+
+    void checkRules();
+
+    JSONObject createRuleGroup(JSONObject requestJson);
+}

+ 24 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleIndicatorService.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleIndicator;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则指标信息
+ * @Author: jeecg-boot
+ * @Date: 2020-11-14
+ * @Version: V1.0
+ */
+public interface IRuleIndicatorService extends IService<RuleIndicator> {
+
+    String getRuleIndicatorNameByMediaTypeAndDimension(Integer mediaType, String dimension);
+
+    /**
+     * 根据数据维度和指标查询 数据类型
+     *
+     * @param ruleDimension
+     * @param indicatorCode
+     * @return
+     */
+    String getDataTypeByRuleDimensionAndIndicatorCode(String ruleDimension, String indicatorCode);
+}

+ 49 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleTemplateService.java

@@ -0,0 +1,49 @@
+package cn.com.ctop.alarm.modules.service;
+
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则模板
+ * @Author: jeecg-boot
+ * @Date: 2020-11-15
+ * @Version: V1.0
+ */
+public interface IRuleTemplateService extends IService<RuleTemplate> {
+
+    /**
+     * 创建规则模板
+     *
+     * @param requestJson
+     * @return
+     */
+    JSONObject createTemplate(JSONObject requestJson);
+
+    /**
+     * 查询配置模板详情
+     *
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    JSONObject queryDetailById(String id) throws Exception;
+
+    /**
+     * 查询账户下 配置模板详情
+     *
+     * @param accountId
+     * @param templateId
+     * @return
+     * @throws Exception
+     */
+    JSONObject queryDetailByAccountIdAndTemplateId(Long accountId, Long templateId) throws Exception;
+
+    /**
+     * 预览模板
+     *
+     * @param id
+     * @return
+     */
+    JSONObject previewTemplate(String id) throws Exception;
+}

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

@@ -0,0 +1,123 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.*;
+import cn.com.ctop.alarm.modules.entity.vo.TemplateAppliedVo;
+import cn.com.ctop.alarm.modules.mapper.RuleAccountTemplateMapper;
+import cn.com.ctop.alarm.modules.service.*;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Service
+public class RuleAccountTemplateServiceImpl extends ServiceImpl<RuleAccountTemplateMapper, RuleAccountTemplate> implements IRuleAccountTemplateService {
+    @Autowired
+    private RuleAccountTemplateMapper ruleAccountTemplateMapper;
+    @Autowired
+    private IRuleTemplateService ruleTemplateService;
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+    @Autowired
+    private IRuleBaseService ruleBaseService;
+    @Autowired
+    private IRuleAccountThresholdService ruleAccountThresholdService;
+
+    /**
+     * 推送模板到账会下
+     *
+     * @param accountId
+     * @param templateId
+     * @return
+     */
+    @Override
+    public JSONObject pushTemplateToAccount(Long accountId, Long templateId) throws Exception {
+
+        RuleTemplate ruleTemplate = ruleTemplateService.getById(templateId);
+        if (Check.isNull(ruleTemplate)) {
+            throw new Exception("推送失败,未获取到模板信息");
+
+        }
+        JSONArray groupIds = JSONArray.parseArray(ruleTemplate.getGroupIds());
+        if (Check.isNull(groupIds)) {
+            throw new Exception("推送失败,模板下战暂无可用规则");
+        }
+        Map<String, Object> deleteMap = new HashMap<>();
+        deleteMap.put("account_id", accountId);
+        ruleAccountTemplateMapper.deleteByMap(deleteMap);
+        ruleAccountThresholdService.removeByMap(deleteMap);
+        RuleAccountTemplate template = new RuleAccountTemplate();
+        template.setAccountId(accountId);
+        template.setTemplateId(templateId);
+        int insert = ruleAccountTemplateMapper.insert(template);
+        if (insert == 0) {
+            throw new Exception("推送失败,请联系相关技术人员");
+        }
+        JSONObject returnJson = new JSONObject();
+        Integer groupCount = 0;
+        for (int i = 0; i < groupIds.size(); i++) {
+            Long groupId = groupIds.getLong(i);
+            RuleGroup ruleGroup = ruleGroupService.getById(groupId);
+            if (Check.isNull(ruleGroup)) {
+                continue;
+            }
+            groupCount += 1;
+            Integer isCopy = ruleGroup.getIsCopy();
+            String batchId = null;
+            if (isCopy == 1) {
+                batchId = UUID.randomUUID().toString().replace("-", "");
+
+            }
+            JSONArray ruleIds = JSONArray.parseArray(ruleGroup.getRuleIds());
+            if (Check.isNull(ruleIds)) {
+                continue;
+            }
+            for (int j = 0; j < ruleIds.size(); j++) {
+                Long ruleId = ruleIds.getLong(j);
+                RuleBase ruleBase = ruleBaseService.getById(ruleId);
+                if (Check.isNull(ruleBase)) {
+                    continue;
+                }
+                RuleAccountThreshold threshold = new RuleAccountThreshold();
+                threshold.setAccountId(accountId);
+                threshold.setGroupId(groupId);
+                threshold.setRuleId(ruleBase.getId());
+                if (isCopy == 1) {
+                    threshold.setBatchNo(batchId);
+                }
+                if (ruleBase.getVariableType() == 0) {
+                    threshold.setThreshold(ruleBase.getThreshold());
+                }
+                ruleAccountThresholdService.save(threshold);
+            }
+
+        }
+        returnJson.put("groupCount", groupCount);
+        return returnJson;
+    }
+
+
+    /**
+     * 查询 账户下 应用的模板
+     *
+     * @param requestMap
+     * @return
+     */
+    @Override
+    public List<TemplateAppliedVo> getTemplateApplied(Map<String, Object> requestMap) {
+        return ruleAccountTemplateMapper.getTemplateApplied(requestMap);
+    }
+}

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

@@ -0,0 +1,140 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.RuleAccountThreshold;
+import cn.com.ctop.alarm.modules.mapper.RuleAccountThresholdMapper;
+import cn.com.ctop.alarm.modules.service.IRuleAccountThresholdService;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 规则关联账户 阈值
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Service
+public class RuleAccountThresholdServiceImpl extends ServiceImpl<RuleAccountThresholdMapper, RuleAccountThreshold> implements IRuleAccountThresholdService {
+    @Autowired
+    private RuleAccountThresholdMapper ruleAccountThresholdMapper;
+
+    /**
+     * 填充阈值
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    public JSONObject fillThreshold(JSONObject requestJson) throws Exception {
+        Long accountId = requestJson.getLong("accountId");
+        if (Check.isNull(accountId)) {
+            throw new Exception("请传入账户id");
+        }
+        JSONArray ruleList = requestJson.getJSONArray("ruleList");
+        if (Check.isNull(ruleList)) {
+            throw new Exception("请输入具体的规则字段");
+        }
+        Integer updateCount = 0;
+        for (int i = 0; i < ruleList.size(); i++) {
+            JSONObject groupJson = ruleList.getJSONObject(i);
+            if (Check.isNull(groupJson)) {
+                continue;
+            }
+            JSONArray ruleDetail = groupJson.getJSONArray("ruleDetail");
+            if (Check.isNull(ruleDetail)) {
+                continue;
+            }
+            Long groupId = groupJson.getLong("groupId");
+            Integer isCopy = groupJson.getInteger("isCopy");
+            if (isCopy == 1) {
+                Map<String, Object> deleteMap = new HashMap<>();
+                deleteMap.put("account_id", accountId);
+                deleteMap.put("group_id", groupId);
+                ruleAccountThresholdMapper.deleteByMap(deleteMap); // 删除此账户下 此组绑定的失效阈值
+            }
+
+            for (int j = 0; j < ruleDetail.size(); j++) {
+                if (isCopy == 1) { // 规则组可复制
+                    JSONArray ruleDetailArr = ruleDetail.getJSONArray(j);
+                    if (Check.isNull(ruleDetailArr)) {
+                        continue;
+                    }
+                    String batchNo = UUID.randomUUID().toString().replace("-", "");
+                    for (int k = 0; k < ruleDetailArr.size(); k++) {
+                        JSONObject ruleJson = ruleDetailArr.getJSONObject(k);
+                        if (Check.isNull(ruleJson)) {
+                            continue;
+                        }
+                        Long ruleId = ruleJson.getLong("ruleId");
+                        if (Check.isNull(ruleId)) {
+                            continue;
+                        }
+                        String threshold = ruleJson.getString("threshold");
+                        RuleAccountThreshold addRuleAccountThreshold = new RuleAccountThreshold();
+                        addRuleAccountThreshold.setAccountId(accountId);
+                        addRuleAccountThreshold.setGroupId(groupId);
+                        addRuleAccountThreshold.setThreshold(threshold);
+                        addRuleAccountThreshold.setRuleId(ruleId);
+                        if (isCopy == 1) {
+                            addRuleAccountThreshold.setBatchNo(batchNo);
+                        }
+                        int insert = ruleAccountThresholdMapper.insert(addRuleAccountThreshold);
+                        if (insert > 0) {
+                            updateCount += 1;
+                        }
+                    }
+                } else if (isCopy == 0) {
+                    JSONObject ruleJson = ruleDetail.getJSONObject(j);
+                    Long ruleId = ruleJson.getLong("ruleId");
+                    if (Check.isNull(ruleId)) {
+                        continue;
+                    }
+                    String threshold = ruleJson.getString("threshold");
+                    if (Check.isNull(threshold)) {
+                        continue;
+                    }
+                    RuleAccountThreshold updateThreshold = new RuleAccountThreshold();
+                    updateThreshold.setThreshold(threshold);
+                    QueryWrapper<RuleAccountThreshold> updateQueryWrapper = new QueryWrapper();
+                    updateQueryWrapper.eq("account_id", accountId);
+                    updateQueryWrapper.eq("rule_id", ruleId);
+                    updateQueryWrapper.eq("group_id", groupId);
+                    int update = ruleAccountThresholdMapper.update(updateThreshold, updateQueryWrapper);
+                    if (update > 0) {
+                        updateCount += 1;
+                    }
+                }
+            }
+        }
+
+        log.info("修改账户模板阈值完成,账户id:{},修改规则条数:{}", accountId, updateCount);
+        JSONObject returnJson = new JSONObject();
+        returnJson.put("code", 0);
+        returnJson.put("updateCount", updateCount);
+        return returnJson;
+    }
+
+    /**
+     * 获取批次号列表
+     *
+     * @param accountId
+     * @param groupId
+     * @return
+     */
+    @Override
+    public List<String> getBatchNo(Long accountId, Long groupId) {
+        return ruleAccountThresholdMapper.getBatchNo(accountId, groupId);
+    }
+}

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

@@ -0,0 +1,19 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.RuleBase;
+import cn.com.ctop.alarm.modules.mapper.RuleBaseMapper;
+import cn.com.ctop.alarm.modules.service.IRuleBaseService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * 基础规则
+ * @author jeecg-boot
+ * @date   2020-11-15
+ * @version V1.0
+ */
+@Service
+public class RuleBaseServiceImpl extends ServiceImpl<RuleBaseMapper, RuleBase> implements IRuleBaseService {
+
+}

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

@@ -0,0 +1,19 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.RuleCondition;
+import cn.com.ctop.alarm.modules.mapper.RuleConditionMapper;
+import cn.com.ctop.alarm.modules.service.IRuleConditionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 规则运算符配置表
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-16
+ */
+@Service
+public class RuleConditionServiceImpl extends ServiceImpl<RuleConditionMapper, RuleCondition> implements IRuleConditionService {
+
+}

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

@@ -0,0 +1,776 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.constant.MatchLogic;
+import cn.com.ctop.alarm.modules.entity.AlarmEventSend;
+import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+import cn.com.ctop.alarm.modules.entity.RuleAccountThreshold;
+import cn.com.ctop.alarm.modules.entity.RuleBase;
+import cn.com.ctop.alarm.modules.entity.RuleGroup;
+import cn.com.ctop.alarm.modules.entity.RuleIndicator;
+import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+import cn.com.ctop.alarm.modules.mapper.AlarmEventSendMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleAccountTemplateMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleAccountThresholdMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleBaseMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleGroupMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleIndicatorMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleTemplateMapper;
+import cn.com.ctop.alarm.modules.service.IRuleAccountTemplateService;
+import cn.com.ctop.alarm.modules.service.IRuleGroupService;
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.mapper.SysUserMapper;
+import cn.com.ctop.common.module.mapper.UserAllocationMapper;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.IRuleDataAccountService;
+import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouUpdateService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.enums.NoEn;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.UUID;
+
+/**
+ * 规则组
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Service
+public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup> implements IRuleGroupService {
+
+    @Autowired
+    private RuleBaseMapper ruleBaseMapper;
+    @Autowired
+    private RuleGroupMapper ruleGroupMapper;
+    @Autowired
+    private RuleIndicatorMapper ruleIndicatorMapper;
+    @Autowired
+    private RuleAccountThresholdMapper ruleAccountThresholdMapper;
+    @Autowired
+    private RuleAccountTemplateMapper ruleAccountTemplateMapper;
+    @Autowired
+    private RuleTemplateMapper ruleTemplateMapper;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+    @Autowired
+    private IRuleAccountTemplateService ruleAccountTemplateService;
+    @Autowired
+    private ISendMessageService sendMessageService;
+    @Autowired
+    private IKuaiShouUpdateService kuaiShouUpdateService;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    private IRuleDataAccountService ruleDataAccountService;
+    @Autowired
+    private AlarmEventSendMapper alarmEventSendMapper;
+    @Autowired
+    private UserAllocationMapper userAllocationMapper;
+    ;
+    private JSONObject userObj = null;
+
+    @Override
+    public void checkRules() {
+        log.info("------start------");
+        Long startTime = System.currentTimeMillis();
+        //查询账户绑定过的规则模板
+        List<RuleAccountTemplate> ruleAccountTemplates = ruleAccountTemplateMapper.selectByMap(null);
+        if (Check.isNull(ruleAccountTemplates)) {
+            log.warn("查询账户绑定过的规则模板失败");
+            return;
+        }
+        //获取规则集
+        Map<Long, Object> ruleGroupMap = getRuleGroupMap();
+        if (Check.isNull(ruleGroupMap)) {
+            log.warn("获取规则集失败");
+            return;
+        }
+        //获取指标内容
+        JSONObject indicators = getRuleIndicator();
+        if (Check.isNull(indicators)) {
+            log.warn("获取指标内容失败");
+            return;
+        }
+        for (RuleAccountTemplate templates : ruleAccountTemplates) {
+            if (templates.getAccountId() == 1681223758914574l)
+                matchAlarmRules(ruleGroupMap, indicators, templates);
+        }
+        Long endTime = System.currentTimeMillis();
+        log.info("------end------共耗时: {} ms", endTime - startTime);
+    }
+
+    /**
+     * 匹配预警规则
+     *
+     * @param ruleGroups 规则数据集
+     * @param templates  规则模板
+     * @param indicators 指标码
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void matchAlarmRules(Map<Long, Object> ruleGroupMap, JSONObject indicators, RuleAccountTemplate templates) {
+        userObj = new JSONObject();
+        //查询匹配数据
+        JSONObject matchData = getRuleData(templates.getAccountId());
+        if (Check.isNull(matchData)) {
+            log.warn("查询匹配数据失败");
+            return;
+        }
+        boolean isCopy = false;
+        Map<Long, Object> map = (Map<Long, Object>) ruleGroupMap.get(templates.getTemplateId());
+        //媒体类型 1:头条2:快手
+        Integer type = (Integer) map.get("type");
+        //常规规则+阈值
+        List<RuleGroup> notCopyGroups = (List<RuleGroup>) map.get("notCopy");
+        JSONObject notCopythreshold = getThreshold(templates.getAccountId(), isCopy);
+        //可复制规则+阈值
+        List<RuleGroup> isCopyGroups = (List<RuleGroup>) map.get("isCopy");
+        JSONObject isCopythreshold = new JSONObject();
+        if (!Check.isNull(isCopyGroups)) {
+            isCopy = true;
+            isCopythreshold = getThreshold(templates.getAccountId(), isCopy);
+        }
+        log.info("已获取账户({})的数据,开始匹配规则", templates.getAccountId());
+        UserAllocation userAllocations = userAllocationMapper.getUserAllocation(templates.getAccountId());
+        String accountName = "";
+        if (!Check.isNull(userAllocations)) {
+            accountName = userAllocations.getAuthName();
+        }
+        try {
+            if (!Check.isNull(notCopyGroups) && !Check.isNull(notCopythreshold)) {
+                checkRuleGroups(notCopyGroups, notCopythreshold, indicators, matchData, type, false, accountName);
+            }
+            if (isCopy && !Check.isNull(isCopythreshold)) {
+                checkRuleGroups(isCopyGroups, isCopythreshold, indicators, matchData, type, isCopy, accountName);
+            }
+
+        } catch (Exception e) {
+            log.error("匹配规则逻辑异常", e);
+        }
+    }
+
+    /**
+     * 组合规则匹配逻辑
+     *
+     * @param ruleGroups   规则组集
+     * @param thresholdObj 阈值数据
+     * @param indicators   指标数据
+     * @param matchData    匹配数据
+     * @param type         媒体类型 1:头条2:快手
+     * @param isCopy       是否复制规则
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void checkRuleGroups(List<RuleGroup> ruleGroups, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, Integer type, boolean isCopy, String accountName) {
+        for (RuleGroup ruleGroup : ruleGroups) {
+            JSONArray complianceList = new JSONArray();
+            List<RuleBase> ruleBaseList = ruleGroup.getRuleBaseList();
+            if (Check.isNull(ruleBaseList)) {
+                continue;
+            }
+            //复制逻辑
+            if (isCopy) {
+                JSONObject batchNo = thresholdObj.getJSONObject(ruleGroup.getId().toString());
+                for (Map.Entry<String, Object> entry : batchNo.entrySet()) {
+                    JSONObject thresholdJn = (JSONObject) entry.getValue();
+                    if (!Check.isNull(thresholdJn)) {
+                        CombinationRule(ruleGroup, ruleBaseList, thresholdJn, indicators, matchData, type, accountName, complianceList);
+                    }
+                }
+            } else {
+                boolean isGroup = "group".equals(ruleGroup.getRuleType());
+                //匹配组合规则
+                if (isGroup) {
+                    CombinationRule(ruleGroup, ruleBaseList, thresholdObj, indicators, matchData, type, accountName, complianceList);
+                    //匹配单规则
+                } else {
+                    RuleBase ruleBase = ruleBaseList.get(0);
+                    //指标对象
+                    JSONObject indicator = indicators.getJSONObject(ruleBase.getIndicatorCode());
+                    //指标阈值
+                    String threshold = thresholdObj.getString(ruleBase.getId().toString());
+                    //阈值为空时,或者阈值为“unlimited”(不限),不执行该规则
+                    if (Check.isNull(threshold) || threshold.contains("unlimited")) {
+                        continue;
+                    }
+                    //维度数据
+                    JSONArray dimensionData = matchData.getJSONArray(ruleBase.getRuleDimension());
+                    if (!Check.isNull(dimensionData)) {
+                        for (int i = 0; i < dimensionData.size(); i++) {
+                            JSONObject obj = dimensionData.getJSONObject(i);
+                            String value = obj.getString(ruleBase.getIndicatorCode());
+                            if (MatchLogic.matchCondition(indicator.getString("dataType"), ruleBase.getRuleCondition(), threshold, value, obj)) {
+                                complianceList.add(obj);
+//                                sendMsg(ruleGroup, obj, type, accountName);
+                            }
+                        }
+                    }
+                }
+            }
+
+
+        }
+    }
+
+    /**
+     * 组合规则匹配逻辑
+     *
+     * @param ruleGroup    规则组对象
+     * @param ruleBaseList 单条规则数据集
+     * @param thresholdObj 阈值数据
+     * @param indicators   指标数据
+     * @param matchData    匹配数据
+     * @param type         媒体类型 1:头条2:快手
+     * @param accountName  账户名称
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void CombinationRule(RuleGroup ruleGroup, List<RuleBase> ruleBaseList, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, Integer type, String accountName, JSONArray complianceList) {
+        //符合规则的数据集
+        JSONArray targetDatas = new JSONArray();
+        JSONArray planDatas = new JSONArray();
+        JSONArray creativeDatas = new JSONArray();
+        JSONArray accountDatas = new JSONArray();
+        for (RuleBase ruleBase : ruleBaseList) {
+            //指标对象
+            JSONObject indicator = indicators.getJSONObject(ruleBase.getIndicatorCode());
+            //阈值类型
+            String dataType = indicator.getString("dataType");
+            //指标阈值
+            String threshold = thresholdObj.getString(ruleBase.getId().toString());
+            //阈值为空时,或者阈值为“unlimited”(不限),不执行该规则
+            if (Check.isNull(threshold) || "unlimited".equals(threshold)) {
+                continue;
+            }
+            JSONArray dimensionData = matchData.getJSONArray(ruleBase.getRuleDimension());
+            if (Check.isNull(dimensionData)) {
+                break;
+            }
+            //账户维度数据
+            if ("account".equals(ruleBase.getRuleDimension())) {
+                JSONObject accountEntity = dimensionData.getJSONObject(0);
+                if (MatchLogic.matchCondition(dataType, ruleBase.getRuleCondition(), threshold, accountEntity.getString(ruleBase.getIndicatorCode()), accountEntity)) {
+                    accountDatas.add(accountEntity);
+                } else {
+                    log.warn("匹配规则组({}),账户维度数据不符合直接跳过", ruleGroup.getId());
+                    break;
+                }
+                if (Check.isNull(accountDatas)) {
+                    break;
+                }
+            } else if ("plan".equals(ruleBase.getRuleDimension())) {
+                planDatas = getOKData(planDatas, dimensionData, ruleBase, dataType, threshold);
+                if (Check.isNull(planDatas)) {
+                    break;
+                }
+            } else if ("creative".equals(ruleBase.getRuleDimension())) {
+                creativeDatas = getOKData(creativeDatas, dimensionData, ruleBase, dataType, threshold);
+                if (Check.isNull(creativeDatas)) {
+                    break;
+                }
+            } else if ("target".equals(ruleBase.getRuleDimension())) {
+                targetDatas = getOKData(targetDatas, dimensionData, ruleBase, dataType, threshold);
+                if (Check.isNull(targetDatas)) {
+                    break;
+                }
+            }
+
+        }
+        //获取达标可发送的数据
+        JSONArray sendData = MatchLogic.getSendData(accountDatas, planDatas, creativeDatas, targetDatas);
+        if (!Check.isNull(sendData)) {
+            complianceList.addAll(sendData);
+//            //执行发送
+////            for (int i = 0; i < sendData.size(); i++) {
+////                sendMsg(ruleGroup, , type, accountName);
+////            }
+        }
+    }
+
+    /**
+     * @param ruleDatas     达标数据集
+     * @param dimensionData 匹配数据
+     * @param ruleBase      规则
+     * @param type          数据类型
+     * @param threshold     阈值
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private JSONArray getOKData(JSONArray ruleDatas, JSONArray dimensionData, RuleBase ruleBase, String type, String threshold) {
+        if (!Check.isNull(ruleDatas)) {
+            JSONArray okData = new JSONArray();
+            for (int i = 0; i < ruleDatas.size(); i++) {
+                JSONObject targetEntity = dimensionData.getJSONObject(i);
+                String value = targetEntity.getString(ruleBase.getIndicatorCode());
+                if (MatchLogic.matchCondition(type, ruleBase.getRuleCondition(), threshold, value, targetEntity)) {
+                    okData.add(targetEntity);
+                }
+            }
+            return okData;
+        }
+        for (int i = 0; i < dimensionData.size(); i++) {
+            JSONObject targetEntity = dimensionData.getJSONObject(i);
+            String value = targetEntity.getString(ruleBase.getIndicatorCode());
+            if (MatchLogic.matchCondition(type, ruleBase.getRuleCondition(), threshold, value, targetEntity)) {
+                ruleDatas.add(targetEntity);
+            }
+        }
+        return ruleDatas;
+    }
+
+    private void sendMag2(JSONArray complianceList, RuleGroup ruleGroup, String accountName) {
+        Long accountId = complianceList.getJSONObject(0).getLong("accountId");
+        if (Check.isNull(accountId)) {
+            return;
+        }
+        JSONObject user = getUserByAccountId(accountId);
+        StringJoiner creativeJoiner = new StringJoiner(",");
+        StringJoiner planJoiner = new StringJoiner(",");
+        StringJoiner isNullCreativeJoiner = new StringJoiner(",");
+        StringJoiner isNullPlanJoiner = new StringJoiner(",");
+        for (int i = 0; i < complianceList.size(); i++) {
+            JSONObject obj = complianceList.getJSONObject(i);
+            boolean isNull = obj.getBoolean("isNull");
+            if (isNull) {
+                if (!Check.isNull(obj.getString("creativeId"))) {
+                    //字节小于1900时
+                    if (isNullCreativeJoiner.toString().getBytes().length <= 1900) {
+                        isNullCreativeJoiner.add(obj.getString("creativeId"));
+                    } else {
+                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "creative", isNullCreativeJoiner.toString(), false);
+                        sendMsg(message, ruleGroup, user);
+                        isNullCreativeJoiner = new StringJoiner(",");
+                    }
+                } else if (!Check.isNull(obj.getLong("planId"))) {
+                    if (isNullPlanJoiner.toString().getBytes().length <= 1900) {
+                        isNullPlanJoiner.add(obj.getString("planId"));
+                    } else {
+                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "plan", isNullPlanJoiner.toString(), false);
+                        sendMsg(msg, ruleGroup, user);
+                        isNullPlanJoiner = new StringJoiner(",");
+                    }
+                } else {
+                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, false);
+                    sendMsg(msg, ruleGroup, user);
+                }
+            } else {
+                if (!Check.isNull(obj.getString("creativeId"))) {
+                    //字节小于1900时
+                    if (creativeJoiner.toString().getBytes().length <= 1900) {
+                        creativeJoiner.add(obj.getString("creativeId"));
+                    } else {
+                        String message = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "creative", creativeJoiner.toString(), false);
+                        sendMsg(message, ruleGroup, user);
+                        creativeJoiner = new StringJoiner(",");
+                    }
+                } else if (!Check.isNull(obj.getLong("planId"))) {
+                    if (planJoiner.toString().getBytes().length <= 1900) {
+                        planJoiner.add(obj.getString("planId"));
+                    } else {
+                        String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, "plan", planJoiner.toString(), false);
+                        sendMsg(msg, ruleGroup, user);
+                        planJoiner = new StringJoiner(",");
+                    }
+                } else {
+                    String msg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, accountName, null, null, false);
+                    sendMsg(msg, ruleGroup, user);
+                }
+            }
+        }
+        String creativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", creativeJoiner.toString(), accountName, false);
+        if (!Check.isNull(creativeMsg)) {
+            sendMsg(creativeMsg, ruleGroup, user);
+        }
+        String planMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", planJoiner.toString(), accountName, false);
+        if (!Check.isNull(planMsg)) {
+            sendMsg(planMsg, ruleGroup, user);
+        }
+        String isNullCreativeMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", isNullCreativeJoiner.toString(), accountName, false);
+        if (!Check.isNull(isNullCreativeMsg)) {
+            sendMsg(isNullCreativeMsg, ruleGroup, user);
+        }
+        String isNullPlanMsg = MatchLogic.getMessage(ruleGroup.getGroupName(), accountId, "creative", isNullPlanJoiner.toString(), accountName, false);
+        if (!Check.isNull(isNullPlanMsg)) {
+            sendMsg(isNullPlanMsg, ruleGroup, user);
+        }
+    }
+
+    /**
+     * 发送消息
+     *
+     * @param ruleGroup 达标的规则组对象
+     * @param obj       达标数据对象
+     * @param type      1:头条2:快手
+     * @param isNull    查询的值为空
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void sendMsg(String msg, RuleGroup ruleGroup, JSONObject user) {
+        //TODO 关停操作
+        boolean isPause = false;
+          /*      "PAUSE".equals(ruleGroup.getOperate());
+        if (isPause) {
+            if (shutDown(accountId, planId, creativeId, user.getString("id"))) {
+                isPause = true;
+            }
+            type 1:头条2:快手
+        }*/
+//        String msg = MatchLogic.getMsg(ruleGroup, user, obj, isPause, accountName);
+        if (isPause) {
+            msg += "现已被关停,请您及时查看并调整!";
+        } else {
+            msg += "请您及时查看并调整!";
+        }
+        String sendType = ruleGroup.getSendType();
+        if ("SMS".equals(sendType)) {
+
+        } else if ("EMAIL".equals(sendType)) {
+
+        } else if ("TEL".equals(sendType)) {
+
+        } else {
+            //TODO
+            ISendMessageService sendMessageService = this.sendMessageService;
+//            sendMessageService.sendMessage(user.getString("id"), msg);
+            sendMessageService.sendMessage("1b3deb8258e84df994f1371a51cfc14a", msg);
+            //113dee46c7df464da78c07a985e92cd1 于蒙
+        }
+        if (!Check.isNull(msg)) {
+            AlarmEventSend send = new AlarmEventSend();
+            send.setAlarmDetail(msg);
+            send.setAlarmStatus(NoEn.NO1.valueStr());
+            send.setEventRuleId(ruleGroup.getId());
+            if (msg.contains("预警账户")) {
+                send.setMetricValueCode("account");
+                if (msg.contains("预警计划")) {
+                    send.setMetricValueCode("plan");
+                    if (msg.contains("预警创意")) {
+                        send.setMetricValueCode("creative");
+                    }
+                }
+            }
+            send.setAlarmCondition(ruleGroup.getGroupName());
+            send.setUserId(user.getString("id"));
+            alarmEventSendMapper.insert(send);
+        }
+    }
+
+    /**
+     * 根据accountId获取人员对象
+     *
+     * @param accountId 账户ID
+     * @return com.alibaba.fastjson.JSONObject
+     * @throws
+     * @author ZHAOXA
+     */
+    private JSONObject getUserByAccountId(Long accountId) {
+        JSONObject obj = userObj.getJSONObject(accountId.toString());
+        if (Check.isNull(obj)) {
+            JSONObject user = sysUserMapper.selectUserByAccount(accountId);
+            userObj.put(accountId.toString(), user);
+            return user;
+        }
+        return obj;
+    }
+
+    /**
+     * 关停操作
+     *
+     * @param
+     * @return boolean
+     * @throws
+     * @author ZHAOXA
+     */
+    private boolean shutDown(Long accountId, Long planId, Long creativeId, String userId) {
+        CtopOauthToken token = oauthTokenService.getTokenByAccountId(accountId);
+        Map<String, Object> updateMap = new HashMap<>();
+        if (!Check.isNull(token)) {
+            if (!Check.isNull(creativeId)) {
+                updateMap = kuaiShouUpdateService.updateCreativeStatus(token.getAccessToken(), accountId, creativeId, NoEn.NO2.valueInt(), userId);
+                log.info("---------规则关停创意:{}", creativeId);
+            } else if (!Check.isNull(planId) && Check.isNull(creativeId)) {
+                updateMap = kuaiShouUpdateService.updateCampaignStatus(token.getAccessToken(), accountId, planId, NoEn.NO2.valueInt(), userId);
+                log.info("---------规则关停计划:{}", planId);
+            }
+        }
+        return (boolean) updateMap.get("success");
+    }
+
+    //整理阈值数据
+    public JSONObject getThreshold(Long accountId, boolean isCopy) {
+        JSONObject obj = new JSONObject();
+        try {
+            if (isCopy) {
+                List<Long> groupList = ruleAccountThresholdMapper.selectGroupIdsByAccountId(accountId);
+                if (Check.isNull(groupList)) {
+                    return null;
+                }
+                for (Long groupId : groupList) {
+                    JSONObject groupIdObj = new JSONObject();
+                    List<String> batchNos = ruleAccountThresholdMapper.selectbatchNosByGroupIdId(accountId, groupId);
+                    if (Check.isNull(batchNos)) {
+                        return null;
+                    }
+                    for (String batchNo : batchNos) {
+                        JSONObject batchNoObj = new JSONObject();
+                        List<RuleAccountThreshold> thresholdList = ruleAccountThresholdMapper.selectCopyThresholdByAccountId(accountId, groupId, batchNo);
+                        if (Check.isNull(thresholdList)) {
+                            return null;
+                        }
+                        for (RuleAccountThreshold threshold : thresholdList) {
+                            batchNoObj.put(String.valueOf(threshold.getRuleId()), threshold.getThreshold());
+                        }
+                        groupIdObj.put(batchNo.toString(), batchNoObj);
+                    }
+                    obj.put(groupId.toString(), groupIdObj);
+                }
+            } else {
+                List<RuleAccountThreshold> thresholdList = ruleAccountThresholdMapper.selectByAccountId(accountId);
+                if (Check.isNull(thresholdList)) {
+                    return null;
+                }
+                for (RuleAccountThreshold threshold : thresholdList) {
+                    obj.put(String.valueOf(threshold.getRuleId()), threshold.getThreshold());
+                }
+            }
+        } catch (Exception e) {
+            log.error("获取账户阈值数据集失败", e);
+        }
+        return obj;
+
+    }
+
+    //整理指标数据
+    public JSONObject getRuleIndicator() {
+        JSONObject obj = new JSONObject();
+        try {
+            List<RuleIndicator> indicators = ruleIndicatorMapper.selectByMap(null);
+            if (Check.isNull(indicators)) {
+                return null;
+            }
+            for (RuleIndicator indicator : indicators) {
+                obj.put(indicator.getCode(), indicator);
+            }
+        } catch (Exception e) {
+            log.error("获取指标数据集异常", e);
+        }
+        return obj;
+    }
+
+
+    /**
+     * 整理规则模板的数据,根据模板ID获取模板具体规则内容
+     *
+     * @param
+     * @return MAP key为模板ID,value是规则集
+     * @throws
+     * @author ZHAOXA
+     */
+    private Map<Long, Object> getRuleGroupMap() {
+        try {
+            Map<Long, Object> returnMap = new HashMap<>();
+            List<RuleTemplate> ruleTemplates = ruleTemplateMapper.selectByMap(null);
+            for (RuleTemplate tem : ruleTemplates) {
+                Map<String, Object> map = new HashMap<>();
+                QueryWrapper<RuleGroup> groupWrapper = new QueryWrapper<>();
+                groupWrapper.eq("template_id", tem.getId());
+                groupWrapper.eq("is_copy", NoEn.NO1.valueInt());
+                List<RuleGroup> copyGroups = ruleGroupMapper.selectList(groupWrapper);
+                for (RuleGroup group : copyGroups) {
+                    QueryWrapper<RuleBase> baseWrapper = new QueryWrapper<>();
+                    baseWrapper.eq("group_id", group.getId());
+                    baseWrapper.orderByDesc("is_unlimited");
+                    group.setRuleBaseList(ruleBaseMapper.selectList(baseWrapper));
+                }
+                map.put("isCopy", copyGroups);
+                groupWrapper = new QueryWrapper<>();
+                groupWrapper.eq("template_id", tem.getId());
+                groupWrapper.eq("is_copy", NoEn.NO0.valueInt());
+                List<RuleGroup> notCopyGroups = ruleGroupMapper.selectList(groupWrapper);
+                for (RuleGroup group : notCopyGroups) {
+                    QueryWrapper<RuleBase> baseWrapper = new QueryWrapper<>();
+                    baseWrapper.eq("group_id", group.getId());
+                    baseWrapper.orderByDesc("is_unlimited");
+                    group.setRuleBaseList(ruleBaseMapper.selectList(baseWrapper));
+                }
+                map.put("notCopy", notCopyGroups);
+                map.put("type", tem.getMediaType());
+                returnMap.put(tem.getId(), map);
+            }
+            return returnMap;
+        } catch (Exception e) {
+            log.error("获取模板规则组集合异常", e);
+        }
+        return null;
+    }
+
+
+    /**
+     * 获取指标数据
+     *
+     * @param
+     * @return java.util.List<org.json.JSONObject>
+     * @throws
+     * @author ZHAOXA
+     */
+    private JSONObject getRuleData(Long accountId) {
+        try {
+            return ruleDataAccountService.getRuleDataByAccountId(accountId);
+        } catch (Exception e) {
+            log.error("获取匹配数据集异常", e);
+        }
+        return null;
+    }
+
+    /**
+     * 创建规则集
+     *
+     * @param requestJson
+     * @return
+     */
+
+
+    @Override
+    public JSONObject createRuleGroup(com.alibaba.fastjson.JSONObject requestJson) {
+        JSONObject returnJson = new JSONObject();
+        try {
+            Long templateId = requestJson.getLong("templateId");
+            if (Check.isNull(templateId)) {
+                throw new Exception("请选择需要创建的规则模板id");
+            }
+            RuleTemplate template = ruleTemplateMapper.selectById(templateId);
+            if (Check.isNull(template)) {
+                throw new Exception("未获取到对应的规则模板详细情");
+            }
+
+            JSONArray ruleList = requestJson.getJSONArray("ruleList");
+            if (Check.isNull(ruleList)) {
+                throw new Exception("请传入具体规则");
+            }
+            QueryWrapper<RuleAccountTemplate> templateQueryWrapper = new QueryWrapper<>();
+            templateQueryWrapper.eq("template_id", templateId);
+            List<RuleAccountTemplate> accountList = ruleAccountTemplateService.list(templateQueryWrapper);
+
+            for (int i = 0; i < ruleList.size(); i++) {
+                JSONObject groupJson = ruleList.getJSONObject(i);
+                JSONArray ruleDetail = groupJson.getJSONArray("ruleDetail");
+                if (Check.isNull(ruleDetail)) {
+                    throw new Exception("规则组下指标不能为空");
+                }
+
+                Integer isCopy = groupJson.getInteger("isCopy");
+                String batchId = null;
+                if (isCopy == 1) {
+                    batchId = UUID.randomUUID().toString().replace("-", "");
+
+                }
+                JSONArray ruleIds = new JSONArray();
+                JSONArray thresholdIds = new JSONArray();
+                for (int j = 0; j < ruleDetail.size(); j++) {
+                    JSONObject ruleDetailJson = ruleDetail.getJSONObject(j);
+                    RuleBase ruleBase = new RuleBase();
+                    ruleBase.setRuleName(ruleDetailJson.getString("ruleName"));
+                    ruleBase.setIndicatorCode(ruleDetailJson.getString("indicatorCode"));
+                    ruleBase.setRuleCondition(ruleDetailJson.getString("ruleCondition"));
+                    ruleBase.setThreshold(ruleDetailJson.getString("threshold"));
+                    ruleBase.setVariableType(ruleDetailJson.getInteger("variableType"));
+                    ruleBase.setRuleDimension(ruleDetailJson.getString("ruleDimension"));
+                    ruleBase.setJudgeFormat(ruleDetailJson.getInteger("judgeFormat"));
+                    ruleBase.setIsUnlimited(ruleDetailJson.getInteger("isUnlimited"));
+                    int insert = ruleBaseMapper.insert(ruleBase);    // 添加基础规则
+
+                    if (insert > 0) {
+                        if (!Check.isNull(accountList)) {
+                            for (RuleAccountTemplate accountTemplate : accountList) {
+                                Long accountId = accountTemplate.getAccountId();
+                                QueryWrapper<RuleAccountThreshold> thresholdQueryWrapper = new QueryWrapper<>();
+                                thresholdQueryWrapper.eq("account_id", accountId);
+                                thresholdQueryWrapper.eq("rule_id", ruleBase.getId());
+                                thresholdQueryWrapper.last("limit 1");
+                                RuleAccountThreshold accountThreshold = ruleAccountThresholdMapper.selectOne(thresholdQueryWrapper);
+                                if (!Check.isNull(accountThreshold)) {
+                                    continue;
+                                }
+                                RuleAccountThreshold threshold = new RuleAccountThreshold();
+                                threshold.setAccountId(accountId);
+                                if (isCopy == 1) {
+                                    threshold.setBatchNo(batchId);
+                                }
+                                threshold.setRuleId(ruleBase.getId());
+                                int thresholdInsert = ruleAccountThresholdMapper.insert(threshold);// 默认将新建的规则同步到已应用的账户下
+                                if (thresholdInsert > 0) {
+                                    thresholdIds.add(threshold.getId());
+                                }
+                            }
+                        }
+                        ruleIds.add(ruleBase.getId()); // 获取基本规则集
+                    }
+                }
+                RuleGroup ruleGroup = new RuleGroup();
+                ruleGroup.setRuleIds(ruleIds.toJSONString());
+                ruleGroup.setRuleType(groupJson.getString("ruleType"));
+                ruleGroup.setTemplateId(templateId);
+                ruleGroup.setRuleRelationship(groupJson.getString("ruleRelationship"));
+                ruleGroup.setGroupName(groupJson.getString("groupName"));
+                ruleGroup.setRemark(groupJson.getString("remark"));
+                ruleGroup.setIsCopy(groupJson.getInteger("isCopy"));
+                ruleGroup.setIsRequired(groupJson.getInteger("isRequired"));
+                boolean save = ruleGroupService.save(ruleGroup); // 新增规则组
+                if (save) {
+                    for (int j = 0; j < ruleIds.size(); j++) {
+                        Long ruleId = ruleIds.getLong(j);
+                        RuleBase updateRuleBase = new RuleBase();
+                        updateRuleBase.setId(ruleId);
+                        updateRuleBase.setGroupId(ruleGroup.getId());
+                        ruleBaseMapper.updateById(updateRuleBase); // 组同步成功之后 基础规则关联到组id
+                    }
+                    for (int j = 0; j < thresholdIds.size(); j++) {
+                        Long threshold = thresholdIds.getLong(j);
+                        RuleAccountThreshold updateThreshold = new RuleAccountThreshold();
+                        updateThreshold.setId(threshold);
+                        updateThreshold.setGroupId(ruleGroup.getId());
+                        ruleAccountThresholdMapper.updateById(updateThreshold); // 同步到阈值之后 阈值关联到组id
+
+                    }
+                    JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
+                    groupIds.add(ruleGroup.getId());
+                    template.setGroupIds(groupIds.toJSONString());
+                    ruleTemplateMapper.updateById(template); // 将新增的规则组id 添加到规则模板的规则组id下
+                }
+            }
+
+            returnJson.put("code", 0);
+            returnJson.put("message", "添加成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            returnJson.put("code", -1);
+            returnJson.put("message", e.getMessage());
+
+        }
+
+        return returnJson;
+    }
+
+
+}

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

@@ -0,0 +1,31 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.RuleIndicator;
+import cn.com.ctop.alarm.modules.mapper.RuleIndicatorMapper;
+import cn.com.ctop.alarm.modules.service.IRuleIndicatorService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 规则指标信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-14
+ */
+@Service
+public class RuleIndicatorServiceImpl extends ServiceImpl<RuleIndicatorMapper, RuleIndicator> implements IRuleIndicatorService {
+    @Autowired
+    private RuleIndicatorMapper ruleIndicatorMapper;
+
+    @Override
+    public String getRuleIndicatorNameByMediaTypeAndDimension(Integer mediaType, String dimension) {
+        return ruleIndicatorMapper.getRuleIndicatorNameByMediaTypeAndDimension(mediaType, dimension);
+    }
+
+    @Override
+    public String getDataTypeByRuleDimensionAndIndicatorCode(String ruleDimension, String indicatorCode) {
+        return ruleIndicatorMapper.getDataTypeByRuleDimensionAndIndicatorCode(ruleDimension, indicatorCode);
+    }
+}

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

@@ -0,0 +1,539 @@
+package cn.com.ctop.alarm.modules.service.impl;
+
+import cn.com.ctop.alarm.modules.entity.*;
+import cn.com.ctop.alarm.modules.mapper.RuleBaseMapper;
+import cn.com.ctop.alarm.modules.mapper.RuleTemplateMapper;
+import cn.com.ctop.alarm.modules.service.*;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 规则模板
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-15
+ */
+@Slf4j
+@Service
+public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, RuleTemplate> implements IRuleTemplateService {
+    @Autowired
+    private IRuleBaseService ruleBaseService;
+
+    @Autowired
+    private RuleBaseMapper ruleBaseMapper;
+
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+
+    @Autowired
+    private RuleTemplateMapper ruleTemplateMapper;
+
+    @Autowired
+    private IRuleIndicatorService ruleIndicatorService;
+
+    @Autowired
+    private IRuleAccountThresholdService accountThresholdService;
+
+    /**
+     * 创建规则模板
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    public JSONObject createTemplate(JSONObject requestJson) {
+        JSONObject returnJson = new JSONObject();
+        try {
+            Integer mediaType = requestJson.getInteger("mediaType");
+            if (Check.isNull(mediaType)) {
+                throw new Exception("请传入媒体类型");
+            }
+            String templateName = requestJson.getString("templateName");
+            if (Check.isNull(templateName)) {
+                throw new Exception("请传入模板名称");
+            }
+            QueryWrapper<RuleTemplate> queryQueryWrapper = new QueryWrapper<>();
+            queryQueryWrapper.eq("media_type", mediaType);
+            queryQueryWrapper.eq("template_name", templateName);
+            RuleTemplate ruleTemplate = this.getOne(queryQueryWrapper);
+            if (!Check.isNull(ruleTemplate)) {
+                throw new Exception("同媒体下模板名称不能相同");
+            }
+            RuleTemplate template = new RuleTemplate();
+            template.setMediaType(mediaType);
+            template.setTemplateName(templateName);
+            JSONArray groupIds = new JSONArray();
+            JSONArray ruleList = requestJson.getJSONArray("ruleList"); // 模板规则详情
+            if (Check.isNull(ruleList)) {
+                throw new Exception("模板具体规则不能为空");
+            }
+            for (int i = 0; i < ruleList.size(); i++) {
+                JSONObject ruleGroupJson = ruleList.getJSONObject(i);
+                if (!Check.isNull(ruleGroupJson)) {
+                    JSONArray ruleDetailArr = ruleGroupJson.getJSONArray("ruleDetail");
+                    if (!Check.isNull(ruleDetailArr)) {
+                        JSONArray ruleIds = new JSONArray();
+                        for (int j = 0; j < ruleDetailArr.size(); j++) {
+                            JSONObject ruleDetailJson = ruleDetailArr.getJSONObject(j);
+                            if (!Check.isNull(ruleDetailJson)) {
+                                RuleBase ruleBase = new RuleBase();
+                                ruleBase.setRuleName(ruleDetailJson.getString("ruleName"));
+                                ruleBase.setIndicatorCode(ruleDetailJson.getString("indicatorCode"));
+                                ruleBase.setRuleCondition(ruleDetailJson.getString("ruleCondition"));
+                                ruleBase.setThreshold(ruleDetailJson.getString("threshold"));
+                                ruleBase.setVariableType(ruleDetailJson.getInteger("variableType"));
+                                ruleBase.setRuleDimension(ruleDetailJson.getString("ruleDimension"));
+                                ruleBase.setJudgeFormat(ruleDetailJson.getInteger("judgeFormat"));
+                                ruleBase.setIsUnlimited(ruleDetailJson.getInteger("isUnlimited"));
+                                int insert = ruleBaseMapper.insert(ruleBase);
+                                if (insert > 0) {
+                                    ruleIds.add(ruleBase.getId());
+                                }
+                            }
+                        }
+                        RuleGroup ruleGroup = new RuleGroup();
+                        ruleGroup.setRuleIds(ruleIds.toJSONString());
+                        ruleGroup.setRuleType(ruleGroupJson.getString("ruleType"));
+                        ruleGroup.setRuleRelationship(ruleGroupJson.getString("ruleRelationship"));
+                        ruleGroup.setGroupName(ruleGroupJson.getString("groupName"));
+                        ruleGroup.setRemark(ruleGroupJson.getString("remark"));
+                        ruleGroup.setIsCopy(ruleGroupJson.getInteger("isCopy"));
+                        ruleGroup.setIsRequired(ruleGroupJson.getInteger("isRequired"));
+                        boolean save = ruleGroupService.save(ruleGroup);
+                        if (save) {
+                            String ruleIdsArrStr = ruleGroup.getRuleIds();
+                            JSONArray array = JSONArray.parseArray(ruleIdsArrStr);
+                            if (!Check.isNull(array)) {
+                                for (int j = 0; j < array.size(); j++) {
+                                    Long ruleId = array.getLong(j);
+                                    RuleBase updateBase = new RuleBase();
+                                    updateBase.setId(ruleId);
+                                    updateBase.setGroupId(ruleGroup.getId());
+                                    ruleBaseService.updateById(updateBase);
+                                }
+                            }
+                            groupIds.add(ruleGroup.getId());
+                        }
+                    }
+                }
+            }
+            template.setGroupIds(groupIds.toJSONString());
+            boolean save = this.save(template);
+            if (save) {
+                String groupIdsArrStr = template.getGroupIds();
+                JSONArray groupIdsArr = JSONArray.parseArray(groupIdsArrStr);
+                if (!Check.isNull(groupIdsArr)) {
+                    for (int i = 0; i < groupIdsArr.size(); i++) {
+                        Long groupId = groupIdsArr.getLong(i);
+                        RuleGroup updateRuleGroup = new RuleGroup();
+                        updateRuleGroup.setId(groupId);
+                        updateRuleGroup.setTemplateId(template.getId());
+                        ruleGroupService.updateById(updateRuleGroup);
+                    }
+
+                }
+            }
+            log.info("创建规则模板成功,模板名称:{}", templateName);
+            returnJson.put("code", 0);
+            returnJson.put("message", "创建成功");
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            returnJson.put("code", -1);
+            returnJson.put("message", e.getMessage());
+        }
+
+        return returnJson;
+    }
+
+
+    /**
+     * 获取模板详情
+     *
+     * @param id
+     * @return
+     */
+
+
+    @Override
+    public JSONObject queryDetailById(String id) throws Exception {
+        JSONObject returnJson = new JSONObject();
+        RuleTemplate template = ruleTemplateMapper.selectById(id);
+        if (Check.isNull(ruleTemplateMapper)) {
+            throw new Exception("获取模板基本信息为空");
+        }
+
+        returnJson.put("templateId", template.getId());
+        returnJson.put("templateName", template.getTemplateName());
+        returnJson.put("mediaType", template.getMediaType());
+        JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
+        if (Check.isNull(groupIds)) {
+            throw new Exception("未获取规则集");
+        }
+
+
+        JSONArray ruleList = new JSONArray();
+        for (int i = 0; i < groupIds.size(); i++) {
+            Long groupId = groupIds.getLong(i);
+            RuleGroup group = ruleGroupService.getById(groupId);
+            if (Check.isNull(group)) {
+                continue;
+            }
+            JSONObject groupJson = new JSONObject();
+            groupJson.put("groupId", group.getId());
+            groupJson.put("groupName", group.getGroupName());
+            groupJson.put("ruleType", group.getRuleType());
+            groupJson.put("ruleRelationship", group.getRuleRelationship());
+            groupJson.put("remark", group.getRemark());
+            groupJson.put("operate", group.getOperate());
+            groupJson.put("sendType", group.getSendType());
+            groupJson.put("isCopy", group.getIsCopy());
+            groupJson.put("isRequired", group.getIsRequired());
+            JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
+            if (Check.isNull(ruleIds)) {
+                continue;
+            }
+            JSONArray ruleDetail = new JSONArray();
+            for (int j = 0; j < ruleIds.size(); j++) {
+                Long ruleId = ruleIds.getLong(j);
+                RuleBase ruleBase = ruleBaseService.getById(ruleId);
+                if (Check.isNull(ruleBase)) {
+                    continue;
+                }
+                JSONObject ruleJson = new JSONObject();
+                ruleJson.put("ruleId", ruleBase.getId());
+                ruleJson.put("ruleName", ruleBase.getRuleName());
+                ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                ruleJson.put("threshold", ruleBase.getThreshold());
+                ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                ruleJson.put("variableType", ruleBase.getVariableType());
+                ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                /**
+                 * 查询指标对应信息
+                 */
+                QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                indicatorQueryWrapper.last("limit 1");
+                RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);
+                if (!Check.isNull(ruleIndicator)) {
+                    ruleJson.put("dataType", ruleIndicator.getDataType());
+                    ruleJson.put("dictId", ruleIndicator.getDictId());
+                    ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                    ruleJson.put("name", ruleIndicator.getName());
+                    ruleJson.put("modelType", ruleIndicator.getModelType());
+                }
+
+                ruleDetail.add(ruleJson);
+            }
+            groupJson.put("ruleDetail", ruleDetail);
+            ruleList.add(groupJson);
+        }
+
+        returnJson.put("ruleList", ruleList);
+        return returnJson;
+    }
+
+
+    /**
+     * 根据 账户id 模板id 查询模板详情
+     *
+     * @param accountId
+     * @param templateId
+     * @return
+     */
+    @Override
+    public JSONObject queryDetailByAccountIdAndTemplateId(Long accountId, Long templateId) throws Exception {
+        JSONObject returnJson = new JSONObject();
+        RuleTemplate template = ruleTemplateMapper.selectById(templateId);
+        if (Check.isNull(template)) {
+            throw new Exception("获取模板基本信息为空");
+        }
+
+        returnJson.put("templateId", template.getId());
+        returnJson.put("templateName", template.getTemplateName());
+        returnJson.put("mediaType", template.getMediaType());
+        JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
+        if (Check.isNull(groupIds)) {
+            throw new Exception("未获取规则集");
+        }
+        JSONArray ruleList = new JSONArray();
+        for (int i = 0; i < groupIds.size(); i++) {
+            Long groupId = groupIds.getLong(i);
+            RuleGroup group = ruleGroupService.getById(groupId);
+            if (Check.isNull(group)) {
+                continue;
+            }
+            JSONObject groupJson = new JSONObject();
+            groupJson.put("groupId", group.getId());
+            groupJson.put("groupName", group.getGroupName());
+            groupJson.put("ruleType", group.getRuleType());
+            groupJson.put("ruleRelationship", group.getRuleRelationship());
+            groupJson.put("remark", group.getRemark());
+            groupJson.put("operate", group.getOperate());
+            groupJson.put("sendType", group.getSendType());
+            groupJson.put("isCopy", group.getIsCopy());
+            groupJson.put("isRequired", group.getIsRequired());
+            JSONArray ruleDetail = new JSONArray();
+
+            if (group.getIsCopy() == 0) { // 规则不可复制
+                JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
+                if (Check.isNull(ruleIds)) {
+                    continue;
+                }
+                for (int j = 0; j < ruleIds.size(); j++) {
+                    Long ruleId = ruleIds.getLong(j);
+                    RuleBase ruleBase = ruleBaseService.getById(ruleId); // 查询基础规则信息
+                    if (Check.isNull(ruleBase)) {
+                        continue;
+                    }
+                    JSONObject ruleJson = new JSONObject();
+                    ruleJson.put("ruleId", ruleBase.getId());
+                    ruleJson.put("ruleName", ruleBase.getRuleName());
+                    ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                    ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                    ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                    QueryWrapper<RuleAccountThreshold> accountThresholdQueryWrapper = new QueryWrapper<>();
+                    accountThresholdQueryWrapper.eq("account_id", accountId);
+                    accountThresholdQueryWrapper.eq("rule_id", ruleId);
+                    accountThresholdQueryWrapper.eq("group_id", groupId);
+                    RuleAccountThreshold threshold = accountThresholdService.getOne(accountThresholdQueryWrapper); // 查询基础规则绑定的阈值
+                    if (!Check.isNull(threshold)) {
+                        String value = threshold.getThreshold();
+                        if (!Check.isNull(value)) {
+                            if (value.contains("[") && value.contains("]")) {
+                                ruleJson.put("threshold", JSONArray.parseArray(value));
+                            } else {
+                                ruleJson.put("threshold", value);
+                            }
+                        } else {
+                            ruleJson.put("threshold", null);
+                        }
+                    } else {
+                        ruleJson.put("threshold", null);
+                    }
+
+                    ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                    ruleJson.put("variableType", ruleBase.getVariableType());
+                    ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                    /**
+                     * 查询指标对应信息
+                     */
+                    QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                    indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                    indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                    indicatorQueryWrapper.last("limit 1");
+                    RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);  // 查询指标的详情信息
+                    if (!Check.isNull(ruleIndicator)) {
+                        ruleJson.put("dataType", ruleIndicator.getDataType());
+                        ruleJson.put("dictId", ruleIndicator.getDictId());
+                        ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                        ruleJson.put("name", ruleIndicator.getName());
+                        ruleJson.put("modelType", ruleIndicator.getModelType());
+                    }
+
+                    ruleDetail.add(ruleJson);
+                }
+                groupJson.put("ruleDetail", ruleDetail);
+            } else if (group.getIsCopy() == 1) {  // 如果规则可以复制
+
+                List<String> batchNoList = accountThresholdService.getBatchNo(accountId, groupId); // 查询批次号
+                if (Check.isNull(batchNoList)) {
+                    continue;
+                }
+                for (int j = 0; j < batchNoList.size(); j++) {
+                    String batchNo = (String) batchNoList.get(j);
+                    if (Check.isNull(batchNo)) {
+                        continue;
+                    }
+                    JSONArray ruleArr = new JSONArray();
+                    QueryWrapper<RuleAccountThreshold> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("account_id", accountId);
+                    queryWrapper.eq("group_id", groupId);
+                    queryWrapper.eq("batch_no", batchNo);
+                    List<RuleAccountThreshold> list = accountThresholdService.list(queryWrapper); // 根据批次号查询绑定的基础规则阈值集合
+                    if (Check.isNull(list)) {
+                        continue;
+                    }
+                    for (RuleAccountThreshold threshold : list) {
+                        RuleBase ruleBase = ruleBaseService.getById(threshold.getRuleId()); // 根据阈值集合ruleId 查询基础规则信息
+                        if (Check.isNull(ruleBase)) {
+                            continue;
+                        }
+                        JSONObject ruleJson = new JSONObject();
+                        ruleJson.put("ruleId", ruleBase.getId());
+                        ruleJson.put("ruleName", ruleBase.getRuleName());
+                        ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                        ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                        ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                        String value = threshold.getThreshold();
+                        if (!Check.isNull(value)) {
+                            if (value.contains("[") && value.contains("]")) {
+                                ruleJson.put("threshold", JSONArray.parseArray(value));
+                            } else {
+                                ruleJson.put("threshold", value);
+                            }
+                        } else {
+                            ruleJson.put("threshold", null);
+                        }
+                        ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                        ruleJson.put("variableType", ruleBase.getVariableType());
+                        ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                        /**
+                         * 查询指标对应信息
+                         */
+                        QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                        indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                        indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                        indicatorQueryWrapper.last("limit 1");
+                        RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper); // 查询基础规则的指标信息
+                        if (!Check.isNull(ruleIndicator)) {
+                            ruleJson.put("dataType", ruleIndicator.getDataType());
+                            ruleJson.put("dictId", ruleIndicator.getDictId());
+                            ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                            ruleJson.put("name", ruleIndicator.getName());
+                            ruleJson.put("modelType", ruleIndicator.getModelType());
+                        }
+                        ruleArr.add(ruleJson);
+                    }
+
+                    ruleDetail.add(ruleArr);
+                }
+                groupJson.put("ruleDetail", ruleDetail);
+            }
+            ruleList.add(groupJson);
+        }
+        returnJson.put("ruleList", ruleList);
+        return returnJson;
+    }
+
+    @Override
+    public JSONObject previewTemplate(String id) throws Exception {
+        JSONObject returnJson = new JSONObject();
+        RuleTemplate template = ruleTemplateMapper.selectById(id);
+        if (Check.isNull(ruleTemplateMapper)) {
+            throw new Exception("获取模板基本信息为空");
+        }
+        returnJson.put("templateId", template.getId());
+        returnJson.put("templateName", template.getTemplateName());
+        returnJson.put("mediaType", template.getMediaType());
+        JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
+        if (Check.isNull(groupIds)) {
+            throw new Exception("未获取规则集");
+        }
+        JSONArray ruleList = new JSONArray();
+        for (int i = 0; i < groupIds.size(); i++) {
+            Long groupId = groupIds.getLong(i);
+            RuleGroup group = ruleGroupService.getById(groupId);
+            if (Check.isNull(group)) {
+                continue;
+            }
+            JSONObject groupJson = new JSONObject();
+            groupJson.put("groupId", group.getId());
+            groupJson.put("groupName", group.getGroupName());
+            groupJson.put("ruleType", group.getRuleType());
+            groupJson.put("ruleRelationship", group.getRuleRelationship());
+            groupJson.put("remark", group.getRemark());
+            groupJson.put("operate", group.getOperate());
+            groupJson.put("sendType", group.getSendType());
+            groupJson.put("isCopy", group.getIsCopy());
+            groupJson.put("isRequired", group.getIsRequired());
+            JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
+            if (Check.isNull(ruleIds)) {
+                continue;
+            }
+            JSONArray ruleDetail = new JSONArray();
+            if (group.getIsCopy() == 0) {
+                for (int j = 0; j < ruleIds.size(); j++) {
+                    Long ruleId = ruleIds.getLong(j);
+                    RuleBase ruleBase = ruleBaseService.getById(ruleId);
+                    if (Check.isNull(ruleBase)) {
+                        continue;
+                    }
+                    JSONObject ruleJson = new JSONObject();
+                    ruleJson.put("ruleId", ruleBase.getId());
+                    ruleJson.put("ruleName", ruleBase.getRuleName());
+                    ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                    ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                    ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                    ruleJson.put("threshold", ruleBase.getThreshold());
+                    ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                    ruleJson.put("variableType", ruleBase.getVariableType());
+                    ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                    /**
+                     * 查询指标对应信息
+                     */
+                    QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                    indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                    indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                    indicatorQueryWrapper.last("limit 1");
+                    RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);
+                    if (!Check.isNull(ruleIndicator)) {
+                        ruleJson.put("dataType", ruleIndicator.getDataType());
+                        ruleJson.put("dictId", ruleIndicator.getDictId());
+                        ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                        ruleJson.put("name", ruleIndicator.getName());
+                        ruleJson.put("modelType", ruleIndicator.getModelType());
+                    }
+
+                    ruleDetail.add(ruleJson);
+                }
+                groupJson.put("ruleDetail", ruleDetail);
+            } else if (group.getIsCopy() == 1) {
+                JSONArray array = new JSONArray();
+                for (int j = 0; j < ruleIds.size(); j++) {
+                    Long ruleId = ruleIds.getLong(j);
+                    RuleBase ruleBase = ruleBaseService.getById(ruleId);
+                    if (Check.isNull(ruleBase)) {
+                        continue;
+                    }
+                    JSONObject ruleJson = new JSONObject();
+                    ruleJson.put("ruleId", ruleBase.getId());
+                    ruleJson.put("ruleName", ruleBase.getRuleName());
+                    ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                    ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                    ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                    ruleJson.put("threshold", ruleBase.getThreshold());
+                    ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                    ruleJson.put("variableType", ruleBase.getVariableType());
+                    ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                    /**
+                     * 查询指标对应信息
+                     */
+                    QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                    indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                    indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                    indicatorQueryWrapper.last("limit 1");
+                    RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);
+                    if (!Check.isNull(ruleIndicator)) {
+                        ruleJson.put("dataType", ruleIndicator.getDataType());
+                        ruleJson.put("dictId", ruleIndicator.getDictId());
+                        ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                        ruleJson.put("name", ruleIndicator.getName());
+                        ruleJson.put("modelType", ruleIndicator.getModelType());
+                    }
+
+                    array.add(ruleJson);
+                }
+                ruleDetail.add(array);
+                groupJson.put("ruleDetail", ruleDetail);
+            }
+            ruleList.add(groupJson);
+        }
+        returnJson.put("ruleList", ruleList);
+        return returnJson;
+    }
+
+}

+ 234 - 0
module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataAccountController.java

@@ -0,0 +1,234 @@
+package cn.com.ctop.common.module.controller;
+
+import cn.com.ctop.common.module.entity.RuleDataAccount;
+import cn.com.ctop.common.module.service.IRuleDataAccountService;
+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.*;
+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
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="规则账户清洗数据")
+@RestController
+@RequestMapping("/ctop/rule/account")
+public class RuleDataAccountController {
+	@Autowired
+	private IRuleDataAccountService ruleDataAccountService;
+
+	/**
+	  * 分页列表查询
+	 * @param ruleDataAccount
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-分页列表查询", notes="规则账户清洗数据-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<RuleDataAccount>> queryPageList(RuleDataAccount ruleDataAccount,
+                                                        @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                                        @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+                                                        HttpServletRequest req) {
+		Result<IPage<RuleDataAccount>> result = new Result<>();
+		QueryWrapper<RuleDataAccount> queryWrapper = QueryGenerator.initQueryWrapper(ruleDataAccount, req.getParameterMap());
+		Page<RuleDataAccount> page = new Page<>(pageNo, pageSize);
+		IPage<RuleDataAccount> pageList = ruleDataAccountService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param ruleDataAccount
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-添加", notes="规则账户清洗数据-添加")
+	@PostMapping(value = "/add")
+	public Result<RuleDataAccount> add(@RequestBody RuleDataAccount ruleDataAccount) {
+		Result<RuleDataAccount> result = new Result<>();
+		try {
+			ruleDataAccountService.save(ruleDataAccount);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param ruleDataAccount
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-编辑", notes="规则账户清洗数据-编辑")
+	@PutMapping(value = "/edit")
+	public Result<RuleDataAccount> edit(@RequestBody RuleDataAccount ruleDataAccount) {
+		Result<RuleDataAccount> result = new Result<>();
+		RuleDataAccount ruleDataAccountEntity = ruleDataAccountService.getById(ruleDataAccount.getId());
+		if(ruleDataAccountEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = ruleDataAccountService.updateById(ruleDataAccount);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-通过id删除", notes="规则账户清洗数据-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			ruleDataAccountService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-批量删除", notes="规则账户清洗数据-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<RuleDataAccount> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<RuleDataAccount> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.ruleDataAccountService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则账户清洗数据-通过id查询", notes="规则账户清洗数据-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<RuleDataAccount> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<RuleDataAccount> result = new Result<>();
+		RuleDataAccount ruleDataAccount = ruleDataAccountService.getById(id);
+		if(ruleDataAccount==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(ruleDataAccount);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+  /**
+      * 导出excel
+   *
+   * @param request
+   * @param response
+   */
+  @RequestMapping(value = "/exportXls")
+  public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+      // Step.1 组装查询条件
+      QueryWrapper<RuleDataAccount> queryWrapper = null;
+      try {
+          String paramsStr = request.getParameter("paramsStr");
+          if (oConvertUtils.isNotEmpty(paramsStr)) {
+              String deString = URLDecoder.decode(paramsStr, "UTF-8");
+              RuleDataAccount ruleDataAccount = JSON.parseObject(deString, RuleDataAccount.class);
+              queryWrapper = QueryGenerator.initQueryWrapper(ruleDataAccount, request.getParameterMap());
+          }
+      } catch (UnsupportedEncodingException e) {
+          e.printStackTrace();
+      }
+
+      //Step.2 AutoPoi 导出Excel
+      ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+      List<RuleDataAccount> pageList = ruleDataAccountService.list(queryWrapper);
+      //导出文件名称
+      mv.addObject(NormalExcelConstants.FILE_NAME, "规则账户清洗数据列表");
+      mv.addObject(NormalExcelConstants.CLASS, RuleDataAccount.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<RuleDataAccount> listRuleDataAccounts = ExcelImportUtil.importExcel(file.getInputStream(), RuleDataAccount.class, params);
+              ruleDataAccountService.saveBatch(listRuleDataAccounts);
+              return Result.ok("文件导入成功!数据行数:" + listRuleDataAccounts.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("文件导入失败!");
+  }
+
+}

+ 150 - 0
module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataCreativeController.java

@@ -0,0 +1,150 @@
+package cn.com.ctop.common.module.controller;
+
+import cn.com.ctop.common.module.entity.RuleDataCreative;
+import cn.com.ctop.common.module.service.IRuleDataCreativeService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+ /**
+ * 规则创意清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="规则创意清洗数据")
+@RestController
+@RequestMapping("/ctop/rule/creative")
+public class RuleDataCreativeController {
+	@Autowired
+	private IRuleDataCreativeService ruleDataCreativeService;
+
+	/**
+	  * 分页列表查询
+	 * @param ruleDataCreative
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-分页列表查询", notes="规则创意清洗数据-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<RuleDataCreative>> queryPageList(RuleDataCreative ruleDataCreative,
+														 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														 HttpServletRequest req) {
+		Result<IPage<RuleDataCreative>> result = new Result<>();
+		QueryWrapper<RuleDataCreative> queryWrapper = QueryGenerator.initQueryWrapper(ruleDataCreative, req.getParameterMap());
+		Page<RuleDataCreative> page = new Page<>(pageNo, pageSize);
+		IPage<RuleDataCreative> pageList = ruleDataCreativeService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param ruleDataCreative
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-添加", notes="规则创意清洗数据-添加")
+	@PostMapping(value = "/add")
+	public Result<RuleDataCreative> add(@RequestBody RuleDataCreative ruleDataCreative) {
+		Result<RuleDataCreative> result = new Result<>();
+		try {
+			ruleDataCreativeService.save(ruleDataCreative);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param ruleDataCreative
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-编辑", notes="规则创意清洗数据-编辑")
+	@PutMapping(value = "/edit")
+	public Result<RuleDataCreative> edit(@RequestBody RuleDataCreative ruleDataCreative) {
+		Result<RuleDataCreative> result = new Result<RuleDataCreative>();
+		RuleDataCreative ruleDataCreativeEntity = ruleDataCreativeService.getById(ruleDataCreative.getId());
+		if(ruleDataCreativeEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = ruleDataCreativeService.updateById(ruleDataCreative);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-通过id删除", notes="规则创意清洗数据-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			ruleDataCreativeService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-批量删除", notes="规则创意清洗数据-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<RuleDataCreative> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<RuleDataCreative> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.ruleDataCreativeService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则创意清洗数据-通过id查询", notes="规则创意清洗数据-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<RuleDataCreative> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<RuleDataCreative> result = new Result<>();
+		RuleDataCreative ruleDataCreative = ruleDataCreativeService.getById(id);
+		if(ruleDataCreative==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(ruleDataCreative);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+}

+ 150 - 0
module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataPlanController.java

@@ -0,0 +1,150 @@
+package cn.com.ctop.common.module.controller;
+
+import cn.com.ctop.common.module.entity.RuleDataPlan;
+import cn.com.ctop.common.module.service.IRuleDataPlanService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+ /**
+ * 规则计划清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="规则计划清洗数据")
+@RestController
+@RequestMapping("/ctop/rule/plan")
+public class RuleDataPlanController {
+	@Autowired
+	private IRuleDataPlanService ruleDataPlanService;
+
+	/**
+	  * 分页列表查询
+	 * @param ruleDataPlan
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-分页列表查询", notes="规则计划清洗数据-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<RuleDataPlan>> queryPageList(RuleDataPlan ruleDataPlan,
+													 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+													 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+													 HttpServletRequest req) {
+		Result<IPage<RuleDataPlan>> result = new Result<>();
+		QueryWrapper<RuleDataPlan> queryWrapper = QueryGenerator.initQueryWrapper(ruleDataPlan, req.getParameterMap());
+		Page<RuleDataPlan> page = new Page<>(pageNo, pageSize);
+		IPage<RuleDataPlan> pageList = ruleDataPlanService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param ruleDataPlan
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-添加", notes="规则计划清洗数据-添加")
+	@PostMapping(value = "/add")
+	public Result<RuleDataPlan> add(@RequestBody RuleDataPlan ruleDataPlan) {
+		Result<RuleDataPlan> result = new Result<>();
+		try {
+			ruleDataPlanService.save(ruleDataPlan);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param ruleDataPlan
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-编辑", notes="规则计划清洗数据-编辑")
+	@PutMapping(value = "/edit")
+	public Result<RuleDataPlan> edit(@RequestBody RuleDataPlan ruleDataPlan) {
+		Result<RuleDataPlan> result = new Result<>();
+		RuleDataPlan ruleDataPlanEntity = ruleDataPlanService.getById(ruleDataPlan.getId());
+		if(ruleDataPlanEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = ruleDataPlanService.updateById(ruleDataPlan);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-通过id删除", notes="规则计划清洗数据-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			ruleDataPlanService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-批量删除", notes="规则计划清洗数据-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<RuleDataPlan> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<RuleDataPlan> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.ruleDataPlanService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则计划清洗数据-通过id查询", notes="规则计划清洗数据-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<RuleDataPlan> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<RuleDataPlan> result = new Result<>();
+		RuleDataPlan ruleDataPlan = ruleDataPlanService.getById(id);
+		if(ruleDataPlan==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(ruleDataPlan);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+}

+ 150 - 0
module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataTargetController.java

@@ -0,0 +1,150 @@
+package cn.com.ctop.common.module.controller;
+
+import cn.com.ctop.common.module.entity.RuleDataTarget;
+import cn.com.ctop.common.module.service.IRuleDataTargetService;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+ /**
+ * 规则定向清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="规则定向清洗数据")
+@RestController
+@RequestMapping("/ctop/rule/target")
+public class RuleDataTargetController {
+	@Autowired
+	private IRuleDataTargetService ruleDataTargetService;
+
+	/**
+	  * 分页列表查询
+	 * @param ruleDataTarget
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-分页列表查询", notes="规则定向清洗数据-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<RuleDataTarget>> queryPageList(RuleDataTarget ruleDataTarget,
+													   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+													   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+													   HttpServletRequest req) {
+		Result<IPage<RuleDataTarget>> result = new Result<>();
+		QueryWrapper<RuleDataTarget> queryWrapper = QueryGenerator.initQueryWrapper(ruleDataTarget, req.getParameterMap());
+		Page<RuleDataTarget> page = new Page<RuleDataTarget>(pageNo, pageSize);
+		IPage<RuleDataTarget> pageList = ruleDataTargetService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param ruleDataTarget
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-添加", notes="规则定向清洗数据-添加")
+	@PostMapping(value = "/add")
+	public Result<RuleDataTarget> add(@RequestBody RuleDataTarget ruleDataTarget) {
+		Result<RuleDataTarget> result = new Result<>();
+		try {
+			ruleDataTargetService.save(ruleDataTarget);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param ruleDataTarget
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-编辑", notes="规则定向清洗数据-编辑")
+	@PutMapping(value = "/edit")
+	public Result<RuleDataTarget> edit(@RequestBody RuleDataTarget ruleDataTarget) {
+		Result<RuleDataTarget> result = new Result<RuleDataTarget>();
+		RuleDataTarget ruleDataTargetEntity = ruleDataTargetService.getById(ruleDataTarget.getId());
+		if(ruleDataTargetEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = ruleDataTargetService.updateById(ruleDataTarget);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-通过id删除", notes="规则定向清洗数据-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			ruleDataTargetService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-批量删除", notes="规则定向清洗数据-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<RuleDataTarget> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<RuleDataTarget> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.ruleDataTargetService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="规则定向清洗数据-通过id查询", notes="规则定向清洗数据-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<RuleDataTarget> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<RuleDataTarget> result = new Result<>();
+		RuleDataTarget ruleDataTarget = ruleDataTargetService.getById(id);
+		if(ruleDataTarget==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(ruleDataTarget);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+}

+ 77 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataAccount.java

@@ -0,0 +1,77 @@
+package cn.com.ctop.common.module.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 规则账户清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_rule_data_account")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_rule_data_account对象", description="规则账户清洗数据")
+public class RuleDataAccount {
+
+	/**id*/
+    @ApiModelProperty(value = "id")
+	private Long id;
+	/**账户id*/
+	@Excel(name = "账户id", width = 15)
+    @ApiModelProperty(value = "账户id")
+	private Long accountId;
+	/**账户name*/
+	@Excel(name = "账户id", width = 15)
+	@ApiModelProperty(value = "账户id")
+	private String accountName;
+	/**消耗*/
+	@Excel(name = "消耗", width = 15)
+    @ApiModelProperty(value = "消耗")
+	private BigDecimal cost;
+	/**validBalance*/
+	@Excel(name = "validBalance", width = 15)
+    @ApiModelProperty(value = "validBalance")
+	private BigDecimal validBalance;
+	/**转化数*/
+	@Excel(name = "转化数", width = 15)
+    @ApiModelProperty(value = "转化数")
+	private Long convertNum;
+	/**转化成本*/
+	@Excel(name = "转化成本", width = 15)
+    @ApiModelProperty(value = "转化成本")
+	private BigDecimal convertCost;
+	/**次留数*/
+	@Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+	private Long nextDayOpenNum;
+	/**nextDayOpenCost*/
+	@Excel(name = "nextDayOpenCost", width = 15)
+    @ApiModelProperty(value = "nextDayOpenCost")
+	private BigDecimal nextDayOpenCost;
+
+	private BigDecimal nextDayOpenRate;
+
+	/**status*/
+	@Excel(name = "status", width = 15)
+    @ApiModelProperty(value = "status")
+	private Integer status;
+	/**createTime*/
+    @ApiModelProperty(value = "createTime")
+	private Date createTime;
+	/**updateTime*/
+    @ApiModelProperty(value = "updateTime")
+	private Date updateTime;
+}

+ 41 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataCreative.java

@@ -0,0 +1,41 @@
+package cn.com.ctop.common.module.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * 规则创意清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_rule_data_creative")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_rule_data_creative对象", description="规则创意清洗数据")
+public class RuleDataCreative {
+
+	@TableId
+	private Long id;
+	private Long accountId;
+	private String accountName;
+	private Long planId;
+	private String planName;
+	private Long creativeId;
+	private Integer presentedVideo;
+	private String creativeTitle;
+	private String source;
+	private Integer status;
+	private Date createTime;
+	private Date updateTime;
+
+	public RuleDataCreative() {
+	}
+}

+ 93 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataPlan.java

@@ -0,0 +1,93 @@
+package cn.com.ctop.common.module.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 规则计划清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_rule_data_plan")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_rule_data_plan对象", description="规则计划清洗数据")
+public class RuleDataPlan {
+
+	@TableId
+	private Long id;
+	private Long accountId;
+	private String accountName;
+	private Long planId;
+	private String planName;
+	private String externalUrl;
+	private String downloadUrl;
+	private BigDecimal cost;
+	private Long convertNum;
+	private BigDecimal convertCost;
+	private BigDecimal nextDayOpenRate;
+	private BigDecimal nextDayOpenCost;
+	private Long nextDayOpen;
+	private String pricing;
+	private BigDecimal budget;
+	private Integer status;
+	private BigDecimal cpaBid;
+	private BigDecimal deepCpabid;
+	private Date createTime;
+	private Date updateTime;
+
+	public RuleDataPlan() {
+	}
+
+	public RuleDataPlan(JSONObject data, Long accountId) {
+		Long nextDayOpen = data.getLong("attribution_next_day_open_cnt");
+		if (null != nextDayOpen) {
+			this.nextDayOpen = nextDayOpen;
+		}
+		Long convert = data.getLong("convert");
+		if (null != convert) {
+			this.convertNum = convert;
+		}
+		BigDecimal nextDayOpenCost = data.getBigDecimal("attribution_next_day_open_cost");
+		if (null != nextDayOpenCost) {
+			this.nextDayOpenCost = nextDayOpenCost;
+		}
+
+		BigDecimal nextDayOpenRate = data.getBigDecimal("attribution_next_day_open_rate");
+		if (null != nextDayOpenRate) {
+			this.nextDayOpenRate = nextDayOpenRate;
+		}
+		this.accountId = accountId;
+		BigDecimal cost = data.getBigDecimal("cost");
+		if (null != cost) {
+			this.cost = cost;
+		}
+		BigDecimal convertCost = data.getBigDecimal("convert_cost");
+		if (null != convertCost) {
+			this.convertCost = convertCost;
+		}
+		String adName = data.getString("ad_name");
+		if (null != adName) {
+			this.planName = adName;
+		}
+		Long adId = data.getLong("ad_id");
+		this.id = adId;
+		this.planId = adId;
+		this.createTime = new Date();
+		this.updateTime = new Date();
+	}
+
+
+
+
+}

+ 77 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java

@@ -0,0 +1,77 @@
+package cn.com.ctop.common.module.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+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 java.util.Date;
+
+/**
+ * 规则定向清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_rule_data_target")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_rule_data_target对象", description="规则定向清洗数据")
+public class RuleDataTarget {
+
+	@TableId
+	private Long id;
+	private Long accountId;
+	private String accountName;
+	private Long planId;
+	private String planName;
+	/**retargetingTagsExclude*/
+	@Excel(name = "retargetingTagsExclude", width = 15)
+    @ApiModelProperty(value = "retargetingTagsExclude")
+	private String retargetingTagsExclude;
+	/**hideIfExists*/
+	@Excel(name = "hideIfExists", width = 15)
+    @ApiModelProperty(value = "hideIfExists")
+	private Integer hideIfExists;
+	/**inventoryType*/
+	@Excel(name = "inventoryType", width = 15)
+    @ApiModelProperty(value = "inventoryType")
+	private String inventoryType;
+	/**district*/
+	@Excel(name = "district", width = 15)
+    @ApiModelProperty(value = "district")
+	private String district;
+	/**gender*/
+	@Excel(name = "gender", width = 15)
+    @ApiModelProperty(value = "gender")
+	private String gender;
+	/**age*/
+	@Excel(name = "age", width = 15)
+    @ApiModelProperty(value = "age")
+	private String age;
+	/**excludeFlowPackage*/
+	@Excel(name = "excludeFlowPackage", width = 15)
+    @ApiModelProperty(value = "excludeFlowPackage")
+	private String excludeFlowPackage;
+	/**platform*/
+	@Excel(name = "platform", width = 15)
+    @ApiModelProperty(value = "platform")
+	private String platform;
+	/**hideIfConverted*/
+	@Excel(name = "hideIfConverted", width = 15)
+    @ApiModelProperty(value = "hideIfConverted")
+	private String hideIfConverted;
+	private String deepBidType;
+	private String scheduleTime;
+	private Integer status;
+	private Date createTime;
+	private Date updateTime;
+
+	public RuleDataTarget() {
+	}
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/entity/UserAllocation.java

@@ -112,6 +112,20 @@ public class UserAllocation implements Serializable {
     private Integer accountStatus;
 
     /**
+     * 检测链接预警
+     * 0 启动
+     * 1 禁用
+     */
+    private Integer monitoringLink;
+
+    /**
+     * 检测链接预警
+     * 0 启动
+     * 1 禁用
+     */
+    private Integer landingPage;
+
+    /**
      * 修改时间
      */
     @Excel(name = "修改时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataAccountMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.mapper;
+
+import cn.com.ctop.common.module.entity.RuleDataAccount;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则账户清洗数据
+ * @author: jeecg-boot
+ * @date:   2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleDataAccountMapper extends BaseMapper<RuleDataAccount> {
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataCreativeMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.mapper;
+
+import cn.com.ctop.common.module.entity.RuleDataCreative;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则创意清洗数据
+ * @author: jeecg-boot
+ * @date:   2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleDataCreativeMapper extends BaseMapper<RuleDataCreative> {
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataPlanMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.mapper;
+
+import cn.com.ctop.common.module.entity.RuleDataPlan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则计划清洗数据
+ * @author: jeecg-boot
+ * @date:   2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleDataPlanMapper extends BaseMapper<RuleDataPlan> {
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataTargetMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.mapper;
+
+import cn.com.ctop.common.module.entity.RuleDataTarget;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 规则定向清洗数据
+ * @author: jeecg-boot
+ * @date:   2020-11-16
+ * @cersion: V1.0
+ */
+public interface RuleDataTargetMapper extends BaseMapper<RuleDataTarget> {
+
+}

+ 112 - 96
module-common/src/main/java/cn/com/ctop/common/module/mapper/SysUserMapper.java

@@ -4,6 +4,7 @@ import cn.com.ctop.common.module.entity.SysUser;
 import cn.com.ctop.common.module.model.SysUserSysDepartModel;
 import cn.com.ctop.common.module.vo.SysUserDepVo;
 import cn.com.ctop.common.module.vo.SysUserVo;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -23,76 +24,85 @@ import java.util.Map;
  * @since 2018-12-20
  */
 public interface SysUserMapper extends BaseMapper<SysUser> {
-	List<SysUser> selectAllUser();
-	/**
-	  * 通过用户账号查询用户信息
-	 * @param username
-	 * @return
-	 */
-	 SysUser getUserByName(@Param("username") String username);
-
-	/**
-	 *  根据部门Id查询用户信息
-	 * @param page
-	 * @param departId
-	 * @return
-	 */
-	IPage<SysUser> getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username);
-
-	/**
-	 *  根据用户Ids,查询用户所属部门名称信息
-	 * @param userIds
-	 * @return
-	 */
-	List<SysUserDepVo> getDepNamesByUserIds(@Param("userIds") List<String> userIds);
-
-	/**
-	 *  根据部门Ids,查询部门下用户信息
-	 * @param page
-	 * @param departIds
-	 * @return
-	 */
-	IPage<SysUser> getUserByDepIds(Page page, @Param("departIds") List<String> departIds, @Param("username") String username);
-
-	/**
-	 * 根据角色Id查询用户信息
-	 * @param page
-	 * @param
-	 * @return
-	 */
-	IPage<SysUser> getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username);
-
-	/**
-	 * 根据用户名设置部门ID
-	 * @param username
-	 * @param orgCode
-	 */
-	void updateUserDepart(@Param("username") String username, @Param("orgCode") String orgCode);
-
-	/**
-	 * 根据手机号查询用户信息
-	 * @param phone
-	 * @return
-	 */
-	SysUser getUserByPhone(@Param("phone") String phone);
-
-
-	/**
-	 * 根据邮箱查询用户信息
-	 * @param email
-	 * @return
-	 */
-	SysUser getUserByEmail(@Param("email") String email);
-
-	/**
-	 * 根据 orgCode 查询用户,包括子部门下的用户
-	 *
-	 * @param page 分页对象, xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
-	 * @param orgCode
-	 * @param userParams 用户查询条件,可为空
-	 * @return
-	 */
-	List<SysUserSysDepartModel> getUserByOrgCode(IPage page, @Param("orgCode") String orgCode, @Param("userParams") SysUser userParams);
+    List<SysUser> selectAllUser();
+
+    /**
+     * 通过用户账号查询用户信息
+     *
+     * @param username
+     * @return
+     */
+    SysUser getUserByName(@Param("username") String username);
+
+    /**
+     * 根据部门Id查询用户信息
+     *
+     * @param page
+     * @param departId
+     * @return
+     */
+    IPage<SysUser> getUserByDepId(Page page, @Param("departId") String departId, @Param("username") String username);
+
+    /**
+     * 根据用户Ids,查询用户所属部门名称信息
+     *
+     * @param userIds
+     * @return
+     */
+    List<SysUserDepVo> getDepNamesByUserIds(@Param("userIds") List<String> userIds);
+
+    /**
+     * 根据部门Ids,查询部门下用户信息
+     *
+     * @param page
+     * @param departIds
+     * @return
+     */
+    IPage<SysUser> getUserByDepIds(Page page, @Param("departIds") List<String> departIds, @Param("username") String username);
+
+    /**
+     * 根据角色Id查询用户信息
+     *
+     * @param page
+     * @param
+     * @return
+     */
+    IPage<SysUser> getUserByRoleId(Page page, @Param("roleId") String roleId, @Param("username") String username);
+
+    /**
+     * 根据用户名设置部门ID
+     *
+     * @param username
+     * @param orgCode
+     */
+    void updateUserDepart(@Param("username") String username, @Param("orgCode") String orgCode);
+
+    /**
+     * 根据手机号查询用户信息
+     *
+     * @param phone
+     * @return
+     */
+    SysUser getUserByPhone(@Param("phone") String phone);
+
+
+    /**
+     * 根据邮箱查询用户信息
+     *
+     * @param email
+     * @return
+     */
+    SysUser getUserByEmail(@Param("email") String email);
+
+    /**
+     * 根据 orgCode 查询用户,包括子部门下的用户
+     *
+     * @param page       分页对象, xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
+     * @param orgCode
+     * @param userParams 用户查询条件,可为空
+     * @return
+     */
+    List<SysUserSysDepartModel> getUserByOrgCode(IPage page, @Param("orgCode") String orgCode, @Param("userParams") SysUser userParams);
 
 
     /**
@@ -109,46 +119,52 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      * @Date 2019/12/13 16:10
      * @Description: 批量删除角色与用户关系
      */
-	void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray);
+    void deleteBathRoleUserRelation(@Param("roleIdArray") String[] roleIdArray);
 
     /**
      * @Author scott
      * @Date 2019/12/13 16:10
      * @Description: 批量删除角色与权限关系
      */
-	void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray);
+    void deleteBathRolePermissionRelation(@Param("roleIdArray") String[] roleIdArray);
 
-	/**
-	 * 查询被逻辑删除的用户
-	 */
-	List<SysUser> selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);
+    /**
+     * 查询被逻辑删除的用户
+     */
+    List<SysUser> selectLogicDeleted(@Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);
 
-	/**
-	 * 还原被逻辑删除的用户
-	 */
-	int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUser entity);
+    /**
+     * 还原被逻辑删除的用户
+     */
+    int revertLogicDeleted(@Param("userIds") String userIds, @Param("entity") SysUser entity);
 
-	/**
-	 * 彻底删除被逻辑删除的用户
-	 */
-	int deleteLogicDeleted(@Param("userIds") String userIds);
+    /**
+     * 彻底删除被逻辑删除的用户
+     */
+    int deleteLogicDeleted(@Param("userIds") String userIds);
 
-    /** 更新空字符串为null【此写法有sql注入风险,禁止随便用】 */
+    /**
+     * 更新空字符串为null【此写法有sql注入风险,禁止随便用】
+     */
     int updateNullByEmptyString(@Param("fieldName") String fieldName);
 
-	/**
-	 *  根据部门Ids,查询部门下用户信息
-	 * @param departIds
-	 * @return
-	 */
-	List<SysUser> queryByDepIds(@Param("departIds") List<String> departIds, @Param("username") String username);
-	Map<String, Object> queryRoleCode(@Param("userId") String userId);
+    /**
+     * 根据部门Ids,查询部门下用户信息
+     *
+     * @param departIds
+     * @return
+     */
+    List<SysUser> queryByDepIds(@Param("departIds") List<String> departIds, @Param("username") String username);
+
+    Map<String, Object> queryRoleCode(@Param("userId") String userId);
+
+    List<SysUserVo> getAllUser(@Param("userName") String userName);
 
-	List<SysUserVo> getAllUser(@Param("userName") String userName);
+    List<SysUserVo> getUserListByCompany(@Param("companyId") String companyId, @Param("userName") String userName);
 
-	List<SysUserVo> getUserListByCompany(@Param("companyId") String companyId,@Param("userName") String userName);
+    List<SysUserVo> getAllSale();
 
-	List<SysUserVo> getAllSale();
+    List<SysUserVo> getAllSalesByCompanyId(@Param("companyId") String companyId);
 
-	List<SysUserVo> getAllSalesByCompanyId(@Param("companyId") String companyId);
+    JSONObject selectUserByAccount(@Param("accountId") Long accountId);
 }

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java

@@ -27,4 +27,6 @@ public interface UserAllocationMapper extends BaseMapper<UserAllocation> {
     List<JSONObject> getAccountIdListByUserId(@Param("userId") Long userId);
 
     Long getProjectIdByAccountId(@Param("accountId") Long accountId);
+
+    UserAllocation getUserAllocation(@Param("accountId") Long accountId);
 }

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataAccountMapper.xml

@@ -0,0 +1,5 @@
+<?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.common.module.mapper.RuleDataAccountMapper">
+
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataCreativeMapper.xml

@@ -0,0 +1,5 @@
+<?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.common.module.mapper.RuleDataCreativeMapper">
+
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataPlanMapper.xml

@@ -0,0 +1,5 @@
+<?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.common.module.mapper.RuleDataPlanMapper">
+
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataTargetMapper.xml

@@ -0,0 +1,5 @@
+<?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.common.module.mapper.RuleDataTargetMapper">
+
+</mapper>

+ 7 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/SysUserMapper.xml

@@ -242,4 +242,11 @@ SELECT
             and username != #{username}
         </if>
     </select>
+
+    <select id="selectUserByAccount" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT *
+        FROM  sys_user t1
+        INNER JOIN  ctop_user_allocation t2 ON t1.id = t2.user_id
+        WHERE t2.account_id = #{accountId}
+    </select>
 </mapper>

+ 6 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml

@@ -69,5 +69,11 @@
     limit 1
     </select>
 
+    <select id="getUserAllocation" resultType="cn.com.ctop.common.module.entity.UserAllocation">
+    select  *  from  ctop_user_allocation
+    where account_id=#{accountId}
+    limit 1
+    </select>
+
 
 </mapper>

+ 16 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataAccountService.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.common.module.service;
+
+import cn.com.ctop.common.module.entity.RuleDataAccount;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则账户清洗数据
+ * @Author: jeecg-boot
+ * @Date: 2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleDataAccountService extends IService<RuleDataAccount> {
+
+    JSONObject getRuleDataByAccountId(Long accountId);
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataCreativeService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.service;
+
+import cn.com.ctop.common.module.entity.RuleDataCreative;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则创意清洗数据
+ * @Author: jeecg-boot
+ * @Date:   2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleDataCreativeService extends IService<RuleDataCreative> {
+
+}

+ 13 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataPlanService.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.common.module.service;
+
+import cn.com.ctop.common.module.entity.RuleDataPlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则计划清洗数据
+ * @Author: jeecg-boot
+ * @Date:   2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleDataPlanService extends IService<RuleDataPlan> {
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataTargetService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.service;
+
+import cn.com.ctop.common.module.entity.RuleDataTarget;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 规则定向清洗数据
+ * @Author: jeecg-boot
+ * @Date:   2020-11-16
+ * @Version: V1.0
+ */
+public interface IRuleDataTargetService extends IService<RuleDataTarget> {
+
+}

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java

@@ -32,4 +32,6 @@ public interface IUserAllocationService extends IService<UserAllocation> {
     List<JSONObject> getUserIdListByProjectId(Long projectId);
 
     List<JSONObject> getAccountIdListByUserId(Long userId);
+
+    List<UserAllocation> getUserAllocations(String mediaId ,int switchType);
 }

+ 60 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataAccountServiceImpl.java

@@ -0,0 +1,60 @@
+package cn.com.ctop.common.module.service.impl;
+
+import cn.com.ctop.common.module.entity.RuleDataAccount;
+import cn.com.ctop.common.module.entity.RuleDataCreative;
+import cn.com.ctop.common.module.entity.RuleDataPlan;
+import cn.com.ctop.common.module.entity.RuleDataTarget;
+import cn.com.ctop.common.module.mapper.RuleDataAccountMapper;
+import cn.com.ctop.common.module.mapper.RuleDataCreativeMapper;
+import cn.com.ctop.common.module.mapper.RuleDataPlanMapper;
+import cn.com.ctop.common.module.mapper.RuleDataTargetMapper;
+import cn.com.ctop.common.module.service.IRuleDataAccountService;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.enums.NoEn;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 规则账户清洗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-16
+ */
+@Service
+public class RuleDataAccountServiceImpl extends ServiceImpl<RuleDataAccountMapper, RuleDataAccount> implements IRuleDataAccountService {
+
+    @Autowired
+    private RuleDataAccountMapper ruleDataAccountMapper;
+
+    @Autowired
+    private RuleDataPlanMapper ruleDataPlanMapper;
+
+    @Autowired
+    private RuleDataTargetMapper ruleDataTargetMapper;
+
+    @Autowired
+    private RuleDataCreativeMapper ruleDataCreativeMapper;
+
+    @Override
+    public JSONObject getRuleDataByAccountId(Long accountId) {
+        JSONObject obj = new JSONObject();
+        Map<String, Object> map = new HashMap<>();
+        map.put("account_id", accountId);
+        map.put("status", NoEn.NO1.valueInt());
+        List<RuleDataAccount> ruleDataAccounts = ruleDataAccountMapper.selectByMap(map);
+        obj.put("account", ruleDataAccounts);
+        List<RuleDataPlan> ruleDataPlans = ruleDataPlanMapper.selectByMap(map);
+        obj.put("plan", ruleDataPlans);
+        List<RuleDataTarget> ruleDataTargets = ruleDataTargetMapper.selectByMap(map);
+        obj.put("target", ruleDataTargets);
+        List<RuleDataCreative> ruleDataCreatives = ruleDataCreativeMapper.selectByMap(map);
+        obj.put("creative", ruleDataCreatives);
+        return obj;
+    }
+}

+ 18 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataCreativeServiceImpl.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.common.module.service.impl;
+
+import cn.com.ctop.common.module.entity.RuleDataCreative;
+import cn.com.ctop.common.module.mapper.RuleDataCreativeMapper;
+import cn.com.ctop.common.module.service.IRuleDataCreativeService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 规则创意清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Service
+public class RuleDataCreativeServiceImpl extends ServiceImpl<RuleDataCreativeMapper, RuleDataCreative> implements IRuleDataCreativeService {
+
+}

+ 20 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataPlanServiceImpl.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.common.module.service.impl;
+
+import cn.com.ctop.common.module.entity.RuleDataPlan;
+import cn.com.ctop.common.module.mapper.RuleDataPlanMapper;
+import cn.com.ctop.common.module.service.IRuleDataPlanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 规则计划清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Service
+public class RuleDataPlanServiceImpl extends ServiceImpl<RuleDataPlanMapper, RuleDataPlan> implements IRuleDataPlanService {
+}

+ 18 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataTargetServiceImpl.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.common.module.service.impl;
+
+import cn.com.ctop.common.module.entity.RuleDataTarget;
+import cn.com.ctop.common.module.mapper.RuleDataTargetMapper;
+import cn.com.ctop.common.module.service.IRuleDataTargetService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 规则定向清洗数据
+ * @author jeecg-boot
+ * @date   2020-11-16
+ * @version V1.0
+ */
+@Service
+public class RuleDataTargetServiceImpl extends ServiceImpl<RuleDataTargetMapper, RuleDataTarget> implements IRuleDataTargetService {
+
+}

+ 10 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java

@@ -119,4 +119,14 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
     public List<JSONObject> getAccountIdListByUserId(Long userId) {
         return userAllocationMapper.getAccountIdListByUserId(userId);
     }
+
+    @Override
+    public List<UserAllocation> getUserAllocations(String mediaId, int switchType) {
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("media_id", mediaId);
+        queryWrapper.eq("account_status", 0);
+        queryWrapper.eq("monitoring_link", 0);
+        queryWrapper.orderByDesc("create_time");
+        return this.list(queryWrapper);
+    }
 }

+ 5 - 0
module-job-bytedance/pom.xml

@@ -69,6 +69,11 @@
         </dependency>
         <dependency>
             <groupId>cn.com.ctop</groupId>
+            <artifactId>module-alarm</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.ctop</groupId>
             <artifactId>module-kuaishou</artifactId>
             <version>2.0.2</version>
         </dependency>

+ 28 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java

@@ -0,0 +1,28 @@
+package cn.com.ctop.job.bytedance.handler;
+
+
+import cn.com.ctop.alarm.modules.service.IRuleGroupService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AlarmRuleJob {
+    @Autowired
+    private IRuleGroupService ruleGroupService;
+
+    /**
+     * 定时任务
+     *
+     * @param
+     * @return
+     * @throws
+     * @author ZHAOXA
+     */
+    @XxlJob("alarmRuleJob")
+    public ReturnT<String> execute(String params) throws Exception {
+        ruleGroupService.checkRules();
+        return ReturnT.SUCCESS;
+    }
+}

+ 6 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceCheckAccountLandingPageJob.java

@@ -0,0 +1,6 @@
+package cn.com.ctop.job.bytedance.handler;
+
+public class ByteDanceCheckAccountLandingPageJob {
+
+
+}

+ 120 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceCheckAccountMonitoringLinkJob.java

@@ -0,0 +1,120 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.ISendMessageService;
+import cn.com.ctop.common.module.service.IUserAllocationService;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertisePlanService;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeService;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class ByteDanceCheckAccountMonitoringLinkJob {
+
+    @Autowired
+    private IUserAllocationService allocationService;
+    @Autowired
+    private IByteDanceAdvertisePlanService advertisePlanService;
+    @Autowired
+    private IByteDanceCreativeService creativeService;
+    @Autowired
+    private ISendMessageService sendMessageService;
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+
+    @XxlJob("byteDanceCheckAccountMonitoringLinkJob")
+    public ReturnT<String> execute(String param) throws Exception{
+
+        //查询开启监测链接预警的账户
+        //Todo 暂时单线程
+        List<UserAllocation> userAllocations=allocationService.getUserAllocations("1",0);
+        userAllocations.forEach(userAllocation->{
+            List<ByteDanceAdvertisePlan> plans = advertisePlanService.getAllPlans(userAllocation.getAccountId(), DateUtils.formatDate(new Date()));
+            if(null!=plans&&!plans.isEmpty()){
+                for (ByteDanceAdvertisePlan plan:plans) {
+                    Map<String, Object> creativeDetail = creativeService.getCreativeDetail(oauthTokenService.getTokenByAccountId(userAllocation.getAccountId()), plan.getId());
+                    if(null!=creativeDetail.get("data")){
+                        JSONObject data = (JSONObject) creativeDetail.get("data");
+                        checkMonitorLink(data,plan,userAllocation);
+                    }
+                }
+            }
+        });
+        XxlJobLogger.log("监测链接检查完成");
+        return ReturnT.SUCCESS;
+    }
+
+    private void checkMonitorLink(JSONObject data, ByteDanceAdvertisePlan plan, UserAllocation allocation) {
+        String downloadUrl = plan.getDownloadUrl();
+        boolean errorflag = false;
+        String errorMsg = "";
+        String token = plan.getName().split("-")[0];
+        if(null!=token&& "衍生计划".equals(token)){
+            token = plan.getName().split("-")[1];
+        }
+        String tokenInfo = "surl_token="+token;
+        String appType = plan.getAppType();
+
+        if(null!=downloadUrl){
+            if("APP_IOS".equals(appType)){
+                if(!downloadUrl.contains("https://apps.apple.com/cn/app")){
+                    errorMsg+= "应用下载链接填写异常;";
+                    errorflag = true;
+                }
+            }
+            if("APP_ANDROID".equals(appType)){
+                if(!downloadUrl.contains(token)){
+                    errorMsg+= "应用下载链接填写异常;";
+                    errorflag = true;
+                }
+            }
+        }
+        //展示监测链接
+        String trackUrl = data.getString("trackUrl");
+        if(null!=trackUrl&&!"".equals(trackUrl.trim())){
+            if(!trackUrl.contains(tokenInfo)){
+                errorMsg+= "展示监测链接填写异常;";
+                errorflag = true;
+            }
+        }
+        //点击监测链接
+        String actionTrackUrl = data.getString("actionTrackUrl");
+        if(null!=actionTrackUrl&&!"".equals(actionTrackUrl.trim())){
+            if("APP_IOS".equals(appType)){
+                if(!actionTrackUrl.contains(tokenInfo)||!actionTrackUrl.contains("app_platform=ios")){
+                    errorMsg+= "点击监测链接填写异常;";
+                    errorflag = true;
+                }
+            }
+            if("APP_ANDROID".equals(appType)){
+                if(!actionTrackUrl.contains(tokenInfo)||!actionTrackUrl.contains("tt/")){
+                    errorMsg+= "点击监测链接填写异常;";
+                    errorflag = true;
+                }
+            }
+        }
+        //视频有效播放监测链接
+        String videoPlayEffectiveTrackUrl = data.getString("videoPlayEffectiveTrackUrl");
+        if(null!=videoPlayEffectiveTrackUrl&&!"".equals(videoPlayEffectiveTrackUrl.trim())){
+            if(!videoPlayEffectiveTrackUrl.contains(tokenInfo)){
+                errorMsg+= "视频有效播放监测链接填写异常;";
+                errorflag = true;
+            }
+        }
+        if(errorflag){
+            sendMessage(allocation,"警告:账户:"+allocation.getAuthName()+"(id:"+allocation.getAccountId()+")下的广告计划:"+plan.getName()+"(id:"+plan.getId()+")"+"监测链接异常>>"+errorMsg);
+        }
+    }
+    private void sendMessage(UserAllocation allocation, String errorMsg) {
+        sendMessageService.sendMessage(allocation.getUserId(),errorMsg);
+    }
+}

+ 33 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDancePlanRuleDataJob.java

@@ -0,0 +1,33 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.CtopAdConstant;
+import cn.com.ctop.toutiao.modules.report.service.IReportService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class ByteDancePlanRuleDataJob {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IReportService reportService;
+
+    @XxlJob("bytedancePlanLoadJob")
+    public ReturnT<String> execute(String param) throws Exception {
+        Date date = new Date();
+        if(null!=param&&!"".equals(param.trim())){
+            Long accountId = Long.parseLong(param);
+            CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+            reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+        }
+        XxlJobLogger.log("头条计划数据清洗完成:accountId=>{}",param);
+        return ReturnT.SUCCESS;
+    }
+}

+ 6 - 1
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceMonitoringLinksCheckJob.java

@@ -1,7 +1,9 @@
 package cn.com.ctop.job.bytedance.handler;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.Project;
 import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.service.IProjectService;
 import cn.com.ctop.common.module.service.ISendMessageService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
@@ -32,6 +34,8 @@ public class BytedanceMonitoringLinksCheckJob {
     private ISendMessageService sendMessageService;
     @Autowired
     private IProjectService projectService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
 
     @XxlJob("bytedanceMonitoringLinksCheckJob")
     public ReturnT<String> execute(String param) throws Exception{
@@ -45,10 +49,11 @@ public class BytedanceMonitoringLinksCheckJob {
                 continue;
             }
             for(UserAllocation allocation:allocations){
+                CtopOauthToken token = tokenService.getTokenByAccountId(allocation.getAccountId());
                 List<ByteDanceAdvertisePlan> plans = advertisePlanService.getAllPlans(allocation.getAccountId(), DateUtils.formatDate(new Date()));
                 if(null!=plans&&!plans.isEmpty()){
                     for (ByteDanceAdvertisePlan plan:plans) {
-                        Map<String, Object> creativeDetail = creativeService.getCreativeDetail(allocation.getAccountId(), plan.getId());
+                        Map<String, Object> creativeDetail = creativeService.getCreativeDetail(token, plan.getId());
                         if(null!=creativeDetail.get("data")){
                             JSONObject data = (JSONObject) creativeDetail.get("data");
                             checkMonitorLink(data,plan,allocation);

+ 46 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceRuleDataJobDistribute.java

@@ -0,0 +1,46 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Component
+public class BytedanceRuleDataJobDistribute {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @XxlJob("bytedancePlanRuleDataJobDistribute")
+    public ReturnT<String> bytedancePlanRuleDataJobDistribute(String params) throws Exception {
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if(null!=tokens&&!tokens.isEmpty()){
+            //TODO 指定相应的任务id
+            String planUrl = "http://139.186.29.76:8090/jobinfo/trigger?id=87&executorParam=";
+            for(CtopOauthToken token:tokens){
+                String planResult = HttpUtils.httpPostRequest(planUrl+token.getAccountId(),new HashMap<>(),new HashMap<>());
+                XxlJobLogger.log("accountId:{};message:{}",token.getAccountId(),planResult);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    @XxlJob("bytedanceAccountRuleDataJobDistribute")
+    public ReturnT<String> bytedanceAccountRuleDataJobDistribute(String params) throws Exception {
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if(null!=tokens&&!tokens.isEmpty()){
+            //TODO
+            String accountUrl = "http://139.186.29.76:8090/jobinfo/trigger?id=87&executorParam=";
+            for(CtopOauthToken token:tokens){
+                String accountResult = HttpUtils.httpPostRequest(accountUrl+token.getAccountId(),new HashMap<>(),new HashMap<>());
+                XxlJobLogger.log("accountId:{};message:{}",token.getAccountId(),accountResult);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+}

+ 40 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/RuleDataAccountCleanJob.java

@@ -0,0 +1,40 @@
+package cn.com.ctop.job.bytedance.handler;
+
+/**
+ *  Created by JQ.bi on 2020.11.16
+ */
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.toutiao.modules.report.service.IRuleByteDanceAccountService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import com.xxl.job.core.log.XxlJobLogger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Component
+public class RuleDataAccountCleanJob {
+
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+
+    @Autowired
+    private IRuleByteDanceAccountService ruleByteDanceAccountService;
+
+    private ExecutorService executorPool = Executors.newFixedThreadPool(6);
+
+    @XxlJob("ruleDataAccountCleanJob")
+    public ReturnT<String> execute(String param) throws Exception {
+        XxlJobLogger.log("规则预警账户维度数据开始清洗");
+        if (null == param || "".equals(param.trim())) {
+            XxlJobLogger.log("参数异常");
+            return ReturnT.FAIL;
+        }
+        Long accountId = Long.parseLong(param);
+        ruleByteDanceAccountService.cleanRuleDataAccount(accountId);
+        XxlJobLogger.log("规则预警账户维度数据清洗结束");
+        return ReturnT.SUCCESS;
+    }
+}

+ 6 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

@@ -3189,6 +3189,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
      */
     @Autowired
     private IKuaiShouVideoGetService videoGetService;
+    static ExecutorService suZhaoService = Executors.newFixedThreadPool(15);
 
     @Override
     public void getSuZaoList(String token, Long accountId, int page, String startDate, String endDate) {
@@ -3253,13 +3254,15 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                     kuaiShouVideoGet.setMaterialType(type);
                 }
                 kuaiShouVideoGetService.saveOrUpdate(kuaiShouVideoGet);
-                Thread thread = new Thread() {
+                suZhaoService.submit(new Runnable() {
                     @Override
                     public void run() {
                         videoGetService.getKeyFrame(token, accountId, md5, String.valueOf(photo_id));
+
                     }
-                };
-                thread.start();
+                });
+
+
             }
         }
 

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

@@ -34,7 +34,7 @@ public class KuaishouAgentAccount {
 	/**accountId*/
 	@Excel(name = "userId", width = 15)
     @ApiModelProperty(value = "userId")
-	private Integer userId;
+	private Long userId;
 	/**accountName*/
 	@Excel(name = "accountName", width = 15)
     @ApiModelProperty(value = "accountName")

+ 12 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceCreativeController.java

@@ -1,6 +1,8 @@
 package cn.com.ctop.toutiao.modules.material.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
 import cn.com.ctop.common.module.utils.StringUtils;
@@ -155,9 +157,18 @@ public class ByteDanceCreativeController {
     @PostMapping("/detail")
     public Map<String,Object>creativeDetail(@RequestParam(name = "planId",required = true,defaultValue = "0") Long planId,
                                             @RequestParam(name = "accountId",required = true,defaultValue = "0") Long accountId){
-        return byteDanceCreativeService.getCreativeDetail(accountId,planId);
+        Map<String,Object>result = new HashMap<>();
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        if(null == token){
+            ResultMapUtils.setResultMap(result,StatusCode.COMMON_PARAM_ERROR);
+            return result;
+        }
+        return byteDanceCreativeService.getCreativeDetail(token,planId);
     }
 
+    @Autowired
+    ICtopOauthTokenService tokenService;
+
     /**
      * 通过id删除
      *

+ 8 - 4
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAdvertisePlan.java

@@ -122,7 +122,8 @@ public class ByteDanceAdvertisePlan {
     // ocpc广告转化出价
     private BigDecimal cpaBid;
 
-    private BigDecimal deepCpaBid;  // 深度优化出价
+    // 深度优化出价
+    private BigDecimal deepCpaBid;
 
     private String deepBidType;
 
@@ -139,6 +140,8 @@ public class ByteDanceAdvertisePlan {
 
     private String convertedTimeDuration;
 
+    private String inventoryType;
+
     // audience
     private String audience;
 
@@ -216,9 +219,6 @@ public class ByteDanceAdvertisePlan {
 
     public ByteDanceAdvertisePlan(JSONObject dataObject, String accountId) {
         this.id = dataObject.getLong("id");
-        if(id == 1680967865840670L||id ==1680968574657556L||id == 1680970557193228L ){
-            System.out.println(dataObject.toJSONString());
-        }
         this.accountId = accountId;
         String name = dataObject.getString("name");
         if (null != name && !"".equals(name.trim())) {
@@ -392,6 +392,10 @@ public class ByteDanceAdvertisePlan {
         if (null != externalUrl && !"".equals(externalUrl.trim())) {
             this.externalUrl = externalUrl;
         }
+        String inventoryType = dataObject.getString("inventory_type");
+        if(null!=inventoryType&&!"".equals(inventoryType.trim())){
+            this.inventoryType  =inventoryType;
+        }
     }
 
     public ByteDanceAdvertisePlan(String advertiserId, Long adId, JSONObject params) {

+ 3 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.toutiao.modules.material.service;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 
@@ -15,6 +16,8 @@ public interface IByteDanceAdvertiserDataService {
 
     Map<String, Object> getAdvertiserInfo(String accountId, String token);
 
+    ByteDanceAdvertisePlan getSinglePlanById(CtopOauthToken token, String id);
+
     Map<String, Object> getAdvertiserPlan(CtopOauthToken token, String ids, String date, String updateDate);
 
     Map<String, Object> getAdvertiserBudget(String accountId);

+ 1 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCreativeService.java

@@ -24,7 +24,7 @@ public interface IByteDanceCreativeService extends IService<ByteDanceCreative> {
 
     void replaceBatch(List<ByteDanceCreative> creatives);
 
-    Map<String, Object> getCreativeDetail(Long accountId, Long planId);
+    Map<String, Object> getCreativeDetail(CtopOauthToken token, Long planId);
 
     Map<String,Object> updateCreative(JSONObject data);
 

+ 33 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java

@@ -156,6 +156,39 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         return new JSONArray();
     }
 
+    @Override
+    public ByteDanceAdvertisePlan getSinglePlanById(CtopOauthToken token, String id){
+        JSONArray getIds = new JSONArray();
+        getIds.add(id);
+        // 请求地址
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_get");
+        // 请求参数
+        Map<String, Object> filtering = new HashMap<>();
+        filtering.put("ids", getIds);
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", token.getAccountId());
+        param.put("page", 1);
+        param.put("page_size", 100);
+        param.put("filtering", filtering);
+        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, param);
+        Integer code = resultObject.getInteger("code");
+        if (null == code || !code.equals(0)) {
+            log.error("获取广告计划信息接口异常==》accountId:{},message:{}", token.getAccountId(), resultObject.getString("message"));
+            return null;
+        }
+        JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+        if (null == data || data.isEmpty()) {
+            return null;
+        }
+        JSONObject dataObject = data.getJSONObject(0);
+        ByteDanceAdvertisePlan advertisePlan = new ByteDanceAdvertisePlan(dataObject, String.valueOf(token.getAccountId()));
+        BigDecimal deepCpabid = dataObject.getBigDecimal("deep_cpabid");
+        if (null != deepCpabid) {
+            advertisePlan.setDeepCpaBid(deepCpabid);
+        }
+        return advertisePlan;
+    }
+
 
     public void getAd(CtopOauthToken token, int pageNum, String ids, String date, String updateDate) {
         JSONArray getIds = null;

+ 6 - 16
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCreativeServiceImpl.java

@@ -1,9 +1,7 @@
 package cn.com.ctop.toutiao.modules.material.service.impl;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
-import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreative;
@@ -37,8 +35,6 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
     @Autowired
     private ByteDanceCreativeMapper creativeMapper;
     @Autowired
-    private IUserAllocationService userAllocationService;
-    @Autowired
     private IByteDanceAdvertisePlanService byteDanceAdvertisePlanService;
 
     /**
@@ -203,26 +199,20 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
      * @return
      */
     @Override
-    public Map<String, Object> getCreativeDetail(Long accountId, Long planId){
+    public Map<String, Object> getCreativeDetail(CtopOauthToken token, Long planId){
         Map<String,Object>resultMap = new HashMap<>();
-        if(null == planId||planId == 0||null == accountId||accountId == 0){
+        if(null == planId||planId == 0||null == token){
             ResultMapUtils.setResultMap(resultMap,StatusCode.COMMON_PARAM_ERROR);
             resultMap.put("data",null);
             return resultMap;
         }
-        UserAllocation allocation = userAllocationService.getByAccountId(accountId);
-        if(null == allocation||allocation.getAccountStatus()!=0){
-            ResultMapUtils.setResultMap(resultMap,StatusCode.BYTEDANCE_PLAN_DATA_NOT_EXIST);
-            resultMap.put("data",null);
-            return resultMap;
-        }
+
         ByteDanceAdvertisePlan plan = byteDanceAdvertisePlanService.getById(planId);
         if(null == plan|| "AD_STATUS_DELETE".equals(plan.getOptStatus())){
             ResultMapUtils.setResultMap(resultMap,StatusCode.BYTEDANCE_ACCOUNT_DATA_NOT_EXIST);
             resultMap.put("data",null);
             return resultMap;
         }
-        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
         // 请求地址
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_read");
         // 请求参数
@@ -238,7 +228,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         Integer code = result.getInteger("code");
         String message = result.getString("message");
         if (null ==  code) {
-            log.info("广告创意获取详情失败,accountId:{},message:{}", accountId, message);
+            log.info("广告创意获取详情失败,accountId:{},message:{}", token.getAccountId(), message);
             resultMap.put("success", false);
             resultMap.put("code", -1);
             result.put("data",null);
@@ -254,7 +244,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
             return resultMap;
         }
         if(code!=0){
-            log.info("广告创意获取详情失败,accountId:{},message:{}", accountId, message);
+            log.info("广告创意获取详情失败,accountId:{},message:{}", token.getAccountId(), message);
             resultMap.put("success", false);
             resultMap.put("code", -1);
             result.put("data",null);
@@ -567,7 +557,7 @@ public class ByteDanceCreativeServiceImpl extends ServiceImpl<ByteDanceCreativeM
         }
         data.remove("adIds");
         data.put("adId",planIdArray.getLong(0));
-        JSONObject detail = (JSONObject) this.getCreativeDetail(accountId,planIdArray.getLong(0)).get("data");
+        JSONObject detail = (JSONObject) this.getCreativeDetail(token,planIdArray.getLong(0)).get("data");
         String modifyTime = detail.getString("modifyTime");
         data.put("modifyTime",modifyTime);
         JSONObject params = initParams(data);

+ 2 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IReportService.java

@@ -16,6 +16,8 @@ public interface IReportService {
 
     void getAdvertiserPlanReport(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePL);
 
+    void getAdvertiserPlanRuleData(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePl);
+
     void getAdvertiserCreativeReport(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePL);
 
     void getMaterialReportByPage(CtopOauthToken token, String startDate, String endDate, Integer pageNum);

+ 7 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IRuleByteDanceAccountService.java

@@ -0,0 +1,7 @@
+package cn.com.ctop.toutiao.modules.report.service;
+
+public interface IRuleByteDanceAccountService {
+
+    void cleanRuleDataAccount(Long accountId);
+
+}

+ 136 - 6
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java

@@ -1,13 +1,15 @@
 package cn.com.ctop.toutiao.modules.report.service.impl;
 
-import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.entity.*;
+import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.common.module.utils.PropertiesUtils;
 import cn.com.ctop.common.module.vo.ByteDanceAdvertiserReportDTO;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAdvertisePlan;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeService;
 import cn.com.ctop.toutiao.modules.report.entity.*;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
 import cn.com.ctop.toutiao.modules.report.service.*;
@@ -97,13 +99,13 @@ public class ReportServiceImpl implements IReportService {
             return;
         }
 
-        for (var i = 0; i < dataArray.size(); i++) {
-            var data = dataArray.getJSONObject(i);
+        for (int i = 0; i < dataArray.size(); i++) {
+            JSONObject data = dataArray.getJSONObject(i);
             if (null != conditions.getTimeGranularity() && conditions.getTimeGranularity().equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
-                var hourlyReport = new BytedanceAdvertiserHourlyReport(data);
+                BytedanceAdvertiserHourlyReport hourlyReport = new BytedanceAdvertiserHourlyReport(data);
                 advertiserHourlyReportService.saveOrUpdate(hourlyReport);
             } else {
-                var dailyReport = new BytedanceAdvertiserDailyReport(data);
+                BytedanceAdvertiserDailyReport dailyReport = new BytedanceAdvertiserDailyReport(data);
                 advertiserDailyReportService.saveOrUpdate(dailyReport);
             }
         }
@@ -146,12 +148,139 @@ public class ReportServiceImpl implements IReportService {
         getCampaignReportByPage(token, conditions, page + 1);
     }
 
+
     @Override
     public void getAdvertiserPlanReport(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePl) {
         var conditions = getReportDTO(token, startDate, endDate, bytedanceReportTypePl);
         getPlanReportByPage(token, conditions, 1);
     }
 
+    @Override
+    public void getAdvertiserPlanRuleData(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePl) {
+        var conditions = getReportDTO(token, startDate, endDate, bytedanceReportTypePl);
+        getPlanRuleDataByPage(token, conditions, 1);
+    }
+
+    private void getPlanRuleDataByPage(CtopOauthToken token, ByteDanceAdvertiserReportDTO conditions, int page) {
+        conditions.setPage(page);
+        var config = new SerializeConfig();
+        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        var jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+
+        JSONObject getObject = getAdStat(token, jsonObject);
+        if (null == getObject) {
+            log.error("广告计划报表数据获取异常=》account:{};message:{}", token.getAccountId(), "返回数据异常");
+            return;
+        }
+        Integer code = getObject.getInteger("code");
+        var message = getObject.getString("message");
+        if (null == code || code != 0) {
+            log.error("广告计划报表数据获取异常=》account:{};message:{}", token.getAccountId(), message);
+            return;
+        }
+        var dataArray = getObject.getJSONObject("data").getJSONArray("list");
+        if (null == dataArray || dataArray.size() <= 0) {
+            return;
+        }
+        UserAllocation allocation = userAllocationService.getByAccountId(token.getAccountId());
+        for (var i = 0; i < dataArray.size(); i++) {
+            var data = dataArray.getJSONObject(i);
+            var ruleDataPlan = new RuleDataPlan(data, token.getAccountId());
+            ruleDataPlan.setAccountName(allocation.getAuthName());
+            ByteDanceAdvertisePlan plan = advertiserDataService.getSinglePlanById(token,ruleDataPlan.getId()+"");
+            if(null!=plan){
+                ruleDataPlan.setBudget(plan.getBudget());
+                ruleDataPlan.setDownloadUrl(plan.getDownloadUrl());
+                ruleDataPlan.setExternalUrl(plan.getExternalUrl());
+                ruleDataPlan.setPricing(plan.getPricing());
+                ruleDataPlan.setCpaBid(plan.getCpaBid());
+                ruleDataPlan.setDeepCpabid(plan.getDeepCpaBid());
+                RuleDataTarget target = new RuleDataTarget();
+                JSONObject audienceObject = JSONObject.parseObject(plan.getAudience());
+                target.setAccountId(token.getAccountId());
+                target.setAccountName(allocation.getAuthName());
+                target.setPlanId(ruleDataPlan.getPlanId());
+                target.setId(ruleDataPlan.getPlanId());
+                target.setCreateTime(new Date());
+                target.setUpdateTime(new Date());
+                if(null!=audienceObject.getString("retargeting_tags_exclude")){
+                    target.setRetargetingTagsExclude(audienceObject.getString("retargeting_tags_exclude"));
+                }
+                target.setHideIfConverted(plan.getHideIfConverted());
+                target.setHideIfExists(plan.getHideIfExists());
+
+                target.setInventoryType(plan.getInventoryType());
+                if(null!=audienceObject.getString("city")){
+                    target.setDistrict(audienceObject.getString("city"));
+                }
+                if(null!=audienceObject.getString("gender")){
+                    target.setGender(audienceObject.getString("gender"));
+                }
+                if(null!=audienceObject.getString("age")){
+                    target.setAge(audienceObject.getString("age"));
+                }
+                if(null!=audienceObject.getString("exclude_flow_package")){
+                    target.setExcludeFlowPackage(audienceObject.getString("exclude_flow_package"));
+                }
+//		this.flowPackage = audience.getString("flow_package");
+                if(null!=audienceObject.getString("platform")){
+                    target.setPlatform(audienceObject.getString("platform"));
+                }
+                target.setDeepBidType(plan.getDeepBidType());
+                target.setScheduleTime(plan.getScheduleTime());
+
+                ruleDataTargetService.saveOrUpdate(target);
+                Map<String, Object> creativeDetail = creativeService.getCreativeDetail(token, plan.getId());
+                if(null!=creativeDetail.get("data")){
+                    JSONObject detail = (JSONObject) creativeDetail.get("data");
+                    formatCreativeData(detail,allocation,ruleDataPlan);
+                }
+            }
+            ruleDataPlanService.saveOrUpdate(ruleDataPlan);
+        }
+        getPlanRuleDataByPage(token, conditions, page + 1);
+    }
+
+    private void formatCreativeData(JSONObject detail, UserAllocation allocation, RuleDataPlan plan) {
+        //广告来源
+        String source = detail.getString("source");
+        Integer isPresentedVideo = detail.getInteger("is_presented_video");
+        JSONArray creatives = detail.getJSONArray("creatives");
+        if(null!=creatives&&!creatives.isEmpty()){
+            for(int i=0;i<creatives.size();i++){
+                JSONObject data = creatives.getJSONObject(i);
+                Long creativeId = data.getLong("creative_id");
+                if(null!=creativeId){
+                    String title = data.getString("title");
+                    RuleDataCreative dataCreative = new RuleDataCreative();
+                    dataCreative.setId(creativeId);
+                    dataCreative.setCreativeId(creativeId);
+                    dataCreative.setCreativeTitle(title);
+                    dataCreative.setPlanId(plan.getId());
+                    dataCreative.setPlanName(plan.getPlanName());
+                    dataCreative.setAccountId(allocation.getAccountId());
+                    dataCreative.setAccountName(allocation.getAuthName());
+                    dataCreative.setSource(source);
+                    dataCreative.setPresentedVideo(isPresentedVideo);
+                    dataCreative.setCreateTime(new Date());
+                    dataCreative.setUpdateTime(new Date());
+                    ruleDataCreativeService.saveOrUpdate(dataCreative);
+                }
+            }
+        }
+    }
+
+    @Autowired
+    private IByteDanceCreativeService creativeService;
+    @Autowired
+    private IUserAllocationService userAllocationService;
+    @Autowired
+    private IRuleDataPlanService ruleDataPlanService;
+    @Autowired
+    private IRuleDataTargetService ruleDataTargetService;
+    @Autowired
+    private IRuleDataCreativeService ruleDataCreativeService;
+
     private void getPlanReportByPage(CtopOauthToken token, ByteDanceAdvertiserReportDTO conditions, int page) {
         conditions.setPage(page);
         var config = new SerializeConfig();
@@ -185,6 +314,7 @@ public class ReportServiceImpl implements IReportService {
                 hourlyReports.add(hourlyReport);
             } else {
                 var dailyReport = new BytedancePlanDailyReport(data, token.getAccountId());
+                //获取计划详情
                 dailyReports.add(dailyReport);
             }
         }

+ 45 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/RuleByteDanceAccountServiceImpl.java

@@ -0,0 +1,45 @@
+package cn.com.ctop.toutiao.modules.report.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.entity.RuleDataAccount;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.service.IRuleDataAccountService;
+import cn.com.ctop.toutiao.modules.report.service.IRuleByteDanceAccountService;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceGetAccountFundService;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RuleByteDanceAccountServiceImpl implements IRuleByteDanceAccountService {
+
+    @Autowired
+    IByteDanceGetAccountFundService byteDanceGetAccountFundService;
+    @Autowired
+    ICtopOauthTokenService oauthTokenService;
+    @Autowired
+    IRuleDataAccountService ruleDataAccountService;
+
+    @Override
+    public void cleanRuleDataAccount(Long accountId) {
+        CtopOauthToken oauthToken=oauthTokenService.getTokenByAccountId(accountId);
+        //查询账户实时数据
+        JSONObject dataAccount=byteDanceGetAccountFundService.getAccountReportBy(oauthToken,accountId);
+        if(!dataAccount.isEmpty()){
+            JSONObject fundData=byteDanceGetAccountFundService.getAccountFundBy(oauthToken,accountId);
+            RuleDataAccount ruleDataAccount=new RuleDataAccount();
+            ruleDataAccount.setId(accountId);
+            ruleDataAccount.setAccountId(accountId);
+            ruleDataAccount.setAccountName(fundData.getString("name"));
+            ruleDataAccount.setCost(dataAccount.getBigDecimal("cost"));
+            ruleDataAccount.setValidBalance(fundData.getBigDecimal("valid_balance"));
+            ruleDataAccount.setConvertNum(dataAccount.getLong("convert"));
+            ruleDataAccount.setConvertCost(dataAccount.getBigDecimal("convert_cost"));
+            ruleDataAccount.setNextDayOpenNum(dataAccount.getLong("next_day_open"));
+            ruleDataAccount.setNextDayOpenCost(dataAccount.getBigDecimal("next_day_open_cost"));
+            ruleDataAccount.setNextDayOpenCost(dataAccount.getBigDecimal("next_day_open_rate"));
+
+            ruleDataAccountService.saveOrUpdate(ruleDataAccount);
+        }
+    }
+}

+ 0 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません