Ver código fonte

Merge branch 'master' into jiaoyang

# Conflicts:
#	jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
yumeng 4 anos atrás
pai
commit
93024765ef
37 arquivos alterados com 1039 adições e 375 exclusões
  1. 41 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  2. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/DesignerCommitProcessCtrl.java
  3. 3 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/OperatorApprovalProcessCtrl.java
  4. 9 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformMaterialCtrl.java
  5. 6 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformMaterialMapper.java
  6. 42 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformMaterialMapper.xml
  7. 6 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformMaterialService.java
  8. 10 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformMaterialServiceImpl.java
  9. 125 39
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/util/ApprovalNodeNoticeHandler.java
  10. 16 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java
  11. 4 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java
  12. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java
  13. 121 43
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  14. 59 60
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleTemplateServiceImpl.java
  15. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  16. 12 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  17. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  18. 5 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  19. 24 2
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java
  20. 4 0
      module-job-bytedance/src/main/resources/application-prod.yml
  21. 35 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouDailyImageReportLoadJob.java
  22. 19 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouActionBarTextJob.java
  23. 5 4
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java
  24. 109 58
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountTargetTemplate.java
  25. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouNewCreateCampaign.java
  26. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouNewCreateCampaignServiceImpl.java
  27. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaishouVideoRelateCreativesService.java
  28. 5 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouVideoRelateCreativesServiceImpl.java
  29. 56 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/entity/BytedanceAccountReportTaskRecord.java
  30. 14 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceAccountReportTaskRecordMapper.java
  31. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceAccountReportTaskRecordMapper.xml
  32. 17 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceAccountReportTaskRecordService.java
  33. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceReportService.java
  34. 3 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IReportService.java
  35. 32 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceAccountReportTaskRecordServiceImpl.java
  36. 172 155
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java
  37. 65 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java

+ 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;
 
@@ -97,6 +101,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")

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/DesignerCommitProcessCtrl.java

@@ -45,6 +45,7 @@ DesignerCommitProcessCtrl {
             //自动分发订单,生成物料审批流程
             platformOrderService.generateMaterials(platformOrder);
             operateRecordHandler.Approval(platformOrder.getOrderCode(),"ACCEPT_ORDER");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("ACCEPT_ORDER",platformOrder.getOrderCode());
             result.success("接单成功!");
         }else {
             result.error500("订单接单失败,请联系管理员!");
@@ -64,6 +65,7 @@ DesignerCommitProcessCtrl {
         boolean ok = platformOrderService.updateById(platformOrder);
         if (ok) {
             operateRecordHandler.Approval(platformOrder.getOrderCode(),"REJECT_ORDER");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("REJECT_ORDER",platformOrder.getOrderCode());
             result.success("订单已被驳回!");
         }else {
             result.error500("订单驳回失败,请联系管理员!");

+ 3 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/OperatorApprovalProcessCtrl.java

@@ -41,6 +41,7 @@ public class OperatorApprovalProcessCtrl {
             boolean save = platformOrderService.save(platformOrder);
             if (save) {
                 operateRecordHandler.Submit(platformOrder.getOrderCode(), "PAYOUT");
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("PAYOUT",platformOrder.getOrderCode());
                 result.setResult(platformOrderService.queryByCode(platformOrder.getOrderCode()));
                 result.success("下单成功!");
             }
@@ -61,6 +62,7 @@ public class OperatorApprovalProcessCtrl {
         boolean ok = platformOrderService.updateById(platformOrder);
         if (ok) {
             operateRecordHandler.Submit(platformOrder.getOrderCode(), "PAYOUT");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("PAYOUT",platformOrder.getOrderCode());
             result.success("订单重新提交成功!");
         }else {
             result.error500("订单重新提交异常,请联系管理员");
@@ -80,6 +82,7 @@ public class OperatorApprovalProcessCtrl {
         boolean ok = platformOrderService.updateById(platformOrder);
         if (ok) {
             operateRecordHandler.Approval(platformOrder.getOrderCode(), "DESTROY_ORDER");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_ORDER("DESTROY_ORDER",platformOrder.getOrderCode());
             result.success("接单已销毁!");
         } else {
             result.error500("订单销毁失败,请联系管理员!");

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

@@ -10,6 +10,7 @@ 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.IPlatformOrderService;
+import org.jeecg.modules.orderplatform.util.ApprovalNodeNoticeHandler;
 import org.jeecg.modules.orderplatform.util.DictHandler;
 import org.jeecg.modules.orderplatform.util.OperateRecordHandler;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,7 +38,10 @@ public class PlatformMaterialCtrl {
     private OperateRecordHandler operateRecordHandler;
 
     @Autowired
-    DictHandler dictHandler;
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
+    @Autowired
+    private DictHandler dictHandler;
 
     /**
      * 根据orderCode查询关联物料
@@ -118,6 +122,7 @@ public class PlatformMaterialCtrl {
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
             operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "ACCEPT_SCRIPT");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("ACCEPT_SCRIPT",platformMaterial.getMaterialCode());
             result.success("脚本审核通过!");
         } else {
             result.error500("脚本审核失败!请联系管理员");
@@ -135,6 +140,7 @@ public class PlatformMaterialCtrl {
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
             operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "REJECT_SCRIPT");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("REJECT_SCRIPT",platformMaterial.getMaterialCode());
             result.success("脚本已驳回!");
         } else {
             result.error500("脚本驳回失败!请联系管理员");
@@ -192,8 +198,7 @@ public class PlatformMaterialCtrl {
             boolean order = platformOrderService.updateOrderFinishAmount(platformMaterial.getOrderCode());
             if (order) {
                 operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "ACCEPT_VIDEO");
-                //修改素材库审核状态
-                //platformMaterialService.updateMaterialStatusById(platformMaterial.getVideoId());
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("ACCEPT_VIDEO",platformMaterial.getMaterialCode());
                 result.success("视频审核通过!");
             }
         } else {
@@ -212,6 +217,7 @@ public class PlatformMaterialCtrl {
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
             operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "REJECT_VIDEO");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("REJECT_VIDEO",platformMaterial.getMaterialCode());
             result.success("视频已驳回!");
         } else {
             result.error500("视频驳回失败!请联系管理员");

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

@@ -31,4 +31,10 @@ public interface PlatformMaterialMapper extends BaseMapper<PlatformMaterial> {
 
     int queryCountByMaterialAndVideo(@Param("materialCode") String materialCode,@Param("videoMd5") String videoMd5);
 
+    //查询物料相关人员
+    JSONObject queryMaterialRelatePersonByMaterialCode(@Param("materialCode") String materialCode);
+
+    //查询订单相关人员
+    JSONObject queryOrderRelatePersonByMaterialCode(@Param("orderCode") String orderCode);
+
 }

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

@@ -183,4 +183,45 @@
             material_code != #{materialCode}
           AND video_id = #{videoMd5}
     </select>
-</mapper>
+    <select id="queryMaterialRelatePersonByMaterialCode" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            t1.id AS materialId,
+            t2.id AS orderId,
+            t1.material_name AS materialName,
+            t2.order_title AS orderTitle,
+            t1.script_advise AS scriptAdvise,
+            t1.video_advise AS videoAdvise,
+            t1.plan,
+            t1.shot,
+            t1.clip,
+            t2.design,
+            t2.create_by as operator,
+            (SELECT realname from sys_user where id=t1.clip limit 1) as clipName,
+            (SELECT realname from sys_user where id=t1.shot limit 1) as shotName,
+            (SELECT realname from sys_user where id=t1.plan limit 1) as planName,
+            (SELECT realname from sys_user where id=t2.design limit 1) as designName,
+            (SELECT realname from sys_user where id=t2.create_by limit 1) as operatorName,
+            t3. NAME AS scriptName,
+            t4. NAME AS videoName
+        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_video t4 ON t1.video_id = t4.md5
+        where t1.material_code=#{materialCode}
+    </select>
+
+    <select id="queryOrderRelatePersonByMaterialCode" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            id AS orderId,
+            order_title AS orderTitle,
+            t1.design,
+            t1.create_by as operator,
+            (SELECT realname from sys_user where id=t1.create_by limit 1) as operatorName,
+            (SELECT realname from sys_user where id=t1.design limit 1) as designName
+        FROM
+            ctop_platform_order t1
+        WHERE
+            order_code = #{orderCode}
+    </select>
+</mapper>

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

@@ -51,8 +51,13 @@ public interface IPlatformMaterialService extends IService<PlatformMaterial> {
     Map<String,Object> videoEcho(String videoId);
 
     /**
-     *  根据
+     *  根据materialCode 查询企业微信通知人
      */
+    JSONObject getMaterialRelatePersonByMaterialCode(String materialCode);
 
+    /**
+     *  根据orderCode 查询企业微信通知人
+     */
+    JSONObject getOrderRelatePersonByMaterialCode(String orderCode);
 
 }

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

@@ -139,6 +139,16 @@ public class PlatformMaterialServiceImpl extends ServiceImpl<PlatformMaterialMap
         return result;
     }
 
+    @Override
+    public JSONObject getMaterialRelatePersonByMaterialCode(String materialCode) {
+        return platformMaterialMapper.queryMaterialRelatePersonByMaterialCode(materialCode);
+    }
+
+    @Override
+    public JSONObject getOrderRelatePersonByMaterialCode(String orderCode) {
+        return platformMaterialMapper.queryOrderRelatePersonByMaterialCode(orderCode);
+    }
+
     /**
      * 同步素材视频
      */

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

@@ -2,6 +2,7 @@ package org.jeecg.modules.orderplatform.util;
 
 import cn.com.ctop.common.module.mapper.MailLogMapper;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
+import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.modules.orderplatform.service.IPlatformMaterialService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,66 +23,152 @@ public class ApprovalNodeNoticeHandler {
     IPlatformMaterialService platformMaterialService;
 
     /**
-     * 审批节点发送
+     *  企业微信通知
      */
-    public void notice(String operate, Set<String> acceptor) {
+    public void NOTICE_WE_CHAT_ORDER(String operate, String orderCode){
+        Map<String, JSONObject> relatePerson=relatePerson(orderCode,null);
+        message(operate,null, relatePerson.get("orderRelatePerson"));
+    }
+
+    public void NOTICE_WE_CHAT_MATERIAL(String operate, String materialCode){
+        Map<String, JSONObject> relatePerson=relatePerson(null,materialCode);
+        message(operate,relatePerson.get("materialRelatePerson"),null);
+    }
+
+    /**
+     * 查询消息接收者
+     */
+    private Map<String, JSONObject> relatePerson(String orderCode, String materialCode) {
+        Map<String, JSONObject> result = new HashMap<>();
+        if (null==materialCode) {
+            result.put("orderRelatePerson", platformMaterialService.getOrderRelatePersonByMaterialCode(orderCode));
+        } else {
+            result.put("materialRelatePerson", platformMaterialService.getMaterialRelatePersonByMaterialCode(materialCode));
+        }
+        return result;
+    }
+
+    /**
+     * 消息模板
+     */
+    private void message(String operate, JSONObject materialRelatePerson, JSONObject orderRelatePerson) {
         switch (operate) {
-            //设计组长接单,暂时不通知
+            //运营下单,通知设计组长接单派单
+            case "PAYOUT":
+                sendWeChat(orderRelatePerson.getString("design"),
+                        String.format("您收到一条新的素材订单,请及时查看!\n订单名称:%s\n 订单ID:%s\n下单人:%s",
+                                orderRelatePerson.getString("orderTitle"),
+                                orderRelatePerson.getLong("orderId"),
+                                orderRelatePerson.getString("operatorName")));
+                break;
+
+            //设计组长接单,发送通知给
             case "ACCEPT_ORDER":
-                sendWeChat(acceptor, "您发起的订单接单成功");
+                sendWeChat(orderRelatePerson.getString("operator"),
+                        String.format("您的订单“%s”已接单,请及时查看!\n 订单ID:%s\n操作人:%s",
+                                orderRelatePerson.getString("orderTitle"),
+                                orderRelatePerson.getLong("orderId"),
+                                orderRelatePerson.getString("designName")));
                 break;
+
             //设计组长驳回订单,通知下单运营订单已被驳回
             case "REJECT_ORDER":
-                sendWeChat(acceptor, "您有订单被驳回,请前往汇创平台处理");
+                sendWeChat(orderRelatePerson.getString("operator"),
+                        String.format("您的订单“%s”被驳回,请及时查看!\n 订单ID:%s\n操作人:%s\n驳回原因:%s",
+                                orderRelatePerson.getString("orderTitle"),
+                                orderRelatePerson.getLong("orderId"),
+                                orderRelatePerson.getString("designName"),
+                                orderRelatePerson.getString("orderAdvice")));
                 break;
-            //脚本审批通过,通知剪辑上传视频
-            case "ACCEPT_SCRIPT":
-                sendWeChat(acceptor, "有物料需要您上传视频,请前往汇创平台处理");
+
+            //销毁订单
+            case "DESTROY_ORDER":
+                sendWeChat(orderRelatePerson.getString("design"),
+                        String.format("您的订单“%s”已被撤回\n 订单ID:%s\n操作人:%s",
+                                orderRelatePerson.getString("orderTitle"),
+                                orderRelatePerson.getLong("orderId"),
+                                orderRelatePerson.getString("operatorName")));
                 break;
-            //脚本被驳回,通知编导重新上传脚本
-            case "REJECT_SCRIPT":
-                sendWeChat(acceptor, "您上传的脚本被驳回,请前往汇创平台处理");
+
+            //脚本上传成功,通知运营审核
+            case "SCRIPT":
+                sendWeChat(materialRelatePerson.getString("operator"),
+                        String.format("您的订单“%s”收到一条新的脚本,请及时审核!\n 订单ID:%s\n操作人:%s",
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("planName")));
                 break;
+
+            //视频上传成功,通知运营审核
+            case "VIDEO":
+                sendWeChat(materialRelatePerson.getString("operator"),
+                        String.format("您的订单“%s”收到一条新的视频,请及时审核!\n 订单ID:%s\n操作人:%s",
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("clipName")));
+                break;
+
+            //脚本审批通过,通知上传人
+            case "ACCEPT_SCRIPT":
+                sendWeChat(materialRelatePerson.getString("plan"),
+                        String.format("您的脚本“%s”已审核通过\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                                materialRelatePerson.getString("scriptName"),
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("operatorName")));
+                break;
+
             //视频通过暂不通知
             case "ACCEPT_VIDEO":
-                sendWeChat(acceptor, "审批通过了视频,请前往汇创平台处理");
+                sendWeChat(materialRelatePerson.getString("clip"),
+                        String.format("您的视频“%s”已审核通过\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                                materialRelatePerson.getString("videoName"),
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("operatorName")));
                 break;
+
+            //脚本被驳回,通知编导重新上传脚本
+            case "REJECT_SCRIPT":
+                sendWeChat(materialRelatePerson.getString("plan"),
+                        String.format("您的脚本“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                                materialRelatePerson.getString("scriptName"),
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("operatorName")));
+                break;
+
             //视频被驳回,通知剪辑重新上传视频
             case "REJECT_VIDEO":
-                sendWeChat(acceptor, "您上传的视频被驳回,请前往汇创平台处理");
-                break;
-            //运营下单,通知设计组长接单派单
-            case "PAYOUT":
-                sendWeChat(acceptor, "有一个订单需要您审批,请前往汇创平台处理");
-                break;
-            //设计上传脚本,通知运营审核
-            case "SCRIPT":
-                sendWeChat(acceptor, "有一个脚本需要您审批,请前往汇创平台处理");
-                break;
-            //设计上传视频,通知运营审核
-            case "VIDEO":
-                sendWeChat(acceptor, "有一个视频需要您审批,请前往汇创平台处理");
-                break;
+                sendWeChat(materialRelatePerson.getString("clip"),
+                        String.format("您的视频“%s”被驳回,请及时查看!\n 所属订单:%s\n 订单ID:%s\n审核人:%s",
+                                materialRelatePerson.getString("videoName"),
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("operatorName")));
+
         }
     }
 
     /**
-     *  查询消息接收者
+     * 发送通知消息到多人企业微信
      */
-    private Map<String, Map<String,String>> relatePerson(String orderCode,String materialCode){
-        Map<String,Map<String,String>> result= new HashMap<>();
-        if(materialCode.isEmpty()){
-
-        }else {
-
-        }
-        return result;
+    private void sendWeChat(Set<String> users, String message) {
+        users.forEach(userId -> {
+            String weChatId = mailLogMapper.getWChatIdByUserId(userId);
+            if (weChatId.isEmpty()) {
+                log.error(String.format("User WeChat not found. userId =%s", userId));
+                //TODO 通知管理员添加邮箱
+            } else {
+                CorpWexinUtils.sendMessageByWeChatId(weChatId, message);
+            }
+        });
     }
+
     /**
-     *  发送通知消息到企业微信
+     * 发送通知消息到多人企业微信
      */
-    private void sendWeChat(Set<String> users, String message) {
-        users.forEach(userId->{
+    private void sendWeChat(String userId, String message) {
             String weChatId = mailLogMapper.getWChatIdByUserId(userId);
             if (weChatId.isEmpty()) {
                 log.error(String.format("User WeChat not found. userId =%s", userId));
@@ -89,6 +176,5 @@ public class ApprovalNodeNoticeHandler {
             } else {
                 CorpWexinUtils.sendMessageByWeChatId(weChatId, message);
             }
-        });
     }
 }

+ 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;
+    }
+
     /**
      * 编辑
      *

+ 4 - 0
module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java

@@ -80,12 +80,16 @@ public class RuleTemplateController {
         } catch (Exception e) {
             e.printStackTrace();
             result.setSuccess(false);
+            result.setCode(-1);
             result.setMessage(e.getMessage());
         }
 
         return result;
     }
 
+    public static void main(String[] args) {
+        System.err.println(new JSONObject());
+    }
 
 
     /**

+ 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获取模板具体规则内容

+ 59 - 60
module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleTemplateServiceImpl.java

@@ -171,79 +171,78 @@ public class RuleTemplateServiceImpl extends ServiceImpl<RuleTemplateMapper, Rul
     public JSONObject queryDetailById(String id) throws Exception {
         JSONObject returnJson = new JSONObject();
         RuleTemplate template = ruleTemplateMapper.selectById(id);
-        if (Check.isNull(ruleTemplateMapper)) {
+        if (Check.isNull(template)) {
             throw new Exception("获取模板基本信息为空");
         }
-
         returnJson.put("templateId", template.getId());
         returnJson.put("templateName", template.getTemplateName());
         returnJson.put("mediaType", template.getMediaType());
         JSONArray groupIds = JSONArray.parseArray(template.getGroupIds());
-        if (Check.isNull(groupIds)) {
-            throw new Exception("未获取规则集");
-        }
-        JSONArray ruleList = new JSONArray();
-        for (int i = 0; i < groupIds.size(); i++) {
-            Long groupId = groupIds.getLong(i);
-            RuleGroup group = ruleGroupService.getById(groupId);
-            if (Check.isNull(group)) {
-                continue;
-            }
-            JSONObject groupJson = new JSONObject();
-            groupJson.put("groupId", group.getId());
-            groupJson.put("groupName", group.getGroupName());
-            groupJson.put("ruleType", group.getRuleType());
-            groupJson.put("ruleRelationship", group.getRuleRelationship());
-            groupJson.put("remark", group.getRemark());
-            groupJson.put("operate", group.getOperate());
-            groupJson.put("sendType", group.getSendType());
-            groupJson.put("isCopy", group.getIsCopy());
-            groupJson.put("isRequired", group.getIsRequired());
-            JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
-            if (Check.isNull(ruleIds)) {
-                continue;
-            }
-            JSONArray ruleDetail = new JSONArray();
-            for (int j = 0; j < ruleIds.size(); j++) {
-                Long ruleId = ruleIds.getLong(j);
-                RuleBase ruleBase = ruleBaseService.getById(ruleId);
-                if (Check.isNull(ruleBase)) {
+        if (!Check.isNull(groupIds)) {
+            JSONArray ruleList = new JSONArray();
+            for (int i = 0; i < groupIds.size(); i++) {
+                Long groupId = groupIds.getLong(i);
+                RuleGroup group = ruleGroupService.getById(groupId);
+                if (Check.isNull(group)) {
                     continue;
                 }
-                JSONObject ruleJson = new JSONObject();
-                ruleJson.put("ruleId", ruleBase.getId());
-                ruleJson.put("ruleName", ruleBase.getRuleName());
-                ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
-                ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
-                ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
-                ruleJson.put("threshold", ruleBase.getThreshold());
-                ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
-                ruleJson.put("variableType", ruleBase.getVariableType());
-                ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
-                /**
-                 * 查询指标对应信息
-                 */
-                QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
-                indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
-                indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
-                indicatorQueryWrapper.eq("media_type", template.getMediaType());
-                indicatorQueryWrapper.last("limit 1");
-                RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);
-                if (!Check.isNull(ruleIndicator)) {
-                    ruleJson.put("dataType", ruleIndicator.getDataType());
-                    ruleJson.put("dictId", ruleIndicator.getDictId());
-                    ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
-                    ruleJson.put("name", ruleIndicator.getName());
-                    ruleJson.put("modelType", ruleIndicator.getModelType());
+                JSONObject groupJson = new JSONObject();
+                groupJson.put("groupId", group.getId());
+                groupJson.put("groupName", group.getGroupName());
+                groupJson.put("ruleType", group.getRuleType());
+                groupJson.put("ruleRelationship", group.getRuleRelationship());
+                groupJson.put("remark", group.getRemark());
+                groupJson.put("operate", group.getOperate());
+                groupJson.put("sendType", group.getSendType());
+                groupJson.put("isCopy", group.getIsCopy());
+                groupJson.put("isRequired", group.getIsRequired());
+                JSONArray ruleIds = JSONArray.parseArray(group.getRuleIds());
+                if (Check.isNull(ruleIds)) {
+                    continue;
                 }
+                JSONArray ruleDetail = new JSONArray();
+                for (int j = 0; j < ruleIds.size(); j++) {
+                    Long ruleId = ruleIds.getLong(j);
+                    RuleBase ruleBase = ruleBaseService.getById(ruleId);
+                    if (Check.isNull(ruleBase)) {
+                        continue;
+                    }
+                    JSONObject ruleJson = new JSONObject();
+                    ruleJson.put("ruleId", ruleBase.getId());
+                    ruleJson.put("ruleName", ruleBase.getRuleName());
+                    ruleJson.put("judgeFormat", ruleBase.getJudgeFormat());
+                    ruleJson.put("indicatorCode", ruleBase.getIndicatorCode());
+                    ruleJson.put("ruleCondition", ruleBase.getRuleCondition());
+                    ruleJson.put("threshold", ruleBase.getThreshold());
+                    ruleJson.put("ruleDimension", ruleBase.getRuleDimension());
+                    ruleJson.put("variableType", ruleBase.getVariableType());
+                    ruleJson.put("isUnlimited", ruleBase.getIsUnlimited());
+                    /**
+                     * 查询指标对应信息
+                     */
+                    QueryWrapper<RuleIndicator> indicatorQueryWrapper = new QueryWrapper<>();
+                    indicatorQueryWrapper.eq("code", ruleBase.getIndicatorCode());
+                    indicatorQueryWrapper.eq("dimension", ruleBase.getRuleDimension());
+                    indicatorQueryWrapper.eq("media_type", template.getMediaType());
+                    indicatorQueryWrapper.last("limit 1");
+                    RuleIndicator ruleIndicator = ruleIndicatorService.getOne(indicatorQueryWrapper);
+                    if (!Check.isNull(ruleIndicator)) {
+                        ruleJson.put("dataType", ruleIndicator.getDataType());
+                        ruleJson.put("dictId", ruleIndicator.getDictId());
+                        ruleJson.put("dataUnit", ruleIndicator.getDataUnit());
+                        ruleJson.put("name", ruleIndicator.getName());
+                        ruleJson.put("modelType", ruleIndicator.getModelType());
+                    }
 
-                ruleDetail.add(ruleJson);
+                    ruleDetail.add(ruleJson);
+                }
+                groupJson.put("ruleDetail", ruleDetail);
+                ruleList.add(groupJson);
             }
-            groupJson.put("ruleDetail", ruleDetail);
-            ruleList.add(groupJson);
+            returnJson.put("ruleList", ruleList);
         }
 
-        returnJson.put("ruleList", ruleList);
+
         return returnJson;
     }
 

+ 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);
+            });
+        }
     }
 }

+ 4 - 0
module-job-bytedance/src/main/resources/application-prod.yml

@@ -227,3 +227,7 @@ xxl:
       logretentiondays: 30
     admin:
       addresses: http://139.186.29.76:8090/xxl-job-admin
+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

+ 35 - 0
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouDailyImageReportLoadJob.java

@@ -0,0 +1,35 @@
+package com.ctop.job.kuaishou.handler;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyImageService;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Component
+public class KuaiShouDailyImageReportLoadJob {
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Autowired
+    private IKuaishouReportDailyImageService kuaishouReportDailyImageService;
+    static ExecutorService executorService = Executors.newFixedThreadPool(8);
+    @XxlJob("kuaiShouDailyImageReportLoadJob")
+    public void execute() throws Exception {
+        //增加接口的开始和结束日期
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String yesterdayDate = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        //1:查询当日数据
+        List<CtopOauthToken> tokens = tokenService.selectKuaiShouToken();
+        tokens.forEach(token -> executorService.submit(() -> {
+            kuaishouReportDailyImageService.getMaterialImageReport(token.getAccountId(),token.getAccessToken(),yesterdayDate,yesterdayDate,1);
+        }));
+        XxlJobHelper.log("快手图片消耗报表同步完成");
+    }
+}

+ 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("快手行动号召按钮同步完成");
+    }
+}

+ 5 - 4
module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java

@@ -16,10 +16,11 @@ public class KuaishouAiAdsNewMaterialCreativityJob {
     IAiKuaishouNewCreateCampaign aiKuaishouNewCreateCampaign;
     @Autowired
     private IAiKuaishouAccountTargetTemplateService aiKuaishouAccountTargetTemplateService;
+
     @XxlJob("kuaishouAiAdsNewMaterialCreativityJob")
     public void kuaishouAiAdsNewMaterialCreativityJob() {
         List<AiKuaishouAccountTargetTemplate> accountTargetTemplates = aiKuaishouAccountTargetTemplateService.getAllEffectTemplate();
-        if(null==accountTargetTemplates||accountTargetTemplates.isEmpty()){
+        if (null == accountTargetTemplates || accountTargetTemplates.isEmpty()) {
             return;
         }
         accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAdsNewMaterialCreativity(targetTemplate));
@@ -29,16 +30,16 @@ public class KuaishouAiAdsNewMaterialCreativityJob {
     @XxlJob("kuaishouAiAddNewMaterialCreativityJob")
     public void kuaishouAiAddNewMaterialCreativityJob() {
         List<AiKuaishouAccountTargetTemplate> accountTargetTemplates = aiKuaishouAccountTargetTemplateService.getAllEffectTemplate();
-        if(null==accountTargetTemplates||accountTargetTemplates.isEmpty()){
+        if (null == accountTargetTemplates || accountTargetTemplates.isEmpty()) {
             return;
         }
-        accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(targetTemplate));
+        accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(targetTemplate, 10));
     }
 
     @XxlJob("kuaishouAiAdsHotMaterialCreativityJob")
     public void kuaishouAiAdsHotMaterialCreativityJob() {
         List<AiKuaishouAccountTargetTemplate> accountTargetTemplates = aiKuaishouAccountTargetTemplateService.getAllEffectTemplate();
-        if(null==accountTargetTemplates||accountTargetTemplates.isEmpty()){
+        if (null == accountTargetTemplates || accountTargetTemplates.isEmpty()) {
             return;
         }
         accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAdsHotMaterialCreativity(targetTemplate));

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

@@ -3,75 +3,126 @@ 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;
+    /**
+     * updateTime
+     */
+    private Date updateTime;
+    private String titlePrefix;
+    private String titleMiddle;
 }

+ 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);
 }

+ 2 - 2
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;

+ 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);
 

+ 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);
     }
 

+ 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);
+    }
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 172 - 155
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceReportServiceImpl.java


+ 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);