Browse Source

内容供给量-分品类

wangyunpeng 2 ngày trước cách đây
mục cha
commit
42f5cf339d

+ 5 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/mapper/longArticle/LongArticleBaseMapper.java

@@ -5,6 +5,7 @@ import com.tzld.longarticle.recommend.server.model.dto.LongArticlesCrawlerVideos
 import com.tzld.longarticle.recommend.server.model.dto.LongArticlesMatchVideos;
 import com.tzld.longarticle.recommend.server.model.entity.longArticle.*;
 import com.tzld.longarticle.recommend.server.model.param.ArticleVideoPoolSourceParam;
+import com.tzld.longarticle.recommend.server.model.vo.CategoryGroupFunnelExport;
 import com.tzld.longarticle.recommend.server.model.vo.DailyAuditProduceExport;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -98,4 +99,8 @@ public interface LongArticleBaseMapper {
     void saveVideoEndScreenTransformationTask(VideoEndScreenTransformationTask task);
 
     List<DailyAuditProduceExport> getAccountDailyVideoAuditCount(Long startTimeStamp, Long endTimeStamp);
+
+    List<CategoryGroupFunnelExport> getCategoryMatchCount(Date start, Date end);
+
+    List<CategoryGroupFunnelExport> getCategoryTitleAuditCount(Long start, Long end);
 }

+ 15 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/CategoryGroupFunnelExport.java

@@ -0,0 +1,15 @@
+package com.tzld.longarticle.recommend.server.model.vo;
+
+import lombok.Data;
+
+@Data
+public class CategoryGroupFunnelExport {
+    private String dateStr;
+    private String category;
+    private Long matchCount;
+    private Long matchSuccessCount;
+    private Double matchSuccessRate;
+    private Long videoAuditCount;
+    private Long videoAuditPassCount;
+    private Double videoAuditPassRate;
+}

+ 89 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/DataDashboardService.java

@@ -3823,4 +3823,93 @@ public class DataDashboardService {
         return result;
     }
 
+
+    @XxlJob("categoryGroupFunnelExport")
+    public ReturnT<String> categoryGroupFunnelJob(String param) {
+        List<String> dateStrList = DateUtils.getBeforeDays(null, null, 1);
+        categoryGroupFunnel(dateStrList);
+        return ReturnT.SUCCESS;
+    }
+
+    public void categoryGroupFunnel(String dateStr) {
+        if (!StringUtils.hasText(dateStr)) {
+            dateStr = DateUtils.getBeforeDaysDateStr("yyyyMMdd", 1);
+        }
+        categoryGroupFunnel(Collections.singletonList(dateStr));
+    }
+
+    public void categoryGroupFunnel(List<String> dateStrList) {
+        List<CategoryGroupFunnelExport> exportList = new ArrayList<>();
+        dateStrList = Lists.reverse(dateStrList);
+        for (String dateStr : dateStrList) {
+            exportList.addAll(buildCategoryGroupFunnelExport(dateStr));
+        }
+        if (CollectionUtil.isEmpty(exportList)) {
+            return;
+        }
+        int rowNum = exportList.size();
+        List<List<Object>> rows = new ArrayList<>();
+        Field[] fields = CategoryGroupFunnelExport.class.getDeclaredFields();
+        for (CategoryGroupFunnelExport datum : exportList) {
+            List<Object> rowDatas = new ArrayList<>();
+            rows.add(rowDatas);
+
+            for (Field field : fields) {
+                field.setAccessible(true);
+                try {
+                    rowDatas.add(field.get(datum));
+                } catch (IllegalAccessException e) {
+                    log.error("获取值出错:{}", field.getName());
+                } catch (Exception e) {
+                    throw new RuntimeException(e.getMessage());
+                }
+            }
+        }
+
+        List<Pair<String, String>> styles = Arrays
+                .asList(
+                        Pair.of("E", "0.00%"),
+                        Pair.of("H", "0.00%")
+                );
+        doSendFeishuSheet(dateStrList, dailyDetailSheetToken, "0Lwz8A", rowNum, rows,
+                2, styles, null, null);
+    }
+
+    private List<CategoryGroupFunnelExport> buildCategoryGroupFunnelExport(String dateStr) {
+        List<CategoryGroupFunnelExport> result = new ArrayList<>();
+        Long start = DateUtils.getStartOfDay(dateStr, "yyyyMMdd") * 1000;
+        Long end = start + 86400000;
+        Date dateStart = DateUtils.getStartDateOfDay(start / 1000);
+        Date dateEnd = DateUtils.getStartDateOfDay(end / 1000);
+        // 匹配
+        List<CategoryGroupFunnelExport> matchCategoryList = longArticleBaseMapper.getCategoryMatchCount(dateStart, dateEnd);
+        Map<String, CategoryGroupFunnelExport> categoryMap = matchCategoryList.stream()
+               .collect(Collectors.toMap(CategoryGroupFunnelExport::getCategory, Function.identity()));
+        for (CategoryGroupFunnelExport item : matchCategoryList) {
+            item.setDateStr(dateStr);
+            if (Objects.nonNull(item.getMatchCount()) && item.getMatchCount() > 0) {
+                item.setMatchSuccessRate((double) item.getMatchSuccessCount() / item.getMatchCount());
+            }
+            result.add(item);
+        }
+        // 视频审核
+        List<CategoryGroupFunnelExport> auditCategoryList = longArticleBaseMapper.getCategoryTitleAuditCount(start, end);
+        for (CategoryGroupFunnelExport item : auditCategoryList) {
+            CategoryGroupFunnelExport export = categoryMap.get(item.getCategory());
+            if (Objects.isNull(export)) {
+                export = new CategoryGroupFunnelExport();
+                export.setDateStr(dateStr);
+                export.setCategory(item.getCategory());
+                result.add(export);
+            }
+            export.setVideoAuditPassCount(item.getVideoAuditPassCount());
+            export.setVideoAuditCount(item.getVideoAuditCount());
+            if (Objects.nonNull(item.getVideoAuditCount()) && item.getVideoAuditCount() > 0) {
+                export.setVideoAuditPassRate((double) item.getVideoAuditPassCount() / item.getVideoAuditCount());
+            }
+        }
+
+        // sum
+        return result;
+    }
 }

+ 7 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/recommend/DataDashboardController.java

@@ -99,4 +99,11 @@ public class DataDashboardController {
         }).start();
     }
 
+    @GetMapping("/export/categoryGroupFunnel")
+    public void categoryGroupFunnel(String dateStr) {
+        new Thread(() -> {
+            service.categoryGroupFunnel(dateStr);
+        }).start();
+    }
+
 }

+ 34 - 0
long-article-recommend-service/src/main/resources/mapper/longArticle/LongArticleBaseMapper.xml

@@ -389,4 +389,38 @@
         on audit.audit_account = videoAuditPass.audit_account
     </select>
 
+    <select id="getCategoryMatchCount"
+            resultType="com.tzld.longarticle.recommend.server.model.vo.CategoryGroupFunnelExport">
+        select success.category, success.cnt as matchSuccessCount, total.cnt as matchCount
+        from (select ac.category, count(1) as cnt
+              from long_articles_text lat
+                       join article_category ac on lat.content_id = ac.produce_content_id
+              where lat.start_processing_time between #{start} and #{end}
+                and lat.result_status = 1
+              group by ac.category) success
+        left join (select ac.category, count(1) as cnt
+                   from long_articles_text lat
+                            join article_category ac on lat.content_id = ac.produce_content_id
+                   where lat.start_processing_time between #{start} and #{end}
+                     and lat.result_status in (1, 2)
+                   group by ac.category) total on total.category = success.category
+    </select>
+
+    <select id="getCategoryTitleAuditCount"
+            resultType="com.tzld.longarticle.recommend.server.model.vo.CategoryGroupFunnelExport">
+        select success.category, success.cnt as videoAuditPassCount, total.cnt as videoAuditCount
+        from (select ac.category, count(1) as cnt
+              from long_articles_title_audit lata
+               join article_category ac on lata.content_id = ac.produce_content_id
+              where lata.audit_timestamp between #{start} and #{end}
+                and lata.`status` = 1
+              group by ac.category) success
+        left join (select ac.category, count(1) as cnt
+                from long_articles_title_audit lata
+                 join article_category ac on lata.content_id = ac.produce_content_id
+                where lata.audit_timestamp between #{start} and #{end}
+                  and lata.`status` in (1, 2)
+                group by ac.category) total on total.category = success.category
+    </select>
+
 </mapper>