Browse Source

Merge remote-tracking branch 'origin/master'

yumeng 1 năm trước cách đây
mục cha
commit
8d03e37159
16 tập tin đã thay đổi với 858 bổ sung62 xóa
  1. 6 0
      job-bytedance/pom.xml
  2. 32 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java
  3. 46 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/MediaSendAlarmRecord.java
  4. 15 2
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProjectMapper.java
  5. 18 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/WexinConfigMapper.java
  6. 83 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceProjectMapper.xml
  7. 10 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/WexinConfigMapper.xml
  8. 9 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceProjectService.java
  9. 18 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IWexinConfigService.java
  10. 5 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ByteDanceAdvertiserDataServiceImpl.java
  11. 352 4
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceProjectServiceImpl.java
  12. 26 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/WexinConfigServiceImpl.java
  13. 90 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/weixin/CorpWexinUtils.java
  14. 86 0
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/weixin/WexinConfig.java
  15. 28 52
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedancePlanLoadJob.java
  16. 34 1
      job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceProjectJob.java

+ 6 - 0
job-bytedance/pom.xml

@@ -121,6 +121,12 @@
             <scope>runtime</scope>
         </dependency>
         <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-cp</artifactId>
+            <version>3.6.0</version>
+        </dependency>
+
+        <dependency>
             <groupId>net.sourceforge.jtds</groupId>
             <artifactId>jtds</artifactId>
             <version>1.3.1</version>

+ 32 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/BytedanceController.java

@@ -56,6 +56,16 @@ public class BytedanceController {
         return fileVideoService.getBytedanceVideoByAccountId(oauthToken, materialIds, 1, 100);
     }
 
+    @GetMapping(value = "/testC")
+    public void testC(Long accountId) {
+        String token = tokenService.getByAccountId(accountId);
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(accountId);
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        listService.checkAdvertiserProject(oauthToken, nowDate, 1);
+    }
+
 
     private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
@@ -171,6 +181,27 @@ public class BytedanceController {
 
     @GetMapping(value = "/getReports")
     public void getReports() {
+        List<JSONObject> tokens = tokenService.getAgentTokens();
+        //获取两个时间的每一天
+        List<String> perDay = DateUtils.getPerDay("2024-06-01", "2024-06-25");
+        for (String date : perDay) {
+            for (JSONObject obj : tokens) {
+                dailyExecutorService.submit(
+                        new Runnable() {
+                            @Override
+                            public void run() {
+                                advertiserDataService.getAgentReport(obj, date, date);
+                            }
+                        });
+            }
+//        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+//        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+//        String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+//        String yesterda3 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -3);
+//        for (JSONObject obj : tokens) {
+//            advertiserDataService.getAgentReport(obj, yesterda, yesterda);
+      /*      advertiserDataService.getAgentReport(obj, yesterda2, yesterda2);
+            advertiserDataService.getAgentReport(obj, yesterda3, yesterda3);*/
         String param = "1757332980444167";
         String token = tokenService.getByAccountId(Long.valueOf(param));
         if (Check.isNull(token)) {
@@ -181,8 +212,7 @@ public class BytedanceController {
         oauthToken.setAccessToken(token);
         oauthToken.setAccountId(Long.parseLong(param));
 
-        bytedanceFundService.getBytedanceFundInfo(oauthToken);
-
+        }
     }
 
 }

+ 46 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/MediaSendAlarmRecord.java

@@ -0,0 +1,46 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+/**
+ * @Description: 媒体预警发送表
+ */
+@Data
+@TableName("ctop_media_send_alarm_record")
+@Accessors(chain = true)
+@ApiModel(value = "ctop_media_send_alarm_record对象", description = "媒体预警发送表")
+public class MediaSendAlarmRecord {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    private Long accountId;
+    private Long planId;
+    private Long projectId;
+    private String userId;
+    private String alarmDetail;
+    private String mediaType;
+    /**
+     * createTime
+     */
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    private Date updateTime;
+
+    public MediaSendAlarmRecord(Long accountId, String mediaType, String alarmDetail) {
+        this.accountId = accountId;
+        this.mediaType = mediaType;
+        this.alarmDetail = alarmDetail;
+    }
+
+    public MediaSendAlarmRecord() {
+    }
+}

+ 15 - 2
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/BytedanceProjectMapper.java

@@ -2,14 +2,27 @@ package cn.com.ctop.job.bytedance.data.mapper;
 
 
 import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
-import cn.com.ctop.job.bytedance.data.entity.BytedancePromotionList;
+import cn.com.ctop.job.bytedance.data.entity.MediaSendAlarmRecord;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 public interface BytedanceProjectMapper {
 
-    int replaceProjectList(@Param("list")List<BytedanceCdpProject> list);
+    Long getProjectId(@Param("accountId") Long accountId);
 
+    int replaceProjectList(@Param("list") List<BytedanceCdpProject> list);
 
+    List<JSONObject> getWChatIdsByAccountId(@Param("accountId") Long accountId);
+
+    void insertSendRecord(MediaSendAlarmRecord record);
+
+    List<Long> getBytedanceRefusalSend();
+
+    List<Long> getSpecialProject();
+
+    void insertSendAccountId(@Param("accountId") Long accountId, @Param("counts") Integer counts);
+
+    Integer getrefusalAccountCounts(@Param("accountId") Long accountId);
 }

+ 18 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/WexinConfigMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+import cn.com.ctop.job.bytedance.data.utils.weixin.WexinConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * 企业微信配置信息
+ *
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+public interface WexinConfigMapper extends BaseMapper<WexinConfig> {
+
+    List<WexinConfig> getAll();
+}

+ 83 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/BytedanceProjectMapper.xml

@@ -73,5 +73,88 @@
         </foreach>
     </insert>
 
+    <select id="getProjectId" resultType="Long">
+        SELECT project_id
+        FROM `jeecg-boot`.ctop_user_allocation
+        WHERE account_id = #{accountId}
+    </select>
+
+    <!-- 获取用户微信id -->
+    <select id="getWChatIdsByAccountId" resultType="com.alibaba.fastjson.JSONObject">
+        select wexin_id, corp_id, wexin_name
+        from `jeecg-boot`.ctop_corp_wexin_user
+        where user_id = (select ctop_user_allocation.user_id
+                         from `jeecg-boot`.ctop_user_allocation
+                         where account_id = #{accountId} limit 1)
+        union all
+        select wexin_id, corp_id, wexin_name
+        from `jeecg-boot`.ctop_corp_wexin_user
+        where user_id = (select leader_id
+                         from `jeecg-boot`.sys_user
+                         where id = (SELECT ctop_user_allocation.user_id
+                                     FROM `jeecg-boot`.ctop_user_allocation
+                                     WHERE account_id = #{accountId}
+            LIMIT 1))
+        union all
+        select wexin_id, corp_id, wexin_name
+        from `jeecg-boot`.ctop_corp_wexin_user
+        where user_id = 'b07f2bdd0f914f1dab2b4e841764911f';
+    </select>
+
+    <insert id="insertSendRecord">
+        insert
+        into `jeecg-boot`.ctop_media_send_alarm_record
+        (account_id,
+         plan_id,
+         project_id,
+         user_id,
+         alarm_detail,
+         media_type)
+        values (#{accountId},
+                #{planId},
+                #{projectId},
+                #{userId},
+                #{alarmDetail},
+                #{mediaType})
+    </insert>
+
+    <insert id="insertSendAccountId">
+        replace
+        into `jeecg-boot`.bytedance_refusal_send
+        (account_id,
+         counts,
+         stat_date)
+        values (
+        #{accountId},
+        #{counts},
+        (DATE_FORMAT(now(),'%Y%m%d-%H'))
+        )
+    </insert>
+
+
+    <select id="getBytedanceRefusalSend" resultType="Long">
+        SELECT account_id
+        FROM `jeecg-boot`.bytedance_refusal_send
+        WHERE stat_date = DATE_FORMAT(now(), '%Y%m%d-%H')
+          AND counts >= 2
+    </select>
+
+    <select id="getSpecialProject" resultType="Long">
+        SELECT project_id
+        FROM `jeecg-boot`.bytedance_refusal_send
+        WHERE flag = 1
+        UNION
+        SELECT account_id
+        FROM `jeecg-boot`.bytedance_refusal_send
+        WHERE flag = 1
+    </select>
+
+    <select id="getrefusalAccountCounts" resultType="Integer">
+        SELECT ifNUll(counts, 0)
+        FROM `jeecg-boot`.bytedance_refusal_send
+        WHERE account_id = #{accountId}
+          AND stat_date = DATE_FORMAT(now(), '%Y%m%d-%H')
+    </select>
+
 
 </mapper>

+ 10 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/WexinConfigMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.job.bytedance.data.mapper.WexinConfigMapper">
+
+    <select id="getAll" resultType="cn.com.ctop.job.bytedance.data.utils.weixin.WexinConfig">
+        select *
+        from `jeecg-boot`.ctop_wexin_config
+    </select>
+
+</mapper>

+ 9 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBytedanceProjectService.java

@@ -1,12 +1,20 @@
 package cn.com.ctop.job.bytedance.data.service;
 
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
 
 /**
  * 获取项目列表
  */
 public interface IBytedanceProjectService {
 
-    void getProjectList(OauthToken oauthToken, String startDate,String endDate,int page);
+    void getProjectList(OauthToken oauthToken, String startDate, String endDate, int page);
+
+    void updProjectStatus(String token, Long accountId, Long projectId, String disable);
+
+    void checkAdvertiserProject(OauthToken oauthToken, String nowDate, int i);
 
+    void checkAdvertiserList(OauthToken oauthToken, Long projectId, String date, int page, List<JSONObject> advertiserList);
 }

+ 18 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IWexinConfigService.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+import cn.com.ctop.job.bytedance.data.utils.weixin.WexinConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * 企业微信配置信息
+ *
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+public interface IWexinConfigService extends IService<WexinConfig> {
+
+    List<WexinConfig> getAll();
+}

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ByteDanceAdvertiserDataServiceImpl.java

@@ -11,9 +11,11 @@ import cn.com.ctop.job.bytedance.data.entity.BytedanceAdReportHourly;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAdvertiserReportHourly;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceAgentReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportDaily;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3ProjectReportHourly;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceV3PromotionProjectReportDaily;
+import cn.com.ctop.job.bytedance.data.entity.MediaSendAlarmRecord;
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 import cn.com.ctop.job.bytedance.data.enums.InventoryEnum;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdGetMapper;
@@ -23,9 +25,11 @@ import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdvertiserReportDailyMappe
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAdvertiserReportHourlyMapper;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAgentReportDailyMapper;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceAgentReportHourlyMapper;
+import cn.com.ctop.job.bytedance.data.mapper.OauthTokenMapper;
 import cn.com.ctop.job.bytedance.data.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceAgentReportDailyService;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceAgentReportHourlyService;
+import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
 import cn.com.ctop.job.bytedance.data.utils.DateUtils;
 import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
@@ -46,6 +50,7 @@ import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;

+ 352 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BytedanceProjectServiceImpl.java

@@ -2,11 +2,14 @@ package cn.com.ctop.job.bytedance.data.service.impl;
 
 import cn.com.ctop.job.bytedance.data.constant.BytedanceConstant;
 import cn.com.ctop.job.bytedance.data.entity.BytedanceCdpProject;
+import cn.com.ctop.job.bytedance.data.entity.MediaSendAlarmRecord;
 import cn.com.ctop.job.bytedance.data.entity.OauthToken;
 import cn.com.ctop.job.bytedance.data.mapper.BytedanceProjectMapper;
+import cn.com.ctop.job.bytedance.data.mapper.OauthTokenMapper;
 import cn.com.ctop.job.bytedance.data.service.IBytedanceProjectService;
 import cn.com.ctop.job.bytedance.data.utils.Check;
 import cn.com.ctop.job.bytedance.data.utils.HttpUtils;
+import cn.com.ctop.job.bytedance.data.utils.weixin.CorpWexinUtils;
 import cn.com.ctop.job.bytedance.utils.RedisUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -16,8 +19,11 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 获取项目列表
@@ -32,8 +38,13 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
     BytedanceProjectMapper projectListMapper;
 
     @Autowired
+    private OauthTokenMapper tokenMapper;
+
+    @Autowired
     private RedisUtil redisUtil;
 
+    @Resource
+    private CorpWexinUtils corpWexinUtils;
 
     @Override
     public void getProjectList(OauthToken oauthToken, String startDate, String endDate, int page) {
@@ -81,16 +92,353 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
         }
     }
 
-    public void updProjectStatus(OauthToken token, Long projectId, String disable) {
+    @Override
+    public void updProjectStatus(String token, Long accountId, Long projectId, String disable) {
         JSONObject params = new JSONObject();
-        params.put("advertiser_id", token.getAccountId());
+        params.put("advertiser_id", accountId);
         JSONObject data = new JSONObject();
         data.put("project_id", projectId);
-        data.put("opt_status", disable);
+        data.put("opt_status", disable);//ENABLE 启用项目、 DISABLE 暂停项目
         List<JSONObject> list = new ArrayList<>();
         list.add(data);
         params.put("data", list);
         String url = bytedanceApiUrl + "/v3.0/project/status/update/";
-        JSONObject object = HttpUtils.bytedancePostRequest(token.getAccessToken(), url, params);
+        JSONObject object = HttpUtils.bytedancePostRequest(token, url, params);
+    }
+
+    @Override
+    public void checkAdvertiserList(OauthToken oauthToken, Long projectId, String date, int page, List<JSONObject> advertiserList) {
+        // 请求地址
+        String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_PROMOTION_LIST_GET;
+        JSONObject param = new JSONObject();
+        param.put("advertiser_id", oauthToken.getAccountId());
+        param.put("page", page);
+        param.put("page_size", 20);
+        JSONObject filtering = new JSONObject();
+        filtering.put("promotion_modify_time", date);
+        filtering.put("project_id", projectId);
+        param.put("filtering", filtering);
+        JSONObject resultObject = HttpUtils.bytedanceGetRequest(oauthToken.getAccessToken(), url, param);
+        if (Check.isNull(resultObject)) {
+            log.error("获取广告列表异常==》accountId:{},调用结果为null", oauthToken.getAccountId());
+            return;
+        }
+        Integer code = resultObject.getInteger("code");
+        if (null == code || !code.equals(0)) {
+            log.error("获取广告列表接口异常==》accountId:{},message:{},code{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+            return;
+        }
+        JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+        if (null == data || data.isEmpty()) {
+            log.info("获取广告列表数据为空==》accountId:{},message:{},code{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+            return;
+        }
+
+        for (int i = 0; i < data.size(); i++) {
+            JSONObject dataObject = data.getJSONObject(i);
+            System.out.println("账户ID:" + projectId + "数据:" + dataObject);
+            advertiserList.add(dataObject);
+        }
+
+        int totalPage = resultObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+        if (page <= totalPage) {
+            checkAdvertiserList(oauthToken, projectId, date, page + 1, advertiserList);
+        }
+    }
+
+    @Override
+    public void checkAdvertiserProject(OauthToken oauthToken, String date, int page) {
+//       一个小时内,发送2次以后拒绝发送
+        if (!checkThreeRejections(oauthToken.getAccountId())) {
+            return;
+        }
+        try {
+            // 请求地址
+            String url = bytedanceApiUrl + BytedanceConstant.BYTEDANCE_V3_PROJECT_LIST_GET;
+            JSONObject param = new JSONObject();
+            param.put("advertiser_id", oauthToken.getAccountId());
+            param.put("page", page);
+            param.put("page_size", 100);
+            JSONObject filtering = new JSONObject();
+            filtering.put("status", "PROJECT_STATUS_ENABLE");//项目 仅查询启动状态
+            param.put("filtering", filtering);
+            JSONObject resultObject = HttpUtils.bytedanceGetRequest(oauthToken.getAccessToken(), url, param);
+            if (Check.isNull(resultObject)) {
+                log.error("checkAdvertiserProject异常==》accountId:{},结果为null", oauthToken.getAccountId());
+                return;
+            }
+            Integer code = resultObject.getInteger("code");
+            if (null == code || !code.equals(0)) {
+                log.error("checkAdvertiserProject接口==》accountId:{},message:{},code{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+                return;
+            }
+            JSONArray data = resultObject.getJSONObject("data").getJSONArray("list");
+            if (null == data || data.isEmpty()) {
+                log.info("checkAdvertiserProject数据为空==》accountId:{},message:{},code:{}", oauthToken.getAccountId(), resultObject.getString("message"), code);
+                return;
+            }
+            for (int i = 0; i < data.size(); i++) {
+                JSONObject dataObject = data.getJSONObject(i);
+                System.out.println("-------项目数据:" + dataObject);
+                checkProjectBidType(oauthToken, date, dataObject);
+
+            }
+            int totalPage = resultObject.getJSONObject("data").getJSONObject("page_info").getInteger("total_page");
+            if (page <= totalPage) {
+                checkAdvertiserProject(oauthToken, date, page + 1);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    //检查 发送3次以后拒绝发送
+    private boolean checkThreeRejections(Long accountId) {
+        Long projectId = projectListMapper.getProjectId(accountId);
+        List<Long> ids = projectListMapper.getSpecialProject();
+        if (ids.contains(accountId) || ids.contains(projectId)) {
+            //过滤标记 都不发送
+            return false;
+        }
+        List<Long> accountIds = projectListMapper.getBytedanceRefusalSend();
+        if (!Check.isNull(accountIds)) {
+            return !accountIds.contains(accountId);
+        }
+        return true;
+    }
+
+
+    /**
+     * 校验转化出价,并预警
+     */
+    public void checkProjectBidType(OauthToken oauthToken, String date, JSONObject detail) {
+        Long accountId = detail.getLong("advertiser_id");
+        //项目ID
+        Long projectId = detail.getLong("project_id");
+        JSONObject json = tokenMapper.getProjectByAccountId(accountId);
+        if (Check.isNull(json) || Check.isNull(detail)) {
+            return;
+        }
+
+        Map<String, String> textMap = new HashMap<>();
+        List<JSONObject> lists = tokenMapper.getBytedanceOcpxTypeList();
+        for (JSONObject da : lists) {
+            textMap.put(da.getString("ocpxActionType"), da.getString("ocpxActionName"));
+        }
+
+        //转化目标map
+        Map<String, String> ocpxMap = new HashMap<>();
+        String ocpxTypeStr = json.getString("ocpxActionType");
+        if (!Check.isNull(ocpxTypeStr)) {
+            JSONArray ocpxArr = JSONArray.parseArray(ocpxTypeStr);
+            StringBuffer nameStr = new StringBuffer();
+            for (int i = 0; i < ocpxArr.size(); i++) {
+                JSONObject obj = ocpxArr.getJSONObject(i);
+                ocpxMap.put(obj.getString("ocpxCode"), obj.getString("maxValue"));
+                nameStr.append(textMap.get(obj.getString("ocpxCode"))).append(" ");
+            }
+            if (ocpxArr.size() > 0) {
+                ocpxMap.put("nameStr", nameStr.toString());
+            }
+        }
+
+        //深度转化目标map
+        Map<String, String> deepMap = new HashMap<>();
+        String deepTypeStr = json.getString("deepConversionType");
+        if (!Check.isNull(deepTypeStr)) {
+            JSONArray deepArr = JSONArray.parseArray(deepTypeStr);
+            StringBuffer nameStr = new StringBuffer();
+            for (int i = 0; i < deepArr.size(); i++) {
+                JSONObject obj = deepArr.getJSONObject(i);
+                deepMap.put(obj.getString("deepCode"), obj.getString("deepValue"));
+                nameStr.append(textMap.get(obj.getString("deepCode"))).append(" ");
+            }
+            if (deepArr.size() > 0) {
+                deepMap.put("nameStr", nameStr.toString());
+            }
+        }
+
+        //操作状态
+        String optStatus = detail.getString("opt_status");// ENABLE 启用项目、 DISABLE 暂停项目
+        if ("ENABLE".equals(optStatus)) {
+            //转化目标出价
+            String cpaBid = detail.getJSONObject("delivery_setting").getString("cpa_bid");
+            //深度转化目标出价
+            String deepConversionBid = detail.getJSONObject("delivery_setting").getString("deep_cpabid");
+
+            List<JSONObject> advertiserList = new ArrayList<>();
+            if (Check.isNull(cpaBid) || Check.isNull(deepConversionBid)) {
+                this.checkAdvertiserList(oauthToken, projectId, date, 1, advertiserList);
+                if (advertiserList.size() > 0) {
+                    for (JSONObject adObj : advertiserList) {
+                        String statusFirst = adObj.getString("status_first");
+                        //一级状态:PROMOTION_STATUS_ENABLE 投放中
+                        if ("PROMOTION_STATUS_ENABLE".equals(statusFirst)) {
+                            checkLogic("ad", detail, ocpxMap, textMap, deepMap, adObj.getString("cpa_bid"),
+                                    adObj.getString("deep_cpabid"), json.getString("projectName"), adObj);
+                        } else if ("PROMOTION_STATUS_DISABLE".equals(statusFirst)) {
+                            String statusSecond = adObj.getString("status_second");
+                            //除了广告二级状态 已暂停的状态,其他状态都需要预警
+                            if (!"DISABLE_BY_QUOTA".equals(statusSecond)) {
+                                checkLogic("ad", detail, ocpxMap, textMap, deepMap, adObj.getString("cpa_bid"),
+                                        adObj.getString("deep_cpabid"), json.getString("projectName"), adObj);
+                            }
+                        }
+                    }
+                }
+            } else {
+                checkLogic("project", detail, ocpxMap, textMap, deepMap, cpaBid,
+                        deepConversionBid, json.getString("projectName"), new JSONObject());
+            }
+        }
+    }
+
+    //判断逻辑
+    private void checkLogic(String type, JSONObject detail, Map<String, String> ocpxMap, Map<String, String> textMap, Map<String, String> deepMap,
+                            String cpaBid, String deepConversionBid, String localProject, JSONObject adObj) {
+        Long accountId = detail.getLong("advertiser_id");
+        //广告项目ID
+        Long projectId = detail.getLong("project_id");
+        //广告项目名称
+        String projectName = detail.getString("name");
+        JSONObject data = new JSONObject();
+        //转化目标
+        String ocpxActionType = detail.getJSONObject("optimize_goal").getString("external_action");
+        //深度转化目标
+        String deepConversionType = detail.getJSONObject("optimize_goal").getString("deep_external_action");
+
+        StringBuffer msgType = new StringBuffer();
+        StringBuffer msgBid = new StringBuffer();
+        //转化目标标识
+        Boolean typeFalg = true;
+        //出价标识
+        Boolean bidFalg = true;
+        //转化目标
+        if (!Check.isNull(ocpxActionType)) {
+            if (ocpxMap.isEmpty()) {
+                typeFalg = false;
+                String msg = Check.isNull(textMap.get(ocpxActionType)) ? ocpxActionType : textMap.get(ocpxActionType);
+                msgType.append("未设转化,目标转化:").append(msg);
+            } else {
+                //转化出价
+                String ocpxBid = ocpxMap.get(ocpxActionType);
+                //通过转化目标没有查询到转化出价,判断为转化目标不一致,触发关停
+                if (Check.isNull(ocpxBid)) {
+                    typeFalg = false;
+                    String msg = Check.isNull(textMap.get(ocpxActionType)) ? ocpxActionType : textMap.get(ocpxActionType);
+                    msgType.append("已设转化:").append(ocpxMap.get("nameStr")).append("<br/>").append("目标转化:").append(msg);
+                } else {
+                    //未查询到转化出价,说明出价不一致,触发出价关停。
+                    if (Check.isNull(cpaBid)) {
+                        bidFalg = false;
+                        msgBid.append("目标出价为空");
+                    } else {
+                        BigDecimal cpa = new BigDecimal(cpaBid).multiply(new BigDecimal("1000"));
+                        BigDecimal ocpx = new BigDecimal(ocpxBid);
+                        if (cpa.compareTo(ocpx) == 1) {
+                            //计划转化出价cpa 大于 项目设置最大转化出价,则关停
+                            bidFalg = false;
+                            msgBid.append("目标出价:").append(cpaBid);
+                        }
+                    }
+                }
+            }
+        }
+        //深度转化目标
+        if (typeFalg && bidFalg) {
+            if (!Check.isNull(deepConversionType) && deepMap.isEmpty()) {
+                typeFalg = false;
+                String msg = Check.isNull(textMap.get(deepConversionType)) ? deepConversionType : textMap.get(deepConversionType);
+                msgType.append("未设深度转化,目标深度转化:").append(msg);
+            } else if (!Check.isNull(deepConversionType)) {
+                String deepBid = deepMap.get(deepConversionType);
+                if (Check.isNull(deepBid)) {
+                    //通过key未获取值,说明不包含该目标,进行关停
+                    typeFalg = false;
+                    String msg = Check.isNull(textMap.get(deepConversionType)) ? deepConversionType : textMap.get(deepConversionType);
+                    msgType.append("已设深度:").append(deepMap.get("nameStr")).append("<br/>").append("目标深度:").append(msg);
+
+                } else {
+                    //未查询到转化出价,说明出价不一致,触发出价关停。
+                    if (Check.isNull(deepConversionBid)) {
+                        bidFalg = false;
+                        msgBid.append("目标深度出价为空");
+                    } else {
+                        BigDecimal cpa = new BigDecimal(deepConversionBid).multiply(new BigDecimal("1000"));
+                        BigDecimal ocpx = new BigDecimal(deepBid);
+                        if (cpa.compareTo(ocpx) == 1) {
+                            //计划转化出价cpa 大于 项目设置最大转化出价,则关停
+                            bidFalg = false;
+                            msgBid.append("目标深度出价:").append(deepConversionBid);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!typeFalg) { // 出价方式设置非法
+            String text = getProjectBidTypeText(localProject, accountId, projectId, projectName, adObj.getLong("promotion_id"), adObj.getString("promotion_name"), msgType.toString());
+            sendMsg(accountId, projectId, text);
+        }
+        if (!bidFalg) {
+            String text = getProjectOverBidMessage(localProject, accountId, projectId, projectName, adObj.getLong("promotion_id"), adObj.getString("promotion_name"), msgBid.toString());
+            sendMsg(accountId, projectId, text);
+        }
+    }
+
+    private void sendMsg(Long accountId, Long projectId, String text) {
+        try {
+            MediaSendAlarmRecord record = new MediaSendAlarmRecord(accountId, "1", text);
+            record.setProjectId(projectId);
+            //关停计划
+//        String token = tokenMapper.getByAccountId(accountId);
+//        this.updProjectStatus(token, accountId, projectId, "DISABLE");
+//        log.info(">预警<,账户:{}=>计划:{}现已【关停】---> {}", accountId, projectId, text);
+            List<JSONObject> list = projectListMapper.getWChatIdsByAccountId(accountId);
+            for (JSONObject object : list) {
+                corpWexinUtils.sendMessageByWeChatId(object, text);
+            }
+            //添加记录 ctop_media_send_alarm_record
+            projectListMapper.insertSendRecord(record);
+            //当前已发送次数
+
+            Integer i = projectListMapper.getrefusalAccountCounts(accountId);
+            //更新计数
+            projectListMapper.insertSendAccountId(accountId, (Check.isNull(i) ? 0 : i) + 1);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    //转化方式错误消息生成
+    private String getProjectBidTypeText(String projectName, Long advertiserId, Long unitId, String unit_name, Long adId, String adName, String msgType) {
+        StringBuilder text = new StringBuilder();
+        text.append("出价方式错误预警").append("<br/>")
+                .append("您本地的项目:").append(projectName).append("<br/>")
+                .append("下的账户:").append(advertiserId).append("<br/>")
+                .append("项目id:").append(unitId).append("<br/>")
+                .append("项目名称:").append(unit_name).append("<br/>");
+        if (!Check.isNull(adId)) {
+            text.append("广告id:").append(adId).append("<br/>").append("广告名称:").append(adName).append("<br/>");
+        }
+        text.append("出价方式设置错误。").append("<br/>").append(msgType).append("<br/>").append("请您及时查看!");
+        return text.toString();
+    }
+
+    //出价过高预警消息生成
+    private String getProjectOverBidMessage(String projectName, Long accountId, Long planId, String planName, Long adId, String adName, String msgBid) {
+        StringBuilder text = new StringBuilder();
+        text.append("出价过高预警").append("<br/>")
+                .append("您本地的项目:").append(projectName).append("<br/>")
+                .append("下的账户:").append(accountId).append("<br/>")
+                .append("项目id:").append(planId).append("<br/>")
+                .append("项目名称:").append(planName).append("<br/>");
+        if (!Check.isNull(adId)) {
+            text.append("广告id:").append(adId).append("<br/>").append("广告名称:").append(adName).append("<br/>");
+        }
+        text.append("出价设置过高。").append("<br/>").append(msgBid).append("<br/>").append("请您及时查看!");
+        return text.toString();
     }
 }

+ 26 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/WexinConfigServiceImpl.java

@@ -0,0 +1,26 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.WexinConfigMapper;
+import cn.com.ctop.job.bytedance.data.service.IWexinConfigService;
+import cn.com.ctop.job.bytedance.data.utils.weixin.WexinConfig;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 企业微信配置信息
+ *
+ * @author jeecg-boot
+ * 2021-06-17
+ * @version V1.0
+ */
+@Service
+public class WexinConfigServiceImpl extends ServiceImpl<WexinConfigMapper, WexinConfig> implements IWexinConfigService {
+
+    @Override
+    public List<WexinConfig> getAll() {
+        return baseMapper.getAll();
+    }
+}

+ 90 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/weixin/CorpWexinUtils.java

@@ -0,0 +1,90 @@
+package cn.com.ctop.job.bytedance.data.utils.weixin;
+
+import cn.com.ctop.job.bytedance.data.service.IWexinConfigService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
+import me.chanjar.weixin.cp.bean.WxCpMessage;
+import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class CorpWexinUtils {
+    @Resource
+    private IWexinConfigService wexinConfigService;
+
+    private static Map<String, WexinConfig> configMap = new HashMap<>();
+
+    private Map<String, WexinConfig> getConfigMap() {
+        List<WexinConfig> list = wexinConfigService.getAll();
+        for (WexinConfig config : list) {
+            WxCpService wxCpService = new WxCpServiceImpl();
+            val configStorage = new WxCpDefaultConfigImpl();
+            configStorage.setCorpId(config.getCorpId());
+            configStorage.setAgentId(config.getAgentId());
+            configStorage.setCorpSecret(config.getCorpSecret());
+            configStorage.setToken(config.getToken());
+            configStorage.setAesKey(config.getAesKey());
+            wxCpService.setWxCpConfigStorage(configStorage);
+            config.setWxCpService(wxCpService);
+            configMap.put(config.getCorpId(), config);
+        }
+        return configMap;
+    }
+
+    public void sendMessage(List<JSONObject> wxUserList, String content) {
+        if (Check.isNullMap(configMap)) {
+            getConfigMap();
+        }
+        if (wxUserList != null && wxUserList.size() > 0) {
+            for (JSONObject userInfo : wxUserList) {
+                WxCpMessage message = new WxCpMessage();
+                message.setMsgType("text");
+                message.setContent(content);
+                message.setAgentId(1000002);
+                message.setToUser(userInfo.getString("wexin_id"));
+                try {
+                    WexinConfig config = configMap.get(userInfo.getString("corp_id"));
+                    WxCpService wxCpService = config.getWxCpService();
+                    wxCpService.messageSend(message);
+                } catch (WxErrorException e) {
+                    log.error("发送信息失败,userId:{}", userInfo.getString("wexin_id"));
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    public void sendMessageByWeChatId(JSONObject weChatInfo, String content) {
+        if (Check.isNullMap(configMap)) {
+            this.getConfigMap();
+        }
+        if (!Check.isNull(weChatInfo)) {
+            WxCpMessage message = new WxCpMessage();
+            message.setMsgType("text");
+            message.setContent(content);
+            message.setAgentId(1000002);
+            message.setToUser(weChatInfo.getString("wexin_id"));
+            //测试 id  ZhaoXiAn
+//            message.setToUser("ZhaoXiAn");
+            try {
+                WexinConfig config = configMap.get(weChatInfo.getString("corp_id"));
+                WxCpService wxCpService = config.getWxCpService();
+                wxCpService.messageSend(message);
+            } catch (WxErrorException e) {
+                log.error("发送信息失败,userId:{}", weChatInfo.getString("wexin_id"));
+                e.printStackTrace();
+            }
+        }
+    }
+}

+ 86 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/weixin/WexinConfig.java

@@ -0,0 +1,86 @@
+package cn.com.ctop.job.bytedance.data.utils.weixin;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.cp.api.WxCpService;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 企业微信配置信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-06-17
+ */
+@Data
+@TableName("ctop_wexin_config")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_wexin_config对象", description = "企业微信配置信息")
+public class WexinConfig {
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private Integer id;
+    /**
+     * corpId
+     */
+    @Excel(name = "corpId", width = 15)
+    @ApiModelProperty(value = "corpId")
+    private String corpId;
+    /**
+     * agentId
+     */
+    @Excel(name = "agentId", width = 15)
+    @ApiModelProperty(value = "agentId")
+    private Integer agentId;
+    /**
+     * corpSecret
+     */
+    @Excel(name = "corpSecret", width = 15)
+    @ApiModelProperty(value = "corpSecret")
+    private String corpSecret;
+    /**
+     * aesKey
+     */
+    @Excel(name = "aesKey", width = 15)
+    @ApiModelProperty(value = "aesKey")
+    private String aesKey;
+    /**
+     * token
+     */
+    @Excel(name = "token", width = 15)
+    @ApiModelProperty(value = "token")
+    private String token;
+    /**
+     * remarks
+     */
+    @Excel(name = "remarks", width = 15)
+    @ApiModelProperty(value = "remarks")
+    private String remarks;
+    /**
+     * createTime
+     */
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+    /**
+     * updateTime
+     */
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private WxCpService wxCpService;
+}

+ 28 - 52
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedancePlanLoadJob.java

@@ -11,15 +11,18 @@ import cn.com.ctop.job.bytedance.utils.RedisUtil;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 广告计划定时任务
@@ -52,7 +55,7 @@ public class BytedancePlanLoadJob {
         //String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
 
         Set<String> set = redisUtil.kesy("AD*");
-        if (Check.isNull(set)){
+        if (Check.isNull(set)) {
             return;
         }
 
@@ -61,10 +64,10 @@ public class BytedancePlanLoadJob {
 
             //添加重试
             List<Object> adAccountList;
-            adAccountList = redisUtil.getList(yesterda,null);
+            adAccountList = redisUtil.getList(yesterda, null);
             for (Object accountId : adAccountList) {
 
-               // log.info("广告计划遗漏数据补充,日期:{},accountId:{}",yesterda,adAccountList.toString());
+                // log.info("广告计划遗漏数据补充,日期:{},accountId:{}",yesterda,adAccountList.toString());
                 String token = tokenService.getByAccountId(Long.valueOf(String.valueOf(accountId)));
                 if (Check.isNull(token)) {
                     log.error("此账户未获取到相关token,accountId:{}", accountId);
@@ -74,16 +77,16 @@ public class BytedancePlanLoadJob {
                 OauthToken oauthToken = new OauthToken();
                 oauthToken.setAccessToken(token);
                 oauthToken.setAccountId(Long.valueOf(String.valueOf(accountId)));
-                advertiserDataService.getAdvertiserPlan(oauthToken, "", null,  yesterda.replaceAll("AD",""));
+                advertiserDataService.getAdvertiserPlan(oauthToken, "", null, yesterda.replaceAll("AD", ""));
 
-                adAccountList = redisUtil.getList(yesterda,null);
+                adAccountList = redisUtil.getList(yesterda, null);
 
-                if (adAccountList.size() == 0){
+                if (adAccountList.size() == 0) {
                     redisUtil.delete(yesterda);
                 }
 
                 try {
-                    Thread.sleep(1000*2);
+                    Thread.sleep(1000 * 2);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
@@ -93,13 +96,9 @@ public class BytedancePlanLoadJob {
         }
 
 
-
-
     }
 
 
-
-
     /**
      * 获取广告计划列表信息
      *
@@ -113,18 +112,18 @@ public class BytedancePlanLoadJob {
             return;
         }
 
-            String token = tokenService.getByAccountId(Long.valueOf(param));
-            if (Check.isNull(token)) {
-                log.error("此账户未获取到相关token,accountId:{}", param);
-                return;
-            }
-            String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
-            String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
-            String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
-            String yesterda3 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -3);
-            OauthToken oauthToken = new OauthToken();
-            oauthToken.setAccessToken(token);
-            oauthToken.setAccountId(Long.parseLong(param));
+        String token = tokenService.getByAccountId(Long.valueOf(param));
+        if (Check.isNull(token)) {
+            log.error("此账户未获取到相关token,accountId:{}", param);
+            return;
+        }
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+        String yesterda3 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -3);
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(Long.parseLong(param));
 
         dailyExecutorService.submit(
                 new Runnable() {
@@ -212,10 +211,6 @@ public class BytedancePlanLoadJob {
                 });
     }
 
-
-
-
-
     /**
      * 第三方监测链接预警
      *
@@ -226,29 +221,10 @@ public class BytedancePlanLoadJob {
         String param = XxlJobHelper.getJobParam(); // 执行参数
 //       String urlPrefix = "http://192.168.1.43:8808/bytedance-api/ad/bytedancePlanJobController/monitorBytedanceActionTrackUrl";
 //       String urlPrefix = "http://139.186.165.84:8808/bytedance-api/ad/bytedancePlanJobController/monitorBytedanceActionTrackUrl";
-       String urlPrefix = "http://118.24.244.213:8808/bytedance-api/ad/bytedancePlanJobController/monitorBytedanceActionTrackUrl";
-
-        Map<String,Object> map = new HashMap();
-        map.put("accountId",param);
-        HttpUtils.httpGet(urlPrefix, map, null);
-    }
-
-
-    /**
-     * 计划转化目标、转化出价预警
-     *
-     * @throws Exception
-     */
-    @XxlJob("ocpxActionTypeTrackUrlJob")
-    public void ocpxActionTypeTrackUrlJob() throws Exception {
-        String param = XxlJobHelper.getJobParam(); // 执行参数
-       String urlPrefix = "http://118.24.244.213:8808/bytedance-api/ad/bytedancePlanJobController/ocpxActionTypeTrackUrl";
+        String urlPrefix = "http://118.24.244.213:8808/bytedance-api/ad/bytedancePlanJobController/monitorBytedanceActionTrackUrl";
 
-        Map<String,Object> map = new HashMap();
-        map.put("accountId",param);
+        Map<String, Object> map = new HashMap();
+        map.put("accountId", param);
         HttpUtils.httpGet(urlPrefix, map, null);
     }
-
-
-
 }

+ 34 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceProjectJob.java

@@ -24,6 +24,7 @@ public class BytedanceProjectJob {
     private IOauthTokenService tokenService;
 
     private static ExecutorService dailyExecutorService = Executors.newFixedThreadPool(3);
+    private static ExecutorService ocpxActionTypeExecutorService = Executors.newFixedThreadPool(5);
 
 
     @Autowired
@@ -32,7 +33,6 @@ public class BytedanceProjectJob {
 
     /**
      * 获取项目列表
-     *
      */
     @XxlJob("getV3Project")
     public void getV3Project() throws Exception {
@@ -66,4 +66,37 @@ public class BytedanceProjectJob {
 
     }
 
+    /**
+     * 计划转化目标、转化出价预警
+     *
+     * @throws Exception
+     */
+    @XxlJob("ocpxActionTypeTrackUrlJob")
+    public void ocpxActionTypeTrackUrlJob() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+        String token = tokenService.getByAccountId(Long.valueOf(param));
+        if (Check.isNull(token)) {
+            log.error("此账户未获取到相关token,accountId:{}", param);
+            return;
+        }
+        OauthToken oauthToken = new OauthToken();
+        oauthToken.setAccessToken(token);
+        oauthToken.setAccountId(Long.parseLong(param));
+
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+//        String yesterda = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+//        String yesterda2 = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -2);
+        ocpxActionTypeExecutorService.submit(
+                new Runnable() {
+                    @Override
+                    public void run() {
+                        projectService.checkAdvertiserProject(oauthToken, nowDate, 1);
+                    }
+                });
+    }
+
 }