|  | @@ -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;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |