zhaotx 1 год назад
Родитель
Сommit
dfb92f2349

+ 9 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/controller/FeishuController.java

@@ -44,13 +44,17 @@ public class FeishuController {
     IFeishuService feishuService;
     @Autowired
     private ICPSReportService cpsReportService;
+    @Autowired
+    private IDistributionPushService distributionPushService;
+    @Autowired
+    private IMovieRankPushService movieRankPushService;
 
     @Autowired
     IUserLoginRecordService userLoginRecordService;
     @PostMapping("/test")
     public void test(@RequestBody String str) throws Exception {
 //        bytedanceProductUpdateService.initNew();
-        bytedanceProductUpdateService.run();
+//        bytedanceProductUpdateService.run();
 //        reportsAdPushService.test();
 //        totalRankPushService.test();
 //        dateReportsPushService.preSend();
@@ -76,6 +80,10 @@ public class FeishuController {
 //            cpsReportService.runCPSSettlementData(date);
 //            System.out.println("\n\n");
 //        }
+
+//        distributionPushService.sendToday();
+//        distributionPushService.sendYesterday();
+        movieRankPushService.send();
     }
 
 

+ 22 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/DistributorDataPushMapper.java

@@ -0,0 +1,22 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@DS("selectdb")
+public interface DistributorDataPushMapper {
+
+    List<JSONObject> todayData(@Param("date") Long date, @Param("thisHour") Integer thisHour, @Param("lastHour") Integer lastHour);
+    List<JSONObject> yesterdayData(@Param("thisDate") Long thisDate, @Param("lastDate") Long lastDate);
+
+    List<JSONObject> distributorTop(@Param("date") Long date);
+
+    List<JSONObject> movieTop(@Param("date") Long date);
+
+
+}

+ 7 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ReportsAdPushMapper.java

@@ -12,6 +12,7 @@ import java.util.Map;
 public interface ReportsAdPushMapper {
 
     List<JSONObject> selectUserList();
+    List<JSONObject> selectOptimizerList();
     Map<String, String> allBusinessPushData(@Param("date") Long date);
     List<Map<String, String>> allBusinessTopMovie(@Param("date") Long date);
     JSONObject businessTypeData(@Param("date") Long date, @Param("businessTypes") List<Integer> businessTypes);
@@ -52,4 +53,10 @@ public interface ReportsAdPushMapper {
     List<Map<String, String>> cutDeptRank(@Param("date") Long date);
     List<Map<String, String>> cutUserRank(@Param("date") Long date, @Param("deptId") Long deptId);
     String updateTime(@Param("date") Long date);
+
+
+    //短剧榜单
+    List<JSONObject> movieTop(@Param("date") Long date, @Param("hour") Integer hour,
+                              @Param("type") Integer type,
+                              @Param("businessMethod") String businessMethod);
 }

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

@@ -0,0 +1,88 @@
+<?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.DistributorDataPushMapper">
+
+    <select id="todayData" resultType="com.alibaba.fastjson.JSONObject">
+        select 'today' as time,
+               round(ifnull(sum(share_iaa_amount), 0)+ifnull(sum(share_pay_amount), 0), 2) as end_amount,
+               round(ifnull(sum(pay_amount), 0), 2) as pay_amount,
+               round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount,
+               '' as update_time
+        from application.user_data_report_daily tb1
+        where stat_date=#{date}
+          and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type=2)
+        union all
+        select 'thisHour' as time,
+               round(ifnull(sum(share_iaa_amount), 0)+ifnull(sum(share_pay_amount), 0), 2) as end_amount,
+               round(ifnull(sum(pay_amount), 0), 2) as pay_amount,
+               round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount,
+               max(update_at) as update_time
+        from application.user_data_report_hourly tb1
+        where stat_date=#{date} and `hour`=#{thisHour}
+          and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type=2)
+        union all
+        select 'lastHour' as time,
+               round(ifnull(sum(share_iaa_amount), 0)+ifnull(sum(share_pay_amount), 0), 2) as end_amount,
+               round(ifnull(sum(pay_amount), 0), 2) as pay_amount,
+               round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount,
+               '' as update_time
+        from application.user_data_report_hourly tb1
+        where stat_date=#{date} and `hour`=#{lastHour}
+          and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type=2)
+    </select>
+    <select id="yesterdayData" resultType="com.alibaba.fastjson.JSONObject">
+        select 'thisDay' as time,
+               round(ifnull(sum(share_iaa_amount), 0)+ifnull(sum(share_pay_amount), 0), 2) as end_amount,
+               round(ifnull(sum(pay_amount), 0), 2) as pay_amount,
+               round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount,
+               max(update_at) as update_time
+        from application.user_data_report_daily tb1
+        where stat_date=#{thisDate}
+          and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type=2)
+        union all
+        select 'lastDay' as time,
+               round(ifnull(sum(share_iaa_amount), 0)+ifnull(sum(share_pay_amount), 0), 2) as end_amount,
+               round(ifnull(sum(pay_amount), 0), 2) as pay_amount,
+               round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount,
+               '' as update_time
+        from application.user_data_report_daily tb1
+        where stat_date=#{lastDate}
+          and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_type=2)
+    </select>
+    <select id="distributorTop" resultType="com.alibaba.fastjson.JSONObject">
+        select tb7.name as name,
+               rank() over (order by (ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0)) desc) as rank,
+               round(ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0), 2) as water_income
+        from application.distributor_board_data tb1
+            left join (select id, responsibility_person_id from tidb.thirtpart.ly_link) tb4 on tb1.link_id = tb4.id
+            left join (select moive_id, standard_movie_id, standard_movie_name, video_project_id, video_project_name, movie_project_source from tidb.deepthink.all_moive) tb5 on tb1.movie_id = tb5.moive_id
+            left join tidb.thirtpart.ly_responsibility_person tb6 on tb4.responsibility_person_id = tb6.id
+            left join tidb.thirtpart.ly_company tb7 on tb6.company_id = tb7.id
+            left join (select dict_key, dict_name from tidb.deepthink.dt_dictionary where select_key = 'movie_project_source') tb8 on tb5.movie_project_source = tb8.dict_key
+        where tb1.stat_date = #{date}
+        group by tb7.name
+        order by (ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0)) desc
+        limit 5
+    </select>
+    <select id="movieTop" resultType="com.alibaba.fastjson.JSONObject">
+        select tb5.video_project_name as name, tb5.movie_project_source, tb8.dict_name as project_type,
+               case
+                   when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb5.project_ad_date, '%Y%m%d')) + 1) between 1 and 3 then '新剧1阶'
+                   when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb5.project_ad_date, '%Y%m%d')) + 1) between 4 and 7 then '新剧2阶'
+                   when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb5.project_ad_date, '%Y%m%d')) + 1) between 8 and 15 then '次新剧'
+                   when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb5.project_ad_date, '%Y%m%d')) + 1) >=15 then '老剧'
+                   else 999 end as project_ad_step,
+               rank() over (order by ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0) desc) as rank,
+               round(ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0), 2) as water_income,
+               round(ifnull(sum(pay_amount), 0),2) as pay_amount, round(ifnull(sum(iaa_amount), 0), 2) as iaa_amount
+        from application.distributor_board_data tb1
+             left join (select id, responsibility_person_id from tidb.thirtpart.ly_link) tb4 on tb1.link_id = tb4.id
+             left join (select moive_id, standard_movie_id, standard_movie_name, video_project_id, video_project_name, movie_project_source,project_ad_date from tidb.deepthink.all_moive) tb5 on tb1.movie_id = tb5.moive_id
+             left join (select dict_key, dict_name from tidb.deepthink.dt_dictionary where select_key = 'movie_project_source') tb8 on tb5.movie_project_source = tb8.dict_key
+        where tb1.stat_date = #{date}
+        group by 1,2,3,4
+        order by (ifnull(sum(pay_amount), 0)+ifnull(sum(iaa_amount), 0)) desc
+        limit 20
+    </select>
+
+</mapper>

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

@@ -587,4 +587,56 @@
             </foreach>
         </if>)
     </select>
+
+    <sql id="businessLine">
+        <if test="type != null and type == 1">and business_line = 1</if>
+        <if test="type != null and type == 4">and business_line = 4</if>
+    </sql>
+    <select id="movieTop" resultType="com.alibaba.fastjson.JSONObject">
+        select tb2.video_project_name,
+        tb3.dict_name as project_source,
+        case
+        when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb2.project_ad_date, '%Y%m%d')) + 1) between 1
+        and 3 then '新剧1阶'
+        when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb2.project_ad_date, '%Y%m%d')) + 1) between 4
+        and 7 then '新剧2阶'
+        when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb2.project_ad_date, '%Y%m%d')) + 1) between 8
+        and 15 then '次新剧'
+        when (DATEDIFF(STR_TO_DATE(tb1.stat_date, '%Y%m%d'), STR_TO_DATE(tb2.project_ad_date, '%Y%m%d')) + 1) >=15 then
+        '老剧'
+        else 999 end as project_ad_step,
+        concat(round(ifnull(sum(tb4.cost_amount), 0)/10000.0, 2), '万') as cost_hour,
+        concat(round(ifnull(sum(tb1.cost_amount), 0)/10000.0, 1), '万') as cost_today,
+        case when sum(tb5.cost_amount) &lt; 1000000 then '100W-'
+        when sum(tb5.cost_amount) &gt;= 1000000 and sum(tb5.cost_amount) &lt; 5000000 then '100W-500W'
+        when sum(tb5.cost_amount) &gt;= 5000000 and sum(tb5.cost_amount) &lt; 10000000 then '500W-1000W'
+        when sum(tb5.cost_amount) &lt;= 10000000 then '1000W+'
+        else '未知' end as cost_history,
+        ifnull(sum(tb4.cost_amount), 0) as cost_hour_number
+        from (select ${date} as stat_date, movie_id, sum(cost_amount) as cost_amount from
+        application.media_ad_report_daily
+        where stat_date=${date}
+        and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_method=#{businessMethod} <include refid="businessLine"/>)
+        group by movie_id ) tb1
+        left join tidb.deepthink.all_moive tb2 on tb1.movie_id = tb2.moive_id
+        left join tidb.deepthink.dt_dictionary tb3 on tb3.select_key='movie_project_source' and tb3.dict_key=tb2.movie_project_source
+        left join (select movie_id, sum(cost_amount) as cost_amount from application.media_ad_report_hourly where stat_date=${date} and `hour`=${hour}
+        and ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_method=#{businessMethod} <include refid="businessLine"/>)
+        group by movie_id ) tb4 on tb1.movie_id = tb4.movie_id
+        left join (select movie_id, sum(cost_amount) as cost_amount from application.media_ad_report_daily
+        where ma_appid in (select app_id from tidb.deepthink.mini_app_info where business_method=#{businessMethod} <include refid="businessLine"/>)
+        group by movie_id ) tb5 on tb1.movie_id=tb5.movie_id
+        group by 1,2,3
+        having sum(tb1.cost_amount)&gt;=2000
+        order by sum(tb1.cost_amount) desc
+        limit 10
+    </select>
+    <select id="selectOptimizerList" resultType="com.alibaba.fastjson.JSONObject">
+        select user_id, nick_name, phonenumber, remark, u.dept_id, d.dept_name
+        from tidb.deepthink.sys_user u
+                 left join tidb.deepthink.sys_dept d on u.dept_id = d.dept_id
+        where u.del_flag = '0' and u.status=0
+          and (u.dept_id in (203,204,205,206)
+            or d.parent_id in (203,204,205,206))
+    </select>
 </mapper>

+ 8 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IDistributionPushService.java

@@ -0,0 +1,8 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+public interface IDistributionPushService {
+
+    void sendToday();
+
+    void sendYesterday();
+}

+ 7 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IMovieRankPushService.java

@@ -0,0 +1,7 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+public interface IMovieRankPushService {
+
+
+    void send();
+}

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

@@ -0,0 +1,166 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.DistributorDataPushMapper;
+import cn.com.ctop.job.bytedance.data.service.IDistributionPushService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.ImmutableMap;
+import javafx.util.Pair;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class DistributionPushServiceImpl implements IDistributionPushService {
+    @Resource
+    DistributorDataPushMapper distributorDataPushMapper;
+
+    public static final String TEMPLATE_ID = "AAqhyWD5vfNFO";
+    public static final String TEMPLATE_VERSION = "1.0.6";
+
+    @Override
+    public void sendToday() {
+        String today = DateUtils.getNowDate("yyyy-MM-dd");
+        Long todayLong = Long.parseLong(today.replaceAll("-", ""));
+        int hour = Integer.parseInt(DateUtils.getNowDate("H"));
+        int lastHour = hour -1;
+        int lastLastHour = hour -2;
+
+        List<JSONObject> p1 = distributorDataPushMapper.todayData(todayLong,lastHour,lastLastHour);
+        List<JSONObject> p2 = distributorDataPushMapper.distributorTop(todayLong);
+        List<JSONObject> p3 = distributorDataPushMapper.movieTop(todayLong);
+        JSONObject template_variables = new JSONObject();
+
+
+        List<Pair<String, String>> columns = Arrays.asList(
+                new Pair<>("end_amount", "结算总收入"),
+                new Pair<>("pay_amount", "总付费金额"),
+                new Pair<>("iaa_amount", "广告预估收入")
+        );
+
+        Map<String, JSONObject> p1Time = p1.stream().collect(Collectors.toMap(o->o.getString("time"), o-> o));
+        JSONObject p1Today = p1Time.get("today");
+        JSONObject p1LastHour = p1Time.get("lastHour");
+        JSONObject p1ThisHour = p1Time.get("thisHour");
+
+        template_variables.put("updateTime", p1ThisHour.getString("update_time"));
+        template_variables.put("date", today.substring(5,10));
+        template_variables.put("thisHour", lastHour);
+        template_variables.put("lastHour", lastLastHour);
+
+        JSONArray object_list_1 = new JSONArray();
+        for (Pair<String, String> cp : columns) {
+            String c = cp.getKey();
+            String cn = cp.getValue();
+            JSONObject obj = new JSONObject();
+            obj.put("indicatorName", cn);
+            String todayNum = String.valueOf(p1Today.get(c));
+            obj.put("todayData", todayNum);
+            String lastHourNum = String.valueOf(p1ThisHour.get(c));
+            obj.put("thisHour", lastHourNum);
+            String lastLastHourNum = String.valueOf(p1LastHour.get(c));
+            obj.put("lastHour", lastLastHourNum);
+            object_list_1.add(obj);
+        }
+        template_variables.put("object_list_1", object_list_1);
+
+
+        JSONArray object_list_2 = new JSONArray();
+        for (JSONObject obj : p2) {
+            JSONObject o = new JSONObject();
+            o.put("distributorName", obj.getString("name"));
+            o.put("waterAmount", obj.getString("water_income"));
+            o.put("rank", obj.getString("rank"));
+            object_list_2.add(o);
+        }
+        template_variables.put("object_list_2", object_list_2);
+
+        JSONArray movieRankTable = new JSONArray();
+        for (JSONObject movie : p3){
+            JSONObject obj = new JSONObject();
+            String movieName = String.valueOf(movie.get("name"));
+            String movieProjectSource = String.valueOf(movie.get("movie_project_source"));
+            String movieProjectSourceName = String.valueOf(movie.get("project_type"));
+
+            String color = "blue";
+            if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("1")){
+                color="grey";
+            }else if (!Check.isNull(movieProjectSource) && movieProjectSource.equals("2")){
+                color="green";
+            }else {
+                color="blue";
+            }
+            StringBuffer sb = new StringBuffer();
+            sb.append("<text_tag color='"+color+"'>"+movieProjectSourceName+"</text_tag>");
+            sb.append("<br>");
+            sb.append("<text_tag color='green'>"+movie.getString("project_ad_step")+"</text_tag>");
+            obj.put("project_type", sb.toString());
+            obj.put("rank", String.valueOf(movie.get("rank")));
+            obj.put("project_name", movieName);
+            obj.put("pay_amount", String.valueOf(movie.get("pay_amount")));
+            obj.put("iaa_amount", String.valueOf(movie.get("iaa_amount")));
+            movieRankTable.add(obj);
+        }
+        template_variables.put("table_raw_array_1", movieRankTable);
+
+
+        String token;
+        try {
+            token = FeishuRobotUtil.getFsZtTenantToken();
+        }catch (IOException e){
+            log.error("获取飞书token失败", e);
+            return;
+        }
+        sendToFeishu(token, template_variables, "44fbaed6");
+    }
+
+    @Override
+    public void sendYesterday() {
+
+    }
+
+
+    private void sendToFeishu(String token, JSONObject template_variable, String receive_id) {
+        JSONObject content = new JSONObject();
+        JSONObject contentData = new JSONObject();
+        contentData.put("template_id",TEMPLATE_ID);
+        contentData.put("template_version_name", TEMPLATE_VERSION);
+        contentData.put("template_variable", template_variable);
+        content.put("type", "template");
+        content.put("data", contentData);
+
+        JSONObject request = new JSONObject();
+        request.put("receive_id", receive_id);
+        request.put("msg_type", "interactive");
+        request.put("content", content.toJSONString());
+        //发送
+        try (CloseableHttpClient client = HttpClients.createDefault()){
+            HttpPost httpPost = new HttpPost("https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=user_id");
+            httpPost.setHeader("Authorization", "Bearer "+token);
+            HttpEntity entity = new StringEntity(request.toJSONString(), "UTF-8");
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
+            CloseableHttpResponse respon = client.execute(httpPost);
+            System.out.println("发送结果: "+ EntityUtils.toString(respon.getEntity(), "UTF-8"));
+        }catch (IOException e){
+            log.error("发送飞书消息失败", e);
+        }
+    }
+}

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

@@ -0,0 +1,153 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.mapper.ReportsAdPushMapper;
+import cn.com.ctop.job.bytedance.data.service.IMovieRankPushService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import cn.com.ctop.job.bytedance.utils.FeishuRobotUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class MovieRankPushServiceImpl implements IMovieRankPushService {
+    @Resource
+    ReportsAdPushMapper reportsAdPushMapper;
+
+    public static final String TEMPLATE_ID = "AAqhiuoh0Nohp";
+    public static final String TEMPLATE_VERSION = "1.0.7";
+
+    @Override
+    public void send() {
+        List<String> userIds = Arrays.asList(
+                "44fbaed6"
+                ,"ebeeced9" //yumeng
+                ,"265g9ef1" //wangshu
+                ,"c5f6b59d" //yuyang
+                ,"58e7a98a"  //xsq
+                ,"11a45882" //chenglitong
+                ,"97db2de8" //anjuejia
+                ,"fbgd2d2f" //xuweiwei
+                ,"ff93g2ee" //zhangxiaofeng
+        );
+        List<String> chatIds = Arrays.asList(
+
+        );
+        send(userIds, chatIds);
+    }
+
+    private void send(List<String> userIds, List<String> chatIds){
+
+        String today = DateUtils.getNowDate("yyyy-MM-dd");
+        Long todayLong = Long.parseLong(today.replaceAll("-", ""));
+        int hour = Integer.parseInt(DateUtils.getNowDate("H"));
+        int lastHour = hour -1;
+        int lastLastHour = hour -2;
+
+        List<JSONObject> t1 = reportsAdPushMapper.movieTop(todayLong, lastHour, 1, "IAP");
+        List<JSONObject> t2 = reportsAdPushMapper.movieTop(todayLong, lastHour, 1, "IAA");
+        List<JSONObject> t3 = reportsAdPushMapper.movieTop(todayLong, lastHour, 4, "IAP");
+        List<JSONObject> t4 = reportsAdPushMapper.movieTop(todayLong, lastHour, 4, "IAA");
+
+        JSONObject template_variables = new JSONObject();
+        template_variables.put("thisHour", String.valueOf(hour));
+        template_variables.put("lastHour", String.valueOf(lastHour));
+        template_variables.put("table_raw_array_1", buildFeishuTable(t1));
+        template_variables.put("table_raw_array_2", buildFeishuTable(t2));
+        template_variables.put("table_raw_array_3", buildFeishuTable(t3));
+        template_variables.put("table_raw_array_4", buildFeishuTable(t4));
+
+
+        List<JSONObject> users = reportsAdPushMapper.selectOptimizerList();
+        List<String> mobiles = users.stream().map(user -> user.getString("phonenumber"))
+                .filter(s -> s != null && s.length() == 11)
+                .collect(Collectors.toList());
+        String token;
+        Map<String, String> mobileMap;
+        try {
+            token = FeishuRobotUtil.getFsZtTenantToken();
+            mobileMap = FeishuRobotUtil.getFsUserIds(token, mobiles); //mobile -> userId
+        }catch (IOException e){
+            log.error("获取飞书token失败", e);
+            return;
+        }
+
+        System.out.println(mobileMap);
+
+        for (String userId : userIds) {
+            sendToFeishu(token, template_variables, userId);
+        }
+
+        for (String userId : mobileMap.values()){
+//            System.out.println("发送给:"+userId);
+            sendToFeishu(token, template_variables, userId);
+        }
+    }
+
+    private JSONArray buildFeishuTable(List<JSONObject> t1){
+        JSONArray table_raw_array_1 = new  JSONArray();
+        for (JSONObject t : t1){
+            JSONObject row = new JSONObject();
+            Double hourSpeed = t.getDouble("cost_hour_number");
+            if (hourSpeed>=20000.0){
+                row.put("movie_name", "<font color='red'>"+ t.getString("video_project_name")+"(起量)</font>");
+            }else {
+                row.put("movie_name", t.getString("video_project_name"));
+            }
+            String projectSource = t.getString("project_source");
+            String projectAdStep = t.getString("project_ad_step");
+            StringBuffer sb = new StringBuffer();
+            sb.append("<text_tag color='blue'>"+projectSource+"</text_tag>");
+            sb.append("<text_tag color='green'>"+projectAdStep+"</text_tag>");
+            row.put("project_type", sb.toString());
+            row.put("cost_hour", t.getString("cost_hour"));
+            row.put("cost_today", t.getString("cost_today"));
+            row.put("cost_history", t.getString("cost_history"));
+            table_raw_array_1.add(row);
+        }
+        return  table_raw_array_1;
+    }
+
+    private void sendToFeishu(String token, JSONObject template_variable, String receive_id) {
+        JSONObject content = new JSONObject();
+        JSONObject contentData = new JSONObject();
+        contentData.put("template_id",TEMPLATE_ID);
+        contentData.put("template_version_name", TEMPLATE_VERSION);
+        contentData.put("template_variable", template_variable);
+        content.put("type", "template");
+        content.put("data", contentData);
+
+        JSONObject request = new JSONObject();
+        request.put("receive_id", receive_id);
+        request.put("msg_type", "interactive");
+        request.put("content", content.toJSONString());
+        //发送
+        try (CloseableHttpClient client = HttpClients.createDefault()){
+            HttpPost httpPost = new HttpPost("https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=user_id");
+            httpPost.setHeader("Authorization", "Bearer "+token);
+            HttpEntity entity = new StringEntity(request.toJSONString(), "UTF-8");
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
+            CloseableHttpResponse respon = client.execute(httpPost);
+            System.out.println("发送结果: "+ EntityUtils.toString(respon.getEntity(), "UTF-8"));
+        }catch (IOException e){
+            log.error("发送飞书消息失败", e);
+        }
+    }
+}

+ 13 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java

@@ -29,6 +29,8 @@ public class FeishuPushJob {
     @Autowired
     IReportsByBusinessPushService reportsByBusinessPushService;
     @Autowired
+    IMovieRankPushService movieRankPushService;
+    @Autowired
     IFeishuService feishuService;
 
     @XxlJob("unbindWarnPush")
@@ -100,4 +102,15 @@ public class FeishuPushJob {
             log.error("pullFeishuAvatar error: "+e.getMessage(), e);
         }
     }
+
+    @XxlJob("distributionPush")
+    public void distributionPush(){
+
+
+    }
+
+    @XxlJob("movieTopPush")
+    public void movieTopPush(){
+        movieRankPushService.send();
+    }
 }