浏览代码

Merge branch 'master' of http://git.tjyourong.com.cn/ctop/adsp-boot

 Conflicts:
	jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
xuzuoyun 4 年之前
父节点
当前提交
55a7018d3f
共有 52 个文件被更改,包括 1339 次插入235 次删除
  1. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  2. 21 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  3. 1 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  4. 15 15
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/MaterialReportOverViewMapper.xml
  5. 67 62
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java
  6. 2 2
      jeecg-boot-module-system/src/main/resources/application-dev.yml
  7. 4 0
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  8. 7 1
      module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialInfo.java
  9. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/ICtopCorpWexinUserService.java
  10. 11 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopCorpWexinUserServiceImpl.java
  11. 1 0
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/FileInfoServiceImpl.java
  12. 24 9
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java
  13. 4 4
      module-common/src/main/java/cn/com/ctop/common/module/utils/CorpWexinUtils.java
  14. 34 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceVideoETLReportReloadJob.java
  15. 20 0
      module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/SendHourlyMessageJob.java
  16. 3 3
      module-job-bytedance/src/main/resources/application-prod.yml
  17. 21 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaishouCreateCreativeController.java
  18. 5 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouCreateCreativeService.java
  19. 0 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IKuaishouAccountCreativeOverrunInfoService.java
  20. 74 17
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouCreateCreativeServiceImpl.java
  21. 4 4
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouGroupTemplateServiceImpl.java
  22. 20 64
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  23. 6 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportDailyAccount.java
  24. 6 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportHourlyAccount.java
  25. 30 28
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/EtlKuaishouAccountMaterialReportDailyMapper.xml
  26. 8 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyAccountMapper.xml
  27. 4 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportHourlyAccountMapper.xml
  28. 11 8
      module-kuaishou/src/main/resources/kuaishou_config.properties
  29. 1 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/constant/QYWxConstant.java
  30. 2 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatUserListService.java
  31. 50 9
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/AppchatCreateServiceImpl.java
  32. 10 0
      module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatUserListServiceImpl.java
  33. 247 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceCreativeWordPackageController.java
  34. 202 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/BytedanceAccountCommonSlogenController.java
  35. 108 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceCreativeWordPackage.java
  36. 53 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceAccountCommonSlogen.java
  37. 4 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceVideoSlogenInfo.java
  38. 18 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/ByteDanceCreativeWordPackageMapper.java
  39. 17 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/BytedanceAccountCommonSlogenMapper.java
  40. 29 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/ByteDanceCreativeWordPackageMapper.xml
  41. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/BytedanceAccountCommonSlogenMapper.xml
  42. 21 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCreativeWordPackageService.java
  43. 14 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IBytedanceAccountCommonSlogenService.java
  44. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IEtlBytedanceVideoInfoService.java
  45. 66 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCreativeWordPackageServiceImpl.java
  46. 18 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceAccountCommonSlogenServiceImpl.java
  47. 5 2
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceVideoSlogenInfoServiceImpl.java
  48. 17 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/EtlBytedanceVideoInfoServiceImpl.java
  49. 4 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/EtlBytedanceReportVideoDailyMapper.java
  50. 34 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/EtlBytedanceReportVideoDailyMapper.xml
  51. 1 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/ReportServiceImpl.java
  52. 1 0
      module-toutiao/src/main/resources/bytedance_config.properties

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java

@@ -198,6 +198,8 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/ai/create/*", "anon");
         //filterChainDefinitionMap.put("/overView/*", "anon");
         filterChainDefinitionMap.put("/kuaishouCrowdPack/**", "anon");
+        filterChainDefinitionMap.put("/kuaishou/batch/*", "anon");
+
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);
         filterMap.put("jwt", new JwtFilter());

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

@@ -20,6 +20,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.ctop.service.IProjectMemberService;
@@ -528,6 +529,26 @@ public class MaterialInfoController {
         return result;
 
     }
+
+    /**
+     * 头条素材信息编辑 -- 批量通过审核
+     * @param materialInfo
+     * @return
+     */
+    @PutMapping(value = "/bytedance/batchedit")
+    public Result<MaterialInfo> bytedanceBatchEdit(@RequestBody MaterialInfo materialInfo) {
+        Result<MaterialInfo> result = new Result<>();
+        String[] ids = materialInfo.getIds();
+        int successNum = 0;
+        for (String id : ids) {
+            materialInfo.setId(id);
+            Result<MaterialInfo> materialInfoResult = bytedanceEdit(materialInfo);
+            if(materialInfoResult.getCode().equals(CommonConstant.SC_OK_200)){ successNum++;}
+        }
+        return result.success("批量修改成功"+successNum+"个");
+
+    }
+
     /**
      * 通过id删除
      *

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

@@ -1441,7 +1441,7 @@ public class TestController {
     public Map<String, Object> getData(Long accountId) {
         Map<String, Object> result = new HashMap<>();
         CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
-        reportService.getAdvertiserReport(token, DateUtils.parseDate("2021-01-01", "yyyy-MM-dd"), DateUtils.parseDate("2021-01-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+        reportService.getAdvertiserReport(token, DateUtils.parseDate("2021-03-01", "yyyy-MM-dd"), DateUtils.parseDate("2021-03-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
         ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
         return result;
     }

+ 15 - 15
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/MaterialReportOverViewMapper.xml

@@ -88,7 +88,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt;= #{startDate}
         AND stat_datetime &lt;= #{endDate}
     </select>
 
@@ -106,7 +106,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_date >= #{startDate}
+        AND stat_date &gt;= #{startDate}
         AND stat_date &lt;= #{endDate}
     </select>
 
@@ -122,7 +122,7 @@
                 #{item}
             </foreach>
         </if>
-        AND DATE_FORMAT(create_time, '%Y-%m-%d')>= #{startDate}
+        AND DATE_FORMAT(create_time, '%Y-%m-%d')&gt;= #{startDate}
         AND DATE_FORMAT(create_time, '%Y-%m-%d')&lt;= #{endDate}
     </select>
 
@@ -155,7 +155,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt;= #{startDate}
         AND stat_datetime &lt;= #{endDate}
         group by stat_datetime
         order by stat_datetime
@@ -176,7 +176,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt; #{startDate}
         AND stat_datetime &lt;= #{endDate}
         group by DATE_FORMAT(stat_datetime, '%Y-%m')
         order by stat_datetime asc
@@ -197,7 +197,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_date >= #{startDate}
+        AND stat_date &gt;= #{startDate}
         AND stat_date &lt;= #{endDate}
         group by stat_date
         order by stat_date
@@ -218,7 +218,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_date >= #{startDate}
+        AND stat_date &gt; #{startDate}
         AND stat_date &lt;= #{endDate}
         group by DATE_FORMAT(stat_date, '%Y-%m')
         order by stat_date
@@ -242,7 +242,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt; #{startDate}
         AND stat_datetime &lt;= #{endDate}
         AND md5!=''
         GROUP BY md5
@@ -274,7 +274,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt;= #{startDate}
         AND stat_datetime &lt;= #{endDate}
         GROUP BY t1.md5
         ORDER BY ${target} ${order}
@@ -298,7 +298,7 @@
                 #{item}
             </foreach>
         </if>
-        AND stat_datetime >= #{startDate}
+        AND stat_datetime &gt;= #{startDate}
         AND stat_datetime &lt;= #{endDate}
         GROUP BY t1.md5) t
     </select>
@@ -323,7 +323,7 @@
                 #{item}
             </foreach>
         </if>
-        AND t1.stat_date >= #{startDate}
+        AND t1.stat_date &gt;= #{startDate}
         AND t1.stat_date &lt;= #{endDate}
         GROUP BY t1.signature
         ORDER BY charge desc
@@ -357,7 +357,7 @@
                 #{item}
             </foreach>
         </if>
-        AND t1.stat_date >= #{startDate}
+        AND t1.stat_date &gt;= #{startDate}
         AND t1.stat_date &lt;= #{endDate}
         GROUP BY t1.signature
         ) t1
@@ -388,7 +388,7 @@
                 #{item}
             </foreach>
         </if>
-        AND t1.stat_date >= #{startDate}
+        AND t1.stat_date &gt;= #{startDate}
         AND t1.stat_date &lt;= #{endDate}
         GROUP BY t1.signature
         ) t1
@@ -418,7 +418,7 @@
         FROM
         etl_design_daily_report,(SELECT @i:=0) i
         where
-        stat_date >= #{startDate}
+        stat_date &gt;= #{startDate}
         AND stat_date &lt;= #{endDate}
         AND user_id IN
         <foreach collection="userIds" item="item" separator=","
@@ -441,7 +441,7 @@
         FROM
         etl_design_daily_report
         where
-        stat_date >= #{startDate}
+        stat_date &gt;= #{startDate}
         AND stat_date &lt;= #{endDate}
         AND user_id IN
         <foreach collection="userIds" item="item" separator=","

+ 67 - 62
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java

@@ -4,10 +4,7 @@ import cn.com.ctop.common.module.entity.CorpFeishuUser;
 import cn.com.ctop.common.module.entity.CtopCorpWexinUser;
 import cn.com.ctop.common.module.entity.SysDepart;
 import cn.com.ctop.common.module.entity.SysUser;
-import cn.com.ctop.common.module.service.ICorpFeishuUserService;
-import cn.com.ctop.common.module.service.ICtopCorpWexinUserService;
-import cn.com.ctop.common.module.service.ISysDepartService;
-import cn.com.ctop.common.module.service.ISysUserService;
+import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.AesEncryptUtil;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
@@ -31,14 +28,12 @@ import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CacheConstant;
 import org.jeecg.common.constant.CommonConstant;
-import cn.com.ctop.common.module.service.ISysBaseApi;
 import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.*;
 import org.jeecg.common.util.encryption.EncryptedString;
 import org.jeecg.modules.shiro.vo.DefContants;
 import org.jeecg.modules.system.model.SysLoginModel;
-import cn.com.ctop.common.module.service.ISysDictService;
 import org.jeecg.modules.system.service.ISysLogService;
 import org.jeecg.modules.system.util.RandImageUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,7 +50,7 @@ import java.util.*;
  */
 @RestController
 @RequestMapping("/sys")
-@Api(tags="用户登录")
+@Api(tags = "用户登录")
 @Slf4j
 public class LoginController {
     @Autowired
@@ -75,12 +70,13 @@ public class LoginController {
     @Autowired
     private ICtopCorpWexinUserService ctopCorpWexinUserService;
     private static final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
+
     @GetMapping("feishu/url")
-    public Map<String,Object> getUrl(){
-        Map<String,Object>result = new HashMap<>();
+    public Map<String, Object> getUrl() {
+        Map<String, Object> result = new HashMap<>();
         try {
             String url = AuthProvider.getAuthUrl("");
-            result.put("url",url);
+            result.put("url", url);
             ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
             return result;
         } catch (Exception e) {
@@ -89,19 +85,20 @@ public class LoginController {
             return result;
         }
     }
+
     @GetMapping("/feishu/auth")
     public Result<JSONObject> feishuAuth(HttpServletRequest request,
                                          HttpServletResponse response,
-                                         @RequestParam(name = "code",defaultValue = "code") String code,
-                                         @RequestParam(name = "state",defaultValue = "_t") String state) throws IOException {
+                                         @RequestParam(name = "code", defaultValue = "code") String code,
+                                         @RequestParam(name = "state", defaultValue = "_t") String state) throws IOException {
         Result<JSONObject> result = new Result<>();
         //1:根据code值获取用户飞书信息
         try {
-            if("code".equals(code.trim())){
+            if ("code".equals(code.trim())) {
                 JSONObject setData = new JSONObject();
                 String url = AuthProvider.getAuthUrl("");
-                setData.put("url",url);
-                setData.put("type",1);
+                setData.put("url", url);
+                setData.put("type", 1);
                 result.setResult(setData);
                 result.success("重定向");
                 return result;
@@ -113,14 +110,14 @@ public class LoginController {
             JSONObject userData = AuthProvider.getUserInfo(accessToken);
             JSONObject dataObject = userData.getJSONObject("data");
             String email = dataObject.getString("email");
-            if(null == email|| "".equals(email.trim())){
+            if (null == email || "".equals(email.trim())) {
                 return result.error500(StatusCode.CTOP_FEISHU_EMAIL_NOT_EXIST.getDesc());
             }
             SysUser sysUser = sysUserService.getUserByEmail(email);
             if (sysUser == null) {
                 return result.error500(StatusCode.CTOP_FEISHU_ACCOUNT_NOT_EXIST.getDesc());
             }
-            if(sysUser.getStatus() != 1){
+            if (sysUser.getStatus() != 1) {
                 return result.error500(StatusCode.CTOP_FEISHU_ACCOUNT_NOT_EXIST.getDesc());
             }
             String departId = sysDepartService.selectIdByOrdCode(sysUser.getOrgCode());
@@ -160,11 +157,11 @@ public class LoginController {
     public Result<JSONObject> wxlogin(@RequestParam(name = "code") String code) throws Exception {
         Result<JSONObject> result = new Result<>();
         val configStorage = new WxCpDefaultConfigImpl();
-        configStorage.setCorpId("wwef2e51064c0ac897");
+        configStorage.setCorpId("ww24b8a47826f5875f");
         configStorage.setAgentId(1000002);
-        configStorage.setCorpSecret("ieoVDAIurCOMdLrvktyQNCqWvTPqdphmXSFdk57NZ1k");
-       /* configStorage.setToken("hcst2019");
-        configStorage.setAesKey("hcst2019");*/
+        configStorage.setCorpSecret("MJIlySADGPlgvADnkFQPUpfZD4yV-4WN6066OgNnb0s");
+        configStorage.setToken("hcst2019");
+        configStorage.setAesKey("hcst2019");
         val service = new WxCpServiceImpl();
 
         service.setWxCpConfigStorage(configStorage);
@@ -180,7 +177,7 @@ public class LoginController {
                     result.error500("该用户未注册系统账户,请联系管理员");
                     return result;
                 }
-                if(sysUser.getStatus() != 1){
+                if (sysUser.getStatus() != 1) {
                     result.error500("该用户已冻结,请联系管理员");
                     return result;
                 }
@@ -303,22 +300,23 @@ public class LoginController {
 
     /**
      * 退出登录
+     *
      * @param request
      * @param response
      * @return
      */
     @RequestMapping(value = "/logout")
-    public Result<Object> logout(HttpServletRequest request,HttpServletResponse response) {
+    public Result<Object> logout(HttpServletRequest request, HttpServletResponse response) {
         //用户退出逻辑
         String token = request.getHeader(DefContants.X_ACCESS_TOKEN);
-        if(oConvertUtils.isEmpty(token)) {
+        if (oConvertUtils.isEmpty(token)) {
             return Result.error("退出登录失败!");
         }
         String username = JwtUtil.getUsername(token);
         LoginUser sysUser = sysBaseApi.getUserByName(username);
-        if(sysUser!=null) {
-            sysBaseApi.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null);
-            log.info(" 用户名:  "+sysUser.getRealname()+",退出成功! ");
+        if (sysUser != null) {
+            sysBaseApi.addLog("用户名: " + sysUser.getRealname() + ",退出成功!", CommonConstant.LOG_TYPE_1, null);
+            log.info(" 用户名:  " + sysUser.getRealname() + ",退出成功! ");
             //清空用户登录Token缓存
             redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
             //清空用户登录Shiro权限缓存
@@ -328,13 +326,14 @@ public class LoginController {
             //调用shiro的logout
             SecurityUtils.getSubject().logout();
             return Result.ok("退出登录成功!");
-        }else {
+        } else {
             return Result.error("Token无效!");
         }
     }
 
     /**
      * 获取访问量
+     *
      * @return
      */
     @GetMapping("loginfo")
@@ -354,9 +353,9 @@ public class LoginController {
         // 获取系统访问记录
         Long totalVisitCount = logService.findTotalVisitCount();
         obj.put("totalVisitCount", totalVisitCount);
-        Long todayVisitCount = logService.findTodayVisitCount(dayStart,dayEnd);
+        Long todayVisitCount = logService.findTodayVisitCount(dayStart, dayEnd);
         obj.put("todayVisitCount", todayVisitCount);
-        Long todayIp = logService.findTodayIp(dayStart,dayEnd);
+        Long todayIp = logService.findTodayIp(dayStart, dayEnd);
         //update-end--Author:zhangweijian  Date:20190428 for:传入开始时间,结束时间参数
         obj.put("todayIp", todayIp);
         result.setResult(obj);
@@ -366,21 +365,22 @@ public class LoginController {
 
     /**
      * 获取访问量
+     *
      * @return
      */
     @GetMapping("visitInfo")
-    public Result<List<Map<String,Object>>> visitInfo() {
-        Result<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>();
+    public Result<List<Map<String, Object>>> visitInfo() {
+        Result<List<Map<String, Object>>> result = new Result<List<Map<String, Object>>>();
         Calendar calendar = new GregorianCalendar();
-        calendar.set(Calendar.HOUR_OF_DAY,0);
-        calendar.set(Calendar.MINUTE,0);
-        calendar.set(Calendar.SECOND,0);
-        calendar.set(Calendar.MILLISECOND,0);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
         calendar.add(Calendar.DAY_OF_MONTH, 1);
         Date dayEnd = calendar.getTime();
         calendar.add(Calendar.DAY_OF_MONTH, -7);
         Date dayStart = calendar.getTime();
-        List<Map<String,Object>> list = logService.findVisitCount(dayStart, dayEnd);
+        List<Map<String, Object>> list = logService.findVisitCount(dayStart, dayEnd);
         result.setResult(oConvertUtils.toLowerCasePageList(list));
         return result;
     }
@@ -388,6 +388,7 @@ public class LoginController {
 
     /**
      * 登陆成功选择用户当前部门
+     *
      * @param user
      * @return
      */
@@ -395,11 +396,11 @@ public class LoginController {
     public Result<JSONObject> selectDepart(@RequestBody SysUser user) {
         Result<JSONObject> result = new Result<JSONObject>();
         String username = user.getUsername();
-        if(oConvertUtils.isEmpty(username)) {
-            LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
+        if (oConvertUtils.isEmpty(username)) {
+            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
             username = sysUser.getUsername();
         }
-        String orgCode= user.getOrgCode();
+        String orgCode = user.getOrgCode();
         this.sysUserService.updateUserDepart(username, orgCode);
         SysUser sysUser = sysUserService.getUserByName(username);
         JSONObject obj = new JSONObject();
@@ -419,9 +420,9 @@ public class LoginController {
         Result<String> result = new Result<String>();
         String mobile = jsonObject.get("mobile").toString();
         //手机号模式 登录模式: "2"  注册模式: "1"
-        String smsmode=jsonObject.get("smsmode").toString();
+        String smsmode = jsonObject.get("smsmode").toString();
         log.info(mobile);
-        if(oConvertUtils.isEmpty(mobile)){
+        if (oConvertUtils.isEmpty(mobile)) {
             result.setMessage("手机号不允许为空!");
             result.setSuccess(false);
             return result;
@@ -442,17 +443,17 @@ public class LoginController {
             //注册模板
             if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {
                 SysUser sysUser = sysUserService.getUserByPhone(mobile);
-                if(sysUser!=null) {
+                if (sysUser != null) {
                     result.error500(" 手机号已经注册,请直接登录!");
                     sysBaseApi.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null);
                     return result;
                 }
                 b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE);
-            }else {
+            } else {
                 //登录模式,校验用户有效性
                 SysUser sysUser = sysUserService.getUserByPhone(mobile);
                 result = sysUserService.checkUserIsEffective(sysUser);
-                if(!result.isSuccess()) {
+                if (!result.isSuccess()) {
                     return result;
                 }
 
@@ -462,7 +463,7 @@ public class LoginController {
                 if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
                     //登录模板
                     b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);
-                } else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
+                } else if (CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
                     //忘记密码模板
                     b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);
                 }
@@ -504,7 +505,7 @@ public class LoginController {
         //校验用户有效性
         SysUser sysUser = sysUserService.getUserByPhone(phone);
         result = sysUserService.checkUserIsEffective(sysUser);
-        if(!result.isSuccess()) {
+        if (!result.isSuccess()) {
             return result;
         }
 
@@ -537,7 +538,7 @@ public class LoginController {
         String token = JwtUtil.sign(username, syspassword);
         // 设置token缓存有效时间
         redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
 
         // 获取用户部门信息
         JSONObject obj = new JSONObject();
@@ -561,29 +562,31 @@ public class LoginController {
 
     /**
      * 获取加密字符串
+     *
      * @return
      */
     @GetMapping(value = "/getEncryptedString")
-    public Result<Map<String,String>> getEncryptedString(){
-        Result<Map<String,String>> result = new Result<>();
-        Map<String,String> map = new HashMap<>();
+    public Result<Map<String, String>> getEncryptedString() {
+        Result<Map<String, String>> result = new Result<>();
+        Map<String, String> map = new HashMap<>();
         map.put("key", EncryptedString.key);
-        map.put("iv",EncryptedString.iv);
+        map.put("iv", EncryptedString.iv);
         result.setResult(map);
         return result;
     }
 
     /**
      * 后台生成图形验证码 :有效
+     *
      * @param response
      * @param key
      */
     @ApiOperation("获取验证码")
     @GetMapping(value = "/randomImage/{key}")
-    public Result<String> randomImage(HttpServletResponse response,@PathVariable String key){
+    public Result<String> randomImage(HttpServletResponse response, @PathVariable String key) {
         Result<String> res = new Result<String>();
         try {
-            String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
+            String code = RandomUtil.randomString(BASE_CHECK_CODES, 4);
             String lowerCaseCode = code.toLowerCase();
             String realKey = MD5Util.getMd5(lowerCaseCode);
             redisUtil.set(realKey, lowerCaseCode, 60);
@@ -591,7 +594,7 @@ public class LoginController {
             res.setSuccess(true);
             res.setResult(base64);
         } catch (Exception e) {
-            res.error500("获取验证码出错"+e.getMessage());
+            res.error500("获取验证码出错" + e.getMessage());
             e.printStackTrace();
         }
         return res;
@@ -599,6 +602,7 @@ public class LoginController {
 
     /**
      * app登录
+     *
      * @param sysLoginModel
      * @return
      * @throws Exception
@@ -612,7 +616,7 @@ public class LoginController {
         //1. 校验用户是否有效
         SysUser sysUser = sysUserService.getUserByName(username);
         result = sysUserService.checkUserIsEffective(sysUser);
-        if(!result.isSuccess()) {
+        if (!result.isSuccess()) {
             return result;
         }
 
@@ -625,7 +629,7 @@ public class LoginController {
         }
 
         String orgCode = sysUser.getOrgCode();
-        if(oConvertUtils.isEmpty(orgCode)) {
+        if (oConvertUtils.isEmpty(orgCode)) {
             //如果当前用户无选择部门 查看部门关联信息
             List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
             if (departs == null || departs.size() == 0) {
@@ -644,7 +648,7 @@ public class LoginController {
         String token = JwtUtil.sign(username, syspassword);
         // 设置超时时间
         redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
         //token 信息
         obj.put("token", token);
         result.setResult(obj);
@@ -656,20 +660,21 @@ public class LoginController {
 
     /**
      * 图形验证码
+     *
      * @param sysLoginModel
      * @return
      */
     @RequestMapping(value = "/checkCaptcha", method = RequestMethod.POST)
-    public Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel){
+    public Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel) {
         String captcha = sysLoginModel.getCaptcha();
         String checkKey = sysLoginModel.getCheckKey();
-        if(captcha==null){
+        if (captcha == null) {
             return Result.error("验证码无效");
         }
         String lowerCaseCaptcha = captcha.toLowerCase();
-        String realKey = MD5Util.getMd5(lowerCaseCaptcha+checkKey);
+        String realKey = MD5Util.getMd5(lowerCaseCaptcha + checkKey);
         Object checkCode = redisUtil.get(realKey);
-        if(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) {
+        if (checkCode == null || !checkCode.equals(lowerCaseCaptcha)) {
             return Result.error("验证码错误");
         }
         return Result.ok();

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

@@ -1,5 +1,5 @@
 server:
-  port: 8805
+  port: 8080
   tomcat:
     max-swallow-size: -1
   servlet:
@@ -135,7 +135,7 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://139.186.27.96:4000/jiaoyang?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+          url: jdbc:mysql://139.186.27.96:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
           username: data
           password: hcst@2021
           driver-class-name: com.mysql.jdbc.Driver

+ 4 - 0
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -11,6 +11,7 @@ import cn.com.ctop.kuaishou.modules.report.mapper.EtlKuaishouAccountMaterialRepo
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyImageService;
 import cn.com.ctop.oa.modules.service.IAppchatCreateService;
 import cn.com.ctop.oa.modules.service.IWechatNoListService;
+import cn.com.ctop.oa.modules.service.IWechatUserListService;
 import cn.com.ctop.toutiao.modules.link.service.IETLReportBytedanceVideoService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceCampaignService;
@@ -51,10 +52,13 @@ public class SampleTest {
     private RedisUtil redisUtil;
     @Autowired
     private IAppchatCreateService appchatCreateService;
+    @Autowired
+    private IWechatUserListService wechatUserInfoService;
 
 
     @Test
     public void loadKuaishouCookie() throws ParseException {
+        wechatUserInfoService.getUserList();
 
         // appchatCreateService.createAppChat(null, null, null);
         appchatCreateService.getChatInfo(null);

+ 7 - 1
module-common/src/main/java/cn/com/ctop/common/module/entity/MaterialInfo.java

@@ -14,6 +14,7 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -29,7 +30,7 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 @ApiModel(value = "ctop_material_info对象", description = "素材信息")
-public class MaterialInfo {
+public class MaterialInfo implements Serializable {
 
     /**
      * id
@@ -38,6 +39,11 @@ public class MaterialInfo {
     @ApiModelProperty(value = "id")
     private String id;
     /**
+     * 存放id的数组
+     */
+    @TableField(exist = false)
+    private String[] ids;
+    /**
      * code
      */
     @Excel(name = "code", width = 15)

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

@@ -13,4 +13,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface ICtopCorpWexinUserService extends IService<CtopCorpWexinUser> {
 
     String getEmailByUserId(String userId);
+
+    CtopCorpWexinUser getInfoByUserId(String userId);
 }

+ 11 - 2
module-common/src/main/java/cn/com/ctop/common/module/service/impl/CtopCorpWexinUserServiceImpl.java

@@ -3,12 +3,12 @@ package cn.com.ctop.common.module.service.impl;
 import cn.com.ctop.common.module.entity.CtopCorpWexinUser;
 import cn.com.ctop.common.module.mapper.CtopCorpWexinUserMapper;
 import cn.com.ctop.common.module.service.ICtopCorpWexinUserService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
 /**
  * 企业微信用户表
  *
@@ -27,4 +27,13 @@ public class CtopCorpWexinUserServiceImpl extends ServiceImpl<CtopCorpWexinUserM
     public String getEmailByUserId(String userId) {
         return ctopCorpWexinUserMapper.queryEmailByUserId(userId);
     }
+
+    @Override
+    public CtopCorpWexinUser getInfoByUserId(String userId) {
+        QueryWrapper<CtopCorpWexinUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("wexin_id", userId);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        return this.getOne(queryWrapper);
+    }
 }

+ 1 - 0
module-common/src/main/java/cn/com/ctop/common/module/service/impl/FileInfoServiceImpl.java

@@ -73,6 +73,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
                 Integer code = jsonObject.getInteger("code");
                 if (code == 0) {
                     log.info("头条上传素材成功,返回信息:{},accountId:{}", jsonObject, accountId);
+                    //TODO 信息返回之后同步入库
                 } else {
                     log.error("头条上传素材失败,返回信息:{},accountId:{}", jsonObject, accountId);
                     UserAllocation allocation = userAllocationService.getByAccountId(Long.valueOf(accountId));

+ 24 - 9
module-common/src/main/java/cn/com/ctop/common/module/service/impl/MaterialInfoServiceImpl.java

@@ -3,9 +3,13 @@ package cn.com.ctop.common.module.service.impl;
 import cn.com.ctop.common.module.constant.CosConstant;
 import cn.com.ctop.common.module.entity.*;
 import cn.com.ctop.common.module.enums.MaterialSupplierEnum;
-import cn.com.ctop.common.module.mapper.*;
+import cn.com.ctop.common.module.mapper.MaterialAscriptionMapper;
+import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
+import cn.com.ctop.common.module.mapper.MaterialParameterMapper;
+import cn.com.ctop.common.module.mapper.MaterialTagMapper;
 import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.*;
+import cn.com.ctop.common.module.vo.ResFileDTO;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -23,10 +27,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLDecoder;
@@ -77,7 +78,23 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     public void watermarkVideo(String materialId, Long videoWatermarkTemplateId, String userId) {
         TencentWatermarkTemplate tentcentWatermarkTemplate = tencentWatermarkTemplateService.getById(videoWatermarkTemplateId);
         MaterialInfo materialInfo = this.getById(materialId);
-        String path = URLDecoder.decode(materialInfo.getUrl().substring(materialInfo.getUrl().indexOf("/", 10) + 1, materialInfo.getUrl().length()));
+        if (Check.isNull(materialInfo)) {
+            return;
+        }
+        if (Check.isNull(materialInfo.getUrl())) {
+            return;
+        }
+        String fileUrl = "";
+        InputStream imageStream = LoadFileUtil.getFileStream(materialInfo.getUrl());
+        if (!Check.isNull(imageStream)) {
+            long time = System.currentTimeMillis();
+            ResFileDTO file = CosUtils.uploadDetailInputStreamV2(imageStream, time + ".mp4", "mp4", 0L, "temp/");
+            fileUrl = file.getFileUrl();
+        }
+        if (Check.isNull(fileUrl)) {
+            return;
+        }
+        String path = URLDecoder.decode(fileUrl.substring(fileUrl.indexOf("/", 10) + 1, fileUrl.length()));
         String taskId = videoWatermarkHandle(path, tentcentWatermarkTemplate.getTemplateId());
         DescribeTaskDetailResponse taskDetailResponse = null;
         for (int i = 0; i < 30; i++) {
@@ -470,8 +487,6 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
     }
 
 
-
-
     @Autowired
     private IMaterialImageInfoService materialImageInfoService;
     @Autowired
@@ -559,7 +574,7 @@ public class MaterialInfoServiceImpl extends ServiceImpl<MaterialInfoMapper, Mat
                 MaterialAscription materialAscription = new MaterialAscription();
                 materialAscription.setMaterialId(info.getCode());
                 String clipId = ascription.getString("clipId");
-                if(null!=clipId&&!"".equals(clipId.trim())){
+                if (null != clipId && !"".equals(clipId.trim())) {
                     materialAscription.setClipId(clipId);
                 }
                 materialAscription.setShotId(ascription.getString("shotId"));

+ 4 - 4
module-common/src/main/java/cn/com/ctop/common/module/utils/CorpWexinUtils.java

@@ -20,11 +20,11 @@ public class CorpWexinUtils {
 
     public static void initService() {
         val configStorage = new WxCpDefaultConfigImpl();
-        configStorage.setCorpId("wwef2e51064c0ac897");
+        configStorage.setCorpId("ww24b8a47826f5875f");
         configStorage.setAgentId(1000002);
-        configStorage.setCorpSecret("ieoVDAIurCOMdLrvktyQNCqWvTPqdphmXSFdk57NZ1k");
-/*        configStorage.setToken("hcst2019");
-        configStorage.setAesKey("hcst2019");*/
+        configStorage.setCorpSecret("MJIlySADGPlgvADnkFQPUpfZD4yV-4WN6066OgNnb0s");
+        configStorage.setToken("hcst2019");
+        configStorage.setAesKey("hcst2019");
         wxCpService = new WxCpServiceImpl();
         wxCpService.setWxCpConfigStorage(configStorage);
     }

+ 34 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/BytedanceVideoETLReportReloadJob.java

@@ -0,0 +1,34 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.toutiao.modules.link.entity.ETLReportBytedanceVideo;
+import cn.com.ctop.toutiao.modules.material.service.IEtlBytedanceVideoInfoService;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 头条视频报表etl剪辑员信息二次再刷新
+ * @author 黄学超
+ */
+public class BytedanceVideoETLReportReloadJob {
+    static ExecutorService executorService = Executors.newFixedThreadPool(5);
+    @Autowired
+    private IEtlBytedanceVideoInfoService iEtlBytedanceVideoInfoService;
+
+    @XxlJob("bytedanceETLReportData")
+    public void execute() throws Exception {
+        //查询素材归属表所有的信息md5,clip_id,clip_name,shot_id,shot_name,plan_id,plan_name
+        List<ETLReportBytedanceVideo> etlReportBytedanceVideoList = iEtlBytedanceVideoInfoService.selectAllETLReportBytedanceVideo();
+        if (null == etlReportBytedanceVideoList || etlReportBytedanceVideoList.isEmpty()) {
+            XxlJobHelper.log("定时获取头条报表数据异常:未获取到素材归属信息");
+            XxlJobHelper.handleFail();
+            return ;
+        }
+        //动态sql更新md5,clip_id,clip_name,shot_id,shot_name,plan_id,plan_name不为空的数据
+        etlReportBytedanceVideoList.forEach(etlReportBytedanceVideo -> executorService.submit(() -> iEtlBytedanceVideoInfoService.updateETLReportNameIsNull(etlReportBytedanceVideo)));
+    }
+}

+ 20 - 0
module-job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/SendHourlyMessageJob.java

@@ -0,0 +1,20 @@
+package cn.com.ctop.job.bytedance.handler;
+
+import cn.com.ctop.oa.modules.service.IAppchatCreateService;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SendHourlyMessageJob {
+    @Autowired
+    private IAppchatCreateService appchatCreateService;
+
+    /**
+     *
+     **/
+    @XxlJob("sendHourlyMessageJob")
+    public void execute() {
+        appchatCreateService.getChatInfo("wrSHhWEAAAhWApP92IL0nAuA9pQZ1W7w");
+    }
+}

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

@@ -47,9 +47,9 @@ spring:
   autoconfigure:
     exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
   datasource:
-    url: jdbc:mysql://127.0.0.1:3306/jiaoyang?characterEncoding=UTF-8&useUnicode=true&useSSL=false
+    url: jdbc:mysql://172.30.0.4:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
     username: hcst
-    password: test@20190531
+    password: hcst@2020
     driver-class-name: com.mysql.jdbc.Driver
     druid:
       stat-view-servlet:
@@ -86,7 +86,7 @@ spring:
         connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
       datasource:
         master:
-          url: jdbc:mysql://172.30.0.4:4000/jiaoyang?characterEncoding=UTF-8&useUnicode=true&allowMultiQueries=true&useSSL=false
+          url: jdbc:mysql://172.30.0.4:4000/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false
           username: hcst
           password: hcst@2020
           driver-class-name: com.mysql.jdbc.Driver

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

@@ -48,6 +48,12 @@ public class AiKuaishouCreateCreativeController {
             if (Check.isNull(strategy)) {
                 throw new Exception("根据id获取详细信息为空");
             }
+            Boolean unitOverrun = createCreativeService.getUnitOverrun(strategy.getAccountId());
+            if (unitOverrun) {
+                log.error("组创建超限,accountId:{}", strategy.getAccountId());
+                throw new Exception("今日组创建已超限");
+            }
+
             executorService.submit(() ->
                     createCreativeService.customCreativeLimit(strategy)
             );
@@ -79,6 +85,11 @@ public class AiKuaishouCreateCreativeController {
             if (Check.isNull(strategy)) {
                 throw new Exception("根据id获取详细信息为空");
             }
+            Boolean unitOverrun = createCreativeService.getUnitOverrun(strategy.getAccountId());
+            if (unitOverrun) {
+                log.error("组创建超限,accountId:{}", strategy.getAccountId());
+                throw new Exception("今日组创建已超限");
+            }
             if (Check.isNull(hour)) {
                 throw new Exception("小时数据为空");
             }
@@ -121,6 +132,11 @@ public class AiKuaishouCreateCreativeController {
             if (Check.isNull(strategy)) {
                 throw new Exception("根据id获取详细信息为空");
             }
+            Boolean unitOverrun = createCreativeService.getUnitOverrun(strategy.getAccountId());
+            if (unitOverrun) {
+                log.error("组创建超限,accountId:{}", strategy.getAccountId());
+                throw new Exception("今日组创建已超限");
+            }
             if (Check.isNull(videoCnt)) {
                 throw new Exception("视频数量不能为空");
             }
@@ -156,6 +172,11 @@ public class AiKuaishouCreateCreativeController {
             if (Check.isNull(strategy)) {
                 throw new Exception("根据id获取详细信息为空");
             }
+            Boolean unitOverrun = createCreativeService.getUnitOverrun(strategy.getAccountId());
+            if (unitOverrun) {
+                log.error("组创建超限,accountId:{}", strategy.getAccountId());
+                throw new Exception("今日组创建已超限");
+            }
             if (Check.isNull(videoCnt)) {
                 throw new Exception("视频数量不能为空");
             }

+ 5 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaishouCreateCreativeService.java

@@ -7,9 +7,12 @@ import java.text.ParseException;
 public interface IAiKuaishouCreateCreativeService {
     Long autoCreateCreative(AiKuaishouAdvertiserStrategy strategy, Integer createType, Long videoCnt);
 
-    void autoCreateProgramCreative(AiKuaishouAdvertiserStrategy strategy,Integer createType,Long videoCnt);
+    void autoCreateProgramCreative(AiKuaishouAdvertiserStrategy strategy, Integer createType, Long videoCnt);
 
-    void customCreativeSupplement(AiKuaishouAdvertiserStrategy strategy,Integer hour) throws ParseException;
+    void customCreativeSupplement(AiKuaishouAdvertiserStrategy strategy, Integer hour) throws ParseException;
 
     void customCreativeLimit(AiKuaishouAdvertiserStrategy strategy);
+
+    // 组创建是否超限
+    Boolean getUnitOverrun(Long accountId);
 }

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

@@ -13,7 +13,6 @@ public interface IKuaishouAccountCreativeOverrunInfoService extends IService<Kua
 
     void stopCreativeBySignature(Long accountId,String signature);
 
-
     void updateOverrunInfo(Long advertiserId);
 
     KuaishouAccountCreativeOverrunInfo getByParams(Long accountId, String date);

+ 74 - 17
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaishouCreateCreativeServiceImpl.java

@@ -96,10 +96,11 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
         if (null != singleAppid && singleAppid == 0) {
             //多应用
             JSONArray appIdArray = JSONArray.parseArray(strategy.getAppIdArray());
-            String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
             if (strategy.getMultipleBids() == 0) { // 非多应用多出价
                 if (null != appIdArray && !appIdArray.isEmpty()) {
                     for (int i = 0; i < appIdArray.size(); i++) {
+                        String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
+
                         AiKuaiShouAppInfo appInfo = appInfoService.getByParams(strategy.getAccountId(), appIdArray.getLong(i));
                         if (null == appInfo) {
                             log.info("账户:{},appid({}) 数据不存在", accountId, appIdArray.getLong(i));
@@ -118,6 +119,12 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                         }
                         Long newCampaignId = getCampaignId(strategy, token, replaceString, "ALL_CAMPAIGN", createType, appInfo.getAppId(), strategyUuid);
                         for (KuaiShouVideoGet videoItem : allVideos) {
+                            Boolean unitOverrun = getUnitOverrun(accountId);
+                            if (unitOverrun) {
+                                log.error("组创建超限,accountId:{}", accountId);
+                                return 0L;
+                            }
+
                             KuaishouAccountCreativeOverrunInfo overrunInfo = overrunInfoService.getByParams(accountId, DateUtils.formatDate(new Date()));
                             if (null != overrunInfo) {
                                 log.info("该账户创意创建已超限=>accountId:{}", accountId);
@@ -166,6 +173,7 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                     }
                 }
             } else if (strategy.getMultipleBids() == 1) { //  多应用多出价
+                String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
                 List<KuaiShouVideoGet> allVideos = getVideosByParams(strategy, startTime, endTime, null, createType, videoCnt);
                 if (Check.isNull(allVideos)) {
                     return videoCnt;
@@ -178,6 +186,13 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                         continue;
                     }
                     for (int i = 0; i < appIdArray.size(); i++) {
+
+                        Boolean unitOverrun = getUnitOverrun(accountId);
+                        if (unitOverrun) {
+                            log.error("组创建超限,accountId:{}", accountId);
+                            return 0L;
+                        }
+
                         Long appId = appIdArray.getLong(i);
                         if (Check.isNull(appId)) {
                             continue;
@@ -259,6 +274,13 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
             }
             //3、在“上新”计划中新增广告组,一个素材搭配n张封面,组成一个广告组
             for (KuaiShouVideoGet videoItem : newVideos) {
+
+                Boolean unitOverrun = getUnitOverrun(accountId);
+                if (unitOverrun) {
+                    log.error("组创建超限,accountId:{}", accountId);
+                    return 0L;
+                }
+
                 KuaishouAccountCreativeOverrunInfo overrunInfo = overrunInfoService.getByParams(accountId, DateUtils.formatDate(new Date()));
                 if (null != overrunInfo) {
                     return 0L;
@@ -351,7 +373,6 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
         String key = token.getAccountId() + "_ProgramCreative" + "_" + nowDate;
         JSONArray appIdArray = JSON.parseArray(strategy.getAppIdArray());
         if (null != singleAppid && singleAppid == 0) {
-            String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
             if (strategy.getMultipleBids() == 0) { //  非多应用多出价
                 //多应用
                 if (null != appIdArray && !appIdArray.isEmpty()) {
@@ -361,6 +382,8 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                             log.info("账户:{},appid({}) 数据不存在", accountId, appIdArray.getLong(i));
                             continue;
                         }
+                        String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
+
                         //判定是否通用监测链接
                         if (null != strategy.getGeneralTrack() && strategy.getGeneralTrack() == 0) {
                             strategy.setClickTrackUrl(appInfo.getTrackUrl());
@@ -372,6 +395,12 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                         if (null == allVideos || allVideos.isEmpty()) {
                             return;
                         }
+                        Boolean unitOverrun = getUnitOverrun(accountId);
+                        if (unitOverrun) {
+                            log.error("组创建超限,accountId:{}", accountId);
+                            return;
+                        }
+
                         //判定创意创建是否超限
                         KuaishouAccountCreativeOverrunInfo overrunInfo = overrunInfoService.getByParams(accountId, DateUtils.formatDate(new Date()));
                         if (null != overrunInfo) {
@@ -427,6 +456,7 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                 if (Check.isNull(allVideos)) {
                     return;
                 }
+                String replaceString = KuaishouCreativeMatTypeEnum.getNameByType(strategy.getUnitType().toString() + createType.toString());
                 List<List<KuaiShouVideoGet>> splitVideos = Lists.partition(allVideos, 1);
                 for (int j = 1; j < splitVideos.size() + 1; j++) {
                     List<KuaiShouVideoGet> kuaiShouVideoGets = splitVideos.get(j);
@@ -435,6 +465,12 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                     }
                     for (KuaiShouVideoGet videoGet : kuaiShouVideoGets) {
                         for (int i = 0; i < appIdArray.size(); i++) {
+                            Boolean unitOverrun = getUnitOverrun(accountId);
+                            if (unitOverrun) {
+                                log.error("组创建超限,accountId:{}", accountId);
+                                return;
+                            }
+
                             Object redisObj = redisUtil.get(key);
                             if (!Check.isNull(redisObj)) {
                                 Integer value = (Integer) redisObj;
@@ -520,6 +556,12 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
             //创意
             List<List<KuaiShouVideoGet>> splitVideos = Lists.partition(allVideos, 5);
             for (int j = 1; j < splitVideos.size() + 1; j++) {
+                Boolean unitOverrun = getUnitOverrun(accountId);
+                if (unitOverrun) {
+                    log.error("组创建超限,accountId:{}", accountId);
+                    return;
+                }
+
                 Object redisObj = redisUtil.get(key);
                 if (!Check.isNull(redisObj)) {
                     Integer value = (Integer) redisObj;
@@ -635,16 +677,11 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
             return;
         }
         Integer code = resultJson.getInteger("code");
-
-
         String message = resultJson.getString("message");
-
         Long unitId = creativeParams.getLong("unit_id");
         if (code == 0) {
             createLandPageAndUnit(creativeParams, resultJson.getJSONObject("data"));
-
             log.info("创建程序化创意成功,accountId:{},unit:{}", token.getAccountId(), unitId);
-
         } else {
             log.error("快手创建程序化创意失败,accountId:{},unitId:{},返回信息:{}", token.getAccountId(), unitId, message);
             if (code == 400001 && "/rest/openapi/v2/creative/advanced/program/create调用已超日限,次日可恢复调用".equals(message)) {
@@ -653,10 +690,7 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                 redisUtil.set(key, 1, 100000L);
                 updateService.updateUnitStatus(token.getAccessToken(), token.getAccountId(), unitId, 3, "e9ca23d68d884d4ebb19d07889727dae");
             }
-
-
         }
-
     }
 
     //绑定落地页与广告组、创意的关系
@@ -1095,14 +1129,17 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
                 targetJsonObject.put("filter_converted_level", strategy.getFilterConvertedLevel());
             }
         }
-        JSONArray appInterest = JSONArray.parseArray(strategy.getAppInterest());
-        if (!Check.isNull(appInterest)) {
-            targetJsonObject.put("app_interest", appInterest);
-        }
+
         // APP行为-按APP名称
-        JSONArray appIds = JSONArray.parseArray(strategy.getAppIds());
-        if (!Check.isNull(appIds)) {
-            targetJsonObject.put("app_ids", appIds);
+        if (sceneId != 5) {
+            JSONArray appIds = JSONArray.parseArray(strategy.getAppIds());
+            if (!Check.isNull(appIds)) {
+                targetJsonObject.put("app_ids", appIds);
+            }
+            JSONArray appInterest = JSONArray.parseArray(strategy.getAppInterest());
+            if (!Check.isNull(appInterest)) {
+                targetJsonObject.put("app_interest", appInterest);
+            }
         }
         // 人群包定向
         JSONArray populationString = JSONArray.parseArray(strategy.getPopulation());
@@ -1425,6 +1462,8 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
             updateService.updateUnitStatus(token.getAccessToken(), token.getAccountId(), unitId, 3, "e9ca23d68d884d4ebb19d07889727dae");
         } else if (creativeCode == -1 && creativeMessage.contains("超过可关联的有效创意的上限")) {
             updateService.updateUnitStatus(token.getAccessToken(), token.getAccountId(), unitId, 3, "e9ca23d68d884d4ebb19d07889727dae");
+        } else if (creativeCode == -1 && creativeMessage.contains("视频不存在")) {
+            updateService.updateUnitStatus(token.getAccessToken(), token.getAccountId(), unitId, 3, "e9ca23d68d884d4ebb19d07889727dae");
         }
 
         AiKuaishouCreativeLevelOperationRecord record = new AiKuaishouCreativeLevelOperationRecord();
@@ -1432,6 +1471,7 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
         record.setCreativeName(creativeName);
         record.setStatus(creativeCode);
         record.setDescription(creativeParams.getString("description"));
+        record.setPhotoId(creativeParams.getString("photo_id"));
         record.setMessage(creativeMessage);
         record.setUnitId(unitId);
         record.setAiStrategyUuid(uuid);
@@ -1562,4 +1602,21 @@ public class AiKuaishouCreateCreativeServiceImpl implements IAiKuaishouCreateCre
     }
 
 
+    @Override
+    public Boolean getUnitOverrun(Long accountId) {
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String key = accountId + "_" + nowDate + "unit_create_overrun";
+        Object redisObj = redisUtil.get(key);
+        if (Check.isNull(redisObj)) {
+            return false;
+        }
+        Integer value = (Integer) redisObj;
+        if (value == 1) {
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
 }

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

@@ -503,10 +503,10 @@ public class KuaiShouGroupTemplateServiceImpl extends ServiceImpl<KuaiShouGroupT
             target.put("paid_audience", JSONArray.parseArray(templateTarget.getPaidAudience()));
         }
         //-------------兴趣行为定向
-        JSONObject behaviorInterest = new JSONObject();
+    /*    JSONObject behaviorInterest = new JSONObject();
         JSONObject behavior = new JSONObject();
-        JSONObject interest = new JSONObject();
-        if (!Check.isNull(templateTarget.getKeyword())) {
+        JSONObject interest = new JSONObject();*/
+ /*       if (!Check.isNull(templateTarget.getKeyword())) {
             behavior.put("keyword", JSONArray.parseArray(templateTarget.getKeyword()));
         }
         if (!Check.isNull(templateTarget.getLabel())) {
@@ -532,7 +532,7 @@ public class KuaiShouGroupTemplateServiceImpl extends ServiceImpl<KuaiShouGroupT
         }
         if (!Check.isNull(behaviorInterest)) {
             target.put("behavior_interest", behaviorInterest);
-        }
+        }*/
         returnJson.put("target", target);
         returnJson.put("code", 0);
         return returnJson;

+ 20 - 64
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java

@@ -7,67 +7,18 @@ import cn.com.ctop.common.module.enums.MaterialEnum;
 import cn.com.ctop.common.module.service.IMaterialCutFrameService;
 import cn.com.ctop.common.module.service.IOauthConfigService;
 import cn.com.ctop.common.module.service.IUserAllocationService;
-import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.CtopAdConstant;
-import cn.com.ctop.common.module.utils.HttpUtils;
-import cn.com.ctop.common.module.utils.JsonUtil;
-import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
-import cn.com.ctop.common.module.utils.PropertiesUtils;
-import cn.com.ctop.kuaishou.modules.ai.service.IAiCreativeLimitService;
-import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouAccountCreativeOverrunInfoService;
-import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouAppPackageService;
-import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouDirectionalPackageService;
-import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouLandpagePackageService;
-import cn.com.ctop.kuaishou.modules.ai.service.IKuaishouPopulationGroupService;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouAdvertiserBaseInfo;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouAppList;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCampaign;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouCreative;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouDailyFlows;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouGroup;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouImageGet;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouRegionListChildren;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouRegionListParent;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouTargetingTags;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouPopulation;
+import cn.com.ctop.common.module.utils.*;
+import cn.com.ctop.kuaishou.modules.ai.service.*;
+import cn.com.ctop.kuaishou.modules.batch.entity.*;
 import cn.com.ctop.kuaishou.modules.batch.entity.vo.ConvertVo;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouAdvertiserBaseInfoMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouAppListMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouGroupMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouRegionListChildrenMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouRegionListParentMapper;
-import cn.com.ctop.kuaishou.modules.batch.mapper.KuaiShouTargetingTagsMapper;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCampaignService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouCreativeService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouDailyFlowsService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouGroupService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouImageGetService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouOverRunSendMessageService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouVideoGetService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouPopulationService;
-import cn.com.ctop.kuaishou.modules.batch.service.IWarningOperationService;
+import cn.com.ctop.kuaishou.modules.batch.mapper.*;
+import cn.com.ctop.kuaishou.modules.batch.service.*;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResult;
 import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyAccount;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyCampaign;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyCreative;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportDailyCreativeStatistic;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyAccount;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCampaign;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreative;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyCreativeStatistic;
-import cn.com.ctop.kuaishou.modules.report.entity.KuaishouReportHourlyGroup;
+import cn.com.ctop.kuaishou.modules.report.entity.*;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyAccountMapper;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouReportDailyCampaignMapper;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyCampaignService;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyCreativeService;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyAccountService;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyCampaignService;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyCreativeService;
-import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportHourlyGroupService;
+import cn.com.ctop.kuaishou.modules.report.service.*;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -84,6 +35,7 @@ import lombok.var;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.ParseException;
 import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.RedisUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.http.HttpEntity;
@@ -101,11 +53,7 @@ import java.io.IOException;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -939,6 +887,9 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
      */
 
 
+    @Autowired
+    private RedisUtil redisUtil;
+
     @Override
     public Map<String, Object> adUnitCreate(String accessToken, Long advertiserId, JSONObject requestJson, Integer count) {
         Map<String, Object> returnMap = new HashMap<>();
@@ -1004,7 +955,12 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                     }
 
                 } else {
+                    if (code == 400001 && resultJson.getString("message").equals("/rest/openapi/v2/ad_unit/create调用已超日限,次日可恢复调用")) {
+                        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+                        String key = advertiserId + "_" + nowDate + "unit_create_overrun";
+                        redisUtil.set(key, 1, 60 * 60 * 24);
 
+                    }
                     if (code == 500000 && count <= 4) {
                         adUnitCreate(accessToken, advertiserId, requestJson, count + 1);
                     }
@@ -2039,7 +1995,9 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
                     if (code == 401000 && resultJson.getString("message").contains("超过可关联的有效创意的上限")) {
                         creativeLimitService.replaceSava(advertiserId, requestJson.getLong("photo_id"));
                     }
-
+                    if (code == 401000 && resultJson.getString("message").contains("视频不存在")) {
+                        creativeLimitService.replaceSava(advertiserId, requestJson.getLong("photo_id"));
+                    }
                     log.error("创建广告创意失败,advertiser_id:{},返回信息:{},入参:{}", advertiserId, resultJson, requestJson, count + 1);
                     returnMap.put("code", -1);
                     returnMap.put("message", resultJson.getString("message"));
@@ -2762,8 +2720,6 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
     }
 
 
-
-
     /**
      * 获取定向标签
      *

+ 6 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportDailyAccount.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.kuaishou.modules.report.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -176,6 +177,11 @@ public class KuaishouReportDailyAccount implements Serializable {
 
     @JsonProperty("play_3s_ratio")
     private Double play3sRatio;
+    @JsonProperty("play_5s_ratio")
+    @TableField("play_5s_ratio")
+    private Double play5sRatio;
+    @JsonProperty("play_end_ratio")
+    private Double playEndRatio;
     @JsonProperty("event_app_invoked")
     private Long eventAppInvoked;
 

+ 6 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportHourlyAccount.java

@@ -108,6 +108,12 @@ public class KuaishouReportHourlyAccount implements Serializable {
     @TableField("play_3s_ratio")
     private BigDecimal play3sRatio;
 
+    @JsonProperty("play_5s_ratio")
+    @TableField("play_5s_ratio")
+    private Double play5sRatio;
+     @JsonProperty("play_end_ratio")
+    private Double playEndRatio;
+
     @JsonProperty
     private Long share;
     @JsonProperty

+ 30 - 28
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/EtlKuaishouAccountMaterialReportDailyMapper.xml

@@ -108,36 +108,38 @@
         play_3s_count)
         values
         <foreach collection="records" item="record" separator=",">
-            (#{record.companyId} ,
-            #{record.companyName} ,
-            #{record.projectId} ,
-            #{record.projectName} ,
-            #{record.accountId} ,
-            #{record.signature} ,
-            #{record.charge} ,
-            #{record.photoShow} ,
-            #{record.aclick} ,
-            #{record.bclick} ,
+            (
+            #{record.companyId},
+            #{record.companyName},
+            #{record.projectId},
+            #{record.projectName},
+            #{record.accountId},
+            #{record.signature},
+            #{record.charge},
+            #{record.photoShow},
+            #{record.aclick},
+            #{record.bclick},
             #{record.downloadStarted} ,
             #{record.downloadCompleted} ,
-            #{record.activation} ,
-            #{record.submit} ,
-            #{record.statDate} ,
-            #{record.photoClick} ,
-            #{record.eventPayFirstDay} ,
-            #{record.eventPayPurchaseAmountFirstDay} ,
-            #{record.eventPay} ,
-            #{record.eventPayPurchaseAmount} ,
-            #{record.eventRegister} ,
-            #{record.eventJinJianApp} ,
-            #{record.eventCreditGrantApp} ,
-            #{record.eventOrderPaid} ,
-            #{record.eventOrderPaidPurchaseAmount} ,
-            #{record.eventJinJianLandingPage} ,
+            #{record.activation},
+            #{record.submit},
+            #{record.statDate},
+            #{record.photoClick},
+            #{record.eventPayFirstDay},
+            #{record.eventPayPurchaseAmountFirstDay},
+            #{record.eventPay},
+            #{record.eventPayPurchaseAmount},
+            #{record.eventRegister},
+            #{record.eventJinJianApp},
+            #{record.eventCreditGrantApp},
+            #{record.eventOrderPaid},
+            #{record.eventOrderPaidPurchaseAmount},
+            #{record.eventJinJianLandingPage},
             #{record.eventCreditGrantLandingPage} ,
-            #{record.eventNextDayStay} ,
-            #{record.formCount} ,
-            #{record.play3sCount})
+            #{record.eventNextDayStay},
+            #{record.formCount},
+            #{record.play3sCount}
+            )
         </foreach>
     </insert>
     <select id="etlKuaishouAccountMaterialReportDailyList"
@@ -157,7 +159,7 @@
     sum(m.download_completed)as download_completed,
     sum(m.activation)as activation ,
     sum(m.submit)as submit,
-    date_format(m.stat_date,'%Y-%m-%d') as stat_date,
+    date_format(m.stat_date,'%Y-%m-%d')as stat_date,
     sum(m.photo_click)as photo_click,
     sum(m.event_pay_first_day)as event_pay_first_day,
     sum(m.event_pay_purchase_amount_first_day)as event_pay_purchase_amount_first_day,

+ 8 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportDailyAccountMapper.xml

@@ -139,6 +139,8 @@
         form_cost,
         form_count,
         play_3s_ratio,
+        play_5s_ratio,
+        play_end_ratio,
         event_app_invoked,
         event_new_user_pay,
         event_new_user_pay_cost,
@@ -201,6 +203,8 @@
             #{add.formCost},
             #{add.formCount},
             #{add.play3sRatio},
+            #{add.play5sRatio},
+            #{add.playEndRatio},
             #{add.eventAppInvoked},
             #{add.eventNewUserPay},
             #{add.eventNewUserPayCost},
@@ -267,6 +271,8 @@
         form_cost,
         form_count,
         play_3s_ratio,
+        play_5s_ratio,
+        play_end_ratio,
         event_app_invoked,
         event_new_user_pay,
         event_new_user_pay_cost,
@@ -330,6 +336,8 @@
             #{add.formCost},
             #{add.formCount},
             #{add.play3sRatio},
+            #{add.play5sRatio},
+            #{add.playEndRatio},
             #{add.eventAppInvoked},
             #{add.eventNewUserPay},
             #{add.eventNewUserPayCost},

+ 4 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportHourlyAccountMapper.xml

@@ -54,6 +54,8 @@
         form_cost,
         form_count,
         play_3s_ratio,
+        play_5s_ratio,
+        play_end_ratio,
         event_app_invoked,
         event_new_user_pay,
         event_new_user_pay_cost,
@@ -113,6 +115,8 @@
             #{add.formCost},
             #{add.formCount},
             #{add.play3sRatio},
+            #{add.play5sRatio},
+            #{add.playEndRatio},
             #{add.eventAppInvoked},
             #{add.eventNewUserPay},
             #{add.eventNewUserPayCost},

+ 11 - 8
module-kuaishou/src/main/resources/kuaishou_config.properties

@@ -1,9 +1,12 @@
 kuaishou_api_url=https://ad.e.kuaishou.com
 kuaishou_auth_url=https://ad.e.kuaishou.com
-kuaishou_appid=328
+kuaishou_appid=27
+kuaishou_third_appid=328
 oauth_type=agent
-kuaishou_secret=1iFTBiMdohkyEQQs
-kuaishou_callback_url=http://callback.shyouteng.com.cn/kuaishou
+kuaishou_secret=QovprB1tNhXptgDc
+kuaishou_third_secret=1iFTBiMdohkyEQQs
+kuaishou_callback_url=http://adsp.c-top.com.cn:8080/jeecg-boot/kuaishou
+kuaishou_third_callback_url=http://callback.shyouteng.com.cn/kuaishou
 apk_sava_path=/mnt/file/apk
 image_sava_path=/mnt/file/image
 video_sava_path=/mnt/file/video
@@ -15,7 +18,7 @@ model_video_fill_path=/mnt/data/fill/
 model_video_final_path=/mnt/data/final/
 
 
-## jiaoyang
+# jiaoyang
 #kuaishou_api_url=https://ad.e.kuaishou.com
 #kuaishou_auth_url=https://ad.e.kuaishou.com
 #kuaishou_appid=328
@@ -25,9 +28,9 @@ model_video_final_path=/mnt/data/final/
 #apk_sava_path=/mnt/file/apk
 #image_sava_path=/mnt/file/image
 #video_sava_path=/mnt/file/video
-### 模板视频存放路径
+## 模板视频存放路径
 #model_video_src_path=/mnt/data/src/
-### 片段合成视频存放路径
+## 片段合成视频存放路径
 #model_video_fill_path=/mnt/data/fill/
-###
-#model_video_final_path=/mnt/data/final/
+##
+#model_video_final_path=/mnt/data/final/

+ 1 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/constant/QYWxConstant.java

@@ -21,6 +21,7 @@ public class QYWxConstant {
     public static final String APP_ROVAL_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail";  //获取审批申请详情
     public static final String APPCHAT_CREATE = "https://qyapi.weixin.qq.com/cgi-bin/appchat/create";  //创建群聊
     public static final String APPCHAT_GET = "https://qyapi.weixin.qq.com/cgi-bin/appchat/get";  //创建群聊
+    public static final String APPCHAT_SEND = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send"; // 发送消息
 
     /**
      * 天津优容智汇 企业微信信息

+ 2 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/service/IWechatUserListService.java

@@ -17,5 +17,7 @@ public interface IWechatUserListService extends IService<WechatUserList> {
     void getYRUserList();
 
     List<WechatUserList> queryList(int dataType);
+
+    WechatUserList getInfoByUserId(String userId);
 }
 

+ 50 - 9
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/AppchatCreateServiceImpl.java

@@ -1,5 +1,8 @@
 package cn.com.ctop.oa.modules.service.impl;
 
+import cn.com.ctop.common.module.entity.CtopCorpWexinUser;
+import cn.com.ctop.common.module.service.ICtopCorpWexinUserService;
+import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.oa.modules.constant.QYWxConstant;
 import cn.com.ctop.oa.modules.service.IAppchatCreateService;
@@ -24,7 +27,8 @@ public class AppchatCreateServiceImpl implements IAppchatCreateService {
     private IWechatTokenService tokenService;
     @Autowired
     private IWechatUserListService userListService;
-
+    @Autowired
+    private ICtopCorpWexinUserService ctopCorpWexinUserService;
 
     @Override
     public void createAppChat(String name, String owner, JSONArray userlist) {
@@ -34,8 +38,6 @@ public class AppchatCreateServiceImpl implements IAppchatCreateService {
                 throw new Exception("获取token失败");
             }
             System.err.println(qywxAccessToken);
-
-
             JSONObject params = new JSONObject();
             params.put("name", "易车时报发送");
             params.put("owner", "qy01338f036d3ce902287758b529");
@@ -53,15 +55,54 @@ public class AppchatCreateServiceImpl implements IAppchatCreateService {
 
     @Override
     public void getChatInfo(String chatid) {
-
         Map<String, Object> qywxAccessToken = tokenService.getQYWXAccessToken();
-        System.err.println(qywxAccessToken);
-
         TreeMap params = new TreeMap();
-
-        params.put("chatid", "wrSHhWEAAAhWApP92IL0nAuA9pQZ1W7w");
+        params.put("chatid", chatid);
         params.put("access_token", qywxAccessToken.get(ACCESS_TOKEN));
         String resultStr = HttpUtils.httpGetRequest(QYWxConstant.APPCHAT_GET, null, params);
-        System.err.println(resultStr);
+        JSONObject jsonObject = JSONObject.parseObject(resultStr);
+        if (Check.isNull(jsonObject)) {
+            return;
+        }
+        Integer errcode = jsonObject.getInteger("errcode");
+        if (errcode != 0) {
+            log.error("获取群聊信息返回code失败");
+            return;
+        }
+        JSONObject chat_info = jsonObject.getJSONObject("chat_info");
+        if (Check.isNull(chat_info)) {
+            return;
+        }
+        JSONArray userlist = chat_info.getJSONArray("userlist");
+        if (Check.isNull(userlist)) {
+            return;
+        }
+        StringBuilder text = new StringBuilder();
+        text.append("请及时发送该时段易车时报!");
+        text.append("\n");
+        text.append("17点和22点必须提前10分钟准时发出!");
+        text.append("\n");
+        text.append("\n");
+        for (int i = 0; i < userlist.size(); i++) {
+            String userId = userlist.getString(i);
+            CtopCorpWexinUser userInfo = ctopCorpWexinUserService.getInfoByUserId(userId);
+            if (Check.isNull(userInfo)) {
+                continue;
+            }
+            if (userInfo.getWexinName().equals("于蒙蒙") || userInfo.getWexinName().equals("吴永前")) {
+                continue;
+            }
+            text.append("@" + userInfo.getWexinName() + "");
+        }
+        JSONObject postJson = new JSONObject();
+        postJson.put("chatid", chatid);
+        postJson.put("msgtype", "text");
+        JSONObject content = new JSONObject();
+        content.put("content", text);
+        postJson.put("text", content);
+        postJson.put("safe", 0);
+        String postStr = HttpUtils.httpPostRequestTest(QYWxConstant.APPCHAT_SEND + "?access_token=" + qywxAccessToken.get(ACCESS_TOKEN), postJson.toJSONString(), null);
+        log.info("定时发送消息返回结果:{}", postStr);
+
     }
 }

+ 10 - 0
module-oa/src/main/java/cn/com/ctop/oa/modules/service/impl/WechatUserListServiceImpl.java

@@ -11,6 +11,7 @@ import cn.com.ctop.oa.modules.service.IWechatTokenService;
 import cn.com.ctop.oa.modules.service.IWechatUserListService;
 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 com.xxl.job.core.enums.NoEn;
 import lombok.extern.slf4j.Slf4j;
@@ -138,4 +139,13 @@ public class WechatUserListServiceImpl extends ServiceImpl<WechatUserListMapper,
     public List<WechatUserList> queryList(int dataType) {
         return wechatUserListMapper.queryList(dataType);
     }
+
+    @Override
+    public WechatUserList getInfoByUserId(String userId) {
+        QueryWrapper<WechatUserList> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", userId);
+        queryWrapper.orderByDesc("create_time");
+        queryWrapper.last("limit 1");
+        return this.getOne(queryWrapper);
+    }
 }

+ 247 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/ByteDanceCreativeWordPackageController.java

@@ -0,0 +1,247 @@
+package cn.com.ctop.toutiao.modules.material.controller;
+
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreativeWordPackage;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeWordPackageService;
+import org.jeecg.common.api.vo.Result;
+import cn.com.ctop.common.module.utils.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+
+
+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.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 创意动态词包信息
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2021-05-19
+ */
+@Slf4j
+@Api(tags = "创意动态词包信息")
+@RestController
+@RequestMapping("/ctop/ByteDanceCreativeWordPackage")
+public class ByteDanceCreativeWordPackageController {
+    @Autowired
+    private IByteDanceCreativeWordPackageService ByteDanceCreativeWordPackageService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param ByteDanceCreativeWordPackage
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "创意动态词包信息-分页列表查询", notes = "创意动态词包信息-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<ByteDanceCreativeWordPackage>> queryPageList(ByteDanceCreativeWordPackage ByteDanceCreativeWordPackage,
+                                                                     @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                                     @RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize,
+                                                                     HttpServletRequest req) {
+        Result<IPage<ByteDanceCreativeWordPackage>> result = new Result<>();
+        QueryWrapper<ByteDanceCreativeWordPackage> queryWrapper = QueryGenerator.initQueryWrapper(ByteDanceCreativeWordPackage, req.getParameterMap());
+        Page<ByteDanceCreativeWordPackage> page = new Page<ByteDanceCreativeWordPackage>(pageNo, pageSize);
+        IPage<ByteDanceCreativeWordPackage> pageList = ByteDanceCreativeWordPackageService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     *
+     * @param ByteDanceCreativeWordPackage
+     * @return
+     */
+    @ApiOperation(value = "创意动态词包信息-添加", notes = "创意动态词包信息-添加")
+    @PostMapping(value = "/add")
+    public Result<ByteDanceCreativeWordPackage> add(@RequestBody ByteDanceCreativeWordPackage ByteDanceCreativeWordPackage) {
+        Result<ByteDanceCreativeWordPackage> result = new Result<>();
+        try {
+            ByteDanceCreativeWordPackageService.save(ByteDanceCreativeWordPackage);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     *
+     * @param ByteDanceCreativeWordPackage
+     * @return
+     */
+    @ApiOperation(value = "创意动态词包信息-编辑", notes = "创意动态词包信息-编辑")
+    @PutMapping(value = "/edit")
+    public Result<ByteDanceCreativeWordPackage> edit(@RequestBody ByteDanceCreativeWordPackage ByteDanceCreativeWordPackage) {
+        Result<ByteDanceCreativeWordPackage> result = new Result<ByteDanceCreativeWordPackage>();
+        ByteDanceCreativeWordPackage ByteDanceCreativeWordPackageEntity = ByteDanceCreativeWordPackageService.getById(ByteDanceCreativeWordPackage.getId());
+        if (ByteDanceCreativeWordPackageEntity == null) {
+            result.error500("未找到对应实体");
+        } else {
+            boolean ok = ByteDanceCreativeWordPackageService.updateById(ByteDanceCreativeWordPackage);
+            if (ok) {
+                result.success("修改成功!");
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "创意动态词包信息-通过id删除", notes = "创意动态词包信息-通过id删除")
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id") String id) {
+        try {
+            ByteDanceCreativeWordPackageService.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<ByteDanceCreativeWordPackage> deleteBatch(@RequestParam(name = "ids") String ids) {
+        Result<ByteDanceCreativeWordPackage> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ByteDanceCreativeWordPackageService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "创意动态词包信息-通过id查询", notes = "创意动态词包信息-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<ByteDanceCreativeWordPackage> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<ByteDanceCreativeWordPackage> result = new Result<>();
+        ByteDanceCreativeWordPackage ByteDanceCreativeWordPackage = ByteDanceCreativeWordPackageService.getById(id);
+        if (ByteDanceCreativeWordPackage == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ByteDanceCreativeWordPackage);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
+        // Step.1 组装查询条件
+        QueryWrapper<ByteDanceCreativeWordPackage> queryWrapper = null;
+        try {
+            String paramsStr = request.getParameter("paramsStr");
+            if (oConvertUtils.isNotEmpty(paramsStr)) {
+                String deString = URLDecoder.decode(paramsStr, "UTF-8");
+                ByteDanceCreativeWordPackage ByteDanceCreativeWordPackage = JSON.parseObject(deString, ByteDanceCreativeWordPackage.class);
+                queryWrapper = QueryGenerator.initQueryWrapper(ByteDanceCreativeWordPackage, request.getParameterMap());
+            }
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        //Step.2 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        List<ByteDanceCreativeWordPackage> pageList = ByteDanceCreativeWordPackageService.list(queryWrapper);
+        //导出文件名称
+        mv.addObject(NormalExcelConstants.FILE_NAME, "创意动态词包信息列表");
+        mv.addObject(NormalExcelConstants.CLASS, ByteDanceCreativeWordPackage.class);
+        mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("创意动态词包信息列表数据", "导出人:Jeecg", "导出信息"));
+        mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+        return mv;
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<ByteDanceCreativeWordPackage> listByteDanceCreativeWordPackages = ExcelImportUtil.importExcel(file.getInputStream(), ByteDanceCreativeWordPackage.class, params);
+                ByteDanceCreativeWordPackageService.saveBatch(listByteDanceCreativeWordPackages);
+                return Result.ok("文件导入成功!数据行数:" + listByteDanceCreativeWordPackages.size());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return Result.error("文件导入失败:" + e.getMessage());
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.ok("文件导入失败!");
+    }
+
+}
+

+ 202 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/controller/BytedanceAccountCommonSlogenController.java

@@ -0,0 +1,202 @@
+package cn.com.ctop.toutiao.modules.material.controller;
+
+import cn.com.ctop.common.module.utils.QueryGenerator;
+import cn.com.ctop.toutiao.modules.material.entity.BytedanceAccountCommonSlogen;
+import cn.com.ctop.toutiao.modules.material.service.IBytedanceAccountCommonSlogenService;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 头条账户通用文案数据
+ * @author jeecg-boot
+ * @date   2021-05-24
+ * @version V1.0
+ */
+@Slf4j
+@Api(tags="头条账户通用文案数据")
+@RestController
+@RequestMapping("/ctop/bytedanceAccountCommonSlogen")
+public class BytedanceAccountCommonSlogenController {
+	@Autowired
+	private IBytedanceAccountCommonSlogenService bytedanceAccountCommonSlogenService;
+
+	/**
+	  * 分页列表查询
+	 * @param bytedanceAccountCommonSlogen
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@ApiOperation(value="头条账户通用文案数据-分页列表查询", notes="头条账户通用文案数据-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<BytedanceAccountCommonSlogen>> queryPageList(BytedanceAccountCommonSlogen bytedanceAccountCommonSlogen,
+																	 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																	 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																	 HttpServletRequest req) {
+		Result<IPage<BytedanceAccountCommonSlogen>> result = new Result<>();
+		QueryWrapper<BytedanceAccountCommonSlogen> queryWrapper = QueryGenerator.initQueryWrapper(bytedanceAccountCommonSlogen, req.getParameterMap());
+		Page<BytedanceAccountCommonSlogen> page = new Page<>(pageNo, pageSize);
+		IPage<BytedanceAccountCommonSlogen> pageList = bytedanceAccountCommonSlogenService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 * @param bytedanceAccountCommonSlogen
+	 * @return
+	 */
+	@ApiOperation(value="头条账户通用文案数据-添加", notes="头条账户通用文案数据-添加")
+	@PostMapping(value = "/add")
+	public Result<BytedanceAccountCommonSlogen> add(@RequestBody BytedanceAccountCommonSlogen bytedanceAccountCommonSlogen) {
+		Result<BytedanceAccountCommonSlogen> result = new Result<>();
+		try {
+			bytedanceAccountCommonSlogenService.save(bytedanceAccountCommonSlogen);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 * @param bytedanceAccountCommonSlogen
+	 * @return
+	 */
+	@ApiOperation(value="头条账户通用文案数据-编辑", notes="头条账户通用文案数据-编辑")
+	@PutMapping(value = "/edit")
+	public Result<BytedanceAccountCommonSlogen> edit(@RequestBody BytedanceAccountCommonSlogen bytedanceAccountCommonSlogen) {
+		Result<BytedanceAccountCommonSlogen> result = new Result<>();
+		BytedanceAccountCommonSlogen bytedanceAccountCommonSlogenEntity = bytedanceAccountCommonSlogenService.getById(bytedanceAccountCommonSlogen.getId());
+		if(bytedanceAccountCommonSlogenEntity==null) {
+			result.error500("未找到对应实体");
+		}else {
+			boolean ok = bytedanceAccountCommonSlogenService.updateById(bytedanceAccountCommonSlogen);
+			if(ok) {
+				result.success("修改成功!");
+			}
+		}
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条账户通用文案数据-通过id删除", notes="头条账户通用文案数据-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id") String id) {
+		try {
+			bytedanceAccountCommonSlogenService.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<BytedanceAccountCommonSlogen> deleteBatch(@RequestParam(name="ids") String ids) {
+		Result<BytedanceAccountCommonSlogen> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.bytedanceAccountCommonSlogenService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="头条账户通用文案数据-通过id查询", notes="头条账户通用文案数据-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<BytedanceAccountCommonSlogen> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<BytedanceAccountCommonSlogen> result = new Result<>();
+		BytedanceAccountCommonSlogen bytedanceAccountCommonSlogen = bytedanceAccountCommonSlogenService.getById(id);
+		if(bytedanceAccountCommonSlogen==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(bytedanceAccountCommonSlogen);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+  /**
+   * 通过excel导入数据
+   *
+   * @param request
+   * @param response
+   * @return
+   */
+  @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+  public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+      MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+      Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+      for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+          MultipartFile file = entity.getValue();
+          ImportParams params = new ImportParams();
+          params.setTitleRows(2);
+          params.setHeadRows(1);
+          params.setNeedSave(true);
+          try {
+              List<BytedanceAccountCommonSlogen> listBytedanceAccountCommonSlogens = ExcelImportUtil.importExcel(file.getInputStream(), BytedanceAccountCommonSlogen.class, params);
+              bytedanceAccountCommonSlogenService.saveBatch(listBytedanceAccountCommonSlogens);
+              return Result.ok("文件导入成功!数据行数:" + listBytedanceAccountCommonSlogens.size());
+          } catch (Exception e) {
+              log.error(e.getMessage(),e);
+              return Result.error("文件导入失败:"+e.getMessage());
+          } finally {
+              try {
+                  file.getInputStream().close();
+              } catch (IOException e) {
+                  e.printStackTrace();
+              }
+          }
+      }
+      return Result.ok("文件导入失败!");
+  }
+
+}

+ 108 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/ByteDanceCreativeWordPackage.java

@@ -0,0 +1,108 @@
+package cn.com.ctop.toutiao.modules.material.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.alibaba.fastjson.JSONObject;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+import java.util.Date;
+
+@Data
+@TableName("ctop_bytedance_creative_word_package")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "ctop_bytedance_creative_word_package对象", description = "今日头条创意词包")
+public class ByteDanceCreativeWordPackage {
+
+
+    /**id*/
+    @TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+    private java.lang.Integer id;
+    /**creativeWordId*/
+    @Excel(name = "creativeWordId", width = 15)
+    @ApiModelProperty(value = "creativeWordId")
+    private java.lang.Integer creativeWordId;
+    /**name*/
+    @Excel(name = "name", width = 15)
+    @ApiModelProperty(value = "name")
+    private java.lang.String name;
+    /**defaultWord*/
+    @Excel(name = "defaultWord", width = 15)
+    @ApiModelProperty(value = "defaultWord")
+    private java.lang.String defaultWord;
+    /**words*/
+    @Excel(name = "words", width = 15)
+    @ApiModelProperty(value = "words")
+    private java.lang.Object words;
+    /**contentType*/
+    @Excel(name = "contentType", width = 15)
+    @ApiModelProperty(value = "contentType")
+    private java.lang.String contentType;
+    /**maxWordLen*/
+    @Excel(name = "maxWordLen", width = 15)
+    @ApiModelProperty(value = "maxWordLen")
+    private java.lang.Integer maxWordLen;
+    /**status*/
+    @Excel(name = "status", width = 15)
+    @ApiModelProperty(value = "status")
+    private java.lang.String status;
+    /**userRate*/
+    @Excel(name = "userRate", width = 15)
+    @ApiModelProperty(value = "userRate")
+    private Float userRate;
+    /**createTime*/
+    @ApiModelProperty(value = "createTime")
+    private java.util.Date createTime;
+    /**updateTime*/
+    @ApiModelProperty(value = "updateTime")
+    private java.util.Date updateTime;
+
+
+
+    public ByteDanceCreativeWordPackage(){}
+
+    public ByteDanceCreativeWordPackage(JSONObject jsonObject){
+        int creativeWordId = jsonObject.getInteger("creative_word_id");
+        this.creativeWordId = creativeWordId;
+
+        int maxWordLen = jsonObject.getInteger("max_word_len");
+        this.maxWordLen = maxWordLen;
+
+        String name = jsonObject.getString("name");
+        if (null != name && !"".equals(name.trim())) {
+            this.name = name;
+        }
+
+        String defaultWord = jsonObject.getString("default_word");
+        if (null != defaultWord && !"".equals(defaultWord.trim())) {
+            this.defaultWord = defaultWord;
+        }
+
+        String words = jsonObject.getString("words");
+        if (null != words && !"".equals(words.trim())) {
+            this.words = words;
+        }
+
+        String contentType = jsonObject.getString("content_type");
+        if (null != contentType && !"".equals(contentType.trim())) {
+            this.contentType = contentType;
+        }
+
+        String status = jsonObject.getString("status");
+        if (null != status && !"".equals(status.trim())) {
+            this.status = status;
+        }
+
+        Float userRate = jsonObject.getFloat("user_rate");
+        this.userRate = userRate;
+    }
+
+
+}

+ 53 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceAccountCommonSlogen.java

@@ -0,0 +1,53 @@
+package cn.com.ctop.toutiao.modules.material.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 头条账户通用文案数据
+ * @author jeecg-boot
+ * @date   2021-05-24
+ * @version V1.0
+ */
+@Data
+@TableName("ctop_bytedance_account_common_slogen")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="ctop_bytedance_account_common_slogen对象", description="头条账户通用文案数据")
+public class BytedanceAccountCommonSlogen {
+    
+	/**id*/
+	@TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+	private Integer id;
+	/**slogen*/
+	@Excel(name = "slogen", width = 15)
+    @ApiModelProperty(value = "slogen")
+	private String slogen;
+	/**accountId*/
+	@Excel(name = "accountId", width = 15)
+    @ApiModelProperty(value = "accountId")
+	private Integer accountId;
+	/**createTime*/
+    @ApiModelProperty(value = "createTime")
+	private Date createTime;
+	/**updateTime*/
+    @ApiModelProperty(value = "updateTime")
+	private Date updateTime;
+	/**status*/
+	@Excel(name = "status", width = 15)
+    @ApiModelProperty(value = "status")
+	private Integer status;
+}

+ 4 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/entity/BytedanceVideoSlogenInfo.java

@@ -35,7 +35,9 @@ public class BytedanceVideoSlogenInfo {
 	/**status*/
 	private Integer status;
 
-	public BytedanceVideoSlogenInfo(String videoCode, String slogan, String userId) {
+	private String creativeWordIds;
+
+	public BytedanceVideoSlogenInfo(String videoCode, String slogan, String userId, String creativeWordIds) {
 		this.videoCode = videoCode;
 		this.slogan = slogan;
 		this.createBy = userId;
@@ -43,6 +45,7 @@ public class BytedanceVideoSlogenInfo {
 		this.createTime = new Date();
 		this.updateTime = new Date();
 		this.status = 1;
+		this.creativeWordIds = creativeWordIds;
 	}
 
 	public BytedanceVideoSlogenInfo() {

+ 18 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/ByteDanceCreativeWordPackageMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.toutiao.modules.material.mapper;
+
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreative;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreativeWordPackage;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Description: 今日头条创意信息
+ * @Author: jeecg-boot
+ * @Date: 2019-07-22
+ * @Version: V1.0
+ */
+public interface ByteDanceCreativeWordPackageMapper extends BaseMapper<ByteDanceCreativeWordPackage> {
+    void replaceBatch(@Param(value = "creativeWordPackages") List<ByteDanceCreativeWordPackage> creativeWordPackages);
+}

+ 17 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/BytedanceAccountCommonSlogenMapper.java

@@ -0,0 +1,17 @@
+package cn.com.ctop.toutiao.modules.material.mapper;
+
+import java.util.List;
+
+import cn.com.ctop.toutiao.modules.material.entity.BytedanceAccountCommonSlogen;
+import org.apache.ibatis.annotations.Param;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 头条账户通用文案数据
+ * @author jeecg-boot
+ * 2021-05-24
+ * @version V1.0
+ */
+public interface BytedanceAccountCommonSlogenMapper extends BaseMapper<BytedanceAccountCommonSlogen> {
+
+}

+ 29 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/ByteDanceCreativeWordPackageMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.material.mapper.ByteDanceCreativeWordPackageMapper">
+
+    <insert id="replaceBatch">
+        replace into ctop_bytedance_creative_word_package(
+        creative_word_id,
+        name,
+        default_word,
+        words,
+        content_type,
+        max_word_len,
+        status,
+        user_rate)
+        values
+        <foreach collection="creativeWordPackages" item="report" separator=",">
+            (
+            #{report.creativeWordId},
+            #{report.name},
+            #{report.defaultWord},
+            #{report.words},
+            #{report.contentType},
+            #{report.maxWordLen},
+            #{report.status},
+            #{report.userRate}
+            )
+        </foreach>
+    </insert>
+</mapper>

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

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

+ 21 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IByteDanceCreativeWordPackageService.java

@@ -0,0 +1,21 @@
+package cn.com.ctop.toutiao.modules.material.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreative;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreativeWordPackage;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 今日头条创意词包
+ * @Author: jeecg-boot
+ * @Date: 2021-05-18
+ * @Version: test
+ */
+public interface IByteDanceCreativeWordPackageService extends IService<ByteDanceCreativeWordPackage> {
+    Map<String, Object> getCreativeWordPackage();
+
+}

+ 14 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IBytedanceAccountCommonSlogenService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.toutiao.modules.material.service;
+
+import cn.com.ctop.toutiao.modules.material.entity.BytedanceAccountCommonSlogen;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 头条账户通用文案数据
+ * @author jeecg-boot
+ * 2021-05-24
+ * @version V1.0
+ */
+public interface IBytedanceAccountCommonSlogenService extends IService<BytedanceAccountCommonSlogen> {
+
+}

+ 5 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/IEtlBytedanceVideoInfoService.java

@@ -1,8 +1,11 @@
 package cn.com.ctop.toutiao.modules.material.service;
 
+import cn.com.ctop.toutiao.modules.link.entity.ETLReportBytedanceVideo;
 import cn.com.ctop.toutiao.modules.material.entity.EtlBytedanceVideoInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @Description: 头条视频报表信息
  * @Author: jeecg-boot
@@ -10,5 +13,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @Version: V1.0
  */
 public interface IEtlBytedanceVideoInfoService extends IService<EtlBytedanceVideoInfo> {
+    List<ETLReportBytedanceVideo> selectAllETLReportBytedanceVideo();
 
+    void updateETLReportNameIsNull(ETLReportBytedanceVideo etlReportBytedanceVideo);
 }

+ 66 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/ByteDanceCreativeWordPackageServiceImpl.java

@@ -0,0 +1,66 @@
+package cn.com.ctop.toutiao.modules.material.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
+import cn.com.ctop.toutiao.modules.material.entity.ByteDanceCreativeWordPackage;
+import cn.com.ctop.toutiao.modules.material.mapper.ByteDanceCreativeWordPackageMapper;
+import cn.com.ctop.toutiao.modules.material.service.IByteDanceCreativeWordPackageService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+@Slf4j
+@Service
+public class ByteDanceCreativeWordPackageServiceImpl extends ServiceImpl<ByteDanceCreativeWordPackageMapper, ByteDanceCreativeWordPackage> implements IByteDanceCreativeWordPackageService {
+
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+    @Resource
+    private ByteDanceCreativeWordPackageMapper byteDanceCreativeWordPackageMapper;
+
+    @Override
+    public Map<String, Object> getCreativeWordPackage(){
+        String accountId = "1649600126891015";
+        JSONObject data = new JSONObject();
+
+        //1:获取token
+        CtopOauthToken token = tokenService.getOauthTokenByAccountId(accountId);
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        data.put("advertiser_id", token.getAccountId());
+//        data.put("creative_word_ids","");  不填,默认返回所有创意词包
+        String url = PropertiesUtils.getValue("bytedance_config", "bytedance_api_url") + PropertiesUtils.getValue("bytedance_config", "bytedance_v2_creative_word_select");
+        String result = HttpUtils.httpGetRequest(url,headers,data);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        saveCreativeWordPackageToDb(jsonObject);
+        return null;
+    }
+
+    public void saveCreativeWordPackageToDb(JSONObject result){
+        List<ByteDanceCreativeWordPackage> resultList = new ArrayList<ByteDanceCreativeWordPackage>();
+        Integer code = result.getInteger("code");
+        if(code != null && 0 == code){
+            JSONObject data = result.getJSONObject("data");
+            JSONArray dataJSONArray = data.getJSONArray("creative_word");
+            for (int i = 0 ; i < dataJSONArray.size() ; i++) {
+                JSONObject creativeWord = (JSONObject)dataJSONArray.get(i);
+                ByteDanceCreativeWordPackage byteDanceCreativeWordPackage = new ByteDanceCreativeWordPackage(creativeWord);
+                resultList.add(byteDanceCreativeWordPackage);
+            }
+            byteDanceCreativeWordPackageMapper.replaceBatch(resultList);
+        }
+    }
+
+}

+ 18 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceAccountCommonSlogenServiceImpl.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.toutiao.modules.material.service.impl;
+
+import cn.com.ctop.toutiao.modules.material.entity.BytedanceAccountCommonSlogen;
+import cn.com.ctop.toutiao.modules.material.mapper.BytedanceAccountCommonSlogenMapper;
+import cn.com.ctop.toutiao.modules.material.service.IBytedanceAccountCommonSlogenService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 头条账户通用文案数据
+ * @author jeecg-boot
+ * 2021-05-24
+ * @version V1.0
+ */
+@Service
+public class BytedanceAccountCommonSlogenServiceImpl extends ServiceImpl<BytedanceAccountCommonSlogenMapper, BytedanceAccountCommonSlogen> implements IBytedanceAccountCommonSlogenService {
+
+}

+ 5 - 2
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/BytedanceVideoSlogenInfoServiceImpl.java

@@ -5,6 +5,7 @@ import cn.com.ctop.toutiao.modules.material.entity.BytedanceVideoSlogenInfo;
 import cn.com.ctop.toutiao.modules.material.mapper.BytedanceVideoSlogenInfoMapper;
 import cn.com.ctop.toutiao.modules.material.service.IBytedanceVideoSlogenInfoService;
 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.springframework.stereotype.Service;
@@ -25,8 +26,10 @@ public class BytedanceVideoSlogenInfoServiceImpl extends ServiceImpl<BytedanceVi
             return;
         }
         for(int i=0;i<slogans.size();i++){
-            String slogan = slogans.getString(i);
-            BytedanceVideoSlogenInfo slogenInfo = new BytedanceVideoSlogenInfo(videoCode,slogan,userId);
+            JSONObject sloganObject = slogans.getJSONObject(i);
+            String title = sloganObject.getString("title");
+            String creativeWordIds = Check.isNull(sloganObject.getJSONArray("creative_word_ids")) ? "" : sloganObject.getJSONArray("creative_word_ids").toJSONString();
+            BytedanceVideoSlogenInfo slogenInfo = new BytedanceVideoSlogenInfo(videoCode,title,userId,creativeWordIds);
             this.save(slogenInfo);
         }
     }

+ 17 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/EtlBytedanceVideoInfoServiceImpl.java

@@ -1,11 +1,16 @@
 package cn.com.ctop.toutiao.modules.material.service.impl;
 
+import cn.com.ctop.toutiao.modules.link.entity.ETLReportBytedanceVideo;
 import cn.com.ctop.toutiao.modules.material.entity.EtlBytedanceVideoInfo;
 import cn.com.ctop.toutiao.modules.material.mapper.EtlBytedanceVideoInfoMapper;
 import cn.com.ctop.toutiao.modules.material.service.IEtlBytedanceVideoInfoService;
+import cn.com.ctop.toutiao.modules.report.mapper.EtlBytedanceReportVideoDailyMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 头条视频报表信息
  * @author jeecg-boot
@@ -15,4 +20,16 @@ import org.springframework.stereotype.Service;
 @Service
 public class EtlBytedanceVideoInfoServiceImpl extends ServiceImpl<EtlBytedanceVideoInfoMapper, EtlBytedanceVideoInfo> implements IEtlBytedanceVideoInfoService {
 
+    @Autowired
+    EtlBytedanceReportVideoDailyMapper etlBytedanceReportVideoDailyMapper;
+
+    @Override
+    public List<ETLReportBytedanceVideo> selectAllETLReportBytedanceVideo(){
+        List<ETLReportBytedanceVideo> etlReportBytedanceVideoList = etlBytedanceReportVideoDailyMapper.getCtopMaterialAscriptionInfo();
+        return etlReportBytedanceVideoList;
+    }
+    @Override
+    public void updateETLReportNameIsNull(ETLReportBytedanceVideo etlReportBytedanceVideo){
+        etlBytedanceReportVideoDailyMapper.updateOneBytedanceVideoInfo(etlReportBytedanceVideo);
+    }
 }

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

@@ -25,4 +25,8 @@ public interface EtlBytedanceReportVideoDailyMapper extends BaseMapper<EtlByteda
     List<ETLReportBytedanceVideo> etlBytedanceVideoInfo(@Param(value = "date") String date);
 
     void replaceEtlVideoInfo(@Param(value = "videoInfo") ETLReportBytedanceVideo videoInfo);
+
+    List<ETLReportBytedanceVideo> getCtopMaterialAscriptionInfo();
+
+    void updateOneBytedanceVideoInfo(@Param(value = "etlReportBytedanceVideo") ETLReportBytedanceVideo etlReportBytedanceVideo);
 }

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

@@ -2,6 +2,40 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.ctop.toutiao.modules.report.mapper.EtlBytedanceReportVideoDailyMapper">
 
+    <select id="getCtopMaterialAscriptionInfo" resultType="cn.com.ctop.toutiao.modules.link.entity.ETLReportBytedanceVideo">
+        SELECT DISTINCT
+            md5,
+            cma.clip_id,
+            cma.clip_name,
+            cma.shot_id,
+            cma.shot_name,
+            cma.plan_id,
+            cma.plan_name
+        FROM
+            etl_report_bytedance_video video
+        LEFT JOIN ctop_material_ascription cma ON cma. CODE = video.md5
+        where
+		cma.clip_id is not null or
+		cma.clip_name is not null or
+		cma.shot_id is not null or
+		cma.shot_name is not null or
+		cma.plan_id is not null or
+		cma.plan_name is not null;
+    </select>
+
+    <update id="updateOneBytedanceVideoInfo"  parameterType="cn.com.ctop.toutiao.modules.link.entity.ETLReportBytedanceVideo">
+        UPDATE etl_report_bytedance_video
+        <trim prefix="set" suffixOverrides=",">
+            <if test="etlReportBytedanceVideo.clipId!=null">clip_id=#{etlReportBytedanceVideo.clipId},</if>
+            <if test="etlReportBytedanceVideo.clipName!=null">clip_name=#{etlReportBytedanceVideo.clipName},</if>
+            <if test="etlReportBytedanceVideo.shotId!=null">shot_id=#{etlReportBytedanceVideo.shotId},</if>
+            <if test="etlReportBytedanceVideo.shotName!=null">shot_name=#{etlReportBytedanceVideo.shotName},</if>
+            <if test="etlReportBytedanceVideo.planId!=null">plan_id=#{etlReportBytedanceVideo.planId},</if>
+            <if test="etlReportBytedanceVideo.planName!=null">plan_name=#{etlReportBytedanceVideo.planName},</if>
+        </trim>
+        WHERE md5=#{etlReportBytedanceVideo.md5}
+    </update>
+
 
     <select id="getBytedanceVideoInfo" resultType="java.util.Map">
         SELECT

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

@@ -414,6 +414,7 @@ public class ReportServiceImpl implements IReportService {
             log.error("素材报表请求数据null=>accountId:{};startDate:{};endDate:{}", token.getAccountId(), startDate, endDate);
             return;
         }
+
         Integer code = getObject.getInteger("code");
         String message = getObject.getString("message");
         if (null == code || code != 0) {

+ 1 - 0
module-toutiao/src/main/resources/bytedance_config.properties

@@ -32,3 +32,4 @@ bytedance_v2_advertiser_report_get=/2/report/advertiser/get/
 bytedance_v2_campaign_report_get=/2/report/campaign/get/
 bytedance_v2_ad_report_get=/2/report/ad/get/
 bytedance_v2_ad_creative_get=/2/report/creative/get/
+bytedance_v2_creative_word_select=/2/tools/creative_word/select/