Bläddra i källkod

Merge branch 'master' of codeup.aliyun.com:60c06368dbbed34fe0f0c263/job/hr_job-adq into pingkang

hpk 4 månader sedan
förälder
incheckning
fc786fab3e
19 ändrade filer med 944 tillägg och 0 borttagningar
  1. 30 0
      job-adq/src/main/java/cn/com/ctop/job/adq/controller/AdqController.java
  2. 73 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/entity/ClCreativeUserList.java
  3. 10 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/ClCreativeUserMapper.java
  4. 14 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/MovieLevelMapper.java
  5. 13 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/RefreshTokenMapper.java
  6. 23 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/ClCreativeUserMapper.xml
  7. 25 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/MovieLevelMapper.xml
  8. 16 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/RefreshTokenMapper.xml
  9. 5 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IClCreativeUserService.java
  10. 10 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IMovieLevelService.java
  11. 5 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IRefreshTokenService.java
  12. 122 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/ClCreativeUserServiceImpl.java
  13. 156 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/MovieLevelServiceImpl.java
  14. 57 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/RefreshTokenServiceImpl.java
  15. 266 0
      job-adq/src/main/java/cn/com/ctop/job/adq/data/utils/Signature.java
  16. 23 0
      job-adq/src/main/java/cn/com/ctop/job/adq/handler/AdqRefreshTokenJob.java
  17. 33 0
      job-adq/src/main/java/cn/com/ctop/job/adq/handler/ClCreativeUserJob.java
  18. 25 0
      job-adq/src/main/java/cn/com/ctop/job/adq/handler/MovieLevelJob.java
  19. 38 0
      job-adq/src/main/java/cn/com/ctop/job/adq/handler/ToolsSiteJob.java

+ 30 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/controller/AdqController.java

@@ -50,6 +50,36 @@ public class AdqController {
     private IAdqMaterialReportService adqMaterialReportService;
     @Autowired
     private IDailyBalanceReportService dailyBalanceReportService;
+    @Autowired
+    private IClCreativeUserService creativeUserService;
+    @Autowired
+    private IMovieLevelService movieLevelService;
+    @Autowired
+    private IRefreshTokenService refreshTokenService;
+
+    @GetMapping("/refreshToken")
+    public JSONObject refreshToken() throws InterruptedException {
+        refreshTokenService.refreshToken();
+        return null;
+
+    }
+
+    @GetMapping("/sendMovie")
+    public JSONObject sendMovie() throws InterruptedException {
+        movieLevelService.sendMovieLevel();
+        return null;
+
+    }
+
+
+    @GetMapping("/clCreativeUser")
+    public JSONObject clCreativeUser() throws InterruptedException {
+
+        creativeUserService.getCreativeUser(1);
+
+        return null;
+
+    }
 
 
     @GetMapping("/getBalanceReport")

+ 73 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/entity/ClCreativeUserList.java

@@ -0,0 +1,73 @@
+package cn.com.ctop.job.adq.data.entity;
+
+/**
+ * 【请填写功能名称】对象 cl_creative_user_list
+ *
+ * @author ruoyi
+ * @date 2025-12-03
+ */
+public class ClCreativeUserList {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 管家账户ID
+     */
+    private Long creativeId;
+
+    /**
+     * 是否临时人员(0否 1是)
+     */
+    private Integer isTemporary;
+
+    /**
+     * 管家账户名称
+     */
+    private String name;
+
+    /**
+     * 管家账户名称
+     */
+    private Long userId;
+
+    public void setCreativeId(Long creativeId) {
+        this.creativeId = creativeId;
+    }
+
+    public Long getCreativeId() {
+        return creativeId;
+    }
+
+    public void setIsTemporary(Integer isTemporary) {
+        this.isTemporary = isTemporary;
+    }
+
+    public Integer getIsTemporary() {
+        return isTemporary;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String toString() {
+        return "ClCreativeUserList{" +
+                "creativeId=" + creativeId +
+                ", isTemporary=" + isTemporary +
+                ", name='" + name + '\'' +
+                ", userId='" + userId + '\'' +
+                '}';
+    }
+}

+ 10 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/ClCreativeUserMapper.java

@@ -0,0 +1,10 @@
+package cn.com.ctop.job.adq.data.mapper;
+
+import cn.com.ctop.job.adq.data.entity.ClCreativeUserList;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ClCreativeUserMapper {
+    void addCreatives(@Param("addList") List<ClCreativeUserList> addList);
+}

+ 14 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/MovieLevelMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.job.adq.data.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MovieLevelMapper {
+    List<JSONObject> getMovieList();
+
+    Integer checkLog(@Param("videoProjectId") String videoProjectId, @Param("level") String level);
+
+    void insertSendLog(@Param("videoProjectId") String videoProjectId, @Param("level") String level);
+}

+ 13 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/RefreshTokenMapper.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.job.adq.data.mapper;
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface RefreshTokenMapper {
+    List<JSONObject> getAllTokenList();
+
+    void updateToken(@Param("adminAdvertiserId") Long adminAdvertiserId, @Param("updateAccessToken") String updateAccessToken, @Param("updateRefreshToken") String updateRefreshToken);
+}

+ 23 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/ClCreativeUserMapper.xml

@@ -0,0 +1,23 @@
+<?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.adq.data.mapper.ClCreativeUserMapper">
+
+
+    <insert id="addCreatives">
+        replace into deepthink.cl_creative_user_list (
+        creative_id,
+        is_temporary,
+        `name`,
+        user_id
+        )
+        values
+        <foreach collection="addList" item="item" separator=",">
+            (
+            #{item.creativeId},
+            #{item.isTemporary},
+            #{item.name},
+            #{item.userId}
+            )
+        </foreach>
+    </insert>
+</mapper>

+ 25 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/MovieLevelMapper.xml

@@ -0,0 +1,25 @@
+<?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.adq.data.mapper.MovieLevelMapper">
+    <insert id="insertSendLog">
+        INSERT INTO thirtpart.send_movie_level_log(video_project_id, video_project_level)
+        VALUES (#{videoProjectId}, #{level});
+
+    </insert>
+
+
+    <select id="getMovieList" resultType="com.alibaba.fastjson.JSONObject">
+        select video_project_id as 'videoProjectId', video_project_name as 'videoProjectName', diff_day as 'diffDay', sum_cost as 'sumCost',
+            t2.source as 'source',t2.content_type as 'contentType'
+        from application.video_project_cost_detail t1 left join thirtpart.ly_video_project t2
+                                                                on t1.video_project_id = t2.id
+        where diff_day &lt;= 91
+
+    </select>
+    <select id="checkLog" resultType="java.lang.Integer">
+        select count(1)
+        from thirtpart.send_movie_level_log
+        where video_project_id = #{videoProjectId}
+          and video_project_level = #{level}
+    </select>
+</mapper>

+ 16 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/mapper/xml/RefreshTokenMapper.xml

@@ -0,0 +1,16 @@
+<?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.adq.data.mapper.RefreshTokenMapper">
+    <update id="updateToken">
+        update deepthink.adq_auth_list
+        set access_token  = #{updateAccessToken},
+            refresh_token = #{updateRefreshToken}
+        where admin_advertiser_id = #{adminAdvertiserId}
+    </update>
+
+
+    <select id="getAllTokenList" resultType="com.alibaba.fastjson.JSONObject">
+        select admin_advertiser_id as 'adminAdvertiserId', client_id as 'clientId', client_secret as 'clientSecret', refresh_token as 'refreshToken'
+        from deepthink.adq_auth_list
+    </select>
+</mapper>

+ 5 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IClCreativeUserService.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.job.adq.data.service;
+
+public interface IClCreativeUserService {
+    void getCreativeUser(int page);
+}

+ 10 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IMovieLevelService.java

@@ -0,0 +1,10 @@
+package cn.com.ctop.job.adq.data.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+
+public interface IMovieLevelService {
+
+    void sendMovieLevel();
+}

+ 5 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/IRefreshTokenService.java

@@ -0,0 +1,5 @@
+package cn.com.ctop.job.adq.data.service;
+
+public interface IRefreshTokenService {
+    void refreshToken();
+}

+ 122 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/ClCreativeUserServiceImpl.java

@@ -0,0 +1,122 @@
+package cn.com.ctop.job.adq.data.service.impl;
+
+import cn.com.ctop.job.adq.data.entity.ClCreativeUserList;
+import cn.com.ctop.job.adq.data.mapper.ClCreativeUserMapper;
+import cn.com.ctop.job.adq.data.service.IClCreativeUserService;
+import cn.com.ctop.job.adq.data.utils.Check;
+import cn.com.ctop.job.adq.data.utils.Signature;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static cn.com.ctop.job.adq.data.utils.Signature.unicodeToString;
+
+@Slf4j
+@Service
+public class ClCreativeUserServiceImpl implements IClCreativeUserService {
+    private static String secret = "302424a82b378320e5dc7008a916e2ab";
+    private static String email = "yuyang2@hrcentury.cn";
+    @Autowired
+    private ClCreativeUserMapper clCreativeUserMapper;
+
+
+    @Override
+    public void getCreativeUser(int page) {
+        try {
+            String url = "https://openapi.mobgi.com/api/material/getCreativeUser";
+            JSONObject json = new JSONObject();
+            json.put("page", page);
+            json.put("page_size", 100);
+            JSONObject jsonObject = this.httpRequest(url, json);
+            boolean isNextPage = false;
+            if (!Check.isNull(jsonObject)) {
+                Integer code = jsonObject.getInteger("code");
+                if (code == 0) {
+                    JSONObject data = jsonObject.getJSONObject("data");
+                    if (!Check.isNull(data)) {
+                        JSONObject pagination = data.getJSONObject("pagination");
+                        if (!Check.isNull(pagination)) {
+                            Integer totalPage = pagination.getInteger("total_page");
+                            if (!Check.isNull(totalPage)) {
+                                if (totalPage > page) {
+                                    isNextPage = true;
+                                }
+                            }
+                        }
+                        JSONArray list = data.getJSONArray("list");
+                        if (!Check.isNull(list)) {
+                            List<ClCreativeUserList> addList = new ArrayList<>();
+                            for (int i = 0; i < list.size(); i++) {
+                                JSONObject addJson = list.getJSONObject(i);
+                                ClCreativeUserList userList = new ClCreativeUserList();
+                                Long creativeId = addJson.getLong("id");
+                                Long userId = addJson.getLong("user_id");
+                                Integer isTemporary = addJson.getInteger("is_temporary");
+                                String name = addJson.getString("name");
+                                userList.setCreativeId(creativeId);
+                                userList.setUserId(userId);
+                                userList.setIsTemporary(isTemporary);
+                                userList.setName(name);
+                                addList.add(userList);
+                            }
+                            if (!Check.isNull(addList)) {
+                                clCreativeUserMapper.addCreatives(addList);
+                            }
+                        }
+                    }
+                } else {
+                    log.error("创量获取创意人员失败,result:{}", jsonObject);
+                }
+            }
+
+            if (isNextPage) {
+                getCreativeUser(page + 1);
+            }
+            log.info("创量创意人员获取成功");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public JSONObject httpRequest(String url, JSONObject requestJson) throws Exception {
+        long timestamp = System.currentTimeMillis() / 1000;
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> params = objectMapper.readValue(requestJson.toString(), new TypeReference<Map<String, Object>>() {
+        });
+        Signature signature = new Signature(secret);
+        String signStr = signature.buildSignature(timestamp, params);
+        //设置header
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
+        headers.add("email", email);
+        headers.add("timestamp", String.valueOf(timestamp));
+        headers.add("signature", signStr);
+        //接口请求
+        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, entity, String.class);
+
+        JSONObject returnJson = new JSONObject();
+        //获得响应
+        String body = responseEntity.getBody();
+        if (!Check.isNull(body)) {
+            returnJson = JSONObject.parseObject(unicodeToString(body));
+        }
+        return returnJson;
+    }
+}

+ 156 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/MovieLevelServiceImpl.java

@@ -0,0 +1,156 @@
+package cn.com.ctop.job.adq.data.service.impl;
+
+import cn.com.ctop.job.adq.data.mapper.MovieLevelMapper;
+import cn.com.ctop.job.adq.data.service.IMovieLevelService;
+import cn.com.ctop.job.adq.data.utils.Check;
+import cn.com.ctop.job.adq.data.utils.HttpUtils;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+@Service
+@Slf4j
+public class MovieLevelServiceImpl implements IMovieLevelService {
+    @Autowired
+    private MovieLevelMapper movieLevelMapper;
+    private static ExecutorService executorService = Executors.newFixedThreadPool(3);
+
+    @Override
+    public void sendMovieLevel() {
+        List<JSONObject> movieList = movieLevelMapper.getMovieList();
+        if (Check.isNull(movieList)) {
+            return;
+        }
+
+        for (int i = 0; i < movieList.size(); i++) {
+            JSONObject movieJson = movieList.get(i);
+            BigDecimal sumCost = movieJson.getBigDecimal("sumCost");
+            if (Check.isNull(sumCost)) {
+                continue;
+            }
+
+            Integer diffDay = movieJson.getInteger("diffDay");
+            String videoProjectId = movieJson.getString("videoProjectId");
+            String videoProjectName = movieJson.getString("videoProjectName");
+            Integer source = movieJson.getInteger("source");
+            Integer contentType = movieJson.getInteger("contentType");
+            String idNo = getIdNo(contentType, source, videoProjectId);
+
+            String level = getLevelByCost(sumCost);
+            if (Check.isNull(level)) {
+                continue;
+            }
+            if ("C".equals(level)) {
+                if (diffDay < 8) {
+                    log.info("项目ID:{},评级为c上线时间小于8天,不执行消息发送", videoProjectId);
+                    continue;
+                }
+                if (diffDay == 8 || diffDay == 91) { //当上线为第八天和第九十一天时 发送C评级通知
+                    // 验证是否已发送此评级的消息通知
+                    boolean isSend = checkLog(videoProjectId, level);
+                    if (isSend) {
+                        insertAndSendLog(videoProjectId, idNo, videoProjectName, level, diffDay - 1);
+                    } else {
+                        log.info("此评级消息已发送,项目ID:{},评级:{}", videoProjectId, level);
+                    }
+
+                }
+            } else {
+                boolean isSend = checkLog(videoProjectId, level);
+                if (isSend) {
+                    insertAndSendLog(videoProjectId, idNo, videoProjectName, level, diffDay);
+                } else {
+                    log.info("此评级消息已发送,项目ID:{},评级:{}", videoProjectId, level);
+                }
+            }
+        }
+    }
+
+    private synchronized void insertAndSendLog(String videoProjectId, String idNo, String videoProjectName, String level, Integer diffDay) {
+        executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                sendMessage(idNo, videoProjectName, level, diffDay);
+            }
+        });
+        movieLevelMapper.insertSendLog(videoProjectId, level);
+    }
+
+
+    public void sendMessage(String videoProjectId, String videoProjectName, String level, Integer diffDay) {
+        String url = "https://open.feishu.cn/open-apis/bot/v2/hook/d83f0bf7-add8-462b-b5a2-281a5dfa129c";
+        JSONObject param = new JSONObject();
+        param.put("msg_type", "interactive");
+        JSONObject card = new JSONObject();
+        card.put("type", "template");
+        JSONObject data = new JSONObject();
+        data.put("template_id", "AAqvEjmLDN0jG");
+        JSONObject template_variable = new JSONObject();
+        template_variable.put("videoProjectId", videoProjectId);
+        template_variable.put("videoProjectName", videoProjectName);
+        template_variable.put("diffDay", diffDay);
+        template_variable.put("videoProjectLevel", level);
+        data.put("template_variable", template_variable);
+        card.put("data", data);
+        param.put("card", card);
+        String s = HttpUtils.httpPostRequest(url, param, null);
+        JSONObject jsonObject = JSONObject.parseObject(s);
+        log.info("项目评级发送消息返回:{}", jsonObject);
+
+    }
+
+
+    private String getIdNo(Integer contentType, Integer source, String projectId) {
+        String idNo = "";
+        String prefix = "DJ_";
+        if (contentType != null && contentType == 2) {
+            prefix = "MJ_";
+        }
+        //:1-欢瑞自制,2-欢瑞引入,3-爱奇艺分销,4-穿山甲联盟
+        if (source == 1) {
+            idNo = prefix + "ZZ" + projectId;
+        } else if (source == 2) {
+            idNo = prefix + "YR" + projectId;
+        } else if (source == 3) {
+            idNo = prefix + "FX" + projectId;
+        } else {
+            idNo = prefix + "CSJ" + projectId;
+        }
+        return idNo;
+    }
+
+    private boolean checkLog(String videoProjectId, String level) {
+        Integer count = movieLevelMapper.checkLog(videoProjectId, level);
+        return count == 0;
+    }
+
+    private static String getLevelByCost(BigDecimal sumCost) {
+        if (sumCost.compareTo(new BigDecimal(1000000)) < 0) {
+            return "C";
+        }
+        if (sumCost.compareTo(new BigDecimal(1000000)) >= 0 && sumCost.compareTo(new BigDecimal(2000000)) < 0) {
+            return "B";
+        }
+        if (sumCost.compareTo(new BigDecimal(2000000)) >= 0 && sumCost.compareTo(new BigDecimal(5000000)) < 0) {
+            return "B+";
+        }
+        if (sumCost.compareTo(new BigDecimal(5000000)) >= 0 && sumCost.compareTo(new BigDecimal(8000000)) < 0) {
+            return "A";
+        }
+        if (sumCost.compareTo(new BigDecimal(8000000)) >= 0 && sumCost.compareTo(new BigDecimal(10000000)) < 0) {
+            return "A+";
+        }
+        if (sumCost.compareTo(new BigDecimal(10000000)) >= 0) {
+            return "S";
+        }
+        return null;
+    }
+
+}

+ 57 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/service/impl/RefreshTokenServiceImpl.java

@@ -0,0 +1,57 @@
+package cn.com.ctop.job.adq.data.service.impl;
+
+import cn.com.ctop.job.adq.data.mapper.RefreshTokenMapper;
+import cn.com.ctop.job.adq.data.service.IRefreshTokenService;
+import cn.com.ctop.job.adq.data.utils.Check;
+import cn.com.ctop.job.adq.data.utils.HttpUtils;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class RefreshTokenServiceImpl implements IRefreshTokenService {
+    @Autowired
+    private RefreshTokenMapper refreshTokenMapper;
+
+
+    @Override
+    public void refreshToken() {
+        List<JSONObject> tokenList = refreshTokenMapper.getAllTokenList();
+        if (Check.isNull(tokenList)) {
+            return;
+        }
+        for (JSONObject tokenJson : tokenList) {
+            Long adminAdvertiserId = tokenJson.getLong("adminAdvertiserId");
+            String clientId = tokenJson.getString("clientId");
+            String clientSecret = tokenJson.getString("clientSecret");
+            String refreshToken = tokenJson.getString("refreshToken");
+            Map<String, Object> param = new HashMap<>();
+            param.put("client_id", clientId);
+            param.put("client_secret", clientSecret);
+            param.put("refresh_token", refreshToken);
+            param.put("grant_type", "refresh_token");
+            String s = HttpUtils.httpGet("https://api.e.qq.com/oauth/token", param, new HashMap<>());
+            JSONObject tokenResult = JSONObject.parseObject(s);
+            if (Check.isNull(tokenResult)) {
+                continue;
+            }
+            Integer code = tokenResult.getInteger("code");
+            if (code != 0) {
+                continue;
+            }
+            JSONObject data = tokenResult.getJSONObject("data");
+            if (Check.isNull(data)) {
+                continue;
+            }
+            String updateAccessToken = data.getString("access_token");
+            String updateRefreshToken = data.getString("refresh_token");
+            refreshTokenMapper.updateToken(adminAdvertiserId, updateAccessToken, updateRefreshToken);
+        }
+
+
+    }
+}

+ 266 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/data/utils/Signature.java

@@ -0,0 +1,266 @@
+package cn.com.ctop.job.adq.data.utils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+import static java.net.URLEncoder.encode;
+
+public class Signature {
+
+    private String secret = "302424a82b378320e5dc7008a916e2ab";
+
+    public static void main(String[] args) throws Exception {
+        System.out.println("=====参数是hashmap的签名demo=====");
+        test_hashmap();
+
+        System.out.println("=====参数为json字符串的签名demo=====");
+        test_json();
+
+        System.out.println("=====请求接口demo=====");
+        test_request();
+
+    }
+
+    //参数是hashmap的签名demo
+    public static void test_hashmap() throws Exception {
+        String secret = "302424a82b378320e5dc7008a916e2ab";
+
+        Map<String,Object> param =new HashMap<>();
+        param.put("param1","aaaa哈哈哈");
+        param.put("param2","qweqwe");
+        param.put("param3[0]","1");
+
+        long timestamp = 1646899307;
+
+        Signature signature = new Signature(secret);
+        String signStr = signature.buildSignature(timestamp, param);
+        System.out.println(signStr);
+        //System.out.println(signature.http_build_query(param));
+    }
+
+    //参数为json字符串的签名demo
+    public static void test_json() throws Exception {
+        String secret = "302424a82b378320e5dc7008a916e2ab";
+
+        String jsonStr = "{" +
+                "        \"items\": [" +
+                "                {" +
+                "                        \"creative_user_id\": 10064255535," +
+                "                        \"designer_id\": 10064255535," +
+                "                        \"folder_id\": 12002122805," +
+                "                        \"album_id\": 12000018105," +
+                "                        \"material_name\": \"牵爱30402一组勤阿喵限制0216成片01.mp4\"," +
+                "                        \"file_md5\": \"abf422e18234919979d9c0bff5cde80d\"," +
+                "                        \"url\": \"https://chuxin-gz.oss-cn-shenzhen.aliyuncs.com/cxai/2023/02/牵爱30402一组勤阿喵限制0216成片01.mp4\"" +
+                "                }," +
+                "                {" +
+                "                        \"album_id\": 12000018105," +
+                "                        \"creative_user_id\": 10064255535," +
+                "                        \"designer_id\": 10064255535," +
+                "                        \"file_md5\": \"a3f445511a5b58ff75cd33d79f29a658\"," +
+                "                        \"folder_id\": 12002122805," +
+                "                        \"material_name\": \"牵爱30402一组勤阿喵限制0216成片02.mp4\"," +
+                "                        \"url\": \"https://chuxin-gz.oss-cn-shenzhen.aliyuncs.com/cxai/2023/02/牵爱30402一组勤阿喵限制0216成片02.mp4\"" +
+                "                }," +
+                "                {" +
+                "                        \"album_id\": 12000018105," +
+                "                        \"creative_user_id\": 10064255535," +
+                "                        \"file_md5\": \"b5a179f0e3b5aae42c4fd69ffb1772b2\"," +
+                "                        \"folder_id\": 12002122805," +
+                "                        \"designer_id\": 10064255535," +
+                "                        \"material_name\": \"牵爱30402一组勤阿喵限制0216成片03.mp4\"," +
+                "                        \"url\": \"https://chuxin-gz.oss-cn-shenzhen.aliyuncs.com/cxai/2023/02/牵爱30402一组勤阿喵限制0216成片03.mp4\"" +
+                "                }" +
+                "        ]" +
+                "}";
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> param = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
+
+        long timestamp = 1676616009;
+
+        Signature signature = new Signature(secret);
+        String signStr = signature.buildSignature(timestamp, param);
+        System.out.println(signStr);
+        //System.out.println(signature.http_build_query(param));
+    }
+
+    //请求接口demo
+    public static void test_request() throws Exception {
+        String url = "https://openapi2.mobgi.com/api/AdMaterial/report";
+
+        String secret = "302424a82b378320e5dc7008a916e2ab";
+        String email = "yuyang2@hrcentury.cn";
+        long timestamp = System.currentTimeMillis()/1000;
+
+        //请求参数
+        String jsonStr = " {\n" +
+                "        \"media_type\": \"toutiao_upgrade\",\n" +
+                "        \"page\": \"1\",\n" +
+                "        \"page_size\": \"1\",\n" +
+                "        \"start_date\": \"2024-05-22\",\n" +
+                "        \"end_date\": \"2024-05-22\",\n" +
+                "        \"time_dim\": \"days\",\n" +
+                "        \"kpis\": [\"stat_cost\"]\n" +
+                "}";
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> params = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
+
+        //获得到签名
+        Signature signature = new Signature(secret);
+        String signStr = signature.buildSignature(timestamp, params);
+
+        //设置header
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
+        headers.add("email",email);
+        headers.add("timestamp",String.valueOf(timestamp));
+        headers.add("signature",signStr);
+
+        System.out.println(params);
+        System.out.println("===============");
+        System.out.println(headers);
+
+        //接口请求
+        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(params, headers);
+        RestTemplate restTemplate = new RestTemplate();
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, entity, String.class);
+
+        //获得响应
+        String body = responseEntity.getBody();
+        System.out.println(unicodeToString(body));
+
+    }
+
+
+    public Signature(String secret) {
+        this.secret = secret;
+    }
+
+    /**
+     * @param timestamp 时间戳
+     * @param params 参数
+     * @return 返回签名字符串
+     * @throws Exception
+     */
+    public String buildSignature(long timestamp, Map<String,Object> params) throws Exception {
+        //加入时间戳
+        params.put("timestamp", timestamp);
+        //生成url参数字符串
+        String signatureStr = http_build_query(params, true);
+        //将密钥拼接在后面
+        signatureStr += "&cl_secret="+secret;
+
+        //MD5
+        return getMD5(signatureStr);
+    }
+
+    /**
+     * @param params 参数
+     * @return 返回php http_build_query()效果的URL-encode的字符串
+     * @throws Exception
+     */
+    public String http_build_query(Map<String,Object> params) throws Exception {
+        return http_build_query(params, true);
+    }
+
+    private String getMD5(String str) throws NoSuchAlgorithmException {
+        DigestUtils.md5DigestAsHex(str.getBytes());
+        String MD5 = DigestUtils.md5DigestAsHex(str.getBytes());
+        return MD5.toUpperCase();
+    }
+
+    /**
+     * Java实现PHP中的http_build_query()效果
+     * https://www.cnblogs.com/timseng/p/13280722.html
+     *
+     * @return
+     */
+    private String http_build_query(Map<String, Object> array, boolean sort) throws Exception {
+        String reString = "";
+        //遍历数组形成akey=avalue&bkey=bvalue&ckey=cvalue形式的的字符串
+        reString = rescBuild(array, "", true, sort);
+        reString = StringUtils.removeEnd(reString, "&");
+
+        //将得到的字符串进行处理得到目标格式的字符串:utf8处理中文出错
+        ///reString = java.net.URLEncoder.encode(reString, "utf-8");
+        ///reString = reString.replace("%3D", "=").replace("%26", "&");
+        return reString;
+    }
+
+    private String rescBuild(Object object, String parentStr, boolean first, boolean sort) throws Exception {
+        String r = "";
+        if (object instanceof Map) {
+
+            List<Map.Entry<String, Object>> list = new ArrayList<Map.Entry<String, Object>>(((Map<String, Object>) object).entrySet());
+
+            //按照map的key排序
+            if(sort) {
+                Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
+                    //升序排序
+                    public int compare(Map.Entry<String, Object> o1,
+                                       Map.Entry<String, Object> o2) {
+                        return o1.getKey().compareTo(o2.getKey());
+                    }
+                });
+            }
+
+            for (Map.Entry<String, Object> mapping : list) {
+                String key = mapping.getKey();
+                Object value = mapping.getValue();
+
+                if (first) {
+                    r += rescBuild(value, key, false, sort);
+                } else {
+                    r += rescBuild(value, parentStr + "[" + key + "]", false, sort);
+                }
+
+            }
+
+        } else if (object instanceof List) {
+            for (int i = 0; i < ((List) object).size(); i++) {
+                r += rescBuild(((List) object).get(i), parentStr + "[" + i + "]", false, sort);
+            }
+            //叶节点是String或者Number
+        } else if (object instanceof String) {
+            r += encode(parentStr,"utf-8") + "=" + encode(object.toString(),"utf-8") + "&";
+        } else if (object instanceof Number) {
+            r += encode(parentStr,"utf-8") + "=" + encode(((Number) object).toString(),"utf-8") + "&";
+        } else if (object instanceof Boolean) {
+            r += encode(parentStr,"utf-8") + "=" + encode(((Boolean) object).toString(),"utf-8") + "&";
+        } else {
+            throw new Exception("unsupported type:"+object.getClass().toString());
+        }
+
+        return r;
+    }
+
+
+
+    public static String unicodeToString(String unicode) {
+        StringBuilder sb = new StringBuilder();
+        int i = 0;
+        while (i < unicode.length()) {
+            char c = unicode.charAt(i++);
+            if (c == '\\' && i < unicode.length() && unicode.charAt(i) == 'u') {
+                i++; // 跳过 'u'
+                int code = Integer.parseInt(unicode.substring(i, i + 4), 16);
+                sb.append((char) code);
+                i += 4;
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+}

+ 23 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/handler/AdqRefreshTokenJob.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.job.adq.handler;
+
+
+import cn.com.ctop.job.adq.data.service.IRefreshTokenService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+@Slf4j
+@Component
+public class AdqRefreshTokenJob {
+    @Autowired
+    private IRefreshTokenService refreshTokenService;
+
+    @XxlJob("refreshToken")
+    public void refreshToken() throws Exception {
+        refreshTokenService.refreshToken();
+    }
+
+
+}

+ 33 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/handler/ClCreativeUserJob.java

@@ -0,0 +1,33 @@
+package cn.com.ctop.job.adq.handler;
+
+
+import cn.com.ctop.job.adq.data.service.*;
+import cn.com.ctop.job.adq.data.utils.Check;
+import cn.com.ctop.job.adq.data.utils.DateUtils;
+import com.alibaba.fastjson.JSONObject;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+
+@Slf4j
+@Component
+public class ClCreativeUserJob {
+
+    @Autowired
+    private IClCreativeUserService creativeUserService;
+
+    @XxlJob("getCreativeUser")
+    public void getCreativeUser() throws Exception {
+        creativeUserService.getCreativeUser(1);
+    }
+
+
+}

+ 25 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/handler/MovieLevelJob.java

@@ -0,0 +1,25 @@
+package cn.com.ctop.job.adq.handler;
+
+
+import cn.com.ctop.job.adq.data.service.IMovieLevelService;
+
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+
+@Slf4j
+@Component
+public class MovieLevelJob {
+    @Autowired
+    private IMovieLevelService movieLevelService;
+
+    @XxlJob("sendMovieLevel")
+    public void sendMovieLevel() throws Exception {
+        movieLevelService.sendMovieLevel();
+    }
+
+
+}

+ 38 - 0
job-adq/src/main/java/cn/com/ctop/job/adq/handler/ToolsSiteJob.java

@@ -0,0 +1,38 @@
+package cn.com.ctop.job.adq.handler;
+
+
+import cn.com.ctop.job.adq.data.utils.HttpUtils;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * 定时更新
+ */
+@Slf4j
+@Component
+public class ToolsSiteJob {
+
+    private static ExecutorService reviewExecutorService = Executors.newFixedThreadPool(3);
+
+    private final String KEY = "bb3648b0b93f2f82135a6dac38dc418f808346a434";
+
+    @XxlJob("regularReview")
+    public void regularReview() throws Exception {
+        try {
+            log.info("[定时催评] 任务启动...");
+            //定期更新短剧审核信息
+            String url = "https://api.cms.artlinkworld.cn/script/review/regularReview";
+            HttpUtils.httpGet(String.format("%s?platform=1&id=%s", url, KEY), null, null);
+            log.info("[定时催评] 执行完成");
+        } catch (Exception e) {
+            log.error("[定时催评] 执行异常");
+            e.printStackTrace();
+        }
+    }
+
+}