Kaynağa Gözat

Merge remote-tracking branch 'origin/V1.1.3' into V1.1.3

jiequan.bi 4 yıl önce
ebeveyn
işleme
fbcafaebfc
18 değiştirilmiş dosya ile 544 ekleme ve 86 silme
  1. 2 2
      jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MD5Util.java
  2. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  3. 33 9
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  4. 9 10
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  5. 44 0
      module-common/src/main/java/cn/com/ctop/common/module/enums/SceneIdEnum.java
  6. 49 9
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaiShouAppInfoController.java
  7. 2 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/entity/AiKuaiShouAppInfo.java
  8. 6 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/IAiKuaiShouAppInfoService.java
  9. 161 28
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaiShouAppInfoServiceImpl.java
  10. 1 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouBatchCampaignPreviewController.java
  11. 26 8
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouBatchGroupPreviewController.java
  12. 5 2
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchCampaignPreview.java
  13. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchCreativePreview.java
  14. 26 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchGroupPreview.java
  15. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouMaterialUploadService.java
  16. 2 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaiShouMaterialUploadServiceImpl.java
  17. 163 13
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouBatchCampaignPreviewServiceImpl.java
  18. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouGroupExploreServiceImpl.java

+ 2 - 2
jeecg-boot-base-common/src/main/java/org/jeecg/common/util/MD5Util.java

@@ -28,10 +28,10 @@ public class MD5Util {
 		}
 		return String.valueOf(str);
 	}
-	public static String getMd5(String msg) {
+	public static String getMd5(String url) {
 		MessageDigest md5 = MD5.get();
 		md5.reset();
-		return toHexStr(md5.digest(msg.getBytes()));
+		return toHexStr(md5.digest(url.getBytes()));
 	}
 
 	public static String byteArrayToHexString(byte b[]) {

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

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

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

@@ -17,7 +17,6 @@ import cn.com.ctop.kuaishou.modules.material.entity.KuaishouResultToken;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaiShouDailyAgentService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.material.service.IBytedanceEffectVideoInfoService;
-import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
 import cn.com.ctop.toutiao.modules.report.service.*;
 import com.alibaba.fastjson.JSONArray;
@@ -36,8 +35,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
@@ -112,9 +109,36 @@ public class TestController {
     private IBindAccountAuthService bindAccountAuthService;
     @Autowired
     private UserAllocationMapper allocationMapper;
+    @Autowired
+    private IBytedanceReportService bytedanceReportService;
+
+
+    @GetMapping("/loadMatData")
+    public Map<String, Object> getData(String startDate, String endDate, Long accountId) {
+        Map<String, Object> result = new HashMap<>();
+        CtopOauthToken token = tokenService.getTokenByAccountId(accountId);
+        Date start = DateUtils.parseDate(startDate, "yyyy-MM-dd");
+        int days = DateUtils.getdaysOfTwoDate(startDate, endDate) + 1;
+        for (int i = 0; i < days; i++) {
+            String getDate = DateUtils.formatDate(DateUtils.addDay(start, i));
+            // bytedanceReportService.bytedanceMaterialReport(token, getDate, getDate);
+
+            suzhaoService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    bytedanceReportService.bytedanceMaterialReport(token, getDate, getDate);
+
+                }
+            });
+
+        }
+        ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
+        return result;
+    }
+
 
     @GetMapping("/testKuaishou")
-    public String kuaishouCallback( @RequestParam("auth_code") String authCode, @RequestParam("state") String state) {
+    public String kuaishouCallback(@RequestParam("auth_code") String authCode, @RequestParam("state") String state) {
         try {
             JSONObject json = JSONObject.parseObject(state);
             if (Check.isNull(json)) {
@@ -224,14 +248,14 @@ public class TestController {
 
 
     @GetMapping("/getBytedanceMatReport")
-    public Map<String,Object>getData(){
+    public Map<String, Object> getData() {
         List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
         executorService = Executors.newFixedThreadPool(10);
         CountDownLatch countDownLatch = new CountDownLatch(tokens.size());
         tokens.forEach(record -> executorService.submit(() -> {
             try {
-                reportService.getAdvertiserReport(record, DateUtils.parseDate("2021-01-01","yyyy-MM-dd"), DateUtils.parseDate("2021-01-31","yyyy-MM-dd"),CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
-                log.info("账户数据获取完成:account:{},时间:{}-{}",record.getAccountId(),"2021-01-01","2020-01-31");
+                reportService.getAdvertiserReport(record, DateUtils.parseDate("2021-01-01", "yyyy-MM-dd"), DateUtils.parseDate("2021-01-31", "yyyy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_DAILY);
+                log.info("账户数据获取完成:account:{},时间:{}-{}", record.getAccountId(), "2021-01-01", "2020-01-31");
             } catch (Exception e) {
 
             } finally {
@@ -249,8 +273,8 @@ public class TestController {
 //        bytedanceReportMaterialDailyMapper.updateImageReportProjectName();
 //        bytedanceReportMaterialDailyMapper.updateImageReportPlaneId();
 //        bytedanceReportMaterialDailyMapper.updateImageReportPlaneName();
-        Map<String,Object> result =  new HashMap<>();
-        ResultMapUtils.setResultMap(new HashMap<>(),StatusCode.COMMON_SUCCESS);
+        Map<String, Object> result = new HashMap<>();
+        ResultMapUtils.setResultMap(new HashMap<>(), StatusCode.COMMON_SUCCESS);
         return result;
     }
 

+ 9 - 10
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -6,12 +6,10 @@ import cn.com.ctop.common.module.entity.UserAllocation;
 import cn.com.ctop.common.module.service.IBindAccountLoginService;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 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.kuaishou.modules.ai.entity.AiKuaishouAccountTargetTemplate;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouAccountTargetTemplateService;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaishouNewCreateCampaign;
-import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouVideoGet;
 import cn.com.ctop.kuaishou.modules.batch.service.*;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyAgentService;
@@ -25,13 +23,10 @@ import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataServ
 import cn.com.ctop.toutiao.modules.report.entity.BytedanceAccountReportTaskRecord;
 import cn.com.ctop.toutiao.modules.report.mapper.BytedanceReportMaterialDailyMapper;
 import cn.com.ctop.toutiao.modules.report.service.*;
-import com.alibaba.fastjson.JSONArray;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.catalina.User;
 import org.jeecg.common.util.DateUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.openqa.selenium.By;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.ActiveProfiles;
@@ -43,7 +38,6 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -71,11 +65,16 @@ public class SampleTest {
     private IBindAccountLoginService bindAccountLoginService;
     @Autowired
     private IKuaishouWebInterfaceService kuaishouWebInterfaceService;
-
+ /*   @Autowired
+    private IByteDanceAdvertiserDataService advertiserDataService;
+*/
 
     @Test
     public void loadBytedanceCreativeData() throws ParseException {
-
+        //    1662234704806924
+        CtopOauthToken tokenByAccountId = tokenService.getTokenByAccountId(1662234704806924L);
+        advertiserDataService.getMaterialList(tokenByAccountId);
+       /* getVideoByPage(token, "", 1);
         List<KuaiShouVideoGet> KuaiShouVideoGets = videoGetService.selectPhotoIdsByAccountId(9743746L);
         if (!Check.isNull(KuaiShouVideoGets)) {
             JSONArray dateList = new JSONArray();
@@ -97,7 +96,7 @@ public class SampleTest {
             }
             dateList.add(photoIds);
             kuaishouVideoRelateCreativesService.videoRelateCreatives(9743746L, dateList, statdateMap);
-        }
+        }*/
     }
 
     @Test
@@ -588,7 +587,7 @@ public class SampleTest {
         //countDownLatch = new CountDownLatch(31);
         for (int i = 3; i <= 31; i++) {
             String statDate = DateUtils.formatDate(DateUtils.addDay(new Date(), -i));
-                    ietlReportBytedanceVideoService.cleanETL(statDate);
+            ietlReportBytedanceVideoService.cleanETL(statDate);
         }
     }
 }

+ 44 - 0
module-common/src/main/java/cn/com/ctop/common/module/enums/SceneIdEnum.java

@@ -0,0 +1,44 @@
+package cn.com.ctop.common.module.enums;
+
+/**
+ * 条件枚举
+ *
+ * @param
+ * @author ZHAOXA
+ * @return
+ * @throws
+ */
+public enum SceneIdEnum {
+    ONE(1, "优选广告位"),
+    THREE(3, "视频播放页广告"),
+    FIVE(5, "联盟广告"),
+    SIX(6, "上下滑大屏广告"),
+    SEVEN(7, "信息流广告"),
+    TEN(10, "激励视频"),
+    ELEVEN(11, "快看点场景");
+
+    private Integer id;
+    private String name;
+
+    private SceneIdEnum(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public static SceneIdEnum getEnumById(Integer id) {
+        for (SceneIdEnum em : SceneIdEnum.values()) {
+            if (em.id == id) {
+                return em;
+            }
+        }
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+}

+ 49 - 9
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/controller/AiKuaiShouAppInfoController.java

@@ -1,6 +1,9 @@
 package cn.com.ctop.kuaishou.modules.ai.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaiShouAppInfo;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouAppInfoService;
 import com.alibaba.fastjson.JSON;
@@ -49,21 +52,27 @@ import java.util.Map;
 public class AiKuaiShouAppInfoController {
     @Autowired
     private IAiKuaiShouAppInfoService aiKuaiShouAppInfoService;
+    @Autowired
+    private ICtopOauthTokenService tokenService;
 
 
     @PostMapping(value = "/importAppExcel")
-    public Result<?> importExcel(@RequestParam("file") MultipartFile file,
-                                 @RequestParam("accountId") Long accountId,
-                                 @RequestParam("imageToken") String imageToken) {
-
-
+    public JSONObject importExcel(@RequestParam("file") MultipartFile file,
+                                  @RequestParam("accountId") Long accountId,
+                                  @RequestParam("platform") Integer platform,
+                                  @RequestParam("imageToken") String imageToken) {
         FileInputStream fis = null;
+        JSONObject returnJson = new JSONObject();
         try {
-
-            JSONObject json = aiKuaiShouAppInfoService.importExcel(file, accountId, imageToken);
-            //          System.out.println("导入是否成功:" + flag);
+            CtopOauthToken oauthToken = tokenService.getTokenByAccountId(accountId);
+            if (Check.isNull(oauthToken)) {
+                throw new Exception("未获取到账户信息");
+            }
+            returnJson = aiKuaiShouAppInfoService.importExcel(file, accountId, imageToken, platform, oauthToken.getAccessToken());
         } catch (Exception e) {
             e.printStackTrace();
+            returnJson.put("code", -1);
+            returnJson.put("message", e.getMessage());
         } finally {
             if (fis != null) {
                 try {
@@ -73,8 +82,39 @@ public class AiKuaiShouAppInfoController {
                 }
             }
         }
+        return returnJson;
+    }
+
+    /**
+     * 上传应用头像
+     *
+     * @param requestJson
+     * @return
+     */
+    @PostMapping(value = "/uploadAppIconImage")
+    public JSONObject uploadAppIconImage(@RequestBody JSONObject requestJson) {
+        JSONObject returnJson = new JSONObject();
+        try {
+            Long accountId = requestJson.getLong("accountId");
+            CtopOauthToken oauthToken = tokenService.getTokenByAccountId(accountId);
+            if (Check.isNull(oauthToken)) {
+                throw new Exception("未获取到账户信息");
+            }
+            String url = requestJson.getString("url");
+            if (Check.isNull(url)) {
+                throw new Exception("请传入素材url");
+            }
+            returnJson = aiKuaiShouAppInfoService.uploadAppIconImage(url, accountId, oauthToken.getAccessToken());
+        } catch (Exception e) {
+            returnJson.put("code", -1);
+            returnJson.put("message", e.getMessage());
+        }
+        return returnJson;
+    }
 
-        return Result.ok("文件导入成功!");
+    @GetMapping(value = "/appCreate")
+    public void appCreate(Long accountId, String accessToken) {
+        aiKuaiShouAppInfoService.appCreative(accountId, accessToken);
     }
 
 

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

@@ -89,12 +89,14 @@ public class AiKuaiShouAppInfo {
     @Excel(name = "app文件MD5", width = 15)
     @ApiModelProperty(value = "app文件MD5")
     private String appMd5;
+    private String imageToken;
     /**
      * 状态
      */
     @Excel(name = "状态", width = 15)
     @ApiModelProperty(value = "状态")
     private Integer status;
+    private String remark;
     /**
      * app_id
      */

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

@@ -13,5 +13,10 @@ import org.springframework.web.multipart.MultipartFile;
  */
 public interface IAiKuaiShouAppInfoService extends IService<AiKuaiShouAppInfo> {
 
-    JSONObject importExcel(MultipartFile file, Long accountId, String imageToken);
+    JSONObject importExcel(MultipartFile file, Long accountId, String imageToken, Integer platform, String accessToken);
+
+    JSONObject uploadAppIconImage(String url, Long accountId, String accessToken);
+
+    void appCreative(Long accountId, String accessToken);
+
 }

+ 161 - 28
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/ai/service/impl/AiKuaiShouAppInfoServiceImpl.java

@@ -1,11 +1,16 @@
 package cn.com.ctop.kuaishou.modules.ai.service.impl;
 
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.KuaishouInterfaceConstant;
+import cn.com.ctop.common.module.utils.PropertiesUtils;
 import cn.com.ctop.kuaishou.modules.ai.entity.AiKuaiShouAppInfo;
 import cn.com.ctop.kuaishou.modules.ai.mapper.AiKuaiShouAppInfoMapper;
 import cn.com.ctop.kuaishou.modules.ai.service.IAiKuaiShouAppInfoService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouMaterialUploadService;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFDateUtil;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -14,12 +19,16 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.util.MD5Util;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * ai批量上传应用
@@ -29,7 +38,13 @@ import java.util.Date;
  * @date 2021-02-02
  */
 @Service
+@Slf4j
 public class AiKuaiShouAppInfoServiceImpl extends ServiceImpl<AiKuaiShouAppInfoMapper, AiKuaiShouAppInfo> implements IAiKuaiShouAppInfoService {
+    @Autowired
+    private IKuaiShouMaterialUploadService materialUploadService;
+    @Autowired
+    private AiKuaiShouAppInfoMapper aiKuaiShouAppInfoMapper;
+    static ExecutorService executorService = Executors.newFixedThreadPool(10);
 
     /**
      * 文件导入
@@ -40,42 +55,40 @@ public class AiKuaiShouAppInfoServiceImpl extends ServiceImpl<AiKuaiShouAppInfoM
      * @return
      */
     @Override
-    public JSONObject importExcel(MultipartFile myFile, Long accountId, String imageToken) {
+    public JSONObject importExcel(MultipartFile myFile, Long accountId, String imageToken, Integer platform, String accessToken) {
+        JSONObject returnJson = new JSONObject();
         try {
             Workbook workbook = null;
             String fileName = myFile.getOriginalFilename();
-            if (fileName.endsWith("XLS")) {
-                //2003
+            String substring = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();
+            if (substring.equals("XLS")) {
                 workbook = new HSSFWorkbook(myFile.getInputStream());
-            } else if (fileName.endsWith("XLSX")) {
-                //2007
+            } else if (substring.equals("XLSX")) {
                 workbook = new XSSFWorkbook(myFile.getInputStream());
             } else {
-                //   throw new Exception("文件不是Excel文件");
+                throw new Exception("文件不是Excel文件");
             }
-
             Sheet sheet = workbook.getSheet("Sheet1");
             int rows = sheet.getLastRowNum();// 指的行数,一共有多少行+
             if (rows == 0) {
-                // throw new Exception("请填写数据");
+                throw new Exception("请填写数据");
             }
+            List<AiKuaiShouAppInfo> appList = new ArrayList<>();
             for (int i = 1; i <= rows + 1; i++) {
-                // 读取左上端单元格
                 Row row = sheet.getRow(i);
-                // 行不为空
                 if (row != null) {
-                    // **读取cell**
                     AiKuaiShouAppInfo appInfo = new AiKuaiShouAppInfo();
-
+                    appInfo.setStatus(0);
+                    appInfo.setRemark("应用待创建");
+                    appInfo.setAccountId(accountId);
+                    appInfo.setPlatform(platform);
+                    appInfo.setImageToken(imageToken);
                     String appName = getCellValue(row.getCell(0));
                     appInfo.setAppName(appName);
-
                     String packageName = getCellValue(row.getCell(1));
                     appInfo.setPackageName(packageName);
-
                     String appVersion = getCellValue(row.getCell(2));
                     appInfo.setAppVersion(appVersion);
-
                     String useSdk = getCellValue(row.getCell(3));
                     if (!Check.isNull(useSdk)) {
                         appInfo.setUseSdk(Integer.valueOf(useSdk));
@@ -84,27 +97,101 @@ public class AiKuaiShouAppInfoServiceImpl extends ServiceImpl<AiKuaiShouAppInfoM
                     if (!Check.isNull(appPrivacyUrl)) {
                         appInfo.setAppPrivacyUrl(appPrivacyUrl);
                     }
-
-                    String trackUrl = getCellValue(row.getCell(5));
+                    String url = getCellValue(row.getCell(5));
+                    if (!Check.isNull(url)) {
+                        appInfo.setUrl(url);
+                    }
+                    String trackUrl = getCellValue(row.getCell(6));
                     if (!Check.isNull(trackUrl)) {
                         appInfo.setTrackUrl(trackUrl);
                     }
-                    //考试时间
-                  /*  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟
-                    String dateString = getCellValue(row.getCell(3));
-                    if (!StringUtils.isEmpty(dateString)) {
-                        Date date = sdf.parse(dateString);
-                        student.setTime(date);
-                    }
-                    studentMapper.insert(student);*/
+                    appList.add(appInfo);
                 }
             }
-
+            this.saveBatch(appList);
+            appCreative(accountId, accessToken);
+            returnJson.put("code", 0);
+            returnJson.put("message", "文件导入成功,异步创建中,请稍后...");
         } catch (Exception e) {
             e.printStackTrace();
+            returnJson.put("code", -1);
+            returnJson.put("message", e.getMessage());
+        }
+        return returnJson;
+    }
 
+    @Override
+    public void appCreative(Long accountId, String accessToken) {
+        List<AiKuaiShouAppInfo> appListByStatus = getAppListByStatus(accountId, 0);
+        for (AiKuaiShouAppInfo appInfo : appListByStatus) {
+            AiKuaiShouAppInfo updateAppInfo = new AiKuaiShouAppInfo();
+            updateAppInfo.setId(appInfo.getId());
+            String md5 = MD5Util.getMd5(appInfo.getUrl());
+            if (Check.isNull(md5)) {
+                updateAppInfo.setStatus(3);
+                updateAppInfo.setRemark("获取应用MD5失败");
+                this.updateById(updateAppInfo);
+                continue;
+            }
+            updateAppInfo.setAppMd5(md5);
+            updateAppInfo.setStatus(1);
+            updateAppInfo.setRemark("应用创建中");
+            this.updateById(updateAppInfo);
+            executorService.submit(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        JSONObject requestJson = new JSONObject();
+                        requestJson.put("advertiser_id", appInfo.getAccountId());
+                        requestJson.put("app_version", appInfo.getAppVersion());
+                        requestJson.put("app_name", appInfo.getAppName());
+                        requestJson.put("image_token", appInfo.getImageToken());
+                        requestJson.put("package_name", appInfo.getPackageName());
+                        requestJson.put("platform", appInfo.getPlatform());
+                        requestJson.put("url", appInfo.getUrl());
+                        requestJson.put("use_sdk", appInfo.getUseSdk());
+                        requestJson.put("app_privacy_url", appInfo.getAppPrivacyUrl());
+                        String url = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.APP_CREATE;
+                        Map<String, String> headerMap = new HashMap<>();
+                        headerMap.put("Content-Type", "multipart/form-data");
+                        headerMap.put("Access-Token", accessToken);
+                        String s = materialUploadService.exceptInfoForRestTemplate(url, requestJson, headerMap);
+                        JSONObject resultJson = JSONObject.parseObject(s);
+                        log.info("上传应用返回信息:{}", resultJson);
+                        if (!Check.isNull(resultJson)) {
+                            Integer code = resultJson.getInteger("code");
+                            if (code == 0) {
+                                JSONObject data = resultJson.getJSONObject("data");
+                                Long app_id = data.getLong("app_id");
+                                updateAppInfo.setStatus(2);
+                                updateAppInfo.setRemark("创建应用成功");
+                                updateAppInfo.setAppId(app_id);
+                            } else {
+                                updateAppInfo.setStatus(3);
+                                updateAppInfo.setRemark(resultJson.getString("message"));
+                            }
+                        } else {
+                            updateAppInfo.setStatus(3);
+                            updateAppInfo.setRemark("上传应用返回结果为空");
+                        }
+
+                    } catch (Exception e) {
+                        updateAppInfo.setStatus(3);
+                        updateAppInfo.setRemark("系统异常");
+
+                    }
+                    aiKuaiShouAppInfoMapper.updateById(updateAppInfo);
+                }
+            });
         }
-        return null;
+    }
+
+
+    private List<AiKuaiShouAppInfo> getAppListByStatus(Long accountId, Integer status) {
+        QueryWrapper<AiKuaiShouAppInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", accountId);
+        queryWrapper.eq("status", status);
+        return this.list(queryWrapper);
     }
 
 
@@ -148,4 +235,50 @@ public class AiKuaiShouAppInfoServiceImpl extends ServiceImpl<AiKuaiShouAppInfoM
         }
         return value.trim();
     }
+
+
+    @Override
+    public JSONObject uploadAppIconImage(String url, Long accountId, String accessToken) {
+
+        JSONObject returnJson = new JSONObject();
+        try {
+            Map<String, String> headerMap = new HashMap<>();
+            JSONObject requestJson = new JSONObject();
+            requestJson.put("advertiser_id", accountId);
+            headerMap.put("Access-Token", accessToken);
+            headerMap.put("Content-Type", "multipart/form-data");
+            requestJson.put("url", url);
+            requestJson.put("type", 1);
+            requestJson.put("upload_type", "2");
+            String requestUrl = PropertiesUtils.getConfig("kuaishou_api_url") + KuaishouInterfaceConstant.IMAGE_UPLOAD;
+            String result = materialUploadService.exceptInfoForRestTemplate(requestUrl, requestJson, headerMap);
+            JSONObject resultJson = JSONObject.parseObject(result);
+            if (!Check.isNull(resultJson)) {
+                if (resultJson.getInteger("code") == 0) {
+                    JSONObject dataJson = resultJson.getJSONObject("data");
+                    if (!Check.isNull(dataJson)) {
+                        String signature = dataJson.getString("signature");
+                        String image_token = dataJson.getString("image_token");
+                        returnJson.put("code", 0);
+                        returnJson.put("imageToken", image_token);
+                        returnJson.put("signature", signature);
+
+                    } else {
+                        log.error("快手同步封面素材失败,返回信息:{},请求参数:{}", resultJson, requestJson);
+                        returnJson.put("code", -1);
+                        returnJson.put("message", "图片上传失败");
+                    }
+                } else {
+                    log.error("快手同步封面素材失败,返回信息:{},请求参数:{}", resultJson, requestJson);
+                    returnJson.put("code", -1);
+                    returnJson.put("message", resultJson.getString("message"));
+                }
+            }
+        } catch (Exception e) {
+            returnJson.put("code", -1);
+            returnJson.put("message", "系统错误,请重新上传");
+        }
+
+        return returnJson;
+    }
 }

+ 1 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouBatchCampaignPreviewController.java

@@ -24,7 +24,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -140,7 +139,7 @@ public class KuaishouBatchCampaignPreviewController {
             return Result.ok(obj);
         } catch (Exception e) {
             log.error("queryByBatchId is error", e);
-            return Result.error(e.getMessage());
+            return Result.error("查询异常");
         }
     }
 

+ 26 - 8
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/controller/KuaishouBatchGroupPreviewController.java

@@ -1,7 +1,10 @@
 package cn.com.ctop.kuaishou.modules.batch.controller;
 
 import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouBatchCreativePreview;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouBatchGroupPreview;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouBatchCreativePreviewService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouBatchGroupPreviewService;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -54,6 +57,8 @@ import java.util.Map;
 public class KuaishouBatchGroupPreviewController {
     @Autowired
     private IKuaishouBatchGroupPreviewService kuaishouBatchGroupPreviewService;
+    @Autowired
+    private IKuaishouBatchCreativePreviewService kuaishouBatchCreativePreview;
 
     /**
      * 分页列表查询
@@ -112,16 +117,29 @@ public class KuaishouBatchGroupPreviewController {
     @PostMapping(value = "/edit")
     public Result<KuaishouBatchGroupPreview> edit(@RequestBody KuaishouBatchGroupPreview kuaishouBatchGroupPreview) {
         Result<KuaishouBatchGroupPreview> result = new Result<KuaishouBatchGroupPreview>();
-        KuaishouBatchGroupPreview kuaishouBatchGroupPreviewEntity = kuaishouBatchGroupPreviewService.getById(kuaishouBatchGroupPreview.getId());
-        if (kuaishouBatchGroupPreviewEntity == null) {
-            result.error500("未找到对应实体");
-        } else {
-            boolean ok = kuaishouBatchGroupPreviewService.updateById(kuaishouBatchGroupPreview);
-            if (ok) {
-                result.success("修改成功!");
+        try {
+            KuaishouBatchGroupPreview kuaishouBatchGroupPreviewEntity = kuaishouBatchGroupPreviewService.getById(kuaishouBatchGroupPreview.getId());
+            if (kuaishouBatchGroupPreviewEntity == null) {
+                result.error500("未找到对应实体");
+            } else {
+                boolean ok = kuaishouBatchGroupPreviewService.updateById(kuaishouBatchGroupPreview);
+                if (!Check.isNull(kuaishouBatchGroupPreview.getClickTrackUrl()) && !Check.isNull(kuaishouBatchGroupPreview.getSiteId()) && !Check.isNull(kuaishouBatchGroupPreview.getActionbarClickUrl())) {
+                    KuaishouBatchCreativePreview creative = new KuaishouBatchCreativePreview();
+                    creative.setClickTrackUrl(kuaishouBatchGroupPreview.getClickTrackUrl());
+                    creative.setSiteId(kuaishouBatchGroupPreview.getSiteId());
+                    creative.setActionbarClickUrl(kuaishouBatchGroupPreview.getActionbarClickUrl());
+                    QueryWrapper<KuaishouBatchCreativePreview> wrapper = new QueryWrapper<>();
+                    wrapper.eq("group_id", kuaishouBatchGroupPreview.getId());
+                    kuaishouBatchCreativePreview.update(creative, wrapper);
+                }
+                if (ok) {
+                    result.success("修改成功!");
+                }
             }
+        } catch (Exception e) {
+            log.error("修改异常", e);
+            result.error500("修改失败");
         }
-
         return result;
     }
 

+ 5 - 2
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchCampaignPreview.java

@@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 import org.jeecgframework.poi.excel.annotation.Excel;
 
-import javax.persistence.Table;
 import java.util.Date;
 import java.util.List;
 
@@ -47,6 +46,10 @@ public class KuaishouBatchCampaignPreview {
     @ApiModelProperty(value = "计划名称")
     private String campaignName;
     /**
+     * 命名格式
+     */
+    private String campaignNameFormat;
+    /**
      * 2 - 提升应用安装;
      */
     @Excel(name = "2 - 提升应用安装;", width = 15)
@@ -112,6 +115,6 @@ public class KuaishouBatchCampaignPreview {
     private Long campaignId;
 
     @TableField(exist = false)
-    private List<KuaishouBatchGroupPreview>  kuaishouBatchGroupPreviews;
+    private List<KuaishouBatchGroupPreview> kuaishouBatchGroupPreviews;
 
 }

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchCreativePreview.java

@@ -116,7 +116,7 @@ public class KuaishouBatchCreativePreview {
      */
     @Excel(name = "安卓下载中间页", width = 15)
     @ApiModelProperty(value = "安卓下载中间页")
-    private Integer siteId;
+    private Long siteId;
     /**
      * 便利贴创意短广告语
      */

+ 26 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/entity/KuaishouBatchGroupPreview.java

@@ -1,5 +1,6 @@
 package cn.com.ctop.kuaishou.modules.batch.entity;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -46,6 +47,12 @@ public class KuaishouBatchGroupPreview {
      */
     private Long templateId;
     /**
+     * 定向模板id
+     */
+
+    @TableField(exist = false)
+    private String templateName;
+    /**
      * 广告活动ID
      */
     @Excel(name = "广告活动ID", width = 15)
@@ -58,6 +65,10 @@ public class KuaishouBatchGroupPreview {
     @ApiModelProperty(value = "广告组名称")
     private String unitName;
     /**
+     * 命名格式
+     */
+    private String unitNameFormat;
+    /**
      * 投放状态 1:投放中;2:暂停
      */
     @Excel(name = "投放状态 1:投放中;2:暂停", width = 15)
@@ -233,4 +244,19 @@ public class KuaishouBatchGroupPreview {
      */
     private Long unitId;
 
+    @TableField(exist = false)
+    private JSONArray materialArr;
+
+    @TableField(exist = false)
+    private JSONArray descriptionArr;
+
+    @TableField(exist = false)
+    private String clickTrackUrl;
+
+    @TableField(exist = false)
+    private String actionbarClickUrl;
+
+    @TableField(exist = false)
+    private Long siteId;
+
 }

+ 5 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/IKuaiShouMaterialUploadService.java

@@ -2,8 +2,13 @@ package cn.com.ctop.kuaishou.modules.batch.service;
 
 import com.alibaba.fastjson.JSONObject;
 
+import java.util.Map;
+
 public interface IKuaiShouMaterialUploadService {
     JSONObject video(String url, Integer type, Long accountId, String accessToken, String signature);
 
     String kuauiShouImageUpload(String url, String signature, Long accountId, String token);
+
+
+    String exceptInfoForRestTemplate(String url, Map<String, Object> paramMap, Map<String, String> headerMap);
 }

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

@@ -186,7 +186,8 @@ public class KuaiShouMaterialUploadServiceImpl implements IKuaiShouMaterialUploa
     @Autowired
     private RestTemplate rest;
 
-    private String exceptInfoForRestTemplate(String url, Map<String, Object> paramMap, Map<String, String> headerMap) {
+    @Override
+    public String exceptInfoForRestTemplate(String url, Map<String, Object> paramMap, Map<String, String> headerMap) {
         try {
             MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
             if (!Check.isNullMap(paramMap)) {

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

@@ -1,23 +1,34 @@
 package cn.com.ctop.kuaishou.modules.batch.service.impl;
 
+import cn.com.ctop.common.module.enums.SceneIdEnum;
 import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaiShouAppList;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouBatchCampaignPreview;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouBatchCreativePreview;
 import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouBatchGroupPreview;
+import cn.com.ctop.kuaishou.modules.batch.entity.KuaishouTemplate;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaishouBatchCampaignPreviewMapper;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaishouBatchCreativePreviewMapper;
 import cn.com.ctop.kuaishou.modules.batch.mapper.KuaishouBatchGroupPreviewMapper;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouAppListService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouBatchCampaignPreviewService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouTemplateService;
 import com.alibaba.excel.util.CollectionUtils;
 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 org.jeecg.common.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 快手-广告计划预览信息
@@ -36,6 +47,10 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
     KuaishouBatchGroupPreviewMapper groupPreviewMapper;
     @Autowired
     KuaishouBatchCreativePreviewMapper creativePreviewMapper;
+    @Autowired
+    private IKuaishouTemplateService kuaishouTemplateService;
+    @Autowired
+    private IKuaiShouAppListService kuaiShouAppListService;
 
     @Override
     public JSONObject queryByBatchId(String batchId, String accountId) {
@@ -43,18 +58,58 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         QueryWrapper<KuaishouBatchCampaignPreview> campaignWrapper = new QueryWrapper<>();
         campaignWrapper.eq("batch_id", batchId).eq("account_id", accountId).orderByDesc("create_time");
         List<KuaishouBatchCampaignPreview> campaignPreviewList = campaignPreviewMapper.selectList(campaignWrapper);
-        obj.put("campaignList", campaignPreviewList);
         QueryWrapper<KuaishouBatchGroupPreview> groupWrapper = new QueryWrapper<>();
         groupWrapper.eq("batch_id", batchId).eq("account_id", accountId).orderByDesc("create_time");
         List<KuaishouBatchGroupPreview> groupPreviewList = groupPreviewMapper.selectList(groupWrapper);
-        obj.put("groupList", groupPreviewList);
         QueryWrapper<KuaishouBatchCreativePreview> creativeWrapper = new QueryWrapper<>();
         creativeWrapper.eq("batch_id", batchId).eq("account_id", accountId).orderByDesc("create_time");
         List<KuaishouBatchCreativePreview> creativePreviewList = creativePreviewMapper.selectList(creativeWrapper);
-        obj.put("creativeList", creativePreviewList);
+        obj.put("campaignList", getCampaignList(campaignPreviewList, groupPreviewList, creativePreviewList));
         return obj;
     }
 
+    private List<KuaishouBatchCampaignPreview> getCampaignList(List<KuaishouBatchCampaignPreview> campaignPreviewList, List<KuaishouBatchGroupPreview> kuaishouBatchGroupPreviews, List<KuaishouBatchCreativePreview> kuaishouBatchCreativePreviews) {
+        List<KuaishouBatchGroupPreview> groups = new ArrayList<>();
+
+        for (KuaishouBatchGroupPreview groupPreview : kuaishouBatchGroupPreviews) {
+            JSONArray materialArr = new JSONArray();
+            JSONArray descriptionArr = new JSONArray();
+            for (KuaishouBatchCreativePreview creativePreview : kuaishouBatchCreativePreviews) {
+                if (groupPreview.getPlanId().equals(creativePreview.getPlanId()) && creativePreview.getGroupId().equals(groupPreview.getId())) {
+                    JSONObject obj = new JSONObject();
+                    obj.put("photoId", creativePreview.getPhotoId());
+                    obj.put("imageUrl", creativePreview.getImageUrl());
+                    materialArr.add(obj);
+                    descriptionArr.add(creativePreview.getDescription());
+                    groupPreview.setSiteId(creativePreview.getSiteId());
+                    groupPreview.setClickTrackUrl(creativePreview.getClickTrackUrl());
+                    groupPreview.setActionbarClickUrl(creativePreview.getActionbarClickUrl());
+                }
+            }
+            QueryWrapper<KuaishouTemplate> queryWrapper = new QueryWrapper();
+            queryWrapper.eq("template_id", groupPreview.getTemplateId());
+            KuaishouTemplate template = kuaishouTemplateService.getOne(queryWrapper);
+            if (!Check.isNull(template)) {
+                groupPreview.setTemplateName(template.getTemplateName());
+            }
+            groupPreview.setMaterialArr(materialArr);
+            groupPreview.setDescriptionArr(descriptionArr);
+            groups.add(groupPreview);
+        }
+        List<KuaishouBatchCampaignPreview> campaigns = new ArrayList<>();
+        for (KuaishouBatchCampaignPreview campaignPreview : campaignPreviewList) {
+            List<KuaishouBatchGroupPreview> groupList = new ArrayList<>();
+            for (KuaishouBatchGroupPreview group : groups) {
+                if (campaignPreview.getId().equals(group.getPlanId())) {
+                    groupList.add(group);
+                }
+            }
+            campaignPreview.setKuaishouBatchGroupPreviews(groupList);
+            campaigns.add(campaignPreview);
+        }
+        return campaigns;
+    }
+
     @Override
     public void addPreviewData(JSONObject data) throws Exception {
         String batchId = data.getString("batchId");
@@ -121,7 +176,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         //应用分配方式 1 按账户,2按广告计划,3按广告组
         Integer appAllocation = appList.getInteger("appAllocation");
         Integer appId = null;
-        Integer siteId = null;
+        Long siteId = null;
         String url = null;
         JSONArray appArr = appList.getJSONArray("appArr");
         JSONArray urlArr = appList.getJSONArray("urlArr");
@@ -140,7 +195,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         if (appAllocation == 1) {
             if (appNoNull) {
                 appId = appArr.getJSONObject(0).getInteger("appId");
-                siteId = appArr.getJSONObject(0).getInteger("siteId");
+                siteId = appArr.getJSONObject(0).getLong("siteId");
             }
             if (urlNoNull) {
                 url = urlArr.getString(0);
@@ -182,7 +237,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                 if (appAllocation == 2) {
                     if (appNoNull) {
                         appId = appArr.getJSONObject(i).getInteger("appId");
-                        siteId = appArr.getJSONObject(i).getInteger("siteId");
+                        siteId = appArr.getJSONObject(i).getLong("siteId");
                     }
                     if (urlNoNull) {
                         url = urlArr.getString(i);
@@ -197,14 +252,14 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                     }
                 }
                 campaignPreview.setId(null);
-                campaignPreview.setCampaignName(campaignPreview.getCampaignName() + i);
+                campaignPreview.setCampaignName(getName(campaignPreview.getCampaignName(), null, null, appId, null) + i);
                 campaignPreviewMapper.insert(campaignPreview);
                 for (int j = 0; j < materialList.size(); j++) {
                     if (appAllocation == 3) {
                         appCount--;
                         if (appNoNull) {
                             appId = appArr.getJSONObject(appCount).getInteger("appId");
-                            siteId = appArr.getJSONObject(appCount).getInteger("siteId");
+                            siteId = appArr.getJSONObject(appCount).getLong("siteId");
                         }
                         if (urlNoNull) {
                             url = urlArr.getString(appCount);
@@ -223,7 +278,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                     groupPreview.setAppId(appId);
                     groupPreview.setPlanId(campaignPreview.getId());
                     groupPreview.setTemplateId(targetIds.getLong(i));
-                    groupPreview.setUnitName(groupPreview.getUnitName() + j);
+                    groupPreview.setUnitName(getName(groupPreview.getUnitName(), targetIds.getLong(i), groupPreview.getSceneId(), appId, groupPreview.getUnitType()) + j);
                     groupPreview.setUrl(url);
                     groupPreviewMapper.insert(groupPreview);
                     JSONObject material = materialList.getJSONObject(j);
@@ -266,7 +321,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                 if (appAllocation == 2) {
                     if (appNoNull) {
                         appId = appArr.getJSONObject(i).getInteger("appId");
-                        siteId = appArr.getJSONObject(i).getInteger("siteId");
+                        siteId = appArr.getJSONObject(i).getLong("siteId");
                     }
                     if (urlNoNull) {
                         url = urlArr.getString(i);
@@ -281,7 +336,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                     }
                 }
                 campaignPreview.setId(null);
-                campaignPreview.setCampaignName(campaignPreview.getCampaignName() + i);
+                campaignPreview.setCampaignName(getName(campaignPreview.getCampaignName(), null, null, appId, null) + i);
                 campaignPreviewMapper.insert(campaignPreview);
                 JSONObject material = materialList.getJSONObject(i);
                 JSONArray photoArr = material.getJSONArray("photoArr");
@@ -294,7 +349,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                         appCount--;
                         if (appNoNull) {
                             appId = appArr.getJSONObject(appCount).getInteger("appId");
-                            siteId = appArr.getJSONObject(appCount).getInteger("siteId");
+                            siteId = appArr.getJSONObject(appCount).getLong("siteId");
                         }
                         if (urlNoNull) {
                             url = urlArr.getString(appCount);
@@ -313,7 +368,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
                     groupPreview.setAppId(appId);
                     groupPreview.setPlanId(campaignPreview.getId());
                     groupPreview.setTemplateId(targetIds.getLong(j));
-                    groupPreview.setUnitName(groupPreview.getUnitName() + j);
+                    groupPreview.setUnitName(getName(groupPreview.getUnitName(), targetIds.getLong(i), groupPreview.getSceneId(), appId, groupPreview.getUnitType()) + j);
                     groupPreview.setUrl(url);
                     groupPreviewMapper.insert(groupPreview);
                     for (int k = 0; k < photoArr.size(); k++) {
@@ -386,6 +441,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         KuaishouBatchCampaignPreview campaignPreview = new KuaishouBatchCampaignPreview();
         campaignPreview.setAccountId(campaignJson.getLong("accountId"));
         campaignPreview.setCampaignName(campaignJson.getString("campaignName"));
+        campaignPreview.setCampaignNameFormat(campaignJson.getString("campaignName"));
         campaignPreview.setCampaignType(campaignJson.getInteger("campaignType"));
         campaignPreview.setPutStatus(campaignJson.getInteger("campaignStatus"));
         campaignPreview.setDayBudget(campaignJson.getInteger("dayBudget"));
@@ -408,6 +464,7 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         KuaishouBatchGroupPreview groupPreview = new KuaishouBatchGroupPreview();
         groupPreview.setAccountId(groupJson.getLong("accountId"));
         groupPreview.setUnitName(groupJson.getString("unitName"));
+        groupPreview.setUnitNameFormat(groupJson.getString("unitName"));
         groupPreview.setPutStatus(campaignJson.getInteger("unitStatus") == 2 ? 2 : null);
         groupPreview.setBidType(groupJson.getInteger("bidType"));
         if (groupJson.getInteger("bidType") == 2) {
@@ -472,4 +529,97 @@ public class KuaishouBatchCampaignPreviewServiceImpl extends ServiceImpl<Kuaisho
         return creativePreview;
     }
 
+    /**
+     * @param content    通配符String
+     * @param templateId 定向模板ID
+     * @param sceneId    广告位置ID
+     * @param appId      应用包id、渠道号
+     * @param unitType   创意制作方式
+     * @return
+     */
+    private String getName(String content, Long templateId, String sceneId, Integer appId, Integer unitType) {
+        String reg = "\\{\\{(.+?)\\}\\}";
+        List<String> params = getParams(reg, content);
+        if (Check.isNull(params)) {
+            return content;
+        }
+        Map<String, String> data = new HashMap<>();
+        for (int i = 0; i < params.size(); i++) {
+            String regName = params.get(i);
+            if ("日期".equals(regName)) {
+                data.put(regName, DateUtils.getNowDate("yyyy-MM-dd"));
+            } else if ("定向包".equals(regName)) {
+                if (!Check.isNull(templateId)) {
+                    QueryWrapper<KuaishouTemplate> queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("template_id", templateId);
+                    KuaishouTemplate template = kuaishouTemplateService.getOne(queryWrapper);
+                    data.put(regName, template.getTemplateName());
+                }
+            } else if ("广告位置".equals(regName)) {
+                if (!Check.isNull(sceneId)) {
+                    Integer sceneid = JSONObject.parseArray(sceneId).getInteger(0);
+                    if (sceneid == 1 || sceneid == 5) {
+                        data.put(regName, SceneIdEnum.getEnumById(sceneid).getName());
+                    } else {
+                        data.put(regName, "场景广告位");
+                    }
+                }
+            } else if ("应用名称".equals(regName)) {
+                if (!Check.isNull(appId)) {
+                    QueryWrapper<KuaiShouAppList> queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("app_id", appId);
+                    KuaiShouAppList one = kuaiShouAppListService.getOne(queryWrapper);
+                    data.put(regName, one.getAppName());
+                }
+            } else if ("渠道号".equals(regName)) {
+                if (!Check.isNull(appId)) {
+                    QueryWrapper<KuaiShouAppList> queryWrapper = new QueryWrapper();
+                    queryWrapper.eq("app_id", appId);
+                    KuaiShouAppList one = kuaiShouAppListService.getOne(queryWrapper);
+                    data.put(regName, one.getAppVersion());
+                }
+            } else if ("创意制作方式".equals(regName)) {
+                if (!Check.isNull(unitType)) {
+                    data.put(regName, unitType == 4 ? "自定义" : "程序化创意2.0");
+                }
+            }
+        }
+        String text = parse(reg, content, data);
+        return text;
+    }
+
+
+    public static String parse(String pattern, String content, Map<String, String> data) {
+        Pattern p = Pattern.compile(pattern);
+        Matcher m = p.matcher(content);
+
+        StringBuffer sb = new StringBuffer();
+        while (m.find()) {
+            String key = m.group(1);
+            String value = data.get(key);
+            m.appendReplacement(sb, value == null ? "" : value);
+        }
+        m.appendTail(sb);
+        return sb.toString();
+    }
+
+    /**
+     * 根据正则表达式获取文本中的变量名列表
+     *
+     * @param pattern
+     * @param content
+     * @return
+     */
+    public static List<String> getParams(String pattern, String content) {
+        Pattern p = Pattern.compile(pattern);
+        Matcher m = p.matcher(content);
+
+        List<String> result = new ArrayList<String>();
+        while (m.find()) {
+            result.add(m.group(1));
+        }
+        return result;
+    }
+
+
 }

+ 7 - 0
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/service/impl/KuaishouGroupExploreServiceImpl.java

@@ -10,6 +10,7 @@ import cn.com.ctop.kuaishou.modules.report.entity.KuaishouGroupExplore;
 import cn.com.ctop.kuaishou.modules.report.mapper.KuaishouGroupExploreMapper;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouGroupExploreService;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
@@ -203,6 +204,12 @@ public class KuaishouGroupExploreServiceImpl extends ServiceImpl<KuaishouGroupEx
                     if (Check.isNull(kuaishouGroupExplore)) {
                         return Result.error("查询失败,结果为空");
                     }
+                    QueryWrapper<KuaishouGroupExplore> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("unit_id", kuaishouGroupExplore.getUnitId());
+                    KuaishouGroupExplore one = this.getOne(queryWrapper);
+                    if (!Check.isNull(one)) {
+                        kuaishouGroupExplore.setId(one.getId());
+                    }
                     kuaishouGroupExplore.setAccountId(accountId);
                     this.saveOrUpdate(kuaishouGroupExplore);
                     return Result.ok("添加成功");