Selaa lähdekoodia

通用文案上传,通用文案指定文案创建和列表展示

huangxuechao 4 vuotta sitten
vanhempi
commit
ba2a209df9
15 muutettua tiedostoa jossa 997 lisäystä ja 8 poistoa
  1. 71 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/ByteDanceGeneralCopywriter.java
  2. 11 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceVideoSlogenInfo.java
  3. 17 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/ByteDanceGeneralCopywriterMapper.java
  4. 4 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedanceVideoSlogenInfoMapper.java
  5. 28 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/ByteDanceGeneralCopywriterMapper.xml
  6. 34 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedanceVideoSlogenInfoMapper.xml
  7. 15 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceGeneralCopywriterService.java
  8. 3 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IBytedanceVideoSlogenInfoService.java
  9. 82 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/ByteDanceGeneralCopywriterServiceImpl.java
  10. 64 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/BytedanceVideoSlogenInfoServiceImpl.java
  11. 159 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/ExcelUtil.java
  12. 4 3
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceReportMaterialDailyMapper.xml
  13. 308 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java
  14. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceReportController.java
  15. 195 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java

+ 71 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/ByteDanceGeneralCopywriter.java

@@ -0,0 +1,71 @@
+package org.jeecg.modules.bytedance.advertise.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecg.modules.bytedance.common.utils.Check;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+/**
+ * 通用文案库
+ * @author jeecg-boot
+ * @date   2021-05-28
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_general_copywriter")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_bytedance_general_copywriter对象", description="通用文案库")
+public class ByteDanceGeneralCopywriter {
+    
+	/**id*/
+	@TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+	private String id;
+	/**广告账户ID(相当于头条返回的access_token数据中的advertiser_id)*/
+	@Excel(name = "广告账户ID(相当于头条返回的access_token数据中的advertiser_id)", width = 15)
+    @ApiModelProperty(value = "广告账户ID(相当于头条返回的access_token数据中的advertiser_id)")
+	private Long accountId;
+	/**文案*/
+	@Excel(name = "文案", width = 15)
+    @ApiModelProperty(value = "文案")
+	private String textCopywriter;
+	/**动态词包id数组*/
+	@Excel(name = "动态词包id数组", width = 15)
+    @ApiModelProperty(value = "动态词包id数组")
+	private String creativeWordIds;
+	/**状态 0:启用 1:禁用*/
+	@Excel(name = "状态 0:启用 1:禁用", width = 15)
+    @ApiModelProperty(value = "状态 0:启用 1:禁用")
+	private Integer status;
+	/**createTime*/
+    @ApiModelProperty(value = "createTime")
+	private Date createTime;
+	/**updateTime*/
+    @ApiModelProperty(value = "updateTime")
+	private Date updateTime;
+
+    public ByteDanceGeneralCopywriter(){}
+
+    public ByteDanceGeneralCopywriter(Long accountId, String textCopywriter){
+		if (!Check.isNull(accountId)) {
+			this.accountId = accountId;
+		}
+
+		if(!Check.isNull(textCopywriter)){
+			this.textCopywriter = textCopywriter;
+		}
+
+
+	}
+
+
+}

+ 11 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceVideoSlogenInfo.java

@@ -46,6 +46,17 @@ public class BytedanceVideoSlogenInfo {
 		this.status = 1;
 	}
 
+	public BytedanceVideoSlogenInfo(String videoCode, String slogan, String userId, String creativeWordIds) {
+		this.videoCode = videoCode;
+		this.slogan = slogan;
+		this.createBy = userId;
+		this.updateBy = userId;
+		this.createTime = new Date();
+		this.updateTime = new Date();
+		this.status = 1;
+		this.creativeWordIds = creativeWordIds;
+	}
+
 	public BytedanceVideoSlogenInfo() {
 	}
 }

+ 17 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/ByteDanceGeneralCopywriterMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.bytedance.advertise.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
+
+/**
+ * 通用文案库
+ * @author jeecg-boot
+ * 2021-05-28
+ * @version V1.0
+ */
+public interface ByteDanceGeneralCopywriterMapper extends BaseMapper<ByteDanceGeneralCopywriter> {
+    List<Map<String,Object>> selectGeneralCopywriterReport(String accountId, String keyWord, String startTime, String endTime);
+}

+ 4 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedanceVideoSlogenInfoMapper.java

@@ -3,6 +3,9 @@ package org.jeecg.modules.bytedance.advertise.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 头条视频文案信息
  * @author jeecg-boot
@@ -10,5 +13,5 @@ import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
  * @version V1.0
  */
 public interface BytedanceVideoSlogenInfoMapper extends BaseMapper<BytedanceVideoSlogenInfo> {
-
+    List<Map<String,Object>> selectVideoSlogenReportByAccountIdAndTitle(String accountId, String keyWord, String startTime, String endTime);
 }

+ 28 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/ByteDanceGeneralCopywriterMapper.xml

@@ -0,0 +1,28 @@
+<?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="org.jeecg.modules.bytedance.advertise.mapper.ByteDanceGeneralCopywriterMapper">
+    <select id="selectGeneralCopywriterReport" resultType="java.util.HashMap">
+        SELECT
+            b.account_id,
+            d.creative_id,
+            a.text_copywriter,
+            count(*) AS creative_count,
+            sum(d.cost) AS sum_cost,
+            sum(d.show_num) AS sum_show_material,
+            sum(d.click) AS sum_click,
+            sum(d.show_num) AS sum_convert_material
+        FROM
+            ctop_bytedance_general_copywriter a
+        LEFT JOIN ctop_bytedance_creative b ON a.text_copywriter = b.title and a.account_id = b.account_id
+        LEFT JOIN ctop_bytedance_report_creative_daily d ON b.id = d.creative_id
+        WHERE
+            b.account_id = #{accountId}
+            <if test="keyWord!=null and keyWord!=''">and a.text_copywriter like concat('%',#{keyWord},'%')</if>
+            <if test="startTime!=null and startTime!=''">and STR_TO_DATE(d.stat_datetime,'%Y-%m-%d') &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d')</if>
+            <if test="endTime!=null and endTime!=''">and STR_TO_DATE(d.stat_datetime,'%Y-%m-%d') &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d')</if>
+            AND a.`status` = 0
+        GROUP BY
+        a.text_copywriter
+
+    </select>
+</mapper>

+ 34 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedanceVideoSlogenInfoMapper.xml

@@ -1,5 +1,39 @@
 <?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="org.jeecg.modules.bytedance.advertise.mapper.BytedanceVideoSlogenInfoMapper">
+    <select id="selectVideoSlogenReportByAccountIdAndTitle" resultType="java.util.HashMap">
 
+        SELECT
+            b.account_id as accountId,
+            a.slogan ,
+            count(*) AS count,
+            sum(d.cost) AS cost,
+            sum(d.show_num) AS showNum,
+            sum(d.click) AS click,
+            sum(d.convert_num) AS convertNum
+        FROM
+            ctop_bytedance_video_slogen_info a
+        LEFT JOIN (
+            SELECT
+                t1.id,
+                t1.title,
+                t2.signature,
+                t1.account_id
+            FROM
+                ctop_bytedance_creative t1
+            LEFT JOIN ctop_bytedance_video_info t2 ON t1.video_id = t2.vid AND t1.account_id = t2.account_id
+            where t1.account_id = #{accountId}
+        ) b ON a.slogan = b.title AND a.video_code = b.signature
+        LEFT JOIN ctop_bytedance_report_creative_daily d ON b.id = d.creative_id
+        WHERE
+            b.account_id = #{accountId}
+            <if test="keyWord!=null and keyWord!=''">and a.slogan like '%'+ #{keyWord} +'%'</if>
+            <if test="startTime!=null and startTime!=''">and STR_TO_DATE(d.stat_datetime,'%Y-%m-%d') &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d')</if>
+            <if test="endTime!=null and endTime!=''">and STR_TO_DATE(d.stat_datetime,'%Y-%m-%d') &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d')</if>
+        AND a.`status` = 1
+        GROUP BY
+            a.slogan
+
+
+    </select>
 </mapper>

+ 15 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceGeneralCopywriterService.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.bytedance.advertise.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
+
+/**
+ * 通用文案库
+ * @author jeecg-boot
+ * 2021-05-28
+ * @version V1.0
+ */
+public interface IByteDanceGeneralCopywriterService extends IService<ByteDanceGeneralCopywriter> {
+    Result getGeneralCopywriterReport(String accountId, String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize);
+}

+ 3 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IBytedanceVideoSlogenInfoService.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.bytedance.advertise.service;
 
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
 
 import java.util.List;
@@ -17,4 +18,6 @@ public interface IBytedanceVideoSlogenInfoService extends IService<BytedanceVide
     void insertSlogans(String videoCode, JSONArray slogans, String userId);
 
     List<BytedanceVideoSlogenInfo> listByParams(String code, Integer status);
+
+    Result getVideoSlogenReport(String accountId,String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize);
 }

+ 82 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/ByteDanceGeneralCopywriterServiceImpl.java

@@ -0,0 +1,82 @@
+package org.jeecg.modules.bytedance.advertise.service.impl;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
+import org.jeecg.modules.bytedance.advertise.mapper.ByteDanceGeneralCopywriterMapper;
+import org.jeecg.modules.bytedance.advertise.mapper.BytedanceVideoSlogenInfoMapper;
+import org.jeecg.modules.bytedance.advertise.service.IByteDanceGeneralCopywriterService;
+import org.jeecg.modules.bytedance.common.utils.Check;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用文案库
+ * @author jeecg-boot
+ * 2021-05-28
+ * @version V1.0
+ */
+@Service
+public class ByteDanceGeneralCopywriterServiceImpl extends ServiceImpl<ByteDanceGeneralCopywriterMapper, ByteDanceGeneralCopywriter> implements IByteDanceGeneralCopywriterService {
+    @Resource
+    ByteDanceGeneralCopywriterMapper byteDanceGeneralCopywriterMapper;
+
+
+    @Override
+    public Result getGeneralCopywriterReport(String accountId, String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize){
+        PageHelper.startPage(pageNum,pageSize);
+        List<Map<String, Object>> generalCopywriteReportList = byteDanceGeneralCopywriterMapper.selectGeneralCopywriterReport(accountId,keyWord, startTime, endTime);
+        if(Check.isNull(generalCopywriteReportList)){
+            return Result.error("还没有此文案报表数据,请将此文案投放跑量!");
+        }
+
+        for (Map<String, Object> videoSlogenReportMap: generalCopywriteReportList) {
+
+            if(videoSlogenReportMap.get("count") == null){
+                videoSlogenReportMap.put("count",0);
+            }
+
+            BigDecimal cost = new BigDecimal(Check.isNull(videoSlogenReportMap.get("cost")) ? "0" : videoSlogenReportMap.get("cost").toString());
+            BigDecimal click = new BigDecimal(Check.isNull(videoSlogenReportMap.get("click")) ? "0" : videoSlogenReportMap.get("click").toString());
+            BigDecimal showNum = new BigDecimal(Check.isNull(videoSlogenReportMap.get("showNum")) ? "0" : videoSlogenReportMap.get("showNum").toString());
+            BigDecimal convertNum = new BigDecimal(Check.isNull(videoSlogenReportMap.get("convertNum")) ? "0" : videoSlogenReportMap.get("convertNum").toString());
+
+            //被除数不能为0
+            if (StringUtils.equals("0",showNum.toString())){
+                videoSlogenReportMap.put("costPerThousandShow", 0);
+                videoSlogenReportMap.put("clickRate", 0);
+            }else {
+                BigDecimal costPerThousandShow = cost.multiply(new BigDecimal(1000)).divide(showNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costPerThousandShow", costPerThousandShow);
+                BigDecimal clickRate = click.multiply(new BigDecimal(100)).divide(showNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("clickRate", clickRate);
+            }
+            if (StringUtils.equals("0", convertNum.toString())) {
+                videoSlogenReportMap.put("costConvert", 0);
+            }else {
+                BigDecimal costConvert = cost.divide(convertNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costConvert", costConvert);
+            }
+            if (StringUtils.equals("0", click.toString())) {
+                videoSlogenReportMap.put("costPerClick", 0);
+                videoSlogenReportMap.put("convertRate", 0);
+            }else {
+                BigDecimal costPerClick = cost.divide(click, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costPerClick", costPerClick);
+                BigDecimal convertRate = convertNum.multiply(new BigDecimal(100)).divide(click,2,BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("convertRate", convertRate);
+            }
+        }
+
+        PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(generalCopywriteReportList);
+        return Result.successMsg("数据加载成功。",pageInfo);
+    }
+}

+ 64 - 2
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/BytedanceVideoSlogenInfoServiceImpl.java

@@ -1,15 +1,23 @@
 package org.jeecg.modules.bytedance.advertise.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
 import org.jeecg.modules.bytedance.advertise.mapper.BytedanceVideoSlogenInfoMapper;
 import org.jeecg.modules.bytedance.advertise.service.IBytedanceVideoSlogenInfoService;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 头条视频文案信息
@@ -19,14 +27,19 @@ import java.util.List;
  */
 @Service
 public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVideoSlogenInfoMapper, BytedanceVideoSlogenInfo> implements IBytedanceVideoSlogenInfoService {
+    @Resource
+    BytedanceVideoSlogenInfoMapper bytedanceVideoSlogenInfoMapper;
+
     @Override
     public void insertSlogans(String videoCode, JSONArray slogans,String userId){
         if(null==slogans||slogans.isEmpty()){
             return;
         }
         for(int i=0;i<slogans.size();i++){
-            String slogan = slogans.getString(i);
-            BytedanceVideoSlogenInfo slogenInfo = new BytedanceVideoSlogenInfo(videoCode,slogan,userId);
+            JSONObject sloganObject = slogans.getJSONObject(i);
+            String title = sloganObject.getString("title");
+            String creativeWordIds = Check.isNull(sloganObject.getJSONArray("creative_word_ids")) ? "" : sloganObject.getJSONArray("creative_word_ids").toJSONString();
+            BytedanceVideoSlogenInfo slogenInfo = new BytedanceVideoSlogenInfo(videoCode,title,userId,creativeWordIds);
             this.save(slogenInfo);
         }
     }
@@ -43,4 +56,53 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
         queryWrapper.orderByDesc("id");
         return this.list(queryWrapper);
     }
+    @Override
+    public Result getVideoSlogenReport(String accountId,String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize){
+        PageHelper.startPage(pageNum,pageSize);
+        List<Map<String, Object>> videoSlogenReportList = bytedanceVideoSlogenInfoMapper.selectVideoSlogenReportByAccountIdAndTitle(accountId,keyWord, startTime, endTime);
+
+        if(Check.isNull(videoSlogenReportList)){
+            return Result.error("还没有此文案报表数据,请将此文案投放跑量!");
+        }
+
+        for (Map<String, Object> videoSlogenReportMap: videoSlogenReportList) {
+            if(videoSlogenReportMap.get("count") == null){
+                videoSlogenReportMap.put("count",0);
+            }
+
+            BigDecimal cost = new BigDecimal(Check.isNull(videoSlogenReportMap.get("cost")) ? "0" : videoSlogenReportMap.get("cost").toString());
+            BigDecimal click = new BigDecimal(Check.isNull(videoSlogenReportMap.get("click")) ? "0" : videoSlogenReportMap.get("click").toString());
+            BigDecimal showNum = new BigDecimal(Check.isNull(videoSlogenReportMap.get("showNum")) ? "0" : videoSlogenReportMap.get("showNum").toString());
+            BigDecimal convertNum = new BigDecimal(Check.isNull(videoSlogenReportMap.get("convertNum")) ? "0" : videoSlogenReportMap.get("convertNum").toString());
+
+            //被除数不能为0
+            if (StringUtils.equals("0",showNum.toString())){
+                videoSlogenReportMap.put("costPerThousandShow", 0);
+                videoSlogenReportMap.put("clickRate", 0);
+            }else {
+                BigDecimal costPerThousandShow = cost.multiply(new BigDecimal(1000)).divide(showNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costPerThousandShow", costPerThousandShow);
+                BigDecimal clickRate = click.multiply(new BigDecimal(100)).divide(showNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("clickRate", clickRate);
+            }
+            if (StringUtils.equals("0", convertNum.toString())) {
+                videoSlogenReportMap.put("costConvert", 0);
+            }else {
+                BigDecimal costConvert = cost.divide(convertNum, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costConvert", costConvert);
+            }
+            if (StringUtils.equals("0", click.toString())) {
+                videoSlogenReportMap.put("costPerClick", 0);
+                videoSlogenReportMap.put("convertRate", 0);
+            }else {
+                BigDecimal costPerClick = cost.divide(click, 2, BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("costPerClick", costPerClick);
+                BigDecimal convertRate = convertNum.multiply(new BigDecimal(100)).divide(click,2,BigDecimal.ROUND_HALF_UP);
+                videoSlogenReportMap.put("convertRate", convertRate);
+            }
+        }
+
+        PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(videoSlogenReportList);
+        return Result.successMsg("数据加载成功。",pageInfo);
+    }
 }

+ 159 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/ExcelUtil.java

@@ -0,0 +1,159 @@
+package org.jeecg.modules.bytedance.common.utils;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ExcelUtil {
+
+    private final static String xls = "xls";
+    private final static String xlsx = "xlsx";
+    private final static String DATE_FORMAT = "yyyy/MM/dd";
+    /**
+     * 读入excel文件,解析后返回
+     * @param file
+     * @throws IOException
+     */
+    public static List<String> readExcel(MultipartFile file) throws IOException {
+        //检查文件
+        checkFile(file);
+        //获得Workbook工作薄对象
+        Workbook workbook = getWorkBook(file);
+        //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
+//    List<String[]> list = new ArrayList<String[]>();
+        List<String> list = new ArrayList<>();
+        if(workbook != null){
+            for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
+                //获得当前sheet工作表
+                Sheet sheet = workbook.getSheetAt(sheetNum);
+                if(sheet == null){
+                    continue;
+                }
+                //获得当前sheet的开始行
+                int firstRowNum = sheet.getFirstRowNum();
+                //获得当前sheet的结束行
+                int lastRowNum = sheet.getLastRowNum();
+                //循环所有行
+                for(int rowNum = firstRowNum;rowNum <= lastRowNum;rowNum++){
+                    //获得当前行
+                    Row row = sheet.getRow(rowNum);
+                    if(row == null){
+                        continue;
+                    }
+                    //获得当前行的开始列
+                    int firstCellNum = row.getFirstCellNum();
+                    //获得当前行的列数
+                    int lastCellNum = row.getPhysicalNumberOfCells();
+//          String[] cells = new String[row.getPhysicalNumberOfCells()];
+                    //循环当前行
+                    for(int cellNum = firstCellNum; cellNum <= lastCellNum;cellNum++){
+                        Cell cell = row.getCell(cellNum);
+//            cells[cellNum] = getCellValue(cell);
+                        String cellValue = getCellValue(cell);
+                        list.add(cellValue);
+                    }
+
+                }
+            }
+            workbook.close();
+        }
+        return list;
+    }
+
+    //校验文件是否合法
+    public static void checkFile(MultipartFile file) throws IOException{
+        //判断文件是否存在
+        if(null == file){
+            throw new FileNotFoundException("文件不存在!");
+        }
+        //获得文件名
+        String fileName = file.getOriginalFilename();
+        //判断文件是否是excel文件
+        if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){
+            throw new IOException(fileName + "不是excel文件");
+        }
+    }
+    public static Workbook getWorkBook(MultipartFile file) {
+        //获得文件名
+        String fileName = file.getOriginalFilename();
+        //创建Workbook工作薄对象,表示整个excel
+        Workbook workbook = null;
+        try {
+            //获取excel文件的io流
+            InputStream is = file.getInputStream();
+            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
+            if(fileName.endsWith(xls)){
+                //2003
+                workbook = new HSSFWorkbook(is);
+            }else if(fileName.endsWith(xlsx)){
+                //2007
+                workbook = new XSSFWorkbook(is);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return workbook;
+    }
+    public static String getCellValue(Cell cell){
+        String cellValue = "";
+        if(cell == null){
+            return cellValue;
+        }
+        //如果当前单元格内容为日期类型,需要特殊处理
+        String dataFormatString = cell.getCellStyle().getDataFormatString();
+        if(dataFormatString.equals("m/d/yy")){
+            cellValue = new SimpleDateFormat(DATE_FORMAT).format(cell.getDateCellValue());
+            return cellValue;
+        }
+
+
+        /**
+         *     _NONE(-1),
+         *     NUMERIC(0),
+         *     STRING(1),
+         *     FORMULA(2),
+         *     BLANK(3),
+         *     BOOLEAN(4),
+         *     ERROR(5);
+         */
+
+        CellType cellTypeEnum = cell.getCellType();
+        //把数字当成String来读,避免出现1读成1.0的情况
+        if(cell.getCellType() == CellType.NUMERIC){
+            cell.setCellType(CellType.STRING);
+        }
+        //判断数据的类型
+        switch (cell.getCellType()){
+            case NUMERIC: //数字
+                cellValue = String.valueOf(cell.getNumericCellValue());
+                break;
+            case STRING: //字符串
+                cellValue = String.valueOf(cell.getStringCellValue());
+                break;
+            case BOOLEAN: //Boolean
+                cellValue = String.valueOf(cell.getBooleanCellValue());
+                break;
+            case FORMULA: //公式
+                cellValue = String.valueOf(cell.getCellFormula());
+                break;
+            case _NONE: //空值
+                cellValue = "";
+                break;
+            case ERROR: //故障
+                cellValue = "非法字符";
+                break;
+            default:
+                cellValue = "未知类型";
+                break;
+        }
+        return cellValue;
+    }
+}

+ 4 - 3
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceReportMaterialDailyMapper.xml

@@ -12,15 +12,16 @@
             report.click,
             report.convert_material as convertMaterial,
             creative.count,
-            video.material_upload_time as materialUploadTime
+            video.material_upload_time as materialUploadTime,
+            video.poster_url as posterUrl
         FROM
             ctop_bytedance_report_material_daily report
         LEFT JOIN ctop_bytedance_video_info video ON video.material_id = report.material_id AND video.account_id = report.account_id
         LEFT JOIN (SELECT video_id,account_id,count(*) AS count FROM ctop_bytedance_creative t WHERE t.account_id = #{accountId} GROUP BY video_id,account_id) creative ON creative.video_id = video.vid
         WHERE
             video.account_id = #{accountId}
-        <if test="startTime!=null">and STR_TO_DATE(report.stat_datetime,'%Y-%m-%d') &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d')</if>
-        <if test="endTime!=null">and STR_TO_DATE(report.stat_datetime,'%Y-%m-%d') &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d')</if>
+        <if test="startTime!=null and startTime!=''">and STR_TO_DATE(report.stat_datetime,'%Y-%m-%d') &gt;= STR_TO_DATE(#{startTime},'%Y-%m-%d')</if>
+        <if test="endTime!=null and endTime!=''">and STR_TO_DATE(report.stat_datetime,'%Y-%m-%d') &lt;= STR_TO_DATE(#{endTime},'%Y-%m-%d')</if>
         GROUP BY
             report.material_id
         order by report.cost desc

+ 308 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java

@@ -0,0 +1,308 @@
+package org.jeecg.modules.bytedance.advertise.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
+import org.jeecg.modules.bytedance.advertise.service.IByteDanceGeneralCopywriterService;
+import org.jeecg.modules.bytedance.common.utils.ExcelUtil;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.*;
+/**
+ * 头条通用文案上传接口
+ * @author jeecg-boot
+ * @date   2021-04-20
+ * @version V1.0
+ */
+@RestController
+@RequestMapping("/advertiser/bytedanceGeneralCopywriter")
+@Api(tags="头条通用文案")
+@Slf4j
+public class BytedanceGeneralCopywriterController {
+    @Autowired
+    private IByteDanceGeneralCopywriterService byteDanceGeneralCopywriterService;
+
+    @ApiOperation(value="通用文案库-上传excel", notes="通用文案库-上传excel")
+    @PostMapping("/loadExcel")
+    public Result<ByteDanceGeneralCopywriter> loadExcel(
+            @RequestParam("accountId") Long accountId,
+            @RequestParam("excelFile") MultipartFile excelFile){
+        Result<ByteDanceGeneralCopywriter> result = new Result<>();
+        try {
+            List<String> list = ExcelUtil.readExcel(excelFile);
+            //去掉null值
+            list.removeIf(Objects::isNull);
+            //去掉空字符串
+            Iterator<String> iterator = list.iterator();
+            while (iterator.hasNext()){
+                if (iterator.next() == ""){
+                    iterator.remove();
+                }
+            }
+            List<ByteDanceGeneralCopywriter> byteDanceGeneralCopywriterList = new ArrayList<ByteDanceGeneralCopywriter>();
+
+            //遍历list,查看数据
+            for (String textCopywriter : list) {
+                System.out.println(textCopywriter);
+                byteDanceGeneralCopywriterList.add(new ByteDanceGeneralCopywriter(accountId,textCopywriter));
+            }
+
+            for (ByteDanceGeneralCopywriter aa : byteDanceGeneralCopywriterList) {
+                System.out.println(aa);
+            }
+            byteDanceGeneralCopywriterService.saveBatch(byteDanceGeneralCopywriterList);
+            result.success("添加成功!");
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+
+    /**
+     * 分页列表查询
+     * @param byteDanceGeneralCopywriter
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value="通用文案库-分页列表查询", notes="通用文案库-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ByteDanceGeneralCopywriter>> queryPageList(ByteDanceGeneralCopywriter byteDanceGeneralCopywriter,
+                                                                   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                                                   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+                                                                   HttpServletRequest req) {
+        Result<IPage<ByteDanceGeneralCopywriter>> result = new Result<>();
+        QueryWrapper<ByteDanceGeneralCopywriter> queryWrapper = QueryGenerator.initQueryWrapper(byteDanceGeneralCopywriter, req.getParameterMap());
+        Page<ByteDanceGeneralCopywriter> page = new Page<ByteDanceGeneralCopywriter>(pageNo, pageSize);
+        IPage<ByteDanceGeneralCopywriter> pageList = byteDanceGeneralCopywriterService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    @ApiOperation(value="通用文案报表展示", notes="通用文案报表展示")
+    @GetMapping(value = "/queryPageListByText")
+    public Result queryPageListByText(@RequestParam("accountId") String accountId,
+                                      @RequestParam(value = "keyWord",defaultValue = "") String keyWord,
+                                      @RequestParam(value = "startTime",defaultValue = "") String startTime,
+                                      @RequestParam(value = "endTime",defaultValue = "") String endTime,
+                                      @RequestParam(value = "pageNo", defaultValue="1") Integer pageNo,
+                                      @RequestParam(value = "pageSize", defaultValue="10") Integer pageSize
+    ) {
+        try {
+            return byteDanceGeneralCopywriterService.getGeneralCopywriterReport(accountId,keyWord, startTime,endTime,pageNo,pageSize);
+        }catch (Exception e){
+            log.error("通用文案数据-获取文案维度创意报表数据异常",e);
+            return Result.error("请求失败,请联系开发人员!");
+        }
+    }
+
+    /**
+     *   添加
+     * @param byteDanceGeneralCopywriter
+     * @return
+     */
+    @ApiOperation(value="通用文案库-添加", notes="通用文案库-添加")
+    @PostMapping(value = "/add")
+    public Result<ByteDanceGeneralCopywriter> add(@RequestBody ByteDanceGeneralCopywriter byteDanceGeneralCopywriter) {
+        Result<ByteDanceGeneralCopywriter> result = new Result<>();
+        try {
+            byteDanceGeneralCopywriterService.save(byteDanceGeneralCopywriter);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+
+    /**
+     *   批量添加
+     * @param byteDanceGeneralCopywriterList
+     * @return
+     */
+    @ApiOperation(value="通用文案库-批量添加", notes="通用文案库-批量添加")
+    @PostMapping(value = "/addList")
+    public Result<List> add(@RequestBody List<ByteDanceGeneralCopywriter> byteDanceGeneralCopywriterList) {
+        Result<List> result = new Result<>();
+        try {
+            byteDanceGeneralCopywriterService.saveBatch(byteDanceGeneralCopywriterList);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     *  编辑
+     * @param byteDanceGeneralCopywriter
+     * @return
+     */
+    @ApiOperation(value="通用文案库-编辑", notes="通用文案库-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ByteDanceGeneralCopywriter> edit(@RequestBody ByteDanceGeneralCopywriter byteDanceGeneralCopywriter) {
+        Result<ByteDanceGeneralCopywriter> result = new Result<ByteDanceGeneralCopywriter>();
+        ByteDanceGeneralCopywriter byteDanceGeneralCopywriterEntity = byteDanceGeneralCopywriterService.getById(byteDanceGeneralCopywriter.getId());
+        if(byteDanceGeneralCopywriterEntity==null) {
+            result.error500("未找到对应实体");
+        }else {
+            boolean ok = byteDanceGeneralCopywriterService.updateById(byteDanceGeneralCopywriter);
+            if(ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     *   通过id删除
+     * @param id
+     * @return
+     */
+    @ApiOperation(value="通用文案库-通过id删除", notes="通用文案库-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name="id") String id) {
+        try {
+            byteDanceGeneralCopywriterService.removeById(id);
+        } catch (Exception e) {
+            log.error("删除失败",e.getMessage());
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     *  批量删除
+     * @param ids
+     * @return
+     */
+    @ApiOperation(value="通用文案库-批量删除", notes="通用文案库-批量删除")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<ByteDanceGeneralCopywriter> deleteBatch(@RequestParam(name="ids") String ids) {
+        Result<ByteDanceGeneralCopywriter> result = new Result<>();
+        if(ids==null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        }else {
+            this.byteDanceGeneralCopywriterService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     * @param id
+     * @return
+     */
+    @ApiOperation(value="通用文案库-通过id查询", notes="通用文案库-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ByteDanceGeneralCopywriter> queryById(@RequestParam(name="id",required=true) String id) {
+        Result<ByteDanceGeneralCopywriter> result = new Result<>();
+        ByteDanceGeneralCopywriter byteDanceGeneralCopywriter = byteDanceGeneralCopywriterService.getById(id);
+        if(byteDanceGeneralCopywriter==null) {
+            result.error500("未找到对应实体");
+        }else {
+            result.setResult(byteDanceGeneralCopywriter);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<ByteDanceGeneralCopywriter> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                ByteDanceGeneralCopywriter byteDanceGeneralCopywriter = JSON.parseObject(deString, ByteDanceGeneralCopywriter.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(byteDanceGeneralCopywriter, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<ByteDanceGeneralCopywriter> pageList = byteDanceGeneralCopywriterService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "通用文案库列表");
+        mv.addObject(NormalExcelConstants.CLASS, ByteDanceGeneralCopywriter.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("通用文案库列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<ByteDanceGeneralCopywriter> listByteDanceGeneralCopywriters = ExcelImportUtil.importExcel(file.getInputStream(), ByteDanceGeneralCopywriter.class, params);
+                byteDanceGeneralCopywriterService.saveBatch(listByteDanceGeneralCopywriters);
+                return Result.ok("文件导入成功!数据行数:" + listByteDanceGeneralCopywriters.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(),e);
+                return Result.error("文件导入失败:"+e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}

+ 2 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceReportController.java

@@ -274,8 +274,8 @@ public class BytedanceReportController {
 	@ApiOperation(value="投放数据-素材维度展示", notes="投放数据-素材维度展示")
 	@GetMapping(value = "/selectMaterialDailyReport")
 	public Result selectMaterialDailyReport(@RequestParam("accountId") String accountId,
-					@RequestParam("startTime") String startTime,
-					@RequestParam("endTime") String endTime,
+					@RequestParam(value = "startTime",defaultValue = "") String startTime,
+					@RequestParam(value = "endTime",defaultValue = "") String endTime,
 					@RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
 					@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
 		try {

+ 195 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java

@@ -0,0 +1,195 @@
+package org.jeecg.modules.bytedance.advertise.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
+import org.jeecg.modules.bytedance.advertise.service.IBytedanceVideoSlogenInfoService;
+import org.jeecg.modules.bytedance.advertise.service.impl.BytedanceVideoSlogenInfoServiceImpl;
+import org.jeecg.modules.system.service.ISysRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 头条视频文案信息
+ * @author jeecg-boot
+ * 2021-04-19
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="头条视频文案信息")
+@RestController
+@RequestMapping("/ctop/bytedanceVideoSlogenInfo")
+public class BytedanceVideoSlogenInfoController {
+	@Autowired
+	private IBytedanceVideoSlogenInfoService bytedanceVideoSlogenInfoService;
+
+	@Autowired
+	private ISysRoleService sysRoleService;
+	/**
+	  * 分页列表查询
+	 * @param slogenInfo
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-分页列表查询", notes="头条视频文案信息-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BytedanceVideoSlogenInfo>> queryPageList(BytedanceVideoSlogenInfo slogenInfo,
+																 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																 HttpServletRequest req) {
+		Result<IPage<BytedanceVideoSlogenInfo>> result = new Result<>();
+		slogenInfo.setStatus(1);
+		QueryWrapper<BytedanceVideoSlogenInfo> queryWrapper = QueryGenerator.initQueryWrapper(slogenInfo, req.getParameterMap());
+		Page<BytedanceVideoSlogenInfo> page = new Page<>(pageNo, pageSize);
+		IPage<BytedanceVideoSlogenInfo> pageList = bytedanceVideoSlogenInfoService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	@ApiOperation(value="指定文案报表数据展示", notes="指定文案报表数据展示")
+	@GetMapping(value = "/queryPageListByText")
+	public Result queryPageListByText(@RequestParam("accountId") String accountId,
+									  @RequestParam(value = "keyWord",defaultValue = "") String keyWord,
+									  @RequestParam(value = "startTime",defaultValue = "") String startTime,
+									  @RequestParam(value = "endTime",defaultValue = "") String endTime,
+									  @RequestParam(value = "pageNo", defaultValue="1") Integer pageNo,
+									  @RequestParam(value = "pageSize", defaultValue="10") Integer pageSize
+									) {
+		try {
+			String roleCode = sysRoleService.getRoleCodeByUserId(accountId);
+			return bytedanceVideoSlogenInfoService.getVideoSlogenReport(accountId,keyWord, startTime,endTime,pageNo,pageSize);
+		}catch (Exception e){
+			log.error("指定文案-获取指定文案维度创意报表数据异常",e);
+			return Result.error("请求失败,请联系开发人员!");
+		}
+	}
+
+	/**
+	  *   添加
+	 * @param slogenInfo
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-添加", notes="头条视频文案信息-添加")
+	@PostMapping(value = "/add")
+	public Result<BytedanceVideoSlogenInfo> add(@RequestBody BytedanceVideoSlogenInfo slogenInfo) {
+		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		try {
+			bytedanceVideoSlogenInfoService.save(slogenInfo);
+			result.success("添加成功!");
+			return result;
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+			return result;
+		}
+	}
+
+	/**
+	 *   添加
+	 * @param
+	 * @param
+	 * @param userId
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-批量添加", notes="头条视频文案信息-批量添加")
+	@PostMapping(value = "/addList")
+	public Result<BytedanceVideoSlogenInfo> addList(@RequestParam String[] videoCodeArray,
+													@RequestParam JSONArray slogenArray,
+													@RequestParam String userId) {
+		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		try {
+			for (String videoCode: videoCodeArray) {
+                bytedanceVideoSlogenInfoService.insertSlogans(videoCode,slogenArray,userId);
+			}
+			result.success("添加成功!");
+			return result;
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+			return result;
+		}
+	}
+
+	/**
+	 *  编辑
+	 * @param slogenInfo 文案信息
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-编辑", notes="头条视频文案信息-编辑")
+	@PostMapping(value = "/edit")
+	public Result<BytedanceVideoSlogenInfo> edit(@RequestBody BytedanceVideoSlogenInfo slogenInfo) {
+		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		BytedanceVideoSlogenInfo bytedanceVideoSlogenInfoEntity = bytedanceVideoSlogenInfoService.getById(slogenInfo.getId());
+		if(bytedanceVideoSlogenInfoEntity==null) {
+			result.error500("未找到对应实体");
+			return result;
+		}
+		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		slogenInfo.setUpdateBy(user.getId());
+		slogenInfo.setUpdateTime(new Date());
+		bytedanceVideoSlogenInfoService.updateById(slogenInfo);
+		result.success("修改成功!");
+		return result;
+	}
+
+	/**
+	 *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-通过id删除", notes="头条视频文案信息-通过id删除")
+	@PostMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id") String id) {
+		try {
+			BytedanceVideoSlogenInfo slogenInfo = bytedanceVideoSlogenInfoService.getById(id);
+			if(null == slogenInfo||slogenInfo.getStatus() == 0){
+				return Result.ok("此文案不存在或者已经被删除");
+			}
+			slogenInfo.setStatus(0);
+			LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+			slogenInfo.setUpdateTime(new Date());
+			slogenInfo.setCreateBy(user.getId());
+			bytedanceVideoSlogenInfoService.updateById(slogenInfo);
+			return Result.ok("删除成功!");
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+	}
+
+	/**
+	 * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-通过id查询", notes="头条视频文案信息-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BytedanceVideoSlogenInfo> queryById(@RequestParam(name="id") String id) {
+		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		BytedanceVideoSlogenInfo bytedanceVideoSlogenInfo = bytedanceVideoSlogenInfoService.getById(id);
+		if(bytedanceVideoSlogenInfo==null) {
+			result.error500("未找到对应实体");
+			return result;
+		}
+		result.setResult(bytedanceVideoSlogenInfo);
+		result.setSuccess(true);
+		return result;
+	}
+}