Ver código fonte

Merge branch 'V1.1.2' into batch

# Conflicts:
#	jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
yumeng 4 anos atrás
pai
commit
fd30bec5cc
100 arquivos alterados com 3332 adições e 698 exclusões
  1. 0 203
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialCutFrameController.java
  2. 64 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoAuthorController.java
  3. 113 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoCoverController.java
  4. 96 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoFrameController.java
  5. 80 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoInfoController.java
  6. 84 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoProjectController.java
  7. 62 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialVideoWatermarkController.java
  8. 41 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  9. 6 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/DesignerCommitProcessCtrl.java
  10. 7 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/OperatorApprovalProcessCtrl.java
  11. 38 31
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformFileCtrl.java
  12. 71 12
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformMaterialCtrl.java
  13. 95 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformScriptController.java
  14. 76 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/controller/PlatformVideoController.java
  15. 58 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/entity/PlatformScript.java
  16. 46 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/entity/PlatformVideo.java
  17. 12 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformMaterialMapper.java
  18. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformScriptMapper.java
  19. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/PlatformVideoMapper.java
  20. 79 17
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformMaterialMapper.xml
  21. 30 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformScriptMapper.xml
  22. 13 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/mapper/xml/PlatformVideoMapper.xml
  23. 22 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformMaterialService.java
  24. 18 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformScriptService.java
  25. 14 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/IPlatformVideoService.java
  26. 170 13
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformMaterialServiceImpl.java
  27. 6 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformOrderServiceImpl.java
  28. 61 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformScriptServiceImpl.java
  29. 146 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/service/impl/PlatformVideoServiceImpl.java
  30. 191 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/util/ApprovalNodeNoticeHandler.java
  31. 18 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/controller/UserImplController.java
  32. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/IWpsFileService.java
  33. 34 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/wps/service/impl/WpsFileServiceImpl.java
  34. 2 2
      jeecg-boot-module-system/src/main/resources/application-prod.yml
  35. 2 2
      jeecg-boot-module-system/src/main/resources/application-prod2.yml
  36. 1 1
      jeecg-boot-module-system/src/main/resources/application-test.yml
  37. 5 0
      jeecg-boot-module-system/src/main/resources/application-wps.yml
  38. 48 24
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  39. 16 34
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/constant/MatchLogic.java
  40. 16 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleGroupController.java
  41. 4 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/controller/RuleTemplateController.java
  42. 2 0
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/IRuleGroupService.java
  43. 121 43
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleGroupServiceImpl.java
  44. 59 60
      module-alarm/src/main/java/cn/com/ctop/alarm/modules/service/impl/RuleTemplateServiceImpl.java
  45. 6 6
      module-check/src/main/java/cn/com/ctop/notice/handler/SendWeChatHandle.java
  46. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/ProjectMapper.java
  47. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  48. 4 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/ProjectMapper.xml
  49. 12 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  50. 46 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoAuthor.java
  51. 40 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoCover.java
  52. 30 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoFrame.java
  53. 46 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoInfo.java
  54. 28 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoProject.java
  55. 32 0
      module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoWatermark.java
  56. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoAuthorMapper.java
  57. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoCoverMapper.java
  58. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoFrameMapper.java
  59. 14 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoInfoMapper.java
  60. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoProjectMapper.java
  61. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoWatermarkMapper.java
  62. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoAuthorMapper.xml
  63. 13 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoCoverMapper.xml
  64. 8 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoFrameMapper.xml
  65. 8 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoInfoMapper.xml
  66. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoProjectMapper.xml
  67. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoWatermarkMapper.xml
  68. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoAuthorService.java
  69. 13 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoCoverService.java
  70. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoFrameService.java
  71. 13 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoInfoService.java
  72. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoProjectService.java
  73. 11 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoWatermarkService.java
  74. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoAuthorServiceImpl.java
  75. 23 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoCoverServiceImpl.java
  76. 82 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoFrameServiceImpl.java
  77. 23 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoInfoServiceImpl.java
  78. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoProjectServiceImpl.java
  79. 15 0
      module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoWatermarkServiceImpl.java
  80. 0 6
      module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameService.java
  81. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IProjectService.java
  82. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  83. 1 166
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameServiceImpl.java
  84. 1 6
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java
  85. 6 3
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagInfoServiceImpl.java
  86. 5 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/ProjectServiceImpl.java
  87. 5 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  88. 24 2
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/AlarmRuleJob.java
  89. 4 0
      module-job-bytedance/src/main/resources/application-prod.yml
  90. 35 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaiShouDailyImageReportLoadJob.java
  91. 19 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouActionBarTextJob.java
  92. 33 0
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouAiAdsNewMaterialCreativityJob.java
  93. 22 1
      module-job-kuaishou/src/main/java/cn/com/ctop/job/kuaishou/handler/KuaishouCreateUnitJob.java
  94. 169 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouAdvertiserStrategyController.java
  95. 12 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/KuaiShouMaterialControer.java
  96. 112 58
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAccountTargetTemplate.java
  97. 190 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaishouAdvertiserStrategy.java
  98. 14 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/AiKuaishouAdvertiserStrategyMapper.java
  99. 2 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAccountTargetTemplateMapper.xml
  100. 0 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/mapper/xml/AiKuaishouAdvertiserStrategyMapper.xml

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

@@ -47,12 +47,6 @@ public class MaterialCutFrameController {
 
     /**
      * 分页列表查询
-     *
-     * @param materialCutFrame
-     * @param pageNo
-     * @param pageSize
-     * @param req
-     * @return
      */
     @AutoLog(value = "截屏-分页列表查询")
     @ApiOperation(value = "截屏-分页列表查询", notes = "截屏-分页列表查询")
@@ -73,201 +67,4 @@ public class MaterialCutFrameController {
         result.setResult(pageList);
         return result;
     }
-
-
-    /**
-     * 添加
-     *
-     * @param materialCutFrame
-     * @return
-     */
-    @AutoLog(value = "截屏-添加")
-    @ApiOperation(value = "截屏-添加", notes = "截屏-添加")
-    @PostMapping(value = "/add")
-    public Result<MaterialCutFrame> add(@RequestBody MaterialCutFrame materialCutFrame) {
-        Result<MaterialCutFrame> result = new Result<MaterialCutFrame>();
-        try {
-            materialCutFrameService.save(materialCutFrame);
-            result.success("添加成功!");
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            result.error500("操作失败");
-        }
-        return result;
-    }
-
-    /**
-     * 编辑
-     *
-     * @param materialCutFrame
-     * @return
-     */
-    @AutoLog(value = "截屏-编辑")
-    @ApiOperation(value = "截屏-编辑", notes = "截屏-编辑")
-    @PutMapping(value = "/edit")
-    public Result<MaterialCutFrame> edit(@RequestBody MaterialCutFrame materialCutFrame) {
-        Result<MaterialCutFrame> result = new Result<MaterialCutFrame>();
-        MaterialCutFrame materialCutFrameEntity = materialCutFrameService.getById(materialCutFrame.getId());
-        if (materialCutFrameEntity == null) {
-            result.error500("未找到对应实体");
-        } else {
-            boolean ok = materialCutFrameService.updateById(materialCutFrame);
-            if (ok) {
-                result.success("修改成功!");
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * 通过id删除
-     *
-     * @param id
-     * @return
-     */
-    @AutoLog(value = "截屏-通过id删除")
-    @ApiOperation(value = "截屏-通过id删除", notes = "截屏-通过id删除")
-    @DeleteMapping(value = "/delete")
-    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
-        try {
-            materialCutFrameService.removeById(id);
-        } catch (Exception e) {
-            log.error("删除失败", e.getMessage());
-            return Result.error("删除失败!");
-        }
-        return Result.ok("删除成功!");
-    }
-
-    /**
-     * 批量删除
-     *
-     * @param ids
-     * @return
-     */
-    @AutoLog(value = "截屏-批量删除")
-    @ApiOperation(value = "截屏-批量删除", notes = "截屏-批量删除")
-    @DeleteMapping(value = "/deleteBatch")
-    public Result<MaterialCutFrame> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
-        Result<MaterialCutFrame> result = new Result<MaterialCutFrame>();
-        if (ids == null || "".equals(ids.trim())) {
-            result.error500("参数不识别!");
-        } else {
-            this.materialCutFrameService.removeByIds(Arrays.asList(ids.split(",")));
-            result.success("删除成功!");
-        }
-        return result;
-    }
-
-    /**
-     * 通过id查询
-     *
-     * @param id
-     * @return
-     */
-    @AutoLog(value = "截屏-通过id查询")
-    @ApiOperation(value = "截屏-通过id查询", notes = "截屏-通过id查询")
-    @GetMapping(value = "/queryById")
-    public Result<MaterialCutFrame> queryById(@RequestParam(name = "id", required = true) String id) {
-        Result<MaterialCutFrame> result = new Result<MaterialCutFrame>();
-        MaterialCutFrame materialCutFrame = materialCutFrameService.getById(id);
-        if (materialCutFrame == null) {
-            result.error500("未找到对应实体");
-        } else {
-            result.setResult(materialCutFrame);
-            result.setSuccess(true);
-        }
-        return result;
-    }
-
-
-    @AutoLog(value = "腾讯云抽帧按照素材创建时间筛选素材进行抽帧操作")
-    @ApiOperation(value = "腾讯云抽帧", notes = "腾讯云抽帧")
-    @GetMapping(value = "/getCosCutFrameByTime")
-    public Result getCosCutFrameByTime(@RequestParam(name = "startDate", required = true) String startDate,
-                                 @RequestParam(name = "endDate", required = true) String endDate) {
-        Result result = new Result();
-        result.setSuccess(true);
-
-        try {
-            List<MaterialInfo> materialInfos = materialInfoService.getListByDate(startDate, endDate);
-            if (!Check.isNull(materialInfos)) {
-                for (MaterialInfo materialInfo : materialInfos) {
-                    if (!Check.isNull(materialInfo)) {
-                        String code = materialInfo.getCode();
-                        materialCutFrameService.getCosCutFrame(materialInfo.getUrl(), code);
-                    }
-                }
-            }
-        }catch (Exception e){
-            log.error(e.getMessage());
-            e.printStackTrace();
-            result.setSuccess(false);
-        }
-
-        return result;
-    }
-
-    @AutoLog(value = "腾讯云抽帧--根据md5抽帧")
-    @ApiOperation(value = "腾讯云抽帧", notes = "腾讯云抽帧")
-    @GetMapping(value = "/getCosCutFrame")
-    public Result getCosCutFrame(@RequestParam(name = "code", required = true) String code) {
-        Result result = new Result();
-        result.setSuccess(true);
-
-        try {
-            MaterialInfo materialInfo = materialInfoService.getMaterialInfoByCode(code);
-            if (!Check.isNull(materialInfo)) {
-                materialCutFrameService.getCosCutFrame(materialInfo.getUrl(), code);
-            }
-        }catch (Exception e){
-            log.error(e.getMessage());
-            e.printStackTrace();
-            result.setSuccess(false);
-        }
-
-        return result;
-    }
-
-
-    @AutoLog(value = "腾讯云抽帧--获取任务状态并将图片入库")
-    @ApiOperation(value = "腾讯云抽帧", notes = "腾讯云抽帧")
-    @GetMapping(value = "/loadCosCutFrame")
-    public Result loadCosCutFrame() {
-        Result result = new Result();
-        result.setSuccess(true);
-
-        log.info("开始抽帧定时任务");
-        QueryWrapper<MaterialCutFrameTask> taskQueryWrapper = new QueryWrapper<>();
-        taskQueryWrapper.eq("job_status", 0);
-        taskQueryWrapper.eq("cloud_type",2);  //2为腾讯云 1为阿里云
-        List<MaterialCutFrameTask> list = materialCutFrameTaskServiceTask.list(taskQueryWrapper);
-
-        if (Check.isNull(list)) {
-            result.setCode(500);
-            result.setSuccess(false);
-            return result;
-        }
-
-        ExecutorService executorService = Executors.newFixedThreadPool(5);
-        list.forEach(cutFrameTask -> {
-            executorService.submit(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                    //获取广告计划信息数据
-                    materialCutFrameService.loadCosCutFrame(cutFrameTask.getJobId(), cutFrameTask.getVideoSignature());
-                    }catch (Exception e){
-                        log.error(e.getMessage());
-                        e.printStackTrace();
-                    }
-                }
-            });
-        });
-
-        return result;
-    }
-
-
-
 }

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

@@ -0,0 +1,64 @@
+package org.jeecg.modules.ctop.controller;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoAuthor;
+import cn.com.ctop.common.module.material.service.IMaterialVideoAuthorService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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;
+
+
+/**
+ * 视频素材作者信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoAuthor")
+public class MaterialVideoAuthorController {
+	@Autowired
+	private IMaterialVideoAuthorService materialVideoAuthorService;
+
+	/**
+     * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoAuthor>> queryPageList(MaterialVideoAuthor materialVideoAuthor,
+                                                            @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                                            @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+                                                            HttpServletRequest req) {
+		Result<IPage<MaterialVideoAuthor>> result = new Result<>();
+		QueryWrapper<MaterialVideoAuthor> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoAuthor, req.getParameterMap());
+		Page<MaterialVideoAuthor> page = new Page<>(pageNo, pageSize);
+		IPage<MaterialVideoAuthor> pageList = materialVideoAuthorService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+     *  编辑
+	 */
+	@PostMapping(value = "/edit")
+	public Result<MaterialVideoAuthor> edit(@RequestBody MaterialVideoAuthor materialVideoAuthor) {
+		Result<MaterialVideoAuthor> result = new Result<MaterialVideoAuthor>();
+		MaterialVideoAuthor materialVideoAuthorEntity = materialVideoAuthorService.getById(materialVideoAuthor.getId());
+		if(materialVideoAuthorEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = materialVideoAuthorService.updateById(materialVideoAuthor);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+}

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

@@ -0,0 +1,113 @@
+package org.jeecg.modules.ctop.controller;
+
+import java.util.Arrays;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import cn.com.ctop.common.module.material.service.IMaterialVideoCoverService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.ApiOperation;
+
+ /**
+ * 视频素材封面信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoCover")
+public class MaterialVideoCoverController {
+
+	@Autowired
+	private IMaterialVideoCoverService materialVideoCoverService;
+
+	/**
+	 * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoCover>> queryPageList(MaterialVideoCover materialVideoCover,
+														   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														   HttpServletRequest req) {
+		Result<IPage<MaterialVideoCover>> result = new Result<>();
+		QueryWrapper<MaterialVideoCover> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoCover, req.getParameterMap());
+		Page<MaterialVideoCover> page = new Page<>(pageNo, pageSize);
+		IPage<MaterialVideoCover> pageList = materialVideoCoverService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	 *  编辑
+	 */
+	@PostMapping(value = "/edit")
+	public Result<MaterialVideoCover> edit(@RequestBody MaterialVideoCover materialVideoCover) {
+		Result<MaterialVideoCover> result = new Result<MaterialVideoCover>();
+		MaterialVideoCover materialVideoCoverEntity = materialVideoCoverService.getById(materialVideoCover.getId());
+		if(materialVideoCoverEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = materialVideoCoverService.updateById(materialVideoCover);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+		return result;
+	}
+
+	/**
+	 *   通过id删除
+	 */
+	@PostMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			materialVideoCoverService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 */
+	@ApiOperation(value="视频素材封面信息-批量删除", notes="视频素材封面信息-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<MaterialVideoCover> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<MaterialVideoCover> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.materialVideoCoverService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	 * 通过id查询
+	 */
+	@GetMapping(value = "/queryById")
+	public Result<MaterialVideoCover> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<MaterialVideoCover> result = new Result<>();
+		MaterialVideoCover materialVideoCover = materialVideoCoverService.getById(id);
+		if(materialVideoCover==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(materialVideoCover);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+}

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

@@ -0,0 +1,96 @@
+package org.jeecg.modules.ctop.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoFrame;
+import cn.com.ctop.common.module.material.service.IMaterialVideoFrameService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+ /**
+ * 视频素材截帧信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoFrame")
+public class MaterialVideoFrameController {
+	@Autowired
+	private IMaterialVideoFrameService materialVideoFrameService;
+
+	/**
+	  * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoFrame>> queryPageList(MaterialVideoFrame materialVideoFrame,
+														   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														   HttpServletRequest req) {
+		Result<IPage<MaterialVideoFrame>> result = new Result<>();
+		QueryWrapper<MaterialVideoFrame> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoFrame, req.getParameterMap());
+		Page<MaterialVideoFrame> page = new Page<>(pageNo, pageSize);
+		IPage<MaterialVideoFrame> pageList = materialVideoFrameService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	 *   添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<MaterialVideoFrame> add(@RequestBody MaterialVideoFrame materialVideoFrame) {
+		Result<MaterialVideoFrame> result = new Result<>();
+		try {
+			materialVideoFrameService.save(materialVideoFrame);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	 *  编辑
+	 */
+	@PutMapping(value = "/edit")
+	public Result<MaterialVideoFrame> edit(@RequestBody MaterialVideoFrame materialVideoFrame) {
+		Result<MaterialVideoFrame> result = new Result<MaterialVideoFrame>();
+		MaterialVideoFrame materialVideoFrameEntity = materialVideoFrameService.getById(materialVideoFrame.getId());
+		if(materialVideoFrameEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = materialVideoFrameService.updateById(materialVideoFrame);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * 通过id查
+	 */
+	@GetMapping(value = "/queryById")
+	public Result<MaterialVideoFrame> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<MaterialVideoFrame> result = new Result<>();
+		MaterialVideoFrame materialVideoFrame = materialVideoFrameService.getById(id);
+		if(materialVideoFrame==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(materialVideoFrame);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+}

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

@@ -0,0 +1,80 @@
+package org.jeecg.modules.ctop.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoInfo;
+import cn.com.ctop.common.module.material.service.IMaterialVideoInfoService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+ /**
+ * 视频素材基础信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoInfo")
+public class MaterialVideoInfoController {
+	@Autowired
+	private IMaterialVideoInfoService materialVideoInfoService;
+
+	/**
+	  * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoInfo>> queryPageList(MaterialVideoInfo materialVideoInfo,
+														  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														  HttpServletRequest req) {
+		Result<IPage<MaterialVideoInfo>> result = new Result<>();
+		QueryWrapper<MaterialVideoInfo> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoInfo, req.getParameterMap());
+		Page<MaterialVideoInfo> page = new Page(pageNo, pageSize);
+		IPage<MaterialVideoInfo> pageList = materialVideoInfoService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	 *   添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<MaterialVideoInfo> add(@RequestBody MaterialVideoInfo materialVideoInfo) {
+		Result<MaterialVideoInfo> result = new Result<>();
+		try {
+			materialVideoInfoService.save(materialVideoInfo);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 */
+	@PutMapping(value = "/edit")
+	public Result<MaterialVideoInfo> edit(@RequestBody MaterialVideoInfo materialVideoInfo) {
+		Result<MaterialVideoInfo> result = new Result<MaterialVideoInfo>();
+		MaterialVideoInfo materialVideoInfoEntity = materialVideoInfoService.getById(materialVideoInfo.getId());
+		if(materialVideoInfoEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = materialVideoInfoService.updateById(materialVideoInfo);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+}

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

@@ -0,0 +1,84 @@
+package org.jeecg.modules.ctop.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.material.entity.MaterialVideoProject;
+import cn.com.ctop.common.module.material.service.IMaterialVideoProjectService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.ApiOperation;
+
+ /**
+ * 视频素材关联项目信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoProject")
+public class MaterialVideoProjectController {
+
+	@Autowired
+	private IMaterialVideoProjectService materialVideoProjectService;
+
+	/**
+	  * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoProject>> queryPageList(MaterialVideoProject materialVideoProject,
+															 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+															 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+															 HttpServletRequest req) {
+		Result<IPage<MaterialVideoProject>> result = new Result<>();
+		QueryWrapper<MaterialVideoProject> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoProject, req.getParameterMap());
+		Page<MaterialVideoProject> page = new Page<>(pageNo, pageSize);
+		IPage<MaterialVideoProject> pageList = materialVideoProjectService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	 *   添加
+	 */
+	@AutoLog(value = "视频素材关联项目信息-添加")
+	@ApiOperation(value="视频素材关联项目信息-添加", notes="视频素材关联项目信息-添加")
+	@PostMapping(value = "/add")
+	public Result<MaterialVideoProject> add(@RequestBody MaterialVideoProject materialVideoProject) {
+		Result<MaterialVideoProject> result = new Result<>();
+		try {
+			materialVideoProjectService.save(materialVideoProject);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 */
+	@PutMapping(value = "/edit")
+	public Result<MaterialVideoProject> edit(@RequestBody MaterialVideoProject materialVideoProject) {
+		Result<MaterialVideoProject> result = new Result<MaterialVideoProject>();
+		MaterialVideoProject materialVideoProjectEntity = materialVideoProjectService.getById(materialVideoProject.getId());
+		if(materialVideoProjectEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = materialVideoProjectService.updateById(materialVideoProject);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+}

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

@@ -0,0 +1,62 @@
+package org.jeecg.modules.ctop.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoWatermark;
+import cn.com.ctop.common.module.material.service.IMaterialVideoWatermarkService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+
+import lombok.extern.slf4j.Slf4j;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+ /**
+ * 视频素材水印信息
+ */
+@Slf4j
+@RestController
+@RequestMapping("/com.cn/materialVideoWatermark")
+public class MaterialVideoWatermarkController {
+	@Autowired
+	private IMaterialVideoWatermarkService materialVideoWatermarkService;
+
+	/**
+	  * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<MaterialVideoWatermark>> queryPageList(MaterialVideoWatermark materialVideoWatermark,
+															   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+															   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+															   HttpServletRequest req) {
+		Result<IPage<MaterialVideoWatermark>> result = new Result<>();
+		QueryWrapper<MaterialVideoWatermark> queryWrapper = QueryGenerator.initQueryWrapper(materialVideoWatermark, req.getParameterMap());
+		Page<MaterialVideoWatermark> page = new Page<>(pageNo, pageSize);
+		IPage<MaterialVideoWatermark> pageList = materialVideoWatermarkService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	 *   添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<MaterialVideoWatermark> add(@RequestBody MaterialVideoWatermark materialVideoWatermark) {
+		Result<MaterialVideoWatermark> result = new Result<>();
+		try {
+			materialVideoWatermarkService.save(materialVideoWatermark);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+}

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

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

@@ -6,6 +6,7 @@ import org.jeecg.modules.orderplatform.entity.PlatformMaterial;
 import org.jeecg.modules.orderplatform.entity.PlatformOrder;
 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.OperateRecordHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -28,6 +29,9 @@ DesignerCommitProcessCtrl {
     @Autowired
     private OperateRecordHandler operateRecordHandler;
 
+    @Autowired
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
     /**
      * 设计组长接单,根据订单中的物料数量按类型发起物料审批流程
      */
@@ -41,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("订单接单失败,请联系管理员!");
@@ -60,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("订单驳回失败,请联系管理员!");

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

@@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.orderplatform.entity.PlatformOrder;
 import org.jeecg.modules.orderplatform.service.IPlatformOrderService;
+import org.jeecg.modules.orderplatform.util.ApprovalNodeNoticeHandler;
 import org.jeecg.modules.orderplatform.util.OperateRecordHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -24,6 +25,9 @@ public class OperatorApprovalProcessCtrl {
     @Autowired
     private OperateRecordHandler operateRecordHandler;
 
+    @Autowired
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
     /**
      * 运营下单
      */
@@ -37,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("下单成功!");
             }
@@ -57,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("订单重新提交异常,请联系管理员");
@@ -76,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("订单销毁失败,请联系管理员!");

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

@@ -1,18 +1,17 @@
 package org.jeecg.modules.orderplatform.controller;
 
-import cn.com.ctop.common.module.service.IMaterialInfoService;
 import cn.com.ctop.common.module.utils.CosUtils;
 import com.alibaba.fastjson.JSONObject;
 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;
@@ -31,10 +30,10 @@ import java.util.Map;
 public class PlatformFileCtrl {
 
     @Autowired
-    private IWpsFileService wpsFileService;
+    private IPlatformVideoService platformVideoService;
 
     @Autowired
-    private IMaterialInfoService materialInfoService;
+    private IPlatformScriptService platformScriptService;
 
     @Autowired
     private IPlatformMaterialService platformMaterialService;
@@ -42,6 +41,9 @@ public class PlatformFileCtrl {
     @Autowired
     private OperateRecordHandler operateRecordHandler;
 
+    @Autowired
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
     /**
      * 新建订单上传附件
      */
@@ -52,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();
@@ -78,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();
@@ -106,30 +107,36 @@ public class PlatformFileCtrl {
         return result;
     }
 
-    /**
-     * 剪辑上传视频
-     * Todo 在下单制正式上线后,这个接口会改造
-     */
     @PostMapping("/uploadVideo")
     public Result<Object> uploadVideo(@RequestBody JSONObject requestBody) {
         Result<Object> result = new Result<>();
-        String videoId = materialInfoService.platformUploadVideo(requestBody);
-        if (videoId.isEmpty()) {
-            result.error500("同步素材库失败,请联系管理员");
+        //同一个视频不能出现在不同的物料下
+        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()) {
+            result.error500("素材视频上传失败,参数为空");
         } 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(videoId);
+            platformMaterial.setVideoId(videoMd5);
             boolean save = platformMaterialService.updateById(platformMaterial);
             if (save) {
-                operateRecordHandler.Submit(platformMaterialService.getById(requestBody.getString("materialId")).getMaterialCode(), "VIDEO");
-                result.success("同步素材库成功");
+                operateRecordHandler.Submit(platformMaterial.getMaterialCode(), "VIDEO");
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("VIDEO", platformMaterial.getMaterialCode());
+                result.success("素材视频上传成功");
             }
         }
         return result;
     }
-
 }

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

@@ -7,8 +7,10 @@ import com.github.pagehelper.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
 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;
@@ -16,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 物料审批流程
@@ -35,21 +38,24 @@ public class PlatformMaterialCtrl {
     private OperateRecordHandler operateRecordHandler;
 
     @Autowired
-    DictHandler dictHandler;
+    private ApprovalNodeNoticeHandler approvalNodeNoticeHandler;
+
+    @Autowired
+    private DictHandler dictHandler;
 
     /**
      * 根据orderCode查询关联物料
      */
     @GetMapping(value = "/listByOrderCode")
     public Result<PageInfo<PlatformMaterial>> listByOrderCode(PlatformMaterial platformMaterial,
-                                                         @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
-                                                         @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
-                                                         HttpServletRequest req) {
+                                                              @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                              HttpServletRequest req) {
         Result<PageInfo<PlatformMaterial>> result = new Result<>();
         QueryWrapper<PlatformMaterial> queryWrapper = new QueryWrapper<>();
         queryWrapper.setEntity(platformMaterial);
-        PageHelper.startPage(pageNo,pageSize);
-        List<PlatformMaterial> platformMaterialList= platformMaterialService.list(queryWrapper);
+        PageHelper.startPage(pageNo, pageSize);
+        List<PlatformMaterial> platformMaterialList = platformMaterialService.list(queryWrapper);
         result.setSuccess(true);
         result.setResult(new PageInfo<>(dictHandler.dictHandlerMaterial(platformMaterialList)));
         return result;
@@ -86,6 +92,22 @@ public class PlatformMaterialCtrl {
         return result;
     }
 
+    /**
+     * 脚本是否可更新
+     */
+    @GetMapping(value = "/verifyScript")
+    public Result<Object> verifyScript(String materialCode, String scriptId) {
+        Result<Object> result = new Result<>();
+        QueryWrapper<PlatformMaterial> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("material_code", materialCode);
+        PlatformMaterial platformMaterial = platformMaterialService.getOne(queryWrapper);
+        if (platformMaterial.getScriptId().equals(scriptId)) {
+            result.setSuccess(true);
+        } else {
+            result.error500("脚本信息已被更改,请刷新后操作");
+        }
+        return result;
+    }
 
     /**
      * 运营审核脚本
@@ -99,7 +121,8 @@ public class PlatformMaterialCtrl {
         platformMaterial.setVideoStatus(0);
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
-            operateRecordHandler.Approval(platformMaterial.getMaterialCode(),"ACCEPT_SCRIPT");
+            operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "ACCEPT_SCRIPT");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("ACCEPT_SCRIPT",platformMaterial.getMaterialCode());
             result.success("脚本审核通过!");
         } else {
             result.error500("脚本审核失败!请联系管理员");
@@ -116,7 +139,8 @@ public class PlatformMaterialCtrl {
         platformMaterial.setScriptStatus(2);
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
-            operateRecordHandler.Approval(platformMaterial.getMaterialCode(),"REJECT_SCRIPT");
+            operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "REJECT_SCRIPT");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("REJECT_SCRIPT",platformMaterial.getMaterialCode());
             result.success("脚本已驳回!");
         } else {
             result.error500("脚本驳回失败!请联系管理员");
@@ -137,11 +161,34 @@ public class PlatformMaterialCtrl {
     }
 
     /**
+     * 视频是否可以更新
+     */
+    @GetMapping(value = "/verifyVideo")
+    public Result<Object> verifyVideo(String materialCode, String videoId) {
+        Result<Object> result = new Result<>();
+        QueryWrapper<PlatformMaterial> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("material_code", materialCode);
+        PlatformMaterial platformMaterial = platformMaterialService.getOne(queryWrapper);
+        if (platformMaterial.getVideoId().equals(videoId)) {
+            result.setSuccess(true);
+        } else {
+            result.error500("视频信息已被更改,请刷新后操作");
+        }
+        return result;
+    }
+
+    /**
      * 运营审核视频
      */
     @PostMapping(value = "/video/accept")
     public Result<Object> acceptVideo(@RequestBody PlatformMaterial platformMaterial) {
         Result<Object> result = new Result<>();
+        //视频通过同步到素材库
+        boolean sync = platformMaterialService.syncVideo2CTopMaterial(platformMaterial);
+        if (!sync) {
+            result.error500("视频同步素材库失败");
+            return result;
+        }
         //物料状态->视频审核通过
         platformMaterial.setMaterialStatus(7);
         platformMaterial.setVideoStatus(3);
@@ -150,9 +197,8 @@ public class PlatformMaterialCtrl {
             //更新订单的素材完成数
             boolean order = platformOrderService.updateOrderFinishAmount(platformMaterial.getOrderCode());
             if (order) {
-                operateRecordHandler.Approval(platformMaterial.getMaterialCode(),"ACCEPT_VIDEO");
-                //修改素材库审核状态
-                platformMaterialService.updateMaterialStatusById(platformMaterial.getVideoId());
+                operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "ACCEPT_VIDEO");
+                approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("ACCEPT_VIDEO",platformMaterial.getMaterialCode());
                 result.success("视频审核通过!");
             }
         } else {
@@ -170,7 +216,8 @@ public class PlatformMaterialCtrl {
         platformMaterial.setVideoStatus(2);
         boolean ok = platformMaterialService.updateById(platformMaterial);
         if (ok) {
-            operateRecordHandler.Approval(platformMaterial.getMaterialCode(),"REJECT_VIDEO");
+            operateRecordHandler.Approval(platformMaterial.getMaterialCode(), "REJECT_VIDEO");
+            approvalNodeNoticeHandler.NOTICE_WE_CHAT_MATERIAL("REJECT_VIDEO",platformMaterial.getMaterialCode());
             result.success("视频已驳回!");
         } else {
             result.error500("视频驳回失败!请联系管理员");
@@ -190,4 +237,16 @@ public class PlatformMaterialCtrl {
         return result;
     }
 
+    /**
+     * 视频修改回显
+     */
+    @GetMapping(value = "/videoEcho")
+    public Result<Map<String, Object>> videoEcho(String videoId) {
+        Result<Map<String, Object>> result = new Result<>();
+        Map<String, Object> scriptDetail = platformMaterialService.videoEcho(videoId);
+        result.setResult(scriptDetail);
+        result.setSuccess(true);
+        return result;
+    }
+
 }

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

@@ -0,0 +1,95 @@
+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;
+import org.jeecg.modules.orderplatform.entity.PlatformScript;
+import org.jeecg.modules.orderplatform.service.IPlatformScriptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * 下单平台关联脚本
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platformScript")
+public class PlatformScriptController {
+	@Autowired
+	private IPlatformScriptService platformScriptService;
+
+	/**
+	 * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	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;
+	}
+
+	/**
+	 *   添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<PlatformScript> add(@RequestBody PlatformScript platformScript) {
+		Result<PlatformScript> result = new Result<>();
+		try {
+			platformScriptService.save(platformScript);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	 *  编辑
+	 */
+	@PostMapping(value = "/edit")
+	public Result<PlatformScript> edit(@RequestBody PlatformScript platformScript) {
+		Result<PlatformScript> result = new Result<PlatformScript>();
+		PlatformScript platformScriptEntity = platformScriptService.getById(platformScript.getId());
+		if(platformScriptEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = platformScriptService.updateById(platformScript);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	 * 通过id查询
+	 */
+	@GetMapping(value = "/queryById")
+	public Result<PlatformScript> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<PlatformScript> result = new Result<>();
+		PlatformScript platformScript = platformScriptService.getById(id);
+		if(platformScript==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(platformScript);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+}

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

@@ -0,0 +1,76 @@
+package org.jeecg.modules.orderplatform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.orderplatform.entity.PlatformVideo;
+import org.jeecg.modules.orderplatform.service.IPlatformVideoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+  * 下单平台关联视频
+  */
+@Slf4j
+@RestController
+@RequestMapping("/platformVideo")
+public class PlatformVideoController {
+
+	@Autowired
+	private IPlatformVideoService platformVideoService;
+
+	@PostMapping(value = "/updateVideo")
+	public Result<PlatformVideo> add(@RequestBody PlatformVideo platformVideo) {
+		Result<PlatformVideo> result = new Result<>();
+		try {
+			platformVideoService.save(platformVideo);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+
+	/**
+	 *  通过id删除
+	 */
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam Integer id) {
+		try {
+			PlatformVideo  platformVideo=new PlatformVideo();
+			platformVideo.setId(id);
+			platformVideo.setIsDelete(1);
+			boolean result = platformVideoService.updateById(platformVideo);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+
+	/**
+	 * 通过id查询
+	 */
+	@GetMapping(value = "/queryById")
+	public Result<PlatformVideo> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<PlatformVideo> result = new Result<>();
+		PlatformVideo platformVideo = platformVideoService.getById(id);
+		if(platformVideo==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(platformVideo);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+}

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

@@ -0,0 +1,58 @@
+package org.jeecg.modules.orderplatform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+
+/**
+ * 下单平台关联脚本
+ */
+@Data
+@TableName("ctop_platform_script")
+public class PlatformScript {
+    
+	/**id*/
+	@TableId(type = IdType.UUID)
+	private String id;
+	/**name*/
+	private String name;
+	/**version*/
+	private Integer version;
+	/**size*/
+	private Integer size;
+	/**creator*/
+	private String creator;
+	/**createTime*/
+	private Long createTime;
+	/**modifier*/
+	private String modifier;
+	/**modifyTime*/
+	private Long modifyTime;
+	/**downloadUrl*/
+	private Object downloadUrl;
+	/**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";
+	}
+}

+ 46 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/orderplatform/entity/PlatformVideo.java

@@ -0,0 +1,46 @@
+package org.jeecg.modules.orderplatform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 下单平台关联视频
+ */
+@Data
+@TableName("ctop_platform_video")
+public class PlatformVideo {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**物料code*/
+	private String materialCode;
+	/**物料code*/
+	private String name;
+	/**视频md5*/
+	private String md5;
+	/**视频url*/
+	private String url;
+	/**封面url*/
+	private String coverUrl;
+	/**视频描述*/
+	private String description;
+	/**格式*/
+	private String format;
+	/**时长(秒)*/
+	private Integer duration;
+	/**大小(kb)*/
+	private Integer size;
+	/**高*/
+	private Integer height;
+	/**宽*/
+	private Integer width;
+	/**是否已删除*/
+	private Integer isDelete;
+	/**createTime*/
+	private Date createTime;
+}

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

@@ -18,13 +18,23 @@ public interface PlatformMaterialMapper extends BaseMapper<PlatformMaterial> {
 
     List<JSONObject> queryMaterialsByDesignUserId(@Param("materialStatus") JSONArray materialStatus, @Param("designUserId") String designUserId);
 
-    //指派的物料
+    //指派的物料
     List<JSONObject> queryMaterialsByDesignLeader(@Param("materialStatus") JSONArray materialStatus, @Param("designLeader") String designLeader);
 
     List<JSONObject> queryMaterialsByOperatorUserId(@Param("operatorUserId") String designUserId);
 
     JSONObject queryScriptDetailById(@Param("scriptId") String scriptId);
 
-    JSONObject queryVideoDetailById(@Param("videoId") String videoId);
+    JSONObject queryVideoDetailById(@Param("md5") String md5);
+
+    PlatformMaterial queryByCode(@Param("materialCode") String materialCode);
+
+    int queryCountByMaterialAndVideo(@Param("materialCode") String materialCode, @Param("videoMd5") String videoMd5);
+
+    //查询物料相关人员
+    JSONObject queryMaterialRelatePersonByMaterialCode(@Param("materialCode") String materialCode);
+
+    //查询订单相关人员
+    JSONObject queryOrderRelatePersonByMaterialCode(@Param("orderCode") String orderCode);
 
 }

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

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

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.orderplatform.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.orderplatform.entity.PlatformVideo;
+
+/**
+ * 下单平台关联
+ */
+public interface PlatformVideoMapper extends BaseMapper<PlatformVideo> {
+
+    int deleteByMd5(@Param("md5") String md5);
+
+}

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

@@ -115,7 +115,7 @@
             t1.shot,
             (SELECT realname from sys_user where id=t1.shot) as shotName,
             t1.clip,
-            (SELECT realname from sys_user where id=t1.shot) as clipName,
+            (SELECT realname from sys_user where id=t1.clip) as clipName,
             t1.plan,
             (SELECT realname from sys_user where id=t1.plan) as planName
         FROM
@@ -138,31 +138,93 @@
             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>
 
     <select id="queryVideoDetailById" resultType="com.alibaba.fastjson.JSONObject">
         SELECT
-            t.code,
+            t.md5,
             t.url,
             t1.video_id as videoId,
             t1.video_status as videoStatus,
             t1.video_advise as videoAdvise,
-            t2.second,
-            t2.width,
-            t2.height,
-            t2.size,
-            (SELECT realname from sys_user where id=t3.clip_id limit 1) as clipName,
-            (SELECT realname from sys_user where id=t3.shot_id limit 1) as shotName,
-            (SELECT realname from sys_user where id=t3.plan_id limit 1) as planName,
-            (SELECT GROUP_CONCAT(tag_name) from ctop_material_tag_info where code=t.code) as tag,
-            (SELECT GROUP_CONCAT(url) from ctop_material_image_info where video_id=t.code) as imageUrl
+            t.duration,
+            t.width,
+            t.height,
+            t.size,
+            t1.project_id as projectId,
+            t1.clip,
+            t1.shot,
+            t1.plan,
+            (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 GROUP_CONCAT(tag_name) from ctop_material_tag_info where code=t.md5 and status=1) as tag,
+            (SELECT GROUP_CONCAT(url) from ctop_material_video_cover where video_md5=t.md5) as imageUrl
         FROM
-            ctop_material_info t
-                LEFT JOIN  ctop_platform_material t1 on t.id=t1.video_id
-                LEFT JOIN  ctop_material_parameter t2 ON t. CODE = t2.material_id
-                left join  ctop_material_ascription t3 on t.code=t3. material_id
-        where t.id=#{videoId}
+            ctop_platform_video t
+                LEFT JOIN  ctop_platform_material t1 on t.md5=t1.video_id
+        where t.md5=#{md5}
+          and t.is_delete=0
+        limit 1
+    </select>
+
+    <select id="queryByCode" resultType="org.jeecg.modules.orderplatform.entity.PlatformMaterial">
+        select * from ctop_platform_material where material_code=#{materialCode}
+    </select>
+
+    <select id="queryCountByMaterialAndVideo" resultType="java.lang.Integer">
+        SELECT
+            count(id)
+        FROM
+            ctop_platform_material
+        WHERE
+            material_code != #{materialCode}
+          AND video_id = #{videoMd5}
+    </select>
+    <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 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,
+            (SELECT realname from sys_user where id=t1.design limit 1) as designName
+        FROM
+            ctop_platform_order t1
+        WHERE
+            order_code = #{orderCode}
+        limit 1
     </select>
 </mapper>

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

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.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>

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

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.orderplatform.mapper.PlatformVideoMapper">
+
+    <update id="deleteByMd5" >
+        UPDATE
+            ctop_platform_video
+        SET is_delete = 1
+        WHERE
+            md5 = #{md5}
+    </update>
+
+</mapper>

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

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.orderplatform.entity.PlatformMaterial;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 物料审批流程
@@ -36,8 +37,27 @@ public interface IPlatformMaterialService extends IService<PlatformMaterial> {
     JSONObject queryVideoDetailById(String videoId);
 
     /**
-     *  视频审核通过后修改素材库审核状态
+     *  查询上传视频是否出现在其他物料中
      */
-    void updateMaterialStatusById(String id);
+    int queryCountByMaterialAndVideo(String materialCode, String videoMd5);
+    /**
+     *  同步视频到汇创素材库(包括关联的项目)
+     */
+    boolean syncVideo2CTopMaterial(PlatformMaterial platformMaterial);
+
+    /**
+     *  视频驳回编辑回显
+     */
+    Map<String,Object> videoEcho(String videoId);
+
+    /**
+     *  根据materialCode 查询企业微信通知人
+     */
+    JSONObject getMaterialRelatePersonByMaterialCode(String materialCode);
+
+    /**
+     *  根据orderCode 查询企业微信通知人
+     */
+    JSONObject getOrderRelatePersonByMaterialCode(String orderCode);
 
 }

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

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

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.orderplatform.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.orderplatform.entity.PlatformVideo;
+
+/**
+ *  下单平台关联视频
+ */
+public interface IPlatformVideoService extends IService<PlatformVideo> {
+
+    String uploadVideo(JSONObject params);
+
+}

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

@@ -1,19 +1,32 @@
 package org.jeecg.modules.orderplatform.service.impl;
 
-import cn.com.ctop.common.module.entity.MaterialInfo;
-import cn.com.ctop.common.module.service.IMaterialInfoService;
+import cn.com.ctop.common.module.entity.MaterialTagInfo;
+import cn.com.ctop.common.module.material.entity.MaterialVideoAuthor;
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import cn.com.ctop.common.module.material.entity.MaterialVideoInfo;
+import cn.com.ctop.common.module.material.entity.MaterialVideoProject;
+import cn.com.ctop.common.module.material.service.*;
+import cn.com.ctop.common.module.service.IMaterialCutFrameService;
+import cn.com.ctop.common.module.service.IMaterialTagInfoService;
+import cn.com.ctop.common.module.service.IProjectService;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.modules.orderplatform.entity.PlatformMaterial;
+import org.jeecg.modules.orderplatform.entity.PlatformVideo;
 import org.jeecg.modules.orderplatform.mapper.PlatformMaterialMapper;
 import org.jeecg.modules.orderplatform.service.IPlatformMaterialService;
+import org.jeecg.modules.orderplatform.service.IPlatformVideoService;
 import org.jeecg.modules.orderplatform.util.JsonArrayUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.net.URLDecoder;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 物料审批流程
@@ -25,16 +38,40 @@ public class PlatformMaterialServiceImpl extends ServiceImpl<PlatformMaterialMap
     PlatformMaterialMapper platformMaterialMapper;
 
     @Autowired
-    IMaterialInfoService materialInfoService;
+    IPlatformVideoService platformVideoService;
+
+    @Autowired
+    IMaterialVideoInfoService materialVideoInfoService;
+
+    @Autowired
+    IMaterialVideoCoverService materialVideoCoverService;
+
+    @Autowired
+    IMaterialTagInfoService materialTagInfoService;
+
+    @Autowired
+    IMaterialVideoAuthorService materialVideoAuthorService;
+
+    @Autowired
+    IMaterialVideoProjectService materialVideoProjectService;
+
+    @Autowired
+    IMaterialVideoFrameService materialVideoFrameService;
+
+    @Autowired
+    IMaterialCutFrameService materialCutFrameService;
+
+    @Autowired
+    IProjectService projectService;
 
     @Override
     public List<JSONObject> queryMaterialsByDesignUserId(String materialStatus, String designUserId) {
         JSONArray materialStatusJsonArray = JsonArrayUtil.Varchar2JSONArray(materialStatus);
-        List<JSONObject> result=new ArrayList<>();
-        if(materialStatus.equals("0")){
-            result=platformMaterialMapper.queryMaterialsByDesignLeader(materialStatusJsonArray,designUserId);
-        }else {
-            result=platformMaterialMapper.queryMaterialsByDesignUserId(materialStatusJsonArray, designUserId);
+        List<JSONObject> result = new ArrayList<>();
+        if (materialStatus.equals("0")) {
+            result = platformMaterialMapper.queryMaterialsByDesignLeader(materialStatusJsonArray, designUserId);
+        } else {
+            result = platformMaterialMapper.queryMaterialsByDesignUserId(materialStatusJsonArray, designUserId);
         }
         return result;
     }
@@ -55,10 +92,130 @@ public class PlatformMaterialServiceImpl extends ServiceImpl<PlatformMaterialMap
     }
 
     @Override
-    public void updateMaterialStatusById(String id) {
-        MaterialInfo materialInfo = new MaterialInfo();
-        materialInfo.setId(id);
-        materialInfo.setStatus(1);
-        materialInfoService.updateById(materialInfo);
+    public int queryCountByMaterialAndVideo(String materialCode, String videoMd5) {
+
+        return platformMaterialMapper.queryCountByMaterialAndVideo(materialCode, videoMd5);
+    }
+
+    @Override
+    public boolean syncVideo2CTopMaterial(PlatformMaterial platformMaterial) {
+        boolean result=false;
+        //step1: 查询下单制物料、视频信息
+        QueryWrapper<PlatformVideo> wrapperPV = new QueryWrapper<>();
+        wrapperPV.eq("md5", platformMaterial.getVideoId());
+        wrapperPV.eq("is_delete", 0);
+        PlatformVideo video = platformVideoService.getOne(wrapperPV);
+        //查询物料信息
+        QueryWrapper<PlatformMaterial> wrapper = new QueryWrapper<>();
+        wrapper.eq("material_code", platformMaterial.getMaterialCode());
+        platformMaterial= this.getOne(wrapper);
+        boolean mv = materialVideoInfoHandle(video, platformMaterial.getMaterialType(), projectService.getSupplierCodeById(platformMaterial.getProjectId()));
+        if(mv){
+            result = materialVideoCorrelateHandle(video.getMd5());
+            if(result){
+                //启动截帧
+                materialCutFrameHandle(video);
+            }
+        }else {
+            materialVideoInfoService.deleteByMd5(video.getMd5());
+        }
+        return result;
+    }
+
+    @Override
+    public Map<String, Object> videoEcho(String videoId) {
+        Map<String, Object> result = new HashMap<>();
+        QueryWrapper<PlatformVideo> wrapperPV = new QueryWrapper<>();
+        wrapperPV.eq("md5", videoId);
+        wrapperPV.eq("is_delete", 0);
+        result.put("video", platformVideoService.getOne(wrapperPV));
+        QueryWrapper<MaterialVideoCover> wrapperMVC = new QueryWrapper<>();
+        wrapperMVC.eq("video_md5", videoId);
+        result.put("covers", materialVideoCoverService.list(wrapperMVC));
+        MaterialTagInfo materialTagInfo = new MaterialTagInfo();
+        materialTagInfo.setCode(videoId);
+        materialTagInfo.setStatus(1);
+        result.put("tags", materialTagInfoService.getTagDetail(materialTagInfo));
+        return result;
+    }
+
+    @Override
+    public JSONObject getMaterialRelatePersonByMaterialCode(String materialCode) {
+        return platformMaterialMapper.queryMaterialRelatePersonByMaterialCode(materialCode);
+    }
+
+    @Override
+    public JSONObject getOrderRelatePersonByMaterialCode(String orderCode) {
+        return platformMaterialMapper.queryOrderRelatePersonByMaterialCode(orderCode);
+    }
+
+    /**
+     * 同步素材视频
+     */
+    private boolean materialVideoInfoHandle(PlatformVideo platformVideo, int materialType, String supplierCode) {
+
+        MaterialVideoInfo materialVideoInfo = new MaterialVideoInfo();
+        materialVideoInfo.setName(platformVideo.getName());
+        materialVideoInfo.setMd5(platformVideo.getMd5());
+        materialVideoInfo.setUrl(platformVideo.getUrl());
+        materialVideoInfo.setCoverUrl(platformVideo.getCoverUrl());
+        materialVideoInfo.setMaterialType(materialType);
+        materialVideoInfo.setSupplierCode(supplierCode);
+        materialVideoInfo.setDescription(platformVideo.getDescription());
+        materialVideoInfo.setFormat(platformVideo.getFormat());
+        materialVideoInfo.setDuration(platformVideo.getDuration());
+        materialVideoInfo.setSize(platformVideo.getSize());
+        materialVideoInfo.setHeight(platformVideo.getHeight());
+        materialVideoInfo.setWidth(platformVideo.getWidth());
+        //先验证是否有重复
+        materialVideoInfoService.deleteByMd5(platformVideo.getMd5());
+        //再同步视频
+        return materialVideoInfoService.save(materialVideoInfo);
+    }
+
+    /**
+     * 保存视频素材关联项目、作者信息
+     */
+    private boolean materialVideoCorrelateHandle(String videoMd5) {
+
+        JSONObject videoDetail = platformMaterialMapper.queryVideoDetailById(videoMd5);
+        //项目绑定
+        MaterialVideoProject materialVideoProject = new MaterialVideoProject();
+        materialVideoProject.setProjectId(videoDetail.getLong("projectId"));
+        materialVideoProject.setVideoMd5(videoMd5);
+        //作者信息绑定
+        MaterialVideoAuthor materialVideoAuthor = new MaterialVideoAuthor();
+        materialVideoAuthor.setVideoMd5(videoMd5);
+        materialVideoAuthor.setClipId(videoDetail.getString("clip"));
+        materialVideoAuthor.setClipName(videoDetail.getString("clipName"));
+        materialVideoAuthor.setShotId(videoDetail.getString("shot"));
+        materialVideoAuthor.setShotName(videoDetail.getString("shotName"));
+        materialVideoAuthor.setPlanId(videoDetail.getString("plan"));
+        materialVideoAuthor.setPlanName(videoDetail.getString("planName"));
+        materialVideoAuthor.setPlaneId(videoDetail.getString("plane"));
+        materialVideoAuthor.setPlaneName(videoDetail.getString("plane_name"));
+
+        return materialVideoProjectService.save(materialVideoProject) && materialVideoAuthorService.save(materialVideoAuthor);
+    }
+
+    /**
+     * 开启截帧任务
+     */
+    private void materialCutFrameHandle(PlatformVideo platformVideo) {
+        int cutFrame = materialVideoFrameService.getFrameCountByCode(platformVideo.getMd5());
+        if (cutFrame == 0) {
+            String videoUrl = URLDecoder.decode(platformVideo.getUrl()).replace("https://media-1301855440.cos.ap-chongqing.myqcloud.com/", "");
+            Thread thread = new Thread() {
+                @Override
+                public void run() {
+                    try {
+                        materialVideoFrameService.getTencentCutFrame(videoUrl, platformVideo.getMd5(), platformVideo.getCoverUrl());
+                    } catch (Exception e) {
+                        log.error("智能抽帧任务失败,视频md5:" + platformVideo.getMd5());
+                    }
+                }
+            };
+            thread.start();
+        }
     }
 }

+ 6 - 1
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;
@@ -55,9 +59,10 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
         PlatformOrder platformOrder= this.getOne(queryWrapper);
         platformOrder.setMaterialFinishAmount(platformOrder.getMaterialFinishAmount()+1);
         platformOrder.setMaterialFinishTime(DateUtils.getDate());
-        if(platformOrder.getMaterialAmount()==platformOrder.getMaterialFinishAmount()+1){
+        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);
     }

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

@@ -0,0 +1,61 @@
+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;
+
+/**
+ * 下单平台关联脚本
+ */
+@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);
+    }
+}

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

@@ -0,0 +1,146 @@
+package org.jeecg.modules.orderplatform.service.impl;
+
+import cn.com.ctop.common.module.entity.*;
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import cn.com.ctop.common.module.material.service.IMaterialVideoCoverService;
+import cn.com.ctop.common.module.service.IMaterialTagInfoService;
+import cn.com.ctop.common.module.service.ITagInfoService;
+import cn.com.ctop.common.module.utils.CloudVideoProcessUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import org.jeecg.modules.orderplatform.entity.PlatformVideo;
+import org.jeecg.modules.orderplatform.mapper.PlatformMaterialMapper;
+import org.jeecg.modules.orderplatform.mapper.PlatformVideoMapper;
+import org.jeecg.modules.orderplatform.service.IPlatformVideoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URLDecoder;
+import java.util.Map;
+
+
+/**
+ * 下单平台关联视频
+ */
+@Service
+public class PlatformVideoServiceImpl extends ServiceImpl<PlatformVideoMapper, PlatformVideo> implements IPlatformVideoService {
+
+    @Autowired
+    IMaterialVideoCoverService materialVideoCoverService;
+
+    @Autowired
+    IMaterialTagInfoService materialTagInfoService;
+
+    @Autowired
+    private ITagInfoService tagInfoService;
+
+    @Autowired
+    PlatformMaterialMapper platformMaterialMapper;
+
+    @Autowired
+    PlatformVideoMapper platformVideoMapper;
+
+    @Override
+    public String uploadVideo(JSONObject params) {
+        String md5 = params.getString("md5");
+        if (null == md5 || md5.isEmpty()) {
+            return "";
+        }
+        //入库下单制视频库
+        boolean result = videoHandle(params);
+        if (result) {
+            //封面入库
+            coverHandler(params);
+            //标签相关入库
+            tagHandler(params);
+            return md5;
+        }
+        return "";
+    }
+
+    /**
+     * 视频入库
+     */
+    private boolean videoHandle(JSONObject params) {
+
+        PlatformVideo platformVideo = new PlatformVideo();
+        //查询视频关联的物料信息
+        platformVideo.setMaterialCode(params.getString("materialCode"));
+        platformVideo.setName(params.getString("name"));
+        platformVideo.setMd5(params.getString("md5"));
+        platformVideo.setUrl(params.getString("url") == null ? "" : "https:" + params.getString("url"));
+        platformVideo.setCoverUrl(getFirstFrame(platformVideo.getUrl(), params.getString("md5")));
+        platformVideo.setDescription(params.getString("description"));
+        platformVideo.setFormat(params.getString("format"));
+        platformVideo.setDuration(params.getInteger("duration"));
+        platformVideo.setSize(params.getInteger("size"));
+        platformVideo.setHeight(params.getInteger("height"));
+        platformVideo.setWidth(params.getInteger("width"));
+
+        //查看是否已有
+        platformVideoMapper.deleteByMd5(params.getString("md5"));
+
+        return this.save(platformVideo);
+    }
+
+    /**
+     * 封面处理
+     */
+    private void coverHandler(JSONObject params) {
+        //删除以重复
+        materialVideoCoverService.deleteByVideoMd5(params.getString("md5"));
+        JSONArray covers = params.getJSONArray("covers");
+        String videoMd5 = params.getString("md5");
+        covers.forEach(cover -> {
+            insertCover((Map)cover, videoMd5);
+        });
+    }
+
+    private void insertCover(Map<String,Object> cover, String videoMd5) {
+        MaterialVideoCover materialVideoCover = new MaterialVideoCover();
+        materialVideoCover.setVideoMd5(videoMd5);
+        materialVideoCover.setName(cover.get("name").toString());
+        materialVideoCover.setMd5(cover.get("md5").toString());
+        materialVideoCover.setUrl(cover.get("url").toString());
+        materialVideoCover.setFormat(cover.get("format").toString());
+        materialVideoCover.setSize((int) cover.get("size"));
+        materialVideoCover.setHeight((int) cover.get("height"));
+        materialVideoCover.setWidth((int)cover.get("width"));
+        materialVideoCoverService.save(materialVideoCover);
+    }
+
+    /**
+     * 标签处理
+     */
+    private void tagHandler(JSONObject params) {
+        //处理标签。延续之前的逻辑,每次上传视频先删后加
+        materialTagInfoService.deleteByCode(params.getString("md5"));
+        insertTagList(params.getString("md5"), params.getString("userId"), params.getJSONArray("modalityTagList"));
+        insertTagList(params.getString("md5"), params.getString("userId"), params.getJSONArray("contentTagList"));
+        insertTagList(params.getString("md5"), params.getString("userId"), params.getJSONArray("senceTagList"));
+        insertTagList(params.getString("md5"), params.getString("userId"), params.getJSONArray("modTagList"));
+    }
+
+    private void insertTagList(String code, String userId, JSONArray tagList) {
+        if (null != tagList && !tagList.isEmpty()) {
+            for (int m = 0; m < tagList.size(); m++) {
+                Long tagId = tagList.getLong(m);
+                TagInfo tagInfo = tagInfoService.getById(tagId);
+                MaterialTagInfo setTag = new MaterialTagInfo(code, tagInfo, userId);
+                setTag.setCategoryId(tagInfo.getTagCategoryId());
+                materialTagInfoService.save(setTag);
+            }
+        }
+    }
+
+    /**
+     * 获取视频首帧封面
+     */
+    private String getFirstFrame(String initialUrl, String videoMd5) {
+        String decoderUrl = URLDecoder.decode(initialUrl).replace("https://media-1301855440.cos.ap-chongqing.myqcloud.com/", "");
+        String loadImage = "cutFrame/" + videoMd5 + "/zero.jpg";
+        return CloudVideoProcessUtil.videoCutPictureHandle(decoderUrl, loadImage);
+    }
+}

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

@@ -0,0 +1,191 @@
+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;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+@Slf4j
+@Service
+public class ApprovalNodeNoticeHandler {
+
+    @Autowired
+    MailLogMapper mailLogMapper;
+
+    @Autowired
+    IPlatformMaterialService platformMaterialService;
+
+    /**
+     *  企业微信通知
+     */
+    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(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(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 "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 "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"),
+                        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(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\n驳回原因:%s",
+                                materialRelatePerson.getString("scriptName"),
+                                materialRelatePerson.getString("orderTitle"),
+                                materialRelatePerson.getLong("orderId"),
+                                materialRelatePerson.getString("operatorName"),
+                                materialRelatePerson.getString("scriptAdvise")));
+                break;
+
+            //视频被驳回,通知剪辑重新上传视频
+            case "REJECT_VIDEO":
+                sendWeChat(materialRelatePerson.getString("clip"),
+                        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("videoAdvise")));
+
+        }
+    }
+
+    /**
+     * 发送通知消息到多人企业微信
+     */
+    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(String userId, String message) {
+            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);
+            }
+    }
+}

+ 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

+ 1 - 1
jeecg-boot-module-system/src/main/resources/application-test.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8088
+  port: 8804
   servlet:
     context-path: /jeecg-boot
     compression:

+ 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

+ 48 - 24
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -21,17 +21,22 @@ 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;
+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;
@@ -387,32 +392,46 @@ public class SampleTest {
     @Autowired
     private IRuleKuaiShouPlanService ruleKuaiShouPlanService;
 
+    @Autowired
+    private IBytedanceAccountReportTaskRecordService reportTaskRecordService;
     @Test
     public void execute() {
-        String accountIds = "1679063493763085";
-        String[] arrays = accountIds.split(",");
-        for (int i = 0; i < arrays.length; i++) {
-            Long accountId = Long.parseLong(arrays[i]);
-            CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
-            load12Data(token);
-//            load12AccountData(token);
+        List<UserAllocation>  allocations = allocationService.listByMediaId("3",0);
+        for (UserAllocation allocation:allocations) {
+            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-11", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-        reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-10-11", "yyyy-MM-dd"), DateUtils.parseDate("2020-10-21", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-        reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-10-21", "yyyy-MM-dd"), DateUtils.parseDate("2020-10-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+        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);
+        reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-12-01", "yyyy-MM-dd"), DateUtils.parseDate("2020-12-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
     }
 
     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
@@ -482,20 +501,25 @@ public class SampleTest {
 //        if (null == accountTargetTemplates || accountTargetTemplates.isEmpty()) {
 //            return;
 //        }
-        AiKuaishouAccountTargetTemplate accountTargetTemplate1 = aiKuaishouAccountTargetTemplateService.getById(30002);
-        aiKuaishouNewCreateCampaign.kuaishouAiAdsNewMaterialCreativity(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.kuaishouAiAdsNewMaterialCreativity(accountTargetTemplate2);
+        AiKuaishouAccountTargetTemplate accountTargetTemplate2 = aiKuaishouAccountTargetTemplateService.getById(120001);
+        aiKuaishouNewCreateCampaign.kuaishouAiAddNewMaterialCreativity(accountTargetTemplate2,1);
     }
 
     @Test
     public void etlKuaishouProjectData(){
-        String dateString = "2020-03-17";
+        String dateString = "2020-08-07";
         Date startDate = DateUtils.parseDate(dateString,"yyyy-MM-dd");
-        for(int i=0;i<=365;i++){
+        for(int i=0;i<=180;i++){
             Date getDate = DateUtils.addDay(startDate,i);
-            kuaishouVideoEtlInfoService.etlKuaishouVideoInfoGroupByProjectId(getDate);
+            kuaishouVideoEtlInfoService.etlKuaishouVideoInfo(getDate);
+            bytedanceVideoEtlInfoService.etlBytedanceVideoInfo(getDate);
         }
     }
 }

+ 16 - 34
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 {
@@ -136,23 +133,12 @@ public class MatchLogic {
                         } else {
                             //不包含,阈值中,存在任一目标则不报警,都不存在时则报警,出现阈值之外的亦报警
                             boolean flag = true;
-                            if ("retargetingTagsInclude".equals(indicatorCode) || "population".equals(indicatorCode) || "region".equals(indicatorCode) || "district".equals(indicatorCode)) {
-                                //人群包判断是否存在该对象
-                                for (String thr : thresholds) {
-                                    if (values.contains(thr)) {
-                                        flag = false;
-                                    } else {
-                                        return true;
-                                    }
-                                }
-                            } else {
-                                //判断是否存在关键字。
-                                for (String thr : thresholds) {
-                                    if (values.toString().contains(thr)) {
-                                        flag = false;
-                                    } else {
-                                        return true;
-                                    }
+                            //人群包判断是否存在该对象
+                            for (String v : values) {
+                                if (threshold.contains(v)) {
+                                    flag = false;
+                                } else {
+                                    return true;
                                 }
                             }
                             return flag;
@@ -167,21 +153,17 @@ public class MatchLogic {
                             }
                         }
                     } else {
-                        boolean flag = true;
                         for (String thr : thresholds) {
-                            if (value.toString().contains(thr)) {
-                                flag = false;
-                            } else {
+                            if (!value.contains(thr)) {
                                 return true;
                             }
                         }
-                        return flag;
                     }
                 } else {
                     if ("contain".equals(condition)) {
-                        return value.toString().contains(threshold);
+                        return value.contains(threshold);
                     } else {
-                        return !value.toString().contains(threshold);
+                        return !value.contains(threshold);
                     }
                 }
             }

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

+ 6 - 6
module-check/src/main/java/cn/com/ctop/notice/handler/SendWeChatHandle.java

@@ -20,13 +20,13 @@ public class SendWeChatHandle {
     public void sendWeChatByMail(String mail,String message){
         String weChatId=mailLogMapper.getWeChatByMail(mail);
         if(weChatId.isEmpty()){
-            log.error(String.format("mail's WeChat not found. mail =%s", mail));
-            //TODO 通知管理员添加邮箱
-        }else{
-            List<String> messageList= splitMessage(message);
-            messageList.forEach(it->CorpWexinUtils.sendMessageByWeChatId(weChatId,it));
-        }
+        log.error(String.format("mail's WeChat not found. mail =%s", mail));
+        //TODO 通知管理员添加邮箱
+    }else{
+        List<String> messageList= splitMessage(message);
+        messageList.forEach(it->CorpWexinUtils.sendMessageByWeChatId(weChatId,it));
     }
+}
 
     /**
      * 发送多人,邮箱逗号隔开

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

@@ -17,4 +17,6 @@ public interface ProjectMapper extends BaseMapper<Project> {
     String getNameByAccountId(@Param("accountId") Long accountId);
 
     JSONObject getWarningInfoByProjectId(@Param("projectId") Long projectId);
+
+    String querySupplierCodeById(@Param("projectId") Long projectId);
 }

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

+ 4 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/ProjectMapper.xml

@@ -21,4 +21,8 @@
      where id = #{projectId}
     </select>
 
+    <select id="querySupplierCodeById" resultType="java.lang.String">
+        select supplier_code from ctop_project where id=#{projectId}
+    </select>
+
 </mapper>

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

+ 46 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoAuthor.java

@@ -0,0 +1,46 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材作者信息
+ */
+@Data
+@TableName("ctop_material_video_author")
+public class MaterialVideoAuthor {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频md5*/
+	private String videoMd5;
+	/**运营id*/
+	private String operatorId;
+	/**运营姓名*/
+	private String operatorName;
+	/**剪辑id*/
+	private String clipId;
+	/**剪辑姓名*/
+	private String clipName;
+	/**拍摄id*/
+	private String shotId;
+	/**拍摄姓名*/
+	private String shotName;
+	/**编导id*/
+	private String planId;
+	/**编导姓名*/
+	private String planName;
+	/**平面id*/
+	private String planeId;
+	/**平面姓名*/
+	private String planeName;
+	/**createTime*/
+	private Date createTime;
+	/**updateTime*/
+	private Date updateTime;
+}

+ 40 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoCover.java

@@ -0,0 +1,40 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材封面信息
+ */
+@Data
+@TableName("ctop_material_video_cover")
+public class MaterialVideoCover {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频md5*/
+	private String videoMd5;
+	/**封面名称*/
+	private String name;
+	/**封面唯一标识*/
+	private String md5;
+	/**封面url地址*/
+	private String url;
+	/**封面描述*/
+	private String description;
+	/**格式*/
+	private String format;
+	/**大小(kb)*/
+	private Integer size;
+	/**高*/
+	private Integer height;
+	/**宽*/
+	private Integer width;
+	/**createTime*/
+	private Date createTime;
+}

+ 30 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoFrame.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材截帧信息
+ */
+@Data
+@TableName("ctop_material_video_frame")
+public class MaterialVideoFrame {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频md5*/
+	private String videoMd5;
+	/**图片唯一标识*/
+	private String md5;
+	/**图片url地址*/
+	private String url;
+	/**图片截帧顺序*/
+	private Integer frameIndex;
+	/**createTime*/
+	private Date createTime;
+}

+ 46 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoInfo.java

@@ -0,0 +1,46 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材基础信息
+ */
+@Data
+@TableName("ctop_material_video_info")
+public class MaterialVideoInfo {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频名称*/
+	private String name;
+	/**视频md5*/
+	private String md5;
+	/**视频url*/
+	private String url;
+	/**封面url*/
+	private String coverUrl;
+	/**素材类型*/
+	private Integer materialType;
+	/**代理商信息*/
+	private String supplierCode;
+	/**视频描述*/
+	private String description;
+	/**格式*/
+	private String format;
+	/**时长(秒)*/
+	private Integer duration;
+	/**大小(kb)*/
+	private Integer size;
+	/**高*/
+	private Integer height;
+	/**宽*/
+	private Integer width;
+	/**createTime*/
+	private Date createTime;
+}

+ 28 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoProject.java

@@ -0,0 +1,28 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材关联项目信息
+ */
+@Data
+@TableName("ctop_material_video_project")
+public class MaterialVideoProject {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频md5*/
+	private String videoMd5;
+	/**关联项目id*/
+	private Long projectId;
+	/**createTime*/
+	private Date createTime;
+	/**updateTime*/
+	private Date updateTime;
+}

+ 32 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/entity/MaterialVideoWatermark.java

@@ -0,0 +1,32 @@
+package cn.com.ctop.common.module.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 视频素材水印信息
+ */
+@Data
+@TableName("ctop_material_video_watermark")
+public class MaterialVideoWatermark {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+	/**视频md5*/
+	private String videoMd5;
+	/**水印视频名称*/
+	private String name;
+	/**水印视频唯一标识*/
+	private String md5;
+	/**水印视频url*/
+	private String url;
+	/**水印创建人*/
+	private String createBy;
+	/**createTime*/
+	private Date createTime;
+}

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoAuthorMapper.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoAuthor;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 视频素材作者信息
+ */
+public interface MaterialVideoAuthorMapper extends BaseMapper<MaterialVideoAuthor> {
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoCoverMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 视频素材封面信息
+ */
+public interface MaterialVideoCoverMapper extends BaseMapper<MaterialVideoCover> {
+
+    void deleteByVideoMd5(@Param("videoMd5") String videoMd5);
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoFrameMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoFrame;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 视频素材截帧信息
+ */
+public interface MaterialVideoFrameMapper extends BaseMapper<MaterialVideoFrame> {
+
+    int queryFrameCountByCode(@Param("videoMd5") String videoMd5);
+
+}

+ 14 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoInfoMapper.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 视频素材基础信息
+ */
+public interface MaterialVideoInfoMapper extends BaseMapper<MaterialVideoInfo> {
+
+    void deleteByMd5(@Param("md5") String md5);
+
+}

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoProjectMapper.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 视频素材关联项目信息
+ */
+public interface MaterialVideoProjectMapper extends BaseMapper<MaterialVideoProject> {
+
+}

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/MaterialVideoWatermarkMapper.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.mapper;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoWatermark;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 视频素材水印信息
+ */
+public interface MaterialVideoWatermarkMapper extends BaseMapper<MaterialVideoWatermark> {
+
+}

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoAuthorMapper.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.common.module.material.mapper.MaterialVideoAuthorMapper">
+
+</mapper>

+ 13 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoCoverMapper.xml

@@ -0,0 +1,13 @@
+<?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.common.module.material.mapper.MaterialVideoCoverMapper">
+
+    <delete id="deleteByVideoMd5">
+        DELETE
+        FROM
+            ctop_material_video_cover
+        WHERE
+            video_md5 = #{videoMd5}
+    </delete>
+
+</mapper>

+ 8 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoFrameMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.common.module.material.mapper.MaterialVideoFrameMapper">
+
+    <select id="queryFrameCountByCode" resultType="java.lang.Integer">
+        select count(id) from ctop_material_video_frame where video_md5=#{videoMd5}
+    </select>
+</mapper>

+ 8 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoInfoMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.common.module.material.mapper.MaterialVideoInfoMapper">
+
+    <delete id="deleteByMd5" >
+        delete from ctop_material_video_info where md5=#{md5}
+    </delete>
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoProjectMapper.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.common.module.material.mapper.MaterialVideoProjectMapper">
+
+</mapper>

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/mapper/xml/MaterialVideoWatermarkMapper.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.common.module.material.mapper.MaterialVideoWatermarkMapper">
+
+</mapper>

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoAuthorService.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoAuthor;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *  视频素材作者信息
+ */
+public interface IMaterialVideoAuthorService extends IService<MaterialVideoAuthor> {
+
+}

+ 13 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoCoverService.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *  视频素材封面信息
+ */
+public interface IMaterialVideoCoverService extends IService<MaterialVideoCover> {
+
+    void deleteByVideoMd5(String videoMd5);
+
+}

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoFrameService.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoFrame;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *  视频素材截帧信息
+ */
+public interface IMaterialVideoFrameService extends IService<MaterialVideoFrame> {
+
+    int getFrameCountByCode(String videoMd5);
+
+    void getTencentCutFrame(String videoUrl, String videoMd5, String coverUrl);
+
+}

+ 13 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoInfoService.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 视频素材基础信息
+ */
+public interface IMaterialVideoInfoService extends IService<MaterialVideoInfo> {
+
+    void deleteByMd5(String md5);
+
+}

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoProjectService.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *  视频素材关联项目信息
+ */
+public interface IMaterialVideoProjectService extends IService<MaterialVideoProject> {
+
+}

+ 11 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/IMaterialVideoWatermarkService.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.common.module.material.service;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoWatermark;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ *  视频素材水印信息
+ */
+public interface IMaterialVideoWatermarkService extends IService<MaterialVideoWatermark> {
+
+}

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoAuthorServiceImpl.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoAuthor;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoAuthorMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoAuthorService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频素材作者信息
+ */
+@Service
+public class MaterialVideoAuthorServiceImpl extends ServiceImpl<MaterialVideoAuthorMapper, MaterialVideoAuthor> implements IMaterialVideoAuthorService {
+
+}

+ 23 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoCoverServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoCover;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoCoverMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoCoverService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频素材封面信息
+ */
+@Service
+public class MaterialVideoCoverServiceImpl extends ServiceImpl<MaterialVideoCoverMapper, MaterialVideoCover> implements IMaterialVideoCoverService {
+
+    @Autowired
+    MaterialVideoCoverMapper materialVideoCoverMapper;
+
+    @Override
+    public void deleteByVideoMd5(String videoMd5) {
+        materialVideoCoverMapper.deleteByVideoMd5(videoMd5);
+    }
+}

+ 82 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoFrameServiceImpl.java

@@ -0,0 +1,82 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoFrame;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoFrameMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoFrameService;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.CloudVideoProcessUtil;
+import cn.com.ctop.common.module.utils.LoadFileUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 视频素材截帧信息
+ */
+@Slf4j
+@Service
+public class MaterialVideoFrameServiceImpl extends ServiceImpl<MaterialVideoFrameMapper, MaterialVideoFrame> implements IMaterialVideoFrameService {
+
+    @Autowired
+    MaterialVideoFrameMapper  materialVideoFrameMapper;
+
+    @Value("${jeecg.path.image-upload}")
+    private String imageUpLoadPath;
+
+    @Override
+    public int getFrameCountByCode(String videoMd5) {
+        return materialVideoFrameMapper.queryFrameCountByCode(videoMd5);
+    }
+
+    @Override
+    public void getTencentCutFrame(String videoUrl, String videoMd5, String coverUrl) {
+        try {
+            String loadImage = "cutFrame/" + videoMd5 + "/${Number}.jpg";
+            Map<String, Object> coverMap = CloudVideoProcessUtil.videoCutFrameHandle(videoUrl, loadImage);
+            List<MaterialVideoFrame> batch = new ArrayList<>();
+            for (int i = 0; i <= 13; i++) {
+                String url = (String) coverMap.get(String.valueOf(i));
+                if (!Check.isNull(url)) {
+                    String cutFramePath = LoadFileUtil.downLoadFromUrl(url, imageUpLoadPath);
+                    String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
+                    MaterialVideoFrame materialVideoFrame = new MaterialVideoFrame();
+                    materialVideoFrame.setMd5(cutFrameMd5);
+                    materialVideoFrame.setUrl(url);
+                    materialVideoFrame.setVideoMd5(videoMd5);
+                    materialVideoFrame.setFrameIndex(i+1);
+                    batch.add(materialVideoFrame);
+                    this.save(materialVideoFrame);
+                    LoadFileUtil.delFile(cutFramePath);
+                }
+            }
+            insertFrames(batch,videoMd5,coverUrl);
+        } catch (Exception e) {
+            log.info("抽帧异常,code:{}", videoMd5);
+            log.error("获取截帧图片MD5错误");
+        }
+    }
+
+    private void insertFrames(List<MaterialVideoFrame> batch,  String videoMd5, String coverUrl){
+        String cutFramePath = LoadFileUtil.downLoadFromUrl(coverUrl, imageUpLoadPath);
+        String cutFrameMd5 = null;
+        try {
+            cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
+        } catch (IOException e) {
+            log.error("获取截帧图片MD5错误");
+        }
+        MaterialVideoFrame materialVideoFrame = new MaterialVideoFrame();
+        materialVideoFrame.setMd5(cutFrameMd5);
+        materialVideoFrame.setUrl(coverUrl);
+        materialVideoFrame.setVideoMd5(videoMd5);
+        materialVideoFrame.setFrameIndex(0);
+        batch.add(materialVideoFrame);
+        this.saveBatch(batch);
+    }
+}

+ 23 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoInfoServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoInfo;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoInfoMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频素材基础信息
+ */
+@Service
+public class MaterialVideoInfoServiceImpl extends ServiceImpl<MaterialVideoInfoMapper, MaterialVideoInfo> implements IMaterialVideoInfoService {
+
+    @Autowired
+    MaterialVideoInfoMapper materialVideoInfoMapper;
+
+    @Override
+    public void deleteByMd5(String md5) {
+        materialVideoInfoMapper.deleteByMd5(md5);
+    }
+}

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoProjectServiceImpl.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoProject;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoProjectMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoProjectService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频素材关联项目信息
+ */
+@Service
+public class MaterialVideoProjectServiceImpl extends ServiceImpl<MaterialVideoProjectMapper, MaterialVideoProject> implements IMaterialVideoProjectService {
+
+}

+ 15 - 0
module-common/src/main/java/cn/com/ctop/common/module/material/service/impl/MaterialVideoWatermarkServiceImpl.java

@@ -0,0 +1,15 @@
+package cn.com.ctop.common.module.material.service.impl;
+
+import cn.com.ctop.common.module.material.entity.MaterialVideoWatermark;
+import cn.com.ctop.common.module.material.mapper.MaterialVideoWatermarkMapper;
+import cn.com.ctop.common.module.material.service.IMaterialVideoWatermarkService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频素材水印信息
+ */
+@Service
+public class MaterialVideoWatermarkServiceImpl extends ServiceImpl<MaterialVideoWatermarkMapper, MaterialVideoWatermark> implements IMaterialVideoWatermarkService {
+
+}

+ 0 - 6
module-common/src/main/java/cn/com/ctop/common/module/service/IMaterialCutFrameService.java

@@ -18,14 +18,8 @@ import java.util.List;
 public interface IMaterialCutFrameService extends IService<MaterialCutFrame> {
     void getCutFrame(String url, String materialId, Long secondDuration, String height, String width) throws IOException;
 
-    void loadCutFrame(String jobId, String videoSignature);
-
     List<MaterialCutFrame> getListByVideoSignature(String signature);
 
-    void getCosCutFrame(String url, String materialId) throws IOException;  //腾讯云抽帧
-
-    void loadCosCutFrame(String jobId, String videoSignature);  //腾讯云抽帧任务状态查询以及数据入库
-
     void getTencentCutFrame(String videoUrl, String materialId, String coveUrl);
 
     boolean updateTencentCutFrame(String videoMD5);

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

@@ -17,4 +17,6 @@ public interface IProjectService extends IService<Project> {
     List<Project> listByMediaType(int projectType, int checkLink);
 
     String getNameByAccountId(Long accountId);
+
+    String getSupplierCodeById(Long projectId);
 }

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

+ 1 - 166
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialCutFrameServiceImpl.java

@@ -45,7 +45,6 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
 
     private static String ossLocation = "oss-cn-beijing";
     private static String ossBucket = "ctop-media";
-    private static String ossOutputObject = "output_{Count}.jpg";
 
     @Value("${jeecg.path.image-upload}")
     private String imageUpLoadPath;
@@ -117,6 +116,7 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
             output.put("Bucket", ossBucket);
 
 
+            String ossOutputObject = "output_{Count}.jpg";
             output.put("Object", URLEncoder.encode(ossOutputObject1 + ossOutputObject, "utf-8"));
 
             snapshotConfig.put("OutputFile", output.toJSONString());
@@ -152,172 +152,11 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
 
     }
 
-
-    @Override
-    public void loadCutFrame(String jobId, String videoSignature) {
-        try {
-            DefaultProfile profile = DefaultProfile.getProfile(
-                    "cn-beijing",
-                    "LTAIbNbqWzSOklQV",
-                    "1rkPz7JNoXk8sJevPaeYHWqfkQXBGh");
-            IAcsClient client = new DefaultAcsClient(profile);
-
-            QuerySnapshotJobListRequest request = new QuerySnapshotJobListRequest();
-            request.setSnapshotJobIds(jobId);
-            QuerySnapshotJobListResponse response = client.getAcsResponse(request);
-            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(response));
-            if (jsonObject == null) {
-                return;
-            }
-            JSONObject json = (JSONObject) jsonObject.getJSONArray("snapshotJobList").get(0);
-            String state = json.getString("state");
-            if (null == state || !"Success".equals(state)) {
-                return;
-            }
-            String loadImage = "cutFrame/" + videoSignature + "/";
-
-            Integer count = json.getInteger("count");
-            for (int j = 1; j <= count; j++) {
-                String urlStr = null;
-                if (j < 10) {
-                    urlStr = String.format(
-                            OssConstant.formatUrl + loadImage + "output_0000" + j + ".jpg",
-                            ossBucket,
-                            ossLocation);
-                } else if (j < 100) {
-                    urlStr = String.format(
-                            OssConstant.formatUrl + loadImage + "output_000" + j + ".jpg",
-                            ossBucket,
-                            ossLocation);
-                } else if (j > 100) {
-                    urlStr = String.format(
-                            OssConstant.formatUrl + loadImage + "output_00" + j + ".jpg",
-                            ossBucket,
-                            ossLocation);
-                }
-                String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, imageUpLoadPath);
-                String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
-
-                MaterialCutFrame cutFrame = new MaterialCutFrame();
-                cutFrame.setSignature(cutFrameMd5);
-                cutFrame.setUrl(urlStr);
-                cutFrame.setVideoSignature(videoSignature);
-                cutFrame.setImageIndex(j);
-                this.save(cutFrame);
-                LoadFileUtil.delFile(cutFramePath);
-
-            }
-
-            QueryWrapper<MaterialCutFrameTask> updateQueryWrapper = new QueryWrapper<>();
-            updateQueryWrapper.eq("job_id", jobId);
-            updateQueryWrapper.eq("video_signature", videoSignature);
-            MaterialCutFrameTask updateTask = new MaterialCutFrameTask();
-            updateTask.setJobStatus(1);
-            cutFrameTaskService.update(updateTask, updateQueryWrapper);
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        }
-
-    }
-
     @Override
     public List<MaterialCutFrame> getListByVideoSignature(String videoSignature) {
         return materialCutFrameMapper.getListByVideoSignature(videoSignature);
     }
 
-
-    //腾讯云抽帧
-    @Override
-    public void getCosCutFrame(String url, String materialId) throws IOException {
-        try {
-
-            QueryWrapper<MaterialCutFrameTask> queryWrapper = new QueryWrapper<>();
-            queryWrapper.eq("video_signature", materialId);
-            queryWrapper.last("limit 1");
-            MaterialCutFrameTask checkCutFrame = cutFrameTaskService.getOne(queryWrapper);
-            if (!Check.isNull(checkCutFrame)) {
-                log.info("已存推荐封面");
-                return;
-            }
-
-            //抽帧ossOutputObject1
-            String ossOutputObject1 = "/cutFrame/" + materialId + "/_";
-            String replaceUrl = url.replace("https://" + CosUtil.bucket + ".cos.ap-chongqing.myqcloud.com", "");  //地址
-            String resp = CosUtil.processMedia(replaceUrl, ossOutputObject1);
-            JSONObject respJson = JSONObject.parseObject(resp);
-            String jobId = respJson.getString("TaskId"); //{"Response": {"TaskId": "2600000655-WorkflowTask-c0b385f27c4993437029b5da175542aet0","RequestId": "4c23ce23-087f-4d4b-b73b-907d77d6d78d" } }
-            MaterialCutFrameTask cutFrameTask = new MaterialCutFrameTask();
-            cutFrameTask.setJobStatus(0);
-            cutFrameTask.setJobId(jobId);
-            cutFrameTask.setCloud_type(2);
-            cutFrameTask.setVideoSignature(materialId);
-            cutFrameTaskService.save(cutFrameTask);
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        }
-    }
-
-
-    //抽帧任务状态查询,如果完成则把抽帧入库
-    @Override
-    public void loadCosCutFrame(String jobId, String videoSignature) {
-        try {
-            String resp = CosUtil.describeTaskDetail(jobId);
-            if (StringUtils.isBlank(resp)) {
-                return;
-            }
-
-            JSONObject respJson = JSONObject.parseObject(resp);
-            String status = respJson.getString("Status");
-
-            if (!"FINISH".equals(status)) {
-                return;
-            }
-
-
-            JSONArray resultSetArray = respJson.getJSONObject("WorkflowTask").getJSONArray("MediaProcessResultSet");
-            if (Check.isNull(resultSetArray)) {
-                return;
-            }
-            JSONObject resultSetObject = resultSetArray.getJSONObject(0);
-            if (Check.isNull(resultSetObject)) {
-                return;
-            }
-            JSONArray snapshotArray = resultSetObject.getJSONObject("SampleSnapshotTask").getJSONObject("Output").getJSONArray("ImagePathSet");
-
-            if (Check.isNull(snapshotArray)) {
-                return;
-            }
-
-            for (int i = 0; i < snapshotArray.size(); i++) {
-                String imagePath = snapshotArray.getString(i);
-                String urlStr = "https://" + CosUtil.bucket + ".cos.ap-chongqing.myqcloud.com" + imagePath;
-
-                //下载到本地获取图片md5
-                String cutFramePath = LoadFileUtil.downLoadFromUrl(urlStr, imageUpLoadPath);
-                String cutFrameMd5 = LoadFileUtil.getMD5(cutFramePath);
-
-                MaterialCutFrame cutFrame = new MaterialCutFrame();
-                cutFrame.setSignature(cutFrameMd5);
-                cutFrame.setUrl(urlStr);
-                cutFrame.setVideoSignature(videoSignature);
-                cutFrame.setImageIndex(i);
-                this.save(cutFrame);
-            }
-
-            QueryWrapper<MaterialCutFrameTask> updateQueryWrapper = new QueryWrapper<>();
-            updateQueryWrapper.eq("job_id", jobId);
-            updateQueryWrapper.eq("video_signature", videoSignature);
-            MaterialCutFrameTask updateTask = new MaterialCutFrameTask();
-            updateTask.setJobStatus(1);
-            cutFrameTaskService.update(updateTask, updateQueryWrapper);
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        }
-
-    }
-
-
     @Override
     public void getTencentCutFrame(String videoUrl, String materialId, String coveUrl) {
         try {
@@ -349,11 +188,8 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
         } catch (Exception e) {
             e.printStackTrace();
         }
-
-
     }
 
-
     private void getCut(String materialId, String videoUrl, String loadImage, Integer count) {
         try {
             Map<String, Object> coverMap = CloudVideoProcessUtil.videoCutFrameHandle(videoUrl, loadImage);
@@ -383,7 +219,6 @@ public class MaterialCutFrameServiceImpl extends ServiceImpl<MaterialCutFrameMap
                 return;
             }
             getCut(materialId, videoUrl, loadImage, count + 1);
-
         }
 
     }

+ 1 - 6
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java

@@ -110,7 +110,6 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     @Override
     public String watermarkVideoBySupplierCode(String videoSignature, String videoUrl, Long templateId) {
         try {
-
             QueryWrapper<SupplierWatermark> supplierWatermarkQueryWrapper = new QueryWrapper<>();
             supplierWatermarkQueryWrapper.eq("video_signature", videoSignature);
             supplierWatermarkQueryWrapper.last("limit 1");
@@ -146,16 +145,11 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                 }
                 return watermarkUrl;
             }
-
-
         } catch (Exception e) {
             log.info("供应商水印生成异常,videoCode:{}", videoSignature);
             e.printStackTrace();
-
-
         }
         return null;
-
     }
 
 
@@ -606,6 +600,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
         String url = "";
         if (!Check.isNull(json.getString("url"))) {
             url = "https:" + json.getString("url");
+
         }
         Long projectId = json.getLong("projectId");
         String code = json.getString("code");

+ 6 - 3
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialTagInfoServiceImpl.java

@@ -11,6 +11,7 @@ import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -35,6 +36,8 @@ public class MaterialTagInfoServiceImpl extends ServiceImpl<MaterialTagInfoMappe
     private IMaterialInfoService materialInfoService;
     @Autowired
     private ITagInfoService tagInfoService;
+    @Autowired
+    private MaterialTagInfoMapper materialTagInfoMapper;
     @Override
     public Map<String, Object> mark(JSONObject data, LoginUser user) {
         Map<String,Object>result = new HashMap<>();
@@ -98,8 +101,8 @@ public class MaterialTagInfoServiceImpl extends ServiceImpl<MaterialTagInfoMappe
 
     @Override
     public void deleteByCode(String code) {
-        UpdateWrapper<MaterialTagInfo>updateWrapper = new UpdateWrapper<>();
-        updateWrapper.eq("code",code).set("status",0).set("update_time",new Date());
-        this.update(updateWrapper);
+        QueryWrapper<MaterialTagInfo> wrapper = new QueryWrapper<>();
+        wrapper.eq("code",code);
+        materialTagInfoMapper.delete(wrapper);
     }
 }

+ 5 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/ProjectServiceImpl.java

@@ -35,4 +35,9 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
     public String getNameByAccountId(Long accountId) {
         return projectMapper.getNameByAccountId(accountId);
     }
+
+    @Override
+    public String getSupplierCodeById(Long projectId) {
+        return projectMapper.querySupplierCodeById(projectId);
+    }
 }

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

@@ -92,11 +92,15 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
         if ("".equals(mediaId)) {
             queryWrapper.eq("media_id", mediaId);
         }
-        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 cn.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("快手行动号召按钮同步完成");
+    }
+}

+ 33 - 0
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")
@@ -25,6 +32,32 @@ public class KuaishouAiAdsNewMaterialCreativityJob {
         accountTargetTemplates.forEach(targetTemplate -> aiKuaishouNewCreateCampaign.kuaishouAiAdsNewMaterialCreativity(targetTemplate));
     }
 
+
+    @XxlJob("kuaishouAiAddNewMaterialCreativityJob")
+    public void kuaishouAiAddNewMaterialCreativityJob() {
+        List<AiKuaishouAccountTargetTemplate> accountTargetTemplates = aiKuaishouAccountTargetTemplateService.getAllEffectTemplate();
+        if(null==accountTargetTemplates||accountTargetTemplates.isEmpty()){
+            return;
+        }
+        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")
     public void kuaishouAiAdsHotMaterialCreativityJob() {
         List<AiKuaishouAccountTargetTemplate> accountTargetTemplates = aiKuaishouAccountTargetTemplateService.getAllEffectTemplate();

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

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

@@ -0,0 +1,169 @@
+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>

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


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff