yumeng 5 роки тому
батько
коміт
69e2a67500
15 змінених файлів з 941 додано та 1 видалено
  1. 101 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/ExcelUtils.java
  2. 90 0
      module-common/src/main/java/cn/com/ctop/common/module/utils/ExportExcelUtils.java
  3. 1 1
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/batch/service/impl/KuaishouInterfaceServiceImpl.java
  4. 5 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportDailyGroup.java
  5. 7 0
      module-kuaishou/src/main/java/cn/com/ctop/kuaishou/modules/report/entity/KuaishouReportHourlyGroup.java
  6. 97 0
      module-report/src/main/java/cn/com/ctop/bytedance/controller/DailyReportController.java
  7. 73 0
      module-report/src/main/java/cn/com/ctop/bytedance/controller/ExcelExportUtil.java
  8. 39 0
      module-report/src/main/java/cn/com/ctop/bytedance/entity/ExcelExp.java
  9. 13 0
      module-report/src/main/java/cn/com/ctop/bytedance/mapper/DailyReportMapper.java
  10. 241 0
      module-report/src/main/java/cn/com/ctop/bytedance/mapper/xml/DailyReportMapper.xml
  11. 29 0
      module-report/src/main/java/cn/com/ctop/bytedance/service/IDailyReportService.java
  12. 178 0
      module-report/src/main/java/cn/com/ctop/bytedance/service/impl/DailyReportServiceImpl.java
  13. 24 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyAccountReportVO.java
  14. 30 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyGroupReportVO.java
  15. 13 0
      module-report/src/main/java/cn/com/ctop/bytedance/vo/DailyReportVO.java

+ 101 - 0
module-common/src/main/java/cn/com/ctop/common/module/utils/ExcelUtils.java

@@ -0,0 +1,101 @@
+package cn.com.ctop.common.module.utils;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ExcelUtils {
+    /**
+     * @param response
+     * @param fileName excel文件名
+     * @param headMap  表头map
+     * @param dataList 表格数据
+     */
+    public static void exportXlsx(HttpServletResponse response, String fileName,
+                                  Map<String, String> headMap, List<Map<String, Object>> dataList) {
+
+        Workbook workbook = exportXlsx(fileName, headMap, dataList);
+        response.setContentType("application/binary;charset=ISO8859_1");
+
+        OutputStream outputStream = null;
+
+        try {
+            outputStream = response.getOutputStream();
+            String fn = new String(fileName.getBytes(), "ISO8859_1");
+            response.setHeader("Content-disposition", "attachment; filename=" + fn + ".xlsx");
+            workbook.write(outputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 导出数据
+     *
+     * @param headMap
+     * @param dataList
+     */
+    public static Workbook exportXlsx(String sheetName, Map<String, String> headMap, List<Map<String, Object>> dataList) {
+
+        Workbook workbook = new XSSFWorkbook();
+
+        Sheet sheet = workbook.createSheet(sheetName);
+
+
+        int rowIndex = 0, columnIndex = 0;
+        Set<String> keys = headMap.keySet();
+
+        //表头
+        Row row = sheet.createRow(rowIndex++);
+        for (String key : keys) {
+            Cell cell = row.createCell(columnIndex++);
+            cell.setCellValue(headMap.get(key));
+        }
+
+        //内容
+        if (dataList != null && !dataList.isEmpty()) {
+            for (Map<String, Object> map : dataList) {
+                row = sheet.createRow(rowIndex++);
+                columnIndex = 0;
+                for (String key : keys) {
+                    Cell cell = row.createCell(columnIndex++);
+                    setCellValue(cell, map.get(key));
+                }
+            }
+        }
+
+        return workbook;
+    }
+
+    private static void setCellValue(Cell cell, Object obj) {
+        if (obj == null) {
+            return;
+        }
+        if (obj instanceof String) {
+            cell.setCellValue((String) obj);
+        } else if (obj instanceof Double) {
+            cell.setCellValue((Double) obj);
+        } else {
+            cell.setCellValue(obj.toString());
+        }
+    }
+
+}

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

@@ -0,0 +1,90 @@
+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.io.FileOutputStream;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+public class ExportExcelUtils {
+
+
+    /**
+     * @param workbook
+     * @param sheetNum   (sheet的位置,0表示第一个表格中的第一个sheet)
+     * @param sheetTitle (sheet的名称)
+     * @param headers    (表格的标题)
+     * @param result     (表格的数据)
+     * @param out        (输出流)
+     * @throws Exception
+     * @Title: exportExcel
+     * @Description: 导出Excel的方法
+     * @author: evan @ 2014-01-09
+     * @return
+     */
+    public void exportExcel(XSSFWorkbook workbook, int sheetNum,
+                                    String sheetTitle, String[] headers, List<List<String>> result,
+                                    OutputStream out) 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++;
+            }
+        }
+
+        out = new FileOutputStream("D:\\file" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() +".xls");
+
+
+
+    }
+
+}

+ 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")

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

@@ -0,0 +1,97 @@
+package cn.com.ctop.bytedance.controller;
+
+import cn.com.ctop.bytedance.service.IDailyReportService;
+import cn.com.ctop.bytedance.vo.DailyReportVO;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.util.CellRangeAddress;
+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 javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+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;
+
+    }
+
+    @RequestMapping("/exportDailyReport")
+    public void exportAllyScoreCount(HttpServletRequest request, HttpServletResponse response, @RequestBody JSONObject requestJson) {
+
+
+        try {
+            HSSFWorkbook wb = new HSSFWorkbook();
+            HSSFSheet sheet = wb.createSheet("1213");
+            HSSFRow row = sheet.createRow(0);
+            HSSFCell cell = row.createCell(0);
+            cell.setCellValue("你好,倾城");
+            FileOutputStream outInfo=new FileOutputStream("D:/test.xls");
+            response.reset();
+            response.setHeader("Content-disposition", "attachment; filename=商品.xls");
+            response.setContentType("application/msexcel");
+            wb.write(outInfo);
+            outInfo.close();
+
+
+
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+    }
+
+    public static void main(String[] args) {
+        try {
+            HSSFWorkbook wb = new HSSFWorkbook();
+            HSSFSheet sheet = wb.createSheet("1213");
+            HSSFRow row = sheet.createRow(0);
+            HSSFCell cell = row.createCell(0);
+            cell.setCellValue("你好,倾城");
+            FileOutputStream outInfo=new FileOutputStream("D:/test.xls");
+            wb.write(outInfo);
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.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);
+}

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

@@ -0,0 +1,241 @@
+<?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.*,
+        (t1.conversions / t1.bclick) conversionRate, -- 转化率
+
+        (t1.conversionPrice / #{discount}) 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
+        (
+        sum(photo_click) / sum(photo_show)
+        )
+        ELSE
+        0
+        END
+        ) photoClickRatio, -- 点击率
+        (
+        CASE
+        WHEN sum(charge) != 0 THEN
+        (
+        sum(photo_click) / sum(charge)
+        )
+        ELSE
+        0
+        END
+        ) photoClickCost, -- 平均点击花费
+
+        sum(bclick) bclick, -- 行为数
+
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        (sum(bclick) / sum(aclick))
+        ELSE
+        0
+        END
+        ) actionRatio, -- 行为率
+        (
+        CASE
+        WHEN sum(photo_show) != 0 THEN
+        (
+        (
+        sum(charge) / sum(photo_show)
+        ) * 1000
+        )
+        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
+        (
+        sum(charge) / sum(form_count)
+        )
+        WHEN sum(activation) != 0 THEN
+        (
+        sum(charge) / sum(activation)
+        )
+        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.*,
+        (t1.conversions / photoClick) clickConversionRate, -- 点击转化率
+        (t1.conversionPrice / 1) 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, -- 花费
+        (sum(charge) / 1) disCountCost, -- 折后消费
+        sum(photo_show) photoShow, -- 展现数
+        sum(photo_click) photoClick, -- 点击数
+        sum(bclick) bclick, -- 行为数
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        (sum(bclick) / sum(aclick))
+        ELSE
+        0
+        END
+        ) actionRatio, -- 行为率
+
+
+
+        (
+        CASE
+        WHEN sum(aclick) != 0 THEN
+        (sum(photo_click) / sum(aclick))
+        ELSE
+        0
+        END
+        ) photoClickRatio, -- 点击率
+
+
+
+        (
+        CASE
+        WHEN sum(photo_show) != 0 THEN
+        (
+        (
+        sum(charge) / sum(photo_show)
+        ) * 1000
+        )
+        ELSE
+        0
+        END
+        ) impression1kCost, -- 平均千次展现花费
+        (
+        CASE
+        WHEN sum(charge) != 0 THEN
+        (
+        sum(photo_click) / sum(charge)
+        )
+        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
+        (
+        sum(charge) / sum(form_count)
+        )
+        WHEN sum(activation) != 0 THEN
+        (
+        sum(charge) / sum(activation)
+        )
+        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>

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

@@ -0,0 +1,29 @@
+package cn.com.ctop.bytedance.service;
+
+import cn.com.ctop.bytedance.vo.DailyReportVO;
+import com.alibaba.fastjson.JSONObject;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 日报
+ */
+public interface IDailyReportService {
+    /**
+     * 获取日报数据
+     *
+     * @param requestJson
+     * @return
+     */
+    DailyReportVO getDailyReport(JSONObject requestJson);
+
+    /**
+     * 数据导出
+     *
+     * @param request
+     * @param response
+     * @param requestJson
+     */
+    void exportDailyReport(HttpServletRequest request, HttpServletResponse response, JSONObject requestJson);
+}

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

@@ -0,0 +1,178 @@
+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 cn.com.ctop.common.module.utils.ExportExcelUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+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) && Check.isNull(contractRebateRealCharged)) {
+                    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);
+
+
+            System.err.println(dailyAccountReport);
+
+            System.err.println("------------------");
+            System.err.println(dailyGroupReport);
+            log.info("日报统计完成,用时: " + ((System.currentTimeMillis() - startTime) / 1000) + " s");
+            return dailyReport;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+
+    /**
+     * 数据导出
+     *
+     * @param request
+     * @param response
+     * @param requestJson
+     */
+
+    @Override
+    public void exportDailyReport(HttpServletRequest request, HttpServletResponse response, JSONObject requestJson) {
+
+        try {
+            OutputStream outStream = new FileOutputStream("D:\\file");
+            DailyReportVO dailyReport = this.getDailyReport(requestJson);
+            List<List<String>> accountData = new ArrayList<List<String>>();
+            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>> groupReport = new ArrayList<List<String>>();
+
+            List<DailyGroupReportVO> dailyGroupReport = dailyReport.getDailyGroupReport();
+          /*  if(!Check.isNull(dailyGroupReport)){
+                for (DailyGroupReportVO groupReport : dailyGroupReport) {
+                    List rowData = new ArrayList();
+                    rowData.add(tIndexDetailDto.getAllyId());
+                    rowData.add(tIndexDetailDto.getProvince());
+                    rowData.add(tIndexDetailDto.getCity());
+                    rowData.add(tIndexDetailDto.getCounty());
+                    rowData.add(tIndexDetailDto.getBureau() + "");
+                    rowData.add(tIndexDetailDto.getFirstTenderYear());
+                    rowData.add(String.valueOf(tIndexDetailDto.getMonthInterestRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getCapitalRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getmTwoRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYqtzRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYearInterestRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYearCapitalRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYearMTwoRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYearYqtzRateScore()));
+                    rowData.add(String.valueOf(tIndexDetailDto.getYearSumScore()));
+                    data1.add(rowData);
+                }
+
+
+
+            }
+*/
+
+
+            String[] headers0 = {"时间", "消耗", "激励花费", "实际消耗", "展示数", "点击数", "点击率", "平均点击花费", "行为数", "行为率", "平均千次展现花费", "转化数", "转化单价", "转化率", "折后转化成本"};
+
+            ExportExcelUtils eeu = new ExportExcelUtils();
+            XSSFWorkbook workbook = new XSSFWorkbook();
+            eeu.exportExcel(workbook, 0, "分日数据", headers0, accountData, outStream);
+
+            //原理就是将所有的数据一起写入,然后再关闭输入流。
+            workbook.write(outStream);
+            outStream.close();
+        } catch (
+                Exception e) {
+            e.printStackTrace();
+
+        }
+    }
+}

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