Explorar o código

头条视频报表

hcst_sunzhen %!s(int64=5) %!d(string=hai) anos
pai
achega
06ba1c281a

+ 22 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -1287,8 +1287,28 @@ public class DateUtils extends PropertyEditorSupport {
         return null;
     }
 
-    public static void main(String[] args) throws ParseException {
-        System.out.println(calDiffMonth(DateUtils.parseDate("2019-04-01","yyyy-MM-dd"),new Date()));
+    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();
     }
 
 }

+ 20 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/ColumnDTO.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.toutiao.modules.report.DTO;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+public class ColumnDTO extends PageDTO implements Serializable {
+    private Integer columnType;
+    private String userId;
+    private String json;
+    //private JSONArray json2;
+    //private String jsonStr;
+    private Integer status;
+
+}

+ 17 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/DateDTO.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.toutiao.modules.report.DTO;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+@Data
+public class DateDTO extends PageDTO implements Serializable {
+    private String startDate;
+    private String endDate;
+    private String signature;
+    private String date;
+    private BigDecimal cost;
+    private String[] columns;
+}

+ 12 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/PageDTO.java

@@ -0,0 +1,12 @@
+package cn.com.ctop.toutiao.modules.report.DTO;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+@Data
+public class PageDTO implements Serializable {
+    private  Integer pageNo;
+    private  Integer pageSize;
+}

+ 16 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/DTO/VideoReportDTO.java

@@ -0,0 +1,16 @@
+package cn.com.ctop.toutiao.modules.report.DTO;
+
+import lombok.Data;
+
+/**
+ * 华南视频报表类
+ * @author jeecg-boot
+ * @date   2020-04-28
+ * @version V1.0
+ */
+@Data
+public class VideoReportDTO {
+
+	private String accountId;
+	private String authName;
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1114 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/ByteDanceVideoReportDailyController.java


+ 428 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/entity/ByteDanceVideoReportDaily.java

@@ -0,0 +1,428 @@
+package cn.com.ctop.toutiao.modules.report.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 视频按时间段统计
+ * @author jeecg-boot
+ * @date   2020-05-13
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_video_report_daily")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_bytedance_video_report_daily对象", description="视频按时间段统计")
+public class ByteDanceVideoReportDaily {
+
+	/**id*/
+	@TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "id")
+	private Integer id;
+	/**项目id*/
+	@Excel(name = "项目id", width = 15)
+    @ApiModelProperty(value = "项目id")
+	private Integer projectId;
+	/**项目名称*/
+	@Excel(name = "项目名称", width = 15)
+    @ApiModelProperty(value = "项目名称")
+	private String projectName;
+	/**广告主id*/
+	@Excel(name = "广告主id", width = 15)
+    @ApiModelProperty(value = "广告主id")
+	private String advertiserId;
+	/**广告主名称*/
+	@Excel(name = "广告主名称", width = 15)
+    @ApiModelProperty(value = "广告主名称")
+	private String advertiserName;
+	/**md5*/
+	@Excel(name = "md5", width = 15)
+    @ApiModelProperty(value = "md5")
+	private String signature;
+	/**视频url-头条视频报表提供*/
+	@Excel(name = "视频url-头条视频报表提供", width = 15)
+    @ApiModelProperty(value = "视频url-头条视频报表提供")
+	private String videoUrl;
+	/**公司素材库提供*/
+	@Excel(name = "公司素材库提供", width = 15)
+    @ApiModelProperty(value = "公司素材库提供")
+	private String url;
+	/**环比*/
+	@Excel(name = "环比", width = 15)
+    @ApiModelProperty(value = "环比")
+	private java.math.BigDecimal huanbi;
+	/**素材名称*/
+	@Excel(name = "素材名称", width = 15)
+    @ApiModelProperty(value = "素材名称")
+	private String materialName;
+	/**媒体类型*/
+	@Excel(name = "媒体类型", width = 15)
+    @ApiModelProperty(value = "媒体类型")
+	private Integer appType;
+	/**公司id*/
+	@Excel(name = "公司id", width = 15)
+    @ApiModelProperty(value = "公司id")
+	private String companyId;
+	/**素材id*/
+	@Excel(name = "素材id", width = 15)
+    @ApiModelProperty(value = "素材id")
+	private Integer materialId;
+	/**数据起始时间*/
+	@Excel(name = "数据起始时间", width = 15, format = "yyyy-MM-dd")
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "数据起始时间")
+	private java.util.Date statDatetime;
+	/**点击量*/
+	@Excel(name = "点击量", width = 15)
+    @ApiModelProperty(value = "点击量")
+	private Integer click;
+	/**总花费*/
+	@Excel(name = "总花费", width = 15)
+    @ApiModelProperty(value = "总花费")
+	private java.math.BigDecimal cost;
+	/**应用下载-激活*/
+	@Excel(name = "应用下载-激活", width = 15)
+    @ApiModelProperty(value = "应用下载-激活")
+	private Integer active;
+	/**应用下载-安卓下载完成*/
+	@Excel(name = "应用下载-安卓下载完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载完成")
+	private Integer downloadFinish;
+	/**应用下载-安卓下载开始*/
+	@Excel(name = "应用下载-安卓下载开始", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓下载开始")
+	private Integer downloadStart;
+	/**应用下载-安卓安装完成*/
+	@Excel(name = "应用下载-安卓安装完成", width = 15)
+    @ApiModelProperty(value = "应用下载-安卓安装完成")
+	private Integer installFinish;
+	/**应用下载-注册*/
+	@Excel(name = "应用下载-注册", width = 15)
+    @ApiModelProperty(value = "应用下载-注册")
+	private Integer register;
+	/**应用下载-付费数*/
+	@Excel(name = "应用下载-付费数", width = 15)
+    @ApiModelProperty(value = "应用下载-付费数")
+	private Integer payCount;
+	/**应用下载-到达uv*/
+	@Excel(name = "应用下载-到达uv", width = 15)
+    @ApiModelProperty(value = "应用下载-到达uv")
+	private Integer inAppUv;
+	/**应用下载-详情页到站uv*/
+	@Excel(name = "应用下载-详情页到站uv", width = 15)
+    @ApiModelProperty(value = "应用下载-详情页到站uv")
+	private Integer inAppDetailUv;
+	/**应用下载-加入购物车*/
+	@Excel(name = "应用下载-加入购物车", width = 15)
+    @ApiModelProperty(value = "应用下载-加入购物车")
+	private Integer inAppCart;
+	/**应用下载-提交订单*/
+	@Excel(name = "应用下载-提交订单", width = 15)
+    @ApiModelProperty(value = "应用下载-提交订单")
+	private Integer inAppOrder;
+	/**应用下载-付费*/
+	@Excel(name = "应用下载-付费", width = 15)
+    @ApiModelProperty(value = "应用下载-付费")
+	private Integer inAppPay;
+	/**落地页-电话拨打数*/
+	@Excel(name = "落地页-电话拨打数", width = 15)
+    @ApiModelProperty(value = "落地页-电话拨打数")
+	private Integer phone;
+	/**表单提交数*/
+	@Excel(name = "表单提交数", width = 15)
+    @ApiModelProperty(value = "表单提交数")
+	private Integer form;
+	/**落地页-地图搜索*/
+	@Excel(name = "落地页-地图搜索", width = 15)
+    @ApiModelProperty(value = "落地页-地图搜索")
+	private Integer mapSearch;
+	/**落地页-按钮button*/
+	@Excel(name = "落地页-按钮button", width = 15)
+    @ApiModelProperty(value = "落地页-按钮button")
+	private Integer button;
+	/**落地页-关键页面浏览*/
+	@Excel(name = "落地页-关键页面浏览", width = 15)
+    @ApiModelProperty(value = "落地页-关键页面浏览")
+	private Integer viewMaterial;
+	/**落地页-QQ咨询数*/
+	@Excel(name = "落地页-QQ咨询数", width = 15)
+    @ApiModelProperty(value = "落地页-QQ咨询数")
+	private Integer qq;
+	/**落地页-抽奖数*/
+	@Excel(name = "落地页-抽奖数", width = 15)
+    @ApiModelProperty(value = "落地页-抽奖数")
+	private Integer lottery;
+	/**落地页-投票*/
+	@Excel(name = "落地页-投票", width = 15)
+    @ApiModelProperty(value = "落地页-投票")
+	private Integer vote;
+	/**落地页-页面跳转*/
+	@Excel(name = "落地页-页面跳转", width = 15)
+    @ApiModelProperty(value = "落地页-页面跳转")
+	private Integer redirect;
+	/**落地页-商品购买*/
+	@Excel(name = "落地页-商品购买", width = 15)
+    @ApiModelProperty(value = "落地页-商品购买")
+	private Integer shopping;
+	/**落地页-在线咨询*/
+	@Excel(name = "落地页-在线咨询", width = 15)
+    @ApiModelProperty(value = "落地页-在线咨询")
+	private Integer consult;
+	/**落地页-微信*/
+	@Excel(name = "落地页-微信", width = 15)
+    @ApiModelProperty(value = "落地页-微信")
+	private Integer wechat;
+	/**落地页-智能电话确认拨打*/
+	@Excel(name = "落地页-智能电话确认拨打", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认拨打")
+	private Integer phoneConfirm;
+	/**落地页-智能电话确认接通*/
+	@Excel(name = "落地页-智能电话确认接通", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话确认接通")
+	private Integer phoneConnect;
+	/**落地页-智能电话有效咨询*/
+	@Excel(name = "落地页-智能电话有效咨询", width = 15)
+    @ApiModelProperty(value = "落地页-智能电话有效咨询")
+	private Integer consultEffective;
+	/**视频-总播放*/
+	@Excel(name = "视频-总播放", width = 15)
+    @ApiModelProperty(value = "视频-总播放")
+	private Integer totalPlay;
+	/**视频-有效播放*/
+	@Excel(name = "视频-有效播放", width = 15)
+    @ApiModelProperty(value = "视频-有效播放")
+	private Integer validPlay;
+	/**视频-wifi播放*/
+	@Excel(name = "视频-wifi播放", width = 15)
+    @ApiModelProperty(value = "视频-wifi播放")
+	private Integer wifiPlay;
+	/**视频-播放25%进度播放率*/
+	@Excel(name = "视频-播放25%进度播放率", width = 15)
+	@ApiModelProperty(value = "视频-播放25%进度播放率")
+	private java.math.BigDecimal play25FeedBreakRate;
+	/**视频-播放25%进度总数*/
+	@Excel(name = "视频-播放25%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放25%进度总数")
+	private Integer play25FeedBreak;
+	/**视频-播放50%进度总数*/
+	@Excel(name = "视频-播放50%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放50%进度总数")
+	private Integer play50FeedBreak;
+	/**视频-播放75%进度总数*/
+	@Excel(name = "视频-播放75%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放75%进度总数")
+	private Integer play75FeedBreak;
+	/**视频-播放100%进度总数*/
+	@Excel(name = "视频-播放100%进度总数", width = 15)
+    @ApiModelProperty(value = "视频-播放100%进度总数")
+	private Integer play100FeedBreak;
+	/**附加创意-电话按钮*/
+	@Excel(name = "附加创意-电话按钮", width = 15)
+    @ApiModelProperty(value = "附加创意-电话按钮")
+	private Integer advancedCreativePhoneClick;
+	/**附加创意-在线咨询*/
+	@Excel(name = "附加创意-在线咨询", width = 15)
+    @ApiModelProperty(value = "附加创意-在线咨询")
+	private Integer advancedCreativeCounselClick;
+	/**附加创意-表单提交*/
+	@Excel(name = "附加创意-表单提交", width = 15)
+    @ApiModelProperty(value = "附加创意-表单提交")
+	private Integer advancedCreativeFormClick;
+	/**互动数据-分享数*/
+	@Excel(name = "互动数据-分享数", width = 15)
+    @ApiModelProperty(value = "互动数据-分享数")
+	private Integer shareMaterial;
+	/**互动数据-评论数*/
+	@Excel(name = "互动数据-评论数", width = 15)
+    @ApiModelProperty(value = "互动数据-评论数")
+	private Integer commentMaterial;
+	/**互动数据-新增关注数*/
+	@Excel(name = "互动数据-新增关注数", width = 15)
+    @ApiModelProperty(value = "互动数据-新增关注数")
+	private Integer follow;
+	/**互动数据-主页访问量*/
+	@Excel(name = "互动数据-主页访问量", width = 15)
+    @ApiModelProperty(value = "互动数据-主页访问量")
+	private Integer homeVisited;
+	/**互动数据-挑战赛查看数*/
+	@Excel(name = "互动数据-挑战赛查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-挑战赛查看数")
+	private Integer iesChallengeClick;
+	/**互动数据-音乐查看数*/
+	@Excel(name = "互动数据-音乐查看数", width = 15)
+    @ApiModelProperty(value = "互动数据-音乐查看数")
+	private Integer iesMusicClick;
+	/**次留数*/
+	@Excel(name = "次留数", width = 15)
+    @ApiModelProperty(value = "次留数")
+	private Integer nextDayOpen;
+	/**次留率*/
+	@Excel(name = "次留率", width = 15)
+    @ApiModelProperty(value = "次留率")
+	private java.math.BigDecimal nextDayOpenRate;
+	/**次留成本*/
+	@Excel(name = "次留成本", width = 15)
+    @ApiModelProperty(value = "次留成本")
+	private java.math.BigDecimal nextDayOpenCost;
+	/**activePayAmount*/
+	@Excel(name = "activePayAmount", width = 15)
+    @ApiModelProperty(value = "activePayAmount")
+	private Integer activePayAmount;
+	/**视频数据-有效播放成本*/
+	@Excel(name = "视频数据-有效播放成本", width = 15)
+    @ApiModelProperty(value = "视频数据-有效播放成本")
+	private java.math.BigDecimal validPlayCost;
+	/**附加创意-附加创意卡券领取*/
+	@Excel(name = "附加创意-附加创意卡券领取", width = 15)
+    @ApiModelProperty(value = "附加创意-附加创意卡券领取")
+	private Integer advancedCreativeCouponAddition;
+	/**convertMaterial*/
+	@Excel(name = "convertMaterial", width = 15)
+    @ApiModelProperty(value = "convertMaterial")
+	private Integer convertMaterial;
+	/**应用下载广告数据-付费成本*/
+	@Excel(name = "应用下载广告数据-付费成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-付费成本")
+	private java.math.BigDecimal activePayCost;
+	/**落地页转化数据-下载开始*/
+	@Excel(name = "落地页转化数据-下载开始", width = 15)
+    @ApiModelProperty(value = "落地页转化数据-下载开始")
+	private Integer download;
+	/**cpc*/
+	@Excel(name = "cpc", width = 15)
+    @ApiModelProperty(value = "cpc")
+	private java.math.BigDecimal cpc;
+	/**互动数据-POI点击数*/
+	@Excel(name = "互动数据-POI点击数", width = 15)
+    @ApiModelProperty(value = "互动数据-POI点击数")
+	private Integer locationClick;
+	/**	视频数据-播完率*/
+	@Excel(name = "	视频数据-播完率", width = 15)
+    @ApiModelProperty(value = "	视频数据-播完率")
+	private java.math.BigDecimal playOverRate;
+	/**展现数据-点击率*/
+	@Excel(name = "展现数据-点击率", width = 15)
+    @ApiModelProperty(value = "展现数据-点击率")
+	private java.math.BigDecimal ctr;
+	/**cpm*/
+	@Excel(name = "cpm", width = 15)
+    @ApiModelProperty(value = "cpm")
+	private java.math.BigDecimal cpm;
+	/**视频数据-WiFi播放占比*/
+	@Excel(name = "视频数据-WiFi播放占比", width = 15)
+    @ApiModelProperty(value = "视频数据-WiFi播放占比")
+	private java.math.BigDecimal wifiPlayRate;
+	/**互动数据-点赞数*/
+	@Excel(name = "互动数据-点赞数", width = 15)
+    @ApiModelProperty(value = "互动数据-点赞数")
+	private Integer likeMaterial;
+	/**应用下载广告数据-激活成本*/
+	@Excel(name = "应用下载广告数据-激活成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-激活成本")
+	private java.math.BigDecimal activeCost;
+	/**应用下载广告数据-关键行为成本*/
+	@Excel(name = "应用下载广告数据-关键行为成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-关键行为成本")
+	private java.math.BigDecimal gameAddictionCost;
+	/**应用下载广告数据-关键行为数*/
+	@Excel(name = "应用下载广告数据-关键行为数", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-关键行为数")
+	private Integer gameAddiction;
+	/**应用下载广告数据-激活率*/
+	@Excel(name = "应用下载广告数据-激活率", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-激活率")
+	private java.math.BigDecimal activeRate;
+	/**	应用下载广告数据-关键行为率*/
+	@Excel(name = "	应用下载广告数据-关键行为率", width = 15)
+    @ApiModelProperty(value = "	应用下载广告数据-关键行为率")
+	private java.math.BigDecimal gameAddictionRate;
+	/**应用下载广告数据-注册率*/
+	@Excel(name = "应用下载广告数据-注册率", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-注册率")
+	private java.math.BigDecimal activeRegisterRate;
+	/**应用下载广告数据-安卓下载完成成本*/
+	@Excel(name = "应用下载广告数据-安卓下载完成成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓下载完成成本")
+	private java.math.BigDecimal downloadFinishCost;
+	/**应用下载广告数据-注册成本*/
+	@Excel(name = "应用下载广告数据-注册成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-注册成本")
+	private java.math.BigDecimal activeRegisterCost;
+	/**showMaterial*/
+	@Excel(name = "showMaterial", width = 15)
+    @ApiModelProperty(value = "showMaterial")
+	private Integer showMaterial;
+	/**转化数据-转化率*/
+	@Excel(name = "转化数据-转化率", width = 15)
+    @ApiModelProperty(value = "转化数据-转化率")
+	private java.math.BigDecimal convertRate;
+	/**应用下载广告数据-安卓下载完成率*/
+	@Excel(name = "应用下载广告数据-安卓下载完成率", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓下载完成率")
+	private java.math.BigDecimal downloadFinishRate;
+	/**应用下载广告数据-安卓安装完成率*/
+	@Excel(name = "应用下载广告数据-安卓安装完成率", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓安装完成率")
+	private java.math.BigDecimal installFinishRate;
+	/**	落地页转化数据-建站卡券领取*/
+	@Excel(name = "	落地页转化数据-建站卡券领取", width = 15)
+    @ApiModelProperty(value = "	落地页转化数据-建站卡券领取")
+	private Integer coupon;
+	/**落地页转化数据-卡券页领取*/
+	@Excel(name = "落地页转化数据-卡券页领取", width = 15)
+    @ApiModelProperty(value = "落地页转化数据-卡券页领取")
+	private Integer couponSinglePage;
+	/**playOver*/
+	@Excel(name = "playOver", width = 15)
+    @ApiModelProperty(value = "playOver")
+	private Integer playOver;
+	/**应用下载广告数据-安卓下载开始成本*/
+	@Excel(name = "应用下载广告数据-安卓下载开始成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓下载开始成本")
+	private java.math.BigDecimal downloadStartCost;
+	/**落地页转化数据-短信咨询*/
+	@Excel(name = "落地页转化数据-短信咨询", width = 15)
+    @ApiModelProperty(value = "落地页转化数据-短信咨询")
+	private Integer message;
+	/**视频数据-有效播放率*/
+	@Excel(name = "视频数据-有效播放率", width = 15)
+    @ApiModelProperty(value = "视频数据-有效播放率")
+	private java.math.BigDecimal validPlayRate;
+	/**视频数据-平均单次播放时长*/
+	@Excel(name = "视频数据-平均单次播放时长", width = 15)
+    @ApiModelProperty(value = "视频数据-平均单次播放时长")
+	private java.math.BigDecimal averagePlayTimePerPlay;
+	/**转化数据-转化成本*/
+	@Excel(name = "转化数据-转化成本", width = 15)
+    @ApiModelProperty(value = "转化数据-转化成本")
+	private java.math.BigDecimal convertCost;
+	/**应用下载广告数据-安卓安装完成成本*/
+	@Excel(name = "应用下载广告数据-安卓安装完成成本", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓安装完成成本")
+	private java.math.BigDecimal installFinishCost;
+	/**应用下载广告数据-安卓下载开始率*/
+	@Excel(name = "应用下载广告数据-安卓下载开始率", width = 15)
+    @ApiModelProperty(value = "应用下载广告数据-安卓下载开始率")
+	private java.math.BigDecimal downloadStartRate;
+	/**createTime*/
+    @ApiModelProperty(value = "createTime")
+	private java.util.Date createTime;
+	/**updateTime*/
+    @ApiModelProperty(value = "updateTime")
+	private java.util.Date updateTime;
+
+	@TableField(exist = false)
+    private Integer clickMaterial;
+}

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

@@ -0,0 +1,41 @@
+package cn.com.ctop.toutiao.modules.report.mapper;
+
+import cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 视频按时间段统计
+ * @author: jeecg-boot
+ * @date:   2020-05-13
+ * @cersion: V1.0
+ */
+public interface ByteDanceVideoReportDailyMapper extends BaseMapper<ByteDanceVideoReportDaily> {
+
+    List<ByteDanceVideoReportDaily> videoInfoList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("companyId") String companyId);
+
+    BigDecimal getVideoReportDailyByDateAndSignature(@Param("startDate") String date, @Param("endDate") String endDate, @Param("signature") String signature, @Param("companyId") String companyId);
+
+    void updateHuanbiByDateAndSignature(@Param("date") Date date, @Param("signature") String signature, @Param("huanbi") BigDecimal huanbi);
+
+    List<ByteDanceVideoReportDaily> videoInfoListWeek(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("role") String role, @Param("userId") String userId, @Param("signature") String signature, @Param("companyId") String companyId, @Param("cost") BigDecimal cost);
+
+    String getRoleCodeByUserId(@Param("userId") String userId);
+
+    String getCompanyIdByUserId(@Param("userId") String userId);
+
+    String getJsonByUserIdAndColumnType(@Param("columnType") Integer columnType, @Param("userId") String userId);
+
+    void insertColumnLoad(@Param("json") String json, @Param("userId") String userId, @Param("columnType") Integer columnType);
+
+    void updateJsonByUserIdAndType(@Param("json") String json, @Param("userId") String userId, @Param("columnType") Integer columnType);
+
+    List<ByteDanceVideoReportDaily> videoInfoListDetail(@Param("companyId") String companyId, @Param("startDate") String startDate, @Param("endDate") String endDate, @Param("signature") String signature);
+
+    List<ByteDanceVideoReportDaily> bytedanceVideoInfoList(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("role") String role, @Param("userId") String userId, @Param("signature") String signature, @Param("companyId") String companyId, @Param("cost") BigDecimal cost);
+
+}

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

@@ -0,0 +1,721 @@
+<?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.ByteDanceVideoReportDailyMapper">
+
+    <select id="videoInfoList" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
+        select
+       --  a.material_id as materialId,
+        --         a.account_id as accountId,
+        --         b.auth_name as authName,
+        b.project_id as projectId,
+        b.project_name as projectName,
+        b.advertiser_id as advertiserId,
+        b.advertiser_name as advertiserName,
+        a.stat_datetime as statDatetime,
+        sum(a.cost) as cost,  -- 消耗
+        d.signature as signature,
+        d.video_url as videoUrl,
+        e.url as url,
+        e.material_name as materialName,
+        1 as appType,
+        sum(a.click) as click,   -- 点击数
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play25_feed_break)/sum(a.total_play)
+        else 0 end as play25FeedBreakRate,  -- 25%进度播放率
+
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play_over)/sum(a.total_play)
+        else 0 end as playOverRate,  -- 整体完播率
+
+        case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate,  -- 转化率  转化数/点击数*100% !
+        sum(a.active) as active, -- 应用下载-激活
+        sum(a.download_finish) as downloadFinish, -- 应用下载-安卓下载完成
+        sum(a.download_start) as downloadStart, -- 应用下载-安卓下载开始
+        sum(a.install_finish) as installFinish, -- 应用下载-安卓安装完成
+        sum(a.register) as register, -- 应用下载-注册
+        sum(a.pay_count) as payCount, -- 应用下载-付费数
+        sum(a.in_app_uv) as inAppUv, -- 应用下载-到达uv
+        sum(a.in_app_detail_uv) as inAppDetailUv, -- 应用下载-详情页到站uv
+        sum(a.in_app_cart) as inAppCart, -- 应用下载-加入购物车
+        sum(a.in_app_order) as inAppOrder, -- 应用下载-提交订单
+        sum(a.in_app_pay) as inAppPay, -- 应用下载-付费
+        sum(a.phone) as phone, -- 落地页-电话拨打数
+        sum(a.form) as form, --  表单提交数
+        sum(a.map_search) as mapSearch, -- 落地页-地图搜索
+        sum(a.button) as button, -- 落地页-按钮button
+        sum(a.view_material) as viewMaterial, -- 落地页-关键页面浏览
+        sum(a.qq) as qq, -- 落地页-QQ咨询数
+        sum(a.lottery) as lottery, -- 落地页-抽奖数
+        sum(a.vote) as vote, -- 落地页-投票
+        sum(a.redirect) as redirect, -- 落地页-页面跳转
+        sum(a.shopping) as shopping, -- 落地页-商品购买
+        sum(a.consult) as consult, -- 落地页-在线咨询
+        sum(a.wechat) as wechat, -- 落地页-微信
+        sum(a.phone_confirm) as phoneConfirm, -- 落地页-智能电话确认拨打
+        sum(a.phone_connect) as phoneConnect, -- 落地页-智能电话确认接通
+        sum(a.consult_effective) as consultEffective, -- 落地页-智能电话有效咨询
+        sum(a.total_play) as totalPlay, -- 视频-总播放
+        sum(a.valid_play) as validPlay, -- 视频-有效播放
+        sum(a.wifi_play) as wifiPlay, -- 视频-wifi播放
+        <!-- sum(a.play_duration_sum) as play_duration_sum, --> -- 视频-播放时长,单位ms
+        sum(a.play25_feed_break) as play25FeedBreak, -- 视频-播放25%进度总数
+        sum(a.play50_feed_break) as play50FeedBreak, -- 视频-播放50%进度总数
+        sum(a.play75_feed_break) as play75FeedBreak, -- 视频-播放75%进度总数
+        sum(a.play100_feed_break) as play100FeedBreak, -- 视频-播放100%进度总数
+        sum(a.advanced_creative_phone_click) as advancedCreativePhoneClick, -- 附加创意-电话按钮
+        sum(a.advanced_creative_counsel_click) as advancedCreativeCounselClick, -- 附加创意-在线咨询
+        sum(a.advanced_creative_form_click) as advancedCreativeFormClick, -- 附加创意-表单提交
+        sum(a.share_material) as shareMaterial, -- 互动数据-分享数
+        sum(a.comment_material) as commentMaterial, -- 互动数据-评论数
+        sum(a.follow) as follow, -- 互动数据-新增关注数
+        sum(a.home_visited) as homeVisited, -- 互动数据-主页访问量
+        sum(a.ies_challenge_click) as iesChallengeClick, -- 互动数据-挑战赛查看数
+        sum(a.ies_music_click) as iesMusicClick, -- 互动数据-音乐查看数
+        sum(a.next_day_open) as nextDayOpen, -- 次留数
+        case
+        when sum(a.active) != 0
+        then sum(a.next_day_open)/sum(a.active)
+        else 0 end as nextDayOpenRate, -- 次留率 = 次留数/激活数
+
+        case
+        when sum(a.next_day_open) != 0
+        then sum(a.cost)/sum(a.next_day_open)
+        else 0 end as nextDayOpenCost, -- 次留成本 = 消耗/次留数
+
+        sum(a.active_pay_amount) as activePayAmount, -- 应用下载广告数据-付费次数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.valid_play)
+        else 0 end validPlayCost, -- 视频数据-有效播放成本  计算公式:总花费/有效播放数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.advanced_creative_coupon_addition) as advancedCreativeCouponAddition, -- 附加创意-附加创意卡券领取
+        sum(a.convert_material) as convertMaterial, -- 转化数据-转化数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.active_pay_amount)
+        else 0 end as activePayCost, -- 应用下载广告数据-付费成本 = 消耗/付费次数
+        sum(a.download) as download, -- 落地页转化数据-下载开始
+        <!--sum(a.cpa) as cpa, -->--
+        AVG(a.cpc) as cpc, -- 平均点击单价
+        sum(a.location_click) as locationClick, -- 互动数据-POI点击数
+        --  sum(a.play_over_rate) as playOverRate, -- 视频数据-播完率
+
+        case
+        when sum(a.show_material) != 0
+        then sum(a.click)/sum(a.show_material)
+        else 0 end as ctr, -- 展现数据-点击率   广告被点击的次数占展示次数的百分比。计算方法:点击数/展示数*100%
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.show_material)*1000
+        else 0 end cpm, -- 平均千次展现费用  广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000。
+        sum(a.wifi_play_rate) as wifiPlayRate, -- 视频数据-WiFi播放占比
+        sum(a.like_material) as likeMaterial, -- 互动数据-点赞数
+        <!--  sum(a.active_pay_rate) as activePayRate,--> -- 应用下载广告数据-付费率
+
+        case
+        when sum(a.active) != 0
+        then sum(a.cost)/sum(a.active)
+        else 0 end activeCost, -- 应用下载广告数据-激活成本  计算方式:总花费/激活数。
+
+        case
+        when sum(a.game_addiction) != 0
+        then sum(a.cost)/sum(a.game_addiction)
+        else 0 end as gameAddictionCost, -- 应用下载广告数据-关键行为成本  广告主为每个有APP内关键行为的用户所付出的成本,计算公式是总花费/关键行为数。当天数据可能会有波动,次日早8点后稳定。
+        sum(a.game_addiction) as gameAddiction, -- 应用下载广告数据-关键行为数
+
+        case
+        when sum(a.active) != 0
+        then sum(a.active)/sum(a.click)
+        else 0 end as activeRate, -- 应用下载广告数据-激活率   计算方式:激活数/点击数*100%
+        <!-- sum(a.play_duration_10s) as playDuration10s,--> --
+        <!-- sum(a.phone_effective) as phone_effective,--> --
+
+        case
+        when sum(a.active) != 0
+        then sum(a.game_addiction)/sum(a.active)
+        else 0 end gameAddictionRate, -- 应用下载广告数据-关键行为率  关键行为用户占激活用户的比例
+
+        case
+        when sum(a.active) != 0
+        then sum(a.register)/sum(a.active)
+        else 0 end as activeRegisterRate, -- 应用下载广告数据-注册率   注册用户占激活用户的比例
+        <!-- sum(a.average_video_play) as averageVideoPlay,--> --
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.cost)/sum(a.download_finish)
+        else 0 end as downloadFinishCost, -- 应用下载广告数据-安卓下载完成成本 计算方式:总花费/安卓下载完成数。
+        <!--sum(a.play_duration_3s) as playDuration3s,--> --
+
+        case
+        when sum(a.register) != 0
+        then sum(a.cost)/sum(a.register)
+        else 0 end as activeRegisterCost, -- 应用下载广告数据-注册成本  总花费/注册数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.show_material) as showMaterial, -- 展现数据-展示数
+
+        <!--  case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate,  转化数据-转化率  计算方式:转化数/点击数*100%  -->
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.download_finish)/sum(a.download_start)
+        else 0 end as downloadFinishRate, -- 应用下载广告数据-安卓下载完成率  计算方式:安卓下载完成数/安卓下载开始数
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.install_finish)/sum(a.download_finish)
+        else 0 end as installFinishRate, -- 应用下载广告数据-安卓安装完成率  计算方式:安卓安装完成数/安卓下载完成数
+        sum(a.coupon) as coupon, -- 落地页转化数据-建站卡券领取
+        sum(a.coupon_single_page) as couponSinglePage, -- 落地页转化数据-卡券页领取
+        sum(a.play_over) as playOver, -- 完播数
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.cost)/sum(a.download_start)
+        else 0 end as downloadStartCost, -- 应用下载广告数据-安卓下载开始成本  计算方法:总花费/安卓下载开始数。
+        sum(a.message) as message, -- 落地页转化数据-短信咨询  用户点击短信咨询的次数
+        <!-- sum(a.play_duration) as playDuration, --> --
+
+        case
+        when sum(a.valid_play) != 0
+        then sum(a.valid_play)/sum(a.show_material)
+        else 0 end as validPlayRate, -- 视频数据-有效播放率  有效播放数/展示数
+        AVG(a.average_play_time_per_play) as averagePlayTimePerPlay, -- 视频数据-平均单次播放时长
+
+        case
+        when sum(a.convert_material) != 0
+        then sum(a.cost)/sum(a.convert_material)
+        else 0 end as convertCost, --  转化数据-转化成本=总花费/转化数
+        <!--  sum(a.convert_show_rate) as convert_show_rate, --> --
+
+        case
+        when sum(a.install_finish) != 0
+        then sum(a.cost)/sum(a.install_finish)
+        else 0 end as installFinishCost, --  应用下载广告数据-安卓安装完成成本  计算方式:总花费/安卓安装完成数
+
+        case
+        when sum(a.click) != 0
+        then sum(a.download_start)/sum(a.click)
+        else 0 end as downloadStartRate, --  应用下载广告数据-安卓下载开始率  计算方法:安卓下载开始数/点击数
+
+        #{companyId} as companyId
+        from ctop_bytedance_report_material_daily a
+        left join ctop_user_allocation b on a.account_id = b.account_id
+        left join user_company c on b.user_id = c.user_id
+        left join ctop_bytedance_video_info d on a.material_id = d.material_id
+        left join (select code,url,material_name from ctop_material_info group by code) e on d.signature = e.code
+        where c.company_id = #{companyId}      -- '6608ed13c0dd42de93c790dbdf124234'
+        and a.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO',
+        'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+        and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
+        and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        group by `statDatetime`,`signature`
+        order by `statDatetime`,`projectId`,`signature`
+    </select>
+
+    <select id="getVideoReportDailyByDateAndSignature" resultType="java.math.BigDecimal">
+        select
+        sum(cost)
+        from
+        ctop_bytedance_video_report_daily
+        where
+        stat_datetime &gt;= #{startDate} and
+        stat_datetime &lt;= #{endDate} and
+        company_id = #{companyId} and
+        signature = #{signature}
+    </select>
+
+    <update id="updateHuanbiByDateAndSignature">
+        update
+        ctop_bytedance_video_report_daily
+        set huanbi = #{huanbi}
+        where
+        stat_datetime = #{date}
+        and signature = #{signature}
+    </update>
+
+    <select id="videoInfoListWeek" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
+        select
+        --  a.material_id as materialId,
+        --         a.account_id as accountId,
+        --         b.auth_name as authName,
+        a.project_id as projectId,
+        a.project_name as projectName,
+        a.advertiser_id as advertiserId,
+        a.advertiser_name as advertiserName,
+        a.stat_datetime as statDatetime,
+        sum(a.cost) as cost,  -- 消耗
+        a.signature as signature,
+        a.video_url as videoUrl,
+        e.url as url,
+        case when e.material_name is null
+        then '-'
+        else e.material_name end as materialName,
+        1 as appType,
+        sum(a.click) as clickMaterial,   -- 点击数
+
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play25_feed_break)/sum(a.total_play)
+        else 0 end as play25FeedBreakRate,  -- 25%进度播放率
+
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play_over)/sum(a.total_play)
+        else 0 end as playOverRate,  -- 整体完播率
+
+        case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate,  -- 转化率  转化数/点击数*100% !
+        sum(a.active) as active, -- 应用下载-激活
+        sum(a.download_finish) as downloadFinish, -- 应用下载-安卓下载完成
+        sum(a.download_start) as downloadStart, -- 应用下载-安卓下载开始
+        sum(a.install_finish) as installFinish, -- 应用下载-安卓安装完成
+        sum(a.register) as register, -- 应用下载-注册
+        sum(a.pay_count) as payCount, -- 应用下载-付费数
+        sum(a.in_app_uv) as inAppUv, -- 应用下载-到达uv
+        sum(a.in_app_detail_uv) as inAppDetailUv, -- 应用下载-详情页到站uv
+        sum(a.in_app_cart) as inAppCart, -- 应用下载-加入购物车
+        sum(a.in_app_order) as inAppOrder, -- 应用下载-提交订单
+        sum(a.in_app_pay) as inAppPay, -- 应用下载-付费
+        sum(a.phone) as phone, -- 落地页-电话拨打数
+        sum(a.form) as form, --  表单提交数
+        sum(a.map_search) as mapSearch, -- 落地页-地图搜索
+        sum(a.button) as button, -- 落地页-按钮button
+        sum(a.view_material) as viewMaterial, -- 落地页-关键页面浏览
+        sum(a.qq) as qq, -- 落地页-QQ咨询数
+        sum(a.lottery) as lottery, -- 落地页-抽奖数
+        sum(a.vote) as vote, -- 落地页-投票
+        sum(a.redirect) as redirect, -- 落地页-页面跳转
+        sum(a.shopping) as shopping, -- 落地页-商品购买
+        sum(a.consult) as consult, -- 落地页-在线咨询
+        sum(a.wechat) as wechat, -- 落地页-微信
+        sum(a.phone_confirm) as phoneConfirm, -- 落地页-智能电话确认拨打
+        sum(a.phone_connect) as phoneConnect, -- 落地页-智能电话确认接通
+        sum(a.consult_effective) as consultEffective, -- 落地页-智能电话有效咨询
+        sum(a.total_play) as totalPlay, -- 视频-总播放
+        sum(a.valid_play) as validPlay, -- 视频-有效播放
+        sum(a.wifi_play) as wifiPlay, -- 视频-wifi播放
+        <!-- sum(a.play_duration_sum) as play_duration_sum, --> -- 视频-播放时长,单位ms
+        sum(a.play25_feed_break) as play25FeedBreak, -- 视频-播放25%进度总数
+        sum(a.play50_feed_break) as play50FeedBreak, -- 视频-播放50%进度总数
+        sum(a.play75_feed_break) as play75FeedBreak, -- 视频-播放75%进度总数
+        sum(a.play100_feed_break) as play100FeedBreak, -- 视频-播放100%进度总数
+        sum(a.advanced_creative_phone_click) as advancedCreativePhoneClick, -- 附加创意-电话按钮
+        sum(a.advanced_creative_counsel_click) as vancedCreativeCounselClick, -- 附加创意-在线咨询
+        sum(a.advanced_creative_form_click) as advancedCreativeFormClick, -- 附加创意-表单提交
+        sum(a.share_material) as shareMaterial, -- 互动数据-分享数
+        sum(a.comment_material) as commentMaterial, -- 互动数据-评论数
+        sum(a.follow) as follow, -- 互动数据-新增关注数
+        sum(a.home_visited) as homeVisited, -- 互动数据-主页访问量
+        sum(a.ies_challenge_click) as iesChallengeClick, -- 互动数据-挑战赛查看数
+        sum(a.ies_music_click) as iesMusicClick, -- 互动数据-音乐查看数
+        sum(a.next_day_open) as nextDayOpen, -- 次留数
+        case
+        when sum(a.active) != 0
+        then sum(a.next_day_open)/sum(a.active)
+        else 0 end as nextDayOpenRate, -- 次留率 = 次留数/激活数
+
+        case
+        when sum(a.next_day_open) != 0
+        then sum(a.cost)/sum(a.next_day_open)
+        else 0 end as nextDayOpenCost, -- 次留成本 = 消耗/次留数
+
+        sum(a.active_pay_amount) as activePayAmount, -- 应用下载广告数据-付费次数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.valid_play)
+        else 0 end validPlayCost, -- 视频数据-有效播放成本  计算公式:总花费/有效播放数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.advanced_creative_coupon_addition) as advancedCreativeCouponAddition, -- 附加创意-附加创意卡券领取
+        sum(a.convert_material) as convertMaterial, -- 转化数据-转化数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.active_pay_amount)
+        else 0 end as activePayCost, -- 应用下载广告数据-付费成本 = 消耗/付费次数
+        sum(a.download) as download, -- 落地页转化数据-下载开始
+        <!--sum(a.cpa) as cpa, -->--
+        AVG(a.cpc) as cpc, -- 平均点击单价
+        sum(a.location_click) as locationClick, -- 互动数据-POI点击数
+        sum(a.play_over_rate) as playOverRate, -- 视频数据-播完率
+
+        case
+        when sum(a.show_material) != 0
+        then sum(a.click)/sum(a.show_material)
+        else 0 end as ctr, -- 展现数据-点击率   广告被点击的次数占展示次数的百分比。计算方法:点击数/展示数*100%
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.show_material)*1000
+        else 0 end cpm, -- 平均千次展现费用  广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000。
+        sum(a.wifi_play_rate) as wifiPlayRate, -- 视频数据-WiFi播放占比
+        sum(a.like_material) as likeMaterial, -- 互动数据-点赞数
+        <!--  sum(a.active_pay_rate) as activePayRate,--> -- 应用下载广告数据-付费率
+
+        case
+        when sum(a.active) != 0
+        then sum(a.cost)/sum(a.active)
+        else 0 end activeCost, -- 应用下载广告数据-激活成本  计算方式:总花费/激活数。
+
+        case
+        when sum(a.game_addiction) != 0
+        then sum(a.cost)/sum(a.game_addiction)
+        else 0 end as gameAddictionCost, -- 应用下载广告数据-关键行为成本  广告主为每个有APP内关键行为的用户所付出的成本,计算公式是总花费/关键行为数。当天数据可能会有波动,次日早8点后稳定。
+        sum(a.game_addiction) as gameAddiction, -- 应用下载广告数据-关键行为数
+
+        case
+        when sum(a.active) != 0
+        then sum(a.active)/sum(a.click)
+        else 0 end as activeRate, -- 应用下载广告数据-激活率   计算方式:激活数/点击数*100%
+        <!-- sum(a.play_duration_10s) as playDuration10s,--> --
+        <!-- sum(a.phone_effective) as phone_effective,--> --
+
+        case
+        when sum(a.active) != 0
+        then sum(a.game_addiction)/sum(a.active)
+        else 0 end gameAddictionRate, -- 应用下载广告数据-关键行为率  关键行为用户占激活用户的比例
+
+        case
+        when sum(a.active) != 0
+        then sum(a.register)/sum(a.active)
+        else 0 end as activeRegisterRate, -- 应用下载广告数据-注册率   注册用户占激活用户的比例
+        <!-- sum(a.average_video_play) as averageVideoPlay,--> --
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.cost)/sum(a.download_finish)
+        else 0 end as downloadFinishCost, -- 应用下载广告数据-安卓下载完成成本 计算方式:总花费/安卓下载完成数。
+        <!--sum(a.play_duration_3s) as playDuration3s,--> --
+
+        case
+        when sum(a.register) != 0
+        then sum(a.cost)/sum(a.register)
+        else 0 end as activeRegisterCost, -- 应用下载广告数据-注册成本  总花费/注册数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.show_material) as showMaterial, -- 展现数据-展示数
+
+        <!--  case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate,  转化数据-转化率  计算方式:转化数/点击数*100%  -->
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.download_finish)/sum(a.download_start)
+        else 0 end as downloadFinishRate, -- 应用下载广告数据-安卓下载完成率  计算方式:安卓下载完成数/安卓下载开始数
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.install_finish)/sum(a.download_finish)
+        else 0 end as installFinishRate, -- 应用下载广告数据-安卓安装完成率  计算方式:安卓安装完成数/安卓下载完成数
+        sum(a.coupon) as coupon, -- 落地页转化数据-建站卡券领取
+        sum(a.coupon_single_page) as couponSinglePage, -- 落地页转化数据-卡券页领取
+        sum(a.play_over) as playOver, -- 完播数
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.cost)/sum(a.download_start)
+        else 0 end as downloadStartCost, -- 应用下载广告数据-安卓下载开始成本  计算方法:总花费/安卓下载开始数。
+        sum(a.message) as message, -- 落地页转化数据-短信咨询  用户点击短信咨询的次数
+        <!-- sum(a.play_duration) as playDuration, --> --
+
+        case
+        when sum(a.valid_play) != 0
+        then sum(a.valid_play)/sum(a.show_material)
+        else 0 end as validPlayRate, -- 视频数据-有效播放率  有效播放数/展示数
+        AVG(a.average_play_time_per_play) as averagePlayTimePerPlay, -- 视频数据-平均单次播放时长
+
+        case
+        when sum(a.convert_material) != 0
+        then sum(a.cost)/sum(a.convert_material)
+        else 0 end as convertCost, --  转化数据-转化成本=总花费/转化数
+        <!--  sum(a.convert_show_rate) as convert_show_rate, --> --
+
+        case
+        when sum(a.install_finish) != 0
+        then sum(a.cost)/sum(a.install_finish)
+        else 0 end as installFinishCost, --  应用下载广告数据-安卓安装完成成本  计算方式:总花费/安卓安装完成数
+
+        case
+        when sum(a.click) != 0
+        then sum(a.download_start)/sum(a.click)
+        else 0 end as downloadStartRate --  应用下载广告数据-安卓下载开始率  计算方法:安卓下载开始数/点击数
+        from ctop_bytedance_video_report_daily a
+
+        left join (select id,code,url,material_name from ctop_material_info group by code) e on a.signature = e.code
+        left join ctop_material_ascription f on e.id = f.material_id
+        where a.company_id = #{companyId}
+        and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
+        and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        and e.code is not null
+        <choose>   <!-- 编导、剪辑、拍摄、平面只能查看自己本职工作制作的视频,设计组长和管理员能查看所有的-->
+            <when test="role == 'plan'">
+                and f.plan = #{userId}
+            </when>
+            <when test="role == 'clip'">
+                and f.clip = #{userId}
+            </when>
+            <when test="role == 'shot' ">
+                and f.shot = #{userId}
+            </when>
+            <when test="role == 'plane'  or role == 'planeLeader' ">
+                and f.plan = #{userId}
+            </when>
+            <when test="role == 'admin' or role == 'designTeamLeader'">
+                and 1=1
+            </when>
+            <otherwise>
+                and a.id = 0
+            </otherwise>
+        </choose>
+
+        <if test="signature != null and signature != '' ">
+            and e.code = #{signature}
+        </if>
+
+        <if test="cost != null">
+            and cost &gt;= #{cost}
+        </if>
+
+          group by signature
+          order by projectId,signature
+    </select>
+
+    <select id="getRoleCodeByUserId" resultType="string">
+        select
+        role_code
+        from
+        sys_user_role a
+        left join sys_role b on a.role_id = b.id
+        where a.user_id = #{userId}
+    </select>
+
+    <select id="getCompanyIdByUserId" resultType="string">
+            select
+            company_id
+        from
+        user_company
+        where user_id = #{userId}
+    </select>
+
+    <select id="getJsonByUserIdAndColumnType" resultType="string">
+        select
+        json as json
+        from
+        ctop_column_load
+        where
+        column_type = #{columnType}
+        and user_id = #{userId}
+    </select>
+
+    <insert id="insertColumnLoad">
+        insert into
+        ctop_column_load
+        (
+        user_id,
+        json,
+        column_type,
+        status
+        )
+        values
+        (
+        #{userId},
+        #{json},
+        #{columnType},
+        1
+        )
+    </insert>
+
+    <update id="updateJsonByUserIdAndType">
+        update
+        ctop_column_load
+        set
+        json = #{json}
+        where
+        user_id = #{userId}
+        and
+        column_type = #{columnType}
+    </update>
+
+    <select id="videoInfoListDetail" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
+                select
+                --  a.project_id as projectId,
+                --  a.project_name as projectName,
+                a.advertiser_id as advertiserId,
+                a.advertiser_name as advertiserName,
+                a.stat_datetime as statDatetime,
+                a.cost as cost,  -- 消耗
+                -- a.signature as signature,
+                a.video_url as videoUrl,
+                e.url as url,
+                huanbi as huanbi
+        from ctop_bytedance_video_report_daily a
+        left join (select id,code,url,material_name from ctop_material_info group by code) e on a.signature = e.code
+        left join ctop_material_ascription f on e.id = f.material_id
+        where a.company_id = #{companyId}
+        and e.code = #{signature}
+        and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
+        and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        order by stat_datetime desc
+    </select>
+
+    <select id="bytedanceVideoInfoList" resultType="cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily">
+                    select
+                    a.project_id as projectId,
+                    a.project_name as projectName,
+                    a.advertiser_id as advertiserId,
+                    a.advertiser_name as advertiserName,
+                    a.stat_datetime as statDatetime,
+                    a.cost as cost,  -- 消耗
+                    a.signature as signature,
+                    e.url as url,
+                    case when e.material_name is null
+                    then '-'
+                    else e.material_name end as materialName,
+                    1 as appType,
+                    a.click as clickMaterial,   -- 点击数
+                    a.play25_feed_break_rate as play25FeedBreakRate,  -- 25%进度播放率
+                    a.play_over_rate as playOverRate,  -- 整体完播率
+                    a.convert_rate as convertRate,  -- 转化率  转化数/点击数*100% !
+                    a.active as active, -- 应用下载-激活
+                    a.download_finish as downloadFinish, -- 应用下载-安卓下载完成
+                    a.download_start as downloadStart, -- 应用下载-安卓下载开始
+                    a.install_finish as installFinish, -- 应用下载-安卓安装完成
+                    a.register as register, -- 应用下载-注册
+                    a.pay_count as payCount, -- 应用下载-付费数
+                    a.in_app_uv as inAppUv, -- 应用下载-到达uv
+                    a.in_app_detail_uv as inAppDetailUv, -- 应用下载-详情页到站uv
+                    a.in_app_cart as inAppCart, -- 应用下载-加入购物车
+                    a.in_app_order as inAppOrder, -- 应用下载-提交订单
+                    a.in_app_pay as inAppPay, -- 应用下载-付费
+                    a.phone as phone, -- 落地页-电话拨打数
+                    a.form as form, --  表单提交数
+                    a.map_search as mapSearch, -- 落地页-地图搜索
+                    a.button as button, -- 落地页-按钮button
+                    a.view_material as viewMaterial, -- 落地页-关键页面浏览
+                    a.qq as qq, -- 落地页-QQ咨询数
+                    a.lottery as lottery, -- 落地页-抽奖数
+                    a.vote as vote, -- 落地页-投票
+                    a.redirect as redirect, -- 落地页-页面跳转
+                    a.shopping as shopping, -- 落地页-商品购买
+                    a.consult as consult, -- 落地页-在线咨询
+                    a.wechat as wechat, -- 落地页-微信
+                    a.phone_confirm as phoneConfirm, -- 落地页-智能电话确认拨打
+                    a.phone_connect as phoneConnect, -- 落地页-智能电话确认接通
+                    a.consult_effective as consultEffective, -- 落地页-智能电话有效咨询
+                    a.total_play as totalPlay, -- 视频-总播放
+                    a.valid_play as validPlay, -- 视频-有效播放
+                    a.wifi_play as wifiPlay, -- 视频-wifi播放
+                    a.play25_feed_break as play25FeedBreak, -- 视频-播放25%进度总数
+                    a.play50_feed_break as play50FeedBreak, -- 视频-播放50%进度总数
+                    a.play75_feed_break as play75FeedBreak, -- 视频-播放75%进度总数
+                    a.play100_feed_break as play100FeedBreak, -- 视频-播放100%进度总数
+                    a.advanced_creative_phone_click as advancedCreativePhoneClick, -- 附加创意-电话按钮
+                    a.advanced_creative_counsel_click as advancedCreativeCounselClick, -- 附加创意-在线咨询
+                    a.advanced_creative_form_click as advancedCreativeFormClick, -- 附加创意-表单提交
+                    a.share_material as shareMaterial, -- 互动数据-分享数
+                    a.comment_material as commentMaterial, -- 互动数据-评论数
+                    a.follow as follow, -- 互动数据-新增关注数
+                    a.home_visited as homeVisited, -- 互动数据-主页访问量
+                    a.ies_challenge_click as iesChallengeClick, -- 互动数据-挑战赛查看数
+                    a.ies_music_click as iesMusicClick, -- 互动数据-音乐查看数
+                    a.next_day_open as nextDayOpen, -- 次留数
+                    a.next_day_open_rate as nextDayOpenRate, -- 次留率 = 次留数/激活数
+                    a.next_day_open_cost as nextDayOpenCost, -- 次留成本 = 消耗/次留数
+                    a.active_pay_amount as activePayAmount, -- 应用下载广告数据-付费次数
+                    a.valid_play_cost as  validPlayCost, -- 视频数据-有效播放成本  计算公式:总花费/有效播放数,当天数据可能会有波动,次日早8点后稳定。
+                    a.advanced_creative_coupon_addition as advancedCreativeCouponAddition, -- 附加创意-附加创意卡券领取
+                    a.convert_material as convertMaterial, -- 转化数据-转化数
+                    a.active_pay_cost as activePayCost, -- 应用下载广告数据-付费成本 = 消耗/付费次数
+                    a.download as download, -- 落地页转化数据-下载开始
+                    a.cpc as cpc, -- 平均点击单价
+                    a.location_click as locationClick, -- 互动数据-POI点击数
+                    a.play_over_rate as playOverRate, -- 视频数据-播完率
+                    a.ctr as ctr, -- 展现数据-点击率   广告被点击的次数占展示次数的百分比。计算方法:点击数/展示数*100%
+                    a.cpm as  cpm, -- 平均千次展现费用  广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000。
+                    a.wifi_play_rate as wifiPlayRate, -- 视频数据-WiFi播放占比
+                    a.like_material as likeMaterial, -- 互动数据-点赞数
+                    a.active_cost as activeCost, -- 应用下载广告数据-激活成本  计算方式:总花费/激活数。
+                    a.game_addiction_cost as gameAddictionCost, -- 应用下载广告数据-关键行为成本  广告主为每个有APP内关键行为的用户所付出的成本,计算公式是总花费/关键行为数。当天数据可能会有波动,次日早8点后稳定。
+                    a.game_addiction as gameAddiction, -- 应用下载广告数据-关键行为数
+                    a.active_rate as activeRate, -- 应用下载广告数据-激活率   计算方式:激活数/点击数*100%
+                    a.game_addiction_rate as gameAddictionRate, -- 应用下载广告数据-关键行为率  关键行为用户占激活用户的比例
+                    a.active_register_rate as activeRegisterRate, -- 应用下载广告数据-注册率   注册用户占激活用户的比例
+                    a.download_finish_cost as downloadFinishCost, -- 应用下载广告数据-安卓下载完成成本 计算方式:总花费/安卓下载完成数。
+                    a.active_register_cost as activeRegisterCost, -- 应用下载广告数据-注册成本  总花费/注册数,当天数据可能会有波动,次日早8点后稳定。
+                    a.show_material as showMaterial, -- 展现数据-展示数
+                    a.download_finish_rate as downloadFinishRate, -- 应用下载广告数据-安卓下载完成率  计算方式:安卓下载完成数/安卓下载开始数
+                    a.install_finish_rate as installFinishRate, -- 应用下载广告数据-安卓安装完成率  计算方式:安卓安装完成数/安卓下载完成数
+                    a.coupon as coupon, -- 落地页转化数据-建站卡券领取
+                    a.coupon_single_page as couponSinglePage, -- 落地页转化数据-卡券页领取
+                    a.play_over as playOver, -- 完播数
+                    a.download_start_cost as downloadStartCost, -- 应用下载广告数据-安卓下载开始成本  计算方法:总花费/安卓下载开始数。
+                    a.message as message, -- 落地页转化数据-短信咨询  用户点击短信咨询的次数
+                    a.valid_play_rate as validPlayRate, -- 视频数据-有效播放率  有效播放数/展示数
+                    a.average_play_time_per_play as averagePlayTimePerPlay, -- 视频数据-平均单次播放时长
+                    a.convert_cost as convertCost, --  转化数据-转化成本=总花费/转化数
+                    a.install_finish_cost as installFinishCost, --  应用下载广告数据-安卓安装完成成本  计算方式:总花费/安卓安装完成数
+                    a.download_start_rate as downloadStartRate --  应用下载广告数据-安卓下载开始率  计算方法:安卓下载开始数/点击数
+        from ctop_bytedance_video_report_daily a
+        left join (select id,code,url,material_name from ctop_material_info group by code) e on a.signature = e.code
+        left join ctop_material_ascription f on e.id = f.material_id
+        where a.company_id = #{companyId}
+        and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
+        and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        and e.code is not null
+        <!--<if test="role == 'plan'">
+            and f.plan = #{userId}
+        </if>
+        <if test="role == 'clip'">
+            and f.clip = #{userId}
+        </if>
+        <if test="role == 'shot' ">
+            and f.shot = #{userId}
+        </if>
+        <if test="role == 'plane' ">
+            and f.plane = #{userId}
+        </if>
+        <if test="role == 'admin' or role == 'designTeamLeader'">
+            and 1=1
+        </if>-->
+
+        <choose>   <!-- 编导、剪辑、拍摄、平面只能查看自己本职工作制作的视频,设计组长和管理员能查看所有的-->
+            <when test="role == 'plan'">
+                and f.plan = #{userId}
+            </when>
+            <when test="role == 'clip'">
+                and f.clip = #{userId}
+            </when>
+            <when test="role == 'shot' ">
+                and f.shot = #{userId}
+            </when>
+            <when test="role == 'plane'  or role == 'planeLeader' ">
+                and f.plan = #{userId}
+            </when>
+            <when test="role == 'admin' or role == 'designTeamLeader'">
+                and 1=1
+            </when>
+            <otherwise>
+                and a.id = 0
+            </otherwise>
+        </choose>
+
+        <if test="signature != null and signature != '' ">
+            and e.code = #{signature}
+        </if>
+        <if test="cost != null">
+            and cost &gt;= #{cost}
+        </if>
+    </select>
+
+</mapper>

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

@@ -0,0 +1,36 @@
+package cn.com.ctop.toutiao.modules.report.service;
+
+import cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 视频按时间段统计
+ * @author jeecg-boot
+ * @date   2020-05-13
+ * @version V1.0
+ */
+public interface IByteDanceVideoReportDailyService extends IService<ByteDanceVideoReportDaily> {
+
+    void videoInfoList(String startDate, String endDate);
+
+    List<ByteDanceVideoReportDaily> videoInfoListWeek(String startDate, String endDate, String signature, BigDecimal cost);
+
+    List<ByteDanceVideoReportDaily> videoInfoListTotal(String startDate, String endDate, String signature, BigDecimal cost);
+
+    List<ByteDanceVideoReportDaily> videoInfoListMonth(String startDate, String endDate, String signature, BigDecimal cost);
+
+    List<ByteDanceVideoReportDaily> videoInfoListDetail(String startDate, String endDate, String signature);
+
+    String getColumnJson(Integer columnType);
+
+    void saveOrUpdateColumnJson(Integer columnType, String json);
+
+    //excel导出权限
+    int videoInfoListTotalExportExcelPermission();
+
+    List<ByteDanceVideoReportDaily> videoInfoListDaily(String startDate, String endDate, String signature, BigDecimal cost);
+
+}

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

@@ -0,0 +1,198 @@
+package cn.com.ctop.toutiao.modules.report.service.impl;
+
+import cn.com.ctop.toutiao.modules.report.entity.ByteDanceVideoReportDaily;
+import cn.com.ctop.toutiao.modules.report.mapper.ByteDanceVideoReportDailyMapper;
+import cn.com.ctop.toutiao.modules.report.service.IByteDanceVideoReportDailyService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * 视频按时间段统计
+ * @author jeecg-boot
+ * @date   2020-05-13
+ * @version V1.0
+ */
+@Service
+public class ByteDanceVideoReportDailyServiceImpl extends ServiceImpl<ByteDanceVideoReportDailyMapper, ByteDanceVideoReportDaily> implements IByteDanceVideoReportDailyService {
+
+    @Autowired
+    private ByteDanceVideoReportDailyMapper byteDanceVideoReportDailyMapper;
+
+    public void videoInfoList(String startDate, String endDate){
+        //华南
+        videoInfoListByCompanyId(startDate, endDate, "6608ed13c0dd42de93c790dbdf124234");
+        //华北
+        videoInfoListByCompanyId(startDate, endDate, "d57fecdcf7a94d009736d9c850731582");
+        //华东
+        videoInfoListByCompanyId(startDate, endDate, "4b10089775c040119e139087517aed88");
+    }
+
+    private void videoInfoListByCompanyId(String startDate, String endDate, String companyId){
+        QueryWrapper<ByteDanceVideoReportDaily> wrapper = new QueryWrapper<>();
+        wrapper.ge("stat_datetime",startDate);
+        wrapper.le("stat_datetime",endDate);
+        wrapper.eq("company_id", companyId);
+        byteDanceVideoReportDailyMapper.delete(wrapper);
+
+        List<ByteDanceVideoReportDaily> mList = byteDanceVideoReportDailyMapper.videoInfoList(startDate, endDate, companyId);
+        //for (ByteDanceVideoReportDaily m:mList){
+        //    byteDanceVideoReportDailyMapper.insert(m);
+        //}
+        //
+        //QueryWrapper<ByteDanceVideoReportDaily> queryWrapper = new QueryWrapper<>();
+        //
+        //List<ByteDanceVideoReportDaily> mList2 = byteDanceVideoReportDailyMapper.selectList(queryWrapper);
+
+        for(ByteDanceVideoReportDaily m:mList){
+            String statDate  = DateUtils.formatDate(DateUtils.addDay(m.getStatDatetime(),-1));
+            BigDecimal cost = byteDanceVideoReportDailyMapper.getVideoReportDailyByDateAndSignature(statDate,statDate,m.getSignature(),companyId);
+
+            BigDecimal huanbi =BigDecimal.ZERO;
+            if(cost != null && cost.compareTo(BigDecimal.ZERO)>0){
+                huanbi = m.getCost().subtract(cost).divide(cost,7, BigDecimal.ROUND_HALF_UP);
+            }
+
+            m.setHuanbi(huanbi);
+            byteDanceVideoReportDailyMapper.insert(m);
+        }
+    }
+
+    //视频按天列表
+    public List<ByteDanceVideoReportDaily> videoInfoListDaily(String startDate, String endDate, String signature, BigDecimal cost){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+        String companyId = byteDanceVideoReportDailyMapper.getCompanyIdByUserId(userId);
+
+        List<ByteDanceVideoReportDaily> mList = byteDanceVideoReportDailyMapper.videoInfoListWeek(startDate, endDate, roleCode, userId, signature, companyId, cost);
+
+        return mList;
+    }
+
+
+    //视频报表月列表
+    public List<ByteDanceVideoReportDaily> videoInfoListMonth(String startDate, String endDate, String signature, BigDecimal cost){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+        String companyId = byteDanceVideoReportDailyMapper.getCompanyIdByUserId(userId);
+
+        List<ByteDanceVideoReportDaily> mList = byteDanceVideoReportDailyMapper.videoInfoListWeek(startDate, endDate, roleCode, userId, signature, companyId, cost);
+
+        //计算环比
+        for(ByteDanceVideoReportDaily m:mList){
+            String startMonthDate = null;
+            String endMonthDate = null;
+            try {
+                startMonthDate = DateUtils.addMonth( DateUtils.formatDate(DateUtils.addDay(m.getStatDatetime(),1)) , -1);
+                endMonthDate = DateUtils.formatDate(DateUtils.addDay(m.getStatDatetime(),-1));
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+
+            BigDecimal costBefore = byteDanceVideoReportDailyMapper.getVideoReportDailyByDateAndSignature(startMonthDate,endMonthDate,m.getSignature(),companyId);
+
+            BigDecimal huanbi =BigDecimal.ZERO;
+            if(costBefore != null && costBefore.compareTo(BigDecimal.ZERO)>0){
+                huanbi = m.getCost().subtract(costBefore).divide(costBefore,7, BigDecimal.ROUND_HALF_UP);
+            }
+
+            m.setHuanbi(huanbi);
+        }
+
+        return mList;
+    }
+
+
+    //视频总报表列表
+    public List<ByteDanceVideoReportDaily> videoInfoListTotal(String startDate, String endDate, String signature, BigDecimal cost){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+        String companyId = byteDanceVideoReportDailyMapper.getCompanyIdByUserId(userId);
+
+        List<ByteDanceVideoReportDaily> mList = byteDanceVideoReportDailyMapper.videoInfoListWeek(startDate, endDate, roleCode, userId, signature, companyId, cost);
+
+        return mList;
+    }
+
+    //视频报表月列表
+    public List<ByteDanceVideoReportDaily> videoInfoListWeek(String startDate, String endDate, String signature, BigDecimal cost){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+        String companyId = byteDanceVideoReportDailyMapper.getCompanyIdByUserId(userId);
+
+        //QueryWrapper<ByteDanceVideoReportDaily> wrapper = new QueryWrapper<>();
+        //wrapper.eq("stat_datetime",startDate);
+        //byteDanceVideoReportDailyMapper.delete(wrapper);
+
+        List<ByteDanceVideoReportDaily> mList = byteDanceVideoReportDailyMapper.videoInfoListWeek(startDate, endDate, roleCode, userId, signature, companyId, cost);
+
+        //计算环比
+        for(ByteDanceVideoReportDaily m:mList){
+            String startWeekDate  = DateUtils.formatDate(DateUtils.addDay(DateUtils.getDate(startDate),-1));
+            String endWeekDate = DateUtils.formatDate(DateUtils.addDay(startDate,-7));
+            BigDecimal costBefore = byteDanceVideoReportDailyMapper.getVideoReportDailyByDateAndSignature(startWeekDate,endWeekDate,m.getSignature(),companyId);
+
+            BigDecimal huanbi =BigDecimal.ZERO;
+            if(costBefore != null && costBefore.compareTo(BigDecimal.ZERO)>0){
+                huanbi = m.getCost().subtract(costBefore).divide(costBefore,7, BigDecimal.ROUND_HALF_UP);
+            }
+
+            m.setHuanbi(huanbi);
+        }
+
+        return mList;
+    }
+
+    public List<ByteDanceVideoReportDaily> videoInfoListDetail(String startDate, String endDate, String signature){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        //String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+        String companyId = byteDanceVideoReportDailyMapper.getCompanyIdByUserId(userId);
+
+        return byteDanceVideoReportDailyMapper.videoInfoListDetail(companyId, startDate, endDate, signature);
+    }
+
+    public String getColumnJson(Integer columnType){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        return byteDanceVideoReportDailyMapper.getJsonByUserIdAndColumnType(columnType, userId);
+    }
+
+    public void saveOrUpdateColumnJson(Integer columnType, String json){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+
+        String jsonObject = byteDanceVideoReportDailyMapper.getJsonByUserIdAndColumnType(columnType, userId);
+        if(jsonObject == null){
+            byteDanceVideoReportDailyMapper.insertColumnLoad(json,userId, columnType);
+        }else{
+            byteDanceVideoReportDailyMapper.updateJsonByUserIdAndType(json,userId,columnType);
+        }
+    }
+
+    public int videoInfoListTotalExportExcelPermission(){
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String userId = sysUser.getId();
+        String roleCode = byteDanceVideoReportDailyMapper.getRoleCodeByUserId(userId);
+
+        if(roleCode.equals("admin")  || roleCode.equals("designTeamLeader") ){
+            return 1;
+        }else{
+            return 0;
+        }
+    }
+
+
+}

+ 219 - 0
performance-appraisal/src/main/java/cn/com/ctop/huananvideoreport/mapper/xml/HuananVideoReportMapper.xml

@@ -83,4 +83,223 @@
         order by `statDatetime`,`projectId`,`materialId`
     </select>
 
+    <select id="videoInfoList" resultType="cn.com.ctop.huananvideoreport.entity.HuananVideoReport">
+        select
+        a.material_id as materialId,
+        --         a.account_id as accountId,
+        --         b.auth_name as authName,
+        b.project_id as projectId,
+        b.project_name as projectName,
+        b.advertiser_id as advertiserId,
+        b.advertiser_name as advertiserName,
+        a.stat_datetime as statDatetime,
+        sum(a.cost) as cost,  -- 消耗
+        d.signature as signature,
+        d.video_url as videoUrl,
+        e.url as url,
+        e.material_name as materialName,
+        1 as appType,
+        sum(a.click) as click,   -- 点击数
+
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play25_feed_break)/sum(a.total_play)
+        else 0 end as play25FeedBreakRate,  -- 25%进度播放率
+
+        case
+        when sum(a.total_play) != 0
+        then sum(a.play_over)/sum(a.total_play)
+        else 0 end as playOverRate,  -- 整体完播率
+
+        case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate,  -- 转化率  转化数/点击数*100% !
+        sum(a.active) as active, -- 应用下载-激活
+        sum(a.download_finish) as downloadFinish, -- 应用下载-安卓下载完成
+        sum(a.download_start) as downloadStart, -- 应用下载-安卓下载开始
+        sum(a.install_finish) as installFinish, -- 应用下载-安卓安装完成
+        sum(a.register) as register, -- 应用下载-注册
+        sum(a.pay_count) as payCount, -- 应用下载-付费数
+        sum(a.in_app_uv) as inAppUv, -- 应用下载-到达uv
+        sum(a.in_app_detail_uv) as inAppDetailUv, -- 应用下载-详情页到站uv
+        sum(a.in_app_cart) as inAppCart, -- 应用下载-加入购物车
+        sum(a.in_app_order) as inAppOrder, -- 应用下载-提交订单
+        sum(a.in_app_pay) as inAppPay, -- 应用下载-付费
+        sum(a.phone) as phone, -- 落地页-电话拨打数
+        sum(a.form) as form, --  表单提交数
+        sum(a.map_search) as mapSearch, --落地页-地图搜索
+        sum(a.button) as button, --落地页-按钮button
+        sum(a.view_material) as viewMaterial, --落地页-关键页面浏览
+        sum(a.qq) as qq, --落地页-QQ咨询数
+        sum(a.lottery) as lottery, --落地页-抽奖数
+        sum(a.vote) as vote, --落地页-投票
+        sum(a.redirect) as redirect, --落地页-页面跳转
+        sum(a.shopping) as shopping, --落地页-商品购买
+        sum(a.consult) as consult, --落地页-在线咨询
+        sum(a.wechat) as wechat, --落地页-微信
+        sum(a.phone_confirm) as phoneConfirm, --落地页-智能电话确认拨打
+        sum(a.phone_connect) as phoneConnect, --落地页-智能电话确认接通
+        sum(a.consult_effective) as consultEffective, --落地页-智能电话有效咨询
+        sum(a.total_play) as totalPlay, --视频-总播放
+        sum(a.valid_play) as validPlay, --视频-有效播放
+        sum(a.wifi_play) as wifiPlay, --视频-wifi播放
+        <!-- sum(a.play_duration_sum) as play_duration_sum, --> --视频-播放时长,单位ms
+        sum(a.play25_feed_break) as play25FeedBreak, --视频-播放25%进度总数
+        sum(a.play50_feed_break) as play50FeedBreak, --视频-播放50%进度总数
+        sum(a.play75_feed_break) as play75FeedBreak, --视频-播放75%进度总数
+        sum(a.play100_feed_break) as play100FeedBreak, --视频-播放100%进度总数
+        sum(a.advanced_creative_phone_click) as advancedCreativePhoneClick, --附加创意-电话按钮
+        sum(a.vanced_creative_counsel_click) as vancedCreativeCounselClick, --附加创意-在线咨询
+        sum(a.advanced_creative_form_click) as advancedCreativeFormClick, --附加创意-表单提交
+        sum(a.share_material) as shareMaterial, --互动数据-分享数
+        sum(a.comment_material) as commentMaterial, --互动数据-评论数
+        sum(a.follow) as follow, --互动数据-新增关注数
+        sum(a.home_visited) as homeVisited, --互动数据-主页访问量
+        sum(a.ies_challenge_click) as iesChallengeClick, --互动数据-挑战赛查看数
+        sum(a.ies_music_click) as iesMusicClick, --互动数据-音乐查看数
+        sum(a.next_day_open) as nextDayOpen, --次留数
+        case
+        when sum(a.active) != 0
+        then sum(a.next_day_open)/sum(a.active)
+        else 0 end as nextDayOpenRate, --次留率 = 次留数/激活数
+
+        case
+        when sum(a.next_day_open) != 0
+        then sum(a.cost)/sum(a.next_day_open)
+        else 0 end as nextDayOpenCost, --次留成本 = 消耗/次留数
+
+        sum(a.active_pay_amount) as activePayAmount, -- 应用下载广告数据-付费次数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.valid_play)
+        else 0 end validPlayCost, --视频数据-有效播放成本  计算公式:总花费/有效播放数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.advanced_creative_coupon_addition) as advancedCreativeCouponAddition, --附加创意-附加创意卡券领取
+        sum(a.convert_material) as convertMaterial, --转化数据-转化数
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.active_pay_amount)
+        else 0 end as activePayCost, --应用下载广告数据-付费成本 = 消耗/付费次数
+        sum(a.download) as download, --落地页转化数据-下载开始
+        <!--sum(a.cpa) as cpa, -->--
+        sum(a.cpc) as cpc, --平均点击单价
+        sum(a.location_click) as locationClick, --互动数据-POI点击数
+        sum(a.play_over_rate) as playOverRate, --视频数据-播完率
+
+        case
+        when sum(a.show_material) != 0
+        then sum(a.click)/sum(a.show_material)
+        else 0 end as ctr, --展现数据-点击率   广告被点击的次数占展示次数的百分比。计算方法:点击数/展示数*100%
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.show_material)*1000
+        else 0 end cpm, --平均千次展现费用  广告平均每一千次展现所付出的费用,计算公式是:总花费/展示数*1000。
+        sum(a.wifi_play_rate) as wifiPlayRate, --视频数据-WiFi播放占比
+        sum(a.like_material) as likeMaterial, --互动数据-点赞数
+        <!--  sum(a.active_pay_rate) as activePayRate,--> --应用下载广告数据-付费率
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.active)
+        else 0 end activeCost, --应用下载广告数据-激活成本  计算方式:总花费/激活数。
+
+        case
+        when sum(a.cost) != 0
+        then sum(a.cost)/sum(a.game_addiction)
+        else 0 end as gameAddictionCost, --应用下载广告数据-关键行为成本  广告主为每个有APP内关键行为的用户所付出的成本,计算公式是总花费/关键行为数。当天数据可能会有波动,次日早8点后稳定。
+        sum(a.game_addiction) as gameAddiction, --应用下载广告数据-关键行为数
+
+        case
+        when sum(a.active) != 0
+        then sum(a.active)/sum(a.click)
+        else 0 end as activeRate, --应用下载广告数据-激活率   计算方式:激活数/点击数*100%
+        <!-- sum(a.play_duration_10s) as playDuration10s,--> --
+        <!-- sum(a.phone_effective) as phone_effective,--> --
+
+        case
+        when sum(a.active) != 0
+        then sum(a.game_addiction)/sum(a.active)
+        else 0 end gameAddictionRate, --应用下载广告数据-关键行为率  关键行为用户占激活用户的比例
+
+        case
+        when sum(a.active) != 0
+        then sum(a.register)/sum(a.active)
+        else 0 end as activeRegisterRate, --应用下载广告数据-注册率   注册用户占激活用户的比例
+        <!-- sum(a.average_video_play) as averageVideoPlay,--> --
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.cost)/sum(a.download_finish)
+        else 0 end as downloadFinishCost, --应用下载广告数据-安卓下载完成成本 计算方式:总花费/安卓下载完成数。
+        <!--sum(a.play_duration_3s) as playDuration3s,--> --
+
+        case
+        when sum(a.register) != 0
+        then sum(a.cost)/sum(a.register)
+        else 0 end as activeRegisterCost, --应用下载广告数据-注册成本  总花费/注册数,当天数据可能会有波动,次日早8点后稳定。
+        sum(a.show_material) as showMaterial, --展现数据-展示数
+
+        case
+        when sum(a.click) != 0
+        then sum(a.convert_material)/sum(a.click)
+        else 0 end as convertRate, --转化数据-转化率  计算方式:转化数/点击数*100%
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.download_finish)/sum(a.download_start)
+        else 0 end as downloadFinishRate, --应用下载广告数据-安卓下载完成率  计算方式:安卓下载完成数/安卓下载开始数
+
+        case
+        when sum(a.download_finish) != 0
+        then sum(a.install_finish)/sum(a.download_finish)
+        else 0 end as installFinishRate, --应用下载广告数据-安卓安装完成率  计算方式:安卓安装完成数/安卓下载完成数
+        sum(a.coupon) as coupon, --落地页转化数据-建站卡券领取
+        sum(a.coupon_single_page) as couponSinglePage, --落地页转化数据-卡券页领取
+        sum(a.play_over) as playOver, -- 完播数
+
+        case
+        when sum(a.download_start) != 0
+        then sum(a.cost)/sum(a.download_start)
+        else 0 end as downloadStartCost, --应用下载广告数据-安卓下载开始成本  计算方法:总花费/安卓下载开始数。
+        sum(a.message) as message, --落地页转化数据-短信咨询  用户点击短信咨询的次数
+        <!-- sum(a.play_duration) as playDuration, --> --
+
+        case
+        when sum(a.valid_play) != 0
+        then sum(a.valid_play)/sum(a.show_material)
+        else 0 end as validPlayRate, --视频数据-有效播放率  有效播放数/展示数
+        sum(a.average_play_time_per_play) as averagePlayTimePerPlay, --视频数据-平均单次播放时长
+
+        case
+        when sum(a.convert_material) != 0
+        then sum(a.cost)/sum(a.convert_material)
+        else 0 end as convertCost, --转化数据-转化成本=总花费/转化数
+        <!--  sum(a.convert_show_rate) as convert_show_rate, --> --
+
+        case
+        when sum(a.install_finish) != 0
+        then sum(a.cost)/sum(a.install_finish)
+        else 0 end as installFinishCost, --应用下载广告数据-安卓安装完成成本  计算方式:总花费/安卓安装完成数
+
+        case
+        when sum(a.click) != 0
+        then sum(a.download_start)/sum(a.click)
+        else 0 end as downloadStartRate, --应用下载广告数据-安卓下载开始率  计算方法:安卓下载开始数/点击数
+        from ctop_bytedance_report_material_daily a
+        left join ctop_user_allocation b on a.account_id = b.account_id
+        left join user_company c on b.user_id = c.user_id
+        left join ctop_bytedance_video_info d on a.material_id = d.material_id
+        left join (select code,url,material_name from ctop_material_info group by code) e on d.signature = e.code
+        where c.company_id = '6608ed13c0dd42de93c790dbdf124234'
+        and a.image_mode in ('CREATIVE_IMAGE_MODE_VIDEO',
+        'CREATIVE_IMAGE_MODE_VIDEO_VERTICAL')
+        and date_format(stat_datetime,'%Y-%m-%d') &gt;= #{startDate}
+        and date_format(stat_datetime,'%Y-%m-%d') &lt;= #{endDate}
+        group by `statDatetime`,`signature`
+        order by `statDatetime`,`projectId`,`signature`
+    </select>
+
 </mapper>