Преглед изворни кода

飞书推送-应用错绑,优化师汇总,小组优化师

zhaotx пре 1 година
родитељ
комит
a4f3197dea

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

@@ -19,6 +19,10 @@ public interface ReportsAdPushMapper {
     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("last30Day") Long last30Day);
+
+    List<Map<String, String>> bindAppErrorData(@Param("last30Day") Long last30Day);
 }

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

@@ -62,7 +62,7 @@
 
 
     <select id="optimizerCostRank" resultType="java.util.Map">
-        select tb1.user_id, tb4.phonenumber,
+        select tb1.user_id, tb4.phonenumber, tb4.dept_id, tb5.dept_name,
         rank() over (order by sum(cost_amount) desc) as rk,
         sum(cost_amount) 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
@@ -74,15 +74,16 @@
         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 from deepthink.sys_user) tb4
+        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 tb1.user_id
         having sum(cost_amount)>1
         order by rk asc
-        limit 10
     </select>
     <select id="optimizerDateData" resultType="java.util.Map">
-        select tb1.user_id,tb4.phonenumber,tb4.nick_name,
+        select tb1.user_id,tb4.phonenumber,tb4.nick_name, tb4.dept_id,
         concat(round(if(ifnull(sum(cost_amount),0)=0, 0, (ifnull(sum(iaa_amount),0)+ifnull(sum(pay_amount), 0))/sum(cost_amount)*100 ), 2), '%') AS water_roi,
         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,
         ifnull(sum(cost_amount),0) AS cost_amount,
@@ -102,7 +103,7 @@
         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 from deepthink.sys_user) tb4
+        left join (select user_id, nick_name, phonenumber, dept_id from deepthink.sys_user) tb4
         on tb1.user_id=tb4.user_id
         group by tb1.user_id
         having sum(cost_amount)>0
@@ -134,6 +135,30 @@
 
 
 
+    <select id="deptCostRank" 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,
+        ifnull(sum(cost_amount_hour), 0) as cost_amount_hour
+        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(cost_amount) as cost_amount_hour
+        from application.media_ad_report_hourly where stat_date=#{date} and `hour`= ${hour} 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 asc
+        limit 10
+    </select>
+
+
     <select id="unbindData" resultType="java.util.Map">
         select tb1.advertiser_id, tb1.advertiser_name, ifnull(tb2.ca,0) as today_cost, tb3.ca as last_30_cost from
         (select cast(advertiser_id as char) advertiser_id, advertiser_name from deepthink.advertiser_unbind_info) tb1
@@ -148,10 +173,32 @@
         order by tb3.ca desc
     </select>
     <select id="selectUserList" resultType="com.alibaba.fastjson.JSONObject">
-        select user_id, nick_name, phonenumber, remark
+        select user_id, nick_name, phonenumber, remark, u.dept_id
         from deepthink.sys_user u
         left join deepthink.sys_dept d on u.dept_id = d.dept_id
         where u.del_flag = '0'
         AND (u.dept_id = 300 OR u.dept_id IN ( SELECT t.dept_id FROM deepthink.sys_dept t WHERE find_in_set(300, ancestors) ))
     </select>
+    <select id="bindAppErrorData" resultType="java.util.Map">
+        select tb1.advertiser_id, tb2.advertiser_name, tb1.ma_appid as right_app, tb2.ma_appid as error_app,
+        tb3.app_name as right_app_name, tb4.app_name as error_app_name,
+        tb2.user_id, tb5.nick_name, tb5.phonenumber
+        from
+        (select advertiser_id, ma_appid from application.user_data_report_daily
+        where stat_date &gt;= #{last30Day} and advertiser_id != '-9999' and ma_appid != '-9999'
+        group by advertiser_id, ma_appid
+        having sum(pay_amount) > 1
+        )tb1
+        inner join
+        (select advertiser_id, advertiser_name, ma_appid, user_id from deepthink.advertiser_bind_info) tb2
+        on tb1.advertiser_id = tb2.advertiser_id
+        left join (select distinct app_id, app_name from hr_playlet.m_mini_app_info) tb3
+        on tb1.ma_appid = tb3.app_id
+        left join (select distinct app_id, app_name from hr_playlet.m_mini_app_info) tb4
+        on tb2.ma_appid = tb4.app_id
+        left join (select user_id, phonenumber, nick_name from deepthink.sys_user) tb5
+        on tb2.user_id=tb5.user_id
+        where tb1.ma_appid != tb2.ma_appid
+        order by tb2.user_id
+    </select>
 </mapper>

+ 6 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IBindAppErrorWarnService.java

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

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

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

+ 153 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/BindAppErrorWarnServiceImpl.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.IBindAppErrorWarnService;
+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.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+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.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class BindAppErrorWarnServiceImpl implements IBindAppErrorWarnService {
+
+    private static final String TEMPLATE_VERSION = "1.0.0";
+    private static final String TEMPLATE_ID = "AAqRUxu6bzaaa";
+    @Autowired
+    ReportsAdPushMapper reportsPushMapper;
+
+
+    @Override
+    public void send() {
+        List<JSONObject> users = reportsPushMapper.selectUserList();
+        List<String> mobiles = users.stream().map(user -> user.getString("phonenumber"))
+                .filter(s -> s != null && s.length() == 11)
+                .collect(Collectors.toList());
+        String last30Day = DateUtils.getNowAddDate("yyyy-MM-dd", -30);
+        Long last30DayLong = Long.parseLong(last30Day.substring(0, 10).replaceAll("-", ""));
+
+        List<Map<String, String>> bindAppErrorWarnList = reportsPushMapper.bindAppErrorData(last30DayLong);
+
+        long lastUserId = 0L;
+        ErrorBind lastBind = null;
+        List<ErrorBind> errorBinds = new ArrayList<>();
+        for (Map<String, String> map : bindAppErrorWarnList) {
+            long userId = Long.parseLong(String.valueOf(map.get("user_id")));
+            if (lastUserId != userId) {
+                if (lastBind != null) {
+                    errorBinds.add(lastBind);
+                }
+                lastBind = new ErrorBind();
+                lastBind.setPhoneNumber(map.get("phonenumber"));
+                lastBind.setNickName(map.get("nick_name"));
+                lastBind.setErrorNum(1);
+                lastBind.setList(new ArrayList<>());
+                lastUserId = userId;
+            } else {
+                lastBind.setErrorNum(lastBind.getErrorNum() + 1);
+            }
+            lastBind.getList().add(map);
+        }
+        if (lastBind != null) {
+            errorBinds.add(lastBind);
+        }
+
+        System.out.println(JSON.toJSONString(errorBinds));
+        String alarm_time = DateUtils.getNowDate("yyyy-MM-dd HH:mm:ss");
+
+        String token = null;
+        Map<String, String> mobileMap = null;
+        try {
+            token = FeishuRobotUtil.getFsAdlbTenantToken();
+            mobileMap = FeishuRobotUtil.getFsUserIds(token, mobiles); //mobile -> userId
+        }catch (IOException e){
+            log.error("获取飞书token失败", e);
+            return;
+        }
+
+        for (ErrorBind errorBind : errorBinds) {
+            String userId = mobileMap.get(errorBind.getPhoneNumber());
+            if (!Check.isNull(userId) && errorBind.getErrorNum() > 0) {
+                JSONObject template_variable = new JSONObject();
+                template_variable.put("unbindNum", errorBind.getErrorNum());
+                template_variable.put("alarm_time", alarm_time);
+                JSONArray object_list_1 = new JSONArray();
+                int index = 0;
+                for (Map<String, String> map : errorBind.getList()){
+                    if (++index > 20){
+                        break;
+                    }
+                    JSONObject object = new JSONObject();
+                    object.put("advertiserName", map.get("advertiser_name"));
+                    object.put("advertiserId", String.valueOf(map.get("advertiser_id")));
+                    object.put("errorApp", String.valueOf(map.get("error_app_name")));
+                    object.put("rightApp", String.valueOf(map.get("right_app_name")));
+                    object_list_1.add(object);
+                }
+                template_variable.put("object_list_1", object_list_1);
+
+                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", userId);
+//                request.put("receive_id", "44fbaed6");
+                request.put("msg_type", "interactive");
+                request.put("content", content.toJSONString());
+                System.out.println("发送给: "+errorBind.getNickName());
+                sendToFeishu(token, request);
+            }
+        }
+
+    }
+
+    private void sendToFeishu(String token, JSONObject requestBody){
+        //发送
+        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(requestBody.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);
+        }
+    }
+
+
+
+    @Data
+     public static class ErrorBind{
+        String phoneNumber;
+        String nickName;
+        int errorNum;
+        List<Map<String, String>> list;
+    }
+
+}

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

@@ -2,6 +2,7 @@ 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.IOptimizerRankPushService;
+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;
@@ -19,7 +20,6 @@ import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -30,8 +30,8 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
     @Autowired
     ReportsAdPushMapper reportsPushMapper;
 
-    private static final String TEMPLATE_VERSION = "1.0.8";
-    private static final String TEMPLATE_ID = "AAqBGPmrbiJtk";
+    private static final String TEMPLATE_VERSION = "1.0.2";
+    private static final String TEMPLATE_ID = "AAqRUxrkkWuZf";
 
     public void send() {
         List<JSONObject> users = reportsPushMapper.selectUserList();
@@ -48,33 +48,15 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
             return;
         }
 
-        JSONObject template_variable = new JSONObject();
+
         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;
-        template_variable.put("todaydate", today.substring(5, 10));
-        template_variable.put("thisHour", String.valueOf(hour));
-        template_variable.put("lastHour", String.valueOf(lastHour));
-        template_variable.put("lastLastHour", String.valueOf(lastLastHour));
-        JSONArray object_list_4 = new JSONArray();//优化师排名
+
         List<Map<String, String>> optimizerCostRank = reportsPushMapper.optimizerCostRank(todayLong, String.valueOf(lastHour));
-        for (int i = 0; i < optimizerCostRank.size(); i++) {
-            Map<String, String> map = optimizerCostRank.get(i);
-            JSONObject object = new JSONObject();
-            object.put("rankRank", String.valueOf(map.getOrDefault("rk", "-")));
-            if (mobileMap.containsKey(map.get("phonenumber"))){
-                object.put("user_id", Arrays.asList(mobileMap.get(map.get("phonenumber"))));
-            }else {
-                object.put("user_id", Collections.emptyList());
-            }
-            object.put("rankTodayData", String.valueOf(map.getOrDefault("cost_amount", "0")));
-//            object.put("rankThisHourData", String.valueOf(map.getOrDefault("hour_cost_amount", "0")));
-            object.put("rankRealROI", String.valueOf(map.getOrDefault("real_roi", "0")));
-            object_list_4.add(object);
-        }
-        template_variable.put("object_list_4", object_list_4);
+        Map<String, List<Map<String, String>>> deptMap = optimizerCostRank.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("dept_id"))));
 
         List<Map<String, String>> todayData = reportsPushMapper.optimizerDateData(todayLong);
         List<Map<String, String>> hourData = reportsPushMapper.optimizerHourData(todayLong, String.valueOf(lastHour));
@@ -89,12 +71,39 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
                 new Pair<>("real_roi", "真实ROI")
         );
 
-//        int index = 0;
+
+        int index = 0;
         for (Map<String, String> optToday : todayData){
-//            if (index++ >= 1){
-//                break;
-//            }
-            JSONArray object_list_5 = new JSONArray();//本人数据
+            if (index++ > 1){
+                return;
+            }
+            String deptId = String.valueOf(optToday.get("dept_id"));
+            if (deptId.equals("30201")){
+                continue;
+            }
+
+            JSONObject template_variable = new JSONObject();
+            template_variable.put("todaydate", today.substring(5, 10));
+            template_variable.put("thisHour", String.valueOf(hour));
+            template_variable.put("lastHour", String.valueOf(lastHour));
+            template_variable.put("lastLastHour", String.valueOf(lastLastHour));
+            List<Map<String, String>> deptUserData = deptMap.get(deptId);
+            if (!Check.isNull(deptUserData)){
+                JSONArray object_list_4 = new JSONArray();
+                for (Map<String, String> deptUser: deptUserData){
+                    //rankTodayData, rankRank, rankRealROI, userId
+                    JSONObject object = new JSONObject();
+                    object.put("rankTodayData", deptUser.get("cost_amount"));
+                    object.put("rankRank", deptUser.get("rk"));
+                    object.put("rankRealROI", deptUser.get("real_roi"));
+                    object.put("userId", Arrays.asList(mobileMap.get(String.valueOf(deptUser.get("phonenumber")))));
+                    object_list_4.add(object);
+                }
+                template_variable.put("object_list_4", object_list_4);
+            }
+
+
+            JSONArray object_list_5 = new JSONArray();
             Map<String, String> optHour = hourDataMap.get(String.valueOf(optToday.get("user_id")));
             Map<String, String> optLastHour = lastHourDataMap.get(String.valueOf(optToday.get("user_id")));
             String rank = String.valueOf(optToday.get("rk"));
@@ -117,16 +126,9 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
             template_variable.put("object_list_5", object_list_5);
             System.out.println("发送目标: nickName: "+nickName+", userId: "+ userId + ", feishuUserId: "+mobileMap.get(phoneNumber)+", rank: "+rank+", costAmount: "+costAmount);
             sendToFeishu(token, template_variable, mobileMap.get(phoneNumber));
+//            sendToFeishu(token, template_variable, "44fbaed6");
             //clear
-            template_variable.remove("myRank");
-            template_variable.remove("object_list_5");
         }
-
-        template_variable.put("myRank", "0");
-        sendToFeishu(token, template_variable, "44fbaed6");//zhaotx
-        sendToFeishu(token, template_variable, "c5f6b59d");//yuyang
-        sendToFeishu(token, template_variable, "265g9ef1");//wangshu
-        sendToFeishu(token, template_variable, "58e7a98a");//xsq
     }
 
     private void sendToFeishu(String token, JSONObject template_variable, String receive_id) {
@@ -140,7 +142,6 @@ public class OptimizerRankPushServiceImpl implements IOptimizerRankPushService {
 
         JSONObject request = new JSONObject();
         request.put("receive_id", receive_id);
-//        request.put("receive_id", "44fbaed6");
         request.put("msg_type", "interactive");
         request.put("content", content.toJSONString());
         //发送

Разлика између датотеке није приказан због своје велике величине
+ 139 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/TotalRankPushServiceImpl.java


+ 9 - 9
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/UnbindWarnPushServiceImpl.java

@@ -132,15 +132,15 @@ public class UnbindWarnPushServiceImpl implements IUnbindWarnPushService {
                 System.out.println("发送给: "+ub.getName());
                 sendToFeishu(token, request);
 
-                //todo 临时加的
-                if (token2 != null){
-                    System.out.println("应用2 发送给: "+ub.getName());
-                    sendToFeishu(token2, request);
-                }
-                if (token3 != null){
-                    System.out.println("应用3 发送给: "+ub.getName());
-                    sendToFeishu(token3, request);
-                }
+//                //todo 临时加的
+//                if (token2 != null){
+//                    System.out.println("应用2 发送给: "+ub.getName());
+//                    sendToFeishu(token2, request);
+//                }
+//                if (token3 != null){
+//                    System.out.println("应用3 发送给: "+ub.getName());
+//                    sendToFeishu(token3, request);
+//                }
             }
         }
 

+ 15 - 3
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/FeishuPushJob.java

@@ -1,8 +1,6 @@
 package cn.com.ctop.job.bytedance.handler;
 
-import cn.com.ctop.job.bytedance.data.service.IOptimizerRankPushService;
-import cn.com.ctop.job.bytedance.data.service.IReportsAdPushService;
-import cn.com.ctop.job.bytedance.data.service.IUnbindWarnPushService;
+import cn.com.ctop.job.bytedance.data.service.*;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,15 +12,24 @@ public class FeishuPushJob {
     @Autowired
     IUnbindWarnPushService unbindWarnPushService;
     @Autowired
+    IBindAppErrorWarnService bindAppErrorWarnService;
+    @Autowired
     IReportsAdPushService reportsAdPushService;
     @Autowired
     IOptimizerRankPushService optimizerRankPushService;
+    @Autowired
+    ITotalRankPushService totalRankPushService;
 
     @XxlJob("unbindWarnPush")
     public void unbindWarnPush(){
         unbindWarnPushService.send();
     }
 
+    @XxlJob("bindAppErrorWarnPush")
+    public void bindAppErrorWarnPush(){
+        bindAppErrorWarnService.send();
+    }
+
     @XxlJob("reportsAdPush")
     public void reportsAdPush(){
         reportsAdPushService.send();
@@ -32,4 +39,9 @@ public class FeishuPushJob {
     public void optimizerRankPush(){
         optimizerRankPushService.send();
     }
+
+    @XxlJob("totalRankPush")
+    public void totalRankPush(){
+        totalRankPushService.send();
+    }
 }