|
@@ -0,0 +1,535 @@
|
|
|
+package com.zanxiang.game.data.serve.service.impl;
|
|
|
+
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.zanxiang.erp.security.util.SecurityUtil;
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteDayTotalDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.GamePromoteTotalDTO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.entity.AdsAccountAgentDay;
|
|
|
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameDay;
|
|
|
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayTotalVO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteDayVO;
|
|
|
+import com.zanxiang.game.data.serve.pojo.vo.GamePromoteTotalVO;
|
|
|
+import com.zanxiang.game.data.serve.service.IAccountAgentDayService;
|
|
|
+import com.zanxiang.game.data.serve.utils.Page;
|
|
|
+import com.zanxiang.module.util.DateUtil;
|
|
|
+import lombok.Builder;
|
|
|
+import lombok.Data;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.nutz.dao.Cnd;
|
|
|
+import org.nutz.dao.Dao;
|
|
|
+import org.nutz.dao.Sqls;
|
|
|
+import org.nutz.dao.entity.Entity;
|
|
|
+import org.nutz.dao.pager.Pager;
|
|
|
+import org.nutz.dao.sql.Criteria;
|
|
|
+import org.nutz.dao.sql.GroupBy;
|
|
|
+import org.nutz.dao.sql.Sql;
|
|
|
+import org.nutz.dao.util.Daos;
|
|
|
+import org.nutz.dao.util.cri.SimpleCriteria;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class AccountAgentDayServiceImpl implements IAccountAgentDayService {
|
|
|
+ @Autowired
|
|
|
+ private Dao dao;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<GamePromoteDayVO> accountAgentDay(GamePromoteDayDTO dto) {
|
|
|
+ Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
|
|
|
+ sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
|
|
|
+ dto.setSysUserId(sysUserId);
|
|
|
+ if (null == dto.getBeginDay() || null == dto.getEndDay()){
|
|
|
+ dto.setBeginDay(LocalDate.now());
|
|
|
+ dto.setEndDay(LocalDate.now());
|
|
|
+ }
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
+ // 创建一个 Criteria 接口实例
|
|
|
+ SimpleCriteria cri = Cnd.cri();
|
|
|
+ // 组装条件
|
|
|
+ if (null != dto.getSysUserId()) {
|
|
|
+ cri.where().andEquals("pitcher_id", dto.getSysUserId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAccountId()) {
|
|
|
+ cri.where().andEquals("account_id", dto.getAccountId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAgentId()) {
|
|
|
+ cri.where().andEquals("agent_id", dto.getAgentId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getCpName())) {
|
|
|
+ cri.where().andLike("game_cp", dto.getCpName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameName())) {
|
|
|
+ cri.where().andLike("game_name", dto.getGameName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameType())) {
|
|
|
+ cri.where().andEquals("game_type", dto.getGameType());
|
|
|
+ }
|
|
|
+ if (null != dto.getBeginDay()) {
|
|
|
+ cri.where().and("dt", ">=", dto.getBeginDay());
|
|
|
+ }
|
|
|
+ if (null != dto.getEndDay()) {
|
|
|
+ cri.where().and("dt", "<=", dto.getEndDay());
|
|
|
+ }
|
|
|
+ Sql sql = Sqls.queryEntity(accountAgentDaySql() + "$condition" + " order by dt desc");
|
|
|
+ sql.setPager(pager);
|
|
|
+ Entity<GamePromoteDayVO> entity = dao.getEntity(GamePromoteDayVO.class);
|
|
|
+ sql.setEntity(entity).setCondition(cri);
|
|
|
+ dao.execute(sql);
|
|
|
+ pager.setRecordCount(dao.count(AdsAccountAgentDay.class, cri));
|
|
|
+ return new Page<>(sql.getList(GamePromoteDayVO.class), pager);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public GamePromoteDayTotalVO accountAgentDayTotal(GamePromoteDayTotalDTO dto) {
|
|
|
+ Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
|
|
|
+ sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
|
|
|
+ dto.setSysUserId(sysUserId);
|
|
|
+ // 创建一个 Criteria 接口实例
|
|
|
+ SimpleCriteria cri = Cnd.cri();
|
|
|
+ // 组装条件
|
|
|
+ if (null != dto.getSysUserId()) {
|
|
|
+ cri.where().andEquals("pitcher_id", dto.getSysUserId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAccountId()) {
|
|
|
+ cri.where().andEquals("account_id", dto.getAccountId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAgentId()) {
|
|
|
+ cri.where().andEquals("agent_id", dto.getAgentId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getCpName())) {
|
|
|
+ cri.where().andLike("game_cp", dto.getCpName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameName())) {
|
|
|
+ cri.where().andLike("game_name", dto.getGameName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameType())) {
|
|
|
+ cri.where().andEquals("game_type", dto.getGameType());
|
|
|
+ }
|
|
|
+ if (null != dto.getBeginDay()) {
|
|
|
+ cri.where().and("dt", ">=", dto.getBeginDay());
|
|
|
+ }
|
|
|
+ if (null != dto.getEndDay()) {
|
|
|
+ cri.where().and("dt", "<=", dto.getEndDay());
|
|
|
+ }
|
|
|
+ Sql sql = Sqls.queryEntity(accountAgentDayTotalSql() + "$condition");
|
|
|
+ Entity<GamePromoteDayTotalVO> entity = dao.getEntity(GamePromoteDayTotalVO.class);
|
|
|
+ sql.setEntity(entity).setCondition(cri);
|
|
|
+ dao.execute(sql);
|
|
|
+ return sql.getObject(GamePromoteDayTotalVO.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<GamePromoteTotalVO> accountAgentTotal(GamePromoteTotalDTO dto) {
|
|
|
+ boolean hasRechargeDate = true;
|
|
|
+ Long sysUserId = SecurityUtil.isAdmin() ? null : SecurityUtil.getUserId();
|
|
|
+ sysUserId = null == dto.getSysUserId() ? sysUserId : dto.getSysUserId();
|
|
|
+ dto.setSysUserId(sysUserId);
|
|
|
+ if (null == dto.getCostEndDay() || null == dto.getCostBeginDay()){
|
|
|
+ dto.setCostBeginDay(LocalDate.now());
|
|
|
+ dto.setCostEndDay(LocalDate.now());
|
|
|
+ }
|
|
|
+ if (null == dto.getRechargeEndDay() || null == dto.getRechargeBeginDay()){
|
|
|
+ hasRechargeDate = false;
|
|
|
+ dto.setRechargeEndDay(dto.getCostEndDay());
|
|
|
+ dto.setRechargeBeginDay(dto.getCostBeginDay());
|
|
|
+ }
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
+ // 创建一个 Criteria 接口实例
|
|
|
+ SimpleCriteria cri = Cnd.cri();
|
|
|
+ // 组装条件
|
|
|
+ if (null != dto.getSysUserId()) {
|
|
|
+ cri.where().andEquals("a.pitcher_id", dto.getSysUserId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAccountId()) {
|
|
|
+ cri.where().andEquals("a.account_id", dto.getAccountId());
|
|
|
+ }
|
|
|
+ if (null != dto.getAgentId()) {
|
|
|
+ cri.where().andEquals("a.agent_id", dto.getAgentId());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getCpName())) {
|
|
|
+ cri.where().andLike("a.game_cp", dto.getCpName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameName())) {
|
|
|
+ cri.where().andLike("a.game_name", dto.getGameName());
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dto.getGameType())) {
|
|
|
+ cri.where().andEquals("a.game_type", dto.getGameType());
|
|
|
+ }
|
|
|
+ if (null != dto.getCostBeginDay()) {
|
|
|
+ cri.where().and("a.dt", ">=", dto.getCostBeginDay());
|
|
|
+ }
|
|
|
+ if (null != dto.getCostEndDay()) {
|
|
|
+ cri.where().and("a.dt", "<=", dto.getCostEndDay());
|
|
|
+ }
|
|
|
+ cri.groupBy("a.account_id,a.agent_id");
|
|
|
+ Sql sql = Sqls.queryEntity(accountAgentTotalSql() + "$condition");
|
|
|
+ sql.setPager(pager);
|
|
|
+ Entity<GamePromoteTotalVO> entity = dao.getEntity(GamePromoteTotalVO.class);
|
|
|
+ sql.setEntity(entity).setCondition(cri);
|
|
|
+ sql.setParam("rechargeBeginDay",dto.getRechargeBeginDay());
|
|
|
+ sql.setParam("rechargeEndDay",dto.getRechargeEndDay());
|
|
|
+ dao.execute(sql);
|
|
|
+ Sql sqlCount = Sqls.queryEntity("select count(*) from ads_account_agent_day a " + "$condition");
|
|
|
+ sqlCount.setCondition(cri);
|
|
|
+ pager.setRecordCount((int) Daos.queryCount(dao,sqlCount));
|
|
|
+ List<GamePromoteTotalVO> list = sql.getList(GamePromoteTotalVO.class);
|
|
|
+
|
|
|
+ //存在充值时间,获取表ads_dayn_amount的json数据
|
|
|
+ if (hasRechargeDate) {
|
|
|
+ Map<String, Object> dayNMap = new HashMap<>(4);
|
|
|
+ dayNMap.put("beginDay", dto.getRechargeBeginDay());
|
|
|
+ dayNMap.put("endDay", dto.getRechargeEndDay());
|
|
|
+
|
|
|
+ //循环总数据的每条数据
|
|
|
+ List<GamePromoteTotalVO> hasRechargeDayList = list.stream().map(item -> {
|
|
|
+ Sql sqlDayN = Sqls.queryString("select dayN from ads_dayn_amount where " +
|
|
|
+ "dt>=@beginDay and dt<=@endDay " +
|
|
|
+ "and account_id = @accountId " +
|
|
|
+ "and agent_id = @agentId");
|
|
|
+ dayNMap.put("accountId", item.getAccountId());
|
|
|
+ dayNMap.put("agentId", item.getAgentId());
|
|
|
+ sqlDayN.setParams(dayNMap);
|
|
|
+ dao.execute(sqlDayN);
|
|
|
+ List<String> dayNList = sqlDayN.getList(String.class);
|
|
|
+ DayN dayN = null;
|
|
|
+ //ads_dayn_amount存在充值数据
|
|
|
+ if (!CollectionUtils.isEmpty(dayNList)) {
|
|
|
+ Gson gson = new Gson();
|
|
|
+ List<Map<String, String>> jsonList = gson.fromJson(dayNList.toString(), ArrayList.class);
|
|
|
+
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ resultMap.put("dayN", "0.00-0-0");
|
|
|
+ for (Map<String, String> jsonMap : jsonList) {
|
|
|
+ for (Map.Entry<String, String> entry : jsonMap.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ String value = entry.getValue();
|
|
|
+ String[] parts = value.split("-");
|
|
|
+ if (DateUtil.parseLocalDate(key).compareTo(dto.getRechargeBeginDay()) >= 0
|
|
|
+ && DateUtil.parseLocalDate(key).compareTo(dto.getRechargeEndDay()) <= 0) {
|
|
|
+ String[] existingParts = resultMap.get("dayN").split("-");
|
|
|
+ BigDecimal money = new BigDecimal(existingParts[0]).add(new BigDecimal(parts[0]));
|
|
|
+ int count = Integer.parseInt(existingParts[1]) + Integer.parseInt(parts[1]);
|
|
|
+ int num = Integer.parseInt(existingParts[2]) + Integer.parseInt(parts[2]);
|
|
|
+ String newValue = money + "-" + count + "-" + num;
|
|
|
+ resultMap.put("dayN", newValue);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!resultMap.isEmpty() && !resultMap.get("dayN").isEmpty()) {
|
|
|
+ String[] parts = resultMap.get("dayN").split("-");
|
|
|
+ dayN = DayN.builder()
|
|
|
+ .rechargeMoney(new BigDecimal(parts[0]))
|
|
|
+ .rechargeCount(Long.valueOf(parts[1]))
|
|
|
+ .rechargeNum(Long.valueOf(parts[2]))
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //充值时间范围内存在充值数据
|
|
|
+ if (null != dayN) {
|
|
|
+ item.setUserRechargeMoney(dayN.getRechargeMoney());
|
|
|
+ item.setUserRechargeCount(dayN.getRechargeCount());
|
|
|
+ item.setUserRechargeUser(dayN.getRechargeNum());
|
|
|
+
|
|
|
+ item.setOldUserRechargeMoney(item.getShowRechargeMoney().subtract(dayN.getRechargeMoney()));
|
|
|
+ item.setOldUserRechargeCount(item.getShowRechargeCount() - dayN.getRechargeCount());
|
|
|
+ item.setOldUserRechargeUser(item.getShowRechargeUser() - dayN.getRechargeNum());
|
|
|
+ }
|
|
|
+ return item;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ return new Page<>(hasRechargeDayList, pager);
|
|
|
+ }
|
|
|
+ return new Page<>(list, pager);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推广每日数据SQL
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String accountAgentDaySql() {
|
|
|
+ return """
|
|
|
+ select
|
|
|
+ concat( dt, account_id, agent_id ) AS id,
|
|
|
+ agent_id,
|
|
|
+ agent_name,
|
|
|
+ account_id,
|
|
|
+ agent_id,
|
|
|
+ pitcher AS sys_user_name,
|
|
|
+ game_cp AS cp_name,
|
|
|
+ game_name,
|
|
|
+ game_type,
|
|
|
+ dt AS cost_day,
|
|
|
+ pitcher_id AS sys_user_id,
|
|
|
+ cost,
|
|
|
+ plan_count AS ad_plan_count,
|
|
|
+ view_count,
|
|
|
+ click_count,
|
|
|
+ change_count AS convert_count,
|
|
|
+ change_rate AS convert_rate,
|
|
|
+ avg_change_price AS avg_convert_cost,
|
|
|
+ depth_change_count AS deep_convert_count,
|
|
|
+ depth_change_rate AS deep_convert_rate,
|
|
|
+ avg_depth_change_price AS deep_convert_cost,
|
|
|
+ thousand_display_price AS thousand_view_cost,
|
|
|
+ click_rate,
|
|
|
+ avg_click_price AS avg_click_cost,
|
|
|
+ download_start AS app_download_count,
|
|
|
+ download_start_cost AS app_download_cost,
|
|
|
+ download_start_rate AS app_download_rate,
|
|
|
+ download_finish,
|
|
|
+ download_finish_cost,
|
|
|
+ download_finish_rate,
|
|
|
+ install_finish AS app_install_count,
|
|
|
+ install_finish_cost AS app_install_cost,
|
|
|
+ install_finish_rate AS app_install_rate,
|
|
|
+ active AS app_active_count,
|
|
|
+ active_cost AS app_active_cost,
|
|
|
+ active_rate AS app_active_rate,
|
|
|
+ register_num AS reg_user_count,
|
|
|
+ register_cost AS reg_cost,
|
|
|
+ first_new_user_amount_count AS first_user_recharge_count,
|
|
|
+ first_new_user_amount_num AS first_user_recharge_user,
|
|
|
+ first_new_user_amount AS first_user_recharge_money,
|
|
|
+ amount_count AS show_recharge_count,
|
|
|
+ amount_num AS show_recharge_user,
|
|
|
+ amount AS show_recharge_money,
|
|
|
+ old_amount_count AS old_user_recharge_count,
|
|
|
+ old_amount_num AS old_user_recharge_user,
|
|
|
+ old_amount AS old_user_recharge_money,
|
|
|
+ new_user_total_amount_count AS new_user_recharge_count,
|
|
|
+ new_user_total_amount_num AS new_user_recharge_user,
|
|
|
+ new_user_total_amount AS new_user_recharge_money,
|
|
|
+ today_roi AS today_recovery_rate,
|
|
|
+ first_roi AS first_recovery_rate,
|
|
|
+ buy_roi AS buy_recovery_rate,
|
|
|
+ gross_profit AS gross_margin,
|
|
|
+ roi3 AS roi_day3,
|
|
|
+ roi5 AS roi_day5,
|
|
|
+ roi7 AS roi_day7,
|
|
|
+ roi15 AS roi_day15,
|
|
|
+ roi30 AS roi_day30,
|
|
|
+ roi60 AS roi_day60,
|
|
|
+ roi180 AS roi_day180,
|
|
|
+ roi1yaer AS roi_year1,
|
|
|
+ first_rate AS first_recharge_rate,
|
|
|
+ buy_user_rate AS buy_user_recharge_rate,
|
|
|
+ today_rate AS new_user_recharge_rate,
|
|
|
+ first_avg AS avg_first_user_recharge,
|
|
|
+ buy_avg AS avg_buy_user_recharge,
|
|
|
+ paper_avg AS avg_show_user_recharge,
|
|
|
+ first_amount_cost AS first_recharge_cost,
|
|
|
+ buy_amount_cost AS buy_user_recharge_cost,
|
|
|
+ today_again_rate AS repeat_recharge_rate,
|
|
|
+ new_reg_arpu,
|
|
|
+ first_arpu AS first_recharge_arpu,
|
|
|
+ today_arpu AS today_recharge_arpu,
|
|
|
+ paper_arpu AS show_recharge_arpu,
|
|
|
+ amount_d1 AS recharge_trend_day1,
|
|
|
+ amount_d3 AS recharge_trend_day3,
|
|
|
+ amount_d7 AS recharge_trend_day7,
|
|
|
+ amount_d15 AS recharge_trend_day15,
|
|
|
+ amount_m1 AS recharge_trend_month1,
|
|
|
+ amount_m2 AS recharge_trend_month2,
|
|
|
+ amount_m3 AS recharge_trend_month3,
|
|
|
+ amount_sum AS recharge_trend_total,
|
|
|
+ hundred_user_num,
|
|
|
+ hundred_user_num_cost
|
|
|
+ from
|
|
|
+ ads_account_agent_day
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推广每日数据总计SQL
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String accountAgentDayTotalSql() {
|
|
|
+ return """
|
|
|
+ select
|
|
|
+ sum(cost) as cost,
|
|
|
+ sum(plan_count) as ad_plan_count,
|
|
|
+ sum(view_count) as view_count,
|
|
|
+ sum(click_count) as click_count,
|
|
|
+ sum(change_count) as convert_count,
|
|
|
+ round(if(sum(click_count) > 0, sum(change_count) / sum(click_count), 0), 4) as convert_rate,
|
|
|
+ round(if(sum(change_count) > 0, sum(cost) / sum(change_count), 0), 2) as avg_convert_cost,
|
|
|
+ sum(depth_change_count) as deep_convert_count,
|
|
|
+ round(if(sum(change_count) > 0, sum(depth_change_count) / sum(change_count), 0), 4) as deep_convert_rate,
|
|
|
+ round(if(sum(depth_change_count) > 0, sum(cost) / sum(depth_change_count), 0), 2) as deep_convert_cost,
|
|
|
+ round(if(sum(view_count) > 0, sum(cost) / sum(view_count) * 1000, 0), 2) as thousand_view_cost,
|
|
|
+ round(if(sum(view_count) > 0, sum(click_count) / sum(view_count), 0), 4) as click_rate,
|
|
|
+ round(if(sum(click_count) > 0, sum(cost) / sum(click_count), 0), 2) as avg_click_cost,
|
|
|
+ sum(download_start) as app_download_count,
|
|
|
+ round(if(sum(download_start) > 0, sum(cost) / sum(download_start), 0), 2) as app_download_cost,
|
|
|
+ round(if(sum(click_count) > 0, sum(download_start) / sum(click_count), 0), 4) as app_download_rate,
|
|
|
+ sum(download_finish) as download_finish,
|
|
|
+ round(if(sum(download_finish) > 0, sum(cost) / sum(download_finish), 0), 2) as download_finish_cost,
|
|
|
+ round(if(sum(download_start) > 0, sum(download_finish) / sum(download_start), 0), 4) as download_finish_rate,
|
|
|
+ sum(install_finish) as app_install_count,
|
|
|
+ round(if(sum(install_finish) > 0, sum(cost) / sum(install_finish), 0), 2) as app_install_cost,
|
|
|
+ round(if(sum(download_finish) > 0, sum(install_finish) / sum(download_finish), 0), 4) as app_install_rate,
|
|
|
+ sum(active) as app_active_count,
|
|
|
+ round(if(sum(active) > 0, sum(cost) / sum(active), 0), 2) as app_active_cost,
|
|
|
+ round(if(sum(click_count) > 0, sum(active) / sum(click_count), 0), 4) as app_active_rate,
|
|
|
+ sum(register_num) as reg_user_count,
|
|
|
+ round(if(sum(register_num) > 0, sum(cost) / sum(register_num), 0), 2) as reg_cost,
|
|
|
+ sum(first_new_user_amount_count) as first_user_recharge_count,
|
|
|
+ sum(first_new_user_amount_num) as first_user_recharge_user,
|
|
|
+ sum(first_new_user_amount) as first_user_recharge_money,
|
|
|
+ sum(amount_count) as show_recharge_count,
|
|
|
+ sum(amount_num) as show_recharge_user,
|
|
|
+ sum(amount) as show_recharge_money,
|
|
|
+ sum(old_amount_count) as old_user_recharge_count,
|
|
|
+ sum(old_amount_num) as old_user_recharge_user,
|
|
|
+ sum(old_amount) as old_user_recharge_money,
|
|
|
+ sum(new_user_total_amount_count) as new_user_recharge_count,
|
|
|
+ sum(new_user_total_amount_num) as new_user_recharge_user,
|
|
|
+ sum(new_user_total_amount) as new_user_recharge_money,
|
|
|
+ round(if(sum(cost) > 0, sum(first_new_user_amount) / sum(cost), 0), 4) as first_recovery_rate,
|
|
|
+ round(if(sum(cost) > 0, sum(new_user_total_amount) / sum(cost), 0), 4) as today_recovery_rate,
|
|
|
+ round(if(sum(cost) > 0, sum(buy_new_user_total_amount) / sum(cost), 0), 4) as buy_recovery_rate,
|
|
|
+ sum(gross_profit) as gross_margin,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d3, '/', 1)) / sum(cost), 0), 4) as roi_day3,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d5, '/', 1)) / sum(cost), 0), 4) as roi_day5,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d7, '/', 1)) / sum(cost), 0), 4) as roi_day7,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_d15, '/', 1)) / sum(cost), 0), 4) as roi_day15,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m1, '/', 1)) / sum(cost), 0), 4) as roi_day30,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m2, '/', 1)) / sum(cost), 0), 4) as roi_day60,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_m6, '/', 1)) / sum(cost), 0), 4) as roi_day180,
|
|
|
+ round(if(sum(cost) > 0, sum(SPLIT_PART(amount_y1, '/', 1)) / sum(cost), 0), 4) as roi_year1,
|
|
|
+ round(if(sum(register_num) > 0, sum(first_new_user_amount_num) / sum(register_num), 0), 4) as first_recharge_rate,
|
|
|
+ round(if(sum(register_num) > 0, sum(buy_new_user_total_amount_num) / sum(register_num), 0), 4) as buy_user_recharge_rate,
|
|
|
+ round(if(sum(register_num) > 0, sum(new_user_total_amount_num) / sum(register_num), 0), 4) as new_user_recharge_rate,
|
|
|
+ round(if(sum(first_new_user_amount_count) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
|
|
|
+ round(if(sum(buy_new_user_total_amount_count) > 0, sum(buy_new_user_total_amount) / sum(buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
|
|
|
+ round(if(sum(amount_count) > 0, sum(amount) / sum(amount_count), 0), 4) as avg_show_user_recharge,
|
|
|
+ round(if(sum(first_new_user_amount_num) > 0, sum(cost) / sum(first_new_user_amount_num), 0), 4) as first_recharge_cost,
|
|
|
+ round(if(sum(buy_new_user_total_amount_num) > 0, sum(cost) / sum(buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
|
|
|
+ round(if(sum(new_user_total_amount_num) > 0, sum(reg_order_user_again) / sum(new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
|
|
|
+ round(if(sum(register_num) > 0, sum(new_user_total_amount) / sum(register_num), 0), 4) as new_reg_arpu,
|
|
|
+ round(if(sum(first_new_user_amount_num) > 0, sum(first_new_user_amount) / sum(first_new_user_amount_num), 0), 4) as first_recharge_arpu,
|
|
|
+ round(if(sum(new_user_total_amount_num) > 0, sum(new_user_total_amount) / sum(new_user_total_amount_num), 0), 4) as today_recharge_arpu,
|
|
|
+ round(if(sum(amount_num) > 0, sum(amount) / sum(amount_num), 0), 4) as show_recharge_arpu,
|
|
|
+ sum(hundred_user_num) as hundred_user_num,
|
|
|
+ round(if(sum(hundred_user_num) > 0, sum(cost) / sum(hundred_user_num), 0), 4) as hundred_user_num_cost
|
|
|
+ from
|
|
|
+ ads_account_agent_day
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推广总数据SQL
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String accountAgentTotalSql() {
|
|
|
+ return """
|
|
|
+ select
|
|
|
+ concat(a.account_id, a.agent_id) as id,
|
|
|
+ a.account_id,
|
|
|
+ a.agent_id,
|
|
|
+ max(a.agent_name) as agent_name,
|
|
|
+ max(a.account_type) as account_type,
|
|
|
+ max(a.pitcher) as sys_user_name,
|
|
|
+ max(a.game_cp) as cp_name,
|
|
|
+ max(a.game_name) as game_name,
|
|
|
+ max(a.game_type) as game_type,
|
|
|
+ max(a.pitcher_id) as sys_user_id,
|
|
|
+ sum(a.cost) as cost,
|
|
|
+ sum(a.plan_count) as ad_plan_count,
|
|
|
+ sum(a.view_count) as view_count,
|
|
|
+ sum(a.click_count) as click_count,
|
|
|
+ sum(a.change_count) as convert_count,
|
|
|
+ round(if(sum(a.click_count) > 0, sum(a.change_count) / sum(a.click_count), 0), 4) as convert_rate,
|
|
|
+ round(if(sum(a.change_count) > 0, sum(a.cost) / sum(a.change_count), 0), 2) as avg_convert_cost,
|
|
|
+ sum(a.depth_change_count) as deep_convert_count,
|
|
|
+ round(if(sum(a.change_count) > 0, sum(a.depth_change_count) / sum(a.change_count), 0), 4) as deep_convert_rate,
|
|
|
+ round(if(sum(a.depth_change_count) > 0, sum(a.cost) / sum(a.depth_change_count), 0), 2) as deep_convert_cost,
|
|
|
+ round(if(sum(a.view_count) > 0, sum(a.cost) / sum(a.view_count) * 1000, 0), 2) as thousand_view_cost,
|
|
|
+ round(if(sum(a.view_count) > 0, sum(a.click_count) / sum(a.view_count), 0), 4) as click_rate,
|
|
|
+ round(if(sum(a.click_count) > 0, sum(a.cost) / sum(a.click_count), 0), 2) as avg_click_cost,
|
|
|
+ sum(a.download_start) as app_download_count,
|
|
|
+ round(if(sum(a.download_start) > 0, sum(a.cost) / sum(a.download_start), 0), 2) as app_download_cost,
|
|
|
+ round(if(sum(a.click_count) > 0, sum(a.download_start) / sum(a.click_count), 0), 4) as app_download_rate,
|
|
|
+ sum(a.download_finish) as download_finish,
|
|
|
+ round(if(sum(a.download_finish) > 0, sum(a.cost) / sum(a.download_finish), 0), 2) as download_finish_cost,
|
|
|
+ round(if(sum(a.download_start) > 0, sum(a.download_finish) / sum(a.download_start), 0), 4) as download_finish_rate,
|
|
|
+ sum(a.install_finish) as app_install_count,
|
|
|
+ round(if(sum(a.install_finish) > 0, sum(a.cost) / sum(a.install_finish), 0), 2) as app_install_cost,
|
|
|
+ round(if(sum(a.download_finish) > 0, sum(a.install_finish) / sum(a.download_finish), 0), 4) as app_install_rate,
|
|
|
+ sum(a.active) as app_active_count,
|
|
|
+ round(if(sum(a.active) > 0, sum(a.cost) / sum(a.active), 0), 2) as app_active_cost,
|
|
|
+ round(if(sum(a.click_count) > 0, sum(a.active) / sum(a.click_count), 0), 4) as app_active_rate,
|
|
|
+ sum(a.register_num) as reg_user_count,
|
|
|
+ round(if(sum(a.register_num) > 0, sum(a.cost) / sum(a.register_num), 0), 2) as reg_cost,
|
|
|
+ sum(a.first_new_user_amount_count) as first_user_recharge_count,
|
|
|
+ sum(a.first_new_user_amount_num) as first_user_recharge_user,
|
|
|
+ sum(a.first_new_user_amount) as first_user_recharge_money,
|
|
|
+ sum(a.first_new_user_amount_count) as user_recharge_count,
|
|
|
+ sum(a.first_new_user_amount_num) as user_recharge_user,
|
|
|
+ sum(a.first_new_user_amount) as user_recharge_money,
|
|
|
+ sum(b.amount_count) as show_recharge_count,
|
|
|
+ sum(b.amount_num) as show_recharge_user,
|
|
|
+ sum(b.amount) as show_recharge_money,
|
|
|
+ sum(a.old_amount_count) as old_user_recharge_count,
|
|
|
+ sum(a.old_amount_num) as old_user_recharge_user,
|
|
|
+ sum(a.old_amount) as old_user_recharge_money,
|
|
|
+ sum(a.new_user_total_amount_count) as new_user_recharge_count,
|
|
|
+ sum(a.new_user_total_amount_num) as new_user_recharge_user,
|
|
|
+ sum(a.new_user_total_amount) as new_user_recharge_money,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.first_new_user_amount) / sum(a.cost), 0), 4) as first_recovery_rate,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.new_user_total_amount) / sum(a.cost), 0), 4) as today_recovery_rate,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.buy_new_user_total_amount) / sum(a.cost), 0), 4) as buy_recovery_rate,
|
|
|
+ sum(a.gross_profit) as gross_margin,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d3, '/', 1)) / sum(a.cost), 0), 4) as roi_day3,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d5, '/', 1)) / sum(a.cost), 0), 4) as roi_day5,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d7, '/', 1)) / sum(a.cost), 0), 4) as roi_day7,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_d15, '/', 1)) / sum(a.cost), 0), 4) as roi_day15,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m1, '/', 1)) / sum(a.cost), 0), 4) as roi_day30,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m2, '/', 1)) / sum(a.cost), 0), 4) as roi_day60,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_m6, '/', 1)) / sum(a.cost), 0), 4) as roi_day180,
|
|
|
+ round(if(sum(a.cost) > 0, sum(a.SPLIT_PART(a.amount_y1, '/', 1)) / sum(a.cost), 0), 4) as roi_year1,
|
|
|
+ round(if(sum(a.register_num) > 0, sum(a.first_new_user_amount_num) / sum(a.register_num), 0), 4) as first_recharge_rate,
|
|
|
+ round(if(sum(a.register_num) > 0, sum(a.buy_new_user_total_amount_num) / sum(a.register_num), 0), 4) as buy_user_recharge_rate,
|
|
|
+ round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount_num) / sum(a.register_num), 0), 4) as new_user_recharge_rate,
|
|
|
+ round(if(sum(a.first_new_user_amount_count) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_count), 0), 4) as avg_first_user_recharge,
|
|
|
+ round(if(sum(a.buy_new_user_total_amount_count) > 0, sum(a.buy_new_user_total_amount) / sum(a.buy_new_user_total_amount_count), 0), 4) as avg_buy_user_recharge,
|
|
|
+ round(if(sum(a.amount_count) > 0, sum(a.amount) / sum(a.amount_count), 0), 4) as avg_show_user_recharge,
|
|
|
+ round(if(sum(a.first_new_user_amount_num) > 0, sum(a.cost) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_cost,
|
|
|
+ round(if(sum(a.buy_new_user_total_amount_num) > 0, sum(a.cost) / sum(a.buy_new_user_total_amount_num), 0), 4) as buy_user_recharge_cost,
|
|
|
+ round(if(sum(a.new_user_total_amount_num) > 0, sum(a.reg_order_user_again) / sum(a.new_user_total_amount_num), 0), 4) as repeat_recharge_rate,
|
|
|
+ round(if(sum(a.register_num) > 0, sum(a.new_user_total_amount) / sum(a.register_num), 0), 4) as new_reg_arpu,
|
|
|
+ round(if(sum(a.first_new_user_amount_num) > 0, sum(a.first_new_user_amount) / sum(a.first_new_user_amount_num), 0), 4) as first_recharge_arpu,
|
|
|
+ round(if(sum(a.new_user_total_amount_num) > 0, sum(a.new_user_total_amount) / sum(a.new_user_total_amount_num), 0), 4) as today_recharge_arpu,
|
|
|
+ round(if(sum(a.amount_num) > 0, sum(a.amount) / sum(a.amount_num), 0), 4) as show_recharge_arpu,
|
|
|
+ sum(a.hundred_user_num) as hundred_user_num,
|
|
|
+ round(if(sum(a.hundred_user_num) > 0, sum(a.cost) / sum(a.hundred_user_num), 0), 4) as hundred_user_num_cost
|
|
|
+ from
|
|
|
+ ads_account_agent_day a
|
|
|
+ left join game_ads.ads_account_agent_day b on
|
|
|
+ b.pitcher_id = a.pitcher_id
|
|
|
+ and b.agent_id = a.agent_id
|
|
|
+ and b.account_id = a.account_id
|
|
|
+ and b.dt >= @rechargeBeginDay
|
|
|
+ and b.dt <= @rechargeEndDay
|
|
|
+ """;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Data
|
|
|
+ @Builder
|
|
|
+ public static class DayN{
|
|
|
+ private BigDecimal rechargeMoney;
|
|
|
+ private Long rechargeCount;
|
|
|
+ private Long rechargeNum;
|
|
|
+ }
|
|
|
+}
|