Forráskód Böngészése

返点-首投有效素材明细/占比结果表

zhaoxian 1 éve
szülő
commit
619b595612

+ 1 - 0
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -261,6 +261,7 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/materialData/**", "anon");
         filterChainDefinitionMap.put("/budget/**", "anon");
         filterChainDefinitionMap.put("/ctop/byteDanceVideoInfo/*", "anon");
+        filterChainDefinitionMap.put("/first/delivery/*", "anon");
 
         // 添加自己的过滤器并且取名为jwt
         Map<String, Filter> filterMap = new HashMap<>(1);

+ 1 - 1
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/ExportExcelUtils.java

@@ -539,7 +539,7 @@ public class ExportExcelUtils {
                             value = "";
                         }
                     } else {
-                        value = new DecimalFormat("0.00").format(cell.getNumericCellValue()).replace(".00", "");
+                        value = new DecimalFormat("0.0000").format(cell.getNumericCellValue()).replace(".0000", "");
                     }
                     break;
                 case HSSFCell.CELL_TYPE_STRING: // 字符串

+ 69 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/controller/FirstDeliveryValidController.java

@@ -0,0 +1,69 @@
+package cn.com.ctop.toutiao.modules.material.controller;
+
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.toutiao.modules.material.service.FirstDeliveryValidService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+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.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 首投有效数据导入
+ */
+@Slf4j
+@RestController
+@RequestMapping("/first/delivery")
+public class FirstDeliveryValidController {
+    @Resource
+    private FirstDeliveryValidService firstDeliveryValidService;
+
+    /**
+     * 导入EXCEL批量创建
+     * 返点-首投有效素材明细
+     */
+    @PostMapping(value = "/importExcelMaterials")
+    @ResponseBody
+    public Result<Object> importExcelMaterials(HttpServletResponse response, @RequestParam("file") MultipartFile file) {
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        try {
+            if (Check.isNull(file)) {
+                return Result.error("执行失败,请上传应用Excel文件");
+            }
+            return firstDeliveryValidService.importExcelMaterials(file);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("导入EXCEL失败," + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 导入EXCEL批量创建
+     * 返点-首投有效占比结果表
+     */
+    @PostMapping(value = "/importExcelRatio")
+    @ResponseBody
+    public Result<Object> importExcelRatio(HttpServletResponse response, @RequestParam("file") MultipartFile file) {
+        response.setHeader("Access-Control-Allow-Origin", "*");
+        try {
+            if (Check.isNull(file)) {
+                return Result.error("执行失败,请上传应用Excel文件");
+            }
+            return firstDeliveryValidService.importExcelRatio(file);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("导入EXCEL失败," + e.getMessage());
+        }
+    }
+
+}

+ 101 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/entity/FirstDeliveryValidMaterials.java

@@ -0,0 +1,101 @@
+package cn.com.ctop.toutiao.modules.material.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 返点-首投有效素材明细
+ */
+@Data
+public class FirstDeliveryValidMaterials {
+
+    private Long id;
+    /**
+     * 年份
+     */
+    private String deliveryYear;
+    /**
+     * 首投月份
+     */
+    private String deliveryMonth;
+    /**
+     * 运营标签
+     */
+    private String operationLabel;
+    /**
+     * 素材ID
+     */
+    private Long materialId;
+    /**
+     * 广告主id
+     */
+    private Long accountId;
+    /**
+     * 首投日期
+     */
+    private String statDate;
+    /**
+     * 广告主名称
+     */
+    private String accountName;
+    /**
+     * 客户名称
+     */
+    private String customerName;
+    /**
+     * 广告ids
+     */
+    private String adIds;
+    /**
+     * 优化师名称
+     */
+    private String userName;
+    /**
+     * 返点核算政策类型
+     */
+    private String rebateType;
+    /**
+     * 结算行业一级行业
+     */
+    private String settlement1l;
+    /**
+     * 结算二级行业
+     */
+    private String settlement2l;
+    /**
+     * 是否首投有效素材
+     */
+    private String firstValid;
+    /**
+     * 首投7天累量消耗
+     */
+    private BigDecimal cost7day;
+    /**
+     * 消耗
+     */
+    private BigDecimal cost;
+
+    public FirstDeliveryValidMaterials() {
+    }
+
+    public FirstDeliveryValidMaterials(JSONObject obj) {
+        this.setDeliveryMonth(obj.getString("0"));//首投月份
+        this.setOperationLabel(obj.getString("1"));//运营标签
+        this.setMaterialId(Long.valueOf(obj.getString("2").replace("\"", "")));//素材id
+        this.setAccountId(Long.valueOf(obj.getString("4").replace("\"", "")));//广告主id
+        this.setStatDate(obj.getString("5"));//首投日期
+        this.setAccountName(obj.getString("7"));//广告主名称
+        this.setAdIds(obj.getString("8"));//广告ids
+        this.setCustomerName(obj.getString("9"));//客户名称
+        this.setUserName(obj.getString("10"));//优化师名称
+        this.setRebateType(obj.getString("11"));//返点核算政策类型
+        this.setSettlement1l(obj.getString("12"));//结算行业一级行业
+        this.setSettlement2l(obj.getString("13"));//结算二级行业
+        this.setFirstValid(obj.getString("14"));//是否首投有效素材
+        this.setCost7day(obj.getBigDecimal("15"));//首投7天累量消耗
+        this.setCost(obj.getBigDecimal("16"));//消耗
+    }
+
+}

+ 122 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/entity/FirstDeliveryValidRatio.java

@@ -0,0 +1,122 @@
+package cn.com.ctop.toutiao.modules.material.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 返点-首投有效素材明细表
+ */
+@Data
+public class FirstDeliveryValidRatio {
+
+    private Long id;
+    /**
+     * 所属年
+     */
+    private String deliveryYear;
+    /**
+     * 核算业绩归属季度
+     */
+    private String deliveryQuarter;
+    /**
+     * 核算业绩归属月
+     */
+    private String deliveryMonth;
+    /**
+     * 代理商集团
+     */
+    private String agentCombine;
+    /**
+     * 竞价分类
+     */
+    private String bidType;
+    /**
+     * 结算行业统计类型
+     */
+    private String settlementType;
+    /**
+     * 结算二级行业
+     */
+    private String settlement2l;
+    /**
+     * 运营标签
+     */
+    private String operationLabel;
+    /**
+     * 月度首投视频素材数
+     */
+    private Long firstDeliveryMonthMaterials;
+    /**
+     * 月度有效视频素材数
+     */
+    private Long firstDeliveryMonthValidMaterials;
+    /**
+     * 月度首投有效素材占比
+     */
+    private BigDecimal validMaterialRatio;
+    /**
+     * 目标值
+     */
+    private BigDecimal targetValue;
+    /**
+     * 返点比例
+     */
+    private BigDecimal rebateRatio;
+    /**
+     * 满点差值
+     */
+    private BigDecimal fullDotDif;
+    /**
+     * 返点比例上限
+     */
+    private BigDecimal rebateRatioCeiling;
+    /**
+     * 业绩消耗
+     */
+    private BigDecimal cost;
+    /**
+     * 返点金额
+     */
+    private BigDecimal rebateCost;
+    /**
+     * 满点差值金额
+     */
+    private BigDecimal fullDotDifCost;
+
+
+    public FirstDeliveryValidRatio() {
+    }
+
+    public FirstDeliveryValidRatio(JSONObject obj) {
+        this.setDeliveryQuarter(obj.getString("0"));//核算业绩归属季度
+        this.setDeliveryMonth(obj.getString("1"));//核算业绩归属月
+        this.setAgentCombine(obj.getString("2"));//代理商集团
+        this.setBidType(obj.getString("3"));//竞价分类
+        this.setSettlementType(obj.getString("4"));//结算行业统计类型
+        this.setSettlement2l(obj.getString("5"));//结算二级行业
+        this.setOperationLabel(obj.getString("6"));//运营标签
+        String firstDeliveryMonthMaterials = obj.getString("7");
+        if (firstDeliveryMonthMaterials.contains("null")) {
+            this.setFirstDeliveryMonthMaterials(0L);//月度首投视频素材数
+        } else {
+            this.setFirstDeliveryMonthMaterials(obj.getLong("7"));//月度首投视频素材数
+        }
+        String validMaterials = obj.getString("8");
+        if (validMaterials.contains("null")) {
+            this.setFirstDeliveryMonthValidMaterials(0L);//月度有效视频素材数
+        } else {
+            this.setFirstDeliveryMonthValidMaterials(obj.getLong("8"));//月度有效视频素材数
+        }
+        this.setValidMaterialRatio(obj.getBigDecimal("9"));//月度首投有效素材占比
+        this.setTargetValue(obj.getBigDecimal("10"));//目标值
+        this.setRebateRatio(obj.getBigDecimal("11"));//返点比例
+        this.setFullDotDif(obj.getBigDecimal("12"));//满点差值
+        this.setRebateRatioCeiling(obj.getBigDecimal("13"));//返点比例上限
+        this.setCost(obj.getBigDecimal("14"));//业绩消耗
+        this.setRebateCost(obj.getBigDecimal("15"));//返点金额
+        this.setFullDotDifCost(obj.getBigDecimal("16"));//满点差值金额
+    }
+
+}

+ 18 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/FirstDeliveryValidMapper.java

@@ -0,0 +1,18 @@
+package cn.com.ctop.toutiao.modules.material.mapper;
+
+import cn.com.ctop.toutiao.modules.material.entity.FirstDeliveryValidMaterials;
+import cn.com.ctop.toutiao.modules.material.entity.FirstDeliveryValidRatio;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface FirstDeliveryValidMapper {
+
+    void delMaterials(@Param("deliveryYear") String deliveryYear, @Param("deliveryMonth") String deliveryMonth);
+
+    void replaceBatchMaterials(@Param("list") List<FirstDeliveryValidMaterials> list);
+
+    void delRatio(@Param("deliveryYear") String deliveryYear, @Param("deliveryMonth") String deliveryMonth);
+
+    void replaceBatchRatio(@Param("list") List<FirstDeliveryValidRatio> materials);
+}

+ 108 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/mapper/xml/FirstDeliveryValidMapper.xml

@@ -0,0 +1,108 @@
+<?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.material.mapper.FirstDeliveryValidMapper">
+
+    <delete id="delMaterials">
+        delete
+        from first_delivery_valid_materials
+        where delivery_year = #{deliveryYear}
+          AND delivery_month = #{deliveryMonth}
+    </delete>
+
+    <insert id="replaceBatchMaterials">
+        insert into first_delivery_valid_materials(
+        delivery_year,
+        delivery_month,
+        operation_label,
+        material_id,
+        account_id,
+        stat_date,
+        account_name,
+        ad_ids,
+        customer_name,
+        user_name,
+        rebate_type,
+        settlement_1l,
+        settlement_2l,
+        first_valid,
+        cost_7day,
+        cost
+        )
+        values
+        <foreach collection="list" item="li" separator=",">
+            (
+            #{li.deliveryYear},
+            #{li.deliveryMonth},
+            #{li.operationLabel},
+            #{li.materialId},
+            #{li.accountId},
+            #{li.statDate},
+            #{li.accountName},
+            #{li.adIds},
+            #{li.customerName},
+            #{li.userName},
+            #{li.rebateType},
+            #{li.settlement1l},
+            #{li.settlement2l},
+            #{li.firstValid},
+            #{li.cost7day},
+            #{li.cost}
+            )
+        </foreach>
+    </insert>
+
+    <delete id="delRatio">
+        delete
+        from first_delivery_valid_ratio
+        where delivery_year = #{deliveryYear}
+          AND delivery_month = #{deliveryMonth}
+    </delete>
+
+    <insert id="replaceBatchRatio">
+        replace into first_delivery_valid_ratio(
+        delivery_year,
+        delivery_quarter,
+        delivery_month,
+        agent_combine,
+        bid_type,
+        settlement_type,
+        settlement_2l,
+        operation_label,
+        first_delivery_month_materials,
+        first_delivery_month_valid_materials,
+        valid_material_ratio,
+        target_value,
+        rebate_ratio,
+        full_dot_dif,
+        rebate_ratio_ceiling,
+        cost,
+        rebate_cost,
+        full_dot_dif_cost
+        )
+        values
+        <foreach collection="list" item="li" separator=",">
+            (
+            #{li.deliveryYear},
+            #{li.deliveryQuarter},
+            #{li.deliveryMonth},
+            #{li.agentCombine},
+            #{li.bidType},
+            #{li.settlementType},
+            #{li.settlement2l},
+            #{li.operationLabel},
+            #{li.firstDeliveryMonthMaterials},
+            #{li.firstDeliveryMonthValidMaterials},
+            #{li.validMaterialRatio},
+            #{li.targetValue},
+            #{li.rebateRatio},
+            #{li.fullDotDif},
+            #{li.rebateRatioCeiling},
+            #{li.cost},
+            #{li.rebateCost},
+            #{li.fullDotDifCost}
+            )
+        </foreach>
+    </insert>
+
+
+</mapper>

+ 14 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/service/FirstDeliveryValidService.java

@@ -0,0 +1,14 @@
+package cn.com.ctop.toutiao.modules.material.service;
+
+import com.alibaba.fastjson.JSONObject;
+import org.jeecg.common.api.vo.Result;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface FirstDeliveryValidService {
+
+    Result<Object> importExcelMaterials(MultipartFile file) throws Exception;
+
+    Result<Object> importExcelRatio(MultipartFile file) throws Exception;
+}

+ 149 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/toutiao/modules/material/service/impl/FirstDeliveryValidServiceImpl.java

@@ -0,0 +1,149 @@
+package cn.com.ctop.toutiao.modules.material.service.impl;
+
+import cn.com.ctop.common.module.utils.Check;
+import cn.com.ctop.common.module.utils.ExportExcelUtils;
+import cn.com.ctop.toutiao.modules.material.entity.FirstDeliveryValidMaterials;
+import cn.com.ctop.toutiao.modules.material.entity.FirstDeliveryValidRatio;
+import cn.com.ctop.toutiao.modules.material.mapper.FirstDeliveryValidMapper;
+import cn.com.ctop.toutiao.modules.material.service.FirstDeliveryValidService;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FirstDeliveryValidServiceImpl implements FirstDeliveryValidService {
+
+    @Autowired
+    private FirstDeliveryValidMapper deliveryValidMapper;
+
+
+    @Override
+    public Result<Object> importExcelMaterials(MultipartFile file) throws Exception {
+        List<FirstDeliveryValidMaterials> dataList = new ArrayList<>();
+        try {
+            String fileName = file.getOriginalFilename();
+            List<JSONObject> list = this.analysisFile(file, fileName);
+            for (JSONObject object : list) {
+                FirstDeliveryValidMaterials material = new FirstDeliveryValidMaterials(object);
+                if (!Check.isNull(material.getStatDate())) {
+                    material.setDeliveryYear(material.getStatDate().substring(0, 4));
+                }
+                dataList.add(material);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new Exception("导入异常," + e.getMessage());
+        }
+        if (!Check.isNull(dataList)) {
+            //根据当前年份和月份,删除旧数据
+            FirstDeliveryValidMaterials material = dataList.get(0);
+            deliveryValidMapper.delMaterials(material.getDeliveryYear(), material.getDeliveryMonth());
+            //插入 数据量大于5W,分批插入
+            if (dataList.size() > 50000) {
+                List<List<FirstDeliveryValidMaterials>> splitList = Lists.newArrayList(Lists.partition(dataList, 50000));
+                for (List<FirstDeliveryValidMaterials> materials : splitList) {
+                    deliveryValidMapper.replaceBatchMaterials(materials);
+                }
+            } else {
+                deliveryValidMapper.replaceBatchMaterials(dataList);
+            }
+        }
+        return Result.successMsg("导入成功", null);
+    }
+
+    @Override
+    public Result<Object> importExcelRatio(MultipartFile file) throws Exception {
+        List<FirstDeliveryValidRatio> dataList = new ArrayList<>();
+        String year = DateUtils.date2Str().substring(0, 4);
+        try {
+            String fileName = file.getOriginalFilename();
+            List<JSONObject> list = this.analysisFile(file, fileName);
+            for (JSONObject object : list) {
+                FirstDeliveryValidRatio material = new FirstDeliveryValidRatio(object);
+                material.setDeliveryYear(year);
+                dataList.add(material);
+            }
+        } catch (
+                Exception e) {
+            e.printStackTrace();
+            throw new Exception("导入异常," + e.getMessage());
+        }
+        if (!Check.isNull(dataList)) {
+            //根据当前年份和月份,删除旧数据
+            FirstDeliveryValidRatio material = dataList.get(0);
+            deliveryValidMapper.delRatio(material.getDeliveryYear(), material.getDeliveryMonth());
+            //插入 数据量大于5W,分批插入
+            if (dataList.size() > 50000) {
+                List<List<FirstDeliveryValidRatio>> splitList = Lists.newArrayList(Lists.partition(dataList, 50000));
+                for (List<FirstDeliveryValidRatio> materials : splitList) {
+                    deliveryValidMapper.replaceBatchRatio(materials);
+                }
+            } else {
+                deliveryValidMapper.replaceBatchRatio(dataList);
+            }
+        }
+        return Result.successMsg("导入成功", null);
+    }
+
+
+    public static List<JSONObject> analysisFile(MultipartFile file, String fileName) throws Exception {
+        JSONObject returnJson = new JSONObject();
+        Workbook workbook = null;
+        String substring = fileName.substring(fileName.lastIndexOf(".") + 1).toUpperCase();
+        if ("XLS".equals(substring)) {
+            workbook = new HSSFWorkbook(file.getInputStream());
+        } else if ("XLSX".equals(substring)) {
+            workbook = new XSSFWorkbook(file.getInputStream());
+        } else {
+            throw new Exception("请上传正确格式的文件,支持扩展名.xls;.xlsx");
+        }
+        Sheet sheet = workbook.getSheetAt(0);
+        if (Check.isNull(sheet)) {
+            throw new Exception("未读取到Sheet页内容!");
+        }
+        int rows = sheet.getLastRowNum();//行数,一共有多少行+
+        if (rows == 0) {
+            throw new Exception("请填写数据");
+        }
+        ExportExcelUtils eeu = new ExportExcelUtils();
+        //标题行
+        Row titleRow = sheet.getRow(0);
+        //最后一列(列数)
+        int lastCellNum = titleRow.getLastCellNum();
+
+        // list存储数据集
+        List<JSONObject> list = new ArrayList<>();
+        for (int i = 1; i <= rows + 1; i++) {
+            Row row = sheet.getRow(i);
+            if (row != null) {
+                //每行数据对象,按照顺序从0到(lastCellNum-1)记录
+                JSONObject cellEntity = new JSONObject();
+                for (int j = 0; j < lastCellNum; j++) {
+                    cellEntity.put(String.valueOf(j), eeu.getCellValue2(row.getCell(j)));
+                }
+                list.add(cellEntity);
+            }
+        }
+        return list;
+    }
+
+    public static void main(String[] args) {
+        String s = "2024-05-08";
+        String s2 = "1795188361354249";
+        System.out.println(s.substring(0, 4));
+    }
+}