Просмотр исходного кода

飞书推送-短剧业务概况

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

+ 6 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ReportsAdPushMapper.java

@@ -16,13 +16,18 @@ public interface ReportsAdPushMapper {
 
     //所有优化师消耗排名
     List<Map<String, String>> optimizerCostRank(@Param("date") Long date, @Param("hour") String hour);
+    //优化师当日数据
     List<Map<String, String>> optimizerDateData(@Param("date") Long date);
+    //优化师小时数据
     List<Map<String, String>> optimizerHourData(@Param("date") Long date, @Param("hour") String hour);
-
+    //全部部门排行
     List<Map<String, String>> deptCostRank(@Param("date") Long date, @Param("hour") String hour);
 
     //漏绑账户预警
     List<Map<String, String>> unbindData(@Param("date") Long date, @Param("last90Day") Long last90Day);
 
+    //错绑账户预警
     List<Map<String, String>> bindAppErrorData(@Param("last30Day") Long last30Day);
+    //部门前后项数据排名
+    List<Map<String, String>> deptRank2(@Param("date") Long date);
 }

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

@@ -41,22 +41,31 @@
         ) tb2
     </select>
     <select id="tmpTopMovie" resultType="java.util.Map">
-        select tb1.*, ifnull(COALESCE (tb2.movie_name, tb3.movie_name), tb1.movie_id) as movie_name
+        select ot1.*, ot2.cost_amount, ot2.real_cost_amount,
+        concat(round(if(ifnull(cost_amount,0)=0, 0, end_amount/cost_amount*100), 2), '%') AS water_roi,
+        concat(round(if(ifnull(real_cost_amount,0)=0, 0, end_amount/real_cost_amount*100), 2), '%') AS real_roi
+        FROM
+        (select ifnull(COALESCE (tb2.movie_name, tb3.movie_name), tb1.movie_id) as movie_name,
+        rank() over (order by sum(end_amount) desc) as rk, sum(end_amount) as end_amount
         from
-        (select rank() over (order by ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0) desc) as rk,
+        (select
         ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0) as end_amount, movie_id
         from
         application.user_data_report_daily udrd
-        where stat_date = #{date}
+        where stat_date = ${date}
         group by movie_id
         having ifnull(sum(share_iaa_amount), 0) + ifnull(sum(share_pay_amount), 0)>0
         order by end_amount desc
-        limit 10
         ) tb1
         left join
         (select distinct movie_id, movie_name from deepthink.channel_changdunovel_info cci) tb2 on tb1.movie_id = tb2.movie_id
         left JOIN
         (select id, movie_name from hr_playlet.m_movie mm) tb3 on tb1.movie_id = tb3.id
+        group by movie_name order by rk limit 10) ot1
+        left join
+        (select product_name, round(ifnull(sum(cost_amount),0),2) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_product_report_daily where stat_date=${date} group by product_name
+        ) ot2 on ot1.movie_name=ot2.product_name
         order by rk
     </select>
 
@@ -206,4 +215,25 @@
         where tb1.ma_appid != tb2.ma_appid
         order by tb2.user_id
     </select>
+    <select id="deptRank2" resultType="java.util.Map">
+        select tb4.dept_id, tb5.dept_name,
+        rank() over (order by sum(cost_amount) desc) as rk,
+        ifnull(sum(cost_amount), 0) as cost_amount,
+        concat(round(if(ifnull(sum(real_cost_amount),0)=0, 0, (ifnull(sum(share_iaa_amount),0)+ifnull(sum(share_pay_amount),0))/sum(real_cost_amount)*100), 2), '%') AS real_roi
+        from
+        (select cast(advertiser_id as char) advertiser_id, user_id from deepthink.advertiser_bind_info) tb1
+        left join (select advertiser_id, sum(cost_amount) as cost_amount, sum(real_cost_amount) as real_cost_amount
+        from application.media_ad_report_daily where stat_date=${date} group by advertiser_id) tb2
+        on tb1.advertiser_id = tb2.advertiser_id
+        left join (select advertiser_id, sum(share_iaa_amount) as share_iaa_amount, sum(share_pay_amount) as share_pay_amount
+        from application.user_data_report_daily where stat_date=${date} group by advertiser_id) tb3
+        on tb1.advertiser_id = tb3.advertiser_id
+        left join (select user_id, nick_name, phonenumber, dept_id from deepthink.sys_user) tb4
+        on tb1.user_id=tb4.user_id
+        left join (select dept_id, dept_name from deepthink.sys_dept) tb5
+        on tb4.dept_id = tb5.dept_id
+        group by tb4.dept_id
+        having sum(cost_amount)>1
+        order by rk
+    </select>
 </mapper>

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

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

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

@@ -0,0 +1,175 @@
+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.IDateReportsPushService;
+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 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.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+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 DateReportsPushServiceImpl implements IDateReportsPushService {
+    public static final String APP_ID = "cli_a772633aaeff5013";
+    public static final String APP_KEY = "lEHaMdEoBVrrLNc5RtC11f8XsANnKgB4";
+    @Autowired
+    ReportsAdPushMapper reportsPushMapper;
+
+    private static final String TEMPLATE_VERSION = "1.0.2";
+    private static final String TEMPLATE_ID = "AAqRhJzMBoO0E";
+    @Override
+    public void send() {
+        String token;
+        try {
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
+        }catch (IOException e){
+            log.error("获取飞书token失败", e);
+            return;
+        }
+        //日期时间 - 统统以昨日为准
+        String today = DateUtils.getNowAddDate("yyyy-MM-dd", -1);
+        String lastDay = DateUtils.getNowAddDate("yyyy-MM-dd", -2);
+        Long todayLong = Long.parseLong(today.replaceAll("-", ""));
+        Long lastDayLong = Long.parseLong(lastDay.replaceAll("-", ""));
+
+        Map<String, String> todayData = reportsPushMapper.tmpPushData(todayLong);
+        Map<String, String> lastDayData = reportsPushMapper.tmpPushData(lastDayLong);
+
+        String updateTime = String.valueOf(todayData.get("update_time"));
+        List<Pair<String, String>> columns = Arrays.asList(
+                new Pair<>("cost_amount", "消耗金额"),
+                new Pair<>("end_amount", "结算金额"),
+                new Pair<>("pay_amount", "充值金额"),
+                new Pair<>("water_roi", "流水ROI"),
+                new Pair<>("real_roi", "真实ROI"),
+                new Pair<>("water_profit", "流水利润"),
+                new Pair<>("real_profit", "真实利润")
+        );
+        JSONArray dateIndicatorTable = new JSONArray();
+        for (Pair<String, String> column : columns) {
+            String key = column.getKey();
+            String name = column.getValue();
+            JSONObject obj = new JSONObject();
+            if (!name.contains("ROI")){
+                String todayDataValue = String.valueOf(todayData.getOrDefault(key, "0"));
+                String lastDayDataValue = String.valueOf(lastDayData.getOrDefault(key, "0"));
+                obj.put("indicatorName", name);
+                obj.put("todayData", todayDataValue);
+                obj.put("lastDayData", lastDayDataValue);
+                double todayDataDouble = Double.parseDouble(todayDataValue);
+                double lastDayDataDouble = Double.parseDouble(lastDayDataValue);
+                if (lastDayDataDouble != 0) {
+                    double rate = (todayDataDouble - lastDayDataDouble) / lastDayDataDouble * 100;
+                    String rateStr = String.format("%.2f%%", rate);
+                    obj.put("roundRate", rateStr);
+                    if (rate > 0.0){
+                        obj.put("rateColor", "red");
+                    }else if (rate < 0.0){
+                        obj.put("rateColor", "green");
+                    }
+                } else {
+                    obj.put("roundRate", "0.00%");
+                    obj.put("rateColor", "black");
+                }
+            }else {
+                String todayDataValue = String.valueOf(todayData.get(key));
+                String lastDayDataValue = String.valueOf(lastDayData.get(key));
+                obj.put("indicatorName", name);
+                obj.put("todayData", todayDataValue);
+                obj.put("lastDayData", lastDayDataValue);
+                obj.put("roundRate", "-");
+                obj.put("rateColor", "black");
+            }
+            dateIndicatorTable.add(obj);
+        }
+
+        List<Map<String, String>> movieData = reportsPushMapper.tmpTopMovie(todayLong);
+        JSONArray movieRankTable = new JSONArray();
+        for (Map<String, String> movie : movieData){
+            JSONObject obj = new JSONObject();
+            obj.put("rank", String.valueOf(movie.get("rk")));
+            obj.put("movieName", String.valueOf(movie.get("movie_name")));
+            obj.put("endAmount", String.valueOf(movie.get("end_amount")));
+            obj.put("realROI", String.valueOf(movie.get("real_roi")));
+            movieRankTable.add(obj);
+        }
+
+        List<Map<String, String>> deptData = reportsPushMapper.deptRank2(todayLong);
+        JSONArray deptRank = new JSONArray();
+        for (Map<String, String> dept : deptData){
+            JSONObject obj = new JSONObject();
+            obj.put("rank", String.valueOf(dept.get("rk")));
+            obj.put("deptName", String.valueOf(dept.get("dept_name")));
+            obj.put("todayCost", String.valueOf(dept.get("cost_amount")));
+            obj.put("ROI", String.valueOf(dept.get("real_roi")));
+            deptRank.add(obj);
+        }
+
+        JSONObject template_variable = new JSONObject();
+        template_variable.put("updateTime", updateTime);
+        template_variable.put("todayDate", today);
+        template_variable.put("lastDayDate", lastDay);
+        template_variable.put("dateIndicatorTable", dateIndicatorTable);
+        template_variable.put("movieRankTable", movieRankTable);
+        template_variable.put("deptRank", deptRank);
+
+        List<String> userIds = Arrays.asList(
+                "44fbaed6" //zhaotx
+                ,"ebeeced9" //yumeng
+                ,"265g9ef1" //wangshu
+                ,"ee518161" //zhaozhicheng
+                ,"c5f6b59d" //yuyang
+                ,"d834552b" //hemenghao
+                ,"a3235a61" //louzijun
+                ,"58e7a98a"  //xsq
+        );
+        for (String userId : userIds) {
+            sendToFeishu(token, template_variable, userId);
+        }
+    }
+
+    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);
+        }
+    }
+}

+ 3 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/OptimizerRankPushServiceImpl.java

@@ -27,6 +27,8 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
+    public static final String APP_ID = "cli_a772630daa6cd00d";
+    public static final String APP_KEY = "qNjMgTXcUmRNc9gwzMMDYc8IS35wDdtX";
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
@@ -41,7 +43,7 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
         String token;
         Map<String, String> mobileMap;
         try {
-            token = FeishuRobotUtil.getFsZtTenantToken();
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
             mobileMap = FeishuRobotUtil.getFsUserIds(token, mobiles); //mobile -> userId
         }catch (IOException e){
             log.error("获取飞书token失败", e);

+ 3 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ReportsAdPushServiceImpl.java

@@ -24,6 +24,8 @@ import java.util.Map;
 @Slf4j
 @Service
 public class ReportsAdPushServiceImpl implements IReportsAdPushService {
+    public static final String APP_ID = "cli_a77262ef7af8d00e";
+    public static final String APP_KEY = "OUlg7WTa6UWZItfTmJw2JdQvhVI4VcRj";
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
@@ -99,7 +101,7 @@ public class ReportsAdPushServiceImpl implements IReportsAdPushService {
         );
         String token;
         try {
-            token = FeishuRobotUtil.getFsZtTenantToken();
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
         }catch (IOException e){
             log.error("获取token失败", e);
             return;

+ 3 - 1
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java

@@ -30,6 +30,8 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class TotalRankPushServiceImpl implements ITotalRankPushService {
+    public static final String APP_ID = "cli_a77cb66d87bfd00d";
+    public static final String APP_KEY = "nDAFiSBNbQ5gYilvKZflE6fWT47m0D1W";
 
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
@@ -43,7 +45,7 @@ public class TotalRankPushServiceImpl implements ITotalRankPushService {
         String token;
         Map<String, String> mobileMap;
         try {
-            token = FeishuRobotUtil.getFsZtTenantToken();
+            token = FeishuRobotUtil.getTenantToken(APP_ID, APP_KEY);
             mobileMap = FeishuRobotUtil.getFsUserIds(token, mobiles); //mobile -> userId
         }catch (IOException e){
             log.error("获取飞书token失败", e);

+ 6 - 4
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java

@@ -19,29 +19,31 @@ public class FeishuPushJob {
     IOptimizerRankPushService optimizerRankPushService;
     @Autowired
     ITotalRankPushService totalRankPushService;
+    @Autowired
+    IDateReportsPushService dateReportsPushService;
 
     @XxlJob("unbindWarnPush")
     public void unbindWarnPush(){
         unbindWarnPushService.send();
     }
-
     @XxlJob("bindAppErrorWarnPush")
     public void bindAppErrorWarnPush(){
         bindAppErrorWarnService.send();
     }
-
     @XxlJob("reportsAdPush")
     public void reportsAdPush(){
         reportsAdPushService.send();
     }
-
     @XxlJob("optimizerRankPush")
     public void optimizerRankPush(){
         optimizerRankPushService.send();
     }
-
     @XxlJob("totalRankPush")
     public void totalRankPush(){
         totalRankPushService.send();
     }
+    @XxlJob("dateReportsPush")
+    public void dateReportsPush(){
+        dateReportsPushService.send();
+    }
 }

+ 5 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/utils/FeishuRobotUtil.java

@@ -49,6 +49,11 @@ public class FeishuRobotUtil {
         return getTenantToken(getFsAdlbAuth());
     }
 
+    public static String getTenantToken(String appid, String appKey) throws IOException {
+        String entity = "{\"app_id\":\""+appid+"\",\"app_secret\":\""+appKey+"\"}";
+        return getTenantToken(entity);
+    }
+
     public static String getTenantToken(String entity) throws IOException {
         //获取token
         String tokenUrl = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";