소스 검색

文案库编辑、删除,计划优化审核建议相关功能

huangxuechao 4 년 전
부모
커밋
73c488882e
29개의 변경된 파일660개의 추가작업 그리고 58개의 파일을 삭제
  1. 27 0
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
  2. 10 5
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java
  3. 25 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceMaterialRejectReason.java
  4. 20 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedancePlanRejectReason.java
  5. 8 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceVideoSlogenInfo.java
  6. 19 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/LowQualityRejectReason.java
  7. 3 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/ByteDanceGeneralCopywriterMapper.java
  8. 17 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedanceMaterialRejectReasonMapper.java
  9. 14 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedancePlanRejectReasonMapper.java
  10. 3 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedanceVideoSlogenInfoMapper.java
  11. 15 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/LowQualityRejectReasonMapper.java
  12. 10 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/ByteDanceGeneralCopywriterMapper.xml
  13. 14 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedanceMaterialRejectReasonMapper.xml
  14. 9 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedancePlanRejectReasonMapper.xml
  15. 16 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/BytedanceVideoSlogenInfoMapper.xml
  16. 9 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/LowQualityRejectReasonMapper.xml
  17. 19 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/BytedanceRejectReasonService.java
  18. 2 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceAdvertisePlanService.java
  19. 0 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceCreativeService.java
  20. 5 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceGeneralCopywriterService.java
  21. 3 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IBytedanceVideoSlogenInfoService.java
  22. 7 4
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
  23. 14 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/ByteDanceAdvertisePlanServiceImpl.java
  24. 7 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/ByteDanceGeneralCopywriterServiceImpl.java
  25. 84 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/BytedanceRejectReasonServiceImpl.java
  26. 6 2
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/BytedanceVideoSlogenInfoServiceImpl.java
  27. 95 14
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceGeneralCopywriterController.java
  28. 116 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceRejectReasonController.java
  29. 83 22
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceVideoSlogenInfoController.java

+ 27 - 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -640,4 +640,31 @@ public class DateUtils extends PropertyEditorSupport {
         return calendar.get(Calendar.YEAR);
     }
 
+    public static String addDay(String dateString, int day) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = null;
+        try {
+            date = sdf.parse(dateString);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_YEAR, day);
+        return sdf.format(calendar.getTime());
+    }
+
+    public static Date addDay(Date date, int day) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.DAY_OF_YEAR, day);
+        return calendar.getTime();
+    }
+
+    public static Date addHour(Date date, int hour) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        calendar.add(Calendar.HOUR_OF_DAY, hour);
+        return calendar.getTime();
+    }
 }

+ 10 - 5
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/dockapi/MarketingServiceImpl.java

@@ -425,24 +425,29 @@ public class MarketingServiceImpl implements MarketingService{
      * @author: zianY
      */
     @Override
-    public  Result getRejectReason(CtopOauthToken token, String advertiserId, List<String> adIds) {
+    public Result getRejectReason(CtopOauthToken token, String advertiserId, List<String> adIds) {
         JSONObject params = new JSONObject();
         params.put("advertiser_id", advertiserId);
         params.put("ad_ids", adIds);
 
         JSONObject jsonObject = HttpUtils.bytedanceGetRequest(token.getAccessToken(),
-                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_create_reasion"),params);
+                urlPath + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_ad_create_reasion"), params);
         Integer code = jsonObject.getInteger("code");
         if (null == code || !code.equals(0)) {
-            log.info("获取广告主计划审核建议接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
-            return Result.error("获取广告主计划审核建议接口异常");
+//            log.info("获取广告主计划审核建议接口异常==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
+            if (jsonObject.getString("message").toString().contains("ad_ids:[")) {
+                JSONArray ad_ids = JSONArray.parseArray(jsonObject.getString("message").toString().split(":")[2]);
+                adIds.removeAll(ad_ids.toJavaList(String.class));
+                return getRejectReason(token, advertiserId, adIds);
+            }
+            return Result.error("获取广告主计划审核建议接口异常==》message:"+jsonObject.getString("message"));
         }
         JSONArray data = jsonObject.getJSONObject("data").getJSONArray("list");
         if (null == data || data.isEmpty()) {
             log.info("获取广告主计划审核建议不存在==》accountId:{},message:{}", token.getAccountId(), jsonObject.getString("message"));
             return Result.error("获取广告主计划审核建议不存在");
         }
-        return Result.successMsg("获取广告主计划审核建议成功。",data);
+        return Result.successMsg("获取广告主计划审核建议成功。", data);
     }
 
 

+ 25 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedanceMaterialRejectReason.java

@@ -0,0 +1,25 @@
+package org.jeecg.modules.bytedance.advertise.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+@Data
+@TableName("ctop_bytedance_material_reject_reason")
+public class BytedanceMaterialRejectReason {
+    private Long id;
+
+    private String videoId;
+
+    private String imageId;
+
+    private String title;
+
+    private Integer materialType;
+
+    private String rejectReason;
+
+    private Integer isLowQuality;
+
+    private Date createTime;
+}

+ 20 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/BytedancePlanRejectReason.java

@@ -0,0 +1,20 @@
+package org.jeecg.modules.bytedance.advertise.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+@Data
+@TableName("ctop_bytedance_plan_reject_reason")
+public class BytedancePlanRejectReason {
+    private Long adId;
+
+    private String rejectItem;
+
+    private String rejectReason;
+
+    private Integer isLowQuality;
+
+    private Date createTime;
+
+}

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

@@ -1,11 +1,13 @@
 package org.jeecg.modules.bytedance.advertise.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * 头条视频文案信息
@@ -22,8 +24,14 @@ public class BytedanceVideoSlogenInfo {
 	private Long id;
 	/**videoCode*/
 	private String videoCode;
+	@TableField(exist=false)
+	private String materialName;
+	@TableField(exist=false)
+	private List<String> materialNameArray;
 	/**slogan*/
 	private String slogan;
+	@TableField(exist=false)
+	private String newSlogan;
 	/**createTime*/
 	private Date createTime;
 	/**updateTime*/

+ 19 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/LowQualityRejectReason.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.bytedance.advertise.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+@TableName("ctop_low_quality_reject_reason")
+public class LowQualityRejectReason {
+    private Integer id;
+
+    private String auditRejectReason;
+
+    private Integer status;
+
+    private Date createTime;
+}

+ 3 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/ByteDanceGeneralCopywriterMapper.java

@@ -15,9 +15,11 @@ import java.util.Map;
  * @version V1.0
  */
 public interface ByteDanceGeneralCopywriterMapper extends BaseMapper<ByteDanceGeneralCopywriter> {
-    List<Map<String,Object>> selectGeneralCopywriterReport(List<String> accountIds, String keyWord, String startTime, String endTime);
+    List<Map<String,Object>> selectGeneralCopywriterReport(List<String> accountIds, String keyWord, Integer status, String startTime, String endTime);
 
     ByteDanceCreativeWordPackage selectCreativeWordPackageByName(String name);
 
     ByteDanceGeneralCopywriter getRandOne(@Param(value = "accountId") Long accountId);
+
+    List<ByteDanceGeneralCopywriter> selectAllDataByTextCopywriter(@Param(value = "textCopywriter") String textCopywriter);
 }

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

@@ -0,0 +1,17 @@
+package org.jeecg.modules.bytedance.advertise.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.advertise.entity.BytedanceMaterialRejectReason;
+
+
+/**
+ * 头条视频文案信息
+ * @author jeecg-boot
+ * 2021-04-19
+ * @version V1.0
+ */
+public interface BytedanceMaterialRejectReasonMapper extends BaseMapper<BytedanceMaterialRejectReason> {
+    void replaceIntoDb(BytedanceMaterialRejectReason bytedanceMaterialRejectReason);
+
+    Integer getIsLowQualityByVideoId(String video);
+}

+ 14 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/BytedancePlanRejectReasonMapper.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.bytedance.advertise.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.advertise.entity.BytedancePlanRejectReason;
+
+/**
+ * 头条视频文案信息
+ * @author jeecg-boot
+ * 2021-04-19
+ * @version V1.0
+ */
+public interface BytedancePlanRejectReasonMapper extends BaseMapper<BytedancePlanRejectReason> {
+    void replaceIntoDb(BytedancePlanRejectReason bytedancePlanRejectReason);
+}

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

@@ -14,6 +14,8 @@ import java.util.Map;
  * @version V1.0
  */
 public interface BytedanceVideoSlogenInfoMapper extends BaseMapper<BytedanceVideoSlogenInfo> {
-    List<Map<String,Object>> selectVideoSlogenReportByAccountIdAndTitle(List<String> projectIds, String keyWord, String startTime, String endTime);
+    List<Map<String,Object>> selectVideoSlogenReportByAccountIdAndTitle(List<String> projectIds, String keyWord, Integer status, String startTime, String endTime);
     List<String> getProjectByUserId(String userId);
+
+    List<BytedanceVideoSlogenInfo> getDataBySlogenAndProjectId(String slogan, Long projectId);
 }

+ 15 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/LowQualityRejectReasonMapper.java

@@ -0,0 +1,15 @@
+package org.jeecg.modules.bytedance.advertise.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.bytedance.advertise.entity.LowQualityRejectReason;
+
+
+/**
+ * 头条视频文案信息
+ * @author jeecg-boot
+ * 2021-04-19
+ * @version V1.0
+ */
+public interface LowQualityRejectReasonMapper extends BaseMapper<LowQualityRejectReason> {
+    LowQualityRejectReason getByRejectReason(String rejectReason);
+}

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

@@ -7,6 +7,8 @@
 
 
         SELECT
+            a.id,
+            a.status,
             a.account_id as accountId,
             d.creative_id as creativeId,
             a.text_copywriter AS textCopywriter,
@@ -20,7 +22,8 @@
         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
-            a.`status` = 0
+            1 = 1
+            <if test="status!=null">and a.`status` = #{status}</if>
             <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>
@@ -41,6 +44,11 @@
     </select>
     <select id="getRandOne"
             resultType="org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter">
-        select * from ctop_bytedance_general_copywriter where account_id = #{accountId} order by rand() limit 1
+        select * from ctop_bytedance_general_copywriter where status = 1 and account_id = #{accountId} order by rand() limit 1
+    </select>
+
+    <select id="selectAllDataByTextCopywriter" resultType="org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter">
+        select * from ctop_bytedance_general_copywriter where text_copywriter = #{textCopywriter}
+
     </select>
 </mapper>

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

@@ -0,0 +1,14 @@
+<?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.BytedanceMaterialRejectReasonMapper">
+<insert id="replaceIntoDb" parameterType="org.jeecg.modules.bytedance.advertise.entity.BytedanceMaterialRejectReason">
+
+    insert into ctop_bytedance_material_reject_reason (material_type,reject_reason,image_id,video_id,title,is_low_quality) values (#{materialType},#{rejectReason},#{imageId},#{videoId},#{title},#{isLowQuality})
+</insert>
+
+    <select id="getIsLowQualityByVideoId" resultType="integer">
+
+        select distinct is_low_quality from ctop_bytedance_material_reject_reason where video_id = #{videoId} limit 1
+    </select>
+
+</mapper>

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

@@ -0,0 +1,9 @@
+<?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.BytedancePlanRejectReasonMapper">
+
+<insert id="replaceIntoDb" parameterType="org.jeecg.modules.bytedance.advertise.entity.BytedancePlanRejectReason">
+    replace into ctop_bytedance_plan_reject_reason (ad_id,reject_item,reject_reason,is_low_quality) values (#{adId},#{rejectItem},#{rejectReason},#{isLowQuality})
+
+</insert>
+</mapper>

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

@@ -4,6 +4,8 @@
     <select id="selectVideoSlogenReportByAccountIdAndTitle" resultType="java.util.HashMap">
 
         SELECT
+            a.id,
+            a.status,
             a.slogan,
             a.project_id AS projectId,
             count(*) AS count,
@@ -82,12 +84,13 @@
         AND a.video_code = b.signature
         LEFT JOIN ctop_bytedance_report_creative_daily d ON b.id = d.creative_id
         WHERE
-        a.`status` = 1
+        1=1
+        <if test="status!=null">and a.status = #{status}</if>
         <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;=
+        <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>
         <if test="projectIds!=null">
@@ -113,4 +116,15 @@
             member.user_id = #{userId}
     </select>
 
+
+    <select id="getDataBySlogenAndProjectId" resultType="org.jeecg.modules.bytedance.advertise.entity.BytedanceVideoSlogenInfo">
+    SELECT
+        t1.*,t2.material_name
+    FROM
+        ctop_bytedance_video_slogen_info t1
+    LEFT JOIN ctop_material_info t2 ON t1.video_code = t2.code
+    AND t1.project_id = t2.project_id
+    WHERE
+        slogan =#{slogan} and t1.project_id = #{projectId}
+    </select>
 </mapper>

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

@@ -0,0 +1,9 @@
+<?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.LowQualityRejectReasonMapper">
+
+    <select id="getByRejectReason" resultType="org.jeecg.modules.bytedance.advertise.entity.LowQualityRejectReason">
+
+        select * from ctop_low_quality_reject_reason where status = 0 and audit_reject_reason =#{rejectReason}
+    </select>
+</mapper>

+ 19 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/BytedanceRejectReasonService.java

@@ -0,0 +1,19 @@
+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;
+
+/**
+ * 头条视频文案信息
+ * @author jeecg-boot
+ * 2021-04-19
+ * @version V1.0
+ */
+public interface BytedanceRejectReasonService {
+
+     void saveRejectReasonToDb(JSONArray jsonArray);
+}

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

@@ -37,6 +37,8 @@ public interface IByteDanceAdvertisePlanService extends IService<ByteDanceAdvert
 
     List<ByteDanceAdvertisePlan> getAllPlans(Long accountId,String createDate);
 
+    List<ByteDanceAdvertisePlan> getAllPlansByAccountId(Long accountId,String adModifyTime);
+
     int queryToDayBuiltCount(Long accountId);
 
     Integer updatePlanOrPackage (ByteDanceAdvertisePlan byteDanceAdvertisePlan);

+ 0 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceCreativeService.java

@@ -19,7 +19,6 @@ public interface IByteDanceCreativeService extends IService<ByteDanceCreative> {
 
     Map<String, Object> getAdvertiserCreative(CtopOauthToken token, String ids, String date);
 
-
     void replaceBatch(List<ByteDanceCreative> creatives);
 
     Map<String, Object> getCreativeDetail(CtopOauthToken token, Long planId);

+ 5 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/IByteDanceGeneralCopywriterService.java

@@ -5,6 +5,8 @@ import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.bytedance.advertise.entity.ByteDanceCreativeWordPackage;
 import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
 
+import java.util.List;
+
 /**
  * 通用文案库
  * @author jeecg-boot
@@ -12,7 +14,9 @@ import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
  * @version V1.0
  */
 public interface IByteDanceGeneralCopywriterService extends IService<ByteDanceGeneralCopywriter> {
-    Result getGeneralCopywriterReport(String userId, String accountId, String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize);
+    Result getGeneralCopywriterReport(String userId, String accountId, String keyWord,Integer status, String startTime, String endTime, Integer pageNum, Integer pageSize);
 
     public ByteDanceCreativeWordPackage selectCreativeWordPackageByName(String name);
+
+    List<ByteDanceGeneralCopywriter> selectAllDataByTextCopywriter(String textCopywriter);
 }

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

@@ -19,5 +19,7 @@ public interface IBytedanceVideoSlogenInfoService extends IService<BytedanceVide
 
     List<BytedanceVideoSlogenInfo> listByParams(String code, Integer status);
 
-    Result getVideoSlogenReport(String userId, String projectId,String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize);
+    Result getVideoSlogenReport(String userId, String projectId,String keyWord,Integer status, String startTime, String endTime, Integer pageNum, Integer pageSize);
+
+    List<BytedanceVideoSlogenInfo> getVideoSlogenBySlogenAndProjectId(String slogen, Long projectId);
 }

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

@@ -12,10 +12,7 @@ import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.bytedance.advertise.dockapi.MarketingService;
 import org.jeecg.modules.bytedance.advertise.entity.*;
 import org.jeecg.modules.bytedance.advertise.enums.BytedanceCreativeMatTypeEnum;
-import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrategyMapper;
-import org.jeecg.modules.bytedance.advertise.mapper.ByteDanceGeneralCopywriterMapper;
-import org.jeecg.modules.bytedance.advertise.mapper.BytedanceAreaInfoMapper;
-import org.jeecg.modules.bytedance.advertise.mapper.RuleDataAccountMapper;
+import org.jeecg.modules.bytedance.advertise.mapper.*;
 import org.jeecg.modules.bytedance.advertise.service.*;
 import org.jeecg.modules.bytedance.advertise.vo.AdConvertQueryVo;
 import org.jeecg.modules.bytedance.advertise.vo.AdGroupSearchVo;
@@ -76,6 +73,8 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
     private MarketingService marketingService;
     @Resource
     ByteDanceGeneralCopywriterMapper byteDanceGeneralCopywriterMapper;
+    @Resource
+    BytedanceMaterialRejectReasonMapper bytedanceMaterialRejectReasonMapper;
     @Override
     public Long createCreative(AiBytedanceAdvertiserStrategy strategy, Integer createType, Long videoCnt, String openUrl) {
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(strategy.getAccountId()+"");
@@ -111,6 +110,10 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         log.info("获取{}视频素材个数:{}=>accountId:{}",BytedanceCreativeMatTypeEnum.getNameByType(createType+""),videoInfos.size(),token.getAccountId());
 
         for (ByteDanceVideoInfo video:videoInfos) {
+            Integer isLowQuality = bytedanceMaterialRejectReasonMapper.getIsLowQualityByVideoId(video.getVid());    //判断次视频是否是低质视频,为1跳过
+            if(1 == isLowQuality){
+                continue;
+            }
             Integer useDplinkIndex = strategy.getDpLinkIndexUsed();
             if(null==useDplinkIndex||useDplinkIndex.equals(0)){
                 AiBytedanceAdDplinkInfo adDplinkInfo = adDplinkInfoService.getlatestDpLinkInfo(strategy.getId(),strategy.getAccountId(),1);

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

@@ -210,6 +210,20 @@ public class ByteDanceAdvertisePlanServiceImpl extends ServiceImpl<ByteDanceAdve
     }
 
     @Override
+    public List<ByteDanceAdvertisePlan> getAllPlansByAccountId(Long accountId,String adModifyTime) {
+        QueryWrapper<ByteDanceAdvertisePlan>queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id",accountId+"");
+        if(null!=adModifyTime&&!"".equals(adModifyTime.trim())){
+            queryWrapper.ge("ad_modify_time",adModifyTime);
+            queryWrapper.le("ad_modify_time",new Date());
+        }
+        queryWrapper.ne("opt_status","AD_STATUS_DELETE");
+        queryWrapper.eq("toutiao_status","AD_STATUS_AUDIT_DENY");
+        queryWrapper.orderByDesc("ad_modify_time");
+        return this.list(queryWrapper);
+    }
+
+    @Override
     public int queryToDayBuiltCount(Long accountId) {
         String date = DateUtil.formatDate(new Date());
         return byteDanceAdvertisePlanMapper.queryTodayBuiltCount(accountId, date);

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

@@ -39,7 +39,7 @@ public class ByteDanceGeneralCopywriterServiceImpl extends ServiceImpl<ByteDance
     IUserAllocationService IUserAllocationService;
 
     @Override
-    public Result getGeneralCopywriterReport(String userId, String accountId, String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize){
+    public Result getGeneralCopywriterReport(String userId, String accountId, String keyWord, Integer status, String startTime, String endTime, Integer pageNum, Integer pageSize){
 
 
         List<String> accountIds = new ArrayList<>();
@@ -62,7 +62,7 @@ public class ByteDanceGeneralCopywriterServiceImpl extends ServiceImpl<ByteDance
 
 
         PageHelper.startPage(pageNum,pageSize);
-        List<Map<String, Object>> generalCopywriteReportList = byteDanceGeneralCopywriterMapper.selectGeneralCopywriterReport(accountIds,keyWord, startTime, endTime);
+        List<Map<String, Object>> generalCopywriteReportList = byteDanceGeneralCopywriterMapper.selectGeneralCopywriterReport(accountIds, keyWord, status, startTime, endTime);
         if(Check.isNull(generalCopywriteReportList)){
             return Result.successMsg("还没有此文案报表数据,请将此文案投放跑量!",generalCopywriteReportList);
         }
@@ -119,4 +119,9 @@ public class ByteDanceGeneralCopywriterServiceImpl extends ServiceImpl<ByteDance
         return byteDanceGeneralCopywriterMapper.selectCreativeWordPackageByName(name);
     }
 
+    @Override
+    public List<ByteDanceGeneralCopywriter> selectAllDataByTextCopywriter(String textCopywriter){
+        return byteDanceGeneralCopywriterMapper.selectAllDataByTextCopywriter(textCopywriter);
+    }
+
 }

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

@@ -0,0 +1,84 @@
+package org.jeecg.modules.bytedance.advertise.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.modules.bytedance.advertise.entity.*;
+import org.jeecg.modules.bytedance.advertise.mapper.BytedanceMaterialRejectReasonMapper;
+import org.jeecg.modules.bytedance.advertise.mapper.BytedancePlanRejectReasonMapper;
+import org.jeecg.modules.bytedance.advertise.mapper.LowQualityRejectReasonMapper;
+import org.jeecg.modules.bytedance.advertise.mapper.RuleDataAccountMapper;
+import org.jeecg.modules.bytedance.advertise.service.BytedanceRejectReasonService;
+import org.jeecg.modules.bytedance.advertise.service.IRuleDataAccountService;
+import org.jeecg.modules.bytedance.common.entity.CtopOauthToken;
+import org.jeecg.modules.bytedance.common.utils.Check;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 规则账户清洗数据
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2020-11-16
+ */
+@Service
+public class BytedanceRejectReasonServiceImpl implements BytedanceRejectReasonService {
+
+    @Resource
+    private BytedancePlanRejectReasonMapper bytedancePlanRejectReasonMapper;
+
+    @Resource
+    private BytedanceMaterialRejectReasonMapper BytedanceMaterialRejectReasonMapper;
+
+    @Resource
+    LowQualityRejectReasonMapper lowQualityRejectReasonMapper;
+    public void saveRejectReasonToDb(JSONArray jsonArray){
+        for(int i=0; i<jsonArray.size(); i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            JSONObject ad_reject = jsonObject.getJSONObject("ad_reject");
+            JSONArray reject_data = ad_reject.getJSONArray("reject_data");
+            if(!Check.isNull(reject_data)){
+                for(int j=0; j<reject_data.size();j++){
+                    JSONObject object = reject_data.getJSONObject(j);
+                    BytedancePlanRejectReason bytedancePlanRejectReason = new BytedancePlanRejectReason();
+                    bytedancePlanRejectReason.setAdId(ad_reject.getLong("ad_id"));
+                    bytedancePlanRejectReason.setRejectItem(object.getString("reject_item"));
+                    bytedancePlanRejectReason.setRejectReason(object.getString("reject_reason"));
+                    LowQualityRejectReason lowQualityRejectReason = lowQualityRejectReasonMapper.getByRejectReason(bytedancePlanRejectReason.getRejectReason());
+                    if(!Check.isNull(lowQualityRejectReason)){
+                        bytedancePlanRejectReason.setIsLowQuality(1);
+                    }
+                    bytedancePlanRejectReasonMapper.replaceIntoDb(bytedancePlanRejectReason);
+                }
+            }
+
+            JSONArray material_reject = jsonObject.getJSONArray("material_reject");
+            if(!Check.isNull(material_reject)){
+                for(int j=0; j<material_reject.size();j++){
+                    JSONObject object = material_reject.getJSONObject(j);
+                    BytedanceMaterialRejectReason bytedanceMaterialRejectReason = new BytedanceMaterialRejectReason();
+                    bytedanceMaterialRejectReason.setMaterialType(object.getInteger("material_type"));
+                    bytedanceMaterialRejectReason.setRejectReason(object.getString("reject_reason"));
+                    LowQualityRejectReason lowQualityRejectReason = lowQualityRejectReasonMapper.getByRejectReason(bytedanceMaterialRejectReason.getRejectReason());
+                    if(!Check.isNull(lowQualityRejectReason)){
+                        bytedanceMaterialRejectReason.setIsLowQuality(1);
+                    }
+                    bytedanceMaterialRejectReason.setTitle(object.getString("title"));
+                    bytedanceMaterialRejectReason.setImageId(object.getJSONArray("image_id").toJSONString());
+                    bytedanceMaterialRejectReason.setVideoId(object.getString("video_id"));
+                    BytedanceMaterialRejectReasonMapper.replaceIntoDb(bytedanceMaterialRejectReason);
+                }
+            }
+        }
+    }
+
+
+}

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

@@ -62,7 +62,7 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
         return this.list(queryWrapper);
     }
     @Override
-    public Result getVideoSlogenReport(String userId, String projectId,String keyWord, String startTime, String endTime, Integer pageNum, Integer pageSize){
+    public Result getVideoSlogenReport(String userId, String projectId,String keyWord,Integer status, String startTime, String endTime, Integer pageNum, Integer pageSize){
 
         List<String> projectIdList = new ArrayList<>();
         //查询普通用户的全量查询,当前用户所有项目
@@ -75,7 +75,7 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
         }
 
         PageHelper.startPage(pageNum,pageSize);
-        List<Map<String, Object>> videoSlogenReportList = bytedanceVideoSlogenInfoMapper.selectVideoSlogenReportByAccountIdAndTitle(projectIdList, keyWord, startTime, endTime);
+        List<Map<String, Object>> videoSlogenReportList = bytedanceVideoSlogenInfoMapper.selectVideoSlogenReportByAccountIdAndTitle(projectIdList, keyWord, status, startTime, endTime);
 
         if(Check.isNull(videoSlogenReportList)){
             return Result.successMsg("还没有此文案报表数据,请将此文案投放跑量!",videoSlogenReportList);
@@ -127,4 +127,8 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
         PageInfo<Map<String, Object>> pageInfo = new PageInfo<Map<String, Object>>(videoSlogenReportList);
         return Result.successMsg("数据加载成功。",pageInfo);
     }
+    @Override
+    public List<BytedanceVideoSlogenInfo> getVideoSlogenBySlogenAndProjectId(String slogen, Long projectId){
+        return bytedanceVideoSlogenInfoMapper.getDataBySlogenAndProjectId(slogen, projectId);
+    }
 }

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

@@ -1,19 +1,21 @@
 package org.jeecg.modules.bytedance.advertise.controller;
 
 import com.alibaba.fastjson.JSON;
+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.common.util.oConvertUtils;
 import org.jeecg.modules.bytedance.advertise.entity.ByteDanceCreativeWordPackage;
 import org.jeecg.modules.bytedance.advertise.entity.ByteDanceGeneralCopywriter;
 import org.jeecg.modules.bytedance.advertise.service.IByteDanceGeneralCopywriterService;
-import org.jeecg.modules.bytedance.advertise.service.impl.ByteDanceGeneralCopywriterServiceImpl;
 import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.common.utils.ExcelUtil;
 import org.jeecg.modules.bytedance.common.utils.StringUtils;
@@ -145,7 +147,9 @@ public class BytedanceGeneralCopywriterController {
                                       @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
+                                      @RequestParam(value = "pageSize", defaultValue="10") Integer pageSize,
+                                      @RequestParam(value = "status",required = false)  Integer status
+
     ) {
         try {
 
@@ -158,7 +162,7 @@ public class BytedanceGeneralCopywriterController {
                 accountId = "admin";	//传递projectId为admin
             }
 
-            return byteDanceGeneralCopywriterService.getGeneralCopywriterReport(userId,accountId,keyWord, startTime,endTime,pageNo,pageSize);
+            return byteDanceGeneralCopywriterService.getGeneralCopywriterReport(userId, accountId, keyWord, status, startTime, endTime, pageNo, pageSize);
         }catch (Exception e){
             log.error("通用文案数据-获取文案维度创意报表数据异常",e);
             return Result.error("请求失败,请联系开发人员!");
@@ -210,20 +214,69 @@ public class BytedanceGeneralCopywriterController {
      * @return
      */
     @ApiOperation(value="通用文案库-编辑", notes="通用文案库-编辑")
-    @PutMapping(value = "/edit")
+    @PostMapping(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 {
+
+        Result<ByteDanceGeneralCopywriter> result = new Result<>();
+        try{
+            ByteDanceGeneralCopywriter byteDanceGeneralCopywriterEntity = byteDanceGeneralCopywriterService.getById(byteDanceGeneralCopywriter.getId());
+            if(byteDanceGeneralCopywriterEntity==null) {
+                return result.error500("未找到对应实体");
+            }
+//            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            byteDanceGeneralCopywriter.setUpdateTime(new Date());
+
+            String title = byteDanceGeneralCopywriter.getTextCopywriter();
+            title = title.trim().replaceAll("[\\{]{2,}", "{");
+            title = title.trim().replaceAll("[\\}]{2,}", "}");
+
+            String reg = "\\{[\\u4e00-\\u9fa5\\-]{2,6}\\}";
+            Pattern pattern = Pattern.compile(reg);
+            Matcher matcher = pattern.matcher(title);
+            JSONArray creativeWordIdsArray = new JSONArray();
+
+            int len = StringUtils.lengthAsSlogan(title);
+            int left = title.indexOf("{");
+            int right = title.indexOf("}");
+            if (left >= 0 || right >= 0) {
+                int times = 0;
+                while (matcher.find()) { //此处find()每次被调用后,会偏移到下一个匹配
+                    times++;
+                    if (times >= 3) {
+                        return result.error500("动态词包不合法,词包数量超过2个");
+                    }
+                    String matchStr = matcher.group();//获取当前匹配的值
+                    title = title.replace(matchStr,"");
+
+                    ByteDanceCreativeWordPackage creativeWordPackage = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(matchStr.substring(1, matchStr.length() - 1));
+                    if (Check.isNull(creativeWordPackage)) {
+                        return result.error500("动态词包不合法,词包不存在或者含有单独的非词包大括号");
+                    }
+                    creativeWordIdsArray.add(creativeWordPackage.getCreativeWordId());
+                    len = len - (right - left) + creativeWordPackage.getMaxWordLen();
+                    left = title.indexOf("{");
+                    right = title.indexOf("}");
+                }
+                if(title.contains("{") || title.contains("}")){
+                    return result.error500("文案含有词包特殊字符,请检查");
+                }
+                byteDanceGeneralCopywriter.setCreativeWordIds(creativeWordIdsArray.toJSONString());
+            }
+            //校验标题长度,长度小于5和大于30的全部过滤
+            if (len < 5 || len > 30) {
+                return result.error500("文案长度不合法,小于5或大于30");
+            }
+
             boolean ok = byteDanceGeneralCopywriterService.updateById(byteDanceGeneralCopywriter);
             if(ok) {
                 result.success("修改成功!");
+                result.setCode(0);
             }
+            return result;
+        } catch (Exception e) {
+            log.error(e.getMessage(),e);
+            return result.error500("操作失败");
         }
-
-        return result;
     }
 
     /**
@@ -234,15 +287,28 @@ public class BytedanceGeneralCopywriterController {
     @ApiOperation(value="通用文案库-通过id删除", notes="通用文案库-通过id删除")
     @DeleteMapping(value = "/delete")
     public Result<?> delete(@RequestParam(name="id") String id) {
+        Result result = new Result();
         try {
-            byteDanceGeneralCopywriterService.removeById(id);
+            ByteDanceGeneralCopywriter generalCopywriter = byteDanceGeneralCopywriterService.getById(id);
+            if(null == generalCopywriter||generalCopywriter.getStatus() == 0){
+                return result.ok("此文案不存在或者已经被删除");
+            }
+            generalCopywriter.setStatus(0);
+            generalCopywriter.setUpdateTime(new Date());
+            boolean ok = byteDanceGeneralCopywriterService.updateById(generalCopywriter);
+            if(ok){
+                result.setMessage("删除成功!");
+                result.setCode(0);
+            }
+            return result;
         } catch (Exception e) {
             log.error("删除失败",e.getMessage());
-            return Result.error("删除失败!");
+            return result.error500("删除失败!");
         }
-        return Result.ok("删除成功!");
+
     }
 
+
     /**
      *  批量删除
      * @param ids
@@ -280,6 +346,21 @@ public class BytedanceGeneralCopywriterController {
         return result;
     }
 
+    @ApiOperation(value="通用文案库-通过id查询", notes="通用文案库-通过id查询")
+    @GetMapping(value = "/queryByTextCopywriter")
+    public Result<List<ByteDanceGeneralCopywriter>> queryByCopywriter(@RequestParam(name="textCopywriter",required=true) String textCopywriter) {
+        Result<List<ByteDanceGeneralCopywriter>> result = new Result<>();
+        List<ByteDanceGeneralCopywriter> byteDanceGeneralCopywriter = byteDanceGeneralCopywriterService.selectAllDataByTextCopywriter(textCopywriter);
+        if(byteDanceGeneralCopywriter==null) {
+            result.error500("未找到对应实体");
+        }else {
+            result.setResult(byteDanceGeneralCopywriter);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+
     /**
      * 导出excel
      *

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

@@ -0,0 +1,116 @@
+package org.jeecg.modules.bytedance.advertise.controller;
+
+import com.alibaba.fastjson.JSONArray;
+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.util.DateUtils;
+import org.jeecg.modules.bytedance.advertise.dockapi.MarketingService;
+import org.jeecg.modules.bytedance.advertise.entity.ByteDanceAdvertisePlan;
+import org.jeecg.modules.bytedance.advertise.service.BytedanceRejectReasonService;
+import org.jeecg.modules.bytedance.advertise.service.IByteDanceAdvertisePlanService;
+import org.jeecg.modules.bytedance.common.entity.CtopOauthToken;
+import org.jeecg.modules.bytedance.common.service.ICtopOauthTokenService;
+import org.jeecg.modules.bytedance.common.utils.Check;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 广告计划审核建议
+ * @author hxc
+ * 2021-06-28
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="广告计划审核建议")
+@RestController
+@RequestMapping("/ctop/bytedanceRejectReason")
+public class BytedanceRejectReasonController {
+
+
+
+    static ExecutorService executorService = Executors.newFixedThreadPool(5);
+    @Autowired
+    MarketingService marketingService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    IByteDanceAdvertisePlanService byteDanceAdvertisePlanService;
+    @Autowired
+    BytedanceRejectReasonService bytedanceRejectReasonService;
+
+    /**
+     *  编辑
+     * @param hour : 获取当前时间近几个小时的数据。根据广告计划表,近hour个小时新增进来的计划信息,更新他们的审核建议
+     * @return
+     */
+    @ApiOperation(value="广告计划审核建议-从接口获取数据落库", notes="广告计划审核建议-从接口获取数据落库")
+    @GetMapping(value = "/getReasonInRecentHours")
+    public Result getReasonInRecentHours(@RequestParam(value = "hour",required = false) Integer hour) {
+        Result result = new Result();
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        if (null == tokens || tokens.isEmpty()) {
+            System.out.println("未获取到token");
+            result.setCode(500);
+            result.setMessage("未获取到token");
+            return result;
+        }
+
+        System.out.println("---------------------------------->>"+tokens.size()+"个token<<----------------------------------");
+
+        tokens.forEach(token -> executorService.submit(()->getRejectReasonByToken(token, hour)));
+
+        System.out.println("---------------------------------->>执行完毕<<----------------------------------");
+
+        return result.success("调用任务已开启");
+    }
+
+
+    public void getRejectReasonByToken(CtopOauthToken token, Integer hour){
+
+            if(token.getAccessTokenExpiresIn().before(new Date())){
+                return;
+            }
+
+//            System.out.println("token没过期+     " +token.getAccountId() );
+
+            List<ByteDanceAdvertisePlan> allPlansByAccountId = byteDanceAdvertisePlanService.getAllPlansByAccountId(token.getAccountId(), Check.isNull(hour)?null:DateUtils.formatDate(DateUtils.addHour(new Date(),-hour),"yyyy-MM-dd HH:mm:ss"));
+
+            if(allPlansByAccountId.size() < 1){
+                return;
+            }
+            System.out.print(allPlansByAccountId.size()+"+");
+            List<String> adids = new ArrayList<>();
+            allPlansByAccountId.forEach(plan -> adids.add(plan.getId().toString()));
+
+
+            while(adids.size() > 10){
+                List<String> mulAdids = adids.subList(0,10);
+//                System.out.println("查询的计划是"+Arrays.toString(mulAdids.toArray()));
+                Result dataListResult = marketingService.getRejectReason(token, token.getAccountId().toString(), mulAdids);
+                if(dataListResult.getMessage().toString().contains("No permission to operate account")){
+                    return;
+                }
+                if(Check.isNull(dataListResult.getResult()) || dataListResult.getCode().equals(500)){
+                    continue;
+                }
+                JSONArray jsonArray = JSONArray.parseArray(dataListResult.getResult().toString());
+//                System.out.println(jsonArray.toJSONString());
+                bytedanceRejectReasonService.saveRejectReasonToDb(jsonArray);
+                adids.removeAll(mulAdids);
+            }
+            Result dataListResult = marketingService.getRejectReason(token, token.getAccountId().toString(), adids);
+            if(Check.isNull(dataListResult.getResult())|| dataListResult.getCode().equals(500)){
+                return;
+            }
+            JSONArray jsonArray = JSONArray.parseArray(dataListResult.getResult().toString());
+//            System.out.println(jsonArray.toJSONString());
+            bytedanceRejectReasonService.saveRejectReasonToDb(jsonArray);
+        }
+
+}

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

@@ -26,10 +26,7 @@ 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.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -67,7 +64,7 @@ public class BytedanceVideoSlogenInfoController {
 																 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
 																 HttpServletRequest req) {
 		Result<IPage<BytedanceVideoSlogenInfo>> result = new Result<>();
-		slogenInfo.setStatus(1);
+//		slogenInfo.setStatus(1);		//默认不传为所有,传了1是正常,传0是已删除
 		QueryWrapper<BytedanceVideoSlogenInfo> queryWrapper = QueryGenerator.initQueryWrapper(slogenInfo, req.getParameterMap());
 		Page<BytedanceVideoSlogenInfo> page = new Page<>(pageNo, pageSize);
 		IPage<BytedanceVideoSlogenInfo> pageList = bytedanceVideoSlogenInfoService.page(page, queryWrapper);
@@ -84,7 +81,8 @@ public class BytedanceVideoSlogenInfoController {
 									  @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
+									  @RequestParam(value = "pageSize", defaultValue="10") Integer pageSize,
+									  @RequestParam(value = "status",required = false) Integer status
 									) {
 		try {
 			//查询用户角色
@@ -96,7 +94,7 @@ public class BytedanceVideoSlogenInfoController {
 			if ("admin".equals(roleCode) && Check.isNull(projectId)) {
 				projectId = "admin";	//传递projectId为admin
 			}
-			return bytedanceVideoSlogenInfoService.getVideoSlogenReport(userId, projectId,keyWord, startTime,endTime,pageNo,pageSize);
+			return bytedanceVideoSlogenInfoService.getVideoSlogenReport(userId, projectId,keyWord,status, startTime,endTime,pageNo,pageSize);
 		}catch (Exception e){
 			log.error("指定文案-获取指定文案维度创意报表数据异常",e);
 			return Result.error("请求失败,请联系开发人员!");
@@ -208,18 +206,16 @@ public class BytedanceVideoSlogenInfoController {
 	public Result<BytedanceVideoSlogenInfo> edit(@RequestBody BytedanceVideoSlogenInfo slogenInfo) {
 		Result<BytedanceVideoSlogenInfo> result = new Result<>();
 		try{
-		BytedanceVideoSlogenInfo bytedanceVideoSlogenInfoEntity = bytedanceVideoSlogenInfoService.getById(slogenInfo.getId());
-		if(bytedanceVideoSlogenInfoEntity==null) {
-			result.error500("未找到对应实体");
-			return result;
+			List<BytedanceVideoSlogenInfo> videoSlogenInfoList = bytedanceVideoSlogenInfoService.getVideoSlogenBySlogenAndProjectId(slogenInfo.getSlogan(),slogenInfo.getProjectId());
+		if(videoSlogenInfoList==null) {
+			return result.error500("未找到对应实体");
 		}
-		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		slogenInfo.setUpdateBy(user.getId());
-		slogenInfo.setUpdateTime(new Date());
 
-		String title = slogenInfo.getSlogan();
+
+		String title = slogenInfo.getNewSlogan();
 		title = title.trim().replaceAll("[\\{]{2,}", "{");
 		title = title.trim().replaceAll("[\\}]{2,}", "}");
+		slogenInfo.setNewSlogan(title);
 
 		String reg = "\\{[\\u4e00-\\u9fa5\\-]{2,6}\\}";
 		Pattern pattern = Pattern.compile(reg);
@@ -234,14 +230,14 @@ public class BytedanceVideoSlogenInfoController {
 			while (matcher.find()) { //此处find()每次被调用后,会偏移到下一个匹配
 				times++;
 				if (times >= 3) {
-					return Result.errorMsg("动态词包不合法,词包数量超过2个");
+					return result.error500("动态词包不合法,词包数量超过2个");
 				}
 				String matchStr = matcher.group();//获取当前匹配的值
 				title = title.replace(matchStr,"");
 
 				ByteDanceCreativeWordPackage creativeWordPackage = byteDanceGeneralCopywriterService.selectCreativeWordPackageByName(matchStr.substring(1, matchStr.length() - 1));
 				if (Check.isNull(creativeWordPackage)) {
-					return Result.errorMsg("动态词包不合法,词包不存在或者含有单独的非词包大括号");
+					return result.error500("动态词包不合法,词包不存在或者含有单独的非词包大括号");
 				}
 				creativeWordIdsArray.add(creativeWordPackage.getCreativeWordId());
 				len = len - (right - left) + creativeWordPackage.getMaxWordLen();
@@ -251,16 +247,26 @@ public class BytedanceVideoSlogenInfoController {
 			if(title.contains("{") || title.contains("}")){
 				return result.error500("文案含有词包特殊字符,请检查");
 			}
-			slogenInfo.setCreativeWordIds(creativeWordIdsArray.toJSONString());
 		}
 		//校验标题长度,长度小于5和大于30的全部过滤
 		if (len < 5 || len > 30) {
 			return result.error500("文案长度不合法,小于5或大于30");
 		}
 
-		bytedanceVideoSlogenInfoService.updateById(slogenInfo);
-		result.success("修改成功!");
-		result.setCode(0);
+			LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+			for (BytedanceVideoSlogenInfo videoSlogenInfo:videoSlogenInfoList
+				 ) {
+				videoSlogenInfo.setSlogan(slogenInfo.getNewSlogan());
+				videoSlogenInfo.setUpdateBy(user.getId());
+				videoSlogenInfo.setUpdateTime(new Date());
+				videoSlogenInfo.setCreativeWordIds(creativeWordIdsArray.toJSONString());
+			}
+
+		boolean ok = bytedanceVideoSlogenInfoService.updateBatchById(videoSlogenInfoList);
+			if(ok) {
+				result.success("修改成功!");
+				result.setCode(0);
+			}
 		return result;
 		} catch (Exception e) {
 			log.error(e.getMessage(),e);
@@ -275,7 +281,7 @@ public class BytedanceVideoSlogenInfoController {
 	 * @return
 	 */
 	@ApiOperation(value="头条视频文案信息-通过id删除", notes="头条视频文案信息-通过id删除")
-	@PostMapping(value = "/delete")
+	@DeleteMapping(value = "/delete")
 	public Result<?> delete(@RequestParam(name="id") String id) {
 		try {
 			BytedanceVideoSlogenInfo slogenInfo = bytedanceVideoSlogenInfoService.getById(id);
@@ -293,6 +299,37 @@ public class BytedanceVideoSlogenInfoController {
 			return Result.error("删除失败!");
 		}
 	}
+	/**
+	 *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-通过id删除", notes="头条视频文案信息-通过id删除")
+	@DeleteMapping(value = "/deleteBySlogenAndProjectId")
+	public Result<?> deleteBySlogenAndProjectId(@RequestParam(name="slogan") String slogan, @RequestParam(name="projectId") Long projectId) {
+		try {
+			Result result = new Result();
+			List<BytedanceVideoSlogenInfo> videoSlogenInfoList = bytedanceVideoSlogenInfoService.getVideoSlogenBySlogenAndProjectId(slogan,projectId);
+			if(Check.isNull(videoSlogenInfoList)) {
+				return result.ok("此文案不存在或者已经被删除");
+			}
+			LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+			videoSlogenInfoList.forEach(videoSlogenInfo->{
+				videoSlogenInfo.setStatus(0);
+				videoSlogenInfo.setUpdateTime(new Date());
+				videoSlogenInfo.setCreateBy(user.getId());});
+
+			boolean ok = bytedanceVideoSlogenInfoService.updateBatchById(videoSlogenInfoList);
+			if(ok) {
+				result.success("删除成功!");
+				result.setCode(0);
+			}
+			return result;
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+	}
 
 	/**
 	 * 通过id查询
@@ -312,4 +349,28 @@ public class BytedanceVideoSlogenInfoController {
 		result.setSuccess(true);
 		return result;
 	}
+
+	/**
+	 * 通过slogen和projectId查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条视频文案信息-通过文案内容和项目id查询", notes="头条视频文案信息-通过文案内容和项目id查询")
+	@GetMapping(value = "/queryBySlogenAndProjectId")
+	public Result<BytedanceVideoSlogenInfo> queryBySlogenAndProjectId(@RequestParam(name="slogan") String slogan, @RequestParam(name="projectId") Long projectId) {
+
+		Result<BytedanceVideoSlogenInfo> result = new Result<>();
+		List<BytedanceVideoSlogenInfo> videoSlogenInfoList = bytedanceVideoSlogenInfoService.getVideoSlogenBySlogenAndProjectId(slogan,projectId);
+		if(Check.isNull(videoSlogenInfoList)) {
+			result.error500("未找到对应实体");
+			return result;
+		}
+        List<String> materialNameArray = new ArrayList<>();
+        videoSlogenInfoList.forEach(videoSlogenInfo->materialNameArray.add(videoSlogenInfo.getMaterialName()));
+        BytedanceVideoSlogenInfo bytedanceVideoSlogenInfo = videoSlogenInfoList.get(0);
+        bytedanceVideoSlogenInfo.setMaterialNameArray(materialNameArray);
+		result.setResult(bytedanceVideoSlogenInfo);
+		result.setSuccess(true);
+		return result;
+	}
 }