浏览代码

添加头条有效视频统计逻辑

syh 5 年之前
父节点
当前提交
21fd6bff0a
共有 28 个文件被更改,包括 650 次插入520 次删除
  1. 4 0
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java
  2. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/ByteDanceRefreshTokenJob.java
  3. 4 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceAdvertiserDataLoadJob.java
  4. 0 58
      jeecg-boot-module-system/src/test/java/org/jeecg/ChromeTest.java
  5. 4 82
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  6. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/CtopOauthTokenMapper.xml
  7. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/service/ICtopOauthTokenService.java
  8. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/service/IRefreshTokenService.java
  9. 13 6
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopOauthTokenServiceImpl.java
  10. 14 6
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/RefreshTokenServiceImpl.java
  11. 2 2
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceRefreshTokenJob.java
  12. 10 12
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiserDailyReportLoadJob.java
  13. 10 14
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiserHourlyReportLoadJob.java
  14. 16 16
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertisingDataLoadJob.java
  15. 9 11
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCampaignDailyReportLoadJob.java
  16. 9 13
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCampaignHourlyReportLoadJob.java
  17. 10 15
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCreativeHourlyReportLoadJob.java
  18. 24 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceEffectVideoJob.java
  19. 158 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/BytedanceEffectVideoInfoController.java
  20. 28 18
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceEffectVideoInfo.java
  21. 20 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/BytedanceEffectVideoInfoMapper.java
  22. 120 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/BytedanceEffectVideoInfoMapper.xml
  23. 0 6
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceAdvertiserDataService.java
  24. 4 5
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCampaignService.java
  25. 0 170
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  26. 166 77
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCampaignServiceImpl.java
  27. 19 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceEffectVideoInfoServiceImpl.java
  28. 2 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceReportMaterialDailyMapper.xml

+ 4 - 0
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -32,6 +32,10 @@ public class DateUtils extends PropertyEditorSupport {
     private static final long SECOND_IN_MILLIS = 1000L;
 
 
+    public static String getNowHour(Date date){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
+        return simpleDateFormat.format(date);
+    }
     public static Date getNowDate() throws ParseException {
         SimpleDateFormat dsdf = new SimpleDateFormat("yyyy-MM-dd");
         String nowDate = getNowDate("yyyy-MM-dd");

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/ByteDanceRefreshTokenJob.java

@@ -24,7 +24,7 @@ public class ByteDanceRefreshTokenJob implements Job {
         Thread thread = new Thread() {
             @Override
             public void run() {
-                refreshTokenService.byteDanceRefresh();
+                refreshTokenService.byteDanceRefresh(null);
             }
         };
         thread.start();

+ 4 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/job/BytedanceAdvertiserDataLoadJob.java

@@ -4,6 +4,7 @@ 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.material.service.IByteDanceAdvertiserDataService;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCampaignService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeService;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.Job;
@@ -29,7 +30,8 @@ public class BytedanceAdvertiserDataLoadJob implements Job {
     private IByteDanceAdvertiserDataService advertiserDataService;
     @Autowired
     private IByteDanceCreativeService creativeService;
-
+    @Autowired
+    private IByteDanceCampaignService byteDanceCampaignService;
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
         Date getDate = new Date();
@@ -39,7 +41,7 @@ public class BytedanceAdvertiserDataLoadJob implements Job {
         List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
         tokens.forEach(token -> executorService.submit(() -> {
             //1:获取当日广告组数据
-            advertiserDataService.getAdvertiserCampaign(token, null, dateString);
+            byteDanceCampaignService.getAdvertiserCampaign(token, null, dateString);
             //2:获取当日广告计划数据
             advertiserDataService.getAdvertiserPlan(token, "", dateString, null);
             //3:获取当日创意数据

+ 0 - 58
jeecg-boot-module-system/src/test/java/org/jeecg/ChromeTest.java

@@ -1,58 +0,0 @@
-//package org.jeecg;
-//
-//import org.junit.AfterClass;
-//import org.junit.BeforeClass;
-//import org.junit.Test;
-//import org.junit.runner.RunWith;
-//import org.openqa.selenium.chrome.ChromeDriver;
-//import org.springframework.boot.test.context.SpringBootTest;
-//import org.springframework.test.context.junit4.SpringRunner;
-//
-//import java.util.concurrent.TimeUnit;
-//
-//@RunWith(SpringRunner.class)
-//@SpringBootTest
-//public class ChromeTest {
-//    private static ChromeDriver browser;
-//
-//    @BeforeClass
-//    public static void openBrowser() {
-//        System.setProperty("webdriver.chrome.driver","D:/chromedriver.exe");
-//        browser = new ChromeDriver();
-//        browser.manage().timeouts()
-//                .implicitlyWait(10, TimeUnit.SECONDS);
-//    }
-//
-//    @AfterClass
-//    public static void closeBrowser() {
-//        browser.quit();
-//    }
-//
-//    @Test
-//    public void addBookToEmptyList() throws InterruptedException {
-//        // 要测试的网址
-//        String baseUrl = "http://localhost:" + 3000 + "/TEST" ;
-//        browser.get(baseUrl);
-//        // 对网页表单元素进行赋值操作并提交表单
-//        assertEquals("You have no books in your book list",
-//                browser.findElementByTagName("div").getText());
-//        browser.findElementByName("title")
-//                .sendKeys("BOOK TITLE");
-//        browser.findElementByName("author")
-//                .sendKeys("BOOK AUTHOR");
-//        browser.findElementByName("isbn")
-//                .sendKeys("1234567890");
-//        browser.findElementByName("description")
-//                .sendKeys("DESCRIPTION");
-//        browser.findElementByTagName("form")
-//                .submit();
-//        // 测试运行结果是否符合预期
-//        WebElement dl =
-//                browser.findElementByCssSelector("dt.bookHeadline");
-//        assertEquals("BOOK TITLE by BOOK AUTHOR (ISBN: 1234567890)",
-//                dl.getText());
-//        WebElement dt =
-//                browser.findElementByCssSelector("dd.bookDescription");
-//        assertEquals("DESCRIPTION", dt.getText());
-//    }
-//}

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

@@ -5,25 +5,18 @@ import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
-import cn.com.ctop.crawler.modules.pangolin.service.PangolinAppService;
-import cn.com.ctop.crawler.modules.pangolin.service.PangolinCrawlerService;
-import cn.com.ctop.crawler.modules.pangolin.service.PangolinLoginService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
 import cn.com.ctop.toutiao.modules.report.service.IReportService;
-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.KuaishouMatcostAccountMay;
-import org.jeecg.modules.ctop.service.IKuaishouMatcostAccountMayService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.math.BigDecimal;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -45,6 +38,8 @@ public class SampleTest {
     private IReportService reportService;
     @Autowired
     private IBindAccountLoginService bindAccountLoginService;
+    @Autowired
+    private IKuaishouWebInterfaceService kuaishouWebInterfaceService;
     @Test
     public void getBytedanceData(){
         CtopOauthToken token5 = oauthTokenService.getTokenByAccountId(1668362864699400L);
@@ -53,15 +48,15 @@ public class SampleTest {
             reportService.getAdvertiserReport(token5,date,date,CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         }
     }
+
     @Test
     public void testOceanEngineJob() {
         List<CtopOauthToken>tokens = oauthTokenService.selectToutiaoToken();
         String date = DateUtils.addDay("2020-07-10",-2);
         tokens.forEach(token -> {
-            advertiserDataService.getAdvertiserCampaign(token,null,date);
+//            advertiserDataService.getAdvertiserCampaign(token,null,date);
         });
     }
-
     @Test
     public void loadEffectVideo(){
         String date = "2020-07-10";
@@ -70,8 +65,6 @@ public class SampleTest {
             effectVideoInfoService.loadEffectVideo(getDate);
         }
     }
-    @Autowired
-    private IKuaishouWebInterfaceService kuaishouWebInterfaceService;
 
     @Test
     public void kuaishouLogin() {
@@ -120,77 +113,6 @@ public class SampleTest {
         Long end = System.currentTimeMillis();
         log.info("总用时:{}毫秒", end - start);
     }
-
-    @Autowired
-    private PangolinLoginService pangolinLoginService;
-    @Autowired
-    private PangolinCrawlerService pangolinCrawlerService;
-    @Autowired
-    private PangolinAppService pangolinAppService;
-
-    @Test
-    public void testPangolinLogin() {
-        QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("login_type", "pangolin");
-        queryWrapper.eq("status", 1);
-        List<BindAccountLogin> list = bindAccountLoginService.list(queryWrapper);
-        if (list != null && !list.isEmpty()) {
-            for (BindAccountLogin login : list) {
-                if (null == login.getCookie() || "".equals(login.getCookie().trim())) {
-                    pangolinLoginService.pangolinLogin(login.getAccountName(), login.getPassword());
-                }
-            }
-        }
-    }
-
-    @Autowired
-    private IKuaishouMatcostAccountMayService matcostAccountMayService;
-    @Test
-    public void testLoadMinDate(){
-        loadData();
-    }
-
-    private void loadData(){
-        KuaishouMatcostAccountMay matcostAccountMay = matcostAccountMayService.getOne();
-        if(null!=matcostAccountMay){
-            BigDecimal cost = matcostAccountMayService.getCostByParams(matcostAccountMay);
-            if(null!=cost&&!cost.toString().trim().equals("")){
-                matcostAccountMayService.updateCostByCode(matcostAccountMay.getVideoCode(),cost);
-            }else{
-                matcostAccountMayService.updateCostByCode(matcostAccountMay.getVideoCode(),BigDecimal.ZERO);
-            }
-//            String minDate = matcostAccountMayService.getMinDate(matcostAccountMay.getVideoCode());
-//            if(null == minDate||minDate.trim().equals("")){
-//                matcostAccountMayService.updateByCode(matcostAccountMay.getVideoCode(),"-");
-//            }else{
-//                matcostAccountMayService.updateByCode(matcostAccountMay.getVideoCode(),minDate);
-//            }
-
-            loadData();
-        }
-    }
-
-    @Test
-    public void testPangolinData() {
-        QueryWrapper<BindAccountLogin> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("login_type", "pangolin");
-        queryWrapper.eq("status", 1);
-        queryWrapper.isNotNull("cookie");
-        List<BindAccountLogin> list = bindAccountLoginService.list(queryWrapper);
-        if (list != null && !list.isEmpty()) {
-            for (BindAccountLogin bindAccountLogin : list) {
-                pangolinCrawlerService.getChannelList(bindAccountLogin);
-//                pangolinCrawlerService.getActivationList(bindAccountLogin, DateUtils.getNowDate("yyyy-MM-dd"), 1);
-//                pangolinCrawlerService.getCheckList(bindAccountLogin);
-//                QueryWrapper<PangolinApp> queryWrapper1 = new QueryWrapper<>();
-//                queryWrapper1.eq("account_name", bindAccountLogin.getAccountName());
-//                List<PangolinApp> appList = pangolinAppService.list(queryWrapper1);
-//                if (appList != null && !appList.isEmpty()) {
-//                    appList.forEach(pangolinApp -> pangolinCrawlerService.getRealTimeList(bindAccountLogin, pangolinApp.getAppId()));
-//                }
-            }
-        }
-    }
 }
 
 

+ 1 - 1
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/CtopOauthTokenMapper.xml

@@ -101,7 +101,7 @@
         from ctop_oauth_token t1
         left join ctop_user_allocation t2
         on t1.account_id = t2.account_id
-        where t1.media_id in (1,3)
+        where t1.media_id in (1,3) and t2.account_status = 0
         group by account_id
     </select>
 

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

@@ -18,7 +18,7 @@ public interface ICtopOauthTokenService extends IService<CtopOauthToken> {
 
     CtopOauthToken getTokenByAccountId(Long accountId);
 
-    Map<String, Object> getByteDanceAccessToken(String token, String refreshToken);
+    Map<String, Object> getByteDanceAccessToken(CtopOauthToken token);
 
     void getKuaiShouRefreshToken(Long accountId,String token, String refreshToken, Integer agentType);
 

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

@@ -3,5 +3,5 @@ package cn.com.ctop.common.module.service;
 public interface IRefreshTokenService {
     void getKuaiShouRefresh();
 
-    void byteDanceRefresh();
+    void byteDanceRefresh(String accountId);
 }

+ 13 - 6
module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopOauthTokenServiceImpl.java

@@ -51,19 +51,25 @@ public class CtopOauthTokenServiceImpl extends ServiceImpl<CtopOauthTokenMapper,
      * @return
      */
     @Override
-    public Map<String, Object> getByteDanceAccessToken(String token, String refreshToken) {
-        XxlJobLogger.log("刷新头条token入参,token:{},refreshToken:{}", token, refreshToken);
+    public Map<String, Object> getByteDanceAccessToken(CtopOauthToken token) {
         Map<String, Object> resultMap = new HashMap<>();
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + "/oauth2/refresh_token";
         Map<String, Object> param = new HashMap<>();
         param.put("app_id", PropertiesUtils.getValue("bytedance_config", "bytedance_appid"));
         param.put("secret", PropertiesUtils.getValue("bytedance_config", "bytedance_secret"));
         param.put("grant_type", "refresh_token");
-        param.put("refresh_token", refreshToken);
+        param.put("refresh_token", token.getRefreshToken());
         String result = HttpUtils.httpPostRequest(url, param, new HashMap<>());
+        if(null == result||result.trim().equals("")||result.equalsIgnoreCase("null")){
+            XxlJobLogger.log("头条刷新token失败;accountId:{},返回信息:{}", token.getAccountId(), result);
+            resultMap.put("message", "token刷新失败");
+            resultMap.put("token", token);
+            resultMap.put("code", 0);
+            return resultMap;
+        }
         JSONObject resultObject = JSONObject.parseObject(result);
-        XxlJobLogger.log("头条刷新token入参,token:{},refreshToken:{},返回信息:{}", token, refreshToken, resultObject);
         Integer code = resultObject.getInteger("code");
+        String message = resultObject.getString("message");
         if (code == 0) {
             JSONObject data = resultObject.getJSONObject("data");
             CtopOauthToken updateRefreshToken = new CtopOauthToken();
@@ -79,12 +85,13 @@ public class CtopOauthTokenServiceImpl extends ServiceImpl<CtopOauthTokenMapper,
             queryWrapper.eq("media_id", 1);
             int i = ctopOauthTokenMapper.update(updateRefreshToken, queryWrapper);
             if (i > 0) {
-                XxlJobLogger.log("头条刷新token成功:token:{}", token);
+                XxlJobLogger.log("头条刷新token成功:accountId:{}", token.getAccountId());
             }
             resultMap.put("message", "token刷新成功");
             resultMap.put("code", 0);
         } else {
-            resultMap.put("message", "token刷新失败");
+            XxlJobLogger.log("头条刷新token失败;accountId:{},返回信息:{}", token.getAccountId(), message);
+            resultMap.put("message", message);
             resultMap.put("token", token);
             resultMap.put("code", 0);
         }

+ 14 - 6
module-common/src/main/java/cn/com/ctop/common/module/service/impl/RefreshTokenServiceImpl.java

@@ -29,7 +29,6 @@ public class RefreshTokenServiceImpl implements IRefreshTokenService {
     @Override
     public void getKuaiShouRefresh() {
         List<CtopOauthToken> oauthTokens = oauthTokenMapper.selectKuaiShouTokens(CtopAdConstant.PLATFORM_TYPE_KUAISHOU);
-
         if (!Check.isNull(oauthTokens)) {
             for (CtopOauthToken oauthToken : oauthTokens) {
                 XxlJobLogger.log("刷新token,accountId:{}", oauthToken.getAccountId());
@@ -44,12 +43,21 @@ public class RefreshTokenServiceImpl implements IRefreshTokenService {
     }
 
     @Override
-    public void byteDanceRefresh() {
-        List<CtopOauthToken> byteDanceOauthTokens = oauthTokenMapper.selectByteDanceTokens(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-        if (!Check.isNull(byteDanceOauthTokens)) {
-            for (CtopOauthToken oauthToken : byteDanceOauthTokens) {
-                oauthTokenService.getByteDanceAccessToken(oauthToken.getAccessToken(), oauthToken.getRefreshToken());
+    public void byteDanceRefresh(String accountId) {
+        if(null==accountId||"".equals(accountId.trim())||accountId.equalsIgnoreCase("null")){
+            List<CtopOauthToken> byteDanceOauthTokens = oauthTokenMapper.selectByteDanceTokens(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+            if (!Check.isNull(byteDanceOauthTokens)) {
+                for (CtopOauthToken oauthToken : byteDanceOauthTokens) {
+                    oauthTokenService.getByteDanceAccessToken(oauthToken);
+                }
+            }
+        }else{
+            CtopOauthToken token = oauthTokenMapper.selectByAccountId(Long.parseLong(accountId));
+            if(token == null){
+                XxlJobLogger.log("未获取到账户数据,accountId:{}",accountId);
+                return;
             }
+            oauthTokenService.getByteDanceAccessToken(token);
         }
     }
 }

+ 2 - 2
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ByteDanceRefreshTokenJob.java

@@ -16,8 +16,8 @@ public class ByteDanceRefreshTokenJob {
      * @throws Exception
      */
     @XxlJob("byteDanceRefreshTokenJob")
-    public ReturnT<String> execute(String param) throws Exception {
-        refreshTokenService.byteDanceRefresh();
+    public ReturnT<String> execute(String accountId) throws Exception {
+        refreshTokenService.byteDanceRefresh(accountId);
         return ReturnT.SUCCESS;
     }
 }

+ 10 - 12
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiserDailyReportLoadJob.java

@@ -35,23 +35,21 @@ public class BytedanceAdvertiserDailyReportLoadJob {
         XxlJobLogger.log("头条广告主日报获取任务执行开始");
         Date getDate = DateUtils.addDay(new Date(), -1);
         //1:查询当日数据
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         if (null == tokens || tokens.isEmpty()) {
             XxlJobLogger.log("定时获取头条数据异常:为获取到可用的token");
             return ReturnT.FAIL;
         }
         CountDownLatch countDownLatch = new CountDownLatch(tokens.size());
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                try {
-                    reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-                } catch (Exception e) {
-                    XxlJobLogger.log(e);
-                } finally {
-                    countDownLatch.countDown();
-                }
-            });
-        });
+        tokens.forEach(token -> executorService.submit(() -> {
+            try {
+                reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+            } catch (Exception e) {
+                XxlJobLogger.log(e);
+            } finally {
+                countDownLatch.countDown();
+            }
+        }));
         countDownLatch.await();
         XxlJobLogger.log("头条广告主日报获取任务执行结束");
         return ReturnT.SUCCESS;

+ 10 - 14
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertiserHourlyReportLoadJob.java

@@ -11,7 +11,6 @@ import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -33,24 +32,21 @@ public class BytedanceAdvertiserHourlyReportLoadJob {
     public ReturnT<String> execute(String param) throws Exception {
         XxlJobLogger.log("头条时报数据获取开始");
         Date getDate = new Date();
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
-        String hour = simpleDateFormat.format(getDate);
+        String hour = DateUtils.getNowHour(getDate);
         //1:查询当日数据
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         if (null == tokens || tokens.isEmpty()) {
             XxlJobLogger.log("定时获取头条小时数据异常:未获取到可用的token");
             return ReturnT.FAIL;
         }
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                if (null != hour && "00".equals(hour)) {
-                    Date finalGetDate = DateUtils.addDay(getDate, -1);
-                    //获取广告主信息数据
-                    reportService.getAdvertiserReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-                }
-                reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-            });
-        });
+        tokens.forEach(token -> executorService.submit(() -> {
+            if ("00".equals(hour)) {
+                Date finalGetDate = DateUtils.addDay(getDate, -1);
+                //获取广告主信息数据
+                reportService.getAdvertiserReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+            }
+            reportService.getAdvertiserReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+        }));
         XxlJobLogger.log("头条时报数据获取结束");
         return ReturnT.SUCCESS;
     }

+ 16 - 16
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceAdvertisingDataLoadJob.java

@@ -2,8 +2,8 @@ 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.material.service.IByteDanceAdvertiserDataService;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCampaignService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeService;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -29,6 +29,8 @@ public class BytedanceAdvertisingDataLoadJob {
     @Autowired
     private IByteDanceAdvertiserDataService advertiserDataService;
     @Autowired
+    private IByteDanceCampaignService campaignService;
+    @Autowired
     private IByteDanceCreativeService creativeService;
 
     @XxlJob("bytedanceAdvertisingData")
@@ -37,21 +39,19 @@ public class BytedanceAdvertisingDataLoadJob {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         String dateString = dateFormat.format(getDate);
         //1:查询当日数据
-        List<CtopOauthToken> tokens = tokenService.getTokenListByType(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE);
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                try {
-                    //1:获取当日广告组数据
-                    advertiserDataService.getAdvertiserCampaign(token, null, dateString);
-                    //2:获取当日广告计划数据
-                    advertiserDataService.getAdvertiserPlan(token, "", dateString, null);
-                    //3:获取当日创意数据
-                    creativeService.getAdvertiserCreative(token.getAccountId() + "", "", dateString);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            });
-        });
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        tokens.forEach(token -> executorService.submit(() -> {
+            try {
+                //1:获取当日广告组数据
+                campaignService.getAdvertiserCampaign(token, null, dateString);
+                //2:获取当日广告计划数据
+                advertiserDataService.getAdvertiserPlan(token, "", dateString, null);
+                //3:获取当日创意数据
+                creativeService.getAdvertiserCreative(token.getAccountId() + "", "", dateString);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }));
         XxlJobLogger.log("物料数据同步完成");
         return ReturnT.SUCCESS;
     }

+ 9 - 11
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCampaignDailyReportLoadJob.java

@@ -36,17 +36,15 @@ public class BytedanceCampaignDailyReportLoadJob {
             return ReturnT.FAIL;
         }
         CountDownLatch countDownLatch = new CountDownLatch(tokens.size());
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                try {
-                    reportService.getAdvertiserCampaignReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-                } catch (Exception e) {
-                    XxlJobLogger.log(e);
-                } finally {
-                    countDownLatch.countDown();
-                }
-            });
-        });
+        tokens.forEach(token -> executorService.submit(() -> {
+            try {
+                reportService.getAdvertiserCampaignReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+            } catch (Exception e) {
+                XxlJobLogger.log(e);
+            } finally {
+                countDownLatch.countDown();
+            }
+        }));
         countDownLatch.await();
         XxlJobLogger.log("头条广告组日报获取任务执行结束");
         return ReturnT.SUCCESS;

+ 9 - 13
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCampaignHourlyReportLoadJob.java

@@ -11,7 +11,6 @@ import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -29,24 +28,21 @@ public class BytedanceCampaignHourlyReportLoadJob {
     public ReturnT<String> execute(String param) throws Exception {
         XxlJobLogger.log("头条广告组时报数据获取开始");
         Date getDate = new Date();
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
-        String hour = simpleDateFormat.format(getDate);
+        String hour = DateUtils.getNowHour(getDate);
         //1:查询当日数据
         List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         if (null == tokens || tokens.isEmpty()) {
             XxlJobLogger.log("定时获取头条小时数据异常:未获取到可用的token");
             return ReturnT.FAIL;
         }
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                if (null != hour && "00".equals(hour)) {
-                    Date finalGetDate = DateUtils.addDay(getDate, -1);
-                    //获取广告主信息数据
-                    reportService.getAdvertiserCampaignReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-                }
-                reportService.getAdvertiserCampaignReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-            });
-        });
+        tokens.forEach(token -> executorService.submit(() -> {
+            if ("00".equals(hour)) {
+                Date finalGetDate = DateUtils.addDay(getDate, -1);
+                //获取广告主信息数据
+                reportService.getAdvertiserCampaignReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+            }
+            reportService.getAdvertiserCampaignReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+        }));
         XxlJobLogger.log("头条广告组时报数据获取结束");
         return ReturnT.SUCCESS;
     }

+ 10 - 15
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceCreativeHourlyReportLoadJob.java

@@ -11,7 +11,6 @@ import org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -32,26 +31,22 @@ public class BytedanceCreativeHourlyReportLoadJob {
     @XxlJob("bytedanceCreativeHourlyReport")
     public ReturnT<String> execute(String param) throws Exception {
         XxlJobLogger.log("头条时报数据获取开始");
-        Date getDate = new Date();
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH");
-        String hour = simpleDateFormat.format(getDate);
+        Date now = new Date();
+        String hour = DateUtils.getNowHour(now);
         //1:查询当日数据
         List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         if (null == tokens || tokens.isEmpty()) {
             XxlJobLogger.log("定时获取头条小时数据异常:未获取到可用的token");
             return ReturnT.FAIL;
         }
-        tokens.forEach(token -> {
-            executorService.submit(() -> {
-                if ("00".equals(hour)) {
-                    Date finalGetDate = DateUtils.addDay(getDate, -1);
-                    //获取广告创意信息数据
-                    reportService.getAdvertiserCreativeReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-                }
-                reportService.getAdvertiserCreativeReport(token, getDate, getDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
-            });
-
-        });
+        tokens.forEach(token -> executorService.submit(() -> {
+            if ("00".equals(hour)) {
+                Date finalGetDate = DateUtils.addDay(now, -1);
+                //获取广告创意信息数据
+                reportService.getAdvertiserCreativeReport(token, finalGetDate, finalGetDate, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+            }
+            reportService.getAdvertiserCreativeReport(token, now, now, CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+        }));
         XxlJobLogger.log("头条时报数据获取结束");
         return ReturnT.SUCCESS;
     }

+ 24 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceEffectVideoJob.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class BytedanceEffectVideoJob {
+    @Autowired
+    private IBytedanceEffectVideoInfoService bytedanceEffectVideoInfoService;
+    @XxlJob("bytedanceEffectVideoJob")
+    public ReturnT<String> execute(String date) throws Exception {
+        if(null == date||date.trim().equalsIgnoreCase("")||date.trim().equalsIgnoreCase("null")){
+            date = DateUtils.formatDate(DateUtils.addDay(new Date(),-14));
+        }
+        bytedanceEffectVideoInfoService.loadEffectVideo(date);
+        return ReturnT.SUCCESS;
+    }
+}

+ 158 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/BytedanceEffectVideoInfoController.java

@@ -0,0 +1,158 @@
+package cn.com.ctop.toutiao.modules.material.controller;
+
+import cn.com.ctop.toutiao.modules.material.entity.BytedanceEffectVideoInfo;
+import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
+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.aspect.annotation.AutoLog;
+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-07-14
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="有效视频信息")
+@RestController
+@RequestMapping("/ctop/bytedanceEffectVideoInfo")
+public class BytedanceEffectVideoInfoController {
+	@Autowired
+	private IBytedanceEffectVideoInfoService bytedanceEffectVideoInfoService;
+
+	/**
+	  * 分页列表查询
+	 * @param bytedanceEffectVideoInfo
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-分页列表查询")
+	@ApiOperation(value="有效视频信息-分页列表查询", notes="有效视频信息-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BytedanceEffectVideoInfo>> queryPageList(BytedanceEffectVideoInfo bytedanceEffectVideoInfo,
+																 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																 HttpServletRequest req) {
+		Result<IPage<BytedanceEffectVideoInfo>> result = new Result<>();
+		QueryWrapper<BytedanceEffectVideoInfo> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceEffectVideoInfo, req.getParameterMap());
+		queryWrapper.orderByDesc("initial_cost_date");
+		Page<BytedanceEffectVideoInfo> page = new Page<>(pageNo, pageSize);
+		IPage<BytedanceEffectVideoInfo> pageList = bytedanceEffectVideoInfoService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param bytedanceEffectVideoInfo
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-添加")
+	@ApiOperation(value="有效视频信息-添加", notes="有效视频信息-添加")
+	@PostMapping(value = "/add")
+	public Result<BytedanceEffectVideoInfo> add(@RequestBody BytedanceEffectVideoInfo bytedanceEffectVideoInfo) {
+		Result<BytedanceEffectVideoInfo> result = new Result<>();
+		try {
+			bytedanceEffectVideoInfoService.save(bytedanceEffectVideoInfo);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param bytedanceEffectVideoInfo
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-编辑")
+	@ApiOperation(value="有效视频信息-编辑", notes="有效视频信息-编辑")
+	@PutMapping(value = "/edit")
+	public Result<BytedanceEffectVideoInfo> edit(@RequestBody BytedanceEffectVideoInfo bytedanceEffectVideoInfo) {
+		Result<BytedanceEffectVideoInfo> result = new Result<BytedanceEffectVideoInfo>();
+		BytedanceEffectVideoInfo bytedanceEffectVideoInfoEntity = bytedanceEffectVideoInfoService.getById(bytedanceEffectVideoInfo.getId());
+		if(bytedanceEffectVideoInfoEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = bytedanceEffectVideoInfoService.updateById(bytedanceEffectVideoInfo);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-通过id删除")
+	@ApiOperation(value="有效视频信息-通过id删除", notes="有效视频信息-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			bytedanceEffectVideoInfoService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-批量删除")
+	@ApiOperation(value="有效视频信息-批量删除", notes="有效视频信息-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<BytedanceEffectVideoInfo> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<BytedanceEffectVideoInfo> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.bytedanceEffectVideoInfoService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "有效视频信息-通过id查询")
+	@ApiOperation(value="有效视频信息-通过id查询", notes="有效视频信息-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BytedanceEffectVideoInfo> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<BytedanceEffectVideoInfo> result = new Result<>();
+		BytedanceEffectVideoInfo bytedanceEffectVideoInfo = bytedanceEffectVideoInfoService.getById(id);
+		if(bytedanceEffectVideoInfo==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(bytedanceEffectVideoInfo);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+}

+ 28 - 18
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceEffectVideoInfo.java

@@ -6,31 +6,41 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.aspect.annotation.Dict;
 
-import java.math.BigDecimal;
 import java.util.Date;
 
+/**
+ * 有效视频信息
+ * @author jeecg-boot
+ * @date   2020-07-14
+ * @version V1.0
+ */
 @Data
 @TableName("ctop_bytedance_effect_video_info")
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 public class BytedanceEffectVideoInfo {
-    @TableId(type = IdType.AUTO)
-    private Long id;
-    private String code;
-    private String url;
-    private String initialCostDate;
-    private String finalCostDate;
-    private String plane;
-    private String plan;
-    private String shot;
-    private String clip;
-    private String manager;
-    private BigDecimal twoWeekCost;
-    private BigDecimal totalCost;
-    private Date createTime;
-    private Date updateTime;
-
-
 
+	@TableId(type = IdType.AUTO)
+	private Long id;
+	/**视频MD5码*/
+	private String code;
+	private String url;
+	private String initialCostDate;
+	private String finalCostDate;
+	@Dict(dicCode = "id",dictTable="sys_user",dicText="realname")
+	private String plane;
+	@Dict(dicCode = "id",dictTable="sys_user",dicText="realname")
+	private String plan;
+	@Dict(dicCode = "id",dictTable="sys_user",dicText="realname")
+    private String shot;
+	@Dict(dicCode = "id",dictTable="sys_user",dicText="realname")
+	private String clip;
+	@Dict(dicCode = "id",dictTable="sys_user",dicText="realname")
+	private String manager;
+	private java.math.BigDecimal twoWeekCost;
+	private java.math.BigDecimal totalCost;
+	private Date createTime;
+	private Date updateTime;
 }

+ 20 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/BytedanceEffectVideoInfoMapper.java

@@ -3,6 +3,26 @@ package cn.com.ctop.toutiao.modules.material.mapper;
 import cn.com.ctop.toutiao.modules.material.entity.BytedanceEffectVideoInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+/**
+ * 有效视频信息
+ * @author: jeecg-boot
+ * @date:   2020-07-14
+ * @cersion: V1.0
+ */
 public interface BytedanceEffectVideoInfoMapper extends BaseMapper<BytedanceEffectVideoInfo> {
+    void updateTotalCost();
 
+    void updateFinalCostDate();
+
+    void updateTwoWeekCost();
+
+    void updateShot();
+
+    void updateClip();
+
+    void updatePlan();
+
+    void updatePlane();
+
+    void updateManager();
 }

+ 120 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/BytedanceEffectVideoInfoMapper.xml

@@ -2,4 +2,124 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.toutiao.modules.material.mapper.BytedanceEffectVideoInfoMapper">
 
+    <update id="updateTotalCost">
+        update
+            ctop_bytedance_effect_video_info effect
+        set
+            effect.total_cost  = (
+                select
+                    sum(report.cost)
+                from
+                    ctop_bytedance_report_material_daily report
+                left join ctop_bytedance_video_info video on report.material_id = video.material_id
+                where
+                    video.signature = effect.code
+                and
+                    report.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO','CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+            )
+        where effect.code is not null
+    </update>
+    <update id="updateFinalCostDate">
+        update
+            ctop_bytedance_effect_video_info effect
+        set
+            effect.final_cost_date  = (
+                select
+                    max(stat_datetime)
+                from
+                    ctop_bytedance_report_material_daily report
+                left join ctop_bytedance_video_info video on report.material_id = video.material_id
+                where
+                    video.signature = effect.code
+                and
+                    report.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO','CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+            )
+        where effect.code is not null
+    </update>
+    <update id="updateTwoWeekCost">
+        update
+            ctop_bytedance_effect_video_info effect
+        set
+            effect.two_week_cost  = (
+                select
+                    sum(report.cost)
+                from
+                    ctop_bytedance_report_material_daily report
+                left join ctop_bytedance_video_info video on report.material_id = video.material_id
+                where
+                    video.signature = effect.code
+                and
+                    report.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO','CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+                and
+                    report.stat_datetime&lt;= DATE_ADD(effect.initial_cost_date,INTERVAL 13 DAY)
+            )
+        where effect.code is not null
+    </update>
+    <update id="updateShot">
+        update
+            ctop_bytedance_effect_video_info effect
+        set shot = (
+            select
+                ascr.shot_id
+            from
+                ctop_material_ascription ascr
+            where
+                ascr.material_id = effect.code
+            limit 1 )
+        where effect.code is not null
+    </update>
+    <update id="updateClip">
+        update
+            ctop_bytedance_effect_video_info effect
+        set clip = (
+            select
+                ascr.clip_id
+            from
+                ctop_material_ascription ascr
+            where
+                ascr.material_id = effect.code
+            limit 1 )
+        where effect.code is not null
+    </update>
+    <update id="updatePlan">
+        update
+            ctop_bytedance_effect_video_info effect
+        set plan = (
+            select
+                ascr.plan_id
+            from
+                ctop_material_ascription ascr
+            where
+                ascr.material_id = effect.code
+            limit 1 )
+        where effect.code is not null
+    </update>
+    <update id="updatePlane">
+        update
+            ctop_bytedance_effect_video_info effect
+        set plane = (
+            select
+                ascr.plane_id
+            from
+                ctop_material_ascription ascr
+            where
+                ascr.material_id = effect.code
+            limit 1 )
+        where effect.code is not null
+    </update>
+    <update id="updateManager">
+        update
+            ctop_bytedance_effect_video_info effect
+        set manager = (
+            SELECT
+                user.id
+            FROM
+                sys_user user
+            LEFT JOIN sys_user_role userRole ON user.id = userRole.user_id
+            LEFT JOIN sys_role role ON userRole.role_id = role.id
+            WHERE
+                user.org_code = (select org_code from sys_user where id = effect.clip)
+            AND role.role_code = 'designTeamLeader')
+        where effect.clip is not null
+    </update>
 </mapper>

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

@@ -15,18 +15,12 @@ public interface IByteDanceAdvertiserDataService {
 
     Map<String, Object> getAdvertiserPlan(CtopOauthToken token, String ids, String date, String updateDate);
 
-    Map<String, Object> getAdvertiserCampaign(CtopOauthToken token, String ids, String date);
-
     Map<String, Object> getAdvertiserBudget(String accountId);
 
     Map<String, Object> getAdvertiserCreativeMaterial(String accountId, String creativeIds);
 
     Map<String, Object> getAdvertiserCreative(CtopOauthToken token, String date);
 
-    Map<String, Object> advertiserCampaignUpdateStatus(String accountId, String campaignIds, String optStatus);
-
-    Map<String, Object> advertiserCampaignUpdate(String accountId, Long campaignId, String budgetMode, Integer budget, String campaignName);
-
     Map<String, Object> advertiserPlanUpdateStatus(CtopOauthToken token, String adIds, String optStatus);
 
     Map<String, Object> advertiserPlanUpdateBid(CtopOauthToken token, String adIds, String bids);

+ 4 - 5
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCampaignService.java

@@ -2,10 +2,8 @@ package cn.com.ctop.toutiao.modules.material.service;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCampaign;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.IService;
 
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -15,7 +13,8 @@ import java.util.Map;
  * @Version: V1.0
  */
 public interface IByteDanceCampaignService extends IService<ByteDanceCampaign> {
-    List<ByteDanceCampaign> getGroupListByParams(CtopOauthToken token, JSONArray ids, String campaignName, String landingType, String status, String campaignCreateTime, Integer page, Integer pageSize);
-    Map<String,Object> createGroup(CtopOauthToken token, String campaignName, String operation, String budgetMode, String budget, String landingType, String uniqueFk);
-    Map<String,Object>updateGroup(CtopOauthToken token, String campaignId, String campaignName, String modifyTime,String budget);
+    Map<String,Object> createCampaign(CtopOauthToken token, String campaignName, String operation, String budgetMode, String budget, String landingType, String uniqueFk);
+    Map<String,Object>updateCampaign(CtopOauthToken token, String campaignId, String campaignName, String modifyTime,String budget);
+    Map<String, Object> updateCampaignStatus(CtopOauthToken token, String campaignIds, String optStatus);
+    Map<String, Object> getAdvertiserCampaign(CtopOauthToken token, String ids, String date);
 }

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

@@ -50,7 +50,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
             JSONObject jsonObject = JSONObject.parseObject(result);
             if (Check.isNull(jsonObject)) {
                 throw new Exception("返回结果为空");
-
             }
 
             Integer code = jsonObject.getInteger("code");
@@ -69,7 +68,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
 
             } else {
                 returnJson.put("code", -1);
-
             }
 
 
@@ -189,15 +187,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     }
 
     @Override
-    public Map<String, Object> getAdvertiserCampaign(CtopOauthToken token, String ids, String date) {
-        getAdvertiserCampaignByPageNumber(token, 1, ids, date);
-        Map<String, Object> resultMap = new HashMap<>();
-        resultMap.put("code", 0);
-        resultMap.put("message", "获取广告組信息成功");
-        return resultMap;
-    }
-
-    @Override
     public Map<String, Object> getAdvertiserBudget(String accountId) {
         Map<String, Object> resultMap = new HashMap<>();
         CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
@@ -323,118 +312,6 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
     }
 
     @Override
-    public Map<String, Object> advertiserCampaignUpdateStatus(String accountId, String campaignIds, String optStatus) {
-        Map<String, Object> resultMap = new HashMap<>();
-        JSONArray ids = new JSONArray();
-        String[] getIds = campaignIds.split(StringUtils.COMMA);
-        if (null != getIds && getIds.length > 0) {
-            for (int i = 0; i < getIds.length; i++) {
-                ids.add(Long.parseLong(getIds[i]));
-            }
-        }
-        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
-        //2: 根据token以及用户id获取用户信息数据
-        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update_status");
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", "application/json");
-        headers.put("Access-Token", cTopOauthToken.getAccessToken());
-
-        JSONObject params = new JSONObject();
-        params.put("advertiser_id", cTopOauthToken.getAccountId());
-        params.put("campaign_ids", ids);
-        params.put("opt_status", optStatus);
-        String result = HttpUtils.httpPostRequest(url, params, headers);
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        Integer code = jsonObject.getInteger("code");
-
-        if (null == code || !code.equals(0)) {
-            log.info("广告组更新状态接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
-            resultMap.put("code", -1);
-            resultMap.put("message", "广告组更新状态接口异常");
-            return resultMap;
-        }
-        JSONObject data = jsonObject.getJSONObject("data");
-        if (null == data) {
-            log.info("广告组更新状态异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
-            resultMap.put("code", -1);
-            resultMap.put("message", "广告组更新状态异常");
-            return resultMap;
-        }
-        JSONArray getCampaignIds = data.getJSONArray("campaign_ids");
-        if (null != getCampaignIds && !getCampaignIds.isEmpty()) {
-            for (int i = 0; i < getCampaignIds.size(); i++) {
-                Long id = getCampaignIds.getLong(i);
-                ByteDanceCampaign campaign = campaignService.getById(id);
-                if (null != campaign) {
-                    campaign.setOptStatus(optStatus);
-                }
-                campaignService.updateById(campaign);
-            }
-        }
-        resultMap.put("code", 0);
-        resultMap.put("message", "广告组状态修改成功");
-        return resultMap;
-    }
-
-    @Override
-    public Map<String, Object> advertiserCampaignUpdate(String accountId, Long campaignId, String budgetMode, Integer budget, String campaignName) {
-        Map<String, Object> resultMap = new HashMap<>();
-        CtopOauthToken cTopOauthToken = tokenService.getOauthTokenByAccountId(accountId);
-        ByteDanceCampaign campaign = campaignService.getById(campaignId);
-        //2: 根据token以及用户id获取用户信息数据
-        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update");
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", "application/json");
-        headers.put("Access-Token", cTopOauthToken.getAccessToken());
-
-        JSONObject params = new JSONObject();
-        params.put("advertiser_id", cTopOauthToken.getAccountId());
-        params.put("campaign_id", campaignId);
-        params.put("modify_time", campaign.getModifyTime());
-        if (null != campaignName && !"".equals(campaignName.trim())) {
-            params.put("campaign_name", campaignName);
-        }
-        if (null != budgetMode && !"".equals(budgetMode.trim())) {
-            params.put("budget_mode", budgetMode);
-        }
-        if (null != budget) {
-            params.put("budget", budget);
-        }
-        String result = HttpUtils.httpPostRequest(url, params, headers);
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        Integer code = jsonObject.getInteger("code");
-
-        if (null == code || !code.equals(0)) {
-            log.info("广告组更新接口异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
-            resultMap.put("code", -1);
-            resultMap.put("message", "广告组更新接口异常");
-            return resultMap;
-        }
-        JSONObject data = jsonObject.getJSONObject("data");
-        if (null == data) {
-            log.info("广告组更新异常==》accountId:{},message:{}", accountId, jsonObject.getString("message"));
-            resultMap.put("code", -1);
-            resultMap.put("message", "广告组更新异常");
-            return resultMap;
-        }
-        if (null != campaignName && !"".equals(campaignName.trim())) {
-            campaign.setName(campaignName);
-        }
-        if (null != budgetMode && !"".equals(budgetMode.trim())) {
-            params.put("budget_mode", budgetMode);
-            campaign.setBudgetMode(budgetMode);
-        }
-        if (null != budget) {
-            campaign.setBudget(new BigDecimal(budget));
-        }
-        campaignService.updateById(campaign);
-
-        resultMap.put("code", 0);
-        resultMap.put("message", "广告组信息修改成功");
-        return resultMap;
-    }
-
-    @Override
     public Map<String, Object> advertiserPlanUpdateStatus(CtopOauthToken token, String adIds, String optStatus) {
         Map<String, Object> resultMap = new HashMap<>();
         JSONArray ids = new JSONArray();
@@ -756,51 +633,4 @@ public class ByteDanceAdvertiserDataServiceImpl implements IByteDanceAdvertiserD
         params.put("page_size", 100);
         return HttpUtils.bytedanceGetRequest(token.getAccessToken(), url, params);
     }
-
-
-    private void getAdvertiserCampaignByPageNumber(CtopOauthToken token, Integer pageNumber, String ids, String date) {
-        //2: 根据token以及用户id获取用户信息数据
-        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_get");
-        Map<String, String> headers = new HashMap<>();
-        headers.put("Content-Type", "application/json");
-        headers.put("Access-Token", token.getAccessToken());
-
-        TreeMap<String, Object> params = new TreeMap<>();
-        JSONObject filtering = new JSONObject();
-        if (null != ids && !"".equals(ids.trim())) {
-            String[] idsArray = ids.split(StringUtils.COMMA);
-            JSONArray filterIdsArray = new JSONArray();
-            for (int i = 0; i < idsArray.length; i++) {
-                Long id = Long.parseLong(idsArray[i]);
-                filterIdsArray.add(id);
-            }
-            filtering.put("ids", filterIdsArray);
-        }
-        if (null != date && !"".equals(date)) {
-            filtering.put("campaign_create_time", date);
-        }
-        params.put("filtering", filtering.toJSONString());
-        params.put("advertiser_id", token.getAccountId());
-        params.put("page", pageNumber + "");
-        String result = HttpUtils.httpGetRequest(url, headers, params);
-        JSONObject jsonObject = JSONObject.parseObject(result);
-        Integer code = jsonObject.getInteger("code");
-
-        if (null == code || !code.equals(0)) {
-            log.error("获取广告组信息接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
-            return;
-        }
-        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
-        if (null == data || data.isEmpty()) {
-            log.error("获取广告组信息不存在==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
-            return;
-        }
-        System.out.println(data.toJSONString());
-        for (int i = 0; i < data.size(); i++) {
-            JSONObject dataObject = data.getJSONObject(i);
-            ByteDanceCampaign campaign = new ByteDanceCampaign(dataObject,token.getAccountId());
-            campaignService.saveOrUpdate(campaign);
-        }
-        getAdvertiserCampaignByPageNumber(token, pageNumber + 1, ids, date);
-    }
 }

+ 166 - 77
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCampaignServiceImpl.java

@@ -1,10 +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.utils.HttpUtils;
-import cn.com.ctop.common.module.utils.PropertiesUtils;
-import cn.com.ctop.common.module.utils.ResultMapUtils;
-import cn.com.ctop.common.module.utils.StatusCode;
+import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCampaign;
 import cn.com.ctop.toutiao.modules.material.mapper.ByteDanceCampaignMapper;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceCampaignService;
@@ -14,10 +11,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 
 /**
  * @Description: 今日头条广告组信息
@@ -29,62 +24,6 @@ import java.util.Map;
 @Service
 @Slf4j
 public class ByteDanceCampaignServiceImpl extends ServiceImpl<ByteDanceCampaignMapper, ByteDanceCampaign> implements IByteDanceCampaignService {
-    @Override
-    /**
-     * 获取广告组数据
-     */
-    public List<ByteDanceCampaign> getGroupListByParams(CtopOauthToken token, JSONArray ids, String campaignName, String landingType, String status, String campaignCreateTime, Integer page, Integer pageSize) {
-        List<ByteDanceCampaign> campaigns = new ArrayList<>();
-        // 请求地址
-        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_get");
-        // 请求参数
-        JSONObject filtering = new JSONObject();
-        if(null!=ids&&!ids.isEmpty()){
-            filtering.put("ids",ids);
-        }
-        if(null!=campaignName&&!campaignName.equals("")){
-            filtering.put("campaign_name",campaignName);
-        }
-        if(null!=landingType&&!landingType.equals("")){
-            filtering.put("landing_type",landingType);
-        }
-        if(null!=status&&!status.equals("")){
-            filtering.put("status",status);
-        }
-        if(null!=campaignCreateTime&&!campaignCreateTime.equals("")){
-            filtering.put("campaign_create_time",landingType);
-        }
-
-        JSONObject params = new JSONObject();
-        params.put("advertiser_id", token.getAccountId());
-        params.put("page", page);
-        params.put("page_size", pageSize);
-        params.put("filtering", filtering);
-        JSONObject result = HttpUtils.bytedanceGetRequest(token.getAccessToken(),url,params);
-        if(result == null){
-            log.error("获取广告组数据异常=>param:{}",params.toJSONString());
-            return campaigns;
-        }
-        Integer code = result.getInteger("code");
-        String message = result.getString("message");
-        if(null == code||!code.equals(0)){
-            log.error("获取广告组数据异常=>{},param:{}",message,params.toJSONString());
-            return campaigns;
-        }
-        JSONArray dataList = result.getJSONObject("data").getJSONArray("list");
-        if(null == dataList||dataList.isEmpty()){
-            log.info("获取广告组数据为空=>param:{}",params.toJSONString());
-            return campaigns;
-        }
-        for(int i=0;i<dataList.size();i++){
-            JSONObject data = dataList.getJSONObject(i);
-            ByteDanceCampaign campaign = new ByteDanceCampaign(data,token.getAccountId());
-            this.saveOrUpdate(campaign);
-            campaigns.add(campaign);
-        }
-        return campaigns;
-    }
-
     /**
      * 每个广告主账号下最多可允许创建500个广告组,如超出需要先删除一部分广告组后才可继续创建。
      * @param token
@@ -97,7 +36,7 @@ public class ByteDanceCampaignServiceImpl extends ServiceImpl<ByteDanceCampaignM
      * @return
      */
     @Override
-    public Map<String, Object> createGroup(CtopOauthToken token, String campaignName, String operation, String budgetMode, String budget, String landingType, String uniqueFk) {
+    public Map<String, Object> createCampaign(CtopOauthToken token, String campaignName, String operation, String budgetMode, String budget, String landingType, String uniqueFk) {
         Map<String,Object>result = new HashMap<>();
         // 请求地址
         String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_create");
@@ -136,17 +75,167 @@ public class ByteDanceCampaignServiceImpl extends ServiceImpl<ByteDanceCampaignM
     }
 
     @Override
-    public Map<String, Object> updateGroup(CtopOauthToken token, String campaignId, String campaignName, String modifyTime,String budget) {
-        // 请求地址
-        String url = "https://ad.oceanengine.com/open_api/2/campaign/update/";
-        // 请求参数
-        JSONObject data = new JSONObject();
-        data.put("advertiser_id",token.getAccountId());
-        data.put("campaign_name",campaignName);
-        data.put("budget",budget);
-        data.put("campaign_id", campaignId);
-        data.put("modify_time", modifyTime);
-        JSONObject result = HttpUtils.bytedancePostRequest(token.getAccessToken(),url,data);
-        return new HashMap<>();
+    public Map<String, Object> updateCampaign(CtopOauthToken token, String campaignId, String campaignName,String budgetMode, String budget) {
+        Map<String, Object> resultMap = new HashMap<>();
+        ByteDanceCampaign campaign = this.getById(campaignId);
+        //2: 根据token以及用户id获取用户信息数据
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update");
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", token.getAccountId());
+        params.put("campaign_id", campaignId);
+        params.put("modify_time", campaign.getModifyTime());
+        if (null != campaignName && !"".equals(campaignName.trim())) {
+            params.put("campaign_name", campaignName);
+        }
+        if (null != budgetMode && !"".equals(budgetMode.trim())) {
+            params.put("budget_mode", budgetMode);
+        }
+        if (null != budget) {
+            params.put("budget", budget);
+        }
+        String result = HttpUtils.httpPostRequest(url, params, headers);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+
+        if (null == code || !code.equals(0)) {
+            log.info("广告组更新接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", "广告组更新接口异常");
+            return resultMap;
+        }
+        JSONObject data = jsonObject.getJSONObject("data");
+        if (null == data) {
+            log.info("广告组更新异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", "广告组更新异常");
+            return resultMap;
+        }
+        if (null != campaignName && !"".equals(campaignName.trim())) {
+            campaign.setName(campaignName);
+        }
+        if (null != budgetMode && !"".equals(budgetMode.trim())) {
+            params.put("budget_mode", budgetMode);
+            campaign.setBudgetMode(budgetMode);
+        }
+        if (null != budget) {
+            campaign.setBudget(new BigDecimal(budget));
+        }
+        this.updateById(campaign);
+
+        resultMap.put("code", 0);
+        resultMap.put("message", "广告组信息修改成功");
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> getAdvertiserCampaign(CtopOauthToken token, String ids, String date) {
+        getAdvertiserCampaignByPageNumber(token, 1, ids, date);
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("code", 0);
+        resultMap.put("message", "获取广告組信息成功");
+        return resultMap;
+    }
+
+    private void getAdvertiserCampaignByPageNumber(CtopOauthToken token, Integer pageNumber, String ids, String date) {
+        //2: 根据token以及用户id获取用户信息数据
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_get");
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        TreeMap<String, Object> params = new TreeMap<>();
+        JSONObject filtering = new JSONObject();
+        if (null != ids && !"".equals(ids.trim())) {
+            String[] idsArray = ids.split(StringUtils.COMMA);
+            JSONArray filterIdsArray = new JSONArray();
+            for (int i = 0; i < idsArray.length; i++) {
+                Long id = Long.parseLong(idsArray[i]);
+                filterIdsArray.add(id);
+            }
+            filtering.put("ids", filterIdsArray);
+        }
+        if (null != date && !"".equals(date)) {
+            filtering.put("campaign_create_time", date);
+        }
+        params.put("filtering", filtering.toJSONString());
+        params.put("advertiser_id", token.getAccountId());
+        params.put("page", pageNumber + "");
+        String result = HttpUtils.httpGetRequest(url, headers, params);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+
+        if (null == code || !code.equals(0)) {
+            log.error("获取广告组信息接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            return;
+        }
+        JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
+        if (null == data || data.isEmpty()) {
+            log.error("获取广告组信息不存在==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            return;
+        }
+        System.out.println(data.toJSONString());
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject dataObject = data.getJSONObject(i);
+            ByteDanceCampaign campaign = new ByteDanceCampaign(dataObject,token.getAccountId());
+            this.saveOrUpdate(campaign);
+        }
+        getAdvertiserCampaignByPageNumber(token, pageNumber + 1, ids, date);
+    }
+
+    @Override
+    public Map<String, Object> updateCampaignStatus(CtopOauthToken token, String campaignIds, String optStatus) {
+        Map<String, Object> resultMap = new HashMap<>();
+        JSONArray ids = new JSONArray();
+        String[] getIds = campaignIds.split(StringUtils.COMMA);
+        if (null != getIds && getIds.length > 0) {
+            for (int i = 0; i < getIds.length; i++) {
+                ids.add(Long.parseLong(getIds[i]));
+            }
+        }
+        //2: 根据token以及用户id获取用户信息数据
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_campaign_update_status");
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", token.getAccountId());
+        params.put("campaign_ids", ids);
+        params.put("opt_status", optStatus);
+        String result = HttpUtils.httpPostRequest(url, params, headers);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        Integer code = jsonObject.getInteger("code");
+
+        if (null == code || !code.equals(0)) {
+            log.info("广告组更新状态接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", "广告组更新状态接口异常");
+            return resultMap;
+        }
+        JSONObject data = jsonObject.getJSONObject("data");
+        if (null == data) {
+            log.info("广告组更新状态异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            resultMap.put("code", -1);
+            resultMap.put("message", "广告组更新状态异常");
+            return resultMap;
+        }
+        JSONArray getCampaignIds = data.getJSONArray("campaign_ids");
+        if (null != getCampaignIds && !getCampaignIds.isEmpty()) {
+            for (int i = 0; i < getCampaignIds.size(); i++) {
+                Long id = getCampaignIds.getLong(i);
+                ByteDanceCampaign campaign = this.getById(id);
+                if (null != campaign) {
+                    campaign.setOptStatus(optStatus);
+                }
+                this.updateById(campaign);
+            }
+        }
+        resultMap.put("code", 0);
+        resultMap.put("message", "广告组状态修改成功");
+        return resultMap;
     }
 }

+ 19 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceEffectVideoInfoServiceImpl.java

@@ -2,12 +2,12 @@ package cn.com.ctop.toutiao.modules.material.service.impl;
 
 import cn.com.ctop.toutiao.modules.material.entity.BytedanceEffectVideoInfo;
 import cn.com.ctop.toutiao.modules.material.mapper.BytedanceEffectVideoInfoMapper;
-import cn.com.ctop.toutiao.modules.material.service.IByteDanceVideoInfoService;
 import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
 import cn.com.ctop.toutiao.modules.material.vo.BytedanceVideoVo;
 import cn.com.ctop.toutiao.modules.report.service.IBytedanceReportMaterialDailyService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xxl.job.core.log.XxlJobLogger;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -21,13 +21,13 @@ public class BytedanceEffectVideoInfoServiceImpl extends ServiceImpl<BytedanceEf
     @Autowired
     private IBytedanceReportMaterialDailyService bytedanceReportMaterialDailyService;
     @Autowired
-    private IByteDanceVideoInfoService videoInfoService;
+    private BytedanceEffectVideoInfoMapper effectVideoInfoMapper;
     @Override
     public void loadEffectVideo(String date) {
         //1:查询素材报表
         List<BytedanceVideoVo> vos = bytedanceReportMaterialDailyService.getVideoVoByDate(date);
         if(null == vos||vos.isEmpty()){
-            log.info("素材数据报表为空");
+            XxlJobLogger.log("当日头条素材数据报表为空,date:{}",date);
             return;
         }
         for (BytedanceVideoVo vo:vos) {
@@ -39,6 +39,22 @@ public class BytedanceEffectVideoInfoServiceImpl extends ServiceImpl<BytedanceEf
             effectVideoInfo.setUpdateTime(new Date());
             this.save(effectVideoInfo);
         }
+        //1:计算最后消耗时间
+        effectVideoInfoMapper.updateFinalCostDate();
+        //2:计算最终消耗总和
+        effectVideoInfoMapper.updateTotalCost();
+        //3:计算两周消耗
+        effectVideoInfoMapper.updateTwoWeekCost();
+        //4:同步修改拍摄id
+        effectVideoInfoMapper.updateShot();
+        //5:同步修改剪辑id
+        effectVideoInfoMapper.updateClip();
+        //6:同步修改策划id
+        effectVideoInfoMapper.updatePlan();
+        //7:同步修改平面id
+        effectVideoInfoMapper.updatePlane();
+        //8:负责人信息
+        effectVideoInfoMapper.updateManager();
     }
 
     @Override

+ 2 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceReportMaterialDailyMapper.xml

@@ -249,6 +249,8 @@
         and
             video.signature is not null
         and
+            report.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO','CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+        and
             video.signature not in (select distinct code from ctop_bytedance_effect_video_info)
     </select>