فهرست منبع

Merge remote-tracking branch 'origin/test' into test

xuzuoyun 5 سال پیش
والد
کامیت
992f5deb32
19فایلهای تغییر یافته به همراه873 افزوده شده و 2 حذف شده
  1. 1 0
      jeecg-boot-module-system/src/main/java/org/jeecg/config/ShiroConfig.java
  2. 50 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/ctop/controller/TestController.java
  3. 55 0
      jeecg-boot-module-system/src/test/java/org/jeecg/SampleTest.java
  4. 79 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/ExportExcelUtils.java
  5. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouCampaignMapper.xml
  6. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  7. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportDailyGroup.java
  8. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportHourlyGroup.java
  9. 8 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/mapper/xml/KuaishouReportHourlyGroupMapper.xml
  10. 146 0
      module-report/src/main/java/cn/com/ctop/bytedance/controller/DailyReportController.java
  11. 73 0
      module-report/src/main/java/cn/com/ctop/bytedance/controller/ExcelExportUtil.java
  12. 39 0
      module-report/src/main/java/cn/com/ctop/bytedance/entity/ExcelExp.java
  13. 13 0
      module-report/src/main/java/cn/com/ctop/bytedance/mapper/DailyReportMapper.java
  14. 234 0
      module-report/src/main/java/cn/com/ctop/bytedance/mapper/xml/DailyReportMapper.xml
  15. 18 0
      module-report/src/main/java/cn/com/ctop/bytedance/service/IDailyReportService.java
  16. 76 0
      module-report/src/main/java/cn/com/ctop/bytedance/service/impl/DailyReportServiceImpl.java
  17. 24 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyAccountReportVO.java
  18. 30 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyGroupReportVO.java
  19. 13 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyReportVO.java

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

@@ -125,6 +125,7 @@ public class ShiroConfig {
 
         filterChainDefinitionMap.put("/system/userCompany/**", "anon");
 		filterChainDefinitionMap.put("/qywexin", "anon");
+		filterChainDefinitionMap.put("/test/getGroupData/**", "anon");
 
 
 

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

@@ -1,12 +1,19 @@
 package org.jeecg.modules.ctop.controller;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
 import cn.com.ctop.kuaishou.modules.graphql.service.IKuaishouWebInterfaceService;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.ctop.service.ICreateInternalService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
@@ -46,4 +53,47 @@ public class TestController {
     }
 
 
+    @Autowired
+    private CtopOauthTokenMapper tokenMapper;
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+
+    @GetMapping(value = "/getGroupData")
+    public String getGroupData() {
+
+
+        Date endDate = new Date();
+        QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+        tokenQueryWrapper.eq("media_id", 2);
+        List<CtopOauthToken> ctopOauthTokens = tokenMapper.selectList(tokenQueryWrapper);
+        for (CtopOauthToken token : ctopOauthTokens) {
+
+
+            for (int i = 0; i < 7; i++) {
+                Date getStartDate = DateUtils.addDay(endDate, -i);
+
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportHourly(token, getStartDate, getStartDate);
+
+            }
+            for (int i = 0; i < 6; i++) {
+                Date getStartDate = new Date();
+                Date getEndDate = new Date();
+                if (i == 0) {
+                    getStartDate = DateUtils.addDay(endDate, -175 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                } else {
+                    getStartDate = DateUtils.addDay(endDate, -180 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                }
+
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportDaily(token, getStartDate, getEndDate);
+
+            }
+
+
+        }
+        return "Success";
+    }
 }

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

@@ -1,10 +1,15 @@
 package org.jeecg;
 
+import cn.com.ctop.common.module.entity.CtopOauthToken;
+import cn.com.ctop.common.module.mapper.CtopOauthTokenMapper;
 import cn.com.ctop.common.module.utils.HttpUtils2;
 import cn.com.ctop.crawler.modules.appium.service.IAppiumJobService;
 import cn.com.ctop.crawler.modules.appium.service.IAppiumTaskService;
+import cn.com.ctop.kuaishou.modules.batch.service.IKuaishouInterfaceService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.impl.client.BasicCookieStore;
+import org.jeecg.common.util.DateUtils;
 import org.jeecg.modules.ctop.service.ICreateInternalService;
 import org.jeecg.modules.mq.Sender;
 import org.junit.Test;
@@ -19,6 +24,9 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.Date;
+import java.util.List;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest
 @Slf4j
@@ -31,6 +39,7 @@ public class SampleTest {
     private ICreateInternalService createInternalService;
     @Autowired
     private IAppiumTaskService appiumTaskService;
+
     @Test
     public void testKs() throws InterruptedException {
         String url = "https://ad.e.kuaishou.com/#/welcome?redirectUrl=https%3A%2F%2Fad.e.kuaishou.com%2F%23%2Findex";
@@ -103,4 +112,50 @@ public class SampleTest {
         Sender sender = new Sender();
         sender.send();
     }
+
+    @Autowired
+    private IKuaishouInterfaceService kuaishouInterfaceService;
+    @Autowired
+    private CtopOauthTokenMapper tokenMapper;
+
+    @Test
+    public void loadKuaishouDataSingle() {
+
+
+        Date endDate = new Date();
+        QueryWrapper<CtopOauthToken> tokenQueryWrapper = new QueryWrapper<>();
+        tokenQueryWrapper.eq("media_id", 2);
+        List<CtopOauthToken> ctopOauthTokens = tokenMapper.selectList(tokenQueryWrapper);
+        for (CtopOauthToken token : ctopOauthTokens) {
+
+
+            for (int i = 0; i < 7; i++) {
+                Date getStartDate = DateUtils.addDay(endDate, -i);
+
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportHourly(token, getStartDate, getStartDate);
+
+            }
+            for (int i = 0; i < 6; i++) {
+                Date getStartDate = new Date();
+                Date getEndDate = new Date();
+                if (i == 0) {
+                    getStartDate = DateUtils.addDay(endDate, -175 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                } else {
+                    getStartDate = DateUtils.addDay(endDate, -180 + i * 30);
+                    getEndDate = DateUtils.addDay(endDate, -150 + i * 30);
+                }
+
+                //3:获取广告组信息数据
+                kuaishouInterfaceService.getAdvertiserGroupReportDaily(token, getStartDate, getEndDate);
+
+            }
+
+
+        }
+
+
+    }
+
 }

+ 79 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/ExportExcelUtils.java

@@ -0,0 +1,79 @@
+package cn.com.ctop.common.module.utils;
+
+import org.apache.poi.hssf.usermodel.HSSFCellStyle;
+import org.apache.poi.hssf.usermodel.HSSFFont;
+import org.apache.poi.hssf.usermodel.HSSFRichTextString;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.xssf.usermodel.*;
+
+import java.util.List;
+
+public class ExportExcelUtils {
+
+
+    /**
+     * @param workbook
+     * @param sheetNum   (sheet的位置,0表示第一个表格中的第一个sheet)
+     * @param sheetTitle (sheet的名称)
+     * @param headers    (表格的标题)
+     * @param result     (表格的数据)
+     * @return
+     * @throws Exception
+     * @Title: exportExcel
+     * @Description: 导出Excel的方法
+     * @author: evan @ 2014-01-09
+     */
+    public void exportExcel(XSSFWorkbook workbook, int sheetNum,
+                            String sheetTitle, String[] headers, List<List<String>> result) throws Exception {
+        // 生成一个表格
+        XSSFSheet sheet = workbook.createSheet();
+        workbook.setSheetName(sheetNum, sheetTitle);
+        // 设置表格默认列宽度为20个字节
+        sheet.setDefaultColumnWidth((short) 20);
+        // 生成一个样式
+        XSSFCellStyle style = workbook.createCellStyle();
+        // 设置这些样式
+        style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
+        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
+        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
+        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
+        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
+        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
+        // 生成一个字体
+        XSSFFont font = workbook.createFont();
+        font.setColor(HSSFColor.BLACK.index);
+        font.setFontHeightInPoints((short) 12);
+        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+        // 把字体应用到当前的样式
+        style.setFont(font);
+
+        // 指定当单元格内容显示不下时自动换行
+        style.setWrapText(true);
+
+        // 产生表格标题行
+        XSSFRow row = sheet.createRow(0);
+        for (int i = 0; i < headers.length; i++) {
+            XSSFCell cell = row.createCell((short) i);
+
+            cell.setCellStyle(style);
+            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
+            cell.setCellValue(text.toString());
+        }
+        // 遍历集合数据,产生数据行
+        if (result != null) {
+            int index = 1;
+            for (List<String> m : result) {
+                row = sheet.createRow(index);
+                int cellIndex = 0;
+                for (String str : m) {
+                    XSSFCell cell = row.createCell((short) cellIndex);
+                    cell.setCellValue(str);
+                    cellIndex++;
+                }
+                index++;
+            }
+        }
+    }
+
+}

+ 1 - 1
module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/mapper/xml/KuaiShouCampaignMapper.xml

@@ -24,7 +24,7 @@
             #{campaign.campaignName},
             #{campaign.status},
             #{campaign.dayBudget},
-            #{campaign.campaign_type},
+            #{campaign.campaignType},
             #{campaign.putStatus},
             #{campaign.createChannel},
             #{campaign.putCreateTime},

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

@@ -947,7 +947,7 @@ public class KuaishouInterfaceServiceImpl implements IKuaishouInterfaceService {
 
             //获取全量广告计划数据
             getCampaignList(token, null, null);
-            //获取全量广主数据
+            //获取全量广主数据
             getGroupList(token, null, null);
             //获取全量创意数据
             getCreativeList(token, null, null);

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

@@ -19,8 +19,13 @@ public class KuaishouReportDailyGroup implements Serializable {
 
     private Long accountId;
 
+    private Long campaignId;
+    private String campaignName;
+
     @JsonProperty("unit_id")
     private Long unitId;
+    private String unitName;
+    private Integer status;
 
     @JsonProperty("stat_date")
     private String statDate;

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

@@ -17,8 +17,15 @@ public class KuaishouReportHourlyGroup implements Serializable {
     @TableId
     private String id;
     private Long accountId;
+
+    private Long campaignId;
+    private String campaignName;
+
     @JsonProperty("unit_id")
     private Long unitId;
+    private String unitName;
+    private Integer status;
+
     @JsonProperty("stat_date")
     private String statDate;
     @JsonProperty("stat_hour")

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

@@ -5,7 +5,11 @@
         replace into ctop_kuaishou_report_hourly_group(
         id,
         account_id,
+        campaign_id,
+        campaign_name,
         unit_id,
+        unit_name,
+        status,
         stat_date,
         stat_hour,
         charge,
@@ -59,7 +63,11 @@
         <foreach collection="groups" item="campaign" separator=",">
             (#{campaign.id},
             #{campaign.accountId},
+            #{campaign.campaignId},
+            #{campaign.campaignName},
             #{campaign.unitId},
+            #{campaign.unitName},
+            #{campaign.status},
             #{campaign.statDate},
             #{campaign.statHour},
             #{campaign.charge},

+ 146 - 0
module-report/src/main/java/cn/com/ctop/bytedance/controller/DailyReportController.java

@@ -0,0 +1,146 @@
+package cn.com.ctop.bytedance.controller;
+
+import cn.com.ctop.bytedance.service.IDailyReportService;
+import cn.com.ctop.bytedance.vo.DailyAccountReportVO;
+import cn.com.ctop.bytedance.vo.DailyGroupReportVO;
+import cn.com.ctop.bytedance.vo.DailyReportVO;
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.ExportExcelUtils;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Api(tags = "广告主日报表")
+@RestController
+@RequestMapping("/ctop/daily")
+public class DailyReportController {
+    @Autowired
+    private IDailyReportService dailyReportService;
+
+
+    @PostMapping(value = "/getDailyReport")
+    public Result<DailyReportVO> getDailyReport(@RequestBody JSONObject requestJson) {
+
+        Result<DailyReportVO> result = new Result<>();
+        try {
+            DailyReportVO dailyReport = dailyReportService.getDailyReport(requestJson);
+            result.setSuccess(true);
+            result.setResult(dailyReport);
+
+        } catch (Exception e) {
+            result.setSuccess(false);
+
+            e.printStackTrace();
+
+        }
+        return result;
+
+    }
+
+
+    /**
+     * 导出报表
+     *
+     * @return
+     */
+    @RequestMapping(value = "/exportDailyReport")
+    @ResponseBody
+    public void export(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject requestJson) throws Exception {
+        DailyReportVO dailyReport = dailyReportService.getDailyReport(requestJson);
+
+        List<List<String>> accountData = new ArrayList<>();
+        if (!Check.isNull(dailyReport)) {
+            DailyAccountReportVO dailyAccountReport = dailyReport.getDailyAccountReport();
+            if (!Check.isNull(dailyAccountReport)) {
+                List rowData = new ArrayList();
+                rowData.add(requestJson.getString("date")); // 时间
+                rowData.add(String.valueOf(dailyAccountReport.getCost())); // 消耗
+                rowData.add(String.valueOf(dailyAccountReport.getContractRebateRealCharged())); // 激励花费
+                rowData.add(String.valueOf(dailyAccountReport.getActualCost())); // 实际花费
+                rowData.add(String.valueOf(dailyAccountReport.getPhotoShow())); // 展示数
+                rowData.add(String.valueOf(dailyAccountReport.getPhotoClick())); // 点击数
+                rowData.add(String.valueOf(dailyAccountReport.getPhotoClickRatio())); // 点击率
+                rowData.add(String.valueOf(dailyAccountReport.getPhotoClickCost())); // 平均点击花费
+                rowData.add(String.valueOf(dailyAccountReport.getBclick())); // 行为数
+                rowData.add(String.valueOf(dailyAccountReport.getActionRatio())); // 行为率
+                rowData.add(String.valueOf(dailyAccountReport.getImpression1kCost())); // 平均千次展现花费
+                rowData.add(String.valueOf(dailyAccountReport.getConversions())); // 转化数
+                rowData.add(String.valueOf(dailyAccountReport.getConversionPrice())); // 转化单价
+                rowData.add(String.valueOf(dailyAccountReport.getConversionRate())); // 转化率
+                rowData.add(String.valueOf(dailyAccountReport.getDiscountConversionPrice())); // 折后转化成本
+                accountData.add(rowData);
+            }
+        }
+
+        List<List<String>> group = new ArrayList<>();
+        List<DailyGroupReportVO> dailyGroupReport = dailyReport.getDailyGroupReport();
+        if (!Check.isNull(dailyGroupReport)) {
+            for (DailyGroupReportVO groupReportVO : dailyGroupReport) {
+                List dailyGroup = new ArrayList();
+                dailyGroup.add(String.valueOf(groupReportVO.getAccountId()));
+                dailyGroup.add(String.valueOf(groupReportVO.getAuthName()));
+                dailyGroup.add(String.valueOf(groupReportVO.getStatDate()));
+                dailyGroup.add(String.valueOf(groupReportVO.getCampaignName()));
+                dailyGroup.add(String.valueOf(groupReportVO.getUnitName()));
+                dailyGroup.add(String.valueOf(groupReportVO.getCost()));
+                dailyGroup.add(String.valueOf(groupReportVO.getDisCountCost()));
+                dailyGroup.add(String.valueOf(groupReportVO.getPhotoShow()));
+                dailyGroup.add(String.valueOf(groupReportVO.getPhotoClick()));
+                dailyGroup.add(String.valueOf(groupReportVO.getBclick()));
+                dailyGroup.add(String.valueOf(groupReportVO.getActionRatio()));
+                dailyGroup.add(String.valueOf(groupReportVO.getImpression1kCost()));
+                dailyGroup.add(String.valueOf(groupReportVO.getPhotoClickCost()));
+                dailyGroup.add(String.valueOf(groupReportVO.getConversions()));
+                dailyGroup.add(String.valueOf(groupReportVO.getConversionPrice()));
+                dailyGroup.add(String.valueOf(groupReportVO.getClickConversionRate()));
+                dailyGroup.add(String.valueOf(groupReportVO.getDiscountConversionPrice()));
+                group.add(dailyGroup);
+            }
+
+        }
+
+
+        String[] accountHeaders = {"时间", "消耗", "激励花费", "实际消耗", "展示数", "点击数", "点击率", "平均点击花费", "行为数", "行为率", "平均千次展现花费", "转化数", "转化单价", "转化率", "折后转化成本"};
+        String[] groupHeaders = {"账号", "账号名称", "日期", "计划名称", "广告组名称", "消耗", "折后消耗", "展示数", "点击数", "行为数", "行为率", "平均千次展示花费", "平均点击花费", "转化数", "转化单价", "点击转化率", "折后转化成本"};
+        OutputStream os = response.getOutputStream();
+        ExportExcelUtils eeu = new ExportExcelUtils();
+        XSSFWorkbook workbook = new XSSFWorkbook();
+        eeu.exportExcel(workbook, 0, "分日数据", accountHeaders, accountData);
+        eeu.exportExcel(workbook, 1, "分组数据", groupHeaders, group);
+        this.setResponseHeader(response, "日报.xls");
+        workbook.write(os);
+        os.flush();
+        os.close();
+    }
+
+    //发送响应流方法
+    public void setResponseHeader(HttpServletResponse response, String fileName) {
+        try {
+            try {
+                fileName = new String(fileName.getBytes(), "ISO8859-1");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            response.setContentType("application/octet-stream;charset=ISO8859-1");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.addHeader("Pargam", "no-cache");
+            response.addHeader("Cache-Control", "no-cache");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+    }
+
+
+}

+ 73 - 0
module-report/src/main/java/cn/com/ctop/bytedance/controller/ExcelExportUtil.java

@@ -0,0 +1,73 @@
+package cn.com.ctop.bytedance.controller;
+
+import cn.com.ctop.bytedance.entity.ExcelExp;
+import org.apache.poi.hssf.usermodel.*;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class ExcelExportUtil {
+    public static void exportManySheetExcel(String file, List<ExcelExp> mysheets) {
+
+        HSSFWorkbook wb = new HSSFWorkbook();//创建工作薄
+        List<ExcelExp> sheets = mysheets;
+
+        //表头样式
+        HSSFCellStyle style = wb.createCellStyle();
+        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
+        //字体样式
+        HSSFFont fontStyle = wb.createFont();
+        fontStyle.setFontName("微软雅黑");
+        fontStyle.setFontHeightInPoints((short) 12);
+        fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
+        style.setFont(fontStyle);
+
+        for (ExcelExp excel : sheets) {
+            //新建一个sheet
+            HSSFSheet sheet = wb.createSheet(excel.getFileName());//获取该sheet名称
+
+            String[] handers = excel.getHanders();//获取sheet的标题名
+            HSSFRow rowFirst = sheet.createRow(0);//第一个sheet的第一行为标题
+            //写标题
+            for (int i = 0; i < handers.length; i++) {
+                //获取第一行的每个单元格
+                HSSFCell cell = rowFirst.createCell(i);
+                //往单元格里写数据
+                cell.setCellValue(handers[i]);
+                cell.setCellStyle(style); //加样式
+                sheet.setColumnWidth(i, 4000); //设置每列的列宽
+            }
+
+            //写数据集
+            List<String[]> dataset = excel.getDataset();
+            for (int i = 0; i < dataset.size(); i++) {
+                String[] data = dataset.get(i);//获取该对象
+
+                //创建数据行
+                HSSFRow row = sheet.createRow(i + 1);
+
+                for (int j = 0; j < data.length; j++) {
+                    //设置对应单元格的值
+                    row.createCell(j).setCellValue(data[j]);
+                }
+            }
+        }
+
+        // 写文件
+        try {
+
+            FileOutputStream out = new FileOutputStream(new File(file));
+            out.flush();
+            wb.write(out);
+            out.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 39 - 0
module-report/src/main/java/cn/com/ctop/bytedance/entity/ExcelExp.java

@@ -0,0 +1,39 @@
+package cn.com.ctop.bytedance.entity;
+
+import java.util.List;
+
+public class ExcelExp {
+    private String fileName;// sheet的名称
+    private String[] handers;// sheet里的标题
+    private List<String[]> dataset;// sheet里的数据集
+
+    public ExcelExp(String fileName, String[] handers, List<String[]> dataset) {
+        this.fileName = fileName;
+        this.handers = handers;
+        this.dataset = dataset;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String[] getHanders() {
+        return handers;
+    }
+
+    public void setHanders(String[] handers) {
+        this.handers = handers;
+    }
+
+    public List<String[]> getDataset() {
+        return dataset;
+    }
+
+    public void setDataset(List<String[]> dataset) {
+        this.dataset = dataset;
+    }
+}

+ 13 - 0
module-report/src/main/java/cn/com/ctop/bytedance/mapper/DailyReportMapper.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.bytedance.mapper;
+
+import cn.com.ctop.bytedance.vo.DailyAccountReportVO;
+import cn.com.ctop.bytedance.vo.DailyGroupReportVO;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DailyReportMapper {
+    DailyAccountReportVO getDailyReport(Map<String, Object> requestMap);
+
+    List<DailyGroupReportVO> getDailyGroupReport(Map<String, Object> requestMap);
+}

+ 234 - 0
module-report/src/main/java/cn/com/ctop/bytedance/mapper/xml/DailyReportMapper.xml

@@ -0,0 +1,234 @@
+<?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.bytedance.mapper.DailyReportMapper">
+
+    <select id="getDailyReport" parameterType="Map" resultType="cn.com.ctop.bytedance.vo.DailyAccountReportVO">
+        SELECT
+        t1.*,
+        round((t1.conversions / t1.bclick),2) conversionRate, -- 转化率
+
+        round(t1.conversionPrice / #{discount},2) discountConversionPrice, -- 折后转化成本
+
+        (SELECT sum(contract_rebate_real_charged)
+        from ctop_kuaishou_daily_flows
+        <where>
+            <if test="date != null">
+                and date = #{date}
+            </if>
+
+            <if test="accountIds != null">
+                and account_id in
+                <foreach collection="accountIds" item="item" separator=","
+                         open="(" close=")">
+                    #{item}
+                </foreach>
+
+            </if>
+        </where>
+        ) contractRebateRealCharged -- 激励花费
+
+        FROM (
+        SELECT
+        sum(charge) cost, -- 消耗
+        sum(photo_show) photoShow, -- 展现数
+        sum(photo_click) photoClick, -- 点击数
+        (
+        CASE
+        WHEN sum(photo_show) != 0 THEN
+        (
+        round( sum(photo_click) / sum(photo_show),2)
+        )
+        ELSE
+        0
+        END
+        ) photoClickRatio, -- 点击率
+        (
+        CASE
+        WHEN sum(charge) != 0 THEN
+        (
+        round(sum(photo_click) / sum(charge),2)
+        )
+        ELSE
+        0
+        END
+        ) photoClickCost, -- 平均点击花费
+
+        sum(bclick) bclick, -- 行为数
+
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        round(sum(bclick) / sum(aclick),2)
+        ELSE
+        0
+        END
+        ) actionRatio, -- 行为率
+        (
+        CASE
+        WHEN sum(photo_show) != 0 THEN
+        round( (sum(charge) / sum(photo_show)
+        ) * 1000,2)
+        ELSE
+        0
+        END
+        ) impression1kCost, -- 平均千次展现花费
+        (
+        CASE
+        WHEN sum(form_count) != 0 THEN
+        sum(form_count)
+        WHEN sum(activation) != 0 THEN
+        sum(activation)
+        ELSE
+        0
+        END
+        ) conversions, -- 转化数
+        (
+        CASE
+        WHEN sum(form_count) != 0 THEN
+        (
+        round(sum(charge) / sum(form_count),2)
+        )
+        WHEN sum(activation) != 0 THEN
+        (
+        round(sum(charge) / sum(activation),2)
+        )
+        ELSE
+        0
+        END
+        ) conversionPrice -- 转化单价
+        FROM
+        ctop_kuaishou_report_daily_account
+        <where>
+            <if test="date != null">
+                and stat_date = #{date}
+            </if>
+
+            <if test="accountIds != null">
+                and account_id in
+                <foreach collection="accountIds" item="item" separator=","
+                         open="(" close=")">
+                    #{item}
+                </foreach>
+
+            </if>
+
+        </where>
+        ) t1
+
+    </select>
+
+
+    <select id="getDailyGroupReport" parameterType="Map" resultType="cn.com.ctop.bytedance.vo.DailyGroupReportVO">
+        SELECT
+        t1.*,
+        round(t1.conversions / photoClick,2) clickConversionRate, -- 点击转化率
+        round(t1.conversionPrice / #{discount},2) discountConversionPrice-- 折后转化单价
+        FROM
+        (
+        SELECT
+        account_id accountId,
+        (
+        SELECT
+        auth_name
+        FROM
+        ctop_user_allocation
+        WHERE
+        account_id = accountId
+        ) authName, -- 账户名称
+        stat_date statDate, -- 报表日期
+        campaign_name campaignName, -- 计划名称
+        unit_name unitName, -- 广告组名称
+        sum(charge) cost, -- 花费
+        round((sum(charge) / #{discount}),2) disCountCost, -- 折后消费
+        sum(photo_show) photoShow, -- 展现数
+        sum(photo_click) photoClick, -- 点击数
+        sum(bclick) bclick, -- 行为数
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        round(sum(bclick) / sum(aclick),2)
+        ELSE
+        0
+        END
+        ) actionRatio, -- 行为率
+
+
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        round(sum(photo_click) / sum(aclick),2)
+        ELSE
+        0
+        END
+        ) photoClickRatio, -- 点击率
+
+
+        (
+        CASE
+        WHEN sum(photo_show) != 0
+        THEN
+        round((sum(charge) / sum(photo_show)
+        ) * 1000,2)
+        ELSE
+        0
+        END
+        ) impression1kCost, -- 平均千次展现花费
+        (
+        CASE
+        WHEN sum(charge) != 0 THEN
+        (
+        round(sum(photo_click) / sum(charge),2)
+        )
+        ELSE
+        0
+        END
+        ) photoClickCost, -- 平均点击花费
+        (
+        CASE
+        WHEN sum(form_count) != 0 THEN
+        sum(form_count)
+        WHEN sum(activation) != 0 THEN
+        sum(activation)
+        ELSE
+        0
+        END
+        ) conversions, -- 转化数
+        (
+        CASE
+        WHEN sum(form_count) != 0 THEN
+        (
+        round(sum(charge) / sum(form_count),2)
+        )
+        WHEN sum(activation) != 0 THEN
+        (
+        round(sum(charge) / sum(activation),2)
+        )
+        ELSE
+        0
+        END
+        ) conversionPrice -- 转化单价
+
+        FROM
+        ctop_kuaishou_report_daily_group
+        <where>
+            <if test="date != null">
+                and stat_date = #{date}
+            </if>
+
+            <if test="accountIds != null">
+                and account_id in
+                <foreach collection="accountIds" item="item" separator=","
+                         open="(" close=")">
+                    #{item}
+                </foreach>
+
+            </if>
+        </where>
+        GROUP BY unit_id
+        order by account_id
+
+        ) t1
+    </select>
+
+
+</mapper>

+ 18 - 0
module-report/src/main/java/cn/com/ctop/bytedance/service/IDailyReportService.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.bytedance.service;
+
+import cn.com.ctop.bytedance.vo.DailyReportVO;
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * 日报
+ */
+public interface IDailyReportService {
+    /**
+     * 获取日报数据
+     *
+     * @param requestJson
+     * @return
+     */
+    DailyReportVO getDailyReport(JSONObject requestJson);
+
+}

+ 76 - 0
module-report/src/main/java/cn/com/ctop/bytedance/service/impl/DailyReportServiceImpl.java

@@ -0,0 +1,76 @@
+package cn.com.ctop.bytedance.service.impl;
+
+import cn.com.ctop.bytedance.mapper.DailyReportMapper;
+import cn.com.ctop.bytedance.service.IDailyReportService;
+import cn.com.ctop.bytedance.vo.DailyAccountReportVO;
+import cn.com.ctop.bytedance.vo.DailyGroupReportVO;
+import cn.com.ctop.bytedance.vo.DailyReportVO;
+import cn.com.ctop.common.module.utils.Check;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 日报报表
+ */
+
+@Slf4j
+@Service
+public class DailyReportServiceImpl implements IDailyReportService {
+
+    @Autowired
+    private DailyReportMapper dailyReportMapper;
+
+    /**
+     * 获取日报数据
+     *
+     * @param requestJson
+     * @return
+     */
+    @Override
+    public DailyReportVO getDailyReport(JSONObject requestJson) {
+        try {
+
+            System.err.println(requestJson);
+            log.info("日报开始统计");
+            long startTime = System.currentTimeMillis();
+
+            JSONArray accountIds = requestJson.getJSONArray("accountIds");
+            BigDecimal discount = requestJson.getBigDecimal("discount");
+            Map<String, Object> requestMap = new HashMap<>();
+            requestMap.put("accountIds", accountIds);
+            requestMap.put("discount", discount);
+            requestMap.put("date", requestJson.getString("date"));
+            DailyAccountReportVO dailyAccountReport = dailyReportMapper.getDailyReport(requestMap);
+            if (!Check.isNull(dailyAccountReport)) {
+                BigDecimal cost = dailyAccountReport.getCost();
+                BigDecimal contractRebateRealCharged = dailyAccountReport.getContractRebateRealCharged();
+                if (Check.isNull(cost)) {
+                    BigDecimal actualCost = ((cost.subtract(contractRebateRealCharged)).divide(discount, 2, RoundingMode.HALF_UP));
+                    dailyAccountReport.setActualCost(actualCost);
+                }
+
+            }
+            List<DailyGroupReportVO> dailyGroupReport = dailyReportMapper.getDailyGroupReport(requestMap);
+            DailyReportVO dailyReport = new DailyReportVO();
+            dailyReport.setDailyAccountReport(dailyAccountReport);
+            dailyReport.setDailyGroupReport(dailyGroupReport);
+            log.info("日报统计完成,用时: " + ((System.currentTimeMillis() - startTime) / 1000) + " s");
+            return dailyReport;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+}

+ 24 - 0
module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyAccountReportVO.java

@@ -0,0 +1,24 @@
+package cn.com.ctop.bytedance.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class DailyAccountReportVO implements Serializable {
+    private BigDecimal cost; // 消耗
+    private Long photoShow; // 展示数
+    private Long photoClick; // 点击数
+    private BigDecimal photoClickRatio; // 点击率
+    private BigDecimal photoClickCost; // 平均点击花费
+    private Long bclick; // 行为数
+    private BigDecimal actionRatio; // 行为率
+    private BigDecimal impression1kCost; // 平均千次展现花费
+    private Long conversions; // 转化数
+    private BigDecimal conversionPrice; // 转化单价
+    private BigDecimal conversionRate; // 转化率
+    private BigDecimal discountConversionPrice; // 折后转化成本
+    private BigDecimal contractRebateRealCharged; // 激励花费
+    private BigDecimal actualCost; // 实际消耗
+}

+ 30 - 0
module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyGroupReportVO.java

@@ -0,0 +1,30 @@
+package cn.com.ctop.bytedance.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class DailyGroupReportVO implements Serializable {
+
+    private Long accountId; // 账号
+    private String statDate; // 日期
+    private String authName; // 账号名称
+    private String campaignName; // 计划名称
+    private String unitName; // 广告组名称
+    private BigDecimal cost; // 消耗
+    private BigDecimal disCountCost; // 折后消耗
+    private Long photoShow; // 展示数
+    private Long photoClick; // 点击数
+    private Long bclick; // 行为数
+    private BigDecimal actionRatio; // 行为率
+    private BigDecimal photoClickRatio; // 点击率
+    private BigDecimal impression1kCost; // 平均千次展现花费
+    private BigDecimal photoClickCost; // 平均点击花费
+    private Long conversions; // 转化数
+    private BigDecimal conversionPrice; // 转化单价
+    private BigDecimal clickConversionRate; // 点击转化率
+    private BigDecimal discountConversionPrice; // 折后转化成本
+
+}

+ 13 - 0
module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyReportVO.java

@@ -0,0 +1,13 @@
+package cn.com.ctop.bytedance.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class DailyReportVO implements Serializable {
+
+    private DailyAccountReportVO dailyAccountReport;
+    private List<DailyGroupReportVO> dailyGroupReport;
+}