Forráskód Böngészése

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

# Conflicts:
#	module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataAccount.java
jiequan.bi 4 éve
szülő
commit
7bc647caf7
54 módosított fájl, 1680 hozzáadás és 670 törlés
  1. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  2. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java
  3. 27 13
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  4. 199 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java
  5. 140 18
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountTemplateController.java
  6. 53 35
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java
  7. 12 5
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleIndicatorController.java
  8. 52 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java
  9. 1 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleAccountTemplate.java
  10. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleBase.java
  11. 5 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleGroup.java
  12. 1 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/RuleIndicator.java
  13. 90 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/entity/vo/TemplateAppliedVo.java
  14. 3 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleAccountTemplateMapper.java
  15. 4 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/RuleIndicatorMapper.java
  16. 42 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleAccountTemplateMapper.xml
  17. 17 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/mapper/xml/RuleIndicatorMapper.xml
  18. 11 1
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountTemplateService.java
  19. 10 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleIndicatorService.java
  20. 4 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleTemplateService.java
  21. 94 4
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleAccountTemplateServiceImpl.java
  22. 226 106
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  23. 12 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleIndicatorServiceImpl.java
  24. 200 9
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleTemplateServiceImpl.java
  25. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataAccountController.java
  26. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataCreativeController.java
  27. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataPlanController.java
  28. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataTargetController.java
  29. 0 150
      module-common/src/main/java/cn/com/ctop/common/module/controller/RuleDataWasteCostController.java
  30. 7 27
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataCreative.java
  31. 53 41
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataPlan.java
  32. 7 24
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java
  33. 0 55
      module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataWasteCost.java
  34. 0 14
      module-common/src/main/java/cn/com/ctop/common/module/mapper/RuleDataWasteCostMapper.java
  35. 112 96
      module-common/src/main/java/cn/com/ctop/common/module/mapper/SysUserMapper.java
  36. 0 5
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/RuleDataWasteCostMapper.xml
  37. 7 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/SysUserMapper.xml
  38. 3 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataAccountService.java
  39. 0 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataPlanService.java
  40. 0 14
      module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataWasteCostService.java
  41. 35 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataAccountServiceImpl.java
  42. 3 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataPlanServiceImpl.java
  43. 0 18
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataWasteCostServiceImpl.java
  44. 40 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDancePlanRuleDataJob.java
  45. 6 1
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceMonitoringLinksCheckJob.java
  46. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouAgentAccount.java
  47. 12 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceCreativeController.java
  48. 8 4
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceAdvertisePlan.java
  49. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java
  50. 1 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCreativeService.java
  51. 33 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  52. 6 16
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCreativeServiceImpl.java
  53. 2 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IReportService.java
  54. 130 2
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.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");
         //获取加密串

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java

@@ -124,7 +124,7 @@ public class SysBaseApiImpl implements ISysBaseApi {
     }
 
     @Override
-    @Cacheable(cacheNames = CacheConstant.SYS_USERS_CACHE, key = "#username")
+//    @Cacheable(cacheNames = CacheConstant.SYS_USERS_CACHE, key = "#username")
     public LoginUser getUserByName(String username) {
         if (oConvertUtils.isEmpty(username)) {
             return null;

+ 27 - 13
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -118,6 +118,33 @@ public class SampleTest {
         }
     }
 
+    @Test
+    public void testLoadRulePlanData(){
+        Date date = new Date();
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        executorService = Executors.newFixedThreadPool(10);
+        countDownLatch = new CountDownLatch(tokens.size());
+        tokens.forEach(token -> executorService.submit(()->{
+            try {
+                Long start = System.currentTimeMillis();
+                reportService.getAdvertiserPlanRuleData(token,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                Long end = System.currentTimeMillis();
+                log.info("账户数据获取完成:accountId=>{},耗时{}毫秒",token.getAccountId(),end-start);
+            }catch (Exception e){
+                e.printStackTrace();
+            }finally {
+                countDownLatch.countDown();
+            }
+
+        }));
+
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
     @Autowired
     private IUserAllocationService allocationService;
 
@@ -245,19 +272,6 @@ public class SampleTest {
     }
 
 
-
-    @Test
-    public void loadAccountData() {
-//        List<UserAllocation> allocations = allocationService.getByParams(776L,null,0);
-//        for (UserAllocation allocation:allocations) {
-            CtopOauthToken token = tokenService.getTokenByAccountId(93238965516L);
-            for(int i=92;i<100;i++){
-                Date getDate = DateUtils.addDay(new Date(),-i);
-                reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-            }
-//        }
-    }
-
     @Autowired
     IUReportExportService uReportExportService;
     @Autowired

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

@@ -0,0 +1,199 @@
+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) {
+        try {
+            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 {
+                List<String> thresholdArr = strToList(threshold);
+                List<String> values = strToList(value);
+                if ("contain".equals(condition)) {
+                    for (String t : thresholdArr) {
+                        for (String v : values) {
+                            if (v.contains(t)) {
+                                return true;
+                            }
+                        }
+                    }
+                } else {
+                    for (String t : thresholdArr) {
+                        for (String v : values) {
+                            if (!v.contains(t)) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("条件匹配", e);
+        }
+        return false;
+    }
+
+    /**
+     * 整理发送的消息
+     */
+    public static String getMsg(RuleGroup ruleGroup, JSONObject user, Long accountId, Long planId, Long creativeId, boolean isPause) {
+        StringBuffer header = new StringBuffer();
+        header.append(ruleGroup.getGroupName()).append("预警").append("<br/>").
+                append("预警账户:").append(accountId).append("<br/>");
+        if (!Check.isNull(planId) && !Check.isNull(creativeId)) {
+            header.append("预警计划:").append(planId).append("<br/>").append("预警创意:").append(creativeId).append("<br/>");
+        } else if (!Check.isNull(creativeId) && Check.isNull(creativeId)) {
+            header.append("预警计划:").append(planId).append("<br/>");
+        } else if (!Check.isNull(creativeId)) {
+            header.append("预警创意:").append(creativeId).append("<br/>");
+        }
+        if (isPause) {
+            header.append("现已被关停,请您及时查看并调整!");
+        } else {
+            header.append("请您及时查看并调整!");
+        }
+        return header.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("ids格式转换异常", 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;
+
+
+    }
+
+
+}

+ 140 - 18
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleAccountTemplateController.java

@@ -1,18 +1,28 @@
 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;
@@ -31,6 +41,7 @@ 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;
 
@@ -48,6 +59,135 @@ import java.util.Map;
 public class RuleAccountTemplateController {
     @Autowired
     private IRuleAccountTemplateService ruleAccountTemplateService;
+    @Autowired
+    private IRuleTemplateService templateService;
+    @Autowired
+    private IRuleAccountThresholdService accountThresholdService;
+
+    @Autowired
+    private ISysRoleExtService sysRoleService;
+
+    /**
+     * 查询账户下关联的模板
+     *
+     * @param page
+     * @param pageSize
+     * @return
+     */
+    @GetMapping(value = "/getTemplateApplied")
+    public Result<PageInfo<TemplateAppliedVo>> getTemplateApplied(int page, 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(page, 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("删除成功!");
+    }
+
 
     /**
      * 分页列表查询
@@ -134,24 +274,6 @@ public class RuleAccountTemplateController {
         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 {
-            ruleAccountTemplateService.removeById(id);
-        } catch (Exception e) {
-            log.error("删除失败", e.getMessage());
-            return Result.error("删除失败!");
-        }
-        return Result.ok("删除成功!");
-    }
 
     /**
      * 批量删除

+ 53 - 35
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java

@@ -1,9 +1,11 @@
 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;
@@ -34,10 +36,7 @@ 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;
+import java.util.*;
 
 /**
  * 规则组
@@ -57,6 +56,8 @@ public class RuleGroupController {
     private IRuleBaseService ruleBaseService;
     @Autowired
     private IRuleAccountThresholdService ruleAccountThresholdService;
+    @Autowired
+    private IRuleTemplateService ruleTemplateService;
 
 
     /**
@@ -92,6 +93,54 @@ public class RuleGroupController {
 
 
     /**
+     * 通过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
@@ -161,37 +210,6 @@ public class RuleGroupController {
         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);
-                }
-                ruleGroupService.removeById(id);
-            }
-        } catch (Exception e) {
-            log.error("删除失败", e.getMessage());
-            return Result.error("删除失败!");
-        }
-        return Result.ok("删除成功!");
-    }
 
     /**
      * 批量删除

+ 12 - 5
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleIndicatorController.java

@@ -5,6 +5,7 @@ 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;
@@ -52,26 +53,32 @@ public class RuleIndicatorController {
     @AutoLog(value = "规则指标信息-分页列表查询")
     @ApiOperation(value = "规则指标信息-分页列表查询", notes = "规则指标信息-分页列表查询")
     @GetMapping(value = "/list")
-    public Result<JSONObject> queryPageList(RuleIndicator ruleIndicator) {
-        Result<JSONObject> result = new Result<>();
+    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);
-        JSONObject dataJson = new JSONObject();
+        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)) {
-                dataJson.put(dimension, 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(dataJson);
+        result.setResult(dataArr);
         return result;
     }
 

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

@@ -63,6 +63,55 @@ public class RuleTemplateController {
 
 
     /**
+     * 通过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  账户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
@@ -186,6 +235,9 @@ public class RuleTemplateController {
                 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);

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

@@ -44,6 +44,7 @@ public class RuleAccountTemplate {
     @Excel(name = "模板id", width = 15)
     @ApiModelProperty(value = "模板id")
     private Long templateId;
+
     /**
      * createTime
      */

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

@@ -67,6 +67,8 @@ public class RuleBase {
     private String ruleDimension;
 
     private Integer variableType;// 变量类型
+    private Integer judgeFormat;// 判断类型
+    private Integer isUnlimited;//  是否支持不限  true 是 false 否
 
     /**
      * createTime

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

@@ -67,6 +67,11 @@ public class RuleGroup {
      * 规则解释
      */
     private String remark;
+
+
+    private Integer isRequired;//  是否必填  true 是 false 否
+    private Integer isCopy;//  是否可复制  true 是 false 否
+
     /**
      * createTime
      */

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

@@ -56,6 +56,7 @@ public class RuleIndicator {
     @Excel(name = "数据类型", width = 15)
     @ApiModelProperty(value = "数据类型")
     private String dataType;
+    private String modelType;
     /**
      * 数据单位
      */

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

@@ -0,0 +1,90 @@
+package cn.com.ctop.alarm.modules.entity.vo;
+
+public class TemplateAppliedVo {
+    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 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{" +
+                "accountId=" + accountId +
+                ", authName='" + authName + '\'' +
+                ", templateId=" + templateId +
+                ", templateName='" + templateName + '\'' +
+                ", projectId=" + projectId +
+                ", projectName='" + projectName + '\'' +
+                ", userId='" + userId + '\'' +
+                ", userName='" + userName + '\'' +
+                '}';
+    }
+}

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

@@ -1,7 +1,9 @@
 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;
@@ -14,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface RuleAccountTemplateMapper extends BaseMapper<RuleAccountTemplate> {
 
+    List<TemplateAppliedVo> getTemplateApplied(@Param("params") Map<String, Object> requestMap);
 }

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

@@ -2,6 +2,7 @@ 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;
 
 /**
  * 规则指标信息
@@ -12,4 +13,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 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);
 }

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

@@ -2,4 +2,46 @@
 <!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">
+        t1.account_id accountId,SELECT
+        t2.auth_name autnName,
+        t1.template_id templateId,
+        (
+        SELECT
+        template_name
+        FROM
+        ctop_rule_template
+        WHERE
+        id = t1.template_id
+        ) 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 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>

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

@@ -2,4 +2,21 @@
 <!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>

+ 11 - 1
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleAccountTemplateService.java

@@ -1,14 +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
+ * @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);
 }

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

@@ -11,4 +11,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IRuleIndicatorService extends IService<RuleIndicator> {
 
+    String getRuleIndicatorNameByMediaTypeAndDimension(Integer mediaType, String dimension);
+
+    /**
+     * 根据数据维度和指标查询 数据类型
+     *
+     * @param ruleDimension
+     * @param indicatorCode
+     * @return
+     */
+    String getDataTypeByRuleDimensionAndIndicatorCode(String ruleDimension, String indicatorCode);
 }

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

@@ -13,4 +13,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface IRuleTemplateService extends IService<RuleTemplate> {
 
     JSONObject createTemplate(JSONObject requestJson);
+
+    JSONObject queryDetailById(String id) throws Exception;
+
+    JSONObject queryDetailByAccountIdAndTemplateId(Long accountId, Long templateId) throws Exception;
 }

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

@@ -1,19 +1,109 @@
 package cn.com.ctop.alarm.modules.service.impl;
 
-import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+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.IRuleAccountTemplateService;
+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 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 规则模板
+ *
  * @author jeecg-boot
- * @date   2020-11-15
  * @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;
+            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.setRuleId(ruleBase.getId());
+                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);
+    }
 }

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

@@ -1,19 +1,26 @@
 package cn.com.ctop.alarm.modules.service.impl;
 
+import cn.com.ctop.alarm.modules.constant.MatchLogic;
 import cn.com.ctop.alarm.modules.entity.*;
 import cn.com.ctop.alarm.modules.mapper.*;
 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.mapper.SysUserMapper;
+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.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,6 +32,7 @@ import java.util.Map;
  * @version V1.0
  * @date 2020-11-15
  */
+@Slf4j
 @Service
 public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup> implements IRuleGroupService {
 
@@ -41,9 +49,20 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
     @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;
+    private JSONObject userObj = null;
 
     @Override
     public void checkRules() {
@@ -53,12 +72,6 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             log.warn("查询账户绑定过的规则模板失败");
             return;
         }
-        //查询匹配数据
-        List<JSONObject> dataList = getData();
-        if (Check.isNull(dataList)) {
-            log.warn("查询匹配数据失败");
-            return;
-        }
         //获取规则集
         Map<Long, List<RuleGroup>> ruleGroupMap = getRuleGroupMap();
         if (Check.isNull(ruleGroupMap)) {
@@ -72,12 +85,8 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             return;
         }
         for (RuleAccountTemplate templates : ruleAccountTemplates) {
-            for (JSONObject matchData : dataList) {
-                if (templates.getAccountId() == matchData.getLong("accountId")) {
-                    List<RuleGroup> ruleGroups = ruleGroupMap.get(templates.getTemplateId());
-                    matchAlarmRules(ruleGroups, getThreshold(ruleAccountThresholdMapper.selectByAccountId(templates.getAccountId())), matchData, indicators);
-                }
-            }
+            List<RuleGroup> ruleGroups = ruleGroupMap.get(templates.getTemplateId());
+            matchAlarmRules(ruleGroups, getThreshold(ruleAccountThresholdMapper.selectByAccountId(templates.getAccountId())), indicators, templates.getAccountId());
         }
     }
 
@@ -86,92 +95,195 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      *
      * @param ruleGroups   规则集
      * @param thresholdObj 规则id阈值
-     * @param matchData    匹配数据
      * @param indicators   指标码
      * @return void
      * @throws
      * @author ZHAOXA
      */
-    private void matchAlarmRules(List<RuleGroup> ruleGroups, JSONObject thresholdObj, JSONObject matchData, JSONObject indicators) {
+    private void matchAlarmRules(List<RuleGroup> ruleGroups, JSONObject thresholdObj, JSONObject indicators, Long accountId) {
+        userObj = new JSONObject();
+        //查询匹配数据
+        JSONObject matchData = getRuleData(accountId);
+        if (Check.isNull(matchData)) {
+            log.warn("查询匹配数据失败");
+            return;
+        }
+        log.info("已获取账户({})的数据,开始匹配规则", accountId);
         for (RuleGroup ruleGroup : ruleGroups) {
-            String sendType = ruleGroup.getSendType();
-            boolean isPause = "PAUSE".equals(ruleGroup.getOperate());
-            boolean isAllTrue = "and".equals(ruleGroup.getRuleRelationship());
-            boolean flag = true;
             List<RuleBase> ruleBaseList = ruleGroup.getRuleBaseList();
-            for (RuleBase ruleBase : ruleBaseList) {
-                //and关系,全部匹配规则
-                if (isAllTrue) {
-                    if (flag) {
-                        //指标阈值
-                        String threshold = thresholdObj.getString(ruleBase.getId().toString());
-                        //指标对象
-                        JSONObject indicator = indicators.getJSONObject(ruleBase.getIndicatorCode());
-                        flag = checkThreshold(threshold, ruleBase, indicator);
+            if (Check.isNull(ruleBaseList)) {
+                continue;
+            }
+            boolean isBase = "base".equals(ruleGroup.getRuleType());
+            //匹配单规则
+            if (isBase) {
+                RuleBase ruleBase = ruleBaseList.get(0);
+                //指标对象
+                JSONObject indicator = indicators.getJSONObject(ruleBase.getIndicatorCode());
+                //指标阈值
+                String threshold = thresholdObj.getString(ruleBase.getId().toString());
+                //阈值为空时,或者阈值为“unlimited”(不限),不执行该规则
+                if (Check.isNull(threshold) || "unlimited".equals(threshold)) {
+                    log.warn("阈值为空/不限,该规则({})不执行", ruleBase.getId());
+                    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)) {
+                            sendMsg(ruleGroup, obj);
+                        }
+                    }
+                }
+                //匹配组合规则
+            } else {
+                boolean flag = false;
+                //符合规则的数据集
+                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 ("account".equals(ruleBase.getRuleDimension())) {
+                        JSONObject accountEntity = dimensionData.getJSONObject(0);
+                        if (MatchLogic.matchCondition(dataType, ruleBase.getRuleCondition(), threshold, accountEntity.getString(ruleBase.getIndicatorCode()))) {
+                            accountDatas.add(accountEntity);
+                        } else {
+                            log.warn("判断规则组({}),账户规则不符合", ruleGroup.getId());
+                            break;
+                        }
+                    } else if ("plan".equals(ruleBase.getRuleDimension())) {
+                        planDatas = getOKData(planDatas, dimensionData, ruleBase, dataType, threshold);
+                    } else if ("creative".equals(ruleBase.getRuleDimension())) {
+                        creativeDatas = getOKData(creativeDatas, dimensionData, ruleBase, dataType, threshold);
+                    } else if ("target".equals(ruleBase.getRuleDimension())) {
+                        targetDatas = getOKData(targetDatas, dimensionData, ruleBase, dataType, threshold);
                     }
-                } else {
 
                 }
+                //获取达标可发送的数据
+                JSONArray sendData = MatchLogic.getSendData(accountDatas, planDatas, creativeDatas, targetDatas);
+                if (!Check.isNull(sendData)) {
+                    //执行发送
+                    for (int i = 0; i < sendData.size(); i++) {
+                        sendMsg(ruleGroup, sendData.getJSONObject(i));
+                    }
+                }
             }
         }
+    }
 
+    /**
+     * @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 (ruleDatas.size() > 0) {
+            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)) {
+                    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)) {
+                ruleDatas.add(targetEntity);
+            }
+        }
+        return ruleDatas;
     }
 
-    private boolean checkThreshold(String threshold, RuleBase ruleBase, JSONObject indicator) {
-        //条件
-        String condition = ruleBase.getRuleCondition();
-        //指标
-        String indicatorCode = ruleBase.getIndicatorCode();
-        //维度
-        String ruleDimension = ruleBase.getRuleDimension();
+    /**
+     * 发送消息
+     *
+     * @param
+     * @return void
+     * @throws
+     * @author ZHAOXA
+     */
+    private void sendMsg(RuleGroup ruleGroup, JSONObject obj) {
+        Long creativeId = obj.getLong("creativeId");
+        Long planId = obj.getLong("planId");
+        Long accountId = obj.getLong("accountId");
+        JSONObject user = getUserByAccountId(accountId);
+        boolean isPause = "PAUSE".equals(ruleGroup.getOperate());
+        if (isPause) {
+            if (shutDown(accountId, planId, creativeId, user.getString("id"))) {
+                isPause = true;
+            }
+        }
+        String msg = MatchLogic.getMsg(ruleGroup, user, accountId, planId, creativeId, isPause);
+        String sendType = ruleGroup.getSendType();
+        if ("SMS".equals(sendType)) {
+
+        } else if ("EMAIL".equals(sendType)) {
 
-        return true;
-    }
+        } else if ("TEL".equals(sendType)) {
 
-    private boolean check(String type, String condition, String threshold, String value) {
-        if ("number".equals(type)) {
-            BigDecimal bigThr = new BigDecimal(threshold);
-            BigDecimal bigVal = new BigDecimal(value);
-            if ("equal".equals(condition))
-                return bigVal.compareTo(bigThr) == 0;
-            else if ("not_equal".equals(condition))
-                return bigVal.compareTo(bigThr) != 0;
-            else if ("greater".equals(condition))
-                return bigVal.compareTo(bigThr) > 0;
-            else if ("less".equals(condition))
-                return bigVal.compareTo(bigThr) < 0;
-            else if ("greater_equal".equals(condition))
-                return bigVal.compareTo(bigThr) >= 0;
-            else if ("less_equal".equals(condition))
-                return bigVal.compareTo(bigThr) <= 0;
-        } else if ("string".equals(type)) {
-            if ("equal".equals(condition))
-                return value.equals(threshold);
-            else if ("not_equal".equals(condition))
-                return !value.equals(threshold);
-            else if ("contain".equals(condition))
-                return !value.contains(threshold);
-            else if ("no_contain".equals(condition))
-                return !value.contains(threshold);
         } else {
-            String[] strings = threshold.split(",");
-            if ("contain".equals(condition)) {
-                for (String string : strings) {
-                    if (value.contains(string)) {
-                        return true;
-                    }
-                }
-            } else {
-                for (String string : strings) {
-                    if (!value.contains(string)) {
-                        return true;
-                    }
-                }
-            }
+            sendMessageService.sendMessage(user.getString("id"), msg);
         }
-        return false;
     }
 
+    private JSONObject getUserByAccountId(Long accountId) {
+        JSONObject obj = userObj.getJSONObject(accountId.toString());
+        if (Check.isNull(obj)) {
+            JSONObject user = sysUserMapper.selectUserByAccount(accountId);
+            obj.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(List<RuleAccountThreshold> thresholdList) {
@@ -211,44 +323,31 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
         Map<Long, List<RuleGroup>> map = new HashMap<>();
         List<RuleTemplate> ruleTemplates = ruleTemplateMapper.selectByMap(null);
         ruleTemplates.forEach(tem -> {
-            List<String> groupIds = strToList(tem.getGroupIds());
-            if (!Check.isNull(groupIds)) {
-                List<RuleGroup> ruleGroups = ruleGroupMapper.selectBatchIds(groupIds);
-                for (RuleGroup group : ruleGroups) {
-                    List<String> ruleIds = strToList(group.getRuleIds());
-                    if (!Check.isNull(ruleIds)) {
-                        group.setRuleBaseList(ruleBaseMapper.selectBatchIds(ruleIds));
-                    }
-                }
-                map.put(tem.getId(), ruleGroups);
+            QueryWrapper<RuleGroup> groupWrapper = new QueryWrapper<>();
+            groupWrapper.eq("template_id", tem.getId());
+            List<RuleGroup> ruleGroups = ruleGroupMapper.selectList(groupWrapper);
+            for (RuleGroup group : ruleGroups) {
+                QueryWrapper<RuleBase> baseWrapper = new QueryWrapper<>();
+                baseWrapper.eq("group_id", group.getId());
+                baseWrapper.orderByDesc("is_unlimited");
+                group.setRuleBaseList(ruleBaseMapper.selectList(baseWrapper));
             }
+            map.put(tem.getId(), ruleGroups);
         });
         return null;
     }
 
-    //拆分逗号拼接数据
-    private List<String> strToList(String strings) {
-        if (Check.isNull(strings)) {
-            return null;
-        }
-        List<String> ids = new ArrayList<>();
-        String[] idArray = strings.split(",");
-        for (String id : idArray) {
-            ids.add(id);
-        }
-        return ids;
-    }
 
     /**
-     * TODO 获取指标数据
+     * 获取指标数据
      *
      * @param
      * @return java.util.List<org.json.JSONObject>
      * @throws
      * @author ZHAOXA
      */
-    private List<JSONObject> getData() {
-        return null;
+    private JSONObject getRuleData(Long accountId) {
+        return ruleDataAccountService.getRuleDataByAccountId(accountId);
     }
 
     /**
@@ -263,7 +362,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
     public JSONObject createRuleGroup(com.alibaba.fastjson.JSONObject requestJson) {
         JSONObject returnJson = new JSONObject();
         try {
-            String templateId = requestJson.getString("templateId");
+            Long templateId = requestJson.getLong("templateId");
             if (Check.isNull(templateId)) {
                 throw new Exception("请选择需要创建的规则模板id");
             }
@@ -296,15 +395,24 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                     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);
                                 threshold.setRuleId(ruleBase.getId());
-                                // threshold.setThreshoId(ruleDetailJson.getString("threshold"));
                                 ruleAccountThresholdMapper.insert(threshold);  // 默认将新建的规则同步到已应用的账户下
                             }
                         }
@@ -314,11 +422,23 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                 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);
+                    }
+
                     JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
                     groupIds.add(ruleGroup.getId());
                     template.setGroupIds(groupIds.toJSONString());

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

@@ -4,6 +4,7 @@ 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;
 
 /**
@@ -15,5 +16,16 @@ import org.springframework.stereotype.Service;
  */
 @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);
+    }
 }

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

@@ -1,13 +1,9 @@
 package cn.com.ctop.alarm.modules.service.impl;
 
-import cn.com.ctop.alarm.modules.entity.RuleBase;
-import cn.com.ctop.alarm.modules.entity.RuleGroup;
-import cn.com.ctop.alarm.modules.entity.RuleTemplate;
+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.IRuleBaseService;
-import cn.com.ctop.alarm.modules.service.IRuleGroupService;
-import cn.com.ctop.alarm.modules.service.IRuleTemplateService;
+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;
@@ -34,6 +30,15 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
     @Autowired
     private IRuleGroupService ruleGroupService;
 
+    @Autowired
+    private RuleTemplateMapper ruleTemplateMapper;
+
+    @Autowired
+    private IRuleIndicatorService ruleIndicatorService;
+
+    @Autowired
+    private IRuleAccountThresholdService accountThresholdService;
+
     /**
      * 创建规则模板
      *
@@ -42,7 +47,6 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
      */
     @Override
     public JSONObject createTemplate(JSONObject requestJson) {
-        System.err.println(requestJson);
         JSONObject returnJson = new JSONObject();
         try {
             Integer mediaType = requestJson.getInteger("mediaType");
@@ -86,19 +90,22 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
                                 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();
@@ -113,7 +120,6 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
                                 }
                             }
                             groupIds.add(ruleGroup.getId());
-
                         }
                     }
                 }
@@ -146,4 +152,189 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
 
         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(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());
+                QueryWrapper<RuleAccountThreshold> accountThresholdQueryWrapper = new QueryWrapper<>();
+                accountThresholdQueryWrapper.eq("account_id", accountId);
+                accountThresholdQueryWrapper.eq("rule_id", ruleId);
+                RuleAccountThreshold threshold = accountThresholdService.getOne(accountThresholdQueryWrapper);
+                if (!Check.isNull(threshold)) {
+                    ruleJson.put("threshold", threshold.getThreshoId());
+                }
+                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;
+    }
 }

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

@@ -41,7 +41,7 @@ import java.util.Map;
 @Slf4j
 @Api(tags="规则账户清洗数据")
 @RestController
-@RequestMapping("/ctop/ruleDataAccount")
+@RequestMapping("/ctop/rule/account")
 public class RuleDataAccountController {
 	@Autowired
 	private IRuleDataAccountService ruleDataAccountService;

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

@@ -25,7 +25,7 @@ import java.util.Arrays;
 @Slf4j
 @Api(tags="规则创意清洗数据")
 @RestController
-@RequestMapping("/ctop/ruleDataCreative")
+@RequestMapping("/ctop/rule/creative")
 public class RuleDataCreativeController {
 	@Autowired
 	private IRuleDataCreativeService ruleDataCreativeService;

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

@@ -25,7 +25,7 @@ import java.util.Arrays;
 @Slf4j
 @Api(tags="规则计划清洗数据")
 @RestController
-@RequestMapping("/ctop/ruleDataPlan")
+@RequestMapping("/ctop/rule/plan")
 public class RuleDataPlanController {
 	@Autowired
 	private IRuleDataPlanService ruleDataPlanService;

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

@@ -25,7 +25,7 @@ import java.util.Arrays;
 @Slf4j
 @Api(tags="规则定向清洗数据")
 @RestController
-@RequestMapping("/ctop/ruleDataTarget")
+@RequestMapping("/ctop/rule/target")
 public class RuleDataTargetController {
 	@Autowired
 	private IRuleDataTargetService ruleDataTargetService;

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

@@ -1,150 +0,0 @@
-package cn.com.ctop.common.module.controller;
-
-import cn.com.ctop.common.module.entity.RuleDataWasteCost;
-import cn.com.ctop.common.module.service.IRuleDataWasteCostService;
-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/ruleDataWasteCost")
-public class RuleDataWasteCostController {
-	@Autowired
-	private IRuleDataWasteCostService ruleDataWasteCostService;
-
-	/**
-	  * 分页列表查询
-	 * @param ruleDataWasteCost
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	@ApiOperation(value="规则空耗清洗数据-分页列表查询", notes="规则空耗清洗数据-分页列表查询")
-	@GetMapping(value = "/list")
-	public Result<IPage<RuleDataWasteCost>> queryPageList(RuleDataWasteCost ruleDataWasteCost,
-														  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-														  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-														  HttpServletRequest req) {
-		Result<IPage<RuleDataWasteCost>> result = new Result<>();
-		QueryWrapper<RuleDataWasteCost> queryWrapper = QueryGenerator.initQueryWrapper(ruleDataWasteCost, req.getParameterMap());
-		Page<RuleDataWasteCost> page = new Page<RuleDataWasteCost>(pageNo, pageSize);
-		IPage<RuleDataWasteCost> pageList = ruleDataWasteCostService.page(page, queryWrapper);
-		result.setSuccess(true);
-		result.setResult(pageList);
-		return result;
-	}
-
-	/**
-	  *   添加
-	 * @param ruleDataWasteCost
-	 * @return
-	 */
-	@ApiOperation(value="规则空耗清洗数据-添加", notes="规则空耗清洗数据-添加")
-	@PostMapping(value = "/add")
-	public Result<RuleDataWasteCost> add(@RequestBody RuleDataWasteCost ruleDataWasteCost) {
-		Result<RuleDataWasteCost> result = new Result<>();
-		try {
-			ruleDataWasteCostService.save(ruleDataWasteCost);
-			result.success("添加成功!");
-		} catch (Exception e) {
-			log.error(e.getMessage(),e);
-			result.error500("操作失败");
-		}
-		return result;
-	}
-
-	/**
-	  *  编辑
-	 * @param ruleDataWasteCost
-	 * @return
-	 */
-	@ApiOperation(value="规则空耗清洗数据-编辑", notes="规则空耗清洗数据-编辑")
-	@PutMapping(value = "/edit")
-	public Result<RuleDataWasteCost> edit(@RequestBody RuleDataWasteCost ruleDataWasteCost) {
-		Result<RuleDataWasteCost> result = new Result<RuleDataWasteCost>();
-		RuleDataWasteCost ruleDataWasteCostEntity = ruleDataWasteCostService.getById(ruleDataWasteCost.getId());
-		if(ruleDataWasteCostEntity==null) {
-			result.error500("未找到对应实体");
-		}else {
-			boolean ok = ruleDataWasteCostService.updateById(ruleDataWasteCost);
-			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 {
-			ruleDataWasteCostService.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<RuleDataWasteCost> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		Result<RuleDataWasteCost> result = new Result<>();
-		if(ids==null || "".equals(ids.trim())) {
-			result.error500("参数不识别!");
-		}else {
-			this.ruleDataWasteCostService.removeByIds(Arrays.asList(ids.split(",")));
-			result.success("删除成功!");
-		}
-		return result;
-	}
-
-	/**
-	  * 通过id查询
-	 * @param id
-	 * @return
-	 */
-	@ApiOperation(value="规则空耗清洗数据-通过id查询", notes="规则空耗清洗数据-通过id查询")
-	@GetMapping(value = "/queryById")
-	public Result<RuleDataWasteCost> queryById(@RequestParam(name="id",required=true) String id) {
-		Result<RuleDataWasteCost> result = new Result<>();
-		RuleDataWasteCost ruleDataWasteCost = ruleDataWasteCostService.getById(id);
-		if(ruleDataWasteCost==null) {
-			result.error500("未找到对应实体");
-		}else {
-			result.setResult(ruleDataWasteCost);
-			result.setSuccess(true);
-		}
-		return result;
-	}
-}

+ 7 - 27
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataCreative.java

@@ -1,14 +1,11 @@
 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.util.Date;
 
@@ -25,37 +22,20 @@ import java.util.Date;
 @ApiModel(value="ctop_rule_data_creative对象", description="规则创意清洗数据")
 public class RuleDataCreative {
 
-	/**id*/
-	@TableId(type = IdType.AUTO)
+	@TableId
 	private Long id;
-	/**accountId*/
-	@Excel(name = "accountId", width = 15)
-    @ApiModelProperty(value = "accountId")
 	private Long accountId;
-	/**planId*/
-	@Excel(name = "planId", width = 15)
-    @ApiModelProperty(value = "planId")
+	private String accountName;
 	private Long planId;
-	/**creativeId*/
-	@Excel(name = "creativeId", width = 15)
-    @ApiModelProperty(value = "creativeId")
+	private String planName;
 	private Long creativeId;
-	/**presentedVideo*/
-	@Excel(name = "presentedVideo", width = 15)
-    @ApiModelProperty(value = "presentedVideo")
 	private Integer presentedVideo;
-	/**creativeTitle*/
-	@Excel(name = "creativeTitle", width = 15)
-    @ApiModelProperty(value = "creativeTitle")
 	private String creativeTitle;
-	/**source*/
-	@Excel(name = "source", width = 15)
-    @ApiModelProperty(value = "source")
 	private String source;
-	/**createTime*/
-    @ApiModelProperty(value = "createTime")
+	private Integer status;
 	private Date createTime;
-	/**updateTime*/
-    @ApiModelProperty(value = "updateTime")
 	private Date updateTime;
+
+	public RuleDataCreative() {
+	}
 }

+ 53 - 41
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataPlan.java

@@ -1,14 +1,12 @@
 package cn.com.ctop.common.module.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
+import com.alibaba.fastjson.JSONObject;
 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;
@@ -26,54 +24,68 @@ import java.util.Date;
 @ApiModel(value="ctop_rule_data_plan对象", description="规则计划清洗数据")
 public class RuleDataPlan {
 
-	/**id*/
-	@TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "id")
+	@TableId
 	private Long id;
-	/**accountId*/
-	@Excel(name = "accountId", width = 15)
-    @ApiModelProperty(value = "accountId")
 	private Long accountId;
-	/**planId*/
-	@Excel(name = "planId", width = 15)
-    @ApiModelProperty(value = "planId")
+	private String accountName;
 	private Long planId;
-	/**externalUrl*/
-	@Excel(name = "externalUrl", width = 15)
-    @ApiModelProperty(value = "externalUrl")
+	private String planName;
 	private String externalUrl;
-	/**downloadUrl*/
-	@Excel(name = "downloadUrl", width = 15)
-    @ApiModelProperty(value = "downloadUrl")
 	private String downloadUrl;
-	/**cost*/
-	@Excel(name = "cost", width = 15)
-    @ApiModelProperty(value = "cost")
 	private BigDecimal cost;
-	/**convert*/
-	@Excel(name = "convert", width = 15)
-    @ApiModelProperty(value = "convert")
-	private Long convert;
-	/**convertCost*/
-	@Excel(name = "convertCost", width = 15)
-    @ApiModelProperty(value = "convertCost")
+	private Long convertNum;
 	private BigDecimal convertCost;
-	/**nextDayOpenRate*/
-	@Excel(name = "nextDayOpenRate", width = 15)
-    @ApiModelProperty(value = "nextDayOpenRate")
 	private BigDecimal nextDayOpenRate;
-	/**付费方式*/
-	@Excel(name = "付费方式", width = 15)
-    @ApiModelProperty(value = "付费方式")
+	private BigDecimal nextDayOpenCost;
+	private Long nextDayOpen;
 	private String pricing;
-	/**出价*/
-	@Excel(name = "出价", width = 15)
-    @ApiModelProperty(value = "出价")
 	private BigDecimal budget;
-	/**createTime*/
-    @ApiModelProperty(value = "createTime")
+	private Integer status;
 	private Date createTime;
-	/**updateTime*/
-    @ApiModelProperty(value = "updateTime")
 	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();
+	}
+
+
+
+
 }

+ 7 - 24
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataTarget.java

@@ -1,6 +1,5 @@
 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;
@@ -25,18 +24,12 @@ import java.util.Date;
 @ApiModel(value="ctop_rule_data_target对象", description="规则定向清洗数据")
 public class RuleDataTarget {
 
-	/**id*/
-	@TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "id")
+	@TableId
 	private Long id;
-	/**accountId*/
-	@Excel(name = "accountId", width = 15)
-    @ApiModelProperty(value = "accountId")
 	private Long accountId;
-	/**planId*/
-	@Excel(name = "planId", width = 15)
-    @ApiModelProperty(value = "planId")
+	private String accountName;
 	private Long planId;
+	private String planName;
 	/**retargetingTagsExclude*/
 	@Excel(name = "retargetingTagsExclude", width = 15)
     @ApiModelProperty(value = "retargetingTagsExclude")
@@ -49,10 +42,6 @@ public class RuleDataTarget {
 	@Excel(name = "inventoryType", width = 15)
     @ApiModelProperty(value = "inventoryType")
 	private String inventoryType;
-	/**sceneInventory*/
-	@Excel(name = "sceneInventory", width = 15)
-    @ApiModelProperty(value = "sceneInventory")
-	private String sceneInventory;
 	/**district*/
 	@Excel(name = "district", width = 15)
     @ApiModelProperty(value = "district")
@@ -77,18 +66,12 @@ public class RuleDataTarget {
 	@Excel(name = "hideIfConverted", width = 15)
     @ApiModelProperty(value = "hideIfConverted")
 	private String hideIfConverted;
-	/**deepBidType*/
-	@Excel(name = "deepBidType", width = 15)
-    @ApiModelProperty(value = "deepBidType")
 	private String deepBidType;
-	/**scheduleTime*/
-	@Excel(name = "scheduleTime", width = 15)
-    @ApiModelProperty(value = "scheduleTime")
 	private String scheduleTime;
-	/**createTime*/
-    @ApiModelProperty(value = "createTime")
+	private Integer status;
 	private Date createTime;
-	/**updateTime*/
-    @ApiModelProperty(value = "updateTime")
 	private Date updateTime;
+
+	public RuleDataTarget() {
+	}
 }

+ 0 - 55
module-common/src/main/java/cn/com/ctop/common/module/entity/RuleDataWasteCost.java

@@ -1,55 +0,0 @@
-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_waste_cost")
-@EqualsAndHashCode(callSuper = false)
-@Accessors(chain = true)
-@ApiModel(value="ctop_rule_data_waste_cost对象", description="规则空耗清洗数据")
-public class RuleDataWasteCost {
-
-	/**id*/
-	@TableId(type = IdType.AUTO)
-    @ApiModelProperty(value = "id")
-	private Long id;
-	/**accountId*/
-	@Excel(name = "accountId", width = 15)
-    @ApiModelProperty(value = "accountId")
-	private Long accountId;
-	/**planId*/
-	@Excel(name = "planId", width = 15)
-    @ApiModelProperty(value = "planId")
-	private Long planId;
-	/**wasteCost*/
-	@Excel(name = "wasteCost", width = 15)
-    @ApiModelProperty(value = "wasteCost")
-	private BigDecimal wasteCost;
-	/**wasteDay*/
-	@Excel(name = "wasteDay", width = 15)
-    @ApiModelProperty(value = "wasteDay")
-	private Integer wasteDay;
-	/**createTime*/
-    @ApiModelProperty(value = "createTime")
-	private Date createTime;
-	/**updateTime*/
-    @ApiModelProperty(value = "updateTime")
-	private Date updateTime;
-}

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

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

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

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

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

+ 3 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/IRuleDataAccountService.java

@@ -1,14 +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
+ * @Date: 2020-11-16
  * @Version: V1.0
  */
 public interface IRuleDataAccountService extends IService<RuleDataAccount> {
 
+    JSONObject getRuleDataByAccountId(Long accountId);
 }

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

@@ -10,5 +10,4 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @Version: V1.0
  */
 public interface IRuleDataPlanService extends IService<RuleDataPlan> {
-
 }

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

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

+ 35 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataAccountServiceImpl.java

@@ -2,17 +2,51 @@ package cn.com.ctop.common.module.service.impl;
 
 import cn.com.ctop.common.module.entity.RuleDataAccount;
 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.Map;
+
 /**
  * 规则账户清洗数据
+ *
  * @author jeecg-boot
- * @date   2020-11-16
  * @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.valueStr());
+        obj.put("account", ruleDataAccountMapper.selectByMap(map));
+        obj.put("plan", ruleDataPlanMapper.selectByMap(map));
+        obj.put("target", ruleDataTargetMapper.selectByMap(map));
+        obj.put("creative", ruleDataCreativeMapper.selectByMap(map));
+        return obj;
+    }
 }

+ 3 - 1
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RuleDataPlanServiceImpl.java

@@ -4,8 +4,11 @@ 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
@@ -14,5 +17,4 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class RuleDataPlanServiceImpl extends ServiceImpl<RuleDataPlanMapper, RuleDataPlan> implements IRuleDataPlanService {
-
 }

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

@@ -1,18 +0,0 @@
-package cn.com.ctop.common.module.service.impl;
-
-import cn.com.ctop.common.module.entity.RuleDataWasteCost;
-import cn.com.ctop.common.module.mapper.RuleDataWasteCostMapper;
-import cn.com.ctop.common.module.service.IRuleDataWasteCostService;
-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 RuleDataWasteCostServiceImpl extends ServiceImpl<RuleDataWasteCostMapper, RuleDataWasteCost> implements IRuleDataWasteCostService {
-
-}

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

@@ -0,0 +1,40 @@
+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;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Component
+public class ByteDancePlanRuleDataJob {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IReportService reportService;
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
+
+    @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);
+        }else{
+            List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+            tokens.forEach(token -> executorService.submit(() -> reportService.getAdvertiserPlanRuleData(token,date,date, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY)));
+        }
+        XxlJobLogger.log("头条全量计划数据获取完成");
+        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);

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

+ 130 - 2
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.*;
@@ -146,12 +148,137 @@ 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 dailyReport = new RuleDataPlan(data, token.getAccountId());
+            dailyReport.setAccountName(allocation.getAuthName());
+            ByteDanceAdvertisePlan plan = advertiserDataService.getSinglePlanById(token,dailyReport.getId()+"");
+            if(null!=plan){
+                dailyReport.setBudget(plan.getBudget());
+                dailyReport.setDownloadUrl(plan.getDownloadUrl());
+                dailyReport.setExternalUrl(plan.getExternalUrl());
+                dailyReport.setPricing(plan.getPricing());
+                RuleDataTarget target = new RuleDataTarget();
+                JSONObject audienceObject = JSONObject.parseObject(plan.getAudience());
+                target.setAccountId(token.getAccountId());
+                target.setAccountName(allocation.getAuthName());
+                target.setPlanId(dailyReport.getPlanId());
+                target.setId(dailyReport.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,dailyReport);
+                }
+            }
+            ruleDataPlanService.saveOrUpdate(dailyReport);
+        }
+        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 +312,7 @@ public class ReportServiceImpl implements IReportService {
                 hourlyReports.add(hourlyReport);
             } else {
                 var dailyReport = new BytedancePlanDailyReport(data, token.getAccountId());
+                //获取计划详情
                 dailyReports.add(dailyReport);
             }
         }