Browse Source

Merge remote-tracking branch 'origin/test'

songyh 4 years ago
parent
commit
f3fbecb823
27 changed files with 1210 additions and 32 deletions
  1. 2 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingService.java
  2. 33 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java
  3. 71 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/ByteDanceGeneralCopywriter.java
  4. 11 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceVideoSlogenInfo.java
  5. 17 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/ByteDanceGeneralCopywriterMapper.java
  6. 4 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedanceVideoSlogenInfoMapper.java
  7. 28 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/ByteDanceGeneralCopywriterMapper.xml
  8. 34 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedanceVideoSlogenInfoMapper.xml
  9. 2 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdDplinkInfoService.java
  10. 7 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdvertiserStrategyService.java
  11. 15 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceGeneralCopywriterService.java
  12. 3 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IBytedanceVideoSlogenInfoService.java
  13. 29 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdDplinkInfoServiceImpl.java
  14. 71 19
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
  15. 82 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/ByteDanceGeneralCopywriterServiceImpl.java
  16. 64 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/BytedanceVideoSlogenInfoServiceImpl.java
  17. 159 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/common/utils/ExcelUtil.java
  18. 1 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/entity/vo/ReportCostVo.java
  19. 7 3
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceAdvertiserHourlyReportMapper.xml
  20. 5 3
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceReportMaterialDailyMapper.xml
  21. 16 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java
  22. 17 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceReportMaterialDailyServiceImpl.java
  23. 3 0
      jeecg-boot-bytedance/src/main/resources/bytedance_config.properties
  24. 28 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/AiBytedanceAdvertiserStrategyController.java
  25. 304 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java
  26. 2 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceReportController.java
  27. 195 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java

+ 2 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingService.java

@@ -72,4 +72,6 @@ public interface MarketingService {
     Result getAudiencePackageRead(CtopOauthToken token,String accountId,List<Integer> ids);
     Result getAudiencePackageRead(CtopOauthToken token,String accountId,List<Integer> ids);
 
 
     Result createAudiencePackage(CtopOauthToken token);
     Result createAudiencePackage(CtopOauthToken token);
+
+    Result getSite(CtopOauthToken token);
 }
 }

+ 33 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java

@@ -1182,5 +1182,38 @@ public class MarketingServiceImpl implements MarketingService{
         return Result.successMsg("创建定向包成功",jsonObject.getJSONObject("audience_package_id"));
         return Result.successMsg("创建定向包成功",jsonObject.getJSONObject("audience_package_id"));
     }
     }
 
 
+    /**
+     *
+     * @description: 获取橙子建站站点列表
+     * @param token
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     */
+    @Override
+    public Result getSite(CtopOauthToken token) {
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", token.getAccountId());
+        params.put("status", "SITE_ONLINE");
+        params.put("page", 1);
+        params.put("page_size", 300);
+        params.put("filtering", null);
+        params = Check.jsonRemoveEmpty(params);
+        JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
+                urlPath+ PropertiesUtils.getValue("bytedance_config", "bytedance_v2_site_get"),params);
+        Integer code = jsonObject.getInteger("code");
+        String message = jsonObject.getString("message");
+        if (null == code || !code.equals(0)) {
+            log.info("获取橙子建站站点列表接口异常==》accountId:{},message:{}", token.getAccountId(), message);
+            return Result.error(message);
+        }
+        JSONObject dataList = jsonObject.getJSONObject("data");
+        if (null == dataList || dataList.isEmpty()) {
+            log.info("获取橙子建站站点列表不存在==》accountId:{},message:{}", token.getAccountId(), message);
+            return Result.error("获取橙子建站站点列表不存在");
+        }
+        return Result.successMsg("获取橙子建站站点列表成功",dataList.getJSONArray("list"));
+
+    }
+
 
 
 }
 }

+ 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;
 		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() {
 	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 com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
 import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
 
 
+import java.util.List;
+import java.util.Map;
+
 /**
 /**
  * 头条视频文案信息
  * 头条视频文案信息
  * @author jeecg-boot
  * @author jeecg-boot
@@ -10,5 +13,5 @@ import org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo;
  * @version V1.0
  * @version V1.0
  */
  */
 public interface BytedanceVideoSlogenInfoMapper extends BaseMapper<BytedanceVideoSlogenInfo> {
 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"?>
 <?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">
 <!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">
 <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 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` = 1
+        GROUP BY
+            a.slogan
+
+
+    </select>
 </mapper>
 </mapper>

+ 2 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdDplinkInfoService.java

@@ -12,4 +12,6 @@ import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdDplinkInfo;
 public interface IAiBytedanceAdDplinkInfoService extends IService<AiBytedanceAdDplinkInfo> {
 public interface IAiBytedanceAdDplinkInfoService extends IService<AiBytedanceAdDplinkInfo> {
 
 
     AiBytedanceAdDplinkInfo getlatestDpLinkInfo(Long strategyId, Long accountId, Integer status);
     AiBytedanceAdDplinkInfo getlatestDpLinkInfo(Long strategyId, Long accountId, Integer status);
+
+    int getDpLinkInfoCount(Long accountId);
 }
 }

+ 7 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IAiBytedanceAdvertiserStrategyService.java

@@ -106,6 +106,13 @@ public interface IAiBytedanceAdvertiserStrategyService extends IService<AiByteda
 
 
     Result createAudiencePackage(String accountId);
     Result createAudiencePackage(String accountId);
 
 
+    /**
+     * 获取橙子建站站点列表
+     * @param accountId
+     * @return
+     */
+    Result getChengZiSite(String accountId);
+
 
 
 
 
 
 

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

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

@@ -7,6 +7,10 @@ import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdDplinkInfoMappe
 import org.jeecg.modules.bytedance.advertise.service.IAiBytedanceAdDplinkInfoService;
 import org.jeecg.modules.bytedance.advertise.service.IAiBytedanceAdDplinkInfoService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 /**
 /**
  * 头条计划dplink标识创建记录
  * 头条计划dplink标识创建记录
  * @author jeecg-boot
  * @author jeecg-boot
@@ -16,6 +20,9 @@ import org.springframework.stereotype.Service;
 @Service
 @Service
 public class AiBytedanceAdDplinkInfoServiceImpl extends ServiceImpl<AiBytedanceAdDplinkInfoMapper, AiBytedanceAdDplinkInfo> implements IAiBytedanceAdDplinkInfoService {
 public class AiBytedanceAdDplinkInfoServiceImpl extends ServiceImpl<AiBytedanceAdDplinkInfoMapper, AiBytedanceAdDplinkInfo> implements IAiBytedanceAdDplinkInfoService {
 
 
+    @Resource
+    private AiBytedanceAdDplinkInfoMapper aiBytedanceAdDplinkInfoMapper;
+
     @Override
     @Override
     public AiBytedanceAdDplinkInfo getlatestDpLinkInfo(Long strategyId, Long accountId, Integer status) {
     public AiBytedanceAdDplinkInfo getlatestDpLinkInfo(Long strategyId, Long accountId, Integer status) {
         QueryWrapper<AiBytedanceAdDplinkInfo> queryWrapper = new QueryWrapper<>();
         QueryWrapper<AiBytedanceAdDplinkInfo> queryWrapper = new QueryWrapper<>();
@@ -31,4 +38,26 @@ public class AiBytedanceAdDplinkInfoServiceImpl extends ServiceImpl<AiBytedanceA
         queryWrapper.orderByDesc("id").last("limit 1");
         queryWrapper.orderByDesc("id").last("limit 1");
         return this.getOne(queryWrapper);
         return this.getOne(queryWrapper);
     }
     }
+
+    /**
+     *
+     * @description: 查询账户当天已有条数
+     *
+     * @param accountId
+     * @return: int
+     * @author: zianY
+     */
+    @Override
+    public int getDpLinkInfoCount(Long accountId) {
+        QueryWrapper<AiBytedanceAdDplinkInfo> queryWrapper = new QueryWrapper<>();
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String format = sdf.format(date);
+        queryWrapper.eq("account_id",accountId);
+        queryWrapper.ge("create_time",format);
+        return aiBytedanceAdDplinkInfoMapper.selectCount(queryWrapper);
+
+    }
+
+
 }
 }

+ 71 - 19
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.base.Joiner;
 import com.google.common.base.Joiner;
+import com.google.gson.JsonObject;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.common.util.DateUtils;
@@ -136,7 +137,9 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
 
 
                 //不使用dp链接
                 //不使用dp链接
                 String date = DateUtils.formatDate();
                 String date = DateUtils.formatDate();
+                //组名称
                 String campaignName = getCampaignName(strategy,null,date);
                 String campaignName = getCampaignName(strategy,null,date);
+                //创建组 并返回 组id
                 Long campaignId = getCampaignId(strategy,campaignName,token);
                 Long campaignId = getCampaignId(strategy,campaignName,token);
                 if(null == campaignId){
                 if(null == campaignId){
                     return videoCnt;
                     return videoCnt;
@@ -192,6 +195,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 }
                 }
                 //组名称
                 //组名称
                 String campaignName = getCampaignName(strategy,dpIndex,null);
                 String campaignName = getCampaignName(strategy,dpIndex,null);
+                //创建组 并返回 组id
                 Long campaignId = getCampaignId(strategy,campaignName,token);
                 Long campaignId = getCampaignId(strategy,campaignName,token);
                 if(null == campaignId){
                 if(null == campaignId){
                     return videoCnt;
                     return videoCnt;
@@ -492,14 +496,14 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         }
         }
         //投放目标
         //投放目标
         params.put("download_type",strategy.getAdDownloadType());
         params.put("download_type",strategy.getAdDownloadType());
-//        if(!Check.isNull(strategy.getAdDownloadUrl())){
-//            params.put("download_url",strategy.getAdDownloadUrl());
-//        }
-//        if(!Check.isNull(strategy.getAdPackage())){
-//            params.put("package",strategy.getAdPackage());
-//        }
-        params.put("download_url","https://apps.bytesfield.com/download/basic/cur/1c728178004c8d4d6c83444a05c414c1a1cfae48");
-        params.put("package","com.taobao.litetao");
+        if(!Check.isNull(strategy.getAdDownloadUrl())){
+            params.put("download_url",strategy.getAdDownloadUrl());
+        }
+        if(!Check.isNull(strategy.getAdPackage())){
+            params.put("package",strategy.getAdPackage());
+        }
+        //params.put("download_url","https://apps.bytesfield.com/download/basic/cur/1c728178004c8d4d6c83444a05c414c1a1cfae48");
+       // params.put("package","com.taobao.litetao");
         if(!Check.isNull(strategy.getAdQuickAppUrl())){
         if(!Check.isNull(strategy.getAdQuickAppUrl())){
             params.put("quick_app_url",strategy.getAdQuickAppUrl());
             params.put("quick_app_url",strategy.getAdQuickAppUrl());
         }
         }
@@ -533,8 +537,8 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 params.put("game_package_thumbnail_ids",ids);
                 params.put("game_package_thumbnail_ids",ids);
             }
             }
         }
         }
-        //用户定向
-        if(!Check.isNull(strategy.getAdAudiencePackageId())){
+        //用户定向    定向类型 add-新建定向;choice-选择定向
+        if(!Check.isNull(strategy.getAdAudiencePackageId()) && "choice".equalsIgnoreCase(strategy.getAdDirectionalFlag())){
             params.put("audience_package_id",strategy.getAdAudiencePackageId());
             params.put("audience_package_id",strategy.getAdAudiencePackageId());
         }
         }
         if(!Check.isNull(strategy.getAdDistrict())){
         if(!Check.isNull(strategy.getAdDistrict())){
@@ -830,12 +834,14 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         if(!Check.isNull(strategy.getAdScheduleType())){
         if(!Check.isNull(strategy.getAdScheduleType())){
             params.put("schedule_type",strategy.getAdScheduleType());
             params.put("schedule_type",strategy.getAdScheduleType());
         }
         }
-        if(!Check.isNull(strategy.getAdStartTime())){
-            params.put("start_time",strategy.getAdStartTime());
-        }
-        if(!Check.isNull(strategy.getAdAdjustCpa())){
-            params.put("end_time",strategy.getAdEndTime());
+
+        //总预算 必须设置 起始时间
+        if ("BUDGET_MODE_TOTAL".equalsIgnoreCase(strategy.getAdBudgetMode())){
+            params.put("start_time",strategy.getAdStartTime()+" 00:00");
+            params.put("end_time",strategy.getAdEndTime()+" 00:00");
         }
         }
+
+
         if(!Check.isNull(strategy.getAdScheduleTime())){
         if(!Check.isNull(strategy.getAdScheduleTime())){
             params.put("schedule_time",strategy.getAdScheduleTime());
             params.put("schedule_time",strategy.getAdScheduleTime());
         }
         }
@@ -883,6 +889,7 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
                 adName = adName.replace("{{素材名称}}",info.getMaterialName());
                 adName = adName.replace("{{素材名称}}",info.getMaterialName());
             }
             }
         }
         }
+
         adName = adName.replace("--","-");
         adName = adName.replace("--","-");
         if(adName.startsWith("-")){
         if(adName.startsWith("-")){
             adName = adName.substring(1);
             adName = adName.substring(1);
@@ -895,6 +902,15 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     }
     }
 
 
 
 
+    /**
+     * 创建 组
+     * 如果已有组信息 则 返回组id
+     * 没有则 新建
+     * @param strategy
+     * @param campaignName
+     * @param token
+     * @return
+     */
     private Long getCampaignId(AiBytedanceAdvertiserStrategy strategy, String campaignName,CtopOauthToken token) {
     private Long getCampaignId(AiBytedanceAdvertiserStrategy strategy, String campaignName,CtopOauthToken token) {
         ByteDanceCampaign campaign = campaignService.getOneByParams(strategy.getAccountId(),campaignName);
         ByteDanceCampaign campaign = campaignService.getOneByParams(strategy.getAccountId(),campaignName);
         if(null != campaign){
         if(null != campaign){
@@ -928,13 +944,22 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
 
 
     private String getCampaignName(AiBytedanceAdvertiserStrategy strategy,Long dplinkIndex,String date) {
     private String getCampaignName(AiBytedanceAdvertiserStrategy strategy,Long dplinkIndex,String date) {
         String result = strategy.getCampaignName();
         String result = strategy.getCampaignName();
-        if(null!=dplinkIndex&&dplinkIndex!=0){
+        if(null != dplinkIndex && dplinkIndex !=0){
             String campaignSufix = getRangeIndex(strategy.getDpLinkStartIndex(),strategy.getDpLinkEndIndex(),strategy.getCampaignAdCnt(),dplinkIndex);
             String campaignSufix = getRangeIndex(strategy.getDpLinkStartIndex(),strategy.getDpLinkEndIndex(),strategy.getCampaignAdCnt(),dplinkIndex);
-            result = result+campaignSufix;
+            result = result + campaignSufix;
+        }
+        if(null!=date&&!date.trim().equals("")) {
+            result = result + "-" + date;
+        }
+
+        result = result.replace("--","-");
+        if(result.startsWith("-")){
+            result = result.substring(1);
         }
         }
-        if(null!=date&&!date.trim().equals("")){
-            result = result +"-"+date;
+        if(result.endsWith("-")){
+            result = result.substring(0,result.length()-1);
         }
         }
+        result = result.replace("--","-");
         return result;
         return result;
     }
     }
 
 
@@ -1384,6 +1409,9 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
         //查询定向包信息
         //查询定向包信息
        Result list = marketingService.getAudiencePackage(token,landingType,deliveryRange);
        Result list = marketingService.getAudiencePackage(token,landingType,deliveryRange);
+       if (!list.isSuccess()){
+           return Result.errorMsg(list.getMessage());
+       }
        //处理返回结果
        //处理返回结果
        JSONObject jsonObject = (JSONObject)list.getResult();
        JSONObject jsonObject = (JSONObject)list.getResult();
        JSONArray array = jsonObject.getJSONArray("audience_packages");
        JSONArray array = jsonObject.getJSONArray("audience_packages");
@@ -1459,5 +1487,29 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         return Result.successMsg("定向包创建成功。",list);
         return Result.successMsg("定向包创建成功。",list);
     }
     }
 
 
+    /**
+     *
+     * @description:获取橙子建站站点列表
+     * https://www.chengzijianzhan.com/tetris/page/XXXXXXXXXXXXX/(其中XX是建站ID,拼装后就可获得投放的URL/预览URL)
+     * Android应用下载详情页 当广告计划app_type为"APP_ANDROID"时, 必填
+     * @param accountId
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     */
+    @Override
+    public Result getChengZiSite(String accountId) {
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        Result list = marketingService.getSite(token);
+        if (!list.isSuccess()){
+            return Result.errorMsg(list.getMessage());
+        }
+        JSONArray array =(JSONArray)list.getResult();
+        List<Map<String,Object>> dataList = JSONArray.parseObject(array.toJSONString(),List.class);
+        dataList.forEach(map -> {
+            map.put("creativeWebUrl","https://www.chengzijianzhan.com/tetris/page/"+map.get("siteId"));
+        });
+        return Result.successMsg("获取橙子建站站点列表成功。",dataList);
+    }
+
 
 
 }
 }

+ 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;
 package org.jeecg.modules.bytedance.advertise.service.impl;
 
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.entity.BytedanceVideoSlogenInfo;
 import org.jeecg.modules.bytedance.advertise.mapper.BytedanceVideoSlogenInfoMapper;
 import org.jeecg.modules.bytedance.advertise.mapper.BytedanceVideoSlogenInfoMapper;
 import org.jeecg.modules.bytedance.advertise.service.IBytedanceVideoSlogenInfoService;
 import org.jeecg.modules.bytedance.advertise.service.IBytedanceVideoSlogenInfoService;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 头条视频文案信息
  * 头条视频文案信息
@@ -19,14 +27,19 @@ import java.util.List;
  */
  */
 @Service
 @Service
 public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVideoSlogenInfoMapper, BytedanceVideoSlogenInfo> implements IBytedanceVideoSlogenInfoService {
 public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVideoSlogenInfoMapper, BytedanceVideoSlogenInfo> implements IBytedanceVideoSlogenInfoService {
+    @Resource
+    BytedanceVideoSlogenInfoMapper bytedanceVideoSlogenInfoMapper;
+
     @Override
     @Override
     public void insertSlogans(String videoCode, JSONArray slogans,String userId){
     public void insertSlogans(String videoCode, JSONArray slogans,String userId){
         if(null==slogans||slogans.isEmpty()){
         if(null==slogans||slogans.isEmpty()){
             return;
             return;
         }
         }
         for(int i=0;i<slogans.size();i++){
         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);
             this.save(slogenInfo);
         }
         }
     }
     }
@@ -43,4 +56,53 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
         queryWrapper.orderByDesc("id");
         queryWrapper.orderByDesc("id");
         return this.list(queryWrapper);
         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;
+    }
+}

+ 1 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/entity/vo/ReportCostVo.java

@@ -50,6 +50,7 @@ public class ReportCostVo implements Serializable {
     //环比
     //环比
     private String compare;
     private String compare;
 
 
+    private String createTime;
     private String updateTime;
     private String updateTime;
 
 
     //操作状态
     //操作状态

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

@@ -14,7 +14,8 @@
             convert_num,
             convert_num,
             stat_hour,
             stat_hour,
             stat_datetime,
             stat_datetime,
-            stat_hour AS time
+            stat_hour AS time,
+            create_time
         FROM
         FROM
             ctop_bytedance_report_advertiser_hourly
             ctop_bytedance_report_advertiser_hourly
         WHERE
         WHERE
@@ -40,7 +41,8 @@
             SUM(convert_num) AS convertNum,
             SUM(convert_num) AS convertNum,
             SUM(stat_hour) AS statHour,
             SUM(stat_hour) AS statHour,
             stat_datetime,
             stat_datetime,
-            stat_datetime AS time
+            stat_datetime AS time,
+            create_time
         FROM
         FROM
             ctop_bytedance_report_advertiser_hourly
             ctop_bytedance_report_advertiser_hourly
         WHERE
         WHERE
@@ -58,7 +60,8 @@
         SELECT
         SELECT
             cah.advertiser_id AS accountId,
             cah.advertiser_id AS accountId,
             SUM( cah.cost ) cost,
             SUM( cah.cost ) cost,
-            cua.auth_name AS authName
+            cua.auth_name AS authName,
+            cah.create_time
         FROM
         FROM
             ctop_bytedance_report_advertiser_hourly cah
             ctop_bytedance_report_advertiser_hourly cah
         LEFT JOIN ctop_user_allocation cua ON cah.advertiser_id = cua.account_id
         LEFT JOIN ctop_user_allocation cua ON cah.advertiser_id = cua.account_id
@@ -104,6 +107,7 @@
         sum(cost) AS cost,
         sum(cost) AS cost,
         ad_id,
         ad_id,
         ad_name,
         ad_name,
+        create_time,
         update_time
         update_time
         FROM
         FROM
         ctop_bytedance_report_plan_hourly
         ctop_bytedance_report_plan_hourly

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

@@ -12,15 +12,17 @@
             report.click,
             report.click,
             report.convert_material as convertMaterial,
             report.convert_material as convertMaterial,
             creative.count,
             creative.count,
-            video.material_upload_time as materialUploadTime
+            video.material_upload_time as materialUploadTime,
+            video.poster_url as posterUrl,
+            report.update_time as updateTime
         FROM
         FROM
             ctop_bytedance_report_material_daily report
             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 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
         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
         WHERE
             video.account_id = #{accountId}
             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
         GROUP BY
             report.material_id
             report.material_id
         order by report.cost desc
         order by report.cost desc

+ 16 - 2
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java

@@ -11,6 +11,7 @@ import org.jeecg.modules.bytedance.advertise.entity.ByteDanceAdvertisePlan;
 import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
 import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
 import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrategyMapper;
 import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrategyMapper;
 import org.jeecg.modules.bytedance.advertise.mapper.ByteDanceAdvertisePlanMapper;
 import org.jeecg.modules.bytedance.advertise.mapper.ByteDanceAdvertisePlanMapper;
+import org.jeecg.modules.bytedance.advertise.vo.IndustryVo;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport;
 import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport;
 import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
 import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
@@ -75,6 +76,11 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
 
 
         //当前时间段数据
         //当前时间段数据
         nowCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfo(accountId,startTime,endTime);
         nowCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfo(accountId,startTime,endTime);
+
+        //更新时间
+        List<ReportCostVo> updTimeList = nowCostList.stream().sorted(Comparator.comparing(ReportCostVo::getCreateTime)).collect(Collectors.toList());
+        resultMap.put("updTime",Check.isNull(updTimeList) ? new Date() : updTimeList.get(0).getCreateTime());
+
         //当前阶段 总花费
         //当前阶段 总花费
         double nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
         double nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
         resultMap.put("nowCost", String.format("%.2f", nowCost));
         resultMap.put("nowCost", String.format("%.2f", nowCost));
@@ -89,7 +95,8 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
 
 
         //环比 =(当前花费 - 上阶段花费 )/ 上阶段花费
         //环比 =(当前花费 - 上阶段花费 )/ 上阶段花费
         compare = (nowCost - lastCost) / lastCost;
         compare = (nowCost - lastCost) / lastCost;
-        resultMap.put("compare", Double.isNaN(compare) ? "0" : df.format(compare));
+        //resultMap.put("compare", Double.isNaN(compare) ? "0" : df.format(compare));
+        resultMap.put("compare", Double.isNaN(compare) ? "0" : String.format("%.2f", compare*100));
 
 
         //花费占比 = 花费 / 账户预算
         //花费占比 = 花费 / 账户预算
         //获取账户预算
         //获取账户预算
@@ -125,6 +132,8 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
 
 
         resultMap.put("nowMap", nowMap);
         resultMap.put("nowMap", nowMap);
         resultMap.put("lastMap", lastMap);
         resultMap.put("lastMap", lastMap);
+
+
         return Result.successMsg("成功。",resultMap);
         return Result.successMsg("成功。",resultMap);
     }
     }
 
 
@@ -206,7 +215,12 @@ public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<Byte
                 list.add(vo);
                 list.add(vo);
             });
             });
         }
         }
-         Collections.sort(list,Comparator.comparing(ReportCostVo::getTime));
+        //排序
+        if ("0".equals(daysBetween)){
+            list.sort((ReportCostVo vo1, ReportCostVo vo2) -> Integer.valueOf(vo1.getTime()).compareTo(Integer.valueOf(vo2.getTime())));
+        }else {
+            Collections.sort(list,Comparator.comparing(ReportCostVo::getTime));
+        }
         return list;
         return list;
     }
     }
 
 

+ 17 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceReportMaterialDailyServiceImpl.java

@@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.github.pagehelper.PageInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.report.entity.BytedanceReportMaterialDaily;
 import org.jeecg.modules.bytedance.report.entity.BytedanceReportMaterialDaily;
 import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
 import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
@@ -15,6 +16,8 @@ import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -35,12 +38,19 @@ public class BytedanceReportMaterialDailyServiceImpl extends ServiceImpl<Bytedan
         PageHelper.startPage(pageNum,pageSize);
         PageHelper.startPage(pageNum,pageSize);
         List<Map<String, Object>> dailyReportList = bytedanceReportMaterialDailyMapper.selectMaterialDailyReportByAccountId(accountId, startTime, endTime);
         List<Map<String, Object>> dailyReportList = bytedanceReportMaterialDailyMapper.selectMaterialDailyReportByAccountId(accountId, startTime, endTime);
 
 
+        Date maxUpdateTime = null;
 
 
         for (Map<String, Object> dailyReportMap: dailyReportList) {
         for (Map<String, Object> dailyReportMap: dailyReportList) {
             if(dailyReportMap == null || dailyReportMap.isEmpty()){
             if(dailyReportMap == null || dailyReportMap.isEmpty()){
                 return Result.error("头条视频日报数据为空。");
                 return Result.error("头条视频日报数据为空。");
             }
             }
 
 
+
+
+            if(Check.isNull(maxUpdateTime) || maxUpdateTime.before(DateUtils.str2Date(dailyReportMap.get("updateTime").toString(),new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")))){
+                maxUpdateTime = DateUtils.str2Date(dailyReportMap.get("updateTime").toString(),new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
+            }
+
             if(dailyReportMap.get("count") == null){
             if(dailyReportMap.get("count") == null){
                 dailyReportMap.put("count",0);
                 dailyReportMap.put("count",0);
             }
             }
@@ -77,6 +87,13 @@ public class BytedanceReportMaterialDailyServiceImpl extends ServiceImpl<Bytedan
             }
             }
         }
         }
 
 
+        for (Map<String, Object> dailyReportMap: dailyReportList) {
+            if(!Check.isNull(maxUpdateTime)){
+                dailyReportMap.put("updateTime",maxUpdateTime);
+            }
+
+        }
+
         PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(dailyReportList);
         PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(dailyReportList);
 
 
         return Result.successMsg("数据加载成功。",pageInfo);
         return Result.successMsg("数据加载成功。",pageInfo);

+ 3 - 0
jeecg-boot-bytedance/src/main/resources/bytedance_config.properties

@@ -85,6 +85,9 @@ bytedance_v2_audience_package_get=/2/audience_package/get/
 #\u521B\u5EFA\u5B9A\u5411\u5305
 #\u521B\u5EFA\u5B9A\u5411\u5305
 bytedance_v2_audience_package_create=/2/audience_package/create/
 bytedance_v2_audience_package_create=/2/audience_package/create/
 
 
+#\u83B7\u53D6\u6A59\u5B50\u5EFA\u7AD9\u7AD9\u70B9\u5217\u8868
+bytedance_v2_site_get=/2/tools/site/get/
+
 
 
 
 
 
 

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

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiParam;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.bytedance.advertise.dockapi.MarketingService;
 import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
 import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
 import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
 import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
 import org.jeecg.modules.bytedance.advertise.entity.UpdAdStaOrCpaOrBudget;
 import org.jeecg.modules.bytedance.advertise.entity.UpdAdStaOrCpaOrBudget;
@@ -18,7 +19,9 @@ import org.jeecg.modules.bytedance.advertise.vo.AdConvertQueryVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.PlanSearchVo;
 import org.jeecg.modules.bytedance.advertise.vo.PlanSearchVo;
 import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
 import org.jeecg.modules.bytedance.common.constant.BytedanceConstant;
+import org.jeecg.modules.bytedance.common.entity.CtopOauthToken;
 import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
 import org.jeecg.modules.bytedance.common.entity.MaterialImageInfo;
+import org.jeecg.modules.bytedance.common.service.ICtopOauthTokenService;
 import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
 import org.jeecg.modules.bytedance.common.service.IMaterialImageInfoService;
 import org.jeecg.modules.bytedance.common.utils.*;
 import org.jeecg.modules.bytedance.common.utils.*;
 import org.jeecg.modules.system.service.ISysRoleService;
 import org.jeecg.modules.system.service.ISysRoleService;
@@ -57,6 +60,11 @@ public class AiBytedanceAdvertiserStrategyController {
 	@Autowired
 	@Autowired
 	private IMaterialImageInfoService materialImageInfoService;
 	private IMaterialImageInfoService materialImageInfoService;
 
 
+	@Autowired
+	private MarketingService marketingService;
+	@Autowired
+	private ICtopOauthTokenService tokenService;
+
 
 
 	/**
 	/**
 	  * 分页列表查询
 	  * 分页列表查询
@@ -455,4 +463,24 @@ public class AiBytedanceAdvertiserStrategyController {
 			return Result.error("请求失败,请联系开发人员!");
 			return Result.error("请求失败,请联系开发人员!");
 		}
 		}
 	}
 	}
+
+
+	@ApiOperation(value="获取橙子建站站点列表", notes="获取橙子建站站点列表")
+	@GetMapping(value = "/getChengZiSite")
+	public Result getChengZiSite(@RequestParam("accountId") String accountId) {
+		try {
+			return aiBytedanceAdvertiserStrategyService.getChengZiSite(accountId);
+		}catch (Exception e){
+			log.error("获取橙子建站站点列表异常",e);
+			return Result.error("请求失败,请联系开发人员!");
+		}
+	}
+
+
+
+
+
+
+
+
 }
 }

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

@@ -0,0 +1,304 @@
+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) {
+                byteDanceGeneralCopywriterList.add(new ByteDanceGeneralCopywriter(accountId,textCopywriter));
+            }
+
+            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="投放数据-素材维度展示")
 	@ApiOperation(value="投放数据-素材维度展示", notes="投放数据-素材维度展示")
 	@GetMapping(value = "/selectMaterialDailyReport")
 	@GetMapping(value = "/selectMaterialDailyReport")
 	public Result selectMaterialDailyReport(@RequestParam("accountId") String accountId,
 	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 = "pageNum",defaultValue = "1") Integer pageNum,
 					@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
 					@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
 		try {
 		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;
+	}
+}