Browse Source

头条/快手总消耗,视频总数,有效视频,爆款视频

yangzian 3 years ago
parent
commit
ff7050eb45

+ 4 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialReportOverViewController.java

@@ -52,11 +52,14 @@ public class MaterialReportOverViewController {
 
     /**
      *  根据筛选条件查询总消耗、视频总数、爆款视频、有效视频
+     *  mediaId 类型 1-头条 2-快手
+     *  projects[] 项目id
      */
     @PostMapping("/sumData")
     public Result<Map<String,Object>> sumData(@RequestBody JSONObject params){
         Result<Map<String,Object>> result= new Result<>();
-        Map<String, Object> totalModule = materialReportOverViewService.getTotalModule(params.getInteger("mediaId"),
+        Map<String, Object> totalModule = materialReportOverViewService.getTotalModule(
+                params.getInteger("mediaId"),
                 params.getString("startDate"),
                 params.getString("endDate"),
                 params.getJSONArray("projects"));

+ 31 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/MaterialReportOverViewMapper.java

@@ -7,6 +7,7 @@ import org.jeecg.modules.orderplatform.util.JsonArrayUtil;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 public interface MaterialReportOverViewMapper {
@@ -31,6 +32,36 @@ public interface MaterialReportOverViewMapper {
     //查询素材总数
     Long queryMaterialCount(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
 
+
+
+
+    //查询素材时段数据 头条
+    List<Map<String,String>> queryMaterialCountList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+
+    //查询有消耗的素材 - 头条
+    Long queryMaterialCostList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+    //查询有消耗的素材 - 快手
+    Long queryMaterialCostListKs(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+
+
+    //查询有效视频-头条
+    List<Map<String,String>> selectEffectiveMaterialVideoBytedance(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+    //有效视频-快手
+    List<Map<String,String>> selectEffectiveMaterialVideoKs(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+
+    //查询爆款视频-头条
+    List<Map<String,String>> selectHotMaterialVideoBytedance(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+    //爆款视频 -快手
+    List<Map<String,String>> selectHotMaterialVideoKs(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("projects") JSONArray projects);
+
+
+
+
+
+
+
+
+
     //查询今日上新素材数
     Long queryNewMaterialCount(@Param("statDate") String statDate, @Param("projects") JSONArray projects);
 

+ 163 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/MaterialReportOverViewMapper.xml

@@ -126,6 +126,169 @@
         AND DATE_FORMAT(create_time, '%Y-%m-%d')&lt;= #{endDate}
     </select>
 
+    <!-- 查询素材时段数据 -->
+    <select id="queryMaterialCountList" resultType="java.util.HashMap">
+        SELECT
+        count(id) as count ,
+        DATE_FORMAT(create_time, '%Y-%m-%d') as time
+        from ctop_material_info
+        WHERE 1=1
+        <if test="projects !=null">
+            AND project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and create_time &gt;= #{startDate}
+        and create_time &lt;= #{endDate}
+        GROUP BY time
+        ORDER BY time
+
+    </select>
+
+ <!-- 查询有消耗的素材 头条 -->
+    <select id="queryMaterialCostList" resultType="long">
+        SELECT
+        COUNT(m.id) as count
+        FROM
+        ctop_material_info m
+        LEFT JOIN ctop_bytedance_video_info v ON m.CODE = v.signature
+        LEFT JOIN ctop_bytedance_report_material_daily r ON v.account_id = r.account_id AND v.material_id = r.material_id
+        WHERE
+        1 = 1
+        AND r.cost > 0
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and m.create_time &gt;= #{startDate}
+        and m.create_time &lt;= #{endDate}
+
+    </select>
+
+ <!-- 查询有消耗的素材 快手 -->
+    <select id="queryMaterialCostListKs" resultType="long">
+
+        SELECT
+        COUNT(m.id) as count
+        FROM
+        ctop_material_info m
+        LEFT JOIN ctop_kuaishou_report_daily_material r ON r.signature = m.code
+        WHERE
+        1 = 1
+        AND r.charge > 0
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and m.create_time &gt;= #{startDate}
+        and m.create_time &lt;= #{endDate}
+    </select>
+
+    <!-- 有效视频-头条 -->
+    <select id="selectEffectiveMaterialVideoBytedance" resultType="java.util.HashMap">
+        select
+               COUNT(m.id) count,
+               b.effect_date as time
+        from
+        ctop_bytedance_video_etl_info b
+        LEFT JOIN ctop_material_info m on m.code = b.video_code
+        where b.effect_date is not null
+        and b.effect_day_num &lt;= 7
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and b.effect_date &gt;= #{startDate}
+        and b.effect_date &lt;= #{endDate}
+        GROUP BY time
+        ORDER BY time
+    </select>
+
+
+    <!-- 有效视频-快手 -->
+    <select id="selectEffectiveMaterialVideoKs" resultType="java.util.HashMap">
+        select
+               COUNT(m.id) count,
+             b.effect_date as time
+        from
+        ctop_kuaishou_video_etl_info b
+        LEFT JOIN ctop_material_info m on m.code = b.video_code
+        where b.effect_date is not null
+        and b.effect_day_num &lt;= 7
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and b.effect_date &gt;= #{startDate}
+        and b.effect_date &lt;= #{endDate}
+        GROUP BY time
+        ORDER BY time
+    </select>
+
+
+    <!-- 爆款视频-头条 -->
+    <select id="selectHotMaterialVideoBytedance" resultType="java.util.HashMap">
+        select
+               COUNT(m.id) count,
+        b.faddish_date as time
+        from
+        ctop_bytedance_video_etl_info b
+        LEFT JOIN ctop_material_info m on m.code = b.video_code
+        where b.faddish_date is not null
+        and b.faddish_day_num &lt;= 14
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and b.faddish_date &gt;= #{startDate}
+        and b.faddish_date &lt;= #{endDate}
+        GROUP BY time
+        ORDER BY time
+    </select>
+
+
+    <!-- 爆款视频-快手 -->
+    <select id="selectHotMaterialVideoKs" resultType="java.util.HashMap">
+        select
+            COUNT(m.id) count,
+            b.faddish_date as time
+        from
+        ctop_kuaishou_video_etl_info b
+        LEFT JOIN ctop_material_info m on m.code = b.video_code
+        where b.faddish_date is not null
+        and b.faddish_day_num &lt;= 14
+        <if test="projects !=null">
+            AND m.project_id IN
+            <foreach collection="projects" item="item" separator=","
+                     open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+        and b.faddish_date &gt;= #{startDate}
+        and b.faddish_date &lt;= #{endDate}
+        GROUP BY time
+        ORDER BY time
+    </select>
+
+
+
     <select id="queryNewMaterialCount" resultType="long">
         SELECT
         count(id) from ctop_material_info

+ 120 - 14
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/MaterialReportOverViewServiceImpl.java

@@ -30,6 +30,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.ParseException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -89,23 +90,110 @@ public class MaterialReportOverViewServiceImpl implements IMaterialReportOverVie
             projects = getProjectsByCurrentUser(mediaId);
         }
         if (mediaId == CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_INT) {
+            //总消耗
             BigDecimal cost = materialReportOverViewMapper.queryBytedanceCost(startDate, endDate, projects);
+            //上阶段消耗
             BigDecimal lastCost = materialReportOverViewMapper.queryBytedanceCost(DateUtils.addDay(startDate, -DateUtils.dateDiff(startDate, endDate)-1), DateUtils.addDay(startDate, -1), projects);
-            result.put("cost", cost);
-            result.put("costLink", countLink(cost == null ? BigDecimal.ZERO : cost, lastCost == null ? BigDecimal.ZERO : lastCost));
-            result.put("video", materialReportOverViewMapper.queryMaterialCount(startDate, endDate, projects));
-            result.put("newVideo", materialReportOverViewMapper.queryNewMaterialCount(DateUtils.date2Str(), projects));
-            result.put("hot", 0);
-            result.put("valid", 0);
+            result.put("costTotal", cost);
+            //同比 (本阶段截止昨天消耗-上一个阶段截止和昨天对应日期的消耗)/上一个阶段截止和昨天对应日期的消耗 X 100%
+            result.put("yearOnYearCompare", countLink(cost,lastCost));
+            //昨日消耗
+            BigDecimal yesterdayCost = materialReportOverViewMapper.queryBytedanceCost(endDate, endDate, projects);
+            //前天消耗
+            BigDecimal beforeYesterdayCost = materialReportOverViewMapper.queryBytedanceCost(DateUtils.addDay(endDate, -1), DateUtils.addDay(endDate, -1), projects);
+            result.put("yesterdayCost", yesterdayCost);
+            //环比 (昨日消耗-前日消耗)/前日消耗 X 100%
+            result.put("chainCompare", countLink(yesterdayCost,beforeYesterdayCost));
+            //视频上新
+            List<Map<String, String>> videoList = materialReportOverViewMapper.queryMaterialCountList(startDate+" 00:00:00", endDate+" 23:59:59", projects);
+            //总数
+            long videoTotal = videoList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("videoList",videoList);
+            result.put("videoTotal",videoTotal);
+            //素材使用率 = 有消耗的素材 / 总数 * 100%
+            long videoCost = materialReportOverViewMapper.queryMaterialCostList(startDate+" 00:00:00", endDate+" 23:59:59", projects);
+            result.put("useCompare", Check.isNull(videoCost) ? 0: new BigDecimal(videoCost).divide(new BigDecimal(videoTotal),4, RoundingMode.HALF_UP));
+            //有效视频
+            List<Map<String, String>> effectiveList = materialReportOverViewMapper.selectEffectiveMaterialVideoBytedance(startDate,endDate, projects);
+            //总数
+            long effectiveTotal = effectiveList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("effectiveList",effectiveList);
+            result.put("effectiveTotal",effectiveTotal);
+            //素材有效率 = 有效视频数量 / 视频总数 X 100%
+            result.put("effectiveCompare",Check.isNull(videoCost) ? 0: new BigDecimal(effectiveTotal).divide(new BigDecimal(videoTotal),4, RoundingMode.HALF_UP));
+            //爆款视频
+            List<Map<String, String>> hotList = materialReportOverViewMapper.selectHotMaterialVideoBytedance(startDate,endDate, projects);
+            //总数
+            long hotTotal = hotList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("hotList",hotList);
+            result.put("hotTotal",hotTotal);
+            //上阶段
+            List<Map<String, String>> lastHostList = materialReportOverViewMapper.selectHotMaterialVideoBytedance(DateUtils.addDay(startDate, -DateUtils.dateDiff(startDate, endDate)-1), DateUtils.addDay(startDate, -1), projects);
+            long lastHotTotal = lastHostList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            //同比 (本阶段截止昨天的爆款视频数量-上一个阶段截止和昨天对应日期的爆款视频数量)/上一个阶段截止和昨天对应日期的爆款视频数量X 100%
+            result.put("hotYearOnYearCompare", countLink(new BigDecimal(hotTotal),new BigDecimal(lastHotTotal)));
+            //昨日消耗
+            List<Map<String, String>> yesterdayHost = materialReportOverViewMapper.selectHotMaterialVideoBytedance(endDate,endDate, projects);
+            //前天消耗
+            List<Map<String, String>> beforeYesterdayHost = materialReportOverViewMapper.selectHotMaterialVideoBytedance(DateUtils.addDay(endDate, -1), DateUtils.addDay(endDate, -1), projects);
+            long yesterday = yesterdayHost.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            long before = beforeYesterdayHost.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            //环比 (昨日-前日)/前日消耗 X 100%
+            result.put("hostCompare", countLink(new BigDecimal(yesterday),new BigDecimal(before)));
+
         } else if (mediaId == CtopAdConstant.PLATFORM_TYPE_KUAISHOU_INT) {
+            //总消耗
             BigDecimal cost = materialReportOverViewMapper.queryKuaishouCost(startDate, endDate, projects);
+            //上阶段
             BigDecimal lastCost = materialReportOverViewMapper.queryKuaishouCost(DateUtils.addDay(startDate, -DateUtils.dateDiff(startDate, endDate)-1), DateUtils.addDay(startDate, -1), projects);
-            result.put("cost", cost);
-            result.put("costLink", countLink(cost == null ? BigDecimal.ZERO : cost, lastCost == null ? BigDecimal.ZERO : lastCost));
-            result.put("video", materialReportOverViewMapper.queryMaterialCount(startDate, endDate, projects));
-            result.put("newVideo", materialReportOverViewMapper.queryNewMaterialCount(DateUtils.date2Str(), projects));
-            result.put("hot", 0);
-            result.put("valid", 0);
+            result.put("costTotal", cost);
+            //同比 (本阶段截止昨天消耗-上一个阶段截止和昨天对应日期的消耗)/上一个阶段截止和昨天对应日期的消耗 X 100%
+            result.put("yearOnYearCompare", countLink(cost,lastCost));
+            //昨日消耗
+            BigDecimal yesterdayCost = materialReportOverViewMapper.queryKuaishouCost(endDate, endDate, projects);
+            //前天消耗
+            BigDecimal beforeYesterdayCost = materialReportOverViewMapper.queryKuaishouCost(DateUtils.addDay(endDate, -1), DateUtils.addDay(endDate, -1), projects);
+            result.put("yesterdayCost", yesterdayCost);
+            //环比 (昨日消耗-前日消耗)/前日消耗 X 100%
+            result.put("chainCompare", countLink(yesterdayCost,beforeYesterdayCost));
+
+            //视频上新
+            List<Map<String, String>> videoList = materialReportOverViewMapper.queryMaterialCountList(startDate+" 00:00:00", endDate+" 23:59:59", projects);
+            //总数
+            long videoTotal = videoList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("videoList",videoList);
+            result.put("videoTotal",videoTotal);
+            //素材使用率 = 有消耗的素材 / 总数 * 100%
+            long videoCost = materialReportOverViewMapper.queryMaterialCostListKs(startDate+" 00:00:00", endDate+" 23:59:59", projects);
+
+            result.put("useCompare", Check.isNull(videoCost) ? 0: new BigDecimal(videoCost).divide(new BigDecimal(videoTotal),4, RoundingMode.HALF_UP));
+            //有效视频
+            List<Map<String, String>> effectiveList = materialReportOverViewMapper.selectEffectiveMaterialVideoKs(startDate,endDate, projects);
+            //总数
+            long effectiveTotal = effectiveList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("effectiveList",effectiveList);
+            result.put("effectiveTotal",effectiveTotal);
+            //素材有效率 = 有效视频数量 / 视频总数 X 100%
+            result.put("effectiveCompare",Check.isNull(videoTotal) ? 0 : new BigDecimal(effectiveTotal).divide(new BigDecimal(videoTotal),4, RoundingMode.HALF_UP));
+            //爆款视频
+            List<Map<String, String>> hotList = materialReportOverViewMapper.selectHotMaterialVideoKs(startDate,endDate, projects);
+            //总数
+            long hotTotal = hotList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            result.put("hotList",hotList);
+            result.put("hotTotal",hotTotal);
+            //上阶段
+            List<Map<String, String>> lastHostList = materialReportOverViewMapper.selectHotMaterialVideoKs(DateUtils.addDay(startDate, -DateUtils.dateDiff(startDate, endDate)-1), DateUtils.addDay(startDate, -1), projects);
+            long lastHotTotal = lastHostList.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            //同比 (本阶段截止昨天的爆款视频数量-上一个阶段截止和昨天对应日期的爆款视频数量)/上一个阶段截止和昨天对应日期的爆款视频数量X 100%
+            result.put("hotYearOnYearCompare", countLink(new BigDecimal(hotTotal),new BigDecimal(lastHotTotal)));
+            //昨日消耗
+            List<Map<String, String>> yesterdayHost = materialReportOverViewMapper.selectHotMaterialVideoKs(endDate,endDate, projects);
+            //前天消耗
+            List<Map<String, String>> beforeYesterdayHost = materialReportOverViewMapper.selectHotMaterialVideoKs(DateUtils.addDay(endDate, -1), DateUtils.addDay(endDate, -1), projects);
+            long yesterday = yesterdayHost.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            long before = beforeYesterdayHost.stream().collect(Collectors.summarizingInt(s->Integer.valueOf(String.valueOf(s.get("count"))))).getSum();
+            //环比 (昨日-前日)/前日消耗 X 100%
+            result.put("hostCompare", countLink(new BigDecimal(yesterday),new BigDecimal(before)));
         }
         return result;
     }
@@ -361,7 +449,8 @@ public class MaterialReportOverViewServiceImpl implements IMaterialReportOverVie
 
     //当项目为空的时候,根据当前登录人查询可查看的所有项目集合
     private JSONArray getProjectsByCurrentUser(int mediaId) {
-        String currentUser = ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getId();
+        //String currentUser = ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getId();
+        String currentUser = "e9ca23d68d884d4ebb19d07889727dae";
         //TODO 为了解决管理员等角色初始化查全部项目查询效率慢的问题判断角色,待优化
         String roleCode = roleService.getRoleCodeByUserId(currentUser);
         if (roleCode.equals("admin")) {
@@ -387,11 +476,28 @@ public class MaterialReportOverViewServiceImpl implements IMaterialReportOverVie
 
     //环比计算
     private  BigDecimal countLink(BigDecimal numA, BigDecimal numB) {
-        BigDecimal link = new BigDecimal(0);
+        BigDecimal link = new BigDecimal("0");
         if (numB.compareTo(BigDecimal.ZERO)!=0) {
             link = (numA.subtract(numB)).divide(numB, 4, RoundingMode.HALF_UP);
         }
         return link;
     }
 
+
+    /**
+     * 同比 (当前 - 上阶段 ) / 上阶段
+     * @param current 当前阶段数值
+     * @param last 上阶段数值
+     * @return
+     */
+    private BigDecimal yearOnYearCompare(BigDecimal current,BigDecimal last){
+        BigDecimal yearOnYear = new BigDecimal("0");
+        if (last.compareTo(BigDecimal.ZERO)!=0) {
+            // (当前 - 上阶段 ) / 上阶段
+            yearOnYear = (current.subtract(last)).divide(last,20,BigDecimal.ROUND_HALF_UP);
+        }
+        return yearOnYear;
+    }
+
+
 }