jiequan.bi преди 4 години
родител
ревизия
6db4937682
променени са 19 файла, в които са добавени 519 реда и са изтрити 125 реда
  1. 13 22
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  2. 1 1
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/FileInfoServiceImpl.java
  3. 8 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/RestUtils.java
  4. 15 19
      module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/impl/MaterialUploadServiceImpl.java
  5. 20 48
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CreateAdlabController.java
  6. 24 17
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CtopAdlabProjectDetailController.java
  7. 1 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/entity/CtopAdlabProjectDetail.java
  8. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/ICtopAdlabProjectDetailService.java
  9. 20 12
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CreateProjectServiceImpl.java
  10. 72 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CtopAdlabProjectDetailServiceImpl.java
  11. 7 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/UpdateProjectServiceImpl.java
  12. 51 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceVideoReportCtrl.java
  13. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceVideoReportMapper.java
  14. 90 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceVideoReportMapper.xml
  15. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceVideoReportService.java
  16. 23 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceVideoReportServiceImpl.java
  17. 0 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ByteDanceQueryToolController.java
  18. 3 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ParseInstallPackageController.java
  19. 142 0
      module-toutiao/src/main/resources/json_template/bytedance_video_report_mapping.json

+ 13 - 22
jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java

@@ -12,16 +12,13 @@ import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouDailyReportTaskService;
 import cn.com.ctop.kuaishou.modules.batch.service.IKuaiShouHistoryReportTaskService;
-import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
 import cn.com.ctop.kuaishou.modules.report.service.IKuaishouReportDailyAgentService;
-import cn.com.ctop.oa.modules.service.IWechatCheckinDataService;
-import cn.com.ctop.oa.modules.service.IWechatDepartmentService;
-import cn.com.ctop.oa.modules.service.IWechatUserListService;
 import cn.com.ctop.toutiao.modules.material.service.IByteDanceAdvertiserDataService;
 import cn.com.ctop.toutiao.modules.report.service.IReportService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.constant.SystemDateConstant;
 import org.jeecg.common.util.DateUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,7 +37,7 @@ import java.util.concurrent.Executors;
 
 @RunWith(SpringRunner.class)
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-@ActiveProfiles("wps")
+@ActiveProfiles("test")
 @Slf4j
 public class SampleTest {
     @Autowired
@@ -58,25 +55,8 @@ public class SampleTest {
     @Autowired
     private IKuaiShouDailyReportTaskService dailyReportTaskService;
 
-    @Autowired
-    private IWechatDepartmentService wechatDepartment;
-    @Autowired
-    private IKuaishouInterfaceService kuaishouInterfaceService;
-    @Autowired
-    private IWechatUserListService wechatUserInfoService;
-    @Autowired
-    private IWechatCheckinDataService wechatCheckinDataService;
 
 
-    @Test
-    public void getDepartment() {
-        wechatCheckinDataService.getCheckinData();
-        //  wechatUserInfoService.getUserList();
-        // wechatDepartment.getDepartment();
-        // kuaishouInterfaceService.getSuZaoList("a34853c230e1b949eddbe569023dbc40", 7022550L, 1, "2020-09-15", "2020-09-16");
-
-    }
-
 
     @Test
     public void loadBytedanceCreativeData() {
@@ -200,6 +180,17 @@ public class SampleTest {
         CtopOauthToken token = oauthTokenService.getTokenByAccountId(1665922219192387L);
         reportService.getAdvertiserReport(token, DateUtils.parseDate("2020-09-01", "yy-MM-dd"), DateUtils.parseDate("2020-09-01", "yy-MM-dd"), CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
     }
+    @Autowired
+    private ICtopOauthTokenService tokenService;
+
+    @Test
+    public void loadAllHourReport(){
+        List<CtopOauthToken> tokens = tokenService.selectToutiaoToken();
+        String getDate="2020-09-17";
+        tokens.forEach(token -> {
+            reportService.getAdvertiserReport(token, DateUtils.parseDate(getDate, SystemDateConstant.yyyy_MM_dd), DateUtils.parseDate(getDate, SystemDateConstant.yyyy_MM_dd), CtopAdConstant.BYTEDANCE_REPORT_TYPE_HOURLY);
+        });
+    }
 
     @Autowired
     IUReportExportService uReportExportService;

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

@@ -180,7 +180,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         // 其他参数
         entityBuilder.addTextBody("advertiser_id", advertiserId);
         entityBuilder.addTextBody("upload_type", BytedanceInterfaceConstant.UPLOAD_TYPE_BY_URL);
-        entityBuilder.addTextBody("image_url", "https:" + imageUrl);
+        entityBuilder.addTextBody("image_url", imageUrl);
 
         HttpEntity entity = entityBuilder.build();
         CloseableHttpResponse response = null;

+ 8 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/RestUtils.java

@@ -0,0 +1,8 @@
+package cn.com.ctop.common.module.utils;
+
+/**
+ *  Created by JQ.bi on 2020.9.23
+ */
+public class RestUtils {
+
+}

+ 15 - 19
module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/impl/MaterialUploadServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.ctop.manage.modules.material.service.impl;
 import cn.com.ctop.common.module.entity.*;
 import cn.com.ctop.common.module.enums.MaterialEnum;
 import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.common.module.mapper.MaterialImageInfoMapper;
 import cn.com.ctop.common.module.mapper.MaterialInfoMapper;
 import cn.com.ctop.common.module.service.*;
 import cn.com.ctop.common.module.utils.Check;
@@ -47,7 +48,8 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
     private CtopOauthTokenMapper oauthTokenMapper;
     @Autowired
     private MaterialInfoMapper materialInfoMapper;
-
+    @Autowired
+    MaterialImageInfoMapper materialImageInfoMapper;
     @Autowired
     private IFileInfoService fileInfoService;
     @Autowired
@@ -65,7 +67,6 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
     @Autowired
     private IProjectService projectService;
 
-
     /**
      * 同步素材到账号下
      *
@@ -73,7 +74,6 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
      * @param materialArray
      * @param accountArray
      */
-
     @Override
     public void uploadAccount(String mediaId, JSONArray materialArray, JSONArray accountArray, String userId) {
         try {
@@ -91,12 +91,17 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
         for (int j = 0; j < materialArray.size(); j++) {
             String materialId = materialArray.getString(j);
             MaterialInfo materialInfo = materialInfoMapper.selectById(materialId);
-            if (Check.isNull(materialInfo) || Check.isNull(materialInfo.getUrl())) {
+            MaterialImageInfo materialImageInfo= materialImageInfoMapper.selectById(materialId);
+            if (Check.isNull(materialInfo)&&Check.isNull(materialImageInfo)) {
                 continue;
-
             }
             try {
-                String url = materialInfo.getUrl();
+                String url = "";
+                if(Check.isNull(materialInfo)){
+                    url= (String) materialImageInfo.getUrl();
+                }else {
+                    url= materialInfo.getUrl();
+                }
                 String localUrl = LoadFileUtil.downLoadFromUrl(url, downloadUrl);
 
                 for (int i = 0; i < accountArray.size(); i++) {
@@ -104,16 +109,17 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                     if (Check.isNull(accountId)) {
                         continue;
                     }
+                    String finalUrl = url;
                     touTiaoExecutorService.submit(new Runnable() {
                         @Override
                         public void run() {
                             try {
                                 log.info("头条文件多线程上传:{},accountId:{}", Thread.currentThread().getName(), accountId);
-                                if ("VIDEO".equals(materialInfo.getType())) {
+                                if (materialInfo!=null&&"VIDEO".equals(materialInfo.getType())) {
                                     fileInfoService.uploadVideoToBytedance(String.valueOf(accountId), localUrl, userId, materialInfo.getMaterialName());
 
-                                } else if ("IMAGE".equals(materialInfo.getType())) {
-                                    fileInfoService.uploadImageToBytedance(String.valueOf(accountId), localUrl);
+                                } else if ("IMAGE".equals(materialImageInfo.getType())) {
+                                    fileInfoService.uploadImageToBytedance(String.valueOf(accountId), finalUrl);
                                 }
                             } catch (Exception e) {
                                 e.printStackTrace();
@@ -125,10 +131,8 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                 e.printStackTrace();
             }
         }
-
     }
 
-
     private void kuaiShouUpload(String mediaId, JSONArray materialArray, JSONArray accountArray, String userId) {
         for (int j = 0; j < materialArray.size(); j++) {
             String materialId = materialArray.getString(j);
@@ -236,7 +240,6 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                                         sendMessageService.sendMessage(userId, message);
                                     }
                                 }
-
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
@@ -244,20 +247,13 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                     });
 
                 }
-                /*boolean isTrue = LoadFileUtil.delFile(localUrl);
-                if (isTrue) {
-                    log.info("删除本地缓存素材成功,code:{}", materialInfo.getCode());
-                }*/
-
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
 
-
     }
 
-
     private String exceptInfoForRestTemplate(String url, Map<String, Object> paramMap, Map<String, String> headerMap) {
         try {
             long l = System.currentTimeMillis();

+ 20 - 48
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CreateAdlabController.java

@@ -1,33 +1,18 @@
 package cn.com.ctop.toutiao.modules.adlab.controller;
 
-import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
-import cn.com.ctop.common.module.entity.MaterialImageInfo;
-import cn.com.ctop.common.module.entity.MaterialInfo;
-import cn.com.ctop.common.module.entity.Project;
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
-import cn.com.ctop.common.module.service.IMaterialInfoService;
-import cn.com.ctop.common.module.utils.Check;
-import cn.com.ctop.common.module.utils.JsonUtil;
-import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProjectDetail;
 import cn.com.ctop.toutiao.modules.adlab.service.ICreateProjectService;
 import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectDetailService;
-import cn.com.ctop.toutiao.modules.adlab.service.IGetProjectService;
-import cn.com.ctop.toutiao.modules.report.entity.ByteDanceCleanMaterialReport;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.util.DateUtils;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -43,8 +28,8 @@ public class CreateAdlabController {
     ICtopOauthTokenService ctopOauthTokenService;
     @Autowired
     ICtopAdlabProjectDetailService adlabProjectDetailService;
-    @Autowired
-    IGetProjectService getProjectService;
+
+
     /**
      *  投放管家创建项目第一步
      */
@@ -164,14 +149,13 @@ public class CreateAdlabController {
     public Result<List<JSONObject>> setCreative(@RequestBody JSONArray requestBody){
         Result<List<JSONObject>> result =new Result<>();
         List<JSONObject> resultList=new ArrayList<>();
-        log.info(requestBody.toJSONString());
         if(requestBody.size()>0){
             requestBody.forEach(convert->{
                 Map<String,Object> convert2Map=  (Map<String,Object>)convert;
                 JSONObject repoTemp=new JSONObject();
                 CtopOauthToken token = ctopOauthTokenService.getTokenByAccountId((Long) convert2Map.get("accountId"));
                 JSONObject repo = createProjectService.updateGroupCreative(token, convert2Map);
-                log.info(repo.toJSONString());
+
                 if(repo.getInteger("code")==0){
                     repoTemp.put("code",0);
                     repoTemp.put("accountId",convert2Map.get("accountId"));
@@ -200,49 +184,37 @@ public class CreateAdlabController {
      *  投放管家创建项目第五步,设置项目预算信息
      */
     @PostMapping(value = "/setBudget")
-    public Result<List<JSONObject>> setBudget(@RequestBody JSONObject requestBody){
+    public Result<List<JSONObject>> setBudget(@RequestBody JSONArray requestBody ){
 
         Result<List<JSONObject>> result =new Result<>();
-        JSONArray accountIds=requestBody.getJSONArray("accountIds");
-        if(accountIds.isEmpty()){
-            result.error500("请选择账户再继续操作");
-        }else{
-            List<JSONObject> resultList=new ArrayList<>();
-            accountIds.forEach(accountId->{
-                //临时存每一个账户创建后的数据
+        List<JSONObject> resultList=new ArrayList<>();
+        if(requestBody.size()>0){
+            requestBody.forEach(convert->{
+                Map<String,Object> convert2Map=  (Map<String,Object>)convert;
                 JSONObject repoTemp=new JSONObject();
-                requestBody.put("accountId",accountId);
-                //查询该账户的token
-                CtopOauthToken token = ctopOauthTokenService.getTokenByAccountId((Long) accountId);
-                JSONObject repo = createProjectService.updateGroupBudget(token, requestBody);
+                CtopOauthToken token = ctopOauthTokenService.getTokenByAccountId((Long) convert2Map.get("accountId"));
+                JSONObject repo = createProjectService.updateGroupBudget(token, convert2Map);
+                log.info(repo.toJSONString());
                 if(repo.getInteger("code")==0){
                     repoTemp.put("code",0);
-                    repoTemp.put("accountId",accountId);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
                     repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    repoTemp.put("userId",repo.getString("userId"));
                 }else{
                     repoTemp.put("code",500);
                     repoTemp.put("message",repo.getString("message"));
-                    repoTemp.put("accountId",accountId);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
                 }
                 resultList.add(repoTemp);
             });
-            //设置预算信息完成后,回写数据到数据
-            putStorage(resultList);
+            //
+            adlabProjectDetailService.putStorage(resultList);
             result.setResult(resultList);
             result.setSuccess(true);
+        }else {
+            result.error500("请选择需要设置定向信息的项目");
         }
         return result;
     }
 
-    /**
-     * 新建投放管家项目入库
-     */
-    private void putStorage(List<JSONObject> params){
-        params.forEach(it->{
-            JSONObject group = getProjectService.getGroup(ctopOauthTokenService.getTokenByAccountId(it.getLong("accountId")), it.getLong("accountId"), it.getLong("groupId"));
-            if(group.getInteger("code")==0){
-                adlabProjectDetailService.save((CtopAdlabProjectDetail) group.getJSONObject("data").get("group_info"));
-            }
-        });
-    }
 }

+ 24 - 17
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CtopAdlabProjectDetailController.java

@@ -1,6 +1,8 @@
 package cn.com.ctop.toutiao.modules.adlab.controller;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -91,21 +93,28 @@ public class CtopAdlabProjectDetailController {
 	@PostMapping(value = "/edit")
 	public Result<CtopAdlabProjectDetail> edit(@RequestBody JSONArray requestBody) {
 		Result<CtopAdlabProjectDetail> result = new Result<>();
-		CtopAdlabProjectDetail ctopAdlabProjectDetail=new CtopAdlabProjectDetail();
-		ctopAdlabProjectDetail.setOptStatus((String) ((Map)requestBody.get(0)).get("optStatus"));
-		requestBody.forEach(it->{
-			Map<String,Object> temp= (Map<String,Object>)it;
-			//先更新头条后台数据
-			JSONObject repo = updateProjectService.updateGroupStatus(oauthTokenService.getTokenByAccountId((Long) temp.get("accountId")), temp);
-			QueryWrapper<CtopAdlabProjectDetail> queryWrapper= new QueryWrapper<>();
-			queryWrapper.eq("account_id",temp.get("accountId"));
-			queryWrapper.eq("group_id",temp.get("groupId"));
-			if(repo.getInteger("code")==0){
-				ctopAdlabProjectDetailService.update(ctopAdlabProjectDetail,queryWrapper);
-			}else {
-				result.error500(repo.getString("message"));
-			}
-		});
+		if(requestBody.isEmpty()){
+			result.error500("请选择数据");
+		}else {
+			CtopAdlabProjectDetail ctopAdlabProjectDetail=new CtopAdlabProjectDetail();
+			ctopAdlabProjectDetail.setOptStatus((String) ((Map)requestBody.get(0)).get("optStatus"));
+			requestBody.forEach(it->{
+				Map<String,Object> temp= (Map<String,Object>)it;
+				//先更新头条后台数据
+				JSONObject repo = updateProjectService.updateGroupStatus(oauthTokenService.getTokenByAccountId((Long) temp.get("accountId")), temp);
+				List<JSONObject> params=new ArrayList<>();
+				JSONObject  jsonObject=new JSONObject();
+				jsonObject.put("accountId",temp.get("accountId"));
+				jsonObject.put("groupId",temp.get("groupId"));
+				jsonObject.put("userId",temp.get("userId"));
+				params.add(jsonObject);
+				if(repo.getInteger("code")==0){
+					ctopAdlabProjectDetailService.putStorage(params);
+				}else {
+					result.error500(repo.getString("message"));
+				}
+			});
+		}
 		return result;
 	}
 
@@ -117,7 +126,6 @@ public class CtopAdlabProjectDetailController {
 		try {
 			ctopAdlabProjectDetailService.removeById(id);
 		} catch (Exception e) {
-			log.error("删除失败",e.getMessage());
 			return Result.error("删除失败!");
 		}
 		return Result.ok("删除成功!");
@@ -153,5 +161,4 @@ public class CtopAdlabProjectDetailController {
 		}
 		return result;
 	}
-
 }

+ 1 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/entity/CtopAdlabProjectDetail.java

@@ -14,7 +14,7 @@ import lombok.Data;
 public class CtopAdlabProjectDetail {
     
 	/**id*/
-	@TableId(type = IdType.AUTO)
+	@TableId
 	private Long id;
 	/**name*/
 	private String name;

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

@@ -1,11 +1,16 @@
 package cn.com.ctop.toutiao.modules.adlab.service;
 
 import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProjectDetail;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * @Description: 投放管家项目详情
  */
 public interface ICtopAdlabProjectDetailService extends IService<CtopAdlabProjectDetail> {
 
+    void putStorage(List<JSONObject> params);
+
 }

+ 20 - 12
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CreateProjectServiceImpl.java

@@ -5,6 +5,7 @@ import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.toutiao.modules.adlab.constants.CreateProjectUrlConstant;
 import cn.com.ctop.toutiao.modules.adlab.service.ICreateProjectService;
 import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -13,8 +14,9 @@ import java.util.List;
 import java.util.Map;
 
 /**
- *  Created by JQ.bi on 2020.09.02
+ * Created by JQ.bi on 2020.09.02
  */
+@Slf4j
 @Service
 public class CreateProjectServiceImpl implements ICreateProjectService {
 
@@ -87,19 +89,20 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
     }
 
     @Override
-    public JSONObject updateGroupCreative(CtopOauthToken oauthToken, Map<String,Object> requestBody) {
+    public JSONObject updateGroupCreative(CtopOauthToken oauthToken, Map<String, Object> requestBody) {
 
         //请求头**
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "application/json");
         headers.put("Access-Token", oauthToken.getAccessToken());
+        log.info(oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
         params.put("advertiser_id", requestBody.get("accountId"));
         params.put("group_id", requestBody.get("groupId"));
         params.put("image_info", requestBody.get("imageInfo"));
         params.put("video_info", requestBody.get("videoInfo"));
-        params.put("title", requestBody.get("scenario"));
+        params.put("title", requestBody.get("title"));
         params.put("app_name", requestBody.get("appName"));
         params.put("source", requestBody.get("source"));
         params.put("is_follow_material", requestBody.get("isFollowMaterial"));
@@ -114,12 +117,12 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
             params.put("video_play_effective_track_url", requestBody.get("videoPlayEffectiveTrackUrl"));
         }
         params.put("creative_auto_generate_switch", requestBody.get("creativeAutoGenerateSwitch"));
-
+        log.info(params.toJSONString());
         return JSONObject.parseObject(HttpUtils.httpPostRequest(CreateProjectUrlConstant.ADLAB_GROUP_CREATIVE_UPDATE, params, headers));
     }
 
     @Override
-    public JSONObject updateGroupBudget(CtopOauthToken oauthToken, Map<String,Object> requestBody) {
+    public JSONObject updateGroupBudget(CtopOauthToken oauthToken, Map<String, Object> requestBody) {
 
         //请求头**
         Map<String, String> headers = new HashMap<>();
@@ -145,15 +148,20 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
     private List<List<Integer>> weekTimeHandle(String weekTime) {
         List<List<Integer>> weekTime2List = null;
         if (!weekTime.isEmpty() || (weekTime.contains("0") && weekTime.contains("1"))) {
-            weekTime2List=new ArrayList();
+            weekTime2List = weekTime2List = new ArrayList();
             char[] chars = weekTime.toCharArray();
-            for(int i=0;i<chars.length;i++){
-                List<Integer> temp=new ArrayList<>();
-                if((i+1)%48==0){
+            List<Integer> temp = new ArrayList<>();
+            for (int i = 0; i < chars.length; i++) {
+                if ((i + 1) % 48 == 0) {
+                    if (chars[i] == '1') {
+                        temp.add(i % 48);
+                    }
                     weekTime2List.add(temp);
-                    temp.clear();
-                }else{
-                    temp.add(i);
+                    temp = new ArrayList<>();
+                } else {
+                    if (chars[i] == '1') {
+                        temp.add(i % 48);
+                    }
                 }
             }
         }

+ 72 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CtopAdlabProjectDetailServiceImpl.java

@@ -1,15 +1,87 @@
 package cn.com.ctop.toutiao.modules.adlab.service.impl;
 
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProjectDetail;
 import cn.com.ctop.toutiao.modules.adlab.mapper.CtopAdlabProjectDetailMapper;
 import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectDetailService;
+import cn.com.ctop.toutiao.modules.adlab.service.IGetProjectService;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 投放管家项目详情
  */
 @Service
 public class CtopAdlabProjectDetailServiceImpl extends ServiceImpl<CtopAdlabProjectDetailMapper, CtopAdlabProjectDetail> implements ICtopAdlabProjectDetailService {
 
+    @Autowired
+    ICtopOauthTokenService ctopOauthTokenService;
+
+    @Autowired
+    private IGetProjectService getProjectService;
+
+    @Autowired
+    ICtopAdlabProjectDetailService adlabProjectDetailService;
+
+    /**
+     * 新建投放管家项目入库
+     */
+    public void putStorage(List<JSONObject> params){
+        params.forEach(it->{
+            JSONObject group = getProjectService.getGroup(ctopOauthTokenService.getTokenByAccountId(it.getLong("accountId")), it.getLong("accountId"), it.getLong("groupId"));
+            if(group.getInteger("code")==0){
+                CtopAdlabProjectDetail ctopAdlabProjectDetail=new CtopAdlabProjectDetail();
+                JSONObject projectDetailJSONObject=group.getJSONObject("data").getJSONObject("group_info");
+                ctopAdlabProjectDetail.setId(it.getLong("groupId"));
+                ctopAdlabProjectDetail.setAccountId(it.getLong("accountId"));
+                ctopAdlabProjectDetail.setUserId(it.getString("userId"));
+                ctopAdlabProjectDetail.setName(projectDetailJSONObject.getString("name"));
+                ctopAdlabProjectDetail.setCampaignId(projectDetailJSONObject.getLong("campaign_id"));
+                ctopAdlabProjectDetail.setScenario(projectDetailJSONObject.getString("scenario"));
+                ctopAdlabProjectDetail.setDeliveryRange(projectDetailJSONObject.getString("delivery_range"));
+                ctopAdlabProjectDetail.setStatus(projectDetailJSONObject.getString("status"));
+                ctopAdlabProjectDetail.setOptStatus(projectDetailJSONObject.getString("opt_status"));
+                ctopAdlabProjectDetail.setStatusName(projectDetailJSONObject.getString("status_name"));
+                ctopAdlabProjectDetail.setStep(projectDetailJSONObject.getInteger("step"));
+                ctopAdlabProjectDetail.setPlatform(projectDetailJSONObject.getString("platform"));
+                ctopAdlabProjectDetail.setDownloadType(projectDetailJSONObject.getString("download_type"));
+                ctopAdlabProjectDetail.setPlatform(projectDetailJSONObject.getString("platform"));
+                ctopAdlabProjectDetail.setAppType(projectDetailJSONObject.getString("app_type"));
+                ctopAdlabProjectDetail.setUrl(projectDetailJSONObject.getString("url"));
+                ctopAdlabProjectDetail.setWebUrl(projectDetailJSONObject.getString("web_url"));
+                ctopAdlabProjectDetail.setAdlabPackage(projectDetailJSONObject.getString("package"));
+                ctopAdlabProjectDetail.setConvertName(projectDetailJSONObject.getString("convert_name"));
+                ctopAdlabProjectDetail.setConvertId(projectDetailJSONObject.getInteger("convert_id"));
+                ctopAdlabProjectDetail.setConvertMode(projectDetailJSONObject.getString("convert_mode"));
+                ctopAdlabProjectDetail.setInventoryType(projectDetailJSONObject.getString("inventory_type"));
+                ctopAdlabProjectDetail.setUnionVideoType(projectDetailJSONObject.getString("union_video_type"));
+                ctopAdlabProjectDetail.setAudience(projectDetailJSONObject.getString("audience"));
+                ctopAdlabProjectDetail.setAdCreative(projectDetailJSONObject.getString("ad_creative"));
+                ctopAdlabProjectDetail.setStartTime(projectDetailJSONObject.getString("start_time"));
+                ctopAdlabProjectDetail.setEndTime(projectDetailJSONObject.getString("end_time"));
+                ctopAdlabProjectDetail.setWeekTime(projectDetailJSONObject.getString("week_time"));
+                ctopAdlabProjectDetail.setBid(projectDetailJSONObject.getBigDecimal("bid"));
+                ctopAdlabProjectDetail.setBudget(projectDetailJSONObject.getBigDecimal("budget"));
+                ctopAdlabProjectDetail.setBudgetMode(projectDetailJSONObject.getString("budget_mode"));
+                ctopAdlabProjectDetail.setCompensation(projectDetailJSONObject.getString("compensation"));
+                ctopAdlabProjectDetail.setDeepBid(projectDetailJSONObject.getBigDecimal("deep_bid"));
+                ctopAdlabProjectDetail.setDeepBidType(projectDetailJSONObject.getString("deep_bid_type"));
+                ctopAdlabProjectDetail.setDeepExternalAction(projectDetailJSONObject.getString("deep_external_action"));
+                ctopAdlabProjectDetail.setStopStage(projectDetailJSONObject.getString("stop_stage"));
+                ctopAdlabProjectDetail.setTargetMode(projectDetailJSONObject.getString("target_mode"));
+                ctopAdlabProjectDetail.setDownloadMode(projectDetailJSONObject.getString("download_mode"));
+                ctopAdlabProjectDetail.setOpenUrl(projectDetailJSONObject.getString("open_url"));
+                ctopAdlabProjectDetail.setInventoryTypes(projectDetailJSONObject.getString("inventory_types"));
+                ctopAdlabProjectDetail.setAdTarget(projectDetailJSONObject.getString("ad_target"));
+                ctopAdlabProjectDetail.setLandingType(projectDetailJSONObject.getString("landing_type"));
+
+                adlabProjectDetailService.saveOrUpdate(ctopAdlabProjectDetail);
+            }
+        });
+    }
+
 }

+ 7 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/UpdateProjectServiceImpl.java

@@ -5,6 +5,7 @@ import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.toutiao.modules.adlab.constants.UpdateProjectUrlConstant;
 import cn.com.ctop.toutiao.modules.adlab.service.IUpdateProjectService;
 import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
@@ -12,6 +13,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+@Slf4j
 @Service
 public class UpdateProjectServiceImpl implements IUpdateProjectService {
 
@@ -22,11 +24,15 @@ public class UpdateProjectServiceImpl implements IUpdateProjectService {
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "application/json");
         headers.put("Access-Token", oauthToken.getAccessToken());
+        log.info(oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
         params.put("advertiser_id", requestBody.get("accountId"));
-        Long[] groupIds={(Long) requestBody.get("groupId")};
+        List<Long> groupIds= new ArrayList<>();
+        groupIds.add((Long) requestBody.get("groupId"));
         params.put("group_ids", groupIds);
+        params.put("opt_status",requestBody.get("optStatus"));
+        log.info(params.toJSONString());
 
         return JSONObject.parseObject(HttpUtils.httpPostRequest(UpdateProjectUrlConstant.ADLAB_GROUP_STATUS_UPDATE, params, headers));
     }

+ 51 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceVideoReportCtrl.java

@@ -0,0 +1,51 @@
+package cn.com.ctop.toutiao.modules.report.controller;
+
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceVideoReportService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *  Created by JQ.bi on 2020.09.21
+ */
+@Slf4j
+@RestController
+@RequestMapping("/ctop/byteDance/videoReport")
+public class BytedanceVideoReportCtrl {
+
+    @Autowired
+    IBytedanceVideoReportService bytedanceVideoReportService;
+
+    @PostMapping("/list")
+    public Result<List<JSONObject>> getListReport(@RequestBody JSONObject requestBody) {
+
+        Result<List<JSONObject>> result = new Result<>();
+        if (requestBody.isEmpty()) {
+            log.error("request body is empty");
+            result.setSuccess(false);
+        }
+        JSONArray accountIds = requestBody.getJSONArray("accountIds");
+        String startDate = requestBody.getString("startDate");
+        String endDate = requestBody.getString("endDate");
+        String target= requestBody.getString("target");
+        String order= requestBody.getString("order");
+        try {
+            List<JSONObject> listData= null;
+            result.setResult(listData);
+            result.setSuccess(true);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.setSuccess(false);
+        }
+        return result;
+    }
+
+}

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

@@ -0,0 +1,12 @@
+package cn.com.ctop.toutiao.modules.report.mapper;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface BytedanceVideoReportMapper {
+
+    List<JSONObject> queryVideoReportBy(@Param("accountIds") JSONArray accountIds,@Param("accountIds") String startDate,@Param("accountIds") String endDate,@Param("accountIds") String target,@Param("accountIds") String order);
+}

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

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.ctop.toutiao.modules.report.mapper.BytedanceAccountReportMapper">
+
+    <select id="queryTodayReportByAccount" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            ROUND(sum(cost),2) cost,
+            sum(show_num) showNum,
+            sum(click) click,
+            sum(convert_num) as convertNum
+        FROM
+            ctop_bytedance_report_advertiser_daily
+        WHERE
+            stat_datetime = #{statDate} '00:00:00'
+          AND advertiser_id= #{accountId}
+    </select>
+
+    <select id="queryTodaySumByHourGroupAccount" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        t2.account_id as accountId,
+        t2.auth_name as authName,
+        ${filed}
+        FROM ctop_bytedance_report_advertiser_hourly t1
+        left join ctop_user_allocation t2 on t1.advertiser_id=t2.account_id
+        WHERE t1.stat_datetime = #{statDate}
+        and t1.stat_hour &lt;= #{hour}
+        AND t1.advertiser_id in
+        <foreach item="item" index="index" collection="accountIds"
+                 open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        group by t1.advertiser_id
+        order by ${target} ${order}
+    </select>
+
+    <select id="queryTodaySumByHour" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        ROUND(sum(cost),2) cost,
+        sum(show_num) showNum,
+        sum(click) click,
+        sum(convert_num) as convertNum
+        FROM
+        ctop_bytedance_report_advertiser_hourly
+        WHERE
+        stat_datetime = #{statDate}
+        and stat_hour &lt;= #{hour}
+        AND advertiser_id in
+        <foreach item="item" index="index" collection="accountIds"
+                 open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="querySumByHour" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        ${filed}
+        FROM
+        ctop_bytedance_report_advertiser_hourly t1
+        WHERE
+        t1.stat_datetime = #{statDate}
+        and t1.stat_hour &lt;= #{hour}
+        AND t1.advertiser_id in
+        <foreach item="item" index="index" collection="accountIds"
+                 open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="queryTodayDetailReportBy" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        ROUND(sum(cost),2) cost,
+        sum(show_num) showNum,
+        sum(click) click,
+        sum(convert_num) as convertNum,
+        stat_hour as statHour
+        FROM
+        ctop_bytedance_report_advertiser_hourly
+        WHERE
+        stat_datetime = #{statDate}
+        AND advertiser_id in
+        <foreach item="item" index="index" collection="accountIds"
+                 open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        GROUP BY
+        stat_hour
+        ORDER BY
+        stat_hour ASC
+    </select>
+</mapper>

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

@@ -0,0 +1,12 @@
+package cn.com.ctop.toutiao.modules.report.service;
+
+import com.alibaba.fastjson.JSONArray;
+import netscape.javascript.JSObject;
+
+import java.util.List;
+
+public interface IBytedanceVideoReportService {
+
+    List<JSObject>  getVideoReportBy(JSONArray accountIds,String startDate,String endDate,String target,String order);
+
+}

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

@@ -0,0 +1,23 @@
+package cn.com.ctop.toutiao.modules.report.service.impl;
+
+import cn.com.ctop.toutiao.modules.report.mapper.BytedanceVideoReportMapper;
+import cn.com.ctop.toutiao.modules.report.service.IBytedanceVideoReportService;
+import com.alibaba.fastjson.JSONArray;
+import netscape.javascript.JSObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BytedanceVideoReportServiceImpl implements IBytedanceVideoReportService {
+
+    @Autowired
+    BytedanceVideoReportMapper bytedanceVideoReportMapper;
+
+    @Override
+    public List<JSObject> getVideoReportBy(JSONArray accountIds, String startDate, String endDate, String target, String order) {
+        return null;
+    }
+
+}

+ 0 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ByteDanceQueryToolController.java

@@ -63,7 +63,6 @@ public class ByteDanceQueryToolController {
         }
         return result;
     }
-
     @PostMapping(value="/queryImageInfo")
     public Result<JSONArray> queryImageInfo(@RequestBody JSONObject requestBody){
         Long accountId=requestBody.getLong("accountId");

+ 3 - 3
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ParseInstallPackageController.java

@@ -53,13 +53,13 @@ public class ParseInstallPackageController {
                 }
             }
             Map<String, String> packageInfo=new HashMap<>();
-            if(appType.equals("ANDROID")){
+            if(appType.equals("APP_ANDROID")){
                 packageInfo=ParseInstallPackageUtil.parseAPK(installPath);
-            }else if(appType.equals("IOS")){
+            }else if(appType.equals("APP_IOS")){
                 packageInfo=ParseInstallPackageUtil.parseIpa(installPath);
             }
             if(packageInfo.isEmpty()){
-                result.error500("解析安装包失败");
+                result.error500("请选择正确的安装包类型");
             }else {
                 result.setSuccess(true);
                 result.setResult(packageInfo);

+ 142 - 0
module-toutiao/src/main/resources/json_template/bytedance_video_report_mapping.json

@@ -0,0 +1,142 @@
+{
+  "cost": {
+    "filed": "sum(t1.cost) as cost ",
+    "comment": "消耗"
+  },
+  "showMaterial": {
+    "filed": "sum(t1.show_num) as showMaterial ",
+    "comment": "展示数"
+  },
+  "cpm": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.show_num) IS NULL THEN 0 ELSE ROUND((sum(t1.cost) / sum(t1.show_num)) * 1000, 2 ) END AS cpm ",
+    "comment": "平均千次展现费用"
+  },
+  "clickMaterial": {
+    "filed": "sum(t1.click) as clickMaterial ",
+    "comment": "点击数"
+  },
+  "ctr": {
+    "filed": "CASE WHEN sum(t1.click) / sum(t1.show_num) IS NULL THEN 0 ELSE CONCAT( ROUND((sum(t1.click) / sum(t1.show_num)) * 100,2),'%') END AS ctr ",
+    "comment": "点击率"
+  },
+  "cpc": {
+    "filed": "CASE WHEN sum(t1.click) / sum(t1.cost) IS NULL THEN 0 ELSE ROUND((sum(t1.cost) / sum(t1.click)), 2) END AS cpc ",
+    "comment": "平均点击单价"
+  },
+  "convertMaterial": {
+    "filed": "sum(t1.convert_num) as convertMaterial ",
+    "comment": "转化数"
+  },
+  "convertCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.convert_num) IS NULL THEN 0 ELSE ROUND((sum(t1.cost) / sum(t1.convert_num)), 2 ) END AS convertCost ",
+    "comment": "转化成本"
+  },
+  "convertRate": {
+    "filed": "CASE WHEN sum(t1.convert_num) / sum(t1.cost) IS NULL THEN 0 ELSE concat(round(sum(t1.convert_num) / sum(t1.cost)*100,2),'%') end AS convertRate ",
+    "comment": "转化率"
+  },
+  "downloadStart": {
+    "filed": "sum(download_start) as downloadStart ",
+    "comment": "安卓开始下载数"
+  },
+  "downloadStartCost": {
+    "filed": "CASE WHEN sum(t1.cost) / (t1.download_start) IS NULL THEN 0 ELSE sum(t1.cost) / sum(t1.download_start) end AS downloadStartCost ",
+    "comment": "安卓开始下载成本"
+  },
+  "downloadStartRate": {
+    "filed": "CASE WHEN sum(t1.download_start) / sum(t1.click) IS NULL THEN 0 ELSE concat(round(sum(t1.download_start) / sum(t1.click)*100,2),'%') end AS downloadStartRate ",
+    "comment": "安卓开始下载率"
+  },
+  "downloadFinish": {
+    "filed": "sum(download_finish) as downloadFinish ",
+    "comment": "安卓下载完成数"
+  },
+  "downloadFinishCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.download_finish) IS NULL THEN 0 ELSE  sum(t1.cost) / sum(t1.download_finish) end AS downloadFinishCost ",
+    "comment": "安卓下载完成成本"
+  },
+  "downloadFinishRate": {
+    "filed": "CASE WHEN sum(t1.install_finish) / sum(t1.download_finish) IS NULL THEN 0 ELSE  concat(round(sum(t1.install_finish) / sum(t1.download_finish)*100,2),'%') end AS downloadFinishRate ",
+    "comment": "安卓下载完成率"
+  },
+  "active": {
+    "filed": "sum(active) as active ",
+    "comment": "激活数"
+  },
+  "activeCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.active) IS NULL THEN 0 ELSE sum(t1.cost) / sum(t1.active) end AS activeCost ",
+    "comment": "激活成本"
+  },
+  "activeRate": {
+    "filed": "CASE WHEN sum(t1.active) / sum(t1.click) IS NULL THEN 0 ELSE concat(round(sum(t1.active) / sum(t1.click)*100,2),'%') end as activeRate ",
+    "comment": "激活率"
+  },
+  "register": {
+    "filed": "sum(t1.register) as register  ",
+    "comment": "注册数"
+  },
+  "activeRegisterCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.register) IS NULL THEN 0 ELSE round(sum(t1.cost)/sum(t1.register),3) end as activeRegisterCost ",
+    "comment": "注册成本"
+  },
+  "activeRegisterRate": {
+    "filed": " CASE WHEN sum(t1.register) / sum(t1.active) IS NULL THEN 0 ELSE concat(round(sum(t1.register) / sum(t1.active)*100,2),'%') end as activeRegisterRate ",
+    "comment": "注册率"
+  },
+  "nextDayOpen": {
+    "filed": "sum(t1.next_day_open) as nextDayOpen ",
+    "comment": "次留数"
+  },
+  "nextDayOpenCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.next_day_open) IS NULL THEN 0 ELSE round(sum(t1.cost)/sum(t1.next_day_open),3) end as nextDayOpenCost ",
+    "comment": "次留成本"
+  },
+  "nextDayOpenRate": {
+    "filed": "CASE WHEN sum(t1.next_day_open) / sum(t1.active) IS NULL THEN 0 ELSE concat(round(sum(t1.next_day_open) / sum(t1.active)*100,2),'%') end as nextDayOpenRate ",
+    "comment": "次留率"
+  },
+  "activePayAmount": {
+    "filed": "sum(pay_count) as activePayAmount ",
+    "comment": "付费数"
+  },
+  "activePayCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.pay_count) IS NULL THEN 0 ELSE round(sum(t1.cost)/sum(t1.pay_count),3) end as activePayCost ",
+    "comment": "付费成本"
+  },
+  "form": {
+    "filed": "sum(t1.form) as form ",
+    "comment": "表单提交"
+  },
+  "validPlayCost": {
+    "filed": "CASE WHEN sum(t1.cost) / sum(t1.valid_play) IS NULL THEN 0 ELSE round(sum(t1.cost)/sum(t1.valid_play),3) end as validPlayCost ",
+    "comment": "有效播放成本"
+  },
+  "play25FeedBreak": {
+    "filed": "sum(t1.play25_feed_break) as play25FeedBreak ",
+    "comment": "25%进度播放数"
+  },
+  "play50FeedBreak": {
+    "filed": "sum(t1.play50_feed_break) as play50FeedBreak",
+    "comment": "50%进度播放数"
+  },
+  "play75FeedBreak": {
+    "filed": "sum(t1.play75_feed_break) as play75FeedBreak",
+    "comment": "75%进度播放数"
+  },
+  "play100FeedBreak": {
+    "filed": "sum(t1.play100_feed_break) as play100FeedBreak",
+    "comment": "100%进度播放数"
+  },
+  "follow": {
+    "filed": "sum(t1.follow) as follow ",
+    "comment": "新增关注数"
+  },
+  "likeMaterial": {
+    "filed": "sum(t1.like_num) as likeMaterial ",
+    "comment": "点赞数"
+  },
+  "shareMaterial": {
+    "filed": "sum(t1.share) as shareMaterial ",
+    "comment": "分享数"
+  }
+}