Jelajahi Sumber

添加头条首页

jiequan.bi 5 tahun lalu
induk
melakukan
17a4b79aa4

+ 13 - 0
jeecg-boot-base-common/src/main/java/org/jeecg/common/constant/SystemDateConstant.java

@@ -0,0 +1,13 @@
+package org.jeecg.common.constant;
+
+public class SystemDateConstant {
+
+    //系統年月日时间格式
+    public static String yyyy_MM_dd="yyyy-MM-dd";
+
+    public static String yyyy_MM="yyyy-MM";
+
+    //系统数据起始时间
+    public static String BEGIN_TIME="2019-09-01";
+
+}

+ 15 - 25
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -1,5 +1,7 @@
 package org.jeecg.common.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
 
 import java.beans.PropertyEditorSupport;
@@ -17,6 +19,9 @@ import java.util.*;
  * @Version 1.0
  */
 public class DateUtils extends PropertyEditorSupport {
+
+    private static Logger logger= LoggerFactory.getLogger(DateUtils.class);
+
     /**
      * 以毫秒表示的时间
      */
@@ -236,7 +241,7 @@ public class DateUtils extends PropertyEditorSupport {
         Date dt = new Date();
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String nowTime = df.format(dt);
-        java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime);
+        Timestamp buydate = Timestamp.valueOf(nowTime);
         return buydate;
     }
 
@@ -880,10 +885,15 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
 
-    public static String getMonthBefore(String format, String nowTime, int amount) throws ParseException {
+    public static String getMonthBefore(String format, String nowTime, int amount) {
         // 获取当前时间
         SimpleDateFormat dateFormat = new SimpleDateFormat(format);
-        Date date = dateFormat.parse(nowTime);
+        Date date = null;
+        try {
+            date = dateFormat.parse(nowTime);
+        } catch (ParseException e) {
+            logger.error(e.getMessage(),e);
+        }
 
         //得到日历
         Calendar calendar = Calendar.getInstance();
@@ -1287,28 +1297,8 @@ public class DateUtils extends PropertyEditorSupport {
         return null;
     }
 
-    public static int dateDiff(String start, String end){
-        //设置转换的日期格式
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        //开始时间
-        Date startDate = null;
-        Date endDate = null;
-        try {
-            startDate = sdf.parse(start);
-            endDate = sdf.parse(end);
-        } catch (ParseException e) {
-            e.printStackTrace();
-        }
-
-        //得到相差的天数 betweenDate
-        long betweenDate = (endDate.getTime() - startDate.getTime())/(60*60*24*1000);
-        return (int)betweenDate;
-    }
-
-    public static Date addMonth(Date date){
-        Calendar calendar = Calendar.getInstance();//日历对象
-        calendar.add(Calendar.MONTH, -1);//月份减一
-        return calendar.getTime();
+    public static void main(String[] args) throws ParseException {
+        System.out.println(calDiffMonth(DateUtils.parseDate("2019-04-01","yyyy-MM-dd"),new Date()));
     }
 
 }

+ 60 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceHomepageReportCtrl.java

@@ -0,0 +1,60 @@
+package cn.com.ctop.toutiao.modules.report.controller;
+
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceHomepageReportService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *  Created by JQ.bi on 2020.5.19
+ */
+@Slf4j
+@RestController
+@RequestMapping("/ctop/byteDance/homePage")
+public class BytedanceHomepageReportCtrl {
+
+    @Autowired
+    IBytedanceHomepageReportService bytedanceHomepageReportService;
+
+    @PostMapping("/report/week")
+    public Result<Map<String,JSONObject>> getWeekReport(@RequestBody JSONObject requestBody) {
+        Result<Map<String,JSONObject>> result = new Result<>();
+        try {
+            Map<String, JSONObject> weekReport = bytedanceHomepageReportService.getWeekReport(requestBody);
+            result.setResult(weekReport);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
+    @PostMapping("/report/chart")
+    public Result<List<JSONObject>> getChartReport(@RequestBody JSONObject requestBody) {
+        Result<List<JSONObject>> result = new Result<>();
+        if(requestBody.isEmpty()){
+            log.error("request body is empty");
+            result.setSuccess(false);
+        }
+        try {
+            List<JSONObject> chartReport=bytedanceHomepageReportService.getChartByDate(requestBody);
+            result.setResult(chartReport);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            result.setSuccess(false);
+        }
+
+        return result;
+
+    }
+}

+ 34 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceHomepageMapper.java

@@ -0,0 +1,34 @@
+package cn.com.ctop.toutiao.modules.report.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * Created by JQ.bi on 2020.05.19
+ */
+public interface BytedanceHomepageMapper {
+
+    //今日汇总数据
+    JSONObject queryTodaySumReportBy(@Param("statDate") String statDate);
+
+    //今日明细数据
+    List<JSONObject> queryTodayDetailReportBy(@Param("statDate") String statDate);
+
+    //根据开始、结束时间 查询汇总数据
+    JSONObject querySumByStartEndDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+
+    //根据开始、结束时间 查询明细数据
+     List<JSONObject> queryDetailByStartEndDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+
+    //按月分组查询明细数据
+    List<JSONObject> queryDetailGroupMonthByDate(@Param("startDate") String anotherDay, @Param("endDate") String endDate);
+
+    //查询固定月的明细数据
+    List<JSONObject> queryDetailGroupDayByMonth(@Param("month") String month);
+
+    //项目消耗排行榜
+    List<JSONObject> queryTopCost(@Param("startDate") String anotherDay, @Param("endDate") String endDate, @Param("rank") int rank);
+
+}

+ 147 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceHomepageMapper.xml

@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.report.mapper.BytedanceHomepageMapper">
+
+
+    <select id="queryTodaySumReportBy" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+	     ROUND(sum(cost),2) cost,
+	     sum(show_num) showNum,
+	     sum(stat_datetime) click,
+	     max(stat_hour) maxHour
+       FROM
+	      ctop_bytedance_report_advertiser_hourly
+       WHERE
+	      stat_datetime = #{statDate}
+      </select>
+
+
+    <select id="queryTodayDetailReportBy" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         stat_datetime statDate,
+         stat_hour statHour,
+	     ROUND(sum(cost),2) cost,
+	     sum(show_num) showNum,
+	     sum(click) click
+	   FROM
+	      ctop_bytedance_report_advertiser_hourly
+       WHERE
+	      stat_datetime = #{statDate}
+       GROUP BY
+	      stat_hour
+       ORDER BY
+	      stat_hour ASC
+
+    </select>
+
+    <select id="querySumByStartEndDate" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         ROUND(sum(cost), 2) cost,
+         sum(show_num) showNum,
+         sum(click) click
+       FROM
+         ctop_bytedance_report_advertiser_daily
+       WHERE
+         stat_datetime &lt;= #{startDate}
+       AND
+         stat_datetime &gt;= #{endDate}
+    </select>
+
+    <select id="queryDetailByStartEndDate" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         ROUND(sum(cost), 2) cost,
+         sum(show_num) showNum,
+         sum(click) click,
+         DATE_FORMAT(stat_datetime,'%Y-%m-%d') statDate
+       FROM
+         ctop_bytedance_report_advertiser_daily
+       WHERE
+            stat_datetime &lt;= #{startDate}
+       AND  stat_datetime &gt;= #{endDate}
+       group by stat_datetime
+       order by stat_datetime asc
+    </select>
+
+    <select id="queryDetailGroupMonthByDate" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         ROUND(sum(cost), 2) cost,
+         sum(show_num) showNum,
+         sum(click) click,
+         DATE_FORMAT(stat_datetime,'%Y-%m') statDate
+       FROM
+         ctop_bytedance_report_advertiser_daily
+       WHERE
+         stat_datetime &lt;= #{endDate}
+       AND
+         stat_datetime &gt;= #{startDate}
+      group by DATE_FORMAT(stat_datetime,'%Y-%m')
+      order by stat_datetime asc
+    </select>
+
+    <select id="queryDetailGroupDayByMonth" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         ROUND(sum(cost), 2) cost,
+         sum(show_num) showNum,
+         sum(click) click,
+         DATE_FORMAT(stat_datetime,'%Y-%m-%d') statDate,
+         SUBSTR(DATE_FORMAT(stat_datetime,'%Y-%m-%d') FROM 9 FOR 2) day
+       FROM
+         ctop_bytedance_report_advertiser_daily
+       WHERE
+         stat_datetime like '${month}%'
+      group by DATE_FORMAT(stat_datetime,'%Y-%m-%d')
+      order by stat_datetime asc
+    </select>
+
+    <select id="queryTopCost" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         t2.auth_name as authName,
+         ROUND(sum(t1.cost), 2) cost
+       FROM
+         ctop_bytedance_report_advertiser_daily t1
+       LEFT JOIN
+         ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
+       WHERE
+         stat_datetime &lt;= #{startDate}
+       AND
+         stat_datetime &gt;= #{endDate}
+       GROUP BY t1.advertiser_id
+       ORDER BY sum(t1.cost) DESC
+       limit #{rank}
+    </select>
+
+    <select id="queryTopClick" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         t2.auth_name as authName,
+         ROUND(sum(t1.click), 2) click
+       FROM
+         ctop_bytedance_report_advertiser_daily t1
+       LEFT JOIN
+         ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
+       WHERE
+         stat_datetime &lt;= #{startDate}
+       AND
+         stat_datetime &gt;= #{endDate}
+       GROUP BY t1.advertiser_id
+       ORDER BY sum(t1.click) DESC
+       limit #{rank}
+    </select>
+
+    <select id="queryTopShowNum" resultType="com.alibaba.fastjson.JSONObject">
+       SELECT
+         t2.auth_name as authName,
+         ROUND(sum(t1.show_num), 2) showNum
+       FROM
+         ctop_bytedance_report_advertiser_daily t1
+       LEFT JOIN
+         ctop_user_allocation t2 ON t1.advertiser_id=t2.account_id
+       WHERE
+         stat_datetime &lt;= #{startDate}
+       AND
+         stat_datetime &gt;= #{endDate}
+       GROUP BY t1.advertiser_id
+       ORDER BY sum(t1.show_num) DESC
+       limit #{rank}
+    </select>
+
+</mapper>

+ 15 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceHomepageReportService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.toutiao.modules.report.service;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IBytedanceHomepageReportService {
+
+    Map<String,JSONObject> getWeekReport(JSONObject json);
+
+    List<JSONObject> getChartByDate(JSONObject json);
+
+    JSONObject getTopCostByDate(JSONObject json);
+}

+ 203 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceHomepageReportServiceImpl.java

@@ -0,0 +1,203 @@
+package cn.com.ctop.toutiao.modules.report.service.impl;
+
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceHomepageMapper;
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceHomepageReportService;
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.constant.SystemDateConstant;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by JQ.bi on 2020.05.19
+ */
+@Service
+public class BytedanceHomepageReportServiceImpl implements IBytedanceHomepageReportService {
+
+    @Autowired
+    BytedanceHomepageMapper bytedanceHomepageMapper;
+
+    @Override
+    public Map<String, JSONObject> getWeekReport(JSONObject requestBody) {
+        Map<String, JSONObject> result = new HashMap<>();
+        //当天日期
+        String nowDate = DateUtils.getNowDate(SystemDateConstant.yyyy_MM_dd);
+        //本周汇总数据
+        JSONObject weekSumData = bytedanceHomepageMapper.querySumByStartEndDate(nowDate,
+                DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -7));
+        //上周汇总数据
+        JSONObject weekBeforeSumData = bytedanceHomepageMapper.querySumByStartEndDate(DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -7),
+                DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -14));
+        //一周内每日数据汇总
+        List<JSONObject> weekDetailData = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -7));
+        //一周内cost top数据
+        List<JSONObject> costTop = bytedanceHomepageMapper.queryTopCost(nowDate, DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -7), 7);
+        JSONObject top = new JSONObject();
+        top.put("top7", costTop);
+        JSONObject costWeekData = new JSONObject();
+        JSONObject clickWeekData = new JSONObject();
+        JSONObject showNumWeekData = new JSONObject();
+        weekDetailData.forEach(day -> {
+            costWeekData.put((String) day.get("statDate"), day.get("cost"));
+            clickWeekData.put((String) day.get("statDate"), day.get("click"));
+            showNumWeekData.put((String) day.get("statDate"), day.get("showNum"));
+        });
+        costWeekData.put("weekCostSum", weekSumData.get("cost"));
+        costWeekData.put("weekCostSumLink", countLink(weekSumData.getBigDecimal("cost"), weekBeforeSumData.getBigDecimal("cost")));
+        clickWeekData.put("weekClickSum", weekSumData.get("click"));
+        clickWeekData.put("weekClickSumLink", countLink(BigDecimal.valueOf(weekSumData.getLongValue("click")), BigDecimal.valueOf(weekBeforeSumData.getLong("click"))));
+        showNumWeekData.put("weekCostSum", weekSumData.get("showNum"));
+        showNumWeekData.put("weekShowNumSumLink", countLink(BigDecimal.valueOf(weekSumData.getLongValue("showNum")), BigDecimal.valueOf(weekBeforeSumData.getLong("showNum"))));
+
+        result.put("costWeek", costWeekData);
+        result.put("clickWeek", clickWeekData);
+        result.put("showNumWeek", showNumWeekData);
+        result.put("top", top);
+
+        return result;
+    }
+
+    /**
+     * timeType :1,2,3,4,5,6,7,8,9  前端约束入参类型
+     */
+    @Override
+    public List<JSONObject> getChartByDate(JSONObject requestBody) {
+        int timeType = requestBody.getInteger("type");
+        List<JSONObject> resultBody = new ArrayList<>();
+        if (requestBody.isEmpty()) {
+            return resultBody;
+        }
+        //当天日期
+        String nowDate = DateUtils.getNowDate(SystemDateConstant.yyyy_MM_dd);
+        //startTime 为取什么时间段数据的开始时间,默认昨天
+        String anotherDay = DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, nowDate, -1);
+        switch (timeType) {
+            //今天
+            case 1:
+                resultBody = getCompareGroupByHour(nowDate, anotherDay);
+                break;
+            //昨天
+            case 2:
+                resultBody = bytedanceHomepageMapper.queryTodayDetailReportBy(anotherDay);
+                break;
+            //近一周
+            case 3:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                        DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, anotherDay, -6));
+                break;
+            //近半个月(15天)
+            case 4:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                        DateUtils.getAnotherDay(SystemDateConstant.yyyy_MM_dd, anotherDay, -14));
+                break;
+            //近一个月
+            case 5:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                        DateUtils.getMonthBefore(SystemDateConstant.yyyy_MM_dd, anotherDay, -1));
+                break;
+            //近三个月
+            case 6:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                        DateUtils.getMonthBefore(SystemDateConstant.yyyy_MM_dd, anotherDay, -3));
+                break;
+            //近半年
+            case 7:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(nowDate,
+                        DateUtils.getMonthBefore(SystemDateConstant.yyyy_MM_dd, anotherDay, -6));
+                break;
+            //全部数据
+            case 8:
+                resultBody = bytedanceHomepageMapper.queryDetailGroupMonthByDate(SystemDateConstant.BEGIN_TIME, nowDate);
+                break;
+            //自定义起始时间
+            case 9:
+                resultBody = bytedanceHomepageMapper.queryDetailByStartEndDate(requestBody.getString("startDate"), requestBody.getString("endDate"));
+                break;
+            //对比
+            case 10:
+                resultBody = getChartByType_10(requestBody.getString("sign"), requestBody.getString("smallDate"), requestBody.getString("bigDate"));
+                break;
+            default:
+        }
+        return resultBody;
+    }
+
+    @Override
+    public JSONObject getTopCostByDate(JSONObject requestBody) {
+        return null;
+    }
+
+    //自定义日期对比(日对比,月对比)
+    private List<JSONObject> getChartByType_10(String sign, String smallDate, String bigDate) {
+        List<JSONObject> result = new ArrayList<>();
+        if (!sign.isEmpty() && sign.equals("month")) {
+            result = this.getCompareGroupByDay(smallDate, bigDate);
+        } else if (!sign.isEmpty() && sign.equals("day")) {
+            result = this.getCompareGroupByHour(bigDate, smallDate);
+        }
+        return result;
+    }
+
+    //两个月份的数据对比
+    private List<JSONObject> getCompareGroupByDay(String smallDate, String bigDate) {
+        //大月份数据
+        List<JSONObject> afterDetail = bytedanceHomepageMapper.queryDetailGroupDayByMonth(bigDate);
+        //小月份数据
+        List<JSONObject> beforeDetail = bytedanceHomepageMapper.queryDetailGroupDayByMonth(smallDate);
+        List<JSONObject> beforeData;List<JSONObject> afterData;
+        if (afterDetail.size() >= beforeDetail.size()) {
+            beforeData = afterDetail;
+            afterData = beforeData;
+        } else {
+            beforeData = beforeDetail;
+            afterData = afterDetail;
+        }
+        return this.getCompareDate(beforeData,afterData,"day");
+    }
+
+    //今天昨天数据对比
+    private List<JSONObject> getCompareGroupByHour(String nowDate, String anotherDay) {
+        List<JSONObject> afterDetail = bytedanceHomepageMapper.queryTodayDetailReportBy(nowDate);
+        List<JSONObject> beforeDetail = bytedanceHomepageMapper.queryTodayDetailReportBy(anotherDay);
+        return this.getCompareDate(beforeDetail, afterDetail, "statHour");
+    }
+
+    //数据对比,环比计算
+    private List<JSONObject> getCompareDate(List<JSONObject> beforeData, List<JSONObject> AfterData, String standard) {
+        List<JSONObject> result = new ArrayList<>();
+        beforeData.forEach(before -> {
+            String yesStatHour = String.valueOf(before.get(standard));
+            AfterData.forEach(after -> {
+                if ((String.valueOf(after.get(standard))).equals(yesStatHour)) {
+                    //消耗较昨日环比
+                    after.put("costProportion", countLink(after.getBigDecimal("cost"), before.getBigDecimal("cost")));
+                    //展示量较昨日环比
+                    after.put("showProportion", countLink(BigDecimal.valueOf(after.getLong("showNum")), BigDecimal.valueOf(before.getLong("showNum"))));
+                    //点击量较昨日环比
+                    after.put("photoClickProportion", countLink(BigDecimal.valueOf(after.getLong("click")), BigDecimal.valueOf(before.getLong("click"))));
+                    before.put("afterData", after);
+                }
+            });
+            result.add(before);
+        });
+        return result;
+    }
+
+    //环比计算
+    private BigDecimal countLink(BigDecimal numA, BigDecimal numB) {
+        BigDecimal link = new BigDecimal(0);
+        if (!BigDecimal.ZERO.equals(numB)) {
+            link = (numA.subtract(numB)).divide(numB, 4, RoundingMode.HALF_UP);
+        }
+        return link;
+    }
+
+}