Преглед на файлове

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

songyh преди 4 години
родител
ревизия
1869c346c3
променени са 11 файла, в които са добавени 336 реда и са изтрити 5 реда
  1. 6 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/UpdAdStaOrCpaOrBudget.java
  2. 1 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/AiBytedanceAdvertiserStrategyMapper.java
  3. 8 1
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/AiBytedanceAdvertiserStrategyMapper.xml
  4. 7 3
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java
  5. 32 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/entity/vo/ReportCostVo.java
  6. 7 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/BytedanceAdvertiserHourlyReportMapper.java
  7. 58 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceAdvertiserHourlyReportMapper.xml
  8. 7 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/IBytedanceAdvertiserHourlyReportService.java
  9. 128 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java
  10. 67 0
      jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/utils/TimeStartAndEndUtil.java
  11. 15 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceReportController.java

+ 6 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/entity/UpdAdStaOrCpaOrBudget.java

@@ -48,6 +48,12 @@ public class UpdAdStaOrCpaOrBudget implements Serializable {
 
     @ApiModelProperty(value = "预算")
     private String budget;
+    /**
+     * 1 不限
+     * 2 指定预算
+     */
+    @ApiModelProperty(value = "预算类型")
+    private String budgetType;
     @ApiModelProperty(value = "花费")
     private BigDecimal cost;
 

+ 1 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/AiBytedanceAdvertiserStrategyMapper.java

@@ -20,6 +20,6 @@ public interface AiBytedanceAdvertiserStrategyMapper extends BaseMapper<AiByteda
 
     Integer updCpaById(UpdAdStaOrCpaOrBudget updAdStaOrCpaOrBudget);
 
-    Integer updBudgetById(@Param("id") String id,@Param("budget") String budget);
+    Integer updBudgetById(@Param("id") String id,@Param("budget") String budget,@Param("budgetType") String budgetType);
 
 }

+ 8 - 1
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/mapper/xml/AiBytedanceAdvertiserStrategyMapper.xml

@@ -47,7 +47,14 @@
     <!--修改 头条 配置信息 预算 -->
     <update id="updBudgetById">
         UPDATE ctop_ai_bytedance_advertiser_strategy
-            SET ad_budget = #{budget}
+        <set>
+            <if test="budget != null">
+                account_budget = #{budget},
+            </if>
+            <if test="budgetType != null">
+                account_budget_mode = #{budgetType},
+            </if>
+        </set>
         WHERE
             id = #{id}
     </update>

+ 7 - 3
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/advertise/service/impl/AiBytedanceAdvertiserStrategyServiceImpl.java

@@ -994,10 +994,14 @@ public class AiBytedanceAdvertiserStrategyServiceImpl extends ServiceImpl<AiByte
         }
         //2-修改预算
         if (BytedanceConstant.UPDTYPE_BUDGET.equals(updAdStaOrCpaOrBudget.getType())) {
-            if (Integer.valueOf(updAdStaOrCpaOrBudget.getBudget()) < updAdStaOrCpaOrBudget.getCost().multiply(new BigDecimal(1.05)).intValue()){
-                return Result.errorMsg("修改后预算金额不能低于当前已消费金额的105%");
+
+            //指定预算
+            if (updAdStaOrCpaOrBudget.getBudgetType().equals("2")){
+                if (Integer.valueOf(updAdStaOrCpaOrBudget.getBudget()) < updAdStaOrCpaOrBudget.getCost().multiply(new BigDecimal(1.05)).intValue()){
+                    return Result.errorMsg("修改后预算金额不能低于当前已消费金额的105%");
+                }
             }
-            aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(), updAdStaOrCpaOrBudget.getBudget());
+            aiBytedanceAdvertiserStrategyMapper.updBudgetById(updAdStaOrCpaOrBudget.getId(), updAdStaOrCpaOrBudget.getBudget(),updAdStaOrCpaOrBudget.getBudgetType());
 
         }
         return Result.successMsg("修改"+(BytedanceConstant.UPDTYPE_BID.equals(updAdStaOrCpaOrBudget.getType()) ? "出价" : "预算")+"成功。",null);

+ 32 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/entity/vo/ReportCostVo.java

@@ -0,0 +1,32 @@
+package org.jeecg.modules.bytedance.report.entity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * Administrator
+ * 2021/5/19
+ **/
+@Data
+public class ReportCostVo implements Serializable {
+
+    private String id;
+    //花费
+    private double cost;
+    //展示量
+    private Integer showNum;
+    //点击量
+    private Integer click;
+    //转化量
+    private Integer convertNum;
+    //小时数
+    private Integer statHour;
+    //数据起始时间
+    private String statDatetime;
+
+    private String time;
+
+
+}

+ 7 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/BytedanceAdvertiserHourlyReportMapper.java

@@ -2,9 +2,12 @@ package org.jeecg.modules.bytedance.report.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import io.lettuce.core.dynamic.annotation.Param;
 import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport;
+import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Description: 广告主小时级别报表信息
@@ -14,4 +17,8 @@ import java.math.BigDecimal;
  */
 public interface BytedanceAdvertiserHourlyReportMapper extends BaseMapper<BytedanceAdvertiserHourlyReport> {
 
+
+    List<ReportCostVo> getReportCostInfo(@Param("accountId") String accountId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+    List<ReportCostVo> getReportCostInfoStage(@Param("accountId") String accountId, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
 }

+ 58 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/mapper/xml/BytedanceAdvertiserHourlyReportMapper.xml

@@ -4,4 +4,62 @@
 
 
 
+    <!-- 时段 查询  账户时报数据信息 -->
+    <select id="getReportCostInfo" resultType="org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo">
+        SELECT
+            id,
+            cost,
+            show_num,
+            click,
+            convert_num,
+            stat_hour,
+            stat_datetime,
+            stat_hour AS time
+        FROM
+            ctop_bytedance_report_advertiser_hourly
+        WHERE
+            advertiser_id = #{accountId}
+            AND stat_datetime &gt;= #{startTime}
+            AND stat_datetime &lt;= #{endTime}
+        ORDER BY
+            stat_datetime,
+            stat_hour
+
+
+
+
+    </select>
+
+    <!-- 阶段 查询  账户时报数据信息 -->
+    <select id="getReportCostInfoStage" resultType="org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo">
+        SELECT
+            id,
+            SUM(cost) AS cost,
+            SUM(show_num) AS showNum,
+            SUM(click) AS click,
+            SUM(convert_num) AS convertNum,
+            SUM(stat_hour) AS statHour,
+            stat_datetime,
+            stat_datetime AS time
+        FROM
+            ctop_bytedance_report_advertiser_hourly
+        WHERE
+            advertiser_id = #{accountId}
+            AND stat_datetime &gt;= #{startTime}
+            AND stat_datetime &lt;= #{endTime}
+        GROUP BY
+            stat_datetime
+        ORDER BY
+            stat_datetime
+
+
+
+
+    </select>
+
+
+
+
+
+
 </mapper>

+ 7 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/IBytedanceAdvertiserHourlyReportService.java

@@ -1,8 +1,11 @@
 package org.jeecg.modules.bytedance.report.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport;
 
+import java.sql.ResultSet;
+
 /**
  * @Description: 广告主小时级别报表信息
  * @Author: jeecg-boot
@@ -11,4 +14,8 @@ import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport
  */
 public interface IBytedanceAdvertiserHourlyReportService extends IService<BytedanceAdvertiserHourlyReport> {
 
+    Result getReportYearOnYearCost(String accountId, String startTime, String endTime)throws Exception;
+
+
+
 }

+ 128 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/service/impl/BytedanceAdvertiserHourlyReportServiceImpl.java

@@ -1,12 +1,28 @@
 package org.jeecg.modules.bytedance.report.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.modules.bytedance.advertise.entity.AiBytedanceAdvertiserStrategy;
+import org.jeecg.modules.bytedance.advertise.entity.RuleDataAccount;
+import org.jeecg.modules.bytedance.advertise.mapper.AiBytedanceAdvertiserStrategyMapper;
+import org.jeecg.modules.bytedance.common.utils.Check;
 import org.jeecg.modules.bytedance.report.entity.BytedanceAdvertiserHourlyReport;
+import org.jeecg.modules.bytedance.report.entity.vo.ReportCostVo;
 import org.jeecg.modules.bytedance.report.mapper.BytedanceAdvertiserHourlyReportMapper;
 import org.jeecg.modules.bytedance.report.service.IBytedanceAdvertiserHourlyReportService;
+import org.jeecg.modules.bytedance.report.utils.TimeStartAndEndUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * @Description: 广告主小时级别报表信息
  * @Author: jeecg-boot
@@ -18,4 +34,116 @@ import org.springframework.stereotype.Service;
 
 public class BytedanceAdvertiserHourlyReportServiceImpl extends ServiceImpl<BytedanceAdvertiserHourlyReportMapper, BytedanceAdvertiserHourlyReport> implements IBytedanceAdvertiserHourlyReportService {
 
+
+    @Resource
+    private BytedanceAdvertiserHourlyReportMapper bytedanceAdvertiserHourlyReportMapper;
+
+    @Resource
+    private AiBytedanceAdvertiserStrategyMapper aiBytedanceAdvertiserStrategyMapper;
+
+
+    /**
+     *
+     * @description:
+     *
+     * @param accountId 账户id
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return: org.jeecg.common.api.vo.Result
+     * @author: zianY
+     * @time: 2021/5/19 16:56
+     */
+    @Override
+    public Result getReportYearOnYearCost(String accountId, String startTime, String endTime) throws Exception{
+        DecimalFormat df = new DecimalFormat("0.00%");
+        Map<String,Object> resultMap = new HashMap<>();
+        double compare = 0;
+        List<ReportCostVo> nowCostList = new ArrayList<>();
+        List<ReportCostVo> lastCostList = new ArrayList<>();
+
+        //当前时间段数据
+        nowCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfo(accountId,startTime,endTime);
+        //当前阶段 总花费
+        double nowCost = nowCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+        resultMap.put("nowCost", nowCost);
+
+        //根据本阶段时间 获取 上阶段 开始-截至 时间
+        Map<String,String> lastTimeMap = TimeStartAndEndUtil.getStartEndTime(startTime,endTime);
+        //上阶段数据
+        lastCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfo(accountId,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"));
+        //上阶段花费
+        double lastCost = lastCostList.stream().mapToDouble(ReportCostVo::getCost).sum();
+        resultMap.put("lastCost", lastCost);
+
+        //环比 =(当前花费 - 上阶段花费 )/ 上阶段花费
+        compare = (nowCost - lastCost) / lastCost;
+        resultMap.put("compare", df.format(compare));
+
+        //花费占比 = 花费 / 账户预算
+        //获取账户预算
+        QueryWrapper<AiBytedanceAdvertiserStrategy> strategyQueryWrapper = new QueryWrapper<>();
+        strategyQueryWrapper.eq("account_id",accountId);
+        strategyQueryWrapper.eq("status",0);
+        strategyQueryWrapper.last("limit 1");
+        AiBytedanceAdvertiserStrategy strategy = aiBytedanceAdvertiserStrategyMapper.selectOne(strategyQueryWrapper);
+        //没有预算则使用上阶段花费
+        double accountBudget = Check.isNull(strategy) ? lastCost : strategy.getAccountBudget();
+        //花费占比
+        double costShare = nowCost / accountBudget;
+        resultMap.put("costShare", df.format(costShare));
+
+        //获取 本阶段  转化成本;转化数;转化率;平均千次展现费用。数据展示
+        Map nowMap = getCost(nowCostList);
+        // 上阶段数据
+        Map lastMap = getCost(lastCostList);
+
+        /**
+         * 日期相差不为 0 则 展示 时间段(每天数据总和)数据
+         * 日期相差天数为0  则 展示 24小时 数据
+         */
+        if (!lastTimeMap.get("daysBetween").equals("0")){
+            //阶段 数据
+          nowCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStage(accountId,startTime,endTime);
+          lastCostList = bytedanceAdvertiserHourlyReportMapper.getReportCostInfoStage(accountId,lastTimeMap.get("lastTimeStart"),lastTimeMap.get("lastTimeEnd"));
+        }
+
+        nowMap.put("costList", nowCostList);
+        lastMap.put("costList", lastCostList);
+
+        resultMap.put("nowMap", nowMap);
+        resultMap.put("lastMap", lastMap);
+
+        return Result.successMsg("成功。",resultMap);
+    }
+
+
+    public Map<String,Object> getCost(List<ReportCostVo> list){
+        Map<String,Object> map = new HashMap<>();
+
+        //花费
+        double cost = list.stream().mapToDouble(ReportCostVo::getCost).sum();
+
+        //转化成本 = 总花费 / 转化数
+        int converNum = list.stream().mapToInt(ReportCostVo::getConvertNum).sum();
+        double conver = cost / converNum;
+        map.put("conver", String.format("%.2f", conver));
+        map.put("converNum", converNum);
+
+        //转化率 = 转化数 / 点击数 * 100
+        int clickNum = list.stream().mapToInt(ReportCostVo::getClick).sum();
+        double click = Double.valueOf(converNum) /  Double.valueOf(clickNum) * 100;
+        map.put("converRate", String.format("%.2f", click));
+
+        // 平均千次展显费用 = 总花费/展示数 * 1000
+        int showNum = list.stream().mapToInt(ReportCostVo::getShowNum).sum();
+        double show = (cost / showNum) * 1000 ;
+        map.put("averageShow", String.format("%.2f", show));
+
+
+
+        return map;
+    }
+
+
+
 }

+ 67 - 0
jeecg-boot-bytedance/src/main/java/org/jeecg/modules/bytedance/report/utils/TimeStartAndEndUtil.java

@@ -0,0 +1,67 @@
+package org.jeecg.modules.bytedance.report.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Administrator
+ * 2021/5/19
+ **/
+public class TimeStartAndEndUtil {
+
+
+    /**
+     * 根据本阶段日期 获取上阶段 开始 和 截至 日期
+     * @param startTime 本阶段开始时间
+     * @param endTime 本阶段截至时间
+     * @return
+     * @throws ParseException
+     */
+    public static Map<String,String> getStartEndTime(String startTime,String endTime) throws ParseException {
+        Map<String,String> timeMap = new HashMap();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date start = sdf.parse(startTime);
+        Date end = sdf.parse(endTime);
+        //相差天数
+        Long daysBetween = (end.getTime()-start.getTime())/(60*60*24*1000);
+        String lastTimeStart = getSubtractTime(start, daysBetween.intValue());
+        String lastTimeEnd = getSubtractTime(end, daysBetween.intValue());
+        timeMap.put("lastTimeStart",lastTimeStart);
+        timeMap.put("lastTimeEnd",lastTimeEnd);
+        timeMap.put("daysBetween",daysBetween.toString());
+        return timeMap;
+    }
+
+    /**
+     * 返回 日期 - 天数 的string 日期
+     * @param time 时间
+     * @param daysBetween 天数
+     * @return
+     */
+    public static String getSubtractTime(Date time,Integer daysBetween){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Calendar rightNow  = Calendar.getInstance();
+        rightNow .setTime(time);
+        if (daysBetween.intValue() > 0){
+            rightNow .add(Calendar.DAY_OF_YEAR,-daysBetween.intValue()-1);//日期加 相差的 天数 再 -1
+        }else {
+            rightNow .add(Calendar.DAY_OF_YEAR,-1);//日期 -1
+        }
+        Date rightNowTime = rightNow .getTime();
+        String nowTime = sdf.format(rightNowTime);
+        return nowTime;
+    }
+
+
+
+    public static void main(String[] args) throws Exception {
+        Map<String,String> map = TimeStartAndEndUtil.getStartEndTime("2020-05-15","2020-05-18");
+        System.out.println(map);
+    }
+
+
+}

+ 15 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/bytedance/advertise/controller/BytedanceReportController.java

@@ -40,6 +40,21 @@ public class BytedanceReportController {
 
 
 
+	@ApiOperation(value="投放数据-获取花费和同比", notes="投放数据-获取花费和同比")
+	@GetMapping(value = "/getReportYearOnYearCost")
+	public Result getReportYearOnYearCost(@RequestParam("accountId") String accountId,
+										 @RequestParam("startTime") String startTime,
+										 @RequestParam("endTime") String endTime) {
+		try {
+			return bytedanceAdvertiserHourlyReportService.getReportYearOnYearCost(accountId,startTime,endTime);
+		}catch (Exception e){
+			log.error("投放数据-获取花费和环比异常",e);
+			return Result.error("请求失败,请联系开发人员!");
+		}
+	}
+
+
+