Bläddra i källkod

Merge branch 'V1.1.2' into test

syh 4 år sedan
förälder
incheckning
90754bccf2
70 ändrade filer med 1843 tillägg och 593 borttagningar
  1. 13 5
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TagInfoController.java
  2. 41 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  3. 30 57
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformFileCtrl.java
  4. 9 38
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformScriptController.java
  5. 21 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/entity/PlatformScript.java
  6. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformMaterialMapper.java
  7. 6 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformScriptMapper.java
  8. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformVideoMapper.java
  9. 6 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformMaterialMapper.xml
  10. 25 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformScriptMapper.xml
  11. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformMaterialService.java
  12. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformScriptService.java
  13. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformVideoService.java
  14. 5 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformOrderServiceImpl.java
  15. 46 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformScriptServiceImpl.java
  16. 15 4
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/util/ApprovalNodeNoticeHandler.java
  17. 18 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/UserImplController.java
  18. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/IWpsFileService.java
  19. 34 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/impl/WpsFileServiceImpl.java
  20. 2 2
      jeecg-boot-module-system/src/main/resources/application-prod.yml
  21. 2 2
      jeecg-boot-module-system/src/main/resources/application-prod2.yml
  22. 5 0
      jeecg-boot-module-system/src/main/resources/application-wps.yml
  23. 44 21
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  24. 7 10
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java
  25. 16 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java
  26. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java
  27. 121 43
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  28. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  29. 12 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  30. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  31. 5 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  32. 24 2
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java
  33. 19 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouActionBarTextJob.java
  34. 24 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java
  35. 22 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouCreateUnitJob.java
  36. 168 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouAdvertiserStrategyController.java
  37. 12 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/KuaiShouMaterialControer.java
  38. 112 58
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountTargetTemplate.java
  39. 190 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAdvertiserStrategy.java
  40. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouAdvertiserStrategyMapper.java
  41. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAccountTargetTemplateMapper.xml
  42. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAdvertiserStrategyMapper.xml
  43. 1 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountTargetTemplateService.java
  44. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAdvertiserStrategyService.java
  45. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouNewCreateCampaign.java
  46. 11 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountTargetTemplateServiceImpl.java
  47. 18 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAdvertiserStrategyServiceImpl.java
  48. 7 5
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouNewCreateCampaignServiceImpl.java
  49. 152 7
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/KuaiShouCreateServiceImpl.java
  50. 13 3
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouGroupTemplateController.java
  51. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupTemplateMapper.java
  52. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTemplateMapper.xml
  53. 1 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouVideoGetMapper.xml
  54. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaishouVideoRelateCreativesMapper.xml
  55. 10 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouGroupTemplateService.java
  56. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouVideoRelateCreativesService.java
  57. 128 141
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupTemplateServiceImpl.java
  58. 0 13
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouProgramCreativeServiceImpl.java
  59. 5 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouVideoRelateCreativesServiceImpl.java
  60. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouVideoEtlInfoServiceImpl.java
  61. 56 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/entity/BytedanceAccountReportTaskRecord.java
  62. 14 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceAccountReportTaskRecordMapper.java
  63. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceAccountReportTaskRecordMapper.xml
  64. 17 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceAccountReportTaskRecordService.java
  65. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceReportService.java
  66. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IReportService.java
  67. 32 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceAccountReportTaskRecordServiceImpl.java
  68. 172 155
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java
  69. 2 2
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceVideoEtlInfoServiceImpl.java
  70. 65 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java

+ 13 - 5
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TagInfoController.java

@@ -44,19 +44,27 @@ public class TagInfoController {
 	  * @return
 	  */
 	 @RequestMapping(value = "/treeList", method = RequestMethod.GET)
-	 public Result<IPage<TagInfo>> list(@RequestParam(defaultValue = "10")Integer pageSize,@RequestParam(defaultValue = "1")Integer pageNo) {
+	 public Result<IPage<TagInfo>> list(@RequestParam (required = false)String tagName,@RequestParam(defaultValue = "10")Integer pageSize,@RequestParam(defaultValue = "1")Integer pageNo,@RequestParam(required = false)Long tagCategoryId,@RequestParam(defaultValue = "1")Integer level) {
 		 Result<IPage<TagInfo>> result = new Result<>();
 		 try {
-			QueryWrapper<TagInfo> query = new QueryWrapper<>();
+		 	QueryWrapper<TagInfo> query = new QueryWrapper<>();
 		 	query.eq("del_flag", CommonConstant.DEL_FLAG_0);
-		 	query.eq("level",1);
+		 	if(null!=level){
+				query.eq("level",level);
+			}
+		 	if(null!=tagCategoryId){
+		 		query.eq("tag_category_id",tagCategoryId);
+		 	}
+			 if(null!=tagName&&!"".equals(tagName)){
+				 query.like("tag_name",tagName);
+			 }
 		 	query.orderByAsc("tag_order");
 		 	Page<TagInfo> page = new Page<>(pageNo, pageSize);
 		 	IPage<TagInfo> pageList = tagInfoService.page(page,query);
 		 	List<TagInfo>recordsLevel1 = pageList.getRecords();
 
-			 List<TagInfo>setRecordsLevel1 = new ArrayList<>();
-			 if(null!=recordsLevel1&&!recordsLevel1.isEmpty()){
+		 	List<TagInfo>setRecordsLevel1 = new ArrayList<>();
+		 	if(null!=recordsLevel1&&!recordsLevel1.isEmpty()){
 		 		for (TagInfo level1tag:recordsLevel1) {
 					if(!level1tag.isLeaf()){
 						//非叶子节点

+ 41 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java

@@ -14,6 +14,8 @@ import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService
 import cn.com.ctop.kuaishou.modules.report.service.IKuaiShouDailyAgentService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
 import cn.com.ctop.toutiao.modules.report.service.*;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -29,11 +31,13 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -94,6 +98,43 @@ public class TestController {
     private IKuaiShouDailyAgentService dailyAgentService;
     @Autowired
     private IKuaishouTemplateService templateService;
+    @Autowired
+    private IBytedanceAccountReportTaskRecordService reportTaskRecordService;
+    @Resource
+    private BytedanceReportMaterialDailyMapper bytedanceReportMaterialDailyMapper;
+
+    @GetMapping("/getBytedanceMatReport")
+    public Map<String,Object>getData(){
+        List<BytedanceAccountReportTaskRecord>  records = reportTaskRecordService.listByParams(100,"ACCOUNT_DAILY");
+        executorService = Executors.newFixedThreadPool(1);
+        CountDownLatch countDownLatch = new CountDownLatch(records.size());
+        records.forEach(record -> executorService.submit(() -> {
+            try {
+//                reportService.getAdvertiserReport(record, CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+//                log.info("账户数据获取完成:account:{},时间:{}-{}",record.getAccountId(),record.getStartDate(),record.getEndDate());
+                bytedanceReportService.bytedanceMaterialReportV2(record);
+                log.info("素材数据获取完成:account:{},时间:{}-{}",record.getAccountId(),record.getStartDate(),record.getEndDate());
+            } catch (Exception e) {
+
+            } finally {
+                countDownLatch.countDown();
+            }
+        }));
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        System.out.println("数据获取完成");
+        bytedanceReportMaterialDailyMapper.updateImageReportCode();
+        bytedanceReportMaterialDailyMapper.updateImageReportProjectId();
+        bytedanceReportMaterialDailyMapper.updateImageReportProjectName();
+        bytedanceReportMaterialDailyMapper.updateImageReportPlaneId();
+        bytedanceReportMaterialDailyMapper.updateImageReportPlaneName();
+        Map<String,Object> result =  new HashMap<>();
+        ResultMapUtils.setResultMap(new HashMap<>(),StatusCode.COMMON_SUCCESS);
+        return result;
+    }
 
 
     @GetMapping(value = "/updateTemplate")

+ 30 - 57
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformFileCtrl.java

@@ -2,18 +2,16 @@ package org.jeecg.modules.orderplatform.controller;
 
 import cn.com.ctop.common.module.utils.CosUtils;
 import com.alibaba.fastjson.JSONObject;
-import com.xxl.job.core.biz.model.ReturnT;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.orderplatform.entity.PlatformMaterial;
+import org.jeecg.modules.orderplatform.entity.PlatformScript;
 import org.jeecg.modules.orderplatform.service.IPlatformMaterialService;
+import org.jeecg.modules.orderplatform.service.IPlatformScriptService;
 import org.jeecg.modules.orderplatform.service.IPlatformVideoService;
+import org.jeecg.modules.orderplatform.util.ApprovalNodeNoticeHandler;
 import org.jeecg.modules.orderplatform.util.OperateRecordHandler;
-import org.jeecg.modules.wps.entity.WpsFile;
-import org.jeecg.modules.wps.service.IWpsFileService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -35,7 +33,7 @@ public class PlatformFileCtrl {
     private IPlatformVideoService platformVideoService;
 
     @Autowired
-    private IWpsFileService wpsFileService;
+    private IPlatformScriptService platformScriptService;
 
     @Autowired
     private IPlatformMaterialService platformMaterialService;
@@ -43,6 +41,9 @@ public class PlatformFileCtrl {
     @Autowired
     private OperateRecordHandler operateRecordHandler;
 
+    @Autowired
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
     /**
      * 新建订单上传附件
      */
@@ -53,7 +54,7 @@ public class PlatformFileCtrl {
         if (file.isEmpty() || !((file.getOriginalFilename().endsWith(".zip") || file.getOriginalFilename().endsWith(".rar") || file.getOriginalFilename().endsWith(".7z")))) {
             result.error500("请上传正确的压缩文件");
         } else {
-            String fileName = projectId + "_" + System.currentTimeMillis()+"_"+file.getOriginalFilename();
+            String fileName = projectId + "_" + System.currentTimeMillis() + "_" + file.getOriginalFilename();
             InputStream inputStream = null;
             try {
                 inputStream = file.getInputStream();
@@ -79,27 +80,26 @@ public class PlatformFileCtrl {
                                        @RequestParam("projectId") Long projectId) {
         Result<Object> result = new Result<>();
         try {
-            LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
             // 脚本上传成功需要返回脚本id,更新物料表,更新完成后去更新脚本库的绑定项目
-            WpsFile wpsFile = wpsFileService.uploadFile(file, user.getId());
-            if (null == wpsFile) {
+            PlatformScript script = platformScriptService.saveScript(file,projectId);
+            if (null == script) {
                 result.error500("脚本上传失败");
                 return result;
             }
             //物料状态->脚本已上传,待审核
-            PlatformMaterial platformMaterial = new PlatformMaterial();
+            PlatformMaterial platformMaterial = platformMaterialService.getById(materialId);
+            if (platformMaterial.getScriptStatus() ==3) {
+                result.error500("数据已更新,请刷新页面");
+                return result;
+            }
             platformMaterial.setId(materialId);
             platformMaterial.setMaterialStatus(2);
             platformMaterial.setScriptStatus(1);
-            platformMaterial.setScriptId(wpsFile.getId());
+            platformMaterial.setScriptId(script.getId());
             boolean save = platformMaterialService.updateById(platformMaterial);
             if (save) {
-                // 更新脚本库的绑定项目
-                wpsFile.setProjectId(projectId);
-                //  Todo 暂时兼容题库
-                wpsFile.setIsScript(0);
-                wpsFileService.updateById(wpsFile);
-                operateRecordHandler.Submit(platformMaterialService.getById(materialId).getMaterialCode(), "SCRIPT");
+                operateRecordHandler.Submit(platformMaterial.getMaterialCode(), "SCRIPT");
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("SCRIPT", platformMaterial.getMaterialCode());
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -107,60 +107,33 @@ public class PlatformFileCtrl {
         return result;
     }
 
-    /**
-     * 剪辑上传视频
-     * Todo 在下单制正式上线后,这个接口会改造
-     */
-/*    @PostMapping("/uploadVideo")
-    public Result<Object> uploadVideoOld(@RequestBody JSONObject requestBody) {
-        Result<Object> result = new Result<>();
-        String videoId = materialInfoService.platformUploadVideo(requestBody);
-        if (videoId.isEmpty()) {
-            result.error500("同步素材库失败,请联系管理员");
-        } else {
-            //物料状态->视频已上传,待审核
-            PlatformMaterial platformMaterial = new PlatformMaterial();
-            platformMaterial.setId(requestBody.getLong("materialId"));
-            platformMaterial.setMaterialStatus(5);
-            platformMaterial.setVideoStatus(1);
-            platformMaterial.setVideoId(videoId);
-            boolean save = platformMaterialService.updateById(platformMaterial);
-            if (save) {
-                operateRecordHandler.Submit(platformMaterialService.getById(requestBody.getString("materialId")).getMaterialCode(), "VIDEO");
-                result.success("同步素材库成功");
-            }
-        }
-        return result;
-    }*/
-
-    /*
-     * 改造上传视频接口,视频上传后会存在下单制视频列表,审核通过后会被写入汇创思拓素材库ctop_material_video_info
-     * 下单制视频列表不会有删除操作,被驳回后标记逻辑删除
-     *  审批通过后视频关联信息被写入ctop_material_video_project、ctop_material_video_author、ctop_material_video_frame
-     *  ctop_material_video_cover、ctop_material_video_tag、ctop_material_video_watermark
-     */
     @PostMapping("/uploadVideo")
-    public Result<Object> uploadVideo(@RequestBody JSONObject requestBody){
+    public Result<Object> uploadVideo(@RequestBody JSONObject requestBody) {
         Result<Object> result = new Result<>();
         //同一个视频不能出现在不同的物料下
-        int repeat=platformMaterialService.queryCountByMaterialAndVideo(requestBody.getString("materialCode"),requestBody.getString("md5"));
-        if(repeat>0){
+        int repeat = platformMaterialService.queryCountByMaterialAndVideo(requestBody.getString("materialCode"), requestBody.getString("md5"));
+        if (repeat > 0) {
             result.error500("视频已被其他物料上传,请重新选择视频");
             return result;
         }
         String videoMd5 = platformVideoService.uploadVideo(requestBody);
-        if(videoMd5.isEmpty()){
+        if (videoMd5.isEmpty()) {
             result.error500("素材视频上传失败,参数为空");
-        }else {
+        } else {
             //物料状态->视频已上传,待审核
-            PlatformMaterial platformMaterial = new PlatformMaterial();
+            PlatformMaterial platformMaterial = platformMaterialService.getById(requestBody.getString("materialId"));
+            if (platformMaterial.getVideoStatus() ==3) {
+                result.error500("数据已更新,请刷新页面");
+                return result;
+            }
             platformMaterial.setId(requestBody.getLong("materialId"));
             platformMaterial.setMaterialStatus(5);
             platformMaterial.setVideoStatus(1);
             platformMaterial.setVideoId(videoMd5);
             boolean save = platformMaterialService.updateById(platformMaterial);
             if (save) {
-                operateRecordHandler.Submit(platformMaterialService.getById(requestBody.getString("materialId")).getMaterialCode(), "VIDEO");
+                operateRecordHandler.Submit(platformMaterial.getMaterialCode(), "VIDEO");
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("VIDEO", platformMaterial.getMaterialCode());
                 result.success("素材视频上传成功");
             }
         }

+ 9 - 38
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformScriptController.java

@@ -1,8 +1,10 @@
 package org.jeecg.modules.orderplatform.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
@@ -19,7 +21,7 @@ import java.util.Arrays;
  */
 @Slf4j
 @RestController
-@RequestMapping("/com.cn/platformScript")
+@RequestMapping("/platformScript")
 public class PlatformScriptController {
 	@Autowired
 	private IPlatformScriptService platformScriptService;
@@ -28,14 +30,12 @@ public class PlatformScriptController {
 	 * 分页列表查询
 	 */
 	@GetMapping(value = "/list")
-	public Result<IPage<PlatformScript>> queryPageList(PlatformScript platformScript,
-													   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-													   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-													   HttpServletRequest req) {
-		Result<IPage<PlatformScript>> result = new Result<>();
-		QueryWrapper<PlatformScript> queryWrapper = QueryGenerator.initQueryWrapper(platformScript, req.getParameterMap());
-		Page<PlatformScript> page = new Page<>(pageNo, pageSize);
-		IPage<PlatformScript> pageList = platformScriptService.page(page, queryWrapper);
+	public Result<PageInfo<JSONObject>> queryPageList(PlatformScript platformScript,
+													  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+													  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize
+													  ) {
+		Result<PageInfo<JSONObject>> result = new Result<>();
+		PageInfo<JSONObject> pageList = platformScriptService.page(platformScript.getProjectId(),platformScript.getName(),platformScript.getCreator(),pageNo,pageSize);
 		result.setSuccess(true);
 		result.setResult(pageList);
 		return result;
@@ -77,35 +77,6 @@ public class PlatformScriptController {
 	}
 
 	/**
-	 * 通过id删除
-	 */
-	@PostMapping(value = "/delete")
-	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
-		try {
-			platformScriptService.removeById(id);
-		} catch (Exception e) {
-			log.error("删除失败",e.getMessage());
-			return Result.error("删除失败!");
-		}
-		return Result.ok("删除成功!");
-	}
-
-	/**
-	 *  批量删除
-	 */
-	@PostMapping(value = "/deleteBatch")
-	public Result<PlatformScript> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		Result<PlatformScript> result = new Result<>();
-		if(ids==null || "".equals(ids.trim())) {
-			result.error500("参数不识别!");
-		}else {
-			this.platformScriptService.removeByIds(Arrays.asList(ids.split(",")));
-			result.success("删除成功!");
-		}
-		return result;
-	}
-
-	/**
 	 * 通过id查询
 	 */
 	@GetMapping(value = "/queryById")

+ 21 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/entity/PlatformScript.java

@@ -14,7 +14,7 @@ import lombok.Data;
 public class PlatformScript {
     
 	/**id*/
-	@TableId(type = IdType.AUTO)
+	@TableId(type = IdType.UUID)
 	private String id;
 	/**name*/
 	private String name;
@@ -25,17 +25,34 @@ public class PlatformScript {
 	/**creator*/
 	private String creator;
 	/**createTime*/
-	private Integer createTime;
+	private Long createTime;
 	/**modifier*/
 	private String modifier;
 	/**modifyTime*/
-	private Integer modifyTime;
+	private Long modifyTime;
 	/**downloadUrl*/
 	private Object downloadUrl;
 	/**projectId*/
-	private Integer projectId;
+	private Long projectId;
 	/**deleted*/
 	private String deleted;
 	/**canDelete*/
 	private String canDelete;
+
+	public PlatformScript(){super();}
+
+	public PlatformScript(String name, int version, int size, String creator,
+				   String modifier, Long createTime, Long modifyTime, String downloadUrl ,Long projectId) {
+		this.name = name;
+		this.version = version;
+		this.size = size;
+		this.creator = creator;
+		this.modifier = modifier;
+		this.createTime = createTime;
+		this.modifyTime = modifyTime;
+		this.downloadUrl = downloadUrl;
+		this.projectId=projectId;
+		this.deleted = "N";
+		this.canDelete = "Y";
+	}
 }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformMaterialMapper.java

@@ -29,7 +29,7 @@ public interface PlatformMaterialMapper extends BaseMapper<PlatformMaterial> {
 
     PlatformMaterial queryByCode(@Param("materialCode") String materialCode);
 
-    int queryCountByMaterialAndVideo(@Param("materialCode") String materialCode,@Param("videoMd5") String videoMd5);
+    int queryCountByMaterialAndVideo(@Param("materialCode") String materialCode, @Param("videoMd5") String videoMd5);
 
     //查询物料相关人员
     JSONObject queryMaterialRelatePersonByMaterialCode(@Param("materialCode") String materialCode);

+ 6 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformScriptMapper.java

@@ -1,11 +1,17 @@
 package org.jeecg.modules.orderplatform.mapper;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.orderplatform.entity.PlatformScript;
 
+import java.util.List;
+
 /**
  * 下单平台关联脚本
  */
 public interface PlatformScriptMapper extends BaseMapper<PlatformScript> {
 
+    List<JSONObject> pageQuery(@Param("projectId") Long projectId,@Param("name") String name,@Param("creator") String creator);
+
 }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformVideoMapper.java

@@ -9,6 +9,6 @@ import org.jeecg.modules.orderplatform.entity.PlatformVideo;
  */
 public interface PlatformVideoMapper extends BaseMapper<PlatformVideo> {
 
-    int deleteByMd5(@Param("md5") String  md5);
+    int deleteByMd5(@Param("md5") String md5);
 
 }

+ 6 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformMaterialMapper.xml

@@ -138,7 +138,7 @@
             t2.download_url as url
         FROM
             ctop_platform_material t1
-            LEFT JOIN wps_file t2 ON t1.script_id = t2.id
+            LEFT JOIN ctop_platform_script t2 ON t1.script_id = t2.id
         where t2.id=#{scriptId}
     </select>
 
@@ -206,15 +206,17 @@
         FROM
             ctop_platform_material t1
                 LEFT JOIN ctop_platform_order t2 ON t1.order_code = t2.order_code
-                LEFT JOIN wps_file t3 ON t1.script_id = t3.id
+                LEFT JOIN ctop_platform_script t3 ON t1.script_id = t3.id
                 LEFT JOIN ctop_platform_video t4 ON t1.video_id = t4.md5
         where t1.material_code=#{materialCode}
+        limit 1
     </select>
 
     <select id="queryOrderRelatePersonByMaterialCode" resultType="com.alibaba.fastjson.JSONObject">
         SELECT
             id AS orderId,
             order_title AS orderTitle,
+            order_advice as orderAdvice,
             t1.design,
             t1.create_by as operator,
             (SELECT realname from sys_user where id=t1.create_by limit 1) as operatorName,
@@ -223,5 +225,6 @@
             ctop_platform_order t1
         WHERE
             order_code = #{orderCode}
+        limit 1
     </select>
-</mapper>
+</mapper>

+ 25 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformScriptMapper.xml

@@ -2,4 +2,29 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.orderplatform.mapper.PlatformScriptMapper">
 
+    <select id="pageQuery" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            t1.id,
+            t1.`name`,
+            t1.size,
+            t1.create_time,
+            FROM_UNIXTIME(CAST(t1.create_time/1000 AS INT)) as createTime,
+            (SELECT realname from sys_user where id=t1.creator limit 1) as creatorName,
+            (SELECT project_name from ctop_project where id=t1.project_id limit 1) as projectName,
+            t2.material_name as materialName
+
+        FROM
+            ctop_platform_script t1
+                LEFT JOIN ctop_platform_material t2 ON t1.id = t2.script_id
+        where t2.material_code is not null
+        <if test="projectId != null">
+            AND t1.project_id= #{projectId}
+        </if>
+        <if test="name != null">
+            AND t1.name like '%${name}%'
+        </if>
+        <if test="creator != null">
+            AND t1.creator = #{creator}
+        </if>
+    </select>
 </mapper>

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformMaterialService.java

@@ -39,7 +39,7 @@ public interface IPlatformMaterialService extends IService<PlatformMaterial> {
     /**
      *  查询上传视频是否出现在其他物料中
      */
-    int queryCountByMaterialAndVideo(String  materialCode, String videoMd5);
+    int queryCountByMaterialAndVideo(String materialCode, String videoMd5);
     /**
      *  同步视频到汇创素材库(包括关联的项目)
      */

+ 7 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformScriptService.java

@@ -1,11 +1,18 @@
 package org.jeecg.modules.orderplatform.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
 import org.jeecg.modules.orderplatform.entity.PlatformScript;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  *  下单平台关联脚本
  */
 public interface IPlatformScriptService extends IService<PlatformScript> {
 
+    PlatformScript saveScript(MultipartFile file ,Long projectId);
+
+    PageInfo<JSONObject> page(Long projectId , String name, String creator, int pageNo, int  pageSize);
+
 }

+ 1 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformVideoService.java

@@ -9,6 +9,6 @@ import org.jeecg.modules.orderplatform.entity.PlatformVideo;
  */
 public interface IPlatformVideoService extends IService<PlatformVideo> {
 
-    String uploadVideo (JSONObject params);
+    String uploadVideo(JSONObject params);
 
 }

+ 5 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformOrderServiceImpl.java

@@ -9,6 +9,7 @@ import org.jeecg.modules.orderplatform.entity.PlatformOrder;
 import org.jeecg.modules.orderplatform.mapper.PlatformOrderMapper;
 import org.jeecg.modules.orderplatform.service.IPlatformMaterialService;
 import org.jeecg.modules.orderplatform.service.IPlatformOrderService;
+import org.jeecg.modules.orderplatform.util.ApprovalNodeNoticeHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -28,6 +29,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
     @Autowired
     PlatformOrderMapper platformOrderMapper;
 
+    @Autowired
+    ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
     @Override
     public boolean generateMaterials(PlatformOrder platformOrder) {
         boolean result=false;
@@ -58,6 +62,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
         if(platformOrder.getMaterialAmount().equals(platformOrder.getMaterialFinishAmount())){
             platformOrder.setOrderStatus(3);
             platformOrder.setOrderFinishTime(DateUtils.getDate());
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("ORDER_END",code);
         }
         return this.updateById(platformOrder);
     }

+ 46 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformScriptServiceImpl.java

@@ -1,10 +1,23 @@
 package org.jeecg.modules.orderplatform.service.impl;
 
+import cn.com.ctop.common.module.utils.CosUtils;
+import cn.com.ctop.common.module.vo.ResFileDTO;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.orderplatform.entity.PlatformScript;
 import org.jeecg.modules.orderplatform.mapper.PlatformScriptMapper;
 import org.jeecg.modules.orderplatform.service.IPlatformScriptService;
+import org.jeecg.modules.wps.service.IWpsFileWatermarkService;
+import org.jeecg.modules.wps.service.IWpsUserAclService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 /**
  * 下单平台关联脚本
@@ -12,4 +25,37 @@ import org.springframework.stereotype.Service;
 @Service
 public class PlatformScriptServiceImpl extends ServiceImpl<PlatformScriptMapper, PlatformScript> implements IPlatformScriptService {
 
+    @Autowired
+    private IWpsUserAclService wpsUserAclService;
+
+    @Autowired
+    private IWpsFileWatermarkService wpsFileWatermarkService;
+
+    @Autowired
+    private PlatformScriptMapper platformScriptMapper;
+
+    @Override
+    public PlatformScript saveScript(MultipartFile file,Long projectId) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        //上传文件到cos
+        ResFileDTO resFileDTO = CosUtils.uploadMultipartFile(file,"script-lib/wps/");
+        //构造下单制脚本库参数
+        PlatformScript script=new PlatformScript(resFileDTO.getFileName(),1,((int) resFileDTO.getFileSize()),
+                user.getId(),user.getId(),System.currentTimeMillis(),System.currentTimeMillis(), resFileDTO.getFileUrl(),projectId);
+        this.save(script);
+        // 处理权限
+        wpsUserAclService.saveUserFileAcl(user.getId(),script.getId());
+        // 处理水印
+        wpsFileWatermarkService.saveWatermark(script.getId());
+
+        return script;
+
+    }
+
+    @Override
+    public PageInfo<JSONObject> page(Long projectId, String name, String creator, int pageNo, int  pageSize) {
+        PageHelper.startPage(pageNo,pageSize);
+        List<JSONObject> result = platformScriptMapper.pageQuery(projectId,name,creator);
+        return new PageInfo<>(result);
+    }
 }

+ 15 - 4
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/util/ApprovalNodeNoticeHandler.java

@@ -90,6 +90,15 @@ public class ApprovalNodeNoticeHandler {
                                 orderRelatePerson.getString("operatorName")));
                 break;
 
+            //订单完结
+            case "ORDER_END":
+                sendWeChat(orderRelatePerson.getString("design"),
+                        String.format("您的订单“%s”物料已全部制作完成,订单已被系统自动完结\n 订单ID:%s\n操作人:%s",
+                                orderRelatePerson.getString("orderTitle"),
+                                orderRelatePerson.getLong("orderId"),
+                                orderRelatePerson.getString("operatorName")));
+                break;
+
             //脚本上传成功,通知运营审核
             case "SCRIPT":
                 sendWeChat(materialRelatePerson.getString("operator"),
@@ -131,21 +140,23 @@ public class ApprovalNodeNoticeHandler {
             //脚本被驳回,通知编导重新上传脚本
             case "REJECT_SCRIPT":
                 sendWeChat(materialRelatePerson.getString("plan"),
-                        String.format("您的脚本“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                        String.format("您的脚本“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s\n驳回原因:%s",
                                 materialRelatePerson.getString("scriptName"),
                                 materialRelatePerson.getString("orderTitle"),
                                 materialRelatePerson.getLong("orderId"),
-                                materialRelatePerson.getString("operatorName")));
+                                materialRelatePerson.getString("operatorName"),
+                                materialRelatePerson.getString("scriptAdvise")));
                 break;
 
             //视频被驳回,通知剪辑重新上传视频
             case "REJECT_VIDEO":
                 sendWeChat(materialRelatePerson.getString("clip"),
-                        String.format("您的视频“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                        String.format("您的视频“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s\n驳回原因:%s",
                                 materialRelatePerson.getString("videoName"),
                                 materialRelatePerson.getString("orderTitle"),
                                 materialRelatePerson.getLong("orderId"),
-                                materialRelatePerson.getString("operatorName")));
+                                materialRelatePerson.getString("operatorName"),
+                                materialRelatePerson.getString("videoAdvise")));
 
         }
     }

+ 18 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/UserImplController.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.wps.controller;
 
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.modules.orderplatform.service.IPlatformScriptService;
 import org.jeecg.modules.wps.base.Response;
 import org.jeecg.modules.wps.dto.FileListDTO;
 import org.jeecg.modules.wps.service.IWpsFileService;
@@ -20,6 +21,7 @@ import java.util.Map;
 @RestController
 @RequestMapping("v1/api/file")
 public class UserImplController{
+
     @Autowired
     private IWpsFileService wpsFileService;
 
@@ -90,4 +92,20 @@ public class UserImplController{
         }
     }
 
+    /**
+     * 通过fileId获取wpsUrl以及token
+     * @param fileId 文件id
+     * @return token(包含url)
+     */
+    @GetMapping("getPlatformScriptViewUrlDbPath")
+    public ResponseEntity<Object> getPlatformScriptViewUrlDbPath(String fileId, String userId){
+        log.info("getViewUrlDbPath:fileId={},userId={}",fileId,userId);
+        Token t = wpsFileService.getPlatformScriptViewUrl(fileId,userId,true);
+        if (t != null){
+            return Response.success(t);
+        }else {
+            return Response.bad("文件不存在或其它异常!");
+        }
+    }
+
 }

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/IWpsFileService.java

@@ -34,6 +34,8 @@ public interface IWpsFileService extends IService<WpsFile> {
 
     Token getViewUrl(String fileUrl, String userId,boolean b);
 
+    Token getPlatformScriptViewUrl(String fileUrl, String userId,boolean b);
+
     List<FileListDTO> getFileList();
 
     Map<String,Object> getFileListByPage(int pageNum,int pageSize);

+ 34 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/impl/WpsFileServiceImpl.java

@@ -14,6 +14,8 @@ import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.orderplatform.entity.PlatformScript;
+import org.jeecg.modules.orderplatform.service.IPlatformScriptService;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.jeecg.modules.wps.config.Context;
 import org.jeecg.modules.wps.dto.*;
@@ -54,6 +56,8 @@ public class WpsFileServiceImpl extends ServiceImpl<WpsFileMapper, WpsFile> impl
     private WpsUtil wpsUtil;
     @Autowired
     private ISysUserService sysUserService;
+    @Autowired
+    private IPlatformScriptService platformScriptService;
 
     private static final String OSS_URL_PREFIX = "https://ctop-media.oss-cn-beijing.aliyuncs.com/script-lib/wps/";
     @Override
@@ -117,6 +121,36 @@ public class WpsFileServiceImpl extends ServiceImpl<WpsFileMapper, WpsFile> impl
     }
 
     @Override
+    public Token getPlatformScriptViewUrl(String fileId, String userId, boolean checkToken) {
+        PlatformScript fileEntity = platformScriptService.getById(fileId);
+        if (fileEntity != null){
+            Token t = new Token();
+            String fileName = fileEntity.getName();
+            String fileType = FileUtil.getFileTypeByName(fileName);
+
+            UUID randomUuid = UUID.randomUUID();
+            String uuid = randomUuid.toString().replace("-","");
+
+            Map<String,String> values = new HashMap<>();
+            values.put("_w_appid", WpsUtil.appid);
+            if (checkToken){
+                values.put("_w_tokentype","1");
+            }
+            values.put("_w_filepath",fileName);
+            values.put("_w_userid", userId);
+            values.put("_w_filetype","db");
+
+            String wpsUrl = wpsUtil.getWpsUrl(values,fileType,fileEntity.getId());
+            t.setToken(uuid);
+            t.setExpires_in(600);
+            t.setWpsUrl(wpsUrl);
+
+            return t;
+        }
+        return null;
+    }
+
+    @Override
     public Map<String,Object> getFileInfo(String userId, String filePath,String fileType,String fileId){
         if ("web".equalsIgnoreCase(fileType)){
             return getWebFileInfo(filePath);

+ 2 - 2
jeecg-boot-module-system/src/main/resources/application-prod.yml

@@ -259,5 +259,5 @@ bytedance:
     advertiser-fund-daily-stat: /2/advertiser/fund/daily_stat/
 ai:
   callback:
-    callback-unit-url: http://192.168.1.193:31012/ai_callback_add_group
-    callback-creative-url: http://192.168.1.193:31012/ai_callback_add_creative
+    callback-unit-url: http://139.186.27.96:31012/ai_callback_add_group
+    callback-creative-url: http://139.186.27.96:31012/ai_callback_add_creative

+ 2 - 2
jeecg-boot-module-system/src/main/resources/application-prod2.yml

@@ -251,5 +251,5 @@ bytedance:
     advertiser-fund-daily-stat: /2/advertiser/fund/daily_stat/
 ai:
   callback:
-    callback-unit-url: http://192.168.1.193:31012/ai_callback_add_group
-    callback-creative-url: http://192.168.1.193:31012/ai_callback_add_creative
+    callback-unit-url: http://139.186.27.96:31012/ai_callback_add_group
+    callback-creative-url: http://139.186.27.96:31012/ai_callback_add_creative

+ 5 - 0
jeecg-boot-module-system/src/main/resources/application-wps.yml

@@ -95,6 +95,11 @@ spring:
         # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
+#        master:
+#          url: jdbc:mysql://139.186.151.174:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true
+#          username: hcst
+#          password: hcst@2020
+#          driver-class-name: com.mysql.jdbc.Driver
         master:
           url: jdbc:mysql://139.186.27.96:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
           username: data

+ 44 - 21
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -21,6 +21,8 @@ import cn.com.ctop.oa.modules.service.IWechatCheckinDataService;
 import cn.com.ctop.oa.modules.service.IWechatNoListService;
 import cn.com.ctop.oa.modules.service.IWechatUserListService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
 import cn.com.ctop.toutiao.modules.report.service.*;
 import com.alibaba.fastjson.JSONArray;
 import lombok.extern.slf4j.Slf4j;
@@ -28,11 +30,13 @@ import org.apache.catalina.User;
 import org.jeecg.common.util.DateUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -388,16 +392,35 @@ public class SampleTest {
     @Autowired
     private IRuleKuaiShouPlanService ruleKuaiShouPlanService;
 
+    @Autowired
+    private IBytedanceAccountReportTaskRecordService reportTaskRecordService;
     @Test
     public void execute() {
-        List<UserAllocation>  allocations = allocationService.getByMediaId("3");
+        List<UserAllocation>  allocations = allocationService.listByMediaId("3",0);
         for (UserAllocation allocation:allocations) {
-            CtopOauthToken token = tokenService.getTokenByAccountId(allocation.getAccountId());
-//            load12Data(token);
-            load12AccountData(token);
+            BytedanceAccountReportTaskRecord reportTaskRecord1 = new BytedanceAccountReportTaskRecord(allocation.getAccountId(),"2020-10-01","2020-10-31");
+            reportTaskRecordService.save(reportTaskRecord1);
+            BytedanceAccountReportTaskRecord reportTaskRecord2 = new BytedanceAccountReportTaskRecord(allocation.getAccountId(),"2020-11-01","2020-11-30");
+            reportTaskRecordService.save(reportTaskRecord2);
+            BytedanceAccountReportTaskRecord reportTaskRecord3 = new BytedanceAccountReportTaskRecord(allocation.getAccountId(),"2020-12-01","2020-12-31");
+            reportTaskRecordService.save(reportTaskRecord3);
         }
     }
 
+    @Test
+    public void loadBDAccoutData() {
+        CtopOauthToken token2 = tokenService.getTokenByAccountId(1674206482908163L);
+        bytedanceReportService.bytedanceMaterialReport(token2, "2020-10-14", "2020-10-14");
+        bytedanceReportMaterialDailyMapper.updateImageReportCode();
+        bytedanceReportMaterialDailyMapper.updateImageReportProjectId();
+        bytedanceReportMaterialDailyMapper.updateImageReportProjectName();
+        bytedanceReportMaterialDailyMapper.updateImageReportPlaneId();
+        bytedanceReportMaterialDailyMapper.updateImageReportPlaneName();
+    }
+
+    @Resource
+    private BytedanceReportMaterialDailyMapper bytedanceReportMaterialDailyMapper;
+
     private void load12AccountData(CtopOauthToken token) {
         reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-10-01", "yyyy-MM-dd"), DateUtils.parseDate("2020-10-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-11-01", "yyyy-MM-dd"), DateUtils.parseDate("2020-11-30", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
@@ -405,13 +428,10 @@ public class SampleTest {
     }
 
     private void load12Data(CtopOauthToken token) {
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-01", "2020-10-05");
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-06", "2020-10-10");
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-11", "2020-10-15");
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-16", "2020-10-20");
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-21", "2020-10-25");
-//        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-26", "2020-10-31");
-        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-03", "2020-10-04");
+        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-11", "2020-10-13");
+        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-14", "2020-10-16");
+        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-17", "2020-10-19");
+        bytedanceReportService.bytedanceMaterialReport(token, "2020-10-20", "2020-10-21");
     }
 
     @Autowired
@@ -481,20 +501,23 @@ public class SampleTest {
 //        if (null == accountTargetTemplates || accountTargetTemplates.isEmpty()) {
 //            return;
 //        }
-        AiKuaishouAccountTargetTemplate accountTargetTemplate1 = aiKuaishouAccountTargetTemplateService.getById(30002);
-        aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(accountTargetTemplate1);
+//        for (AiKuaishouAccountTargetTemplate template:accountTargetTemplates){
+//            if(template.getAccountId()!=9556344L){
+//                AiKuaishouAccountTargetTemplate accountTargetTemplate2 = aiKuaishouAccountTargetTemplateService.getByAccountId(template.getAccountId());
+//                aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(accountTargetTemplate2,50);
+//            }
+//        }
 
-        AiKuaishouAccountTargetTemplate accountTargetTemplate2 = aiKuaishouAccountTargetTemplateService.getById(30001);
-        aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(accountTargetTemplate2);
+        AiKuaishouAccountTargetTemplate accountTargetTemplate2 = aiKuaishouAccountTargetTemplateService.getById(120001);
+        aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(accountTargetTemplate2,1);
     }
 
+    @Autowired
+    private IBytedancePlanDailyReportService planDailyReportService;
+
     @Test
     public void etlKuaishouProjectData(){
-        String dateString = "2020-03-17";
-        Date startDate = DateUtils.parseDate(dateString,"yyyy-MM-dd");
-        for(int i=0;i<=365;i++){
-            Date getDate = DateUtils.addDay(startDate,i);
-            kuaishouVideoEtlInfoService.etlKuaishouVideoInfoGroupByProjectId(getDate);
-        }
+        CtopOauthToken token = tokenService.getTokenByAccountId(1660666858777607L);
+        reportService.getAdvertiserPlanReport(token,DateUtils.parseDate("2021-01-25","yyyy-MM-dd"),DateUtils.parseDate("2021-01-25","yyyy-MM-dd"),CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
     }
 }

+ 7 - 10
module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java

@@ -68,16 +68,13 @@ public class MatchLogic {
                         return value.equals(thresholds.get(0));
                     } else if ("not_equal".equals(condition)) {
                         return !value.equals(thresholds.get(0));
-                    }
-                    for (String thro : thresholds) {
-                        if ("contain".equals(condition)) {
-                            if (value.contains(thro)) {
-                                return true;
-                            }
-                        } else if ("no_contain".equals(condition)) {
-                            if (!value.contains(thro)) {
-                                return true;
-                            }
+                    } else if ("contain".equals(condition)) {
+                        if (thresholds.toString().contains(value)) {
+                            return true;
+                        }
+                    } else if ("no_contain".equals(condition)) {
+                        if (!thresholds.toString().contains(value)) {
+                            return true;
                         }
                     }
                 } else {

+ 16 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java

@@ -49,6 +49,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * 规则组
@@ -71,6 +73,7 @@ public class RuleGroupController {
     @Autowired
     private IRuleTemplateService ruleTemplateService;
 
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
 
     /**
      * 创建规则组
@@ -210,6 +213,19 @@ public class RuleGroupController {
         return result;
     }
 
+    @GetMapping(value = "/checkRulesByAccountId")
+    public Result<RuleGroup> checkRulesByAccountId(Long accountId) {
+        Result<RuleGroup> result = new Result<>();
+        try {
+            executorService.submit(() -> ruleGroupService.checkRulesByAccountId(accountId));
+            result.success("成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
     /**
      * 编辑
      *

+ 2 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java

@@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IRuleGroupService extends IService<RuleGroup> {
 
+    public void checkRulesByAccountId(Long accountId);
+
     void checkRules();
 
     JSONObject createRuleGroup(JSONObject requestJson);

+ 121 - 43
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java

@@ -111,37 +111,67 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
     static ExecutorService executorService = Executors.newFixedThreadPool(5);
 
     @Override
-    public void checkRules() {
-        log.info("------start------");
-        Long startTime = System.currentTimeMillis();
-        //查询账户绑定过的规则模板
-        Map<String, Object> map = new HashMap<>();
-        //0状态为启动
-        map.put("template_status", 0);
-        List<RuleAccountTemplate> ruleAccountTemplates = ruleAccountTemplateMapper.selectByMap(map);
-        if (Check.isNull(ruleAccountTemplates)) {
-            log.error("查询账户绑定过的规则模板失败");
-            return;
-        }
-        //获取规则集
-        Map<Long, Object> ruleGroupMap = getRuleGroupMap();
-        if (Check.isNull(ruleGroupMap)) {
-            log.error("获取规则集失败");
-            return;
-        }
-        //获取指标内容
-        JSONObject indicators = getRuleIndicator();
-        if (Check.isNull(indicators)) {
-            log.error("获取指标内容失败");
-            return;
+    public void checkRulesByAccountId(Long accountId) {
+        try {
+            QueryWrapper<RuleAccountTemplate> wrapper = new QueryWrapper<>();
+            //0状态为启动
+            wrapper.eq("account_id", accountId);
+            wrapper.eq("template_status", 0);
+            wrapper.last("limit 1");
+            RuleAccountTemplate ruleAccountTemplate = ruleAccountTemplateMapper.selectOne(wrapper);
+            if (Check.isNull(ruleAccountTemplate)) {
+                log.error("查询账户绑定过的规则模板失败");
+                return;
+            }
+            //获取规则集
+            Map<Long, Object> ruleGroupMap = getRuleGroupMapById(ruleAccountTemplate.getTemplateId());
+            if (Check.isNull(ruleGroupMap)) {
+                log.error("获取规则集失败");
+                return;
+            }
+            //获取指标内容
+            JSONObject indicators = getRuleIndicator();
+            if (Check.isNull(indicators)) {
+                log.error("获取指标内容失败");
+                return;
+            }
+            matchAlarmRules(ruleGroupMap, indicators, ruleAccountTemplate);
+        } catch (Exception e) {
+            log.error("预警触发异常", e);
         }
+    }
 
-        ruleAccountTemplates.forEach(templates -> executorService.submit(() -> {
-            matchAlarmRules(ruleGroupMap, indicators, templates);
-        }));
+    @Override
+    public void checkRules() {
+        try {
+            //查询账户绑定过的规则模板
+            Map<String, Object> map = new HashMap<>();
+            //0状态为启动
+            map.put("template_status", 0);
+            List<RuleAccountTemplate> ruleAccountTemplates = ruleAccountTemplateMapper.selectByMap(map);
+            if (Check.isNull(ruleAccountTemplates)) {
+                log.error("查询账户绑定过的规则模板失败");
+                return;
+            }
+            //获取规则集
+            Map<Long, Object> ruleGroupMap = getRuleGroupMap();
+            if (Check.isNull(ruleGroupMap)) {
+                log.error("获取规则集失败");
+                return;
+            }
+            //获取指标内容
+            JSONObject indicators = getRuleIndicator();
+            if (Check.isNull(indicators)) {
+                log.error("获取指标内容失败");
+                return;
+            }
 
-        Long endTime = System.currentTimeMillis();
-        log.info("------end------共耗时: {} ms", endTime - startTime);
+            ruleAccountTemplates.forEach(templates -> executorService.submit(() -> {
+                matchAlarmRules(ruleGroupMap, indicators, templates);
+            }));
+        } catch (Exception e) {
+            log.error("预警触发异常", e);
+        }
     }
 
     /**
@@ -201,7 +231,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
     }
 
     /**
-     * 组合规则匹配逻辑
+     * 规则匹配逻辑
      *
      * @param ruleGroups   规则组集
      * @param thresholdObj 阈值数据
@@ -217,6 +247,8 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
         for (RuleGroup ruleGroup : ruleGroups) {
             JSONArray complianceList = new JSONArray();
             List<RuleBase> ruleBaseList = ruleGroup.getRuleBaseList();
+            //存储触发预警的数据
+            List<AlarmRuleRecord> recordList = new ArrayList<>();
             if (Check.isNull(ruleBaseList)) {
                 continue;
             }
@@ -226,14 +258,14 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                 for (Map.Entry<String, Object> entry : batchNo.entrySet()) {
                     JSONObject thresholdJn = (JSONObject) entry.getValue();
                     if (!Check.isNull(thresholdJn)) {
-                        CombinationRule(ruleGroup, thresholdJn, indicators, matchData, complianceList, type);
+                        CombinationRule(ruleGroup, thresholdJn, indicators, matchData, complianceList, type, recordList);
                     }
                 }
             } else {
                 boolean isGroup = "group".equals(ruleGroup.getRuleType());
                 //匹配组合规则
                 if (isGroup) {
-                    CombinationRule(ruleGroup, thresholdObj, indicators, matchData, complianceList, type);
+                    CombinationRule(ruleGroup, thresholdObj, indicators, matchData, complianceList, type, recordList);
                     //匹配单规则
                 } else {
                     RuleBase ruleBase = ruleBaseList.get(0);
@@ -255,7 +287,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                             JSONObject obj = dimensionData.getJSONObject(i);
                             String value = obj.getString(ruleBase.getIndicatorCode());
                             if (MatchLogic.matchCondition(indicator, ruleBase.getRuleCondition(), threshold, value, obj, ruleBase.getIndicatorCode())) {
-                                alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold);
+                                alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold, recordList);
                                 complianceList.add(obj);
                             }
                         }
@@ -264,6 +296,13 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             }
             if (!Check.isNull(complianceList)) {
                 getAndSendMessag(complianceList, ruleGroup, accountName, type);
+                Thread thread = new Thread() {
+                    @Override
+                    public void run() {
+                        alarmRuleRecordService.saveBatch(recordList);
+                    }
+                };
+                thread.start();
             }
         }
     }
@@ -276,7 +315,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      * @throws
      * @author ZHAOXA
      */
-    private void alarmRuleRecord(JSONObject obj, RuleGroup ruleGroup, RuleBase ruleBase, JSONObject indicator, Integer mediaType, String threshold) {
+    private void alarmRuleRecord(JSONObject obj, RuleGroup ruleGroup, RuleBase ruleBase, JSONObject indicator, Integer mediaType, String threshold, List<AlarmRuleRecord> recordList) {
         try {
             Long planId = obj.getLong("planId");
             Long unidId = null;
@@ -304,7 +343,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             alarmRuleRecord.setValueTime(obj.getDate("createTime"));
             alarmRuleRecord.setOperate("PAUSE".equals(ruleGroup.getOperate()) ? "关停" : "仅发送");
             alarmRuleRecord.setMediaType(mediaTypeName);
-            alarmRuleRecordService.save(alarmRuleRecord);
+            recordList.add(alarmRuleRecord);
         } catch (Exception e) {
             log.error("insert ctop_alarm_rule_record error ", e);
         }
@@ -324,7 +363,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      * @throws
      * @author ZHAOXA
      */
-    private void CombinationRule(RuleGroup ruleGroup, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, JSONArray complianceList, Integer type) {
+    private void CombinationRule(RuleGroup ruleGroup, JSONObject thresholdObj, JSONObject indicators, JSONObject matchData, JSONArray complianceList, Integer type, List<AlarmRuleRecord> recordList) {
         List<RuleBase> ruleBaseList = ruleGroup.getRuleBaseList();
         //符合规则的数据集
         JSONArray groupDatas = new JSONArray();
@@ -380,7 +419,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                 JSONObject accountEntity = dimensionData.getJSONObject(0);
                 if (MatchLogic.matchCondition(indicator, ruleBase.getRuleCondition(), threshold, accountEntity.getString(ruleBase.getIndicatorCode()), accountEntity, ruleBase.getIndicatorCode())) {
                     if (Check.isNull(accountDatas)) {
-                        alarmRuleRecord(accountEntity, ruleGroup, ruleBase, indicator, type, threshold);
+                        alarmRuleRecord(accountEntity, ruleGroup, ruleBase, indicator, type, threshold, recordList);
                         accountDatas.add(accountEntity);
                     }
                 } else {
@@ -402,7 +441,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                     break;
                 }
             } else if (PLAN.equals(ruleBase.getRuleDimension())) {
-                planDatas = getOKData(planDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type);
+                planDatas = getOKData(planDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type, recordList);
                 if (Check.isNull(planDatas)) {
                     if (!Check.isNull(accountDatas)) {
                         accountDatas = null;
@@ -422,7 +461,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                     break;
                 }
             } else if (CREATIVE.equals(ruleBase.getRuleDimension())) {
-                creativeDatas = getOKData(creativeDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type);
+                creativeDatas = getOKData(creativeDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type, recordList);
                 if (Check.isNull(creativeDatas)) {
                     if (!Check.isNull(accountDatas)) {
                         accountDatas = null;
@@ -442,7 +481,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                     break;
                 }
             } else if ("target".equals(ruleBase.getRuleDimension())) {
-                targetDatas = getOKData(targetDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type);
+                targetDatas = getOKData(targetDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type, recordList);
                 if (Check.isNull(targetDatas)) {
                     if (!Check.isNull(accountDatas)) {
                         accountDatas = null;
@@ -462,7 +501,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
                     break;
                 }
             } else if (UNIT.equals(ruleBase.getRuleDimension())) {
-                groupDatas = getOKData(groupDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type);
+                groupDatas = getOKData(groupDatas, dimensionData, ruleBase, indicator, threshold, ruleGroup, type, recordList);
                 if (Check.isNull(groupDatas)) {
                     if (!Check.isNull(accountDatas)) {
                         accountDatas = null;
@@ -505,14 +544,14 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
      * @throws
      * @author ZHAOXA
      */
-    private JSONArray getOKData(JSONArray ruleDatas, JSONArray dimensionData, RuleBase ruleBase, JSONObject indicator, String threshold, RuleGroup ruleGroup, Integer type) {
+    private JSONArray getOKData(JSONArray ruleDatas, JSONArray dimensionData, RuleBase ruleBase, JSONObject indicator, String threshold, RuleGroup ruleGroup, Integer type, List<AlarmRuleRecord> recordList) {
         if (!Check.isNull(ruleDatas)) {
             JSONArray okData = new JSONArray();
             for (int i = 0; i < ruleDatas.size(); i++) {
                 JSONObject obj = ruleDatas.getJSONObject(i);
                 String value = obj.getString(ruleBase.getIndicatorCode());
                 if (MatchLogic.matchCondition(indicator, ruleBase.getRuleCondition(), threshold, value, obj, ruleBase.getIndicatorCode())) {
-                    alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold);
+                    alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold, recordList);
                     okData.add(obj);
                 }
             }
@@ -522,7 +561,7 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
             JSONObject obj = dimensionData.getJSONObject(i);
             String value = obj.getString(ruleBase.getIndicatorCode());
             if (MatchLogic.matchCondition(indicator, ruleBase.getRuleCondition(), threshold, value, obj, ruleBase.getIndicatorCode())) {
-                alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold);
+                alarmRuleRecord(obj, ruleGroup, ruleBase, indicator, type, threshold, recordList);
                 ruleDatas.add(obj);
             }
         }
@@ -858,6 +897,45 @@ public class RuleGroupServiceImpl extends ServiceImpl<RuleGroupMapper, RuleGroup
         return obj;
     }
 
+    private Map<Long, Object> getRuleGroupMapById(Long id) {
+        try {
+            Map<Long, Object> returnMap = new HashMap<>();
+            Map<String, Object> parMap = new HashMap<>();
+            parMap.put("id", id);
+            List<RuleTemplate> ruleTemplates = ruleTemplateMapper.selectByMap(parMap);
+            for (RuleTemplate tem : ruleTemplates) {
+                Map<String, Object> map = new HashMap<>();
+                QueryWrapper<RuleGroup> groupWrapper = new QueryWrapper<>();
+                groupWrapper.eq("template_id", tem.getId());
+                groupWrapper.eq("is_copy", NoEn.NO1.valueInt());
+                List<RuleGroup> copyGroups = ruleGroupMapper.selectList(groupWrapper);
+                for (RuleGroup group : copyGroups) {
+                    QueryWrapper<RuleBase> baseWrapper = new QueryWrapper<>();
+                    baseWrapper.eq("group_id", group.getId());
+                    baseWrapper.orderByDesc("is_unlimited");
+                    group.setRuleBaseList(ruleBaseMapper.selectList(baseWrapper));
+                }
+                map.put("isCopy", copyGroups);
+                groupWrapper = new QueryWrapper<>();
+                groupWrapper.eq("template_id", tem.getId());
+                groupWrapper.eq("is_copy", NoEn.NO0.valueInt());
+                List<RuleGroup> notCopyGroups = ruleGroupMapper.selectList(groupWrapper);
+                for (RuleGroup group : notCopyGroups) {
+                    QueryWrapper<RuleBase> baseWrapper = new QueryWrapper<>();
+                    baseWrapper.eq("group_id", group.getId());
+                    baseWrapper.orderByDesc("is_unlimited");
+                    group.setRuleBaseList(ruleBaseMapper.selectList(baseWrapper));
+                }
+                map.put("notCopy", notCopyGroups);
+                map.put("type", tem.getMediaType());
+                returnMap.put(tem.getId(), map);
+            }
+            return returnMap;
+        } catch (Exception e) {
+            log.error("获取模板规则组集合异常", e);
+        }
+        return null;
+    }
 
     /**
      * 整理规则模板的数据,根据模板ID获取模板具体规则内容

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java

@@ -40,4 +40,6 @@ public interface UserAllocationMapper extends BaseMapper<UserAllocation> {
     List<Long>  queryAccountsByDeleteComment();
 
     String getCompanyNameByUserId(@Param("planId") String planId);
+
+    List<UserAllocation> listByMediaId(@Param("mediaId")String mediaId, @Param("accountStatus")Integer accountStatus);
 }

+ 12 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml

@@ -124,6 +124,18 @@
     <select id="getCompanyNameByUserId" resultType="java.lang.String">
         select company_name from user_company where user_id = #{planId} limit 1
     </select>
+    <select id="listByMediaId" resultType="cn.com.ctop.common.module.entity.UserAllocation">
+        select a.* from ctop_user_allocation a
+        left join ctop_project p on p.id = a.project_id
+        where
+            1=1
+            <if test="null!=accountStatus">
+                and a.account_status = #{accountStatus}
+            </if>
+        <if test="null!=mediaId">
+            and p.media_id = #{mediaId}
+        </if>
+    </select>
 
 
 </mapper>

+ 2 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java

@@ -26,6 +26,8 @@ public interface IUserAllocationService extends IService<UserAllocation> {
 
     List<UserAllocation> getByMediaId(String mediaId);
 
+    List<UserAllocation> listByMediaId(String mediaId, int accountStatus);
+
     String getAdvertiserIdByAccountId(Long accountId);
 
     List<JSONObject> getAccountListByProject(Long projectId);

+ 5 - 2
module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java

@@ -92,12 +92,15 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
         if ("".equals(mediaId)) {
             queryWrapper.eq("media_id", mediaId);
         }
-        queryWrapper.eq("account_status",0);
-        queryWrapper.orderByDesc("id");
         return this.list(queryWrapper);
     }
 
     @Override
+    public List<UserAllocation> listByMediaId(String mediaId,int accountStatus) {
+        return userAllocationMapper.listByMediaId(mediaId,accountStatus);
+    }
+
+    @Override
     public String getAdvertiserIdByAccountId(Long accountId) {
         return userAllocationMapper.queryAdvertiserId(accountId);
     }

+ 24 - 2
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java

@@ -1,17 +1,29 @@
 package cn.com.ctop.job.bytedance.handler;
 
 
+import cn.com.ctop.alarm.modules.entity.RuleAccountTemplate;
+import cn.com.ctop.alarm.modules.mapper.RuleAccountTemplateMapper;
 import cn.com.ctop.alarm.modules.service.IRuleGroupService;
-import com.xxl.job.core.biz.model.ReturnT;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.HttpUtils;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @Component
 public class AlarmRuleJob {
     @Autowired
     private IRuleGroupService ruleGroupService;
 
+    @Autowired
+    private RuleAccountTemplateMapper ruleAccountTemplateMapper;
+
+    String URLPREFIX = "http://api.tjyourong.com.cn/jeecg-boot/ruleGroup/checkRulesByAccountId?accountId=";
+
     /**
      * 定时任务
      *
@@ -22,6 +34,16 @@ public class AlarmRuleJob {
      */
     @XxlJob("alarmRuleJob")
     public void execute() throws Exception {
-        ruleGroupService.checkRules();
+        //查询账户绑定过的规则模板
+        Map<String, Object> map = new HashMap<>();
+        //0状态为启动
+        map.put("template_status", 0);
+        List<RuleAccountTemplate> ruleAccountTemplates = ruleAccountTemplateMapper.selectByMap(map);
+        if (!Check.isNull(ruleAccountTemplates)) {
+            ruleAccountTemplates.forEach(template -> {
+                String url = URLPREFIX + template.getAccountId();
+                HttpUtils.httpGet(url, null, null);
+            });
+        }
     }
 }

+ 19 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouActionBarTextJob.java

@@ -0,0 +1,19 @@
+package cn.com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouActionBarTextService;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class KuaishouActionBarTextJob {
+    @Autowired
+    private IKuaiShouActionBarTextService actionBarTextService;
+
+    @XxlJob("kuaishouActionBarTextJob")
+    public void execute() {
+        actionBarTextService.getActionBarText();
+        XxlJobHelper.log("快手行动号召按钮同步完成");
+    }
+}

+ 24 - 1
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java

@@ -3,17 +3,24 @@ package cn.com.ctop.job.kuaishou.handler;
 import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAccountTargetTemplate;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouAccountTargetTemplateService;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouNewCreateCampaign;
+import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 @Component
 public class KuaishouAiAdsNewMaterialCreativityJob {
 
     @Autowired
     IAiKuaishouNewCreateCampaign aiKuaishouNewCreateCampaign;
+    static ExecutorService executorService = Executors.newFixedThreadPool(5);
+    static CountDownLatch countDownLatch = null;
+
     @Autowired
     private IAiKuaishouAccountTargetTemplateService aiKuaishouAccountTargetTemplateService;
     @XxlJob("kuaishouAiAdsNewMaterialCreativityJob")
@@ -32,7 +39,23 @@ public class KuaishouAiAdsNewMaterialCreativityJob {
         if(null==accountTargetTemplates||accountTargetTemplates.isEmpty()){
             return;
         }
-        accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(targetTemplate));
+        countDownLatch = new CountDownLatch(accountTargetTemplates.size());
+        accountTargetTemplates.forEach(targetTemplate -> executorService.submit(()->{
+            try {
+                aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(targetTemplate, 10);
+                XxlJobHelper.log("账户上新结束=>accountId:{}",targetTemplate.getAccountId());
+            }catch (Exception e) {
+                e.printStackTrace();
+            }finally {
+                countDownLatch.countDown();
+            }
+        }));
+        try {
+            countDownLatch.await();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        XxlJobHelper.log("全部账户上新结束");
     }
 
     @XxlJob("kuaishouAiAdsHotMaterialCreativityJob")

+ 22 - 1
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouCreateUnitJob.java

@@ -1,10 +1,17 @@
 package cn.com.ctop.job.kuaishou.handler;
 
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.HttpUtils2;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupTemplateService;
+import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @Component
 public class KuaishouCreateUnitJob {
 
@@ -14,6 +21,20 @@ public class KuaishouCreateUnitJob {
 
     @XxlJob("kuaihouCreateUnit")
     public void execute() {
-        groupTemplateService.createUnit();
+
+        List<Long> idList = groupTemplateService.getIdList();
+        if (Check.isNull(idList)) {
+            XxlJobHelper.log("批量2.0暂时没有未创建的组");
+            return;
+        }
+        String url = "http://api.tjyourong.com.cn/jeecg-boot/batch/kuaiShouGroupTemplate/createUnit";
+        for (int i = 0; i < idList.size(); i++) {
+            Long id = idList.get(i);
+            Map<String, Object> requestMap = new HashMap<>();
+            requestMap.put("id", id);
+            HttpUtils2.httpGet(url, requestMap, null);
+        }
+
+
     }
 }

+ 168 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouAdvertiserStrategyController.java

@@ -0,0 +1,168 @@
+package cn.com.ctop.kuaishou.modules.ai.controller;
+
+import cn.com.ctop.common.module.entity.UserAllocation;
+import cn.com.ctop.common.module.service.IUserAllocationService;
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAdvertiserStrategy;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouAdvertiserStrategyService;
+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.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+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.List;
+
+/**
+ * 快手账户策略设置信息表
+ * @author jeecg-boot
+ * @date   2021-01-25
+ * @version V1.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/ctop/aiKuaishouAdvertiserStrategy")
+public class AiKuaishouAdvertiserStrategyController {
+	@Autowired
+	private IAiKuaishouAdvertiserStrategyService aiKuaishouAdvertiserStrategyService;
+
+	/**
+	  * 分页列表查询
+	 * @param aiKuaishouAdvertiserStrategy
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="快手账户策略设置信息表-分页列表查询", notes="快手账户策略设置信息表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<AiKuaishouAdvertiserStrategy>> queryPageList(AiKuaishouAdvertiserStrategy aiKuaishouAdvertiserStrategy,
+																	 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																	 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																	 HttpServletRequest req) {
+		Result<IPage<AiKuaishouAdvertiserStrategy>> result = new Result<>();
+		QueryWrapper<AiKuaishouAdvertiserStrategy> queryWrapper = QueryGenerator.initQueryWrapper(aiKuaishouAdvertiserStrategy, req.getParameterMap());
+		Page<AiKuaishouAdvertiserStrategy> page = new Page<>(pageNo, pageSize);
+		IPage<AiKuaishouAdvertiserStrategy> pageList = aiKuaishouAdvertiserStrategyService.page(page, queryWrapper);
+		List<AiKuaishouAdvertiserStrategy> records = pageList.getRecords();
+		List<AiKuaishouAdvertiserStrategy> setData = new ArrayList<>();
+		if(null!=records&&!records.isEmpty()){
+			records.forEach(record->{
+				Long accountId = record.getAccountId();
+				UserAllocation allocation = allocationService.getByAccountId(accountId);
+				if(null !=allocation){
+					record.setAuthName(allocation.getAuthName());
+				}
+				setData.add(record);
+			});
+			pageList.setRecords(setData);
+		}
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	@Autowired
+	private IUserAllocationService allocationService;
+
+	/**
+	  *   添加
+	 * @param aiKuaishouAdvertiserStrategy
+	 * @return
+	 */
+	@ApiOperation(value="快手账户策略设置信息表-添加", notes="快手账户策略设置信息表-添加")
+	@PostMapping(value = "/add")
+	public Result<AiKuaishouAdvertiserStrategy> add(@RequestBody AiKuaishouAdvertiserStrategy aiKuaishouAdvertiserStrategy) {
+		Result<AiKuaishouAdvertiserStrategy> result = new Result<>();
+		try {
+			aiKuaishouAdvertiserStrategyService.save(aiKuaishouAdvertiserStrategy);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param aiKuaishouAdvertiserStrategy
+	 * @return
+	 */
+	@ApiOperation(value="快手账户策略设置信息表-编辑", notes="快手账户策略设置信息表-编辑")
+	@PutMapping(value = "/edit")
+	public Result<AiKuaishouAdvertiserStrategy> edit(@RequestBody AiKuaishouAdvertiserStrategy aiKuaishouAdvertiserStrategy) {
+		Result<AiKuaishouAdvertiserStrategy> result = new Result<>();
+		AiKuaishouAdvertiserStrategy aiKuaishouAdvertiserStrategyEntity = aiKuaishouAdvertiserStrategyService.getById(aiKuaishouAdvertiserStrategy.getId());
+		if(aiKuaishouAdvertiserStrategyEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = aiKuaishouAdvertiserStrategyService.updateById(aiKuaishouAdvertiserStrategy);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="快手账户策略设置信息表-通过id删除", notes="快手账户策略设置信息表-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			aiKuaishouAdvertiserStrategyService.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<AiKuaishouAdvertiserStrategy> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<AiKuaishouAdvertiserStrategy> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.aiKuaishouAdvertiserStrategyService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="快手账户策略设置信息表-通过id查询", notes="快手账户策略设置信息表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<AiKuaishouAdvertiserStrategy> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<AiKuaishouAdvertiserStrategy> result = new Result<>();
+		AiKuaishouAdvertiserStrategy aiKuaishouAdvertiserStrategy = aiKuaishouAdvertiserStrategyService.getById(id);
+		if(aiKuaishouAdvertiserStrategy==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(aiKuaishouAdvertiserStrategy);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+}

+ 12 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/KuaiShouMaterialControer.java

@@ -153,6 +153,7 @@ public class KuaiShouMaterialControer {
                         String signature = videoGet.getSignature();
                         materialJson.put("signature", signature);
                         materialJson.put("video_url", videoGet.getUrl());
+                        materialJson.put("material_type", videoGet.getMaterialType());
                         materialJson.put("channel_type", videoGet.getChannelType());
                         List<String> imageList = lastTimeService.getImageListByMd5(signature);
                         materialJson.put("imageList", imageList);
@@ -255,7 +256,17 @@ public class KuaiShouMaterialControer {
             if (Check.isNull(videoCnt)) {
                 throw new Exception("请输入查询条数");
             }
+            String startTime = requestJson.getString("startTime");
+            if (Check.isNull(startTime)) {
+                throw new Exception("请输入查询开始时间");
+            }
+            String endTime = requestJson.getString("endTime");
+            if (Check.isNull(endTime)) {
+                throw new Exception("请输入查询结束时间");
+            }
             Map<String, Object> requestMap = new HashMap<>();
+            requestMap.put("startTime", startTime);
+            requestMap.put("endTime", endTime);
             requestMap.put("accountId", accountId);
             requestMap.put("creativeCount", 0);
             requestMap.put("videoCnt", videoCnt);
@@ -269,6 +280,7 @@ public class KuaiShouMaterialControer {
                         materialJson.put("signature", signature);
                         materialJson.put("video_url", videoGet.getUrl());
                         materialJson.put("channel_type", videoGet.getChannelType());
+                        materialJson.put("material_type", videoGet.getMaterialType());
                         List<String> imageList = lastTimeService.getImageListByMd5(signature);
                         materialJson.put("imageList", imageList);
                     }

+ 112 - 58
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountTargetTemplate.java

@@ -3,75 +3,129 @@ package cn.com.ctop.kuaishou.modules.ai.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import org.jeecgframework.poi.excel.annotation.Excel;
 
 import java.util.Date;
 
 /**
  * 账户自动投放定向模板
+ *
  * @author jeecg-boot
- * @date   2021-01-07
  * @version V1.0
+ * @date 2021-01-07
  */
 @Data
 @TableName("ctop_ai_kuaishou_auto_creative_account_info")
 public class AiKuaishouAccountTargetTemplate {
 
-	/**id*/
-	@TableId(type = IdType.AUTO)
-	private Long id;
-	/**账户ID*/
-	private Long accountId;
-	/**营销目标{1应用安装},{2电商下单},{3推广品牌},{4营销线上},{5应用活跃}*/
-	private String marketingGoal;
-	/**请勾选投放应用已上架的应用商店*/
-	private String appStore;
-	/**是否优先从应用商店下载 true false*/
-	private String useAppMarket;
-	/**应用id集*/
-	private String appIds;
-	/**地域*/
-	private String region;
-	/**年龄段:{[]:不限}{18:18-23岁}{24:24-30岁}{31:31-40岁}{41:41-49岁}{50:50岁+*/
-	private String agesRange;
-	/**性别 1:女性, 2:男性, 0:不限*/
-	private Integer gender;
-	/**操作系统 1: Android, 2: iOS, 0:不限*/
-	private Integer platformOs;
-	/**自定义人群 0不限,1:定向,:2:排除,:3同时定向排除*/
-	private String customCrowd;
-	/**定向人群包*/
-	private String population;
-	/**排除人群包*/
-	private String excludePopulation;
-	/**出价类型(优化目标) 2点击数(CPC),10转化数(OCPM)*/
-	private Integer bidType;
-	/**封面点击出价*/
-	private Integer bid;
-	/**转化目标,2:行为数,180:激活数,53:表单数,190: 付费,191:首日ROI 。。。*/
-	private Integer ocpxActionType;
-	/**转化目标出价*/
-	private Integer cpaBid;
-	/**广告位 1:优选广告位;*/
-	private String sceneId;
-	/**下载详情页ID,建站id*/
-	private String siteId;
-	/**第三方开始播放监测链接*/
-	private String impressionUrl;
-	/**第三方点击检测链接*/
-	private String clickTrackUrl;
-	/**第三方点击按钮监测链接*/
-	private String actionbarClickUrl;
-	/**状态*/
-	private Integer status;
-	/**单个视频搭配图片个数*/
-	private Integer imageNumber;
-	/**创建时间*/
-	private Date createTime;
-	/**updateTime*/
-	private Date updateTime;
-	private String titlePrefix;
-	private String titleMiddle;
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 账户ID
+     */
+    private Long accountId;
+    /**
+     * 营销目标{1应用安装},{2电商下单},{3推广品牌},{4营销线上},{5应用活跃}
+     */
+    private String marketingGoal;
+    /**
+     * 请勾选投放应用已上架的应用商店
+     */
+    private String appStore;
+    /**
+     * 是否优先从应用商店下载 true false
+     */
+    private String useAppMarket;
+    /**
+     * 应用id集
+     */
+    private String appIds;
+    /**
+     * 地域
+     */
+    private String region;
+    /**
+     * 年龄段:{[]:不限}{18:18-23岁}{24:24-30岁}{31:31-40岁}{41:41-49岁}{50:50岁+
+     */
+    private String agesRange;
+    /**
+     * 性别 1:女性, 2:男性, 0:不限
+     */
+    private Integer gender;
+    /**
+     * 操作系统 1: Android, 2: iOS, 0:不限
+     */
+    private Integer platformOs;
+    /**
+     * 自定义人群 0不限,1:定向,:2:排除,:3同时定向排除
+     */
+    private String customCrowd;
+    /**
+     * 定向人群包
+     */
+    private String population;
+    /**
+     * 排除人群包
+     */
+    private String excludePopulation;
+    /**
+     * 出价类型(优化目标) 2点击数(CPC),10转化数(OCPM)
+     */
+    private Integer bidType;
+    /**
+     * 封面点击出价
+     */
+    private Integer bid;
+    /**
+     * 转化目标,2:行为数,180:激活数,53:表单数,190: 付费,191:首日ROI 。。。
+     */
+    private Integer ocpxActionType;
+    /**
+     * 转化目标出价
+     */
+    private Integer cpaBid;
+    /**
+     * 广告位 1:优选广告位;
+     */
+    private String sceneId;
+    /**
+     * 下载详情页ID,建站id
+     */
+    private String siteId;
+    /**
+     * 第三方开始播放监测链接
+     */
+    private String impressionUrl;
+    /**
+     * 第三方点击检测链接
+     */
+    private String clickTrackUrl;
+    /**
+     * 第三方点击按钮监测链接
+     */
+    private String actionbarClickUrl;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 单个视频搭配图片个数
+     */
+    private Integer imageNumber;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    private Integer  filterConvertedLevel;
+    private String actionBarText;
+    private String creativeDescription;
+    /**
+     * updateTime
+     */
+    private Date updateTime;
+    private String titlePrefix;
+    private String titleMiddle;
 }

+ 190 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAdvertiserStrategy.java

@@ -0,0 +1,190 @@
+package cn.com.ctop.kuaishou.modules.ai.entity;
+
+import cn.com.ctop.common.module.annotation.Dict;
+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 lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 快手账户策略设置信息表
+ * @author jeecg-boot
+ * @date   2021-01-25
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_ai_kuaishou_advertiser_strategy")
+@EqualsAndHashCode(callSuper = false)
+public class AiKuaishouAdvertiserStrategy {
+
+	/**客户策略ID*/
+	@TableId(type = IdType.AUTO)
+	private Long id;
+	/**账户ID*/
+	private Long accountId;
+	/**策略状态 1-使用 0-停用*/
+	private Integer status;
+	/**客户要求的计划名称规范*/
+	private String campaignName;
+	/**计划类型 2-提升应用安装 3-获取电商下单 4-推广品牌活动 5-收集销售线索 7-提高应用活跃*/
+	private Integer campaignType;
+	/**客户要求的广告组名称规范*/
+	private String groupName;
+	/**定向模板id*/
+	private Integer templateId;
+	/**优化目标出价类型*/
+	private Integer bidType;
+	/**优先从系统应用商店下载*/
+	private Integer useAppMarket;
+	/**应用商店列表*/
+	private String appStore;
+	/**出价*/
+	private Integer bid;
+	/**深度出价*/
+	private Long cpaBid;
+	/**优先低成本出价*/
+	private Integer smartBid;
+	/**优化目标*/
+	private Integer ocpxActionType;
+	/**深度转化目标*/
+	private Integer deepConversionType;
+	/**付费ROI系数*/
+	private Float roiRatio;
+	/**资源位置*/
+	private String sceneId;
+	/** 创意制作方式 4-自定义 5-程序化创意 7-程序化创意2.0*/
+	private Integer unitType;
+	/**投放开始时间*/
+	private String beginTime;
+	/**投放结束时间*/
+	private String endTime;
+	/**投放时间段*/
+	private String scheduleTime;
+	/**转化目标ID*/
+	private Integer convertId;
+	/**url类型*/
+	private Integer urlType;
+	/**url类型*/
+	private Integer webUriType;
+	/**投放链接*/
+	private String url;
+	/**调起链接*/
+	private String schemaUri;
+	/**应用ID*/
+	private Integer appId;
+	/**创意展现方式 1-轮播  2-优选*/
+	private Integer showMode;
+	/**投放方式 1-加速投放  2-平滑投放 3-优先低成本*/
+	private Integer speed;
+	/**预约广告*/
+	private Integer siteType;
+	/**游戏礼包码*/
+	private String giftData;
+	/**是否使用落地页前置功能*/
+	private Integer videoLandingPage;
+	/**智能定向*/
+	private Integer autoTarget;
+	/**是否开启自动生成视频*/
+	private Integer autoCreatePhoto;
+	/**地域*/
+	private String region;
+	/**商圈定向*/
+	private String districtIds;
+	/**用户类型*/
+	private Integer userType;
+	/**最大年龄*/
+	private Integer ageMin;
+	/**最小年龄*/
+	private Integer ageMax;
+	/**固定年龄段*/
+	private String agesRange;
+	/**性别*/
+	private Integer gender;
+	/**操作系统*/
+	private Integer platformOs;
+	/**Android版本*/
+	private Integer androidOsv;
+	/**iOS版本*/
+	private Integer iosOsv;
+	/**网络环境*/
+	private Integer network;
+	/**设备品牌*/
+	private String deviceBrand;
+	/**设备价格*/
+	private String devicePrice;
+	/**商业兴趣类型*/
+	private Integer businessInterestType;
+	/**商业兴趣*/
+	private String businessInterest;
+	/**网红粉丝*/
+	private String fansStar;
+	/**兴趣视频用户*/
+	private String interestVideo;
+	/**APP行为-按分类*/
+	private String appInterest;
+	/**APP行为-按APP名称*/
+	private String appIds;
+	/**过滤已转化人群纬度*/
+	private Integer filterConvertedLevel;
+	/**人群包定向*/
+	private String population;
+	/**人群包排除*/
+	private String excludePopulation;
+	/**付费人群包id*/
+	private String paidAudience;
+	/**开启智能扩量*/
+	private Integer isOpen;
+	/**不可突破年龄*/
+	private Integer noAgeBreak;
+	/**不可突破性别*/
+	private Integer noGenderBreak;
+	/**不可突破地域*/
+	private Integer noAreaBreak;
+	/**行为兴趣定向*/
+	private String behaviorInterest;
+	/**创意名称*/
+	private String creativeName;
+	/**行动号召按钮文案*/
+	private String actionBarText;
+	/**广告语*/
+	private String description;
+	/**便利贴创意短广告语*/
+	private String shortSlogan;
+	/**封面广告语标题*/
+	private String stickerTitle;
+	/**贴纸样式类型*/
+	private String overlayType;
+	/**广告标签*/
+	private String exposeTag;
+	/**广告标签2期*/
+	private String newExposeTag;
+	/**安卓下载中间页ID*/
+	private Integer siteId;
+	/**第三方点击检测链接*/
+	private String clickTrackUrl;
+	/**第三方开始播放监测链接*/
+	private String impressionUrl;
+	/**第三方有效播放监测链接*/
+	private String adPhotoPlayedT3sUrl;
+	/**第三方点击按钮监测链接*/
+	private String actionbarClickUrl;
+	/**创意分类*/
+	private Integer creativeCategory;
+	/**创意标签*/
+	private String creativeTag;
+	/**物料关联的封面个数*/
+	private Integer imageCnt;
+	/**创建时间*/
+	private Date createTime;
+	/**生效时间*/
+	private Date effectiveTime;
+	/**失效时间*/
+	private Date expiryTime;
+
+	@TableField(exist = false)
+	private String authName;
+}

+ 14 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouAdvertiserStrategyMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.kuaishou.modules.ai.mapper;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAdvertiserStrategy;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 快手账户策略设置信息表
+ * @author: jeecg-boot
+ * @date:   2021-01-25
+ * @cersion: V1.0
+ */
+public interface AiKuaishouAdvertiserStrategyMapper extends BaseMapper<AiKuaishouAdvertiserStrategy> {
+
+}

+ 2 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAccountTargetTemplateMapper.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="cn.com.ctop.ctop.mapper.AiKuaishouAccountTargetTemplateMapper">
+<mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouAccountTargetTemplateMapper">
 
-</mapper>
+</mapper>

+ 5 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAdvertiserStrategyMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouAdvertiserStrategyMapper">
+
+</mapper>

+ 1 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAccountTargetTemplateService.java

@@ -15,4 +15,5 @@ public interface IAiKuaishouAccountTargetTemplateService extends IService<AiKuai
 
     List<AiKuaishouAccountTargetTemplate> getAllEffectTemplate();
 
+    AiKuaishouAccountTargetTemplate getByAccountId(Long accountId);
 }

+ 14 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouAdvertiserStrategyService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.kuaishou.modules.ai.service;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAdvertiserStrategy;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 快手账户策略设置信息表
+ * @Author: jeecg-boot
+ * @Date:   2021-01-25
+ * @Version: V1.0
+ */
+public interface IAiKuaishouAdvertiserStrategyService extends IService<AiKuaishouAdvertiserStrategy> {
+
+}

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouNewCreateCampaign.java

@@ -7,5 +7,5 @@ public interface IAiKuaishouNewCreateCampaign {
 
     void kuaishouAiAdsHotMaterialCreativity(AiKuaishouAccountTargetTemplate targetTemplate);
 
-    void kuaishouAiAddNewMaterialCreativity(AiKuaishouAccountTargetTemplate targetTemplate);
+    void kuaishouAiAddNewMaterialCreativity(AiKuaishouAccountTargetTemplate targetTemplate,Integer matNum);
 }

+ 11 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAccountTargetTemplateServiceImpl.java

@@ -24,4 +24,15 @@ public class AiKuaishouAccountTargetTemplateServiceImpl extends ServiceImpl<AiKu
         queryWrapper.eq("status",1);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public AiKuaishouAccountTargetTemplate getByAccountId(Long accountId) {
+        QueryWrapper<AiKuaishouAccountTargetTemplate> queryWrapper = new QueryWrapper<>();
+        if(null!=accountId&&accountId!=0){
+            queryWrapper.eq("account_id",accountId);
+        }
+        queryWrapper.eq("status",1);
+        queryWrapper.last("limit 1");
+        return this.getOne(queryWrapper);
+    }
 }

+ 18 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouAdvertiserStrategyServiceImpl.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.kuaishou.modules.ai.service.impl;
+
+import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaishouAdvertiserStrategy;
+import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaishouAdvertiserStrategyMapper;
+import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouAdvertiserStrategyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 快手账户策略设置信息表
+ * @author jeecg-boot
+ * @date   2021-01-25
+ * @version V1.0
+ */
+@Service
+public class AiKuaishouAdvertiserStrategyServiceImpl extends ServiceImpl<AiKuaishouAdvertiserStrategyMapper, AiKuaishouAdvertiserStrategy> implements IAiKuaishouAdvertiserStrategyService {
+
+}

+ 7 - 5
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouNewCreateCampaignServiceImpl.java

@@ -226,7 +226,7 @@ public class AiKuaishouNewCreateCampaignServiceImpl implements IAiKuaishouNewCre
     @Autowired
     private IKuaishouVideoRelateCreativesService relateCreativesService;
     @Override
-    public void kuaishouAiAddNewMaterialCreativity(AiKuaishouAccountTargetTemplate targetTemplate) {
+    public void kuaishouAiAddNewMaterialCreativity(AiKuaishouAccountTargetTemplate targetTemplate,Integer matNum) {
         Long accountId = targetTemplate.getAccountId();
         CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId.toString());
         if(null == token){
@@ -236,7 +236,7 @@ public class AiKuaishouNewCreateCampaignServiceImpl implements IAiKuaishouNewCre
         kuaishouInterfaceService.getVideoList(token, DateUtils.date2Str(),DateUtils.date2Str());
 
         //获取创意关联数为0的素材
-        List<KuaishouVideoRelateCreatives> kuaishouVideoRelateCreatives = relateCreativesService.listByParams(accountId);
+        List<KuaishouVideoRelateCreatives> kuaishouVideoRelateCreatives = relateCreativesService.listByParams(accountId,matNum);
         if(null == kuaishouVideoRelateCreatives||kuaishouVideoRelateCreatives.isEmpty()){
             log.info("账户:{}, 不存在未创建创意素材",accountId);
             return;
@@ -318,13 +318,12 @@ public class AiKuaishouNewCreateCampaignServiceImpl implements IAiKuaishouNewCre
         creativeParams.put("unit_id",unitId);
         creativeParams.put("photo_id",videoItem.getPhotoId());
         creativeParams.put("creative_material_type",videoItem.getMaterialType());
-        creativeParams.put("action_bar_text","下载抢购");
-        creativeParams.put("description","不买亏大了!众多商品低至一元!看看你多花了多少冤枉钱!");
+        creativeParams.put("action_bar_text",targetTemplate.getActionBarText());
+        creativeParams.put("description",targetTemplate.getCreativeDescription());
         // 安卓下载中间页ID
         JSONArray siteIdArray = JSONArray.parseArray(targetTemplate.getSiteId());
         if(null == siteIdArray||!siteIdArray.isEmpty()){
             JSONObject siteObject = siteIdArray.getJSONObject(0);
-            Long appId = siteObject.getLong("appId");
             Long siteId = siteObject.getLong("siteId");
             if(null!=siteId){
                 creativeParams.put("site_id",siteId);
@@ -407,6 +406,9 @@ public class AiKuaishouNewCreateCampaignServiceImpl implements IAiKuaishouNewCre
         if(null!=population&&!population.isEmpty()){
             targetJsonObject.put("population",population);
         }
+        if(null!=targetTemplate.getFilterConvertedLevel()&&targetTemplate.getFilterConvertedLevel()!=0){
+            targetJsonObject.put("filter_converted_level",targetTemplate.getFilterConvertedLevel());
+        }
         JSONArray excludePopulation = JSONArray.parseArray(targetTemplate.getExcludePopulation());
         if(null!=excludePopulation&&!excludePopulation.isEmpty()){
             targetJsonObject.put("exclude_population",excludePopulation);

+ 152 - 7
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/KuaiShouCreateServiceImpl.java

@@ -3,8 +3,7 @@ package cn.com.ctop.kuaishou.modules.ai.service.impl;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import cn.com.ctop.common.module.entity.MaterialCutFrame;
 import cn.com.ctop.common.module.service.IMaterialCutFrameService;
-import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.HttpUtils2;
+import cn.com.ctop.common.module.utils.*;
 import cn.com.ctop.kuaishou.modules.ai.service.IKuaiShouCreateService;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
@@ -18,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.Map;
 
 @Service
@@ -41,6 +41,13 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
     @Value("${ai.callback.callback-creative-url}")
     private String creativeUrl;
 
+    /**
+     * 创建 组 && 创意
+     *
+     * @param oauthToken
+     * @param campaign_id
+     * @param group_list
+     */
     @Override
     public void createUnitAndCreative(CtopOauthToken oauthToken, Long campaign_id, JSONArray group_list) {
         JSONArray returnArr = new JSONArray();
@@ -86,9 +93,11 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
                 if (!Check.isNull(groupCreateJson.getJSONArray("scene_id"))) {
                     createJson.put("scene_id", groupCreateJson.getJSONArray("scene_id")); //资源位置
                 }
-                if (!Check.isNull(groupCreateJson.getInteger("unit_type"))) {
-                    createJson.put("unit_type", groupCreateJson.getInteger("unit_type")); //创意制作方式
+                Integer unit_type = groupCreateJson.getInteger("unit_type");
+                if (Check.isNull(unit_type)) {
+                    throw new Exception("请选择创意制作方式");
                 }
+                createJson.put("unit_type", groupCreateJson.getInteger("unit_type")); //创意制作方式
                 if (!Check.isNull(groupCreateJson.getString("begin_time"))) {
                     createJson.put("begin_time", groupCreateJson.getString("begin_time")); //投放开始时间
                 }
@@ -172,6 +181,7 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
                     returnJson.put("unit_id", unitId);
                     returnJson.put("code", 0);
                     returnJson.put("message", "广告组创建成功");
+                    returnJson.put("type", 1);
                     KuaiShouGroup group = groupService.selectGroupByUnitId(oauthToken.getAccountId(), unitId);
                     if (!Check.isNull(group)) {
                         returnJson.put("group_create_time", group.getGroupCreateTime());
@@ -179,13 +189,18 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
                     Thread thread = new Thread() {
                         @Override
                         public void run() {
-                            createCreative(oauthToken, unitId, groupCreateJson.getJSONArray("creative_list"));
+                            if (unit_type == 4) { //  自定义2.0创意
+                                createCreative(oauthToken, unitId, groupCreateJson.getJSONArray("creative_list"));
+                            } else if (unit_type == 7) { // 程序化创意
+                                createProgramCreative(oauthToken, unitId, groupCreateJson.getJSONObject("programCreative"));
+                            }
                         }
                     };
                     thread.start();
                 } else {
                     returnJson.put("code", -1);
                     returnJson.put("message", unitMap.get("message"));
+                    returnJson.put("type", 1);
                 }
                 returnArr.add(returnJson);
             } catch (Exception e) {
@@ -193,6 +208,7 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
                 returnJson.put("group_uuid", group_uuid);
                 returnJson.put("code", -1);
                 returnJson.put("message", e.getMessage());
+                returnJson.put("type", 1);
                 returnArr.add(returnJson);
             }
         }
@@ -201,7 +217,7 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
 
 
     /**
-     * 创建广告创意
+     * 创建自定义广告创意
      *
      * @param oauthToken
      * @param unit_id
@@ -311,14 +327,137 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
 
     }
 
+
+    /**
+     * 创建程序化创意
+     *
+     * @param oauthToken
+     * @param unit_id
+     * @param programCreativeJson
+     */
+    private void createProgramCreative(CtopOauthToken oauthToken, Long unit_id, JSONObject programCreativeJson) {
+        JSONArray returnArray = new JSONArray();
+        String creative_uuid = programCreativeJson.getString("creative_uuid");
+        try {
+            JSONObject programJson = new JSONObject();
+            programJson.put("advertiser_id", oauthToken.getAccountId());
+            programJson.put("unit_id", unit_id);
+            if (!Check.isNull(programCreativeJson.getString("package_name"))) {
+                programJson.put("package_name", programCreativeJson.getString("package_name"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("horizontal_photo_ids"))) {
+                programJson.put("horizontal_photo_ids", programCreativeJson.getJSONArray("horizontal_photo_ids"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("vertical_photo_ids"))) {
+                programJson.put("vertical_photo_ids", programCreativeJson.getJSONArray("vertical_photo_ids"));
+            }
+            JSONArray cover_image_tokens = new JSONArray();
+            JSONArray image_md5s = programCreativeJson.getJSONArray("image_md5s");
+            if (!Check.isNull(image_md5s)) {
+                for (int i = 0; i < image_md5s.size(); i++) {
+                    String image_md5 = (String) image_md5s.get(i);
+                    if (!Check.isNull(image_md5)) {
+                        String imageToken = getImageToken(image_md5, oauthToken.getAccountId(), oauthToken.getAccessToken());
+                        if (!Check.isNull(imageToken)) {
+                            cover_image_tokens.add(imageToken);
+                        }
+                    }
+                }
+                programJson.put("cover_image_tokens", cover_image_tokens);
+            }
+            if (!Check.isNull(programCreativeJson.getLong("site_id"))) {
+                programJson.put("site_id", programCreativeJson.getLong("site_id"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("sticker_styles"))) {
+                programJson.put("sticker_styles", programCreativeJson.getJSONArray("sticker_styles"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("cover_slogans"))) {
+                programJson.put("cover_slogans", programCreativeJson.getJSONArray("cover_slogans"));
+            }
+            if (!Check.isNull(programCreativeJson.getString("action_bar"))) {
+                programJson.put("action_bar", programCreativeJson.getString("action_bar"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("captions"))) {
+                programJson.put("captions", programCreativeJson.getJSONArray("captions"));
+            }
+            if (!Check.isNull(programCreativeJson.getString("click_url"))) {
+                programJson.put("click_url", programCreativeJson.getString("click_url"));
+            }
+            if (!Check.isNull(programCreativeJson.getString("actionbar_click_url"))) {
+                programJson.put("actionbar_click_url", programCreativeJson.getString("actionbar_click_url"));
+            }
+            if (!Check.isNull(programCreativeJson.getInteger("creative_category"))) {
+                programJson.put("creative_category", programCreativeJson.getInteger("creative_category"));
+            }
+            if (!Check.isNull(programCreativeJson.getJSONArray("creative_tag"))) {
+                programJson.put("creative_tag", programCreativeJson.getJSONArray("creative_tag"));
+            }
+            Map<String, String> headers = new HashMap<>();
+            headers.put("Content-Type", "application/json");
+            headers.put("Access-Token", oauthToken.getAccessToken());
+            String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.PROGRAM_CREATE;
+            String result = HttpUtils.kuaiShouhttpPostRequest(url, programJson.toJSONString(), headers);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            JSONObject returnJson = new JSONObject();
+            returnJson.put("creative_uuid", creative_uuid);
+            if (!Check.isNull(resultJson)) {
+                if (resultJson.getInteger("code") == 0) {
+                    returnJson.put("unit_id", unit_id);
+                    returnJson.put("type", 2);
+                    returnJson.put("code", 0);
+                    returnJson.put("message", "程序化创意创建成功");
+                } else {
+                    returnJson.put("code", -1);
+                    returnJson.put("type", 2);
+                    returnJson.put("message", resultJson.getString("message"));
+                }
+            }
+            returnArray.add(returnJson);
+        } catch (Exception e) {
+            e.printStackTrace();
+            JSONObject returnJson = new JSONObject();
+            returnJson.put("creative_uuid", creative_uuid);
+            returnJson.put("message", e.getMessage());
+            returnJson.put("type", 2);
+            returnJson.put("code", -1);
+            returnArray.add(returnJson);
+        }
+        callback(creativeUrl, returnArray, "program_create");
+    }
+
+
+    /**
+     * 回调
+     *
+     * @param url
+     * @param requestArr
+     * @param type
+     */
     private void callback(String url, JSONArray requestArr, String type) {
         JSONObject requestJson = new JSONObject();
         requestJson.put("callbackData", requestArr);
         String s = HttpUtils2.httpPostRequest(url, requestJson, null);
         JSONObject jsonObject = JSONObject.parseObject(s);
-        log.info("{},回调数据返回结果:{}", type, jsonObject);
+        if (!Check.isNull(jsonObject)) {
+            Integer code = jsonObject.getInteger("code");
+            if (code == 0) {
+                log.info("{},回调成功", type);
+            } else {
+                log.info("{},回调失败,入参:{}", type, requestJson);
+            }
+        } else {
+            log.info("{},回调返回结果为空,入参:{}", type, requestJson);
+        }
     }
 
+    /**
+     * 根据封面MD5 获取imageToken
+     *
+     * @param md5
+     * @param accountId
+     * @param accessToken
+     * @return
+     */
     private String getImageToken(String md5, Long accountId, String accessToken) {
         String imageToken = null;
         QueryWrapper<KuaiShouImageGet> queryWrapper = new QueryWrapper<>();
@@ -337,6 +476,12 @@ public class KuaiShouCreateServiceImpl implements IKuaiShouCreateService {
         return imageToken;
     }
 
+    /**
+     * 获取定向包
+     *
+     * @param unitJson
+     * @return
+     */
     private JSONObject getTarget(JSONObject unitJson) {
         JSONObject target = new JSONObject();
         if (!Check.isNull(unitJson.getJSONArray("region"))) {

+ 13 - 3
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaiShouGroupTemplateController.java

@@ -35,6 +35,8 @@ import java.net.URLDecoder;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * 创建组模板
@@ -50,7 +52,7 @@ import java.util.Map;
 public class KuaiShouGroupTemplateController {
     @Autowired
     private IKuaiShouGroupTemplateService kuaiShouGroupTemplateService;
-
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
 
     /**
      * 批量创建广告组
@@ -78,11 +80,19 @@ public class KuaiShouGroupTemplateController {
 
     }
 
+
     @GetMapping(value = "/createUnit")
-    public Result<JSONObject> createUnit() {
+    public Result<JSONObject> createUnit(Long id) {
         Result<JSONObject> result = new Result<>();
         try {
-            kuaiShouGroupTemplateService.createUnit();
+            KuaiShouGroupTemplate template = kuaiShouGroupTemplateService.getById(id);
+            if (!Check.isNull(template)) {
+                KuaiShouGroupTemplate updateTemplate = new KuaiShouGroupTemplate();
+                updateTemplate.setId(template.getId());
+                updateTemplate.setTaskStatus(1);
+                kuaiShouGroupTemplateService.updateById(updateTemplate);   // 修改状态为创建中
+                executorService.submit(() -> kuaiShouGroupTemplateService.createUnit(template));
+            }
             result.setSuccess(true);
         } catch (Exception e) {
             e.printStackTrace();

+ 2 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/KuaiShouGroupTemplateMapper.java

@@ -25,4 +25,6 @@ public interface KuaiShouGroupTemplateMapper extends BaseMapper<KuaiShouGroupTem
     JSONObject getUrlByPhotoId(@Param("photoId") Long photoId);
 
     JSONObject getImageJsonByMd5(String md5);
+
+    List<Long> getIdList();
 }

+ 7 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouGroupTemplateMapper.xml

@@ -48,4 +48,11 @@
      limit 1
     </select>
 
+    <select id="getIdList" resultType="java.lang.Long">
+    select id  from ctop_kuaishou_group_template
+    where  task_status = 0
+    order by create_time desc
+    limit 70
+    </select>
+
 </mapper>

+ 1 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouVideoGetMapper.xml

@@ -92,6 +92,7 @@
         photo_id as 'photo_id',
         signature as 'signature',
         stat_date as 'stat_date',
+        material_type as 'material_type',
         channel_type as 'channel_type',
         url as 'video_url'
         from ctop_kuaishou_video_get

+ 7 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaishouVideoRelateCreativesMapper.xml

@@ -63,6 +63,12 @@
         <if test="creativeCount != null and creativeCount != '' ">
             AND creative_count = #{creativeCount}
         </if>
+        <if test="startTime != null and startTime != '' ">
+            AND stat_date &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != '' ">
+            AND stat_date &lt;= #{endTime}
+        </if>
         ORDER BY stat_date ASC
         LIMIT #{videoCnt}
     </select>
@@ -73,6 +79,7 @@
         t2.signature,
         t1.charge,
         t2.channel_type,
+        t2.material_type as 'material_type',
         t2.url as 'video_url'
         FROM
         (

+ 10 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouGroupTemplateService.java

@@ -4,6 +4,8 @@ import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroupTemplate;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @Description: 创建组模板
  * @Author: jeecg-boot
@@ -14,7 +16,7 @@ public interface IKuaiShouGroupTemplateService extends IService<KuaiShouGroupTem
 
     JSONObject submitUnitTask(JSONObject requestJson) throws Exception;
 
-    void createUnit();
+    void createUnit(KuaiShouGroupTemplate template);
 
     /**
      * 获取api创建数
@@ -35,4 +37,11 @@ public interface IKuaiShouGroupTemplateService extends IService<KuaiShouGroupTem
     void createCreative(String accessToken, Long unitId, KuaiShouGroupTemplate template);
 
     JSONObject getUnionJson(Long templateId);
+
+    /**
+     * 获取待创建2.0Id列表
+     *
+     * @return
+     */
+    List<Long> getIdList();
 }

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouVideoRelateCreativesService.java

@@ -23,7 +23,7 @@ public interface IKuaishouVideoRelateCreativesService extends IService<KuaishouV
 
     List<JSONObject> getVideoListByMap(Map<String, Object> requestMap);
 
-    List<KuaishouVideoRelateCreatives> listByParams(Long accountId);
+    List<KuaishouVideoRelateCreatives> listByParams(Long accountId,Integer matNum);
 
     List<JSONObject> getVideoZeroListByMap(Map<String, Object> requestMap);
 

+ 128 - 141
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupTemplateServiceImpl.java

@@ -275,153 +275,135 @@ public class KuaiShouGroupTemplateServiceImpl extends ServiceImpl<KuaiShouGroupT
      * 创建组
      */
     @Override
-    public void createUnit() {
-        QueryWrapper<KuaiShouGroupTemplate> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("task_status", 0);
-        queryWrapper.orderByAsc("create_time");
-        queryWrapper.last("limit 45");
-        List<KuaiShouGroupTemplate> list = this.list(queryWrapper);
-        if (Check.isNull(list)) {
-            log.error("暂未未创建的组");
+    public void createUnit(KuaiShouGroupTemplate template) {
+        Long accountId = template.getAccountId();
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        KuaiShouGroupTemplate updateTemplate = new KuaiShouGroupTemplate();
+        if (Check.isNull(token)) {
+            updateTemplate.setTaskStatus(3);
+            updateTemplate.setReviewDetail("未获取到授权信息");
+            updateTemplate.setCreativeStatus(3);
+            updateTemplate.setCreativeReviewDetail("未获取到授权信息");
+            updateById(updateTemplate);
+            return;
+        }
+        JSONObject createUnitJson = new JSONObject();
+        JSONArray sceneIdArr = JSONArray.parseArray(template.getSceneId());
+        if (Check.isNull(sceneIdArr)) {
+            updateTemplate.setTaskStatus(3);
+            updateTemplate.setReviewDetail("scene_id不能为空");
+            updateTemplate.setCreativeStatus(3);
+            updateTemplate.setCreativeReviewDetail("组创建失败");
+            updateById(updateTemplate);
             return;
         }
-        for (KuaiShouGroupTemplate template : list) {
-            executorService.submit(new Runnable() {
+        createUnitJson.put("scene_id", sceneIdArr); //资源位置
+        Integer sceneId = (Integer) sceneIdArr.get(0);
+        if (sceneId != 5) {
+            if (!Check.isNull(template.getTemplateId())) {
+                createUnitJson.put("template_id", template.getTemplateId());
+            }
+        } else {
+            if (!Check.isNull(template.getTemplateId())) {
+                JSONObject unionJson = getUnionJson(template.getTemplateId());
+                if (unionJson.getInteger("code") != 0) {
+                    updateTemplate.setTaskStatus(3);
+                    updateTemplate.setReviewDetail(unionJson.getString("message"));
+                    updateTemplate.setCreativeStatus(3);
+                    updateTemplate.setCreativeReviewDetail("组创建失败");
+                    updateById(updateTemplate);
+                    return;
+                } else {
+                    createUnitJson.put("target", unionJson.getJSONObject("target"));
+                }
+            }
+        }
+        createUnitJson.put("campaign_id", template.getCampaignId());
+        createUnitJson.put("unit_name", template.getUnitName());
+        if (!Check.isNull(template.getBidType())) {
+            createUnitJson.put("bid_type", template.getBidType()); // 优化目标类型
+        }
+        if (!Check.isNull(template.getUseAppMarket())) {
+            createUnitJson.put("use_app_market", template.getUseAppMarket()); //优先从系统应用商店下载
+        }
+        if (!Check.isNull(template.getAppStore())) {
+            createUnitJson.put("app_store", JSONArray.parseArray(template.getAppStore())); //应用商店列表
+        }
+        if (!Check.isNull(template.getBid())) {
+            createUnitJson.put("bid", template.getBid()); //出价
+        }
+        if (!Check.isNull(template.getCpaBid())) {
+            createUnitJson.put("cpa_bid", template.getCpaBid()); //出价
+        }
+        if (!Check.isNull(template.getOcpxActionType())) {
+            createUnitJson.put("ocpx_action_type", template.getOcpxActionType()); //优化目标
+        }
+        if (!Check.isNull(template.getDeepConversionType())) {
+            createUnitJson.put("deep_conversion_type", template.getDeepConversionType()); //深度转化目标
+        }
+        if (!Check.isNull(template.getDeepConversionBid())) {
+            createUnitJson.put("deep_conversion_bid", template.getDeepConversionBid()); //深度转化目标出价
+        }
+        if (!Check.isNull(template.getUnitType())) {
+            createUnitJson.put("unit_type", template.getUnitType()); //创意制作方式
+        }
+        if (!Check.isNull(template.getBeginTime())) {
+            createUnitJson.put("begin_time", template.getBeginTime()); //投放开始时间
+        }
+        if (!Check.isNull(template.getEndTime())) {
+            createUnitJson.put("end_time", template.getEndTime()); //投放结束时间
+        }
+        if (!Check.isNull(template.getScheduleTime())) {
+            createUnitJson.put("schedule_time", template.getScheduleTime()); //投放时间段
+        }
+        if (!Check.isNull(template.getDayBudget())) {
+            createUnitJson.put("day_budget", template.getDayBudget()); //单日预算金额
+        }
+        if (!Check.isNull(template.getConvertId())) {
+            createUnitJson.put("convert_id", template.getConvertId()); //转化目标ID
+        }
+        if (!Check.isNull(template.getUrlType())) {
+            createUnitJson.put("url_type", template.getUrlType()); //url类型
+        }
+        if (!Check.isNull(template.getUrl())) {
+            createUnitJson.put("url", template.getUrl()); // 投放链接
+        }
+        if (!Check.isNull(template.getAppId())) {
+            createUnitJson.put("app_id", template.getAppId()); // 应用ID
+        }
+        if (!Check.isNull(template.getShowMode())) {
+            createUnitJson.put("show_mode", template.getShowMode()); // 创意展现方式
+        }
+        if (!Check.isNull(template.getSpeed())) {
+            createUnitJson.put("speed", template.getSpeed()); // 投放方式
+        }
+        Map<String, Object> groupMap = iKuaishouInterfaceService.adUnitCreate(token.getAccessToken(), accountId, createUnitJson, 1);
+        updateTemplate = new KuaiShouGroupTemplate();
+        updateTemplate.setId(template.getId());
+        Integer code = (Integer) groupMap.get("code");
+        if (code == 0) {
+            updateTemplate.setTaskStatus(2);
+            Long unit = (Long) groupMap.get("unitId");
+            updateTemplate.setUnitId((unit));
+            Thread thread = new Thread() {
                 @Override
                 public void run() {
-
-                    Long accountId = template.getAccountId();
-                    CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
-                    if (Check.isNull(token)) {
-                        return;
-                    }
-                    KuaiShouGroupTemplate updateTemplate = new KuaiShouGroupTemplate();
-                    updateTemplate.setId(template.getId());
-                    updateTemplate.setTaskStatus(1);
-                    updateById(updateTemplate);   // 修改状态为创建中
-                    JSONObject createUnitJson = new JSONObject();
-
-                    JSONArray sceneIdArr = JSONArray.parseArray(template.getSceneId());
-                    if (Check.isNull(sceneIdArr)) {
-                        updateTemplate.setTaskStatus(3);
-                        updateTemplate.setReviewDetail("scene_id不能为空");
-                        updateTemplate.setCreativeStatus(3);
-                        updateTemplate.setCreativeReviewDetail("组创建失败");
-                        updateById(updateTemplate);
-                        return;
-                    }
-                    createUnitJson.put("scene_id", sceneIdArr); //资源位置
-                    Integer sceneId = (Integer) sceneIdArr.get(0);
-                    if (sceneId != 5) {
-                        if (!Check.isNull(template.getTemplateId())) {
-                            createUnitJson.put("template_id", template.getTemplateId());
-                        }
-                    } else {
-                        if (!Check.isNull(template.getTemplateId())) {
-                            JSONObject unionJson = getUnionJson(template.getTemplateId());
-                            if (unionJson.getInteger("code") != 0) {
-                                updateTemplate.setTaskStatus(3);
-                                updateTemplate.setReviewDetail(unionJson.getString("message"));
-                                updateTemplate.setCreativeStatus(3);
-                                updateTemplate.setCreativeReviewDetail("组创建失败");
-                                updateById(updateTemplate);
-                                return;
-                            } else {
-                                createUnitJson.put("target", unionJson.getJSONObject("target"));
-                            }
-                        }
-                    }
-                    createUnitJson.put("campaign_id", template.getCampaignId());
-                    createUnitJson.put("unit_name", template.getUnitName());
-                    if (!Check.isNull(template.getBidType())) {
-                        createUnitJson.put("bid_type", template.getBidType()); // 优化目标类型
-                    }
-                    if (!Check.isNull(template.getUseAppMarket())) {
-                        createUnitJson.put("use_app_market", template.getUseAppMarket()); //优先从系统应用商店下载
-                    }
-                    if (!Check.isNull(template.getAppStore())) {
-                        createUnitJson.put("app_store", JSONArray.parseArray(template.getAppStore())); //应用商店列表
-                    }
-                    if (!Check.isNull(template.getBid())) {
-                        createUnitJson.put("bid", template.getBid()); //出价
-                    }
-                    if (!Check.isNull(template.getCpaBid())) {
-                        createUnitJson.put("cpa_bid", template.getCpaBid()); //出价
-                    }
-                    if (!Check.isNull(template.getOcpxActionType())) {
-                        createUnitJson.put("ocpx_action_type", template.getOcpxActionType()); //优化目标
-                    }
-                    if (!Check.isNull(template.getDeepConversionType())) {
-                        createUnitJson.put("deep_conversion_type", template.getDeepConversionType()); //深度转化目标
-                    }
-                    if (!Check.isNull(template.getDeepConversionBid())) {
-                        createUnitJson.put("deep_conversion_bid", template.getDeepConversionBid()); //深度转化目标出价
-                    }
-                    if (!Check.isNull(template.getUnitType())) {
-                        createUnitJson.put("unit_type", template.getUnitType()); //创意制作方式
-                    }
-                    if (!Check.isNull(template.getBeginTime())) {
-                        createUnitJson.put("begin_time", template.getBeginTime()); //投放开始时间
-                    }
-                    if (!Check.isNull(template.getEndTime())) {
-                        createUnitJson.put("end_time", template.getEndTime()); //投放结束时间
-                    }
-                    if (!Check.isNull(template.getScheduleTime())) {
-                        createUnitJson.put("schedule_time", template.getScheduleTime()); //投放时间段
-                    }
-                    if (!Check.isNull(template.getDayBudget())) {
-                        createUnitJson.put("day_budget", template.getDayBudget()); //单日预算金额
-                    }
-                    if (!Check.isNull(template.getConvertId())) {
-                        createUnitJson.put("convert_id", template.getConvertId()); //转化目标ID
-                    }
-                    if (!Check.isNull(template.getUrlType())) {
-                        createUnitJson.put("url_type", template.getUrlType()); //url类型
-                    }
-                    if (!Check.isNull(template.getUrl())) {
-                        createUnitJson.put("url", template.getUrl()); // 投放链接
-                    }
-                    if (!Check.isNull(template.getAppId())) {
-                        createUnitJson.put("app_id", template.getAppId()); // 应用ID
-                    }
-                    if (!Check.isNull(template.getShowMode())) {
-                        createUnitJson.put("show_mode", template.getShowMode()); // 创意展现方式
-                    }
-                    if (!Check.isNull(template.getSpeed())) {
-                        createUnitJson.put("speed", template.getSpeed()); // 投放方式
-                    }
-                    Map<String, Object> groupMap = iKuaishouInterfaceService.adUnitCreate(token.getAccessToken(), accountId, createUnitJson, 1);
-                    updateTemplate = new KuaiShouGroupTemplate();
-                    updateTemplate.setId(template.getId());
-                    Integer code = (Integer) groupMap.get("code");
-                    if (code == 0) {
-                        updateTemplate.setTaskStatus(2);
-                        Long unit = (Long) groupMap.get("unitId");
-                        updateTemplate.setUnitId((unit));
-                        Thread thread = new Thread() {
-                            @Override
-                            public void run() {
-                                createCreative(token.getAccessToken(), unit, template);
-                            }
-                        };
-                        thread.start();
-                    } else {
-                        updateTemplate.setTaskStatus(3);
-                        updateTemplate.setReviewDetail((String) groupMap.get("message"));
-                        updateTemplate.setCreativeStatus(3);
-                        updateTemplate.setCreativeReviewDetail("组创建失败");
-                    }
-                    updateById(updateTemplate);
-                    try {
-                        Thread.sleep(2 * 1000);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
-
+                    createCreative(token.getAccessToken(), unit, template);
                 }
-            });
+            };
+            thread.start();
+        } else {
+            updateTemplate.setTaskStatus(3);
+            updateTemplate.setReviewDetail((String) groupMap.get("message"));
+            updateTemplate.setCreativeStatus(3);
+            updateTemplate.setCreativeReviewDetail("组创建失败");
+        }
+        updateById(updateTemplate);
+        try {
+            Thread.sleep(2 * 1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
         }
-
     }
 
 
@@ -513,6 +495,11 @@ public class KuaiShouGroupTemplateServiceImpl extends ServiceImpl<KuaiShouGroupT
         return returnJson;
     }
 
+    @Override
+    public List<Long> getIdList() {
+        return groupTemplateMapper.getIdList();
+    }
+
     /**
      * 获取当天api创建创意数
      *

+ 0 - 13
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouProgramCreativeServiceImpl.java

@@ -122,8 +122,6 @@ public class KuaishouProgramCreativeServiceImpl extends ServiceImpl<KuaishouProg
 
         JSONObject returnJson = new JSONObject();
         try {
-
-
             JSONObject pramsJson = new JSONObject();
             pramsJson.put("advertiser_id", oauthToken.getAccountId());
             pramsJson.put("unit_id", requestJson.getLong("unitId"));
@@ -134,7 +132,6 @@ public class KuaishouProgramCreativeServiceImpl extends ServiceImpl<KuaishouProg
             if (!Check.isNull(requestJson.getLong("siteId"))) {
                 pramsJson.put("site_id", requestJson.getLong("siteId"));
             }
-
             if (!Check.isNull(requestJson.getJSONArray("stickerStyles"))) {
                 pramsJson.put("sticker_styles", requestJson.getJSONArray("stickerStyles"));
             }
@@ -166,14 +163,12 @@ public class KuaishouProgramCreativeServiceImpl extends ServiceImpl<KuaishouProg
             JSONArray cover_image_tokens = new JSONArray();
             requestJson.remove(coverImageTokens);
             if (!Check.isNull(coverImageTokens)) {
-
                 for (int i = 0; i < coverImageTokens.size(); i++) {
                     String signature = coverImageTokens.getString(i);
                     if (Check.isNull(signature)) {
                         continue;
                     }
                     String imageToken = null;
-
                     if (!Check.isNull(signature)) {
                         QueryWrapper<KuaiShouImageGet> queryWrapper = new QueryWrapper<>();
                         queryWrapper.eq("account_id", oauthToken.getAccountId());
@@ -188,15 +183,9 @@ public class KuaishouProgramCreativeServiceImpl extends ServiceImpl<KuaishouProg
                         }
                         cover_image_tokens.add(imageToken);
                     }
-
-
                 }
-
-
             }
-
             pramsJson.put("cover_image_tokens", cover_image_tokens);
-
             String result = HttpUtils.kuaiShouhttpPostRequest(url, pramsJson.toJSONString(), headers);
             JSONObject jsonObject = JSONObject.parseObject(result);
             log.info("创建程序化创意返回结果:{}", jsonObject);
@@ -220,8 +209,6 @@ public class KuaishouProgramCreativeServiceImpl extends ServiceImpl<KuaishouProg
             returnJson.put("message", "系统错误");
 
         }
-
-
         return returnJson;
     }
 

+ 5 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouVideoRelateCreativesServiceImpl.java

@@ -150,14 +150,17 @@ public class KuaishouVideoRelateCreativesServiceImpl extends ServiceImpl<Kuaisho
     }
 
     @Override
-    public List<KuaishouVideoRelateCreatives> listByParams(Long accountId) {
+    public List<KuaishouVideoRelateCreatives> listByParams(Long accountId,Integer matNum) {
         QueryWrapper<KuaishouVideoRelateCreatives> queryWrapper = new QueryWrapper<>();
         if(null!=accountId&&accountId!=0){
             queryWrapper.eq("account_id",accountId);
         }
+        if(null == matNum||matNum == 0){
+            matNum = 10;
+        }
         queryWrapper.eq("creative_count",0);
         queryWrapper.orderByDesc("stat_date");
-        queryWrapper.last("limit 10");
+        queryWrapper.last("limit "+matNum);
         return this.list(queryWrapper);
     }
 

+ 2 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouVideoEtlInfoServiceImpl.java

@@ -110,7 +110,7 @@ public class KuaishouVideoEtlInfoServiceImpl extends ServiceImpl<KuaishouVideoEt
                                 etlInfo.setEffectDate(date);
                                 etlInfo.setEffectDayNum(days);
                             }
-                            if(totalCost.compareTo(new BigDecimal("100000"))>0){
+                            if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                 //此刻成为爆款
                                 etlInfo.setFaddishDate(date);
                                 etlInfo.setFaddishDayNum(days);
@@ -145,7 +145,7 @@ public class KuaishouVideoEtlInfoServiceImpl extends ServiceImpl<KuaishouVideoEt
                                 }
                             }
                             if(null == etlInfo.getFaddishDayNum()){
-                                if(totalCost.compareTo(new BigDecimal("100000"))>0){
+                                if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                     //此刻成为爆款
                                     etlInfo.setFaddishDate(date);
                                     etlInfo.setFaddishDayNum(days);

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

@@ -0,0 +1,56 @@
+package cn.com.ctop.toutiao.modules.report.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 头条账户报表任务执行记录信息
+ * @author jeecg-boot
+ * @date   2021-01-20
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_account_report_task_record")
+@EqualsAndHashCode(callSuper = false)
+public class BytedanceAccountReportTaskRecord {
+
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Long id;
+	/**accountId*/
+	private Long accountId;
+	/**startDate*/
+	private String startDate;
+	/**endDate*/
+	private String endDate;
+	/**status*/
+	private Integer status;
+	/**createTime*/
+	private Date createTime;
+	/**updateTime*/
+	private Date updateTime;
+	private String type;
+
+	public BytedanceAccountReportTaskRecord(Long accountId, String startDate, String endDate) {
+		this.accountId=accountId;
+		this.startDate = startDate;
+		this.endDate = endDate;
+		this.status = 1;
+		this.type = "ACCOUNT_DAILY";
+		Date now = new Date();
+		this.createTime = now;
+		this.updateTime = now;
+	}
+}

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

@@ -0,0 +1,14 @@
+package cn.com.ctop.toutiao.modules.report.mapper;
+
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 头条账户报表任务执行记录信息
+ * @author: jeecg-boot
+ * @date:   2021-01-20
+ * @cersion: V1.0
+ */
+public interface BytedanceAccountReportTaskRecordMapper extends BaseMapper<BytedanceAccountReportTaskRecord> {
+
+}

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.report.mapper.BytedanceAccountReportTaskRecordMapper">
+
+</mapper>

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

@@ -0,0 +1,17 @@
+package cn.com.ctop.toutiao.modules.report.service;
+
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * @Description: 头条账户报表任务执行记录信息
+ * @Author: jeecg-boot
+ * @Date:   2021-01-20
+ * @Version: V1.0
+ */
+public interface IBytedanceAccountReportTaskRecordService extends IService<BytedanceAccountReportTaskRecord> {
+
+    List<BytedanceAccountReportTaskRecord> listByParams(Integer status, String reportType);
+}

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

@@ -1,6 +1,7 @@
 package cn.com.ctop.toutiao.modules.report.service;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceReportMaterialRetry;
 import com.alibaba.fastjson.JSONObject;
 
@@ -38,4 +39,6 @@ public interface IBytedanceReportService {
     List<BytedanceReportMaterialRetry> getRetryList();
 
     int bytedanceVideoMaterialReport(CtopOauthToken token, String startDate, String endDate);
+
+    void bytedanceMaterialReportV2(BytedanceAccountReportTaskRecord record);
 }

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

@@ -1,6 +1,7 @@
 package cn.com.ctop.toutiao.modules.report.service;
 
 import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
 import com.alibaba.fastjson.JSONObject;
 
 import java.util.Date;
@@ -25,4 +26,6 @@ public interface IReportService {
     void getMaterialReportByPage(CtopOauthToken token, String startDate, String endDate, Integer pageNum);
 
     void loadBytedanceHistoryData(CtopOauthToken token);
+
+    void getAdvertiserReport(BytedanceAccountReportTaskRecord record, String bytedanceReportTypeDaily);
 }

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

@@ -0,0 +1,32 @@
+package cn.com.ctop.toutiao.modules.report.service.impl;
+
+import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceAccountReportTaskRecordMapper;
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceAccountReportTaskRecordService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 头条账户报表任务执行记录信息
+ * @author jeecg-boot
+ * @date   2021-01-20
+ * @version V1.0
+ */
+@Service
+public class BytedanceAccountReportTaskRecordServiceImpl extends ServiceImpl<BytedanceAccountReportTaskRecordMapper, BytedanceAccountReportTaskRecord> implements IBytedanceAccountReportTaskRecordService {
+
+    @Override
+    public List<BytedanceAccountReportTaskRecord> listByParams(Integer status, String reportType) {
+        QueryWrapper<BytedanceAccountReportTaskRecord> queryWrapper = new QueryWrapper<>();
+        if(null!=status){
+            queryWrapper.eq("status",status);
+        }
+        if(null!=reportType&&!"".equals(reportType)){
+            queryWrapper.eq("type",reportType);
+        }
+        return this.list(queryWrapper);
+    }
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 172 - 155
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java


+ 2 - 2
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceVideoEtlInfoServiceImpl.java

@@ -110,7 +110,7 @@ public class BytedanceVideoEtlInfoServiceImpl extends ServiceImpl<BytedanceVideo
                                 etlInfo.setEffectDate(date);
                                 etlInfo.setEffectDayNum(days);
                             }
-                            if(totalCost.compareTo(new BigDecimal("100000"))>0){
+                            if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                 //此刻成为爆款
                                 etlInfo.setFaddishDate(date);
                                 etlInfo.setFaddishDayNum(days);
@@ -145,7 +145,7 @@ public class BytedanceVideoEtlInfoServiceImpl extends ServiceImpl<BytedanceVideo
                                 }
                             }
                             if(null == etlInfo.getFaddishDayNum()){
-                                if(totalCost.compareTo(new BigDecimal("100000"))>0){
+                                if(totalCost.compareTo(new BigDecimal("50000"))>0){
                                     //此刻成为爆款
                                     etlInfo.setFaddishDate(date);
                                     etlInfo.setFaddishDayNum(days);

+ 65 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -62,7 +63,7 @@ public class ReportServiceImpl implements IReportService {
     private IBytedanceCreativeDailyReportService creativeDailyReportService;
     @Autowired
     private IBytedanceCreativeHourlyReportService creativeHourlyReportService;
-    @Autowired
+    @Resource
     private BytedanceReportMaterialDailyMapper materialDailyMapper;
     @Autowired
     private IBytedanceReportService bytedanceReportService;
@@ -474,6 +475,58 @@ public class ReportServiceImpl implements IReportService {
         }
     }
 
+    @Override
+    public void getAdvertiserReport(BytedanceAccountReportTaskRecord record, String bytedanceReportTypeDaily) {
+        CtopOauthToken token  = tokenService.getTokenByAccountId(record.getAccountId());
+        if(null==token){
+            return;
+        }
+        var conditions = getTaskReportDTO(token, record.getStartDate(), record.getEndDate(), bytedanceReportTypeDaily);
+        getAdvertiserReportByPageV2(token, conditions,record);
+    }
+
+    @Autowired
+    private IBytedanceAccountReportTaskRecordService recordService;
+
+    private void getAdvertiserReportByPageV2(CtopOauthToken token, ByteDanceAdvertiserReportDTO conditions,BytedanceAccountReportTaskRecord record) {
+        SerializeConfig config = new SerializeConfig();
+        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
+        JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(conditions, config));
+        JSONObject getObject = getAdvertiserStat(token, jsonObject);
+        System.out.println(getObject);
+        if(null == getObject){
+            XxlJobHelper.log("头条广告主数据获取异常");
+            return;
+        }
+        Integer code = getObject.getInteger("code");
+        String message = getObject.getString("message");
+        if (null == code || code != 0) {
+            XxlJobHelper.log("头条广告主数据获取异常:{}", message);
+            return;
+        }
+        JSONArray dataArray = getObject.getJSONObject("data").getJSONArray("list");
+        if (null == dataArray || dataArray.isEmpty()) {
+            record.setStatus(100);
+            record.setUpdateTime(new Date());
+            recordService.updateById(record);
+            return;
+        }
+
+        for (int i = 0; i < dataArray.size(); i++) {
+            JSONObject data = dataArray.getJSONObject(i);
+            if (null != conditions.getTimeGranularity() && conditions.getTimeGranularity().equals(CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY)) {
+                BytedanceAdvertiserHourlyReport hourlyReport = new BytedanceAdvertiserHourlyReport(data);
+                advertiserHourlyReportService.saveOrUpdate(hourlyReport);
+            } else {
+                BytedanceAdvertiserDailyReport dailyReport = new BytedanceAdvertiserDailyReport(data);
+                advertiserDailyReportService.saveOrUpdate(dailyReport);
+            }
+        }
+        record.setStatus(100);
+        record.setUpdateTime(new Date());
+        recordService.updateById(record);
+    }
+
     private ByteDanceAdvertiserReportDTO getReportDTO(CtopOauthToken token, Date startDate, Date endDate, String bytedanceReportTypePl) {
         var conditions = new ByteDanceAdvertiserReportDTO();
         conditions.setAdvertiserId(token.getAccountId());
@@ -484,6 +537,17 @@ public class ReportServiceImpl implements IReportService {
         return conditions;
     }
 
+    private ByteDanceAdvertiserReportDTO getTaskReportDTO(CtopOauthToken token, String startDate, String endDate, String bytedanceReportTypePl) {
+        var conditions = new ByteDanceAdvertiserReportDTO();
+        conditions.setAdvertiserId(token.getAccountId());
+        conditions.setStartDate(startDate);
+        conditions.setEndDate(endDate);
+        conditions.setPageSize(1000);
+        conditions.setPage(1);
+        conditions.setTimeGranularity(bytedanceReportTypePl);
+        return conditions;
+    }
+
 
     private void getCreativeReportByPage(CtopOauthToken token, ByteDanceAdvertiserReportDTO conditions, int page) {
         conditions.setPage(page);