yumeng 5 years ago
parent
commit
eb5ab7dc20
15 changed files with 639 additions and 368 deletions
  1. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/Project.java
  2. 68 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/AccountCpaBidJob.java
  3. 366 366
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/OceanengineJob.java
  4. 9 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ICpaBidWarningService.java
  5. 138 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CpaBidWarningServiceImpl.java
  6. 1 1
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  7. 1 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/BigDecimalUtil.java
  8. 3 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupMapper.java
  9. 10 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupMapper.xml
  10. 9 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/entity/ByteDanceAdvertisePlan.java
  11. 2 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/mapper/ByteDanceAdvertisePlanMapper.java
  12. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/mapper/xml/ByteDanceAdvertisePlanMapper.xml
  13. 8 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/service/IByteDanceAdvertisePlanService.java
  14. 6 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  15. 1 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/service/impl/ByteDanceAdvertiserDataServiceImpl.java

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/entity/Project.java

@@ -12,6 +12,7 @@ import lombok.experimental.Accessors;
 import org.jeecgframework.poi.excel.annotation.Excel;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -92,6 +93,10 @@ public class Project {
      */
     private Long maxBid;
     /**
+     * 最高深度转化出价
+     */
+    private BigDecimal maxDeepCpaBid;
+    /**
      * 创建时间
      */
     @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")

+ 68 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/AccountCpaBidJob.java

@@ -0,0 +1,68 @@
+package org.jeecg.modules.ctop.job;
+
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.BigDecimalUtil;
+import cn.com.ctop.common.module.utils.Check;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.jeecg.modules.ctop.entity.Project;
+import org.jeecg.modules.ctop.service.ICpaBidWarningService;
+import org.jeecg.modules.ctop.service.IProjectService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 深度转化出价预警
+ */
+public class AccountCpaBidJob implements Job {
+    @Autowired
+    private ICpaBidWarningService cpaBidWarningService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    static ExecutorService executorService = null;
+    @Autowired
+    private IProjectService projectService;
+
+    /**
+     * 出价预警
+     *
+     * @param jobExecutionContext
+     * @throws JobExecutionException
+     */
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) {
+        Thread thread = new Thread() {
+
+
+            @Override
+            public void run() {
+                executorService = Executors.newFixedThreadPool(4);
+                QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
+                List<Project> projects = projectService.list(queryWrapper);
+                if (!Check.isNull(projects)) {
+                    for (Project project : projects) {
+                        if (BigDecimalUtil.compareToDecimal(project.getMaxDeepCpaBid(), new BigDecimal(0)) <= 0) {
+                            continue;
+                        }
+                        executorService.submit(new Runnable() {
+                            @Override
+                            public void run() {
+                                cpaBidWarningService.CpaBidWarning(project);
+                            }
+
+                        });
+                    }
+
+                }
+            }
+        };
+        thread.start();
+
+    }
+}

+ 366 - 366
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/OceanengineJob.java

@@ -1,366 +1,366 @@
-package org.jeecg.modules.ctop.job;
-
-import cn.com.ctop.common.module.utils.Base64Utils;
-import cn.com.ctop.common.module.utils.HttpUtils2;
-import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
-import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
-import cn.com.ctop.crawler.modules.oceanengine.entity.DouyinHot;
-import cn.com.ctop.crawler.modules.oceanengine.entity.EffectCase;
-import cn.com.ctop.crawler.modules.oceanengine.entity.HotMaterial;
-import cn.com.ctop.crawler.modules.oceanengine.service.IDouyinHotService;
-import cn.com.ctop.crawler.modules.oceanengine.service.IEffectCaseService;
-import cn.com.ctop.crawler.modules.oceanengine.service.IHotMaterialService;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.http.impl.cookie.BasicClientCookie;
-import org.bytedeco.javacpp.opencv_core;
-import org.bytedeco.javacv.FFmpegFrameGrabber;
-import org.bytedeco.javacv.Frame;
-import org.bytedeco.javacv.Java2DFrameConverter;
-import org.openqa.selenium.Cookie;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-
-import javax.imageio.ImageIO;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.List;
-import java.util.*;
-
-public class OceanengineJob implements Job {
-    @Value("${jeecg.path.chrome-driver}")
-    private String chromeDriver;
-    @Autowired
-    private IDouyinHotService douyinHotService;
-    @Autowired
-    private IEffectCaseService effectCaseService;
-    @Autowired
-    private IHotMaterialService hotMaterialService;
-    public static void main(String[] args){
-        System.out.println(getRealVideoUrl(""));
-    }
-
-    public static String getVideoUrlByVid(String vid) {
-        String url = "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=" + vid + "&line=0";
-        return getRealVideoUrl(url);
-    }
-
-    public static String getRealVideoUrl(String url) {
-        try {
-            URL serverUrl = new URL(url);
-            HttpURLConnection conn = (HttpURLConnection) serverUrl
-                    .openConnection();
-            conn.setRequestMethod("GET");
-            // 必须设置false,否则会自动redirect到Location的地址
-            conn.setInstanceFollowRedirects(false);
-            conn.addRequestProperty("User-Agent",
-                    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8");
-            conn.connect();
-            String location = conn.getHeaderField("Location");
-            return location;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-    private void hotMaterialHandler(int page,int appCode,String appName){
-        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/hot_material/list?material_type=3&order_by=convert_show_rate&period_type=3&aggr_app_code="+appCode+"&page="+page+"&limit=20");
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        try {
-            JsonNode node = mapper.readTree(result);
-            int code = node.get("code").asInt();
-            if (code == 0) {
-                if (node.get("data") != null&&node.get("data").get("materials")!=null) {
-                    String dataJson = node.get("data").get("materials").toString();
-                    List<HotMaterial> list = mapper.readValue(dataJson,new TypeReference<List<HotMaterial>>() {});
-                    if(list != null && list.size() > 0){
-                        for (HotMaterial material : list){
-                            material.setAppCode(appCode);
-                            material.setAppName(appName);
-                            material.setVideoUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+material.getVid()+"&line=0"));
-                            if(material.getVideoUrl() == null){
-                                material.setVideoUrl(getVideoUrl(material.getVid()));
-                            }
-//                            material.setVideoUrl(getVideoUrl(material.getVid()));
-                            material.setCoverImage(getVideoFirstImage(material.getVideoUrl()));
-                            if(material.getCoverImage() == null){
-                                Thread.sleep(1000);
-                                material.setCoverImage(getVideoFirstImage(material.getVideoUrl()));
-                            }
-                            hotMaterialService.saveOrUpdate(material);
-                        }
-                        hotMaterialHandler(page+1,appCode,appName);
-                    }
-                }
-            }
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-    }
-
-    public static String getVideoUrl(String vid) throws Exception {
-        String url = "http://i.snssdk.com/video/urls/1/toutiao/mp4/"+vid;
-        String result = HttpUtils2.httpGetRequest(url);
-        ObjectMapper mapper = new ObjectMapper();
-        if(result != null){
-            JsonNode node = mapper.readTree(result);
-            String mainUrl = node.get("data").get("video_list").get("video_1").get("main_url").asText();
-            return Base64Utils.decode(mainUrl);
-        }
-        return null;
-    }
-    private void effectCaseHandler(int page){
-        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/case/effect_case_list?industry=0&style=0&mode=0&page="+page+"&limit=20");
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        try {
-            JsonNode node = mapper.readTree(result);
-            int code = node.get("code").asInt();
-            if(code == 0) {
-                if (node.get("data") != null) {
-                    String dataJson = node.get("data").get("effect_cases").toString();
-                    List<EffectCase> list = mapper.readValue(dataJson,new TypeReference<List<EffectCase>>() {});
-                    if (list != null && list.size() > 0) {
-                        for (EffectCase effectCase:list){
-                            String resultDetail = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/case/effect_case/"+effectCase.getId());
-                            JsonNode detailNode = mapper.readTree(resultDetail);
-                            int detailCode = detailNode.get("code").asInt();
-                            if(detailCode == 0){
-                                if(detailNode.get("data") != null){
-//                                    String detailJson = node.get("data").get("effect_cases").toString();
-//                                    EffectCase effectCase1 = mapper.readValue(detailJson,EffectCase.class);
-                                    effectCase.setAuthor(detailNode.get("data").get("effect_case").get("author").asText());
-                                    effectCase.setCreateDate(detailNode.get("data").get("effect_case").get("create_date").asText());
-                                    effectCase.setCreativeId(detailNode.get("data").get("effect_case").get("creative_id").asLong());
-                                    effectCase.setCreativeScore(detailNode.get("data").get("effect_case").get("creative_score").asText());
-                                    effectCase.setEffect(detailNode.get("data").get("effect_case").get("effect").toString());
-                                    effectCase.setMethods(detailNode.get("data").get("effect_case").get("methods").toString());
-                                    effectCase.setVideoUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+effectCase.getVid()+"&line=0"));
-                                    if (effectCase.getVideoUrl() == null){
-                                        effectCase.setVideoUrl(getVideoUrl(effectCase.getVid()));
-                                    }
-//                                    effectCase.setVideoUrl(getVideoUrl(effectCase.getVid()));
-                                    effectCase.setCoverImage(getVideoFirstImage(effectCase.getVideoUrl()));
-                                    if (effectCase.getCoverImage() == null){
-                                        Thread.sleep(1000);
-                                        effectCase.setCoverImage(getVideoFirstImage(effectCase.getVideoUrl()));
-                                    }
-                                    effectCase.setCreativeLabel(detailNode.get("data").get("effect_case").get("creative_label").toString());
-                                }
-                            }
-                            effectCaseService.saveOrUpdate(effectCase);
-                        }
-                        effectCaseHandler(page+1);
-                    }
-                }
-            }
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-    }
-
-    private String getVideoFirstImage(String url){
-        try {
-            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(url);
-            ff.start();
-            int lenght = ff.getLengthInFrames();
-            int i = 0;
-            Frame f = null;
-            while (i < lenght) {
-// 过滤前5帧,避免出现全黑的图片,依自己情况而定
-                f = ff.grabFrame();
-                if ((i > 5) && (f.image != null)) {
-                    break;
-                }
-                i++;
-            }
-//            opencv_core.IplImage img = f.image;
-            int owidth = f.imageWidth;
-            int oheight = f.imageHeight;
-            Java2DFrameConverter converter =new Java2DFrameConverter();
-            BufferedImage fecthedImage =converter.getBufferedImage(f);
-// 对截取的帧进行等比例缩放
-            int width = 800;
-            int height = (int) (((double) width / owidth) * oheight);
-            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
-            bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
-                    0, 0, null);
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
-            ImageIO.write(bi, "jpg", baos);
-            byte[] bytes = baos.toByteArray();//转换成字节
-            String png_base64 = Base64.getEncoder().encodeToString(bytes).trim();//转换成base64串
-            png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
-            //        ImageIO.write(bufferedImage, "png", new File("D:/qrcode1.png"));
-            baos.close();
-            ff.close();
-            return "data:image/jpg;base64,"+png_base64;
-        }catch (Exception e){
-            e.printStackTrace();
-            return null;
-        }
-
-    }
-    private void douyinHotHandler(int page,int listType){
-        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/hot_video/user_side/list?page="+page+"&limit=20&list_type="+listType+"&aggr_duration_type=-1");
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            JsonNode node = mapper.readTree(result);
-            int code = node.get("code").asInt();
-            if(code == 0){
-                if(node.get("data")!= null){
-                    String dataJson = node.get("data").get("items").toString();
-                    List<DouyinHot> list = mapper.readValue(dataJson,new TypeReference<List<DouyinHot>>() {});
-                    if (list != null && list.size() > 0){
-                        for (DouyinHot douyinHot : list){
-                            douyinHot.setUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+douyinHot.getVideoId()+"&line=0"));
-                            if(douyinHot.getUrl() == null){
-                                douyinHot.setUrl(getVideoUrl(douyinHot.getVideoId()));
-                            }
-//                            douyinHot.setUrl(getVideoUrl(douyinHot.getVideoId()));
-                            douyinHot.setCoverImage(getVideoFirstImage(douyinHot.getUrl()));
-                            if(douyinHot.getCoverImage() == null){
-                                Thread.sleep(1000);
-                                douyinHot.setCoverImage(getVideoFirstImage(douyinHot.getUrl()));
-                            }
-                            douyinHotService.saveOrUpdate(douyinHot);
-                        }
-                        douyinHotHandler(page+1,listType);
-                    }else {
-                        if(listType < 4){
-                            douyinHotHandler(1,listType+1);
-                        }
-                    }
-                }
-            }
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-
-    }
-    @Override
-    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        String account="3248395570@qq.com";
-        String password = "Ydxq-704127411";
-        login(account,password);
-        douyinHotHandler(1,1);
-        effectCaseHandler(1);
-        hotMaterialHandler(1,1,"西瓜");
-        hotMaterialHandler(1,3,"火山");
-        hotMaterialHandler(1,4,"抖音");
-        hotMaterialHandler(1,8,"头条");
-        hotMaterialHandler(1,9,"穿山甲");
-        System.out.println("巨量创意抓取完成");
-    }
-
-    private void login(String account,String password){
-        String url = "https://cc.oceanengine.com/login";
-        System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
-        ChromeOptions chromeOptions = new ChromeOptions();
-        chromeOptions.addArguments("--headless");
-        chromeOptions.addArguments("--no-sandbox");
-        chromeOptions.addArguments("--window-size=1920,1080");
-        chromeOptions.addArguments("--user-agent=" + HttpUtils2.USER_AGENT);
-        chromeOptions.setAcceptInsecureCerts(true);
-        WebDriver webDriver = new ChromeDriver(chromeOptions);
-        //清除所有的缓存
-        webDriver.manage().deleteAllCookies();
-        try {
-            //获取登录页面
-            webDriver.get(url);
-            for (Cookie cookie : webDriver.manage().getCookies()) {
-                BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
-                ck.setDomain("oceanengine.com");
-                ck.setExpiryDate(cookie.getExpiry());
-                ck.setPath(cookie.getPath());
-                HttpUtils2.cookieStore.addCookie(ck);
-            }
-            Map<String, String> header = new HashMap<>();
-            header.put("Accept", "*/*");
-            header.put("Connection", "keep-alive");
-            header.put("Host", "sso.toutiao.com");
-            header.put("Content-Type", "application/x-www-form-urlencoded");
-            header.put("Origin", "https://cc.oceanengine.com");
-            header.put("Referer", "https://cc.oceanengine.com/login");
-            Map<String, Object> param = new HashMap<>();
-            param.put("mobile", "");
-            param.put("code", "");
-            param.put("account", account);
-            param.put("password", password);
-            param.put("captcha", "hqde");
-            param.put("is_30_days_no_login", "true");
-            param.put("service", "https://cc.oceanengine.com");
-            String res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
-            System.out.println(res);
-            ObjectMapper mapper = new ObjectMapper();
-            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-            JsonNode jsonNode = mapper.readTree(res);
-            //errorcode == 1102 验证码错误,请重新输入验证码
-            //errorcode == 1101 验证码为空
-
-            Integer errorCode = jsonNode.get("error_code").asInt();
-            String orderId = null;
-            while (errorCode != 0) {
-                //用户名或者密码错误
-                if (null != errorCode && errorCode == 1009) {
-                    return;
-                }
-                FateadmUtil fateadmUtil = new FateadmUtil();
-                fateadmUtil.init();
-                if (orderId != null) {
-                    fateadmUtil.Justice(orderId);
-                }
-                String captcha = jsonNode.get("captcha").asText();
-                Base64.Decoder decoder = Base64.getDecoder();
-                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decode(captcha));
-                param.put("captcha", resp.pred_resl);
-                orderId = resp.req_id;
-                res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
-                System.out.println(res);
-                jsonNode = mapper.readTree(res);
-                errorCode = jsonNode.get("error_code").asInt();
-            }
-            if (errorCode == 0) {
-                //表示登录成功
-
-                List<org.apache.http.cookie.Cookie> cookies = HttpUtils2.cookieStore.getCookies();
-                for (org.apache.http.cookie.Cookie ck : cookies) {
-                    Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
-                    webDriver.manage().addCookie(cookie);
-                }
-                String redirectUrl = jsonNode.get("redirect_url").asText();
-                webDriver.get(redirectUrl);
-                //登录成功 进入推广页面
-                webDriver.get("https://cc.oceanengine.com/inspiration/douyin-rank-list");
-                Thread.sleep(3000);
-                for (Cookie cookie : webDriver.manage().getCookies()) {
-                    BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
-                    ck.setDomain("cc.oceanengine.com");
-                    ck.setExpiryDate(cookie.getExpiry());
-                    ck.setPath(cookie.getPath());
-                    HttpUtils2.cookieStore.addCookie(ck);
-                }
-
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            //获得cookie
-            Set<Cookie> coo = webDriver.manage().getCookies();
-            //清除所有的缓存
-            webDriver.manage().deleteAllCookies();
-            webDriver.quit();
-        }
-    }
-}
+//package org.jeecg.modules.ctop.job;
+//
+//import cn.com.ctop.common.module.utils.Base64Utils;
+//import cn.com.ctop.common.module.utils.HttpUtils2;
+//import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
+//import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
+//import cn.com.ctop.crawler.modules.oceanengine.entity.DouyinHot;
+//import cn.com.ctop.crawler.modules.oceanengine.entity.EffectCase;
+//import cn.com.ctop.crawler.modules.oceanengine.entity.HotMaterial;
+//import cn.com.ctop.crawler.modules.oceanengine.service.IDouyinHotService;
+//import cn.com.ctop.crawler.modules.oceanengine.service.IEffectCaseService;
+//import cn.com.ctop.crawler.modules.oceanengine.service.IHotMaterialService;
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.DeserializationFeature;
+//import com.fasterxml.jackson.databind.JsonNode;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import org.apache.http.impl.cookie.BasicClientCookie;
+//import org.bytedeco.javacpp.opencv_core;
+//import org.bytedeco.javacv.FFmpegFrameGrabber;
+//import org.bytedeco.javacv.Frame;
+//import org.bytedeco.javacv.Java2DFrameConverter;
+//import org.openqa.selenium.Cookie;
+//import org.openqa.selenium.WebDriver;
+//import org.openqa.selenium.chrome.ChromeDriver;
+//import org.openqa.selenium.chrome.ChromeOptions;
+//import org.quartz.Job;
+//import org.quartz.JobExecutionContext;
+//import org.quartz.JobExecutionException;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//
+//import javax.imageio.ImageIO;
+//import java.awt.*;
+//import java.awt.image.BufferedImage;
+//import java.io.ByteArrayOutputStream;
+//import java.net.HttpURLConnection;
+//import java.net.URL;
+//import java.util.List;
+//import java.util.*;
+//
+//public class OceanengineJob implements Job {
+//    @Value("${jeecg.path.chrome-driver}")
+//    private String chromeDriver;
+//    @Autowired
+//    private IDouyinHotService douyinHotService;
+//    @Autowired
+//    private IEffectCaseService effectCaseService;
+//    @Autowired
+//    private IHotMaterialService hotMaterialService;
+//    public static void main(String[] args){
+//        System.out.println(getRealVideoUrl(""));
+//    }
+//
+//    public static String getVideoUrlByVid(String vid) {
+//        String url = "https://aweme.snssdk.com/aweme/v1/playwm/?video_id=" + vid + "&line=0";
+//        return getRealVideoUrl(url);
+//    }
+//
+//    public static String getRealVideoUrl(String url) {
+//        try {
+//            URL serverUrl = new URL(url);
+//            HttpURLConnection conn = (HttpURLConnection) serverUrl
+//                    .openConnection();
+//            conn.setRequestMethod("GET");
+//            // 必须设置false,否则会自动redirect到Location的地址
+//            conn.setInstanceFollowRedirects(false);
+//            conn.addRequestProperty("User-Agent",
+//                    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Firefox/3.6.8");
+//            conn.connect();
+//            String location = conn.getHeaderField("Location");
+//            return location;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//        return null;
+//    }
+//    private void hotMaterialHandler(int page,int appCode,String appName){
+//        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/hot_material/list?material_type=3&order_by=convert_show_rate&period_type=3&aggr_app_code="+appCode+"&page="+page+"&limit=20");
+//        ObjectMapper mapper = new ObjectMapper();
+//        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//        try {
+//            JsonNode node = mapper.readTree(result);
+//            int code = node.get("code").asInt();
+//            if (code == 0) {
+//                if (node.get("data") != null&&node.get("data").get("materials")!=null) {
+//                    String dataJson = node.get("data").get("materials").toString();
+//                    List<HotMaterial> list = mapper.readValue(dataJson,new TypeReference<List<HotMaterial>>() {});
+//                    if(list != null && list.size() > 0){
+//                        for (HotMaterial material : list){
+//                            material.setAppCode(appCode);
+//                            material.setAppName(appName);
+//                            material.setVideoUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+material.getVid()+"&line=0"));
+//                            if(material.getVideoUrl() == null){
+//                                material.setVideoUrl(getVideoUrl(material.getVid()));
+//                            }
+////                            material.setVideoUrl(getVideoUrl(material.getVid()));
+//                            material.setCoverImage(getVideoFirstImage(material.getVideoUrl()));
+//                            if(material.getCoverImage() == null){
+//                                Thread.sleep(1000);
+//                                material.setCoverImage(getVideoFirstImage(material.getVideoUrl()));
+//                            }
+//                            hotMaterialService.saveOrUpdate(material);
+//                        }
+//                        hotMaterialHandler(page+1,appCode,appName);
+//                    }
+//                }
+//            }
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    public static String getVideoUrl(String vid) throws Exception {
+//        String url = "http://i.snssdk.com/video/urls/1/toutiao/mp4/"+vid;
+//        String result = HttpUtils2.httpGetRequest(url);
+//        ObjectMapper mapper = new ObjectMapper();
+//        if(result != null){
+//            JsonNode node = mapper.readTree(result);
+//            String mainUrl = node.get("data").get("video_list").get("video_1").get("main_url").asText();
+//            return Base64Utils.decode(mainUrl);
+//        }
+//        return null;
+//    }
+//    private void effectCaseHandler(int page){
+//        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/case/effect_case_list?industry=0&style=0&mode=0&page="+page+"&limit=20");
+//        ObjectMapper mapper = new ObjectMapper();
+//        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//        try {
+//            JsonNode node = mapper.readTree(result);
+//            int code = node.get("code").asInt();
+//            if(code == 0) {
+//                if (node.get("data") != null) {
+//                    String dataJson = node.get("data").get("effect_cases").toString();
+//                    List<EffectCase> list = mapper.readValue(dataJson,new TypeReference<List<EffectCase>>() {});
+//                    if (list != null && list.size() > 0) {
+//                        for (EffectCase effectCase:list){
+//                            String resultDetail = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/case/effect_case/"+effectCase.getId());
+//                            JsonNode detailNode = mapper.readTree(resultDetail);
+//                            int detailCode = detailNode.get("code").asInt();
+//                            if(detailCode == 0){
+//                                if(detailNode.get("data") != null){
+////                                    String detailJson = node.get("data").get("effect_cases").toString();
+////                                    EffectCase effectCase1 = mapper.readValue(detailJson,EffectCase.class);
+//                                    effectCase.setAuthor(detailNode.get("data").get("effect_case").get("author").asText());
+//                                    effectCase.setCreateDate(detailNode.get("data").get("effect_case").get("create_date").asText());
+//                                    effectCase.setCreativeId(detailNode.get("data").get("effect_case").get("creative_id").asLong());
+//                                    effectCase.setCreativeScore(detailNode.get("data").get("effect_case").get("creative_score").asText());
+//                                    effectCase.setEffect(detailNode.get("data").get("effect_case").get("effect").toString());
+//                                    effectCase.setMethods(detailNode.get("data").get("effect_case").get("methods").toString());
+//                                    effectCase.setVideoUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+effectCase.getVid()+"&line=0"));
+//                                    if (effectCase.getVideoUrl() == null){
+//                                        effectCase.setVideoUrl(getVideoUrl(effectCase.getVid()));
+//                                    }
+////                                    effectCase.setVideoUrl(getVideoUrl(effectCase.getVid()));
+//                                    effectCase.setCoverImage(getVideoFirstImage(effectCase.getVideoUrl()));
+//                                    if (effectCase.getCoverImage() == null){
+//                                        Thread.sleep(1000);
+//                                        effectCase.setCoverImage(getVideoFirstImage(effectCase.getVideoUrl()));
+//                                    }
+//                                    effectCase.setCreativeLabel(detailNode.get("data").get("effect_case").get("creative_label").toString());
+//                                }
+//                            }
+//                            effectCaseService.saveOrUpdate(effectCase);
+//                        }
+//                        effectCaseHandler(page+1);
+//                    }
+//                }
+//            }
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//    }
+//
+//    private String getVideoFirstImage(String url){
+//        try {
+//            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(url);
+//            ff.start();
+//            int lenght = ff.getLengthInFrames();
+//            int i = 0;
+//            Frame f = null;
+//            while (i < lenght) {
+//// 过滤前5帧,避免出现全黑的图片,依自己情况而定
+//                f = ff.grabFrame();
+//                if ((i > 5) && (f.image != null)) {
+//                    break;
+//                }
+//                i++;
+//            }
+////            opencv_core.IplImage img = f.image;
+//            int owidth = f.imageWidth;
+//            int oheight = f.imageHeight;
+//            Java2DFrameConverter converter =new Java2DFrameConverter();
+//            BufferedImage fecthedImage =converter.getBufferedImage(f);
+//// 对截取的帧进行等比例缩放
+//            int width = 800;
+//            int height = (int) (((double) width / owidth) * oheight);
+//            BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
+//            bi.getGraphics().drawImage(fecthedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH),
+//                    0, 0, null);
+//            ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
+//            ImageIO.write(bi, "jpg", baos);
+//            byte[] bytes = baos.toByteArray();//转换成字节
+//            String png_base64 = Base64.getEncoder().encodeToString(bytes).trim();//转换成base64串
+//            png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
+//            //        ImageIO.write(bufferedImage, "png", new File("D:/qrcode1.png"));
+//            baos.close();
+//            ff.close();
+//            return "data:image/jpg;base64,"+png_base64;
+//        }catch (Exception e){
+//            e.printStackTrace();
+//            return null;
+//        }
+//
+//    }
+//    private void douyinHotHandler(int page,int listType){
+//        String result = HttpUtils2.httpGetRequest("https://cc.oceanengine.com/creative_center_server/api/hot_video/user_side/list?page="+page+"&limit=20&list_type="+listType+"&aggr_duration_type=-1");
+//        ObjectMapper mapper = new ObjectMapper();
+//        try {
+//            JsonNode node = mapper.readTree(result);
+//            int code = node.get("code").asInt();
+//            if(code == 0){
+//                if(node.get("data")!= null){
+//                    String dataJson = node.get("data").get("items").toString();
+//                    List<DouyinHot> list = mapper.readValue(dataJson,new TypeReference<List<DouyinHot>>() {});
+//                    if (list != null && list.size() > 0){
+//                        for (DouyinHot douyinHot : list){
+//                            douyinHot.setUrl(getRealVideoUrl("https://aweme.snssdk.com/aweme/v1/playwm/?video_id="+douyinHot.getVideoId()+"&line=0"));
+//                            if(douyinHot.getUrl() == null){
+//                                douyinHot.setUrl(getVideoUrl(douyinHot.getVideoId()));
+//                            }
+////                            douyinHot.setUrl(getVideoUrl(douyinHot.getVideoId()));
+//                            douyinHot.setCoverImage(getVideoFirstImage(douyinHot.getUrl()));
+//                            if(douyinHot.getCoverImage() == null){
+//                                Thread.sleep(1000);
+//                                douyinHot.setCoverImage(getVideoFirstImage(douyinHot.getUrl()));
+//                            }
+//                            douyinHotService.saveOrUpdate(douyinHot);
+//                        }
+//                        douyinHotHandler(page+1,listType);
+//                    }else {
+//                        if(listType < 4){
+//                            douyinHotHandler(1,listType+1);
+//                        }
+//                    }
+//                }
+//            }
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//
+//    }
+//    @Override
+//    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+//        String account="3248395570@qq.com";
+//        String password = "Ydxq-704127411";
+//        login(account,password);
+//        douyinHotHandler(1,1);
+//        effectCaseHandler(1);
+//        hotMaterialHandler(1,1,"西瓜");
+//        hotMaterialHandler(1,3,"火山");
+//        hotMaterialHandler(1,4,"抖音");
+//        hotMaterialHandler(1,8,"头条");
+//        hotMaterialHandler(1,9,"穿山甲");
+//        System.out.println("巨量创意抓取完成");
+//    }
+//
+//    private void login(String account,String password){
+//        String url = "https://cc.oceanengine.com/login";
+//        System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
+//        ChromeOptions chromeOptions = new ChromeOptions();
+//        chromeOptions.addArguments("--headless");
+//        chromeOptions.addArguments("--no-sandbox");
+//        chromeOptions.addArguments("--window-size=1920,1080");
+//        chromeOptions.addArguments("--user-agent=" + HttpUtils2.USER_AGENT);
+//        chromeOptions.setAcceptInsecureCerts(true);
+//        WebDriver webDriver = new ChromeDriver(chromeOptions);
+//        //清除所有的缓存
+//        webDriver.manage().deleteAllCookies();
+//        try {
+//            //获取登录页面
+//            webDriver.get(url);
+//            for (Cookie cookie : webDriver.manage().getCookies()) {
+//                BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
+//                ck.setDomain("oceanengine.com");
+//                ck.setExpiryDate(cookie.getExpiry());
+//                ck.setPath(cookie.getPath());
+//                HttpUtils2.cookieStore.addCookie(ck);
+//            }
+//            Map<String, String> header = new HashMap<>();
+//            header.put("Accept", "*/*");
+//            header.put("Connection", "keep-alive");
+//            header.put("Host", "sso.toutiao.com");
+//            header.put("Content-Type", "application/x-www-form-urlencoded");
+//            header.put("Origin", "https://cc.oceanengine.com");
+//            header.put("Referer", "https://cc.oceanengine.com/login");
+//            Map<String, Object> param = new HashMap<>();
+//            param.put("mobile", "");
+//            param.put("code", "");
+//            param.put("account", account);
+//            param.put("password", password);
+//            param.put("captcha", "hqde");
+//            param.put("is_30_days_no_login", "true");
+//            param.put("service", "https://cc.oceanengine.com");
+//            String res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
+//            System.out.println(res);
+//            ObjectMapper mapper = new ObjectMapper();
+//            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//            JsonNode jsonNode = mapper.readTree(res);
+//            //errorcode == 1102 验证码错误,请重新输入验证码
+//            //errorcode == 1101 验证码为空
+//
+//            Integer errorCode = jsonNode.get("error_code").asInt();
+//            String orderId = null;
+//            while (errorCode != 0) {
+//                //用户名或者密码错误
+//                if (null != errorCode && errorCode == 1009) {
+//                    return;
+//                }
+//                FateadmUtil fateadmUtil = new FateadmUtil();
+//                fateadmUtil.init();
+//                if (orderId != null) {
+//                    fateadmUtil.Justice(orderId);
+//                }
+//                String captcha = jsonNode.get("captcha").asText();
+//                Base64.Decoder decoder = Base64.getDecoder();
+//                FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decode(captcha));
+//                param.put("captcha", resp.pred_resl);
+//                orderId = resp.req_id;
+//                res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
+//                System.out.println(res);
+//                jsonNode = mapper.readTree(res);
+//                errorCode = jsonNode.get("error_code").asInt();
+//            }
+//            if (errorCode == 0) {
+//                //表示登录成功
+//
+//                List<org.apache.http.cookie.Cookie> cookies = HttpUtils2.cookieStore.getCookies();
+//                for (org.apache.http.cookie.Cookie ck : cookies) {
+//                    Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
+//                    webDriver.manage().addCookie(cookie);
+//                }
+//                String redirectUrl = jsonNode.get("redirect_url").asText();
+//                webDriver.get(redirectUrl);
+//                //登录成功 进入推广页面
+//                webDriver.get("https://cc.oceanengine.com/inspiration/douyin-rank-list");
+//                Thread.sleep(3000);
+//                for (Cookie cookie : webDriver.manage().getCookies()) {
+//                    BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
+//                    ck.setDomain("cc.oceanengine.com");
+//                    ck.setExpiryDate(cookie.getExpiry());
+//                    ck.setPath(cookie.getPath());
+//                    HttpUtils2.cookieStore.addCookie(ck);
+//                }
+//
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        } finally {
+//            //获得cookie
+//            Set<Cookie> coo = webDriver.manage().getCookies();
+//            //清除所有的缓存
+//            webDriver.manage().deleteAllCookies();
+//            webDriver.quit();
+//        }
+//    }
+//}

+ 9 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/ICpaBidWarningService.java

@@ -0,0 +1,9 @@
+package org.jeecg.modules.ctop.service;
+
+import org.jeecg.modules.ctop.entity.Project;
+
+public interface ICpaBidWarningService {
+    void CpaBidWarning(Project project);
+
+
+}

+ 138 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CpaBidWarningServiceImpl.java

@@ -0,0 +1,138 @@
+package org.jeecg.modules.ctop.service.impl;
+
+import cn.com.ctop.common.module.entity.MailLog;
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.mapper.MailLogMapper;
+import cn.com.ctop.common.module.mapper.UserAllocationMapper;
+import cn.com.ctop.common.module.utils.BigDecimalUtil;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.CorpWexinUtils;
+import cn.com.ctop.common.module.utils.SendMailUtil;
+import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupMapper;
+import cn.com.ctop.toutiao.service.IByteDanceAdvertisePlanService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.ctop.entity.Project;
+import org.jeecg.modules.ctop.mapper.ProjectMapper;
+import org.jeecg.modules.ctop.service.ICpaBidWarningService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 出价预警
+ */
+@Slf4j
+@Service
+public class CpaBidWarningServiceImpl implements ICpaBidWarningService {
+
+    @Autowired
+    private ProjectMapper projectMapper;
+    @Autowired
+    private UserAllocationMapper userAllocationMapper;
+    @Autowired
+    private KuaiShouGroupMapper groupMapper;
+    @Autowired
+    private MailLogMapper mailLogMapper;
+    @Autowired
+    private IByteDanceAdvertisePlanService byteDanceAdvertisePlanService;
+
+
+    /**
+     * 预警
+     */
+
+    @Override
+    public void CpaBidWarning(Project project) {
+        try {
+
+            BigDecimal maxDeepCpaBid = project.getMaxDeepCpaBid();
+
+
+            List<UserAllocation> userAllocations = getUserAllocationsByProjectId(project.getId());
+            if (!Check.isNull(userAllocations)) {
+                for (UserAllocation userAllocation : userAllocations) {
+                    Long accountId = userAllocation.getAccountId();
+                    List<String> unitWarning = new ArrayList<>();
+                    if ("1".equals(userAllocation.getMediaId())) {
+                        BigDecimal deepBid = BigDecimalUtil.divideBigDecimal(maxDeepCpaBid, new BigDecimal(1000));
+                        unitWarning = byteDanceAdvertisePlanService.selectWarningCpaBid(accountId, deepBid);
+                    } else if ("2".equals(userAllocation.getMediaId())) {
+                        unitWarning = groupMapper.selectWarningCpaBid(accountId, maxDeepCpaBid);
+                    }
+
+                    if (!Check.isNull(unitWarning)) {
+                        sendMessage(project.getMediaId(), accountId, project.getId(), project.getProjectName(), userAllocation.getAuthName(), unitWarning,maxDeepCpaBid );
+                    }
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+    }
+
+    private List<UserAllocation> getUserAllocationsByProjectId(Long projectId) {
+        QueryWrapper<UserAllocation> userAllocationQueryWrapper = new QueryWrapper<>();
+        userAllocationQueryWrapper.eq("project_id", projectId);
+        List<UserAllocation> userAllocations = userAllocationMapper.selectList(userAllocationQueryWrapper);
+        return userAllocations;
+    }
+
+
+    private void sendMessage(String mediaId, Long accountId, Long projectId, String projectName, String authName, List<String> unitWarning, BigDecimal maxCpaBid) {
+
+        BigDecimal maxBid = BigDecimalUtil.divideBigDecimal(maxCpaBid, new BigDecimal(1000));
+
+        String createTime = DateUtils.getNowDate("yyyy-MM-dd");
+        Integer count = mailLogMapper.selectCountByAccountIdAndDate(accountId, createTime, 1);
+        StringBuilder text = new StringBuilder();
+
+        String s = "";
+        for (int i = 0; i < unitWarning.size(); i++) {
+            s += unitWarning.get(i) + "," + "<br/>";
+
+        }
+        text.append("项目深度出价预警").append("<br/>").append("您的项目:").append(projectName + ",").append("<br/>")
+                .append("授权名称为:" + authName + " 下的,").append("<br/>").append(s)
+                .append("大于项目设置的最高深度转化出价:").append(maxBid).append(" 元! 请您及时调整。");
+        if (count < 3) {
+            List<String> mailList = mailLogMapper.selectMailList(projectId);
+            String subject;
+            if ("1".equals(mediaId)) {
+                subject = "头条-广告计划深度转化出价预警";
+
+            } else {
+                subject = "快手-广告组深度转化出价预警";
+            }
+
+            try {
+                SendMailUtil.sendMail(mailList, subject, text.toString());
+                MailLog mailLog = new MailLog();
+                mailLog.setAccountId(accountId);
+                mailLog.setMailType(1);
+                mailLog.setContent(text.toString());
+                mailLog.setSendEmil(JSON.toJSONString(mailList));
+                mailLog.setSubject(subject);
+                mailLogMapper.insert(mailLog);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        List<String> wexinIds = mailLogMapper.selectWeiXinIdList(projectId);
+        CorpWexinUtils.sendMessage(wexinIds, text.toString());
+
+
+    }
+
+
+}

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

@@ -227,7 +227,7 @@ public class SampleTest {
         }
         tokens.forEach(token -> {
             //3:获取广告计划信息数据
-            reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+            advertiserDataService.getAdvertiserPlan(token, "", null, null);
         });
     }
 

+ 1 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/BigDecimalUtil.java

@@ -127,6 +127,7 @@ public class BigDecimalUtil {
      * @param v1
      * @param v2
      * @return
+     * -1 小于 0 等于 1 大于
      */
     public static int compareToDecimal(BigDecimal v1, BigDecimal v2) {
         int i = v1.compareTo(v2);

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

@@ -4,6 +4,7 @@ import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -16,4 +17,6 @@ public interface KuaiShouGroupMapper extends BaseMapper<KuaiShouGroup> {
     void replaceBatch(@Param(value = "groups") List<KuaiShouGroup> groups);
 
     List<String> selectWarningGroup(@Param("accountId") Long accountId, @Param("maxBid") Long maxBid);
+
+    List<String> selectWarningCpaBid(@Param("accountId") Long accountId, @Param("maxBid") BigDecimal maxDeepCapBid);
 }

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

@@ -79,4 +79,14 @@
     </select>
 
 
+    <select id="selectWarningCpaBid" resultType="java.lang.String">
+   SELECT
+   unit_name
+   FROM ctop_kuaishou_group
+   WHERE account_id = #{accountId}
+   and deep_conversion_bid &gt; #{maxDeepCpaBid}
+   group by unit_id
+    </select>
+
+
 </mapper>

+ 9 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/entity/ByteDanceAdvertisePlan.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.toutiao.entity;
 
+import cn.com.ctop.common.module.utils.BigDecimalUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -188,6 +189,7 @@ public class ByteDanceAdvertisePlan {
     @Excel(name = "ocpc广告转化出价", width = 15)
     @ApiModelProperty(value = "ocpc广告转化出价")
     private BigDecimal cpaBid;
+    private BigDecimal deepCpabid;  // 深度优化出价
     /**
      * ocpc广告是否跳过第一阶段
      */
@@ -502,6 +504,13 @@ public class ByteDanceAdvertisePlan {
         if (null != externalUrl && !"".equals(externalUrl.trim())) {
             this.externalUrl = externalUrl;
         }
+
+        BigDecimal deepCpabid = params.getBigDecimal("deep_cpabid");
+        if (BigDecimalUtil.compareToDecimal(deepCpabid, new BigDecimal(0)) > 0) {
+            this.deepCpabid = deepCpabid;
+        }
+
+
     }
 
     public ByteDanceAdvertisePlan() {

+ 2 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/mapper/ByteDanceAdvertisePlanMapper.java

@@ -16,4 +16,6 @@ import java.util.List;
 public interface ByteDanceAdvertisePlanMapper extends BaseMapper<ByteDanceAdvertisePlan> {
 
     List<String> selectWarningGroup(@Param("accountId") Long accountId, @Param("maxBid") BigDecimal maxBid);
+
+    List<String> selectWarningCpaBid(@Param("accountId") Long accountId, @Param("maxCpaBid") BigDecimal maxCpaBid);
 }

+ 12 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/mapper/xml/ByteDanceAdvertisePlanMapper.xml

@@ -10,4 +10,16 @@
    and (cpa_bid &gt; #{maxBid} or bid &gt; #{maxBid})
    and toutiao_status = 'AD_STATUS_DELIVERY_OK'
     </select>
+
+
+    <select id="selectWarningCpaBid" resultType="java.lang.String">
+   SELECT
+   name
+   FROM ctop_bytedance_advertise_plan
+   WHERE advertiser_id = #{accountId}
+   and deep_cpabid &gt; #{maxCpaBid}
+   and toutiao_status = 'AD_STATUS_DELIVERY_OK'
+    </select>
+
+
 </mapper>

+ 8 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/service/IByteDanceAdvertisePlanService.java

@@ -31,4 +31,12 @@ public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvert
      * @return
      */
     List<String> selectWarningGroup(Long accountId, BigDecimal maxBid);
+
+    /**
+     * 查询需要预警的深度转化出价
+     * @param accountId
+     * @param maxCapBid
+     * @return
+     */
+    List<String> selectWarningCpaBid(Long accountId, BigDecimal maxCapBid);
 }

+ 6 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/service/impl/ByteDanceAdvertisePlanServiceImpl.java

@@ -193,9 +193,14 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
 
     @Override
     public List<String> selectWarningGroup(Long accountId, BigDecimal maxBid) {
-        return  byteDanceAdvertisePlanMapper.selectWarningGroup(accountId, maxBid);
+        return byteDanceAdvertisePlanMapper.selectWarningGroup(accountId, maxBid);
 
     }
 
+    @Override
+    public List<String> selectWarningCpaBid(Long accountId, BigDecimal maxCapBid) {
+        return byteDanceAdvertisePlanMapper.selectWarningCpaBid(accountId, maxCapBid);
+    }
+
 
 }

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

@@ -124,6 +124,7 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         }
         for (int i = 0; i < data.size(); i++) {
             JSONObject dataObject = data.getJSONObject(i);
+            System.err.println(dataObject);
             ByteDanceAdvertisePlan advertisePlan = new ByteDanceAdvertisePlan(dataObject, String.valueOf(token.getAccountId()));
             advertisePlanService.saveOrUpdate(advertisePlan);
         }