Ver código fonte

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
#	jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
syh 4 anos atrás
pai
commit
564b980b61
55 arquivos alterados com 2080 adições e 167 exclusões
  1. 1 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/CreativeTitleController.java
  2. 16 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialImageInfoController.java
  3. 21 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialInfoController.java
  4. 0 6
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/MaterialUploadController.java
  5. 50 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/ProjectMemberController.java
  6. 6 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ProjectMemberMapper.java
  7. 39 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ProjectMemberMapper.xml
  8. 7 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IProjectMemberService.java
  9. 0 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreativeTitleServiceImpl.java
  10. 16 3
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ProjectMemberServiceImpl.java
  11. 16 0
      module-common/pom.xml
  12. 3 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java
  13. 10 0
      module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml
  14. 2 0
      module-common/src/main/java/cn/com/ctop/common/module/service/IUserAllocationService.java
  15. 1 2
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/FileInfoServiceImpl.java
  16. 21 16
      module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java
  17. 217 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/ParseInstallPackageUtil.java
  18. 8 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/RestUtils.java
  19. 1 0
      module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/IMaterialUploadService.java
  20. 15 23
      module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/impl/MaterialUploadServiceImpl.java
  21. 10 15
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/MaterialReportMapper.xml
  22. 220 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CreateAdlabController.java
  23. 138 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CtopAdlabProjectController.java
  24. 168 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CtopAdlabProjectDetailController.java
  25. 28 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/PlanAnalyzeReportController.java
  26. 50 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/entity/CtopAdlabProject.java
  27. 101 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/entity/CtopAdlabProjectDetail.java
  28. 11 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/CtopAdlabProjectDetailMapper.java
  29. 11 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/CtopAdlabProjectMapper.java
  30. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/xml/CtopAdlabProjectDetailMapper.xml
  31. 5 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/xml/CtopAdlabProjectMapper.xml
  32. 6 4
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/ICreateProjectService.java
  33. 16 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/ICtopAdlabProjectDetailService.java
  34. 11 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/ICtopAdlabProjectService.java
  35. 2 2
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/IGetProjectService.java
  36. 16 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/IPlanAnalyzeReportService.java
  37. 3 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/IUpdateProjectService.java
  38. 86 65
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CreateProjectServiceImpl.java
  39. 87 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CtopAdlabProjectDetailServiceImpl.java
  40. 15 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/CtopAdlabProjectServiceImpl.java
  41. 36 9
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/GetProjectServiceImpl.java
  42. 85 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/PlanAnalyzeReportServiceImpl.java
  43. 14 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/UpdateProjectServiceImpl.java
  44. 51 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/controller/BytedanceVideoReportCtrl.java
  45. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/BytedanceVideoReportMapper.java
  46. 90 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/mapper/xml/BytedanceVideoReportMapper.xml
  47. 12 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/IBytedanceVideoReportService.java
  48. 23 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/report/service/impl/BytedanceVideoReportServiceImpl.java
  49. 7 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java
  50. 35 3
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ByteDanceQueryToolController.java
  51. 71 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/controller/ParseInstallPackageController.java
  52. 13 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceQueryMaterialInfoService.java
  53. 49 0
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceQueryMaterialInfoServiceImpl.java
  54. 1 1
      module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonObjectToJsonStringUtil.java
  55. 142 0
      module-toutiao/src/main/resources/json_template/bytedance_video_report_mapping.json

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

@@ -11,10 +11,10 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/ctop/creativeTitle/")
 public class CreativeTitleController {
+
     @Autowired
     private ICreativeTitleService creativeTitleService;
 
-
     @GetMapping("getTitleLabel")
     public Result<JSONArray> getTitleLabel() {
         Result<JSONArray> result = new Result<>();
@@ -24,7 +24,6 @@ public class CreativeTitleController {
         return result;
     }
 
-
     @GetMapping("titleSuggestion")
     public Result<JSONArray> titleSuggestion(String firstCategory, String secondCategory, String keyword) {
         Result<JSONArray> result = new Result<>();
@@ -34,8 +33,6 @@ public class CreativeTitleController {
         return result;
     }
 
-
-
     @GetMapping("titleSearch")
     public Result<JSONArray> titleSearch(String firstCategory, String secondCategory, String keywords) {
         Result<JSONArray> result = new Result<>();
@@ -44,6 +41,4 @@ public class CreativeTitleController {
         result.setResult(labelArr);
         return result;
     }
-
-
 }

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

@@ -106,6 +106,22 @@ public class MaterialImageInfoController {
 
     }
 
+    @PostMapping(value = "/listByAccountIds")
+    public Result<IPage<MaterialImageInfo>> listByAccountIds(@RequestBody JSONObject requestBody) {
+        Result<IPage<MaterialImageInfo>> result = new Result<IPage<MaterialImageInfo>>();
+        QueryWrapper<MaterialImageInfo> queryWrapper = new QueryWrapper<>();
+        if (!Check.isNull(requestBody.getString("userId"))) {
+            queryWrapper.eq("user_id",requestBody.getString("userId"));
+            }
+        queryWrapper.orderByDesc(true,"create_time");
+        Page<MaterialImageInfo> page = new Page<>(requestBody.getInteger("pageNo"), requestBody.getInteger("pageSize"));
+        IPage<MaterialImageInfo> pageList = MaterialImageInfoService.page(page, queryWrapper);
+
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+
+    }
 
     /**
      * 分页列表查询

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

@@ -1,6 +1,5 @@
 package org.jeecg.modules.ctop.controller;
 
-
 import cn.com.ctop.common.module.annotation.AutoLog;
 import cn.com.ctop.common.module.constant.CtopRoleCodeConstant;
 import cn.com.ctop.common.module.entity.*;
@@ -206,7 +205,6 @@ public class MaterialInfoController {
                                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                      HttpServletRequest req) {
 
-
         Result<IPage<MaterialInfo>> result = new Result<>();
         String materialName = materialInfo.getMaterialName();
         String startDate = materialInfo.getStartDate();
@@ -650,5 +648,26 @@ public class MaterialInfoController {
         return result;
     }
 
+    /**
+     *  adlab 新加查询素材库接口
+     */
+    @PostMapping(value = "/listByAccountIds")
+    public Result<IPage<MaterialInfo>> listByAccountIds(@RequestBody JSONObject requestBody) {
 
+        Result<IPage<MaterialInfo>> result = new Result<>();
+        QueryWrapper<MaterialInfo> queryWrapper = new QueryWrapper<>();
+        if (!Check.isNull(requestBody.getString("userId"))) {
+            queryWrapper.eq("user_id",requestBody.getString("userId"));
+            List<Long> projects = memberService.getProjectByAccountIds(requestBody.getJSONArray("accountIds"));
+            if (!Check.isNull(projects)) {
+                queryWrapper.in("project_id", projects);
+            }
+        }
+        queryWrapper.orderByDesc(true,"create_time");
+        Page<MaterialInfo> page = new Page<>(requestBody.getInteger("pageNo"), requestBody.getInteger("pageSize"));
+        IPage<MaterialInfo> pageList = materialInfoService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
 }

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

@@ -48,7 +48,6 @@ public class MaterialUploadController {
             }
             LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
 
-
             new Thread(() -> materialUploadService.uploadAccount(mediaId, materialArray, accountArray, sysUser.getId())).start();
             returnMap.put("success", true);
             returnMap.put("message", "开始上传文件");
@@ -58,11 +57,6 @@ public class MaterialUploadController {
             returnMap.put("success", false);
             returnMap.put("message", e.getMessage());
         }
-
-
         return returnMap;
-
     }
-
-
 }

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

@@ -7,6 +7,7 @@ import cn.com.ctop.common.module.entity.SysUser;
 import cn.com.ctop.common.module.service.IProductService;
 import cn.com.ctop.common.module.service.IProjectService;
 import cn.com.ctop.common.module.service.ISysRoleExtService;
+import cn.com.ctop.common.module.service.IUserAllocationService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.ResultMapUtils;
 import cn.com.ctop.common.module.utils.StatusCode;
@@ -56,6 +57,8 @@ public class ProjectMemberController {
     private ISysUserService sysUserService;
     @Autowired
     private IAdvertiserService advertiserService;
+    @Autowired
+    private IUserAllocationService userAllocationService;
 
 
     /**
@@ -144,6 +147,53 @@ public class ProjectMemberController {
         return map;
     }
 
+
+    @PostMapping(value = "/participateListByMediaId")
+    public Result<List<JSONObject>> participateListByMediaId(@RequestBody JSONObject requestJson) {
+        Result<List<JSONObject>> result = new Result<>();
+        try {
+            String userId = requestJson.getString("userId");
+            if (Check.isNull(userId)) {
+                throw new Exception("请选择userId");
+            }
+            List<Integer> mediaIds = new ArrayList<>();
+            String type = requestJson.getString("type");
+            if ("kuaishou".equals(type)) {
+                mediaIds.add(2);
+                mediaIds.add(4);
+            } else if ("bytedance".equals(type)) {
+                mediaIds.add(1);
+                mediaIds.add(3);
+            }
+            if (Check.isNull(mediaIds)) {
+                throw new Exception("请选择媒体类型");
+            }
+            String roleCode = sysRoleService.getRoleCodeByUserId(userId);
+            if ("admin".equals(roleCode) || roleCode.contains("sale") || "meidaManager".equals(roleCode)) {
+                userId = null;
+            }
+            List<JSONObject> projectList = projectMemberService.getProjectByUserIdAndMediaIds(userId, mediaIds);
+            if (!Check.isNull(projectList)) {
+                for (int i = 0; i < projectList.size(); i++) {
+                    JSONObject project = projectList.get(i);
+                    List<JSONObject> accountList = userAllocationService.getAccountListByProject(project.getLong("projectId"));
+                    if (!Check.isNull(accountList)) {
+                        project.put("accountList", accountList);
+                    }
+                }
+            }
+            result.setSuccess(true);
+            result.setResult(projectList);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.setSuccess(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+    }
+
+
     @GetMapping("/projectList")
     public Map<String, Object> projectList() {
         Map<String, Object> result = new HashMap<>();

+ 6 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/ProjectMemberMapper.java

@@ -1,12 +1,13 @@
 package org.jeecg.modules.ctop.mapper;
 
 import cn.com.ctop.common.module.entity.Project;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.ctop.entity.ProjectMember;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * 项目成员
@@ -39,4 +40,8 @@ public interface ProjectMemberMapper extends BaseMapper<ProjectMember> {
     List<Long> getProjectByMap(@Param("userId") String userId);
 
     List<Project> getProjectByUserId(@Param("userId")String userId);
+
+    List<Long> getProjectByAccountIds(@Param("accountIds")JSONArray accountIds);
+
+    List<JSONObject> getProjectByUserIdAndMediaIds(@Param("userId") String userId, @Param("mediaIds") List<Integer> mediaIds);
 }

+ 39 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/mapper/xml/ProjectMemberMapper.xml

@@ -16,9 +16,9 @@
         t1.project_name as projectName,
         t1.advertiser_id as advertiserId,
         (
-        select name from ctop_advertiser where  id = t1.advertiser_id
+        select name from ctop_advertiser where id = t1.advertiser_id
         )
-         as advertiserName,
+        as advertiserName,
         t1.media_id as mediaId,
         t1.max_bid as maxBid,
 
@@ -115,7 +115,7 @@
         b.project_name as projectName,
         a.advertiser_id as advertiserId,
         (
-        select name from ctop_advertiser where  id = a.advertiser_id
+        select name from ctop_advertiser where id = a.advertiser_id
         )
         as advertiserName,
         (SELECT media_id from ctop_project c where c.id=a.project_id limit 1) as mediaId
@@ -166,4 +166,40 @@
             member.user_id = #{userId}
     </select>
 
+    <select id="getProjectByAccountIds" resultType="java.lang.Long">
+        SELECT
+            project_id
+        FROM
+            ctop_user_allocation
+        WHERE
+            account_id IN
+        <foreach collection="accountIds" item="item" separator=","
+                 open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+
+    <select id="getProjectByUserIdAndMediaIds" resultType="com.alibaba.fastjson.JSONObject">
+        select
+        t2.id as 'projectId',
+        t2.project_name as 'projectName',
+        (select name from ctop_advertiser where id = t2.advertiser_id) as 'advertiserName'
+        from ctop_project_member t1
+        left join ctop_project t2
+        on t1.project_id = t2.id
+        where 1 = 1
+        <if test="userId !=null and userId!=''">
+            and t1.user_id = #{userId}
+        </if>
+        and t2.media_id in
+        <foreach collection="mediaIds" item="item" separator=","
+                 open="(" close=")">
+            #{item}
+        </foreach>
+        group by t2.id
+        order by t2.create_time desc
+    </select>
+
+
 </mapper>

+ 7 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/IProjectMemberService.java

@@ -2,6 +2,8 @@ package org.jeecg.modules.ctop.service;
 
 import cn.com.ctop.common.module.entity.Project;
 import cn.com.ctop.common.module.entity.SysUser;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.ctop.entity.ProjectMember;
 
@@ -22,7 +24,7 @@ public interface IProjectMemberService extends IService<ProjectMember> {
 
     List<ProjectMember> getProjects(List<Integer> mediaIds);
 
-    List<Map<String, Object>> getProjectAccountByUserId(String userId,String mediaType);
+    List<Map<String, Object>> getProjectAccountByUserId(String userId, String mediaType);
 
     ProjectMember getProjectByParams(Long targetProject, String userId);
 
@@ -33,4 +35,8 @@ public interface IProjectMemberService extends IService<ProjectMember> {
     List<Long> getProjectByMap(String userId);
 
     List<Project> selectListByUserId(String userId);
+
+    List<Long> getProjectByAccountIds(JSONArray accountIds);
+
+    List<JSONObject> getProjectByUserIdAndMediaIds(String userId, List<Integer> mediaIds);
 }

+ 0 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/CreativeTitleServiceImpl.java

@@ -23,7 +23,6 @@ public class CreativeTitleServiceImpl implements ICreativeTitleService {
             if (!Check.isNull(dataJson)) {
                 return dataJson.getJSONArray("title_label");
             }
-
         }
         return null;
     }

+ 16 - 3
jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/service/impl/ProjectMemberServiceImpl.java

@@ -7,6 +7,8 @@ import cn.com.ctop.common.module.mapper.UserAllocationMapper;
 import cn.com.ctop.common.module.service.ISysRoleExtService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CtopAdConstant;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.ArrayUtils;
@@ -103,13 +105,13 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
     }
 
     @Override
-    public List<Map<String, Object>> getProjectAccountByUserId(String userId,String mediaType) {
+    public List<Map<String, Object>> getProjectAccountByUserId(String userId, String mediaType) {
         List<Map<String, Object>> result = new ArrayList<>();
         List<Integer> mediaList = new ArrayList<>();
-        if(mediaType.equals(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE)){
+        if (mediaType.equals(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE)) {
             mediaList.add(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_INT);
             mediaList.add(CtopAdConstant.PLATFORM_TYPE_BYTEDANCE_INSIDE_INT);
-        }else if(mediaType.equals(CtopAdConstant.PLATFORM_TYPE_KUAISHOU)){
+        } else if (mediaType.equals(CtopAdConstant.PLATFORM_TYPE_KUAISHOU)) {
             mediaList.add(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_INT);
             mediaList.add(CtopAdConstant.PLATFORM_TYPE_KUAISHOU_INSIDE_INT);
         }
@@ -147,6 +149,7 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
         temp.put("project", projectMember);
         QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("project_id", projectMember.getProjectId());
+        queryWrapper.eq("account_status", 0);
         queryWrapper.isNotNull("account_id");
         List<UserAllocation> userAllocations = userAllocationMapper.selectList(queryWrapper);
         if (userAllocations.isEmpty()) {
@@ -199,6 +202,11 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
         return memberMapper.getProjectByUserId(userId);
     }
 
+    public List<Long> getProjectByAccountIds(JSONArray accountIds) {
+        return memberMapper.getProjectByAccountIds(accountIds);
+    }
+
+
     //视频报表
     @Override
     public List<ProjectMember> getOwnProjects(List<Integer> mediaIds) {
@@ -222,5 +230,10 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
         return projectMemberList;
     }
 
+    @Override
+    public List<JSONObject> getProjectByUserIdAndMediaIds(String userId, List<Integer> mediaIds) {
+        return memberMapper.getProjectByUserIdAndMediaIds(userId, mediaIds);
+    }
+
 
 }

+ 16 - 0
module-common/pom.xml

@@ -84,6 +84,22 @@
             <artifactId>cos_api</artifactId>
             <version>5.6.25</version>
         </dependency>
+        <dependency>
+            <groupId>com.rabbitmq</groupId>
+            <artifactId>amqp-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.tony19</groupId>
+            <artifactId>apktool-lib</artifactId>
+            <version>1.4.4-3</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.googlecode.plist</groupId>
+            <artifactId>dd-plist</artifactId>
+            <version>1.16</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 3 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/UserAllocationMapper.java

@@ -1,6 +1,7 @@
 package cn.com.ctop.common.module.mapper;
 
 import cn.com.ctop.common.module.entity.UserAllocation;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -15,4 +16,6 @@ import java.util.List;
 public interface UserAllocationMapper extends BaseMapper<UserAllocation> {
     List<UserAllocation> selectAccountListByProjectId(@Param("projectId")Long projectId);
     String queryAdvertiserId(@Param("accountId")Long accountId);
+
+    List<JSONObject> getAccountListByProject(@Param("projectId") Long projectId);
 }

+ 10 - 0
module-common/src/main/java/cn/com/ctop/common/module/mapper/xml/UserAllocationMapper.xml

@@ -21,4 +21,14 @@
             ctop_user_allocation
         where account_id=#{accountId}
     </select>
+
+    <select id="getAccountListByProject" resultType="com.alibaba.fastjson.JSONObject">
+       select
+       account_id as 'accountId',
+       user_name as 'userName',
+       auth_name as 'authName'
+       from ctop_user_allocation
+       where project_id = #{projectId}
+       order by create_time desc
+    </select>
 </mapper>

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

@@ -26,4 +26,6 @@ public interface IUserAllocationService extends IService<UserAllocation> {
     List<UserAllocation> getByMediaId(String mediaId);
 
     String getAdvertiserIdByAccountId(Long accountId);
+
+    List<JSONObject> getAccountListByProject(Long projectId);
 }

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

@@ -85,7 +85,6 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
                 log.info("头条上传素材返回结果为空,返回信息:{},accountId:{}", jsonObject, accountId);
             }
 
-
         } catch (Exception e) {
             log.error("头条上传视频文件失败,accountId:{}", accountId);
             log.error(e.getMessage(), e);
@@ -181,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;

+ 21 - 16
module-common/src/main/java/cn/com/ctop/common/module/service/impl/UserAllocationServiceImpl.java

@@ -36,7 +36,7 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
     }
 
     @Override
-    public List<UserAllocation> getByParams(Long projectId, String systemType,Integer accountStatus) {
+    public List<UserAllocation> getByParams(Long projectId, String systemType, Integer accountStatus) {
         QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
         if (null != projectId && projectId != 0) {
             queryWrapper.eq("project_id", projectId);
@@ -44,8 +44,8 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
         if (null != systemType && !"".equals(systemType.trim())) {
             queryWrapper.eq("system_type", systemType);
         }
-        if(null!=accountStatus){
-            queryWrapper.eq("account_status",accountStatus);
+        if (null != accountStatus) {
+            queryWrapper.eq("account_status", accountStatus);
         }
         queryWrapper.orderByDesc("id");
         return this.list(queryWrapper);
@@ -53,34 +53,34 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
 
     @Override
     public Map<String, Object> getPangolinAccountListByParams(String userId, JSONObject data) {
-        Map<String,Object>result = new HashMap<>();
+        Map<String, Object> result = new HashMap<>();
         Long projectId = data.getLong("project_id");
-        QueryWrapper<UserAllocation>queryWrapper = new QueryWrapper<>();
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("media_id", CtopAdConstant.PLATFORM_TYPE_PANGOLIN);
-        if(null != userId&&!"".equals(userId.trim())){
-            queryWrapper.eq("user_id",userId);
+        if (null != userId && !"".equals(userId.trim())) {
+            queryWrapper.eq("user_id", userId);
         }
-        if(null != projectId&&projectId != 0){
-            queryWrapper.eq("project_id",projectId);
+        if (null != projectId && projectId != 0) {
+            queryWrapper.eq("project_id", projectId);
         }
         List<UserAllocation> allocations = this.list(queryWrapper);
         ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
-        result.put("data",allocations);
+        result.put("data", allocations);
         return result;
     }
 
     @Override
     public Map<String, Object> getPangolinProjectListByParams(String userId) {
-        Map<String,Object>result = new HashMap<>();
-        QueryWrapper<UserAllocation>queryWrapper = new QueryWrapper<>();
+        Map<String, Object> result = new HashMap<>();
+        QueryWrapper<UserAllocation> queryWrapper = new QueryWrapper<>();
         queryWrapper.select("distinct project_id,project_name");
-        queryWrapper.eq("media_id",CtopAdConstant.PLATFORM_TYPE_PANGOLIN);
-        if(null != userId&&!"".equals(userId.trim())){
-            queryWrapper.eq("user_id",userId);
+        queryWrapper.eq("media_id", CtopAdConstant.PLATFORM_TYPE_PANGOLIN);
+        if (null != userId && !"".equals(userId.trim())) {
+            queryWrapper.eq("user_id", userId);
         }
         List<UserAllocation> allocations = this.list(queryWrapper);
         ResultMapUtils.setResultMap(result, StatusCode.COMMON_SUCCESS);
-        result.put("data",allocations);
+        result.put("data", allocations);
         return result;
     }
 
@@ -98,4 +98,9 @@ public class UserAllocationServiceImpl extends ServiceImpl<UserAllocationMapper,
     public String getAdvertiserIdByAccountId(Long accountId) {
         return userAllocationMapper.queryAdvertiserId(accountId);
     }
+
+    @Override
+    public List<JSONObject> getAccountListByProject(Long projectId) {
+        return userAllocationMapper.getAccountListByProject(projectId);
+    }
 }

+ 217 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/ParseInstallPackageUtil.java

@@ -0,0 +1,217 @@
+package cn.com.ctop.common.module.utils;
+
+import brut.androlib.res.decoder.AXmlResourceParser;
+import com.dd.plist.NSDictionary;
+import com.dd.plist.NSString;
+import com.dd.plist.PropertyListParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xmlpull.v1.XmlPullParser;
+
+import java.io.*;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+import static android.util.TypedValue.*;
+
+/**
+ *  Created by JQ.bi on 2020.9.9
+ */
+public class ParseInstallPackageUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(ParseInstallPackageUtil.class);
+
+    private static final float RADIX_MULTS[] = {0.00390625F, 3.051758E-005F, 1.192093E-007F, 4.656613E-010F};
+    private static final String DIMENSION_UNITS[] = {"px", "dip", "sp", "pt", "in", "mm", "", ""};
+    private static final String FRACTION_UNITS[] = {"%", "%p", "", "", "", "", "", ""};
+
+    /**
+     * 解析apk文件
+     *
+     * @param apkUrl apk的文件路径
+     * @return
+     */
+    public static Map<String, String> parseAPK(String apkUrl) {
+        Map<String, String> map = new HashMap();
+        ZipFile zipFile;
+        try {
+            zipFile = new ZipFile(apkUrl);
+            Enumeration<?> enumeration = zipFile.entries();
+            ZipEntry zipEntry = null;
+            while (enumeration.hasMoreElements()) {
+                zipEntry = (ZipEntry) enumeration.nextElement();
+                if (zipEntry.isDirectory()) {
+                } else {
+                    if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
+                        AXmlResourceParser parser = new AXmlResourceParser();
+                        parser.open(zipFile.getInputStream(zipEntry));
+                        while (true) {
+                            int type = parser.next();
+                            if (type == XmlPullParser.END_DOCUMENT) {
+                                break;
+                            }
+                            String name = parser.getName();
+                            if (null != name && name.toLowerCase().equals("manifest")) {
+                                for (int i = 0; i != parser.getAttributeCount(); i++) {
+                                    if ("versionName".equals(parser.getAttributeName(i))) {
+                                        String versionName = getAttributeValue(parser, i);
+                                        if (null == versionName) {
+                                            versionName = "";
+                                        }
+                                        map.put("versionName", versionName);
+                                    } else if ("package".equals(parser.getAttributeName(i))) {
+                                        String packageName = getAttributeValue(parser, i);
+                                        if (null == packageName) {
+                                            packageName = "";
+                                        }
+                                        map.put("package", packageName);
+                                    } else if ("versionCode".equals(parser.getAttributeName(i))) {
+                                        String versionCode = getAttributeValue(parser, i);
+                                        if (null == versionCode) {
+                                            versionCode = "";
+                                        }
+                                        map.put("versionCode", versionCode);
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                }
+            }
+            zipFile.close();
+        } catch (Exception e) {
+            log.info("APK解析异常!");
+        }
+        return map;
+    }
+
+    /**
+     * 解析ipa文件
+     *
+     * @param ipaUrl ipa的文件路径
+     * @return
+     */
+    public static Map<String, String> parseIpa(String ipaUrl) {
+        Map<String, String> map = new HashMap();
+        try {
+            File file = new File(ipaUrl);
+            InputStream is = new FileInputStream(file);
+            ZipInputStream zipIns = new ZipInputStream(is);
+            ZipEntry ze;
+            InputStream infoIs = null;
+            while ((ze = zipIns.getNextEntry()) != null) {
+                if (!ze.isDirectory()) {
+                    String name = ze.getName();
+                    if (null != name && name.toLowerCase().contains(".app/info.plist")) {
+                        ByteArrayOutputStream _copy = new ByteArrayOutputStream();
+                        int chunk = 0;
+                        byte[] data = new byte[1024];
+                        while (-1 != (chunk = zipIns.read(data))) {
+                            _copy.write(data, 0, chunk);
+                        }
+                        infoIs = new ByteArrayInputStream(_copy.toByteArray());
+                        break;
+                    }
+                }
+            }
+
+            NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(infoIs);
+
+            // 如果想要查看有哪些key ,可以把下面注释放开
+//            for (String keyName : rootDict.allKeys()) {
+//                System.out.println(keyName + ":" + rootDict.get(keyName).toString());
+//            }
+
+            // 应用包名
+            NSString parameters = (NSString) rootDict.get("CFBundleIdentifier");
+            map.put("package", parameters.toString());
+            // 应用版本名
+            parameters = (NSString) rootDict.objectForKey("CFBundleShortVersionString");
+            map.put("versionName", parameters.toString());
+            // 应用版本号
+            parameters = (NSString) rootDict.get("CFBundleVersion");
+            map.put("versionCode", parameters.toString());
+
+            infoIs.close();
+            is.close();
+            zipIns.close();
+
+        } catch (Exception e) {
+            log.info("ipa包解析异常!");
+        }
+        return map;
+    }
+
+
+    private static String getAttributeValue(AXmlResourceParser parser, int index) {
+
+        int type = parser.getAttributeValueType(index);
+        int data = parser.getAttributeValueData(index);
+        if (type == TYPE_STRING) {
+            return parser.getAttributeValue(index);
+        }
+        if (type == TYPE_ATTRIBUTE) {
+            return String.format("?%s%08X", getPackage(data), data);
+        }
+        if (type == TYPE_REFERENCE) {
+            return String.format("@%s%08X", getPackage(data), data);
+        }
+        if (type == TYPE_FLOAT) {
+            return String.valueOf(Float.intBitsToFloat(data));
+        }
+        if (type == TYPE_INT_HEX) {
+            return String.format("0x%08X", data);
+        }
+        if (type == TYPE_INT_BOOLEAN) {
+            return data != 0 ? "true" : "false";
+        }
+        if (type == TYPE_DIMENSION) {
+            return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & COMPLEX_UNIT_MASK];
+        }
+        if (type == TYPE_FRACTION) {
+            return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & COMPLEX_UNIT_MASK];
+        }
+        if (type >= TYPE_FIRST_COLOR_INT && type <= TYPE_LAST_COLOR_INT) {
+            return String.format("#%08X", data);
+        }
+        if (type >= TYPE_FIRST_INT && type <= TYPE_LAST_INT) {
+            return String.valueOf(data);
+        }
+        return String.format("<0x%X, type 0x%02X>", data, type);
+    }
+
+    private static String getPackage(int id) {
+        if (id >>> 24 == 1) {
+            return "android:";
+        }
+        return "";
+    }
+
+    private static float complexToFloat(int complex) {
+        return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3];
+    }
+
+    public static void printMap(Map<String, String> map) {
+        for (String key : map.keySet()) {
+            log.info(key + ":" + map.get(key));
+        }
+
+    }
+
+    public static void main(String[] args) {
+
+        System.out.println("************解析apk开始****************");
+        String apkUrl = "C:\\Users\\Arc\\Desktop\\YouYuan_1119929.apk";
+        Map<String, String> mapApk = parseAPK(apkUrl);
+        for (String key : mapApk.keySet()) {
+            System.out.println(key + ":" + mapApk.get(key));
+        }
+        System.out.println("************解析apk结束****************");
+    }
+}

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

+ 1 - 0
module-ctop/src/main/java/cn/com/ctop/manage/modules/material/service/IMaterialUploadService.java

@@ -12,4 +12,5 @@ public interface IMaterialUploadService {
      * @param accountArray
      */
     void uploadAccount(String mediaId, JSONArray materialArray, JSONArray accountArray,String userId);
+
 }

+ 15 - 23
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 {
@@ -85,19 +85,23 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
         } catch (Exception e) {
             e.printStackTrace();
         }
-
-
     }
 
     private void touTiaoUpload(String mediaId, JSONArray materialArray, JSONArray accountArray, String userId) {
         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++) {
@@ -105,18 +109,18 @@ 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();
                             }
@@ -126,13 +130,9 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
             } catch (Exception e) {
                 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);
@@ -240,7 +240,6 @@ public class MaterialUploadServiceImpl implements IMaterialUploadService {
                                         sendMessageService.sendMessage(userId, message);
                                     }
                                 }
-
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
@@ -248,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();

+ 10 - 15
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/MaterialReportMapper.xml

@@ -71,19 +71,13 @@
         ELSE 0
         END
         ) conversionPrice, -- 转化单价
-
-        -- t2.url url, -- 视频url
-
-        (SELECT url
-        FROM ctop_kuaishou_video_get
-        WHERE signature = t2.signature
-        LIMIT 1
-        ) url,
+        t2.photo_url as  'url',
+        t2.cover_url as  'coverUrl',
         t2.signature signature -- 视频md5
         from
         ctop_user_allocation t1
         left join
-        ctop_kuaishou_report_daily_creative t2
+        ctop_kuaishou_report_daily_material t2
         on t1.account_id = t2.account_id
 
         <where>
@@ -248,13 +242,13 @@
         ELSE 0
         END
         ) conversionPrice, -- 转化单价
-        ( SELECT url from ctop_kuaishou_video_get WHERE signature = t2.signature limit 1) url,
-        -- t2.url url, -- 视频url
+        t2.photo_url as  'url',
+        t2.cover_url as  'coverUrl',
         t2.signature signature -- 视频md5
         from
         ctop_user_allocation t1
         left join
-        ctop_kuaishou_report_daily_creative t2
+        ctop_kuaishou_report_daily_material t2
         on t1.account_id = t2.account_id
         <where>
             <if test="userId != null">
@@ -338,7 +332,7 @@
         END
         ) conversionPrice -- 转化单价
         from
-        ctop_kuaishou_report_daily_creative
+        ctop_kuaishou_report_daily_material
         <where>
             <if test="signature != null">
                 and signature = #{signature}
@@ -511,11 +505,12 @@
         END
         ) conversionPrice, -- 转化单价
 
-        ( SELECT url from ctop_kuaishou_video_get WHERE signature = t1.signature limit 1) url,
+        t1.photo_url  as  'url',
+        t1.cover_url as  'coverUrl',
         t1.signature signature, -- 视频md5
         t1.account_id accountId
         from
-        ctop_kuaishou_report_daily_creative t1
+        ctop_kuaishou_report_daily_material t1
         where t1.account_id in
         <foreach item="item" index="index" collection="accountIds"
                  open="(" separator="," close=")">

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

@@ -0,0 +1,220 @@
+package cn.com.ctop.toutiao.modules.adlab.controller;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.toutiao.modules.adlab.service.ICreateProjectService;
+import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectDetailService;
+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.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/adlab/Project")
+public class CreateAdlabController {
+
+    @Autowired
+    ICreateProjectService createProjectService;
+    @Autowired
+    ICtopOauthTokenService ctopOauthTokenService;
+    @Autowired
+    ICtopAdlabProjectDetailService adlabProjectDetailService;
+
+
+    /**
+     *  投放管家创建项目第一步
+     */
+    @PostMapping(value = "/create")
+    public Result<List<JSONObject>> create(@RequestBody JSONObject 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->{
+                //临时存每一个账户创建后的数据
+                JSONObject repoTemp=new JSONObject();
+                requestBody.put("accountId",accountId);
+                //查询该账户的token
+                CtopOauthToken token = ctopOauthTokenService.getTokenByAccountId((Long) accountId);
+                JSONObject repo = createProjectService.createGroup(token, requestBody);
+                if(repo.getInteger("code")==0){
+                    repoTemp.put("code",0);
+                    repoTemp.put("accountId",accountId);
+                    repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    //在此塞进去,前端后续会用来做判断条件
+                    repoTemp.put("name",requestBody.getString("name"));
+                    repoTemp.put("adTarget",requestBody.getString("adTarget"));
+                    repoTemp.put("deliveryRange",requestBody.getString("deliveryRange"));
+                    repoTemp.put("landingType",requestBody.getString("landingType"));
+                }else{
+                    repoTemp.put("code",500);
+                    repoTemp.put("message",repo.getString("message"));
+                    repoTemp.put("accountId",accountId);
+                }
+                resultList.add(repoTemp);
+            });
+            result.setResult(resultList);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+    /**
+     *  投放管家创建项目第二步,设置项目定向信息
+     */
+    @PostMapping(value = "/setConvert")
+    public Result<List<JSONObject>> setConvert(@RequestBody JSONArray requestBody){
+        Result<List<JSONObject>> result =new Result<>();
+        List<JSONObject> resultList=new ArrayList<>();
+        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.updateGroupConvert(token, convert2Map);
+                if(repo.getInteger("code")==0){
+                    repoTemp.put("code",0);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                    repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    repoTemp.put("name",convert2Map.get("name"));
+                    repoTemp.put("adTarget",convert2Map.get("adTarget"));
+                    repoTemp.put("deliveryRange",convert2Map.get("deliveryRange"));
+                    repoTemp.put("landingType",convert2Map.get("landingType"));
+                }else{
+                    repoTemp.put("code",500);
+                    repoTemp.put("message",repo.getString("message"));
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                }
+                resultList.add(repoTemp);
+            });
+            result.setResult(resultList);
+            result.setSuccess(true);
+        }else {
+            result.error500("请选择需要设置转化信息的项目");
+        }
+        return result;
+    }
+    /**
+     *  投放管家创建项目第三步,设置项目定向信息
+     */
+    @PostMapping(value = "/setAudience")
+    public Result<List<JSONObject>> setAudience(@RequestBody JSONArray requestBody){
+
+        Result<List<JSONObject>> result =new Result<>();
+        List<JSONObject> resultList=new ArrayList<>();
+        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.updateGroupAudience(token, convert2Map);
+                 if(repo.getInteger("code")==0){
+                    repoTemp.put("code",0);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                    repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    repoTemp.put("name",convert2Map.get("name"));
+                    repoTemp.put("adTarget",convert2Map.get("adTarget"));
+                    repoTemp.put("deliveryRange",convert2Map.get("deliveryRange"));
+                    repoTemp.put("landingType",convert2Map.get("landingType"));
+                    repoTemp.put("inventoryType",convert2Map.get("inventoryType"));
+                }else{
+                    repoTemp.put("code",500);
+                    repoTemp.put("message",repo.getString("message"));
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                }
+                resultList.add(repoTemp);
+            });
+            result.setResult(resultList);
+            result.setSuccess(true);
+        }else {
+            result.error500("请选择需要设置定向信息的项目");
+        }
+        return result;
+    }
+
+    /**
+     *  投放管家创建项目第四步,设置项目创意信息
+     */
+    @PostMapping(value = "/setCreative")
+    public Result<List<JSONObject>> setCreative(@RequestBody JSONArray requestBody){
+        Result<List<JSONObject>> result =new Result<>();
+        List<JSONObject> resultList=new ArrayList<>();
+        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);
+
+                if(repo.getInteger("code")==0){
+                    repoTemp.put("code",0);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                    repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    repoTemp.put("name",convert2Map.get("name"));
+                    repoTemp.put("adTarget",convert2Map.get("adTarget"));
+                    repoTemp.put("deliveryRange",convert2Map.get("deliveryRange"));
+                    repoTemp.put("landingType",convert2Map.get("landingType"));
+                    repoTemp.put("inventoryType",convert2Map.get("inventoryType"));
+                }else{
+                    repoTemp.put("code",500);
+                    repoTemp.put("message",repo.getString("message"));
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                }
+                resultList.add(repoTemp);
+            });
+            result.setResult(resultList);
+            result.setSuccess(true);
+        }else {
+            result.error500("请选择需要设置定向信息的项目");
+        }
+        return result;
+    }
+
+    /**
+     *  投放管家创建项目第五步,设置项目预算信息
+     */
+    @PostMapping(value = "/setBudget")
+    public Result<List<JSONObject>> setBudget(@RequestBody JSONArray requestBody ){
+
+        Result<List<JSONObject>> result =new Result<>();
+        List<JSONObject> resultList=new ArrayList<>();
+        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.updateGroupBudget(token, convert2Map);
+                log.info(repo.toJSONString());
+                if(repo.getInteger("code")==0){
+                    repoTemp.put("code",0);
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                    repoTemp.put("groupId",repo.getJSONObject("data").getLong("group_id"));
+                    repoTemp.put("userId",convert2Map.get("userId"));
+                }else{
+                    repoTemp.put("code",500);
+                    repoTemp.put("message",repo.getString("message"));
+                    repoTemp.put("accountId",convert2Map.get("accountId"));
+                }
+                resultList.add(repoTemp);
+            });
+            //入库
+            adlabProjectDetailService.putStorage(resultList);
+            result.setResult(resultList);
+            result.setSuccess(true);
+        }else {
+            result.error500("请选择需要设置定向信息的项目");
+        }
+        return result;
+    }
+
+}

+ 138 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/CtopAdlabProjectController.java

@@ -0,0 +1,138 @@
+package cn.com.ctop.toutiao.modules.adlab.controller;
+
+import java.util.Arrays;
+
+import javax.servlet.http.HttpServletRequest;
+
+import cn.com.ctop.common.module.annotation.AutoLog;
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProject;
+import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectService;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.common.api.vo.Result;
+
+import org.jeecg.common.system.query.QueryGenerator;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.ApiOperation;
+
+ /**
+ * 投放管家项目列表
+ */
+@Slf4j
+@RestController
+@RequestMapping("/adlab/ctopAdlabProject")
+public class CtopAdlabProjectController {
+	@Autowired
+	private ICtopAdlabProjectService ctopAdlabProjectService;
+
+	/**
+	  * 分页列表查询
+	 */
+	@GetMapping(value = "/list")
+	public Result<IPage<CtopAdlabProject>> queryPageList(CtopAdlabProject ctopAdlabProject,
+														 @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														 @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														 HttpServletRequest req) {
+		Result<IPage<CtopAdlabProject>> result = new Result<>();
+		QueryWrapper<CtopAdlabProject> queryWrapper = QueryGenerator.initQueryWrapper(ctopAdlabProject, req.getParameterMap());
+		Page<CtopAdlabProject> page = new Page<>(pageNo, pageSize);
+		IPage<CtopAdlabProject> pageList = ctopAdlabProjectService.page(page, queryWrapper);
+		result.setSuccess(true);
+		result.setResult(pageList);
+		return result;
+	}
+
+	/**
+	  *   添加
+	 */
+	@PostMapping(value = "/add")
+	public Result<CtopAdlabProject> add(@RequestBody CtopAdlabProject ctopAdlabProject) {
+		Result<CtopAdlabProject> result = new Result<>();
+		try {
+			ctopAdlabProjectService.save(ctopAdlabProject);
+			result.success("添加成功!");
+		} catch (Exception e) {
+			log.error(e.getMessage(),e);
+			result.error500("操作失败");
+		}
+		return result;
+	}
+
+	/**
+	  *  编辑
+	 */
+	@PostMapping(value = "/edit")
+	public Result<CtopAdlabProject> edit(@RequestParam JSONArray accountIds,
+										 @RequestParam JSONArray groupIds,
+										 @RequestParam String optStatus) {
+		Result<CtopAdlabProject> result = new Result<CtopAdlabProject>();
+
+
+		return result;
+	}
+
+	/**
+	  *   通过id删除
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "投放管家项目列表-通过id删除")
+	@ApiOperation(value="投放管家项目列表-通过id删除", notes="投放管家项目列表-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public Result<?> delete(@RequestParam(name="id",required=true) String id) {
+		try {
+			ctopAdlabProjectService.removeById(id);
+		} catch (Exception e) {
+			log.error("删除失败",e.getMessage());
+			return Result.error("删除失败!");
+		}
+		return Result.ok("删除成功!");
+	}
+
+	/**
+	  *  批量删除
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "投放管家项目列表-批量删除")
+	@ApiOperation(value="投放管家项目列表-批量删除", notes="投放管家项目列表-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<CtopAdlabProject> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		Result<CtopAdlabProject> result = new Result<>();
+		if(ids==null || "".equals(ids.trim())) {
+			result.error500("参数不识别!");
+		}else {
+			this.ctopAdlabProjectService.removeByIds(Arrays.asList(ids.split(",")));
+			result.success("删除成功!");
+		}
+		return result;
+	}
+
+	/**
+	  * 通过id查询
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "投放管家项目列表-通过id查询")
+	@ApiOperation(value="投放管家项目列表-通过id查询", notes="投放管家项目列表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<CtopAdlabProject> queryById(@RequestParam(name="id",required=true) String id) {
+		Result<CtopAdlabProject> result = new Result<>();
+		CtopAdlabProject ctopAdlabProject = ctopAdlabProjectService.getById(id);
+		if(ctopAdlabProject==null) {
+			result.error500("未找到对应实体");
+		}else {
+			result.setResult(ctopAdlabProject);
+			result.setSuccess(true);
+		}
+		return result;
+	}
+
+
+
+}

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

@@ -0,0 +1,168 @@
+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;
+
+import cn.com.ctop.common.module.service.ICtopOauthTokenService;
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProjectDetail;
+import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectDetailService;
+import cn.com.ctop.toutiao.modules.adlab.service.IUpdateProjectService;
+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 org.jeecg.common.api.vo.Result;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 投放管家项目详情
+ */
+@Slf4j
+@RestController
+@RequestMapping("/adlab/ctopAdlabProjectDetail")
+public class CtopAdlabProjectDetailController {
+
+    @Autowired
+    private ICtopAdlabProjectDetailService ctopAdlabProjectDetailService;
+
+    @Autowired
+    private IUpdateProjectService updateProjectService;
+
+    @Autowired
+    private ICtopOauthTokenService oauthTokenService;
+
+    /**
+     * 分页列表查询
+     */
+    @PostMapping(value = "/list")
+    public Result<IPage<CtopAdlabProjectDetail>> queryPageList(@RequestBody JSONObject requestBody,
+                                                               @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                               @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                               HttpServletRequest req) {
+        Result<IPage<CtopAdlabProjectDetail>> result = new Result<>();
+        QueryWrapper<CtopAdlabProjectDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("user_id", requestBody.getString("userId"));
+        if (!requestBody.getString("name").isEmpty()) {
+            queryWrapper.like("name", requestBody.getString("name"));
+        }
+        if (!requestBody.getJSONArray("accountIds").isEmpty()) {
+            queryWrapper.in("account_id", requestBody.getJSONArray("accountIds"));
+        }
+        if (!requestBody.getString("optStatus").equals("")) {
+            queryWrapper.eq("opt_status", requestBody.getString("optStatus"));
+        }
+        if (!requestBody.getJSONArray("createTime").isEmpty()) {
+            queryWrapper.ge("create_time", requestBody.getJSONArray("createTime").get(0).toString());
+            queryWrapper.le("create_time", requestBody.getJSONArray("createTime").get(1).toString());
+        }
+        Page<CtopAdlabProjectDetail> page = new Page<>(pageNo, pageSize);
+        IPage<CtopAdlabProjectDetail> pageList = ctopAdlabProjectDetailService.page(page, queryWrapper);
+        result.setSuccess(true);
+        result.setResult(pageList);
+        return result;
+    }
+
+    /**
+     * 添加
+     */
+    @PostMapping(value = "/add")
+    public Result<CtopAdlabProjectDetail> add(@RequestBody CtopAdlabProjectDetail ctopAdlabProjectDetail) {
+        Result<CtopAdlabProjectDetail> result = new Result<>();
+        try {
+            ctopAdlabProjectDetailService.save(ctopAdlabProjectDetail);
+            result.success("添加成功!");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            result.error500("操作失败");
+        }
+        return result;
+    }
+
+    /**
+     * 编辑
+     */
+    @PostMapping(value = "/edit")
+    public Result<CtopAdlabProjectDetail> edit(@RequestBody JSONArray requestBody) {
+        Result<CtopAdlabProjectDetail> result = new Result<>();
+        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) {
+                    if (((Map<String, Object>) it).get("optStatus").equals("DELETED")) {
+                    	ctopAdlabProjectDetailService.removeById((Long) temp.get("groupId"));
+                    } else {
+                        ctopAdlabProjectDetailService.putStorage(params);
+                    }
+                } else {
+                    result.error500(repo.getString("message"));
+                }
+            });
+        }
+        return result;
+    }
+
+    /**
+     * 通过id删除
+     */
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        try {
+            ctopAdlabProjectDetailService.removeById(id);
+        } catch (Exception e) {
+            return Result.error("删除失败!");
+        }
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<CtopAdlabProjectDetail> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        Result<CtopAdlabProjectDetail> result = new Result<>();
+        if (ids == null || "".equals(ids.trim())) {
+            result.error500("参数不识别!");
+        } else {
+            this.ctopAdlabProjectDetailService.removeByIds(Arrays.asList(ids.split(",")));
+            result.success("删除成功!");
+        }
+        return result;
+    }
+
+    /**
+     * 通过id查询
+     */
+    @GetMapping(value = "/queryById")
+    public Result<CtopAdlabProjectDetail> queryById(@RequestParam(name = "id", required = true) String id) {
+        Result<CtopAdlabProjectDetail> result = new Result<>();
+        CtopAdlabProjectDetail ctopAdlabProjectDetail = ctopAdlabProjectDetailService.getById(id);
+        if (ctopAdlabProjectDetail == null) {
+            result.error500("未找到对应实体");
+        } else {
+            result.setResult(ctopAdlabProjectDetail);
+            result.setSuccess(true);
+        }
+        return result;
+    }
+}

+ 28 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/controller/PlanAnalyzeReportController.java

@@ -0,0 +1,28 @@
+package cn.com.ctop.toutiao.modules.adlab.controller;
+
+import cn.com.ctop.toutiao.modules.adlab.service.IPlanAnalyzeReportService;
+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.GetMapping;
+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;
+
+@Slf4j
+@RestController
+@RequestMapping("/adlab/planAnalyze")
+public class PlanAnalyzeReportController {
+
+    @Autowired
+    IPlanAnalyzeReportService planAnalyzeReportService;
+    
+    @GetMapping("/getList")
+    public Result<List<JSONObject>> getPlanAnalyze(@RequestBody JSONObject requestBody){
+        return null;
+    }
+
+}

+ 50 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/entity/CtopAdlabProject.java

@@ -0,0 +1,50 @@
+package cn.com.ctop.toutiao.modules.adlab.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 投放管家项目列表
+ */
+@Data
+@TableName("ctop_adlab_project")
+public class CtopAdlabProject {
+    
+	/**id*/
+	@TableId(type = IdType.AUTO)
+	private Long id;
+	/**项目名称*/
+	private String name;
+	/**项目操作状态*/
+	private String optStatus;
+	/**创建该项目时使用的App ID*/
+	private String appId;
+	/**出价*/
+	private java.math.BigDecimal bid;
+	/**预算*/
+	private java.math.BigDecimal budget;
+	/**预算模式*/
+	private String budgetMode;
+	/**广告组ID*/
+	private Integer campaignId;
+	/**项目组合状态*/
+	private String comboStatus;
+	/**赔付状态*/
+	private String compensation;
+	/**开始时间*/
+	private String startTime;
+	/**结束时间*/
+	private String endTime;
+	/**异常列表*/
+	private Object errorReason;
+	/**投放管家项目场景*/
+	private String scenario;
+	/**项目自动暂停规则的执行状态*/
+	private String stopStage;
+	/**项目当前是否支持复制*/
+	private Integer supportCopy;
+	/**项目系统状态*/
+	private String systemStatus;
+}

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

@@ -0,0 +1,101 @@
+package cn.com.ctop.toutiao.modules.adlab.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import lombok.Data;
+
+/**
+ * 投放管家项目详情
+ */
+@Data
+@TableName("ctop_adlab_project_detail")
+public class CtopAdlabProjectDetail {
+    
+	/**id*/
+	@TableId
+	private Long id;
+	/**name*/
+	private String name;
+	/**userId*/
+	private String userId;
+	/**accountId*/
+	private Long accountId;
+	/**campaignId*/
+	private Long campaignId;
+	/**scenario*/
+	private String scenario;
+	/**deliveryRange*/
+	private String deliveryRange;
+	/**status*/
+	private String status;
+	/**optStatus*/
+	private String optStatus;
+	/**statusName*/
+	private String statusName;
+	/**step*/
+	private Integer step;
+	/**platform*/
+	private String platform;
+	/**downloadType*/
+	private String downloadType;
+	/**appType*/
+	private String appType;
+	/**url*/
+	private String url;
+	/**webUrl*/
+	private String webUrl;
+	/**package*/
+	private String adlabPackage;
+	/**convertName*/
+	private String convertName;
+	/**convertId*/
+	private Integer convertId;
+	/**convertMode*/
+	private String convertMode;
+	/**inventoryType*/
+	private Object inventoryType;
+	/**unionVideoType*/
+	private String unionVideoType;
+	/**audience*/
+	private Object audience;
+	/**audiencePackageId*/
+	private Integer audiencePackageId;
+	/**adCreative*/
+	private Object adCreative;
+	/**startTime*/
+	private String startTime;
+	/**endTime*/
+	private String endTime;
+	/**weekTime*/
+	private Object weekTime;
+	/**bid*/
+	private java.math.BigDecimal bid;
+	/**budget*/
+	private java.math.BigDecimal budget;
+	/**budgetMode*/
+	private String budgetMode;
+	/**compensation*/
+	private String compensation;
+	/**deepBid*/
+	private java.math.BigDecimal deepBid;
+	/**deepBidType*/
+	private String deepBidType;
+	/**deepExternalAction*/
+	private String deepExternalAction;
+	/**stopStage*/
+	private String stopStage;
+	/**targetMode*/
+	private String targetMode;
+	/**downloadMode*/
+	private String downloadMode;
+	/**openUrl*/
+	private String openUrl;
+	/**inventoryTypes*/
+	private Object inventoryTypes;
+	/**adTarget*/
+	private String adTarget;
+	/**landingType*/
+	private String landingType;
+}

+ 11 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/CtopAdlabProjectDetailMapper.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.toutiao.modules.adlab.mapper;
+
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProjectDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 投放管家项目详情
+ */
+public interface CtopAdlabProjectDetailMapper extends BaseMapper<CtopAdlabProjectDetail> {
+
+}

+ 11 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/mapper/CtopAdlabProjectMapper.java

@@ -0,0 +1,11 @@
+package cn.com.ctop.toutiao.modules.adlab.mapper;
+
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 投放管家项目列表
+ */
+public interface CtopAdlabProjectMapper extends BaseMapper<CtopAdlabProject> {
+
+}

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

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

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

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

+ 6 - 4
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/ICreateProjectService.java

@@ -3,21 +3,23 @@ package cn.com.ctop.toutiao.modules.adlab.service;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import com.alibaba.fastjson.JSONObject;
 
+import java.util.Map;
+
 public interface ICreateProjectService {
 
     //新建投放管家项目
     JSONObject createGroup(CtopOauthToken oauthToken,JSONObject requestBody);
 
     //设置项目转化信息
-    JSONObject updateGroupConvert(CtopOauthToken oauthToken, JSONObject requestBody);
+    JSONObject updateGroupConvert(CtopOauthToken oauthToken, Map<String,Object> requestBody);
 
     //设置项目定向信息
-    JSONObject updateGroupAudience(CtopOauthToken oauthToken,JSONObject requestBody);
+    JSONObject updateGroupAudience(CtopOauthToken oauthToken,Map<String,Object> requestBody);
 
     //设置项目创意信息
-    JSONObject updateGroupCreative(CtopOauthToken oauthToken,JSONObject requestBody);
+    JSONObject updateGroupCreative(CtopOauthToken oauthToken,Map<String,Object> requestBody);
 
     //设置项目预算信息
-    JSONObject updateGroupBudget(CtopOauthToken oauthToken,JSONObject requestBody);
+    JSONObject updateGroupBudget(CtopOauthToken oauthToken,Map<String,Object> requestBody);
 
 }

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

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

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

@@ -0,0 +1,11 @@
+package cn.com.ctop.toutiao.modules.adlab.service;
+
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 投放管家项目列表
+ */
+public interface ICtopAdlabProjectService extends IService<CtopAdlabProject> {
+
+}

+ 2 - 2
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/IGetProjectService.java

@@ -6,10 +6,10 @@ import com.alibaba.fastjson.JSONObject;
 public interface IGetProjectService {
 
     //获取项目信息
-    JSONObject getGroup(CtopOauthToken oauthToken, JSONObject requestBody);
+    JSONObject getGroup(CtopOauthToken oauthToken, Long accountId, Long groupId);
 
     //获取项目素材信息
-    JSONObject getMaterial(CtopOauthToken oauthToken, JSONObject requestBody);
+    JSONObject getMaterialInfo(CtopOauthToken oauthToken, JSONObject requestBody);
 
     //获取项目列表
     JSONObject getGroups(CtopOauthToken oauthToken, JSONObject requestBody);

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

@@ -1,4 +1,20 @@
 package cn.com.ctop.toutiao.modules.adlab.service;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONObject;
+
 public interface IPlanAnalyzeReportService {
+
+    //更新计划目标成本
+    JSONObject updateAdBid(CtopOauthToken oauthToken, JSONObject requestBody);
+    //追加项目计划预算
+    JSONObject updateAdBudget(CtopOauthToken oauthToken, JSONObject requestBody);
+    //取消追加计划预算
+    JSONObject updateAdBudgetCancel(CtopOauthToken oauthToken, JSONObject requestBody);
+    //获取追加预算信息
+    JSONObject getBudget(CtopOauthToken oauthToken, JSONObject requestBody);
+    //获取可操作计划列表
+    public static final String ADLAB_GROUP_ADS_GET="https://ad.oceanengine.com/open_api/2/adlab/group_ads/get/";
+    JSONObject getGroupAds(CtopOauthToken oauthToken, JSONObject requestBody);
+
 }

+ 3 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/IUpdateProjectService.java

@@ -3,10 +3,12 @@ package cn.com.ctop.toutiao.modules.adlab.service;
 import cn.com.ctop.common.module.entity.CtopOauthToken;
 import com.alibaba.fastjson.JSONObject;
 
+import java.util.Map;
+
 public interface IUpdateProjectService {
 
     //更新项目状态
-    JSONObject updateGroupStatus(CtopOauthToken oauthToken, JSONObject requestBody);
+    JSONObject updateGroupStatus(CtopOauthToken oauthToken, Map<String,Object> requestBody);
 
     //更新计划状态
     JSONObject updateADStatus(CtopOauthToken oauthToken, JSONObject requestBody);

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

@@ -5,10 +5,19 @@ 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;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+/**
+ * Created by JQ.bi on 2020.09.02
+ */
+@Slf4j
+@Service
 public class CreateProjectServiceImpl implements ICreateProjectService {
 
     @Override
@@ -22,7 +31,8 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
         JSONObject params = new JSONObject();
         params.put("advertiser_id", requestBody.getLong("accountId"));
         params.put("name", requestBody.getString("name"));
-        params.put("scenario", requestBody.getString("scenario"));
+        //暂时写死,只有项目网服定制
+        params.put("scenario", "INTERNET_SERVICE");
         params.put("ad_target", requestBody.getString("adTarget"));
         params.put("delivery_range", requestBody.getString("deliveryRange") == null ? "DEFAULT" : requestBody.getString("deliveryRange"));
         params.put("landing_type", requestBody.getString("landingType"));
@@ -31,7 +41,7 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
     }
 
     @Override
-    public JSONObject updateGroupConvert(CtopOauthToken oauthToken, JSONObject requestBody) {
+    public JSONObject updateGroupConvert(CtopOauthToken oauthToken, Map<String, Object> requestBody) {
 
         //请求头**
         Map<String, String> headers = new HashMap<>();
@@ -39,23 +49,24 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
         headers.put("Access-Token", oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
-        params.put("advertiser_id", requestBody.getLong("accountId"));
-        params.put("group_id",requestBody.getLong("groupId"));
-        params.put("platform",requestBody.getString("platform"));
-        params.put("url",requestBody.getString("url"));
-        params.put("download_mode",requestBody.getString("download_mode")==null?"DEFAULT":requestBody.getString("download_mode"));
-        params.put("web_url",requestBody.getString("webUrl"));
-        params.put("convert_id",requestBody.getString("convertId"));
-        params.put("open_url",requestBody.getString("openUrl"));
-        params.put("download_type",requestBody.getString("downloadType"));
-        params.put("app_type",requestBody.getString("appType"));
+        params.put("advertiser_id", requestBody.get("accountId"));
+        params.put("group_id", requestBody.get("groupId"));
+        params.put("platform", requestBody.get("platform"));
+        params.put("url", requestBody.get("url"));
+        params.put("download_mode", requestBody.get("download_mode") == null ? "DEFAULT" : requestBody.get("download_mode"));
+        params.put("package", requestBody.get("adlabPackage"));
+        params.put("web_url", requestBody.get("webUrl"));
+        params.put("convert_id", requestBody.get("convertId"));
+        params.put("open_url", requestBody.get("openUrl"));
+        params.put("download_type", requestBody.get("downloadType"));
+        params.put("app_type", requestBody.get("appType"));
 
         return JSONObject.parseObject(HttpUtils.httpPostRequest(CreateProjectUrlConstant.ADLAB_GROUP_CONVERT_UPDATE, params, headers));
 
     }
 
     @Override
-    public JSONObject updateGroupAudience(CtopOauthToken oauthToken, JSONObject requestBody) {
+    public JSONObject updateGroupAudience(CtopOauthToken oauthToken, Map<String, Object> requestBody) {
 
         //请求头**
         Map<String, String> headers = new HashMap<>();
@@ -63,68 +74,55 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
         headers.put("Access-Token", oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
-        params.put("advertiser_id", requestBody.getLong("accountId"));
-        params.put("group_id",requestBody.getLong("groupId"));
-        params.put("inventory_type",requestBody.getJSONArray("inventoryType"));
+        params.put("advertiser_id", requestBody.get("accountId"));
+        params.put("group_id", requestBody.get("groupId"));
+        params.put("inventory_type", requestBody.get("inventoryType"));
         //投放范围为穿山甲时可选 ORIGINAL_VIDEO 表示原生,REWARDED_VIDEO 表示激励视频
-        if(requestBody.getString("deliveryRange").equals("UNION")){
-            params.put("union_video_type",requestBody.getJSONArray("unionVideoType"));
+        if (requestBody.get("deliveryRange").equals("UNION")) {
+            params.put("union_video_type", requestBody.get("unionVideoType"));
         }
         //定向信息
-        JSONObject audience=new JSONObject();
-        audience.put("age",requestBody.getJSONArray("age"));
-        audience.put("city",requestBody.getJSONArray("city"));
-        audience.put("district",requestBody.getString("district"));
-        audience.put("gender",requestBody.getString("gender"));
-        audience.put("retargeting_tags_exclude",requestBody.getString("retargetingTagsExclude"));
-        audience.put("retargeting_tags_include",requestBody.getString("retargetingTagsInclude"));
-        if(requestBody.getString("deliveryRange").equals("UNION")){
-            audience.put("superior_popularity_type",requestBody.getString("superiorPopularityType"));
-            audience.put("exclude_flow_package",requestBody.getJSONArray("excludeFlowPackage"));
-            audience.put("flow_package",requestBody.getJSONArray("flowPackage"));
-        }
-        audience.put("auto_extend_enabled",requestBody.getString("autoExtendEnabled")==null?0:requestBody.getString("autoExtendEnabled"));
-        audience.put("auto_extend_targets",requestBody.getString("autoExtendTargets"));
-        params.put("audience",audience);
-        params.put("inventory_types",requestBody.getJSONArray("inventoryTypes"));
+        params.put("audience", requestBody.get("audience"));
+        params.put("inventory_types", requestBody.get("inventoryTypes"));
 
         return JSONObject.parseObject(HttpUtils.httpPostRequest(CreateProjectUrlConstant.ADLAB_GROUP_AUDIENCE_UPDATE, params, headers));
     }
 
     @Override
-    public JSONObject updateGroupCreative(CtopOauthToken oauthToken, JSONObject 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.getLong("accountId"));
-        params.put("group_id",requestBody.getLong("groupId"));
-        params.put("image_info",requestBody.get("imageInfo"));
-        params.put("video_info",requestBody.get("videoInfo"));
-        params.put("title", requestBody.getJSONArray("scenario"));
-        params.put("app_name", requestBody.getString("appName"));
-        params.put("source", requestBody.getString("source"));
-        params.put("is_follow_material", requestBody.getString("isFollowMaterial"));
-        params.put("third_industry_id", requestBody.getString("thirdIndustryId"));
-        params.put("ad_keywords", requestBody.getJSONArray("adKeywords"));
-        params.put("playable_url", requestBody.getString("playableUrl"));
-        params.put("action_track_url", requestBody.getString("actionTrackUrl"));
-        params.put("track_url", requestBody.getString("trackUrl"));
-        if(!requestBody.getString("deliveryRange").equals("UNION")){
-            params.put("video_play_track_url", requestBody.getString("videoPlayTrackUrl"));
-            params.put("video_play_done_track_url", requestBody.getString("videoPlayDoneTrackUrl"));
-            params.put("video_play_effective_track_url", requestBody.getString("videoPlayEffectiveTrackUrl"));
+        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("title"));
+        params.put("app_name", requestBody.get("appName"));
+        params.put("source", requestBody.get("source"));
+        params.put("is_follow_material", requestBody.get("isFollowMaterial"));
+        params.put("third_industry_id", requestBody.get("thirdIndustryId"));
+        params.put("ad_keywords", requestBody.get("adKeywords"));
+        params.put("playable_url", requestBody.get("playableUrl"));
+        params.put("action_track_url", requestBody.get("actionTrackUrl"));
+        params.put("track_url", requestBody.get("trackUrl"));
+        if (!requestBody.get("deliveryRange").equals("UNION")) {
+            params.put("video_play_track_url", requestBody.get("videoPlayTrackUrl"));
+            params.put("video_play_done_track_url", requestBody.get("videoPlayDoneTrackUrl"));
+            params.put("video_play_effective_track_url", requestBody.get("videoPlayEffectiveTrackUrl"));
         }
-        params.put("creative_auto_generate_switch",requestBody.getString("creativeAutoGenerateSwitch"));
-
+        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, JSONObject requestBody) {
+    public JSONObject updateGroupBudget(CtopOauthToken oauthToken, Map<String, Object> requestBody) {
 
         //请求头**
         Map<String, String> headers = new HashMap<>();
@@ -132,18 +130,41 @@ public class CreateProjectServiceImpl implements ICreateProjectService {
         headers.put("Access-Token", oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
-        params.put("advertiser_id", requestBody.getLong("accountId"));
-        params.put("group_id",requestBody.getLong("groupId"));
-        params.put("bid", requestBody.getFloat("bid"));
-        params.put("budget_mode", requestBody.getString("budgetMode")==null?"DAILY":requestBody.getString("budgetMode"));
-        params.put("budget", requestBody.getString("budget"));
-        params.put("auto_stop", requestBody.getString("autoStop")==null?0:requestBody.getString("autoStop"));
-        params.put("deep_bid", requestBody.getString("deepBid"));
-        params.put("start_time", requestBody.getString("startTime"));
-        params.put("end_time", requestBody.getString("endTime"));
-        params.put("week_time", requestBody.getString("weekTime"));
+        params.put("advertiser_id", requestBody.get("accountId"));
+        params.put("group_id", requestBody.get("groupId"));
+        params.put("bid", requestBody.get("bid"));
+        params.put("budget_mode", requestBody.get("budgetMode") == null ? "DAILY" : requestBody.get("budgetMode"));
+        params.put("budget", requestBody.get("budget"));
+        params.put("auto_stop", requestBody.get("autoStop") == null ? 0 : requestBody.get("autoStop"));
+        params.put("deep_bid", requestBody.get("deepBid"));
+        params.put("start_time", requestBody.get("startTime"));
+        params.put("end_time", requestBody.get("endTime"));
+        //weekTime字段需要处理为number[number[]]
+        params.put("week_time", weekTimeHandle((String) requestBody.get("weekTime")));
 
         return JSONObject.parseObject(HttpUtils.httpPostRequest(CreateProjectUrlConstant.ADLAB_GROUP_BUDGET_UPDATE, params, headers));
     }
 
+    private List<List<Integer>> weekTimeHandle(String weekTime) {
+        List<List<Integer>> weekTime2List = null;
+        if (!weekTime.isEmpty() || (weekTime.contains("0") && weekTime.contains("1"))) {
+            weekTime2List = weekTime2List = new ArrayList();
+            char[] chars = weekTime.toCharArray();
+            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 = new ArrayList<>();
+                } else {
+                    if (chars[i] == '1') {
+                        temp.add(i % 48);
+                    }
+                }
+            }
+        }
+        return weekTime2List;
+    }
 }

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

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

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

@@ -0,0 +1,15 @@
+package cn.com.ctop.toutiao.modules.adlab.service.impl;
+
+import cn.com.ctop.toutiao.modules.adlab.entity.CtopAdlabProject;
+import cn.com.ctop.toutiao.modules.adlab.mapper.CtopAdlabProjectMapper;
+import cn.com.ctop.toutiao.modules.adlab.service.ICtopAdlabProjectService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * 投放管家项目列表
+ */
+@Service
+public class CtopAdlabProjectServiceImpl extends ServiceImpl<CtopAdlabProjectMapper, CtopAdlabProject> implements ICtopAdlabProjectService {
+
+}

+ 36 - 9
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/adlab/service/impl/GetProjectServiceImpl.java

@@ -5,30 +5,30 @@ import cn.com.ctop.common.module.utils.HttpUtils;
 import cn.com.ctop.toutiao.modules.adlab.constants.GetProjectUrlConstant;
 import cn.com.ctop.toutiao.modules.adlab.service.IGetProjectService;
 import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
 import java.util.Map;
 
+@Service
 public class GetProjectServiceImpl implements IGetProjectService {
 
     @Override
-    public JSONObject getGroup(CtopOauthToken oauthToken, JSONObject requestBody) {
-
+    public JSONObject getGroup(CtopOauthToken oauthToken, Long accountId, Long groupId) {
         //请求头**
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "application/json");
         headers.put("Access-Token", oauthToken.getAccessToken());
         //请求参数
         JSONObject params = new JSONObject();
-        params.put("advertiser_id", requestBody.getLong("accountId"));
-        params.put("group_id", requestBody.getString("groupId"));
-        params.put("campaign_id", requestBody.getString("campaignId"));
+        params.put("advertiser_id", accountId);
+        params.put("group_id", groupId);
 
         return JSONObject.parseObject(HttpUtils.httpGetRequest(GetProjectUrlConstant.ADLAB_GROUP_GET, headers, params));
     }
 
     @Override
-    public JSONObject getMaterial(CtopOauthToken oauthToken, JSONObject requestBody) {
+    public JSONObject getMaterialInfo(CtopOauthToken oauthToken, JSONObject requestBody) {
         //请求头**
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "application/json");
@@ -37,16 +37,43 @@ public class GetProjectServiceImpl implements IGetProjectService {
         JSONObject params = new JSONObject();
         params.put("advertiser_id", requestBody.getLong("accountId"));
         params.put("group_id", requestBody.getString("groupId"));
-        return null;
+
+        return JSONObject.parseObject(HttpUtils.httpGetRequest(GetProjectUrlConstant.ADLAB_GROUP_MATERIAL_GET, headers, params));
     }
 
     @Override
     public JSONObject getGroups(CtopOauthToken oauthToken, JSONObject requestBody) {
-        return null;
+
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        JSONObject filtering = new JSONObject();
+        filtering.put("campaign_ids", requestBody.getJSONArray("campaignIds"));
+        filtering.put("combo_status", requestBody.getString("comboStatus"));
+        filtering.put("group_ids", requestBody.getJSONArray("groupIds"));
+        filtering.put("group_name", requestBody.getString("groupName"));
+        filtering.put("landing_types", requestBody.getString("landingTypes"));
+        params.put("filtering", filtering);
+        //TODO 设置  pageSize pageNo
+        return JSONObject.parseObject(HttpUtils.httpGetRequest(GetProjectUrlConstant.ADLAB_GROUPS_GET, headers, params));
     }
 
     @Override
     public JSONObject getAds(CtopOauthToken oauthToken, JSONObject requestBody) {
-        return null;
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        params.put("ad_ids", requestBody.getString("adIds"));
+
+        return JSONObject.parseObject(HttpUtils.httpGetRequest(GetProjectUrlConstant.ADLAB_ADS_GET, headers, params));
+
     }
 }

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

@@ -1,6 +1,91 @@
 package cn.com.ctop.toutiao.modules.adlab.service.impl;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.toutiao.modules.adlab.constants.PlanAnalyzeReport;
 import cn.com.ctop.toutiao.modules.adlab.service.IPlanAnalyzeReportService;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
 public class PlanAnalyzeReportServiceImpl implements IPlanAnalyzeReportService {
+
+    @Override
+    public JSONObject updateAdBid(CtopOauthToken oauthToken, JSONObject requestBody) {
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        params.put("ad_id", requestBody.getString("adId"));
+        //给计划设置的新出价,0表示跟项目出价保持一致
+        params.put("bid", requestBody.getFloat("bid"));
+
+        return JSONObject.parseObject(HttpUtils.httpPostRequest(PlanAnalyzeReport.ADLAB_AD_BID_UPDATE, params, headers));
+    }
+
+    @Override
+    public JSONObject updateAdBudget(CtopOauthToken oauthToken, JSONObject requestBody) {
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        params.put("group_id", requestBody.getString("groupId"));
+        //设置的追加预算金额
+        params.put("budget", requestBody.getFloat("budget"));
+        //需要追加预算的计划列表,这些计划会共享这个追加的预算,并且必须属于group_id对应项目.
+        params.put("ad_ids", requestBody.getJSONArray("adIds"));
+
+        return JSONObject.parseObject(HttpUtils.httpPostRequest(PlanAnalyzeReport.ADLAB_AD_BUDGET_UPDATE, params, headers));
+    }
+
+    @Override
+    public JSONObject updateAdBudgetCancel(CtopOauthToken oauthToken, JSONObject requestBody) {
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        params.put("ad_id", requestBody.getString("adId"));
+
+        return JSONObject.parseObject(HttpUtils.httpPostRequest(PlanAnalyzeReport.ADLAB_AD_BUDGET_CANCEL, params, headers));
+    }
+
+    @Override
+    public JSONObject getBudget(CtopOauthToken oauthToken, JSONObject requestBody) {
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+
+        return JSONObject.parseObject(HttpUtils.httpGetRequest(PlanAnalyzeReport.ADLAB_BUDGET_GET, headers, params));
+    }
+
+    @Override
+    public JSONObject getGroupAds(CtopOauthToken oauthToken, JSONObject requestBody) {
+        //请求头**
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", oauthToken.getAccessToken());
+        //请求参数
+        JSONObject params = new JSONObject();
+        params.put("advertiser_id", requestBody.getLong("accountId"));
+        params.put("group_id", requestBody.getLong("groupId"));
+
+        return JSONObject.parseObject(HttpUtils.httpGetRequest(PlanAnalyzeReport.ADLAB_BUDGET_GET, headers, params));
+    }
+
 }

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

@@ -5,23 +5,34 @@ 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;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+@Slf4j
+@Service
 public class UpdateProjectServiceImpl implements IUpdateProjectService {
 
     @Override
-    public JSONObject updateGroupStatus(CtopOauthToken oauthToken, JSONObject requestBody) {
+    public JSONObject updateGroupStatus(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.getLong("accountId"));
-        params.put("group_ids", requestBody.getJSONArray("groupIds"));
+        params.put("advertiser_id", requestBody.get("accountId"));
+        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;
+    }
+
+}

+ 7 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/constants/QueryToolUrlConstant.java

@@ -37,4 +37,11 @@ public class QueryToolUrlConstant {
 
     //【新】查询计划可用转化id
     public static final String AD_CONVERT_QUERY="https://ad.oceanengine.com/open_api/2/tools/ad_convert/query/";
+
+    //获取视频素材
+    public static final String FILE_VIDEO_GET="https://ad.oceanengine.com/open_api/2/file/video/get/";
+
+    //获取图片素材
+    public static final String FILE_IMAGE_GET="https://ad.oceanengine.com/open_api/2/file/image/get/";
+
 }

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

@@ -2,13 +2,13 @@ package cn.com.ctop.toutiao.modules.tool.controller;
 
 import cn.com.ctop.common.module.service.ICtopOauthTokenService;
 import cn.com.ctop.toutiao.modules.tool.service.IByteDanceConvertToolService;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceQueryMaterialInfoService;
+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.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -24,6 +24,9 @@ public class ByteDanceQueryToolController {
     private IByteDanceConvertToolService byteDanceConvertToolService;
 
     @Autowired
+    private IByteDanceQueryMaterialInfoService byteDanceQueryMaterialInfoService;
+
+    @Autowired
     ICtopOauthTokenService ctopOauthTokenService;
 
     /**
@@ -46,6 +49,35 @@ public class ByteDanceQueryToolController {
         return result;
     }
 
+    @PostMapping(value="/queryVideoInfo")
+    public Result<JSONArray> queryVideoInfo(@RequestBody JSONObject requestBody){
+        Long accountId=requestBody.getLong("accountId");
+        JSONArray signatures=requestBody.getJSONArray("signatures");
+        Result<JSONArray> result=new Result<>();
+        JSONObject jsonObject = byteDanceQueryMaterialInfoService.queryVideoInfo(ctopOauthTokenService.getTokenByAccountId(accountId),accountId,signatures);
+        if(jsonObject.getInteger("code")!=0){
+            result.error500("视频素材信息查询失败");
+        }else{
+            result.setSuccess(true);
+            result.setResult(jsonObject.getJSONObject("data").getJSONArray("list"));
+        }
+        return result;
+    }
+    @PostMapping(value="/queryImageInfo")
+    public Result<JSONArray> queryImageInfo(@RequestBody JSONObject requestBody){
+        Long accountId=requestBody.getLong("accountId");
+        JSONArray signatures=requestBody.getJSONArray("signatures");
+        Result<JSONArray> result=new Result<>();
+        JSONObject jsonObject = byteDanceQueryMaterialInfoService.queryImageInfo(ctopOauthTokenService.getTokenByAccountId(accountId),accountId,signatures);
+        if(jsonObject.getInteger("code")!=0){
+            result.error500("图片素材信息查询失败");
+        }else{
+            result.setSuccess(true);
+            result.setResult(jsonObject.getJSONObject("data").getJSONArray("list"));
+        }
+        return result;
+    }
+
     private Map<String,Object> ConvertResultHandle(List convertResult){
         Map<String,Object> resultMap=new HashMap<>();
         if(convertResult.isEmpty()){

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

@@ -0,0 +1,71 @@
+package cn.com.ctop.toutiao.modules.tool.controller;
+
+import cn.com.ctop.common.module.utils.ParseInstallPackageUtil;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("/ctop/queryTool")
+public class ParseInstallPackageController {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @PostMapping("/parseInstallPackage")
+    public Result<Map<String,String>> installPackageParse(@RequestParam String installUrl,
+                                                          @RequestParam String appType) {
+        Result<Map<String, String>> result = new Result<>();
+        //在此不需要判断安装包类型拼接后缀
+        //String installPath="C:\\Users\\Arc\\Desktop\\install"+System.currentTimeMillis();
+        String installPath="/data/webpackage/install"+System.currentTimeMillis();
+        byte[] bytes = restTemplate.postForObject(installUrl, null, byte[].class);
+        if (null == bytes || bytes.length == 0) {
+            result.error500("请输入正确的下载链接");
+        } else {
+            File file = new File(installPath);
+            OutputStream outputStream = null;
+            try {
+                    outputStream = new FileOutputStream(file, true);
+                    outputStream.write(bytes);
+                    outputStream.flush();
+            } catch (IOException e) {
+                log.error("下载安装包失败>>>ParseInstallPackageController"+e.getMessage());
+            } finally {
+                if (outputStream != null) {
+                    try {
+                        outputStream.close();
+                    } catch (IOException e) {
+                        log.error(e.getMessage());
+                    }
+                }
+            }
+            Map<String, String> packageInfo=new HashMap<>();
+            if(appType.equals("APP_ANDROID")){
+                packageInfo=ParseInstallPackageUtil.parseAPK(installPath);
+            }else if(appType.equals("APP_IOS")){
+                packageInfo=ParseInstallPackageUtil.parseIpa(installPath);
+            }
+            if(packageInfo.isEmpty()){
+                result.error500("请选择正确的安装包类型");
+            }else {
+                result.setSuccess(true);
+                result.setResult(packageInfo);
+            }
+        }
+        return result;
+    }
+}

+ 13 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/IByteDanceQueryMaterialInfoService.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.toutiao.modules.tool.service;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+public interface IByteDanceQueryMaterialInfoService {
+
+    JSONObject queryVideoInfo(CtopOauthToken token, Long accountId, JSONArray signatures);
+
+    JSONObject queryImageInfo(CtopOauthToken token, Long accountId, JSONArray signatures);
+
+}

+ 49 - 0
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/service/impl/ByteDanceQueryMaterialInfoServiceImpl.java

@@ -0,0 +1,49 @@
+package cn.com.ctop.toutiao.modules.tool.service.impl;
+
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.toutiao.modules.tool.constants.QueryToolUrlConstant;
+import cn.com.ctop.toutiao.modules.tool.service.IByteDanceQueryMaterialInfoService;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class ByteDanceQueryMaterialInfoServiceImpl implements IByteDanceQueryMaterialInfoService {
+
+    @Override
+    public JSONObject queryVideoInfo(CtopOauthToken token, Long accountId, JSONArray signatures) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",accountId);
+        JSONObject filtering=new JSONObject();
+        filtering.put("signatures",signatures);
+        params.put("filtering",filtering);
+
+        return JSONObject.parseObject(HttpUtils.httpGet(QueryToolUrlConstant.FILE_VIDEO_GET, params, headers));
+    }
+
+    @Override
+    public JSONObject queryImageInfo(CtopOauthToken token, Long accountId, JSONArray signatures) {
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/json");
+        headers.put("Access-Token", token.getAccessToken());
+
+        JSONObject params=new JSONObject();
+        params.put("advertiser_id",accountId);
+        JSONObject filtering=new JSONObject();
+        filtering.put("signatures",signatures);
+        params.put("filtering",filtering);
+
+        return JSONObject.parseObject(HttpUtils.httpGet(QueryToolUrlConstant.FILE_IMAGE_GET, params, headers));
+    }
+
+}

+ 1 - 1
module-toutiao/src/main/java/cn/com/ctop/toutiao/modules/tool/util/JsonObjectToJsonStringUtil.java

@@ -3,7 +3,7 @@ package cn.com.ctop.toutiao.modules.tool.util;
 import cn.com.ctop.toutiao.modules.material.entity.ByteDanceAudiencePackage;
 import com.alibaba.fastjson.JSONObject;
 
-public class JsonObjectToJsonStringUtil {
+public class  JsonObjectToJsonStringUtil {
 
     public static ByteDanceAudiencePackage toAudiencePackage(ByteDanceAudiencePackage byteDanceAudiencePackage) {
         if (byteDanceAudiencePackage.getRetargetingTags() != null) {

+ 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": "分享数"
+  }
+}