请求解析图标数据
parent
39242a2f71
commit
9d537e23ce
@ -0,0 +1,45 @@
|
||||
package com.baiyee.adcallback.api.constants;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/3
|
||||
*/
|
||||
public class SqlConstant {
|
||||
private SqlConstant(){}
|
||||
|
||||
public static final String TABLE_STR = "tabIndex";
|
||||
|
||||
public static final String TABLE_JU_QIAN = "juqian1";
|
||||
|
||||
/**
|
||||
* 请求sql
|
||||
*/
|
||||
public static final String PARSE_DATA_SQL = "SELECT" +
|
||||
" `date` AS `dateStr`, " +
|
||||
" MAX( `sum` ) AS `num` " +
|
||||
" FROM " +
|
||||
" (" +
|
||||
" SELECT" +
|
||||
" @cdate \\:= DATE_ADD( @cdate, INTERVAL - 1 DAY ) `date`," +
|
||||
" 0 AS `sum` " +
|
||||
" FROM" +
|
||||
" ( SELECT @cdate \\:= DATE_ADD( CURDATE( ), INTERVAL + 1 DAY ) FROM tabIndex ) tb " +
|
||||
" WHERE " +
|
||||
" @cdate > :formatDate UNION ALL" +
|
||||
" SELECT " +
|
||||
" DATE_FORMAT( gmt_create, '%Y-%m-%d' ) AS `date`," +
|
||||
" COUNT( DISTINCT ( `imei` ) ) AS 'sum'" +
|
||||
" FROM" +
|
||||
" `tabIndex` " +
|
||||
" WHERE" +
|
||||
" tabIndex.`gmt_create` >= :startTime " +
|
||||
" AND gmt_create < :endTime " +
|
||||
" AND tag = :tagStr" +
|
||||
" GROUP BY" +
|
||||
" DATE DESC " +
|
||||
" ) _tmpAllTable " +
|
||||
"GROUP BY" +
|
||||
" `date` DESC";
|
||||
|
||||
|
||||
}
|
@ -1,13 +1,30 @@
|
||||
package com.baiyee.adcallback.api.controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import com.baiyee.adcallback.api.common.CommonResponse;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisRequestDTO;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisResponseDTO;
|
||||
import com.baiyee.adcallback.service.AnalysisService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/1
|
||||
*/
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/data/analysis")
|
||||
public class DataAnalysisController {
|
||||
|
||||
private final AnalysisService analysisService;
|
||||
|
||||
@PostMapping("/tag")
|
||||
public CommonResponse<Map<String, List<DataAnalysisResponseDTO>>> queryByDataRequest
|
||||
(@RequestBody List<DataAnalysisRequestDTO> requestDTOList) {
|
||||
return analysisService.processRequest(requestDTOList);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,21 @@
|
||||
package com.baiyee.adcallback.api.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Data
|
||||
public class DataAnalysisRequestDTO {
|
||||
|
||||
private String tagStr;
|
||||
|
||||
private Date endTime;
|
||||
|
||||
private Date startTime;
|
||||
|
||||
private Integer deliveryQuantity;
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.baiyee.adcallback.api.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Data
|
||||
public class DataAnalysisResponseDTO {
|
||||
|
||||
/**
|
||||
* tag
|
||||
*/
|
||||
private String tagString;
|
||||
|
||||
/**
|
||||
* 投放时间
|
||||
*/
|
||||
private String deliveryTime;
|
||||
|
||||
/**
|
||||
* 投放比率
|
||||
*/
|
||||
private BigDecimal deliveryRatio;
|
||||
|
||||
/**
|
||||
* 投放数量
|
||||
*/
|
||||
private BigInteger deliveryVolume;
|
||||
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.baiyee.adcallback.api.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigInteger;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Data
|
||||
public class QueryResultDTO implements Serializable {
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
private BigInteger num;
|
||||
|
||||
/**
|
||||
* 时间格式
|
||||
*/
|
||||
private String dateStr;
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.baiyee.adcallback.common.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public enum DeliveryPlatformEnum {
|
||||
|
||||
/**
|
||||
* 巨量
|
||||
*/
|
||||
JL("JL", 1),
|
||||
/**
|
||||
* 快手
|
||||
*/
|
||||
KS("KS", 2),
|
||||
/**
|
||||
* UC
|
||||
*/
|
||||
UC("UC", 3),
|
||||
/**
|
||||
* VIVO
|
||||
*/
|
||||
VIVO("VIVO", 4),
|
||||
|
||||
/**
|
||||
* 百度
|
||||
*/
|
||||
BD("BD", 5);
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final String type;
|
||||
|
||||
/**
|
||||
* 数字标识
|
||||
*/
|
||||
private final Integer num;
|
||||
|
||||
|
||||
public static Integer getValue(String tagString) {
|
||||
for (DeliveryPlatformEnum value : DeliveryPlatformEnum.values()) {
|
||||
if (tagString.equalsIgnoreCase(value.getType())) {
|
||||
return value.getNum();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.baiyee.adcallback.common.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Getter
|
||||
@RequiredArgsConstructor
|
||||
public enum TableEnum {
|
||||
|
||||
/**
|
||||
* 巨量
|
||||
*/
|
||||
JL("tb_jl_backdata"),
|
||||
/**
|
||||
* 快手
|
||||
*/
|
||||
KS("tb_ks_backdata"),
|
||||
/**
|
||||
* UC
|
||||
*/
|
||||
UC("tb_uc_backdata"),
|
||||
/**
|
||||
* VIVO
|
||||
*/
|
||||
VIVO("tb_vivo_backdata"),
|
||||
|
||||
/**
|
||||
* 百度
|
||||
*/
|
||||
BD("tb_bd_backdata");
|
||||
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
private final String tableName;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.baiyee.adcallback.service;
|
||||
|
||||
import com.baiyee.adcallback.api.common.CommonResponse;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisRequestDTO;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisResponseDTO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
public interface AnalysisService {
|
||||
/**
|
||||
* 根据请求查询条件
|
||||
* @param requestDTOList 请求list
|
||||
* @return
|
||||
*/
|
||||
CommonResponse<Map<String, List<DataAnalysisResponseDTO>>>
|
||||
processRequest(List<DataAnalysisRequestDTO> requestDTOList);
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
package com.baiyee.adcallback.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUnit;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.text.CharSequenceUtil;
|
||||
import cn.hutool.core.text.StrPool;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baiyee.adcallback.api.common.CommonResponse;
|
||||
import com.baiyee.adcallback.api.constants.SqlConstant;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisRequestDTO;
|
||||
import com.baiyee.adcallback.api.dto.DataAnalysisResponseDTO;
|
||||
import com.baiyee.adcallback.api.dto.QueryResultDTO;
|
||||
import com.baiyee.adcallback.common.enums.DeliveryPlatformEnum;
|
||||
import com.baiyee.adcallback.common.enums.TableEnum;
|
||||
import com.baiyee.adcallback.service.AnalysisService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.hibernate.query.internal.NativeQueryImpl;
|
||||
import org.hibernate.transform.Transformers;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date : 2022/3/2
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AnalysisServiceImpl implements AnalysisService {
|
||||
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
|
||||
@Override
|
||||
public CommonResponse<Map<String, List<DataAnalysisResponseDTO>>> processRequest(
|
||||
List<DataAnalysisRequestDTO> requestDTOList) {
|
||||
Map<String, List<DataAnalysisResponseDTO>> map = new HashMap<>(16);
|
||||
List<DataAnalysisResponseDTO> responseList;
|
||||
DataAnalysisResponseDTO responseDTO;
|
||||
if (CollUtil.isNotEmpty(requestDTOList)) {
|
||||
for (DataAnalysisRequestDTO dto : requestDTOList) {
|
||||
responseList = new ArrayList<>();
|
||||
if (ObjectUtil.isNotNull(dto.getTagStr()) && dto.getDeliveryQuantity() != null) {
|
||||
String tagStr = dto.getTagStr();
|
||||
// 不传入结束时间默认今天
|
||||
Date endTime = dto.getEndTime() != null ?
|
||||
dto.getEndTime()
|
||||
: DateUtil.beginOfDay(DateUtil.date());
|
||||
// 开始时间为空将往前一周
|
||||
Date startTime = dto.getStartTime() != null ?
|
||||
dto.getStartTime()
|
||||
: DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), 7));
|
||||
String formatDate = DateUtil.formatDate(startTime);
|
||||
Integer deliveryQuantity = dto.getDeliveryQuantity();
|
||||
Long between = DateUtil.between(startTime, endTime, DateUnit.DAY);
|
||||
if (between <= 0) {
|
||||
return CommonResponse.createByErrorMessage("开始时间必须大于结束花间");
|
||||
}
|
||||
// 计算平均数量
|
||||
BigDecimal div = NumberUtil.div(deliveryQuantity, between);
|
||||
// 获取不同请求结果
|
||||
List<QueryResultDTO> resultDTOList = getQueryResults(tagStr, formatDate, endTime, startTime);
|
||||
if (CollUtil.isNotEmpty(resultDTOList)) {
|
||||
for (QueryResultDTO resultDTO : resultDTOList) {
|
||||
responseDTO = new DataAnalysisResponseDTO();
|
||||
responseDTO.setTagString(tagStr);
|
||||
responseDTO.setDeliveryTime(resultDTO.getDateStr());
|
||||
responseDTO.setDeliveryRatio(BigDecimal.valueOf(0.0));
|
||||
responseDTO.setDeliveryVolume(resultDTO.getNum());
|
||||
if (resultDTO.getNum() != null && resultDTO.getNum().intValue() > 0) {
|
||||
// 计算汇率
|
||||
responseDTO.setDeliveryRatio(NumberUtil.div(resultDTO.getNum(), div, 2));
|
||||
}
|
||||
responseList.add(responseDTO);
|
||||
}
|
||||
map.put(tagStr, responseList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return CommonResponse.createBySuccess(map);
|
||||
}
|
||||
|
||||
private List<QueryResultDTO> getQueryResults
|
||||
(String tagStr, String formatDate, Date endTime, Date startTime) {
|
||||
// 获取前缀判断来源
|
||||
int value = tagStr.contains(StrPool.UNDERLINE) ? DeliveryPlatformEnum.getValue
|
||||
(tagStr.substring(0, tagStr.indexOf(StrPool.DASHED))) : tagStr.equalsIgnoreCase(SqlConstant.TABLE_JU_QIAN) ? 1 : 999;
|
||||
|
||||
String sqlString = CharSequenceUtil.EMPTY;
|
||||
switch (value) {
|
||||
case 1:
|
||||
// 巨量
|
||||
sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.JL.getTableName());
|
||||
break;
|
||||
case 2:
|
||||
// 快手
|
||||
sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.KS.getTableName());
|
||||
break;
|
||||
case 3:
|
||||
// UC
|
||||
sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.UC.getTableName());
|
||||
break;
|
||||
case 4:
|
||||
// VIVO
|
||||
sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.VIVO.getTableName());
|
||||
break;
|
||||
case 5:
|
||||
//百度
|
||||
sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.BD.getTableName());
|
||||
break;
|
||||
default:
|
||||
}
|
||||
if (CharSequenceUtil.isNotBlank(sqlString)) {
|
||||
NativeQueryImpl<QueryResultDTO> nativeQuery =
|
||||
entityManager.createNativeQuery(sqlString).unwrap(NativeQueryImpl.class);
|
||||
nativeQuery.setResultTransformer
|
||||
(Transformers.aliasToBean(QueryResultDTO.class));
|
||||
nativeQuery.setParameter("tagStr", tagStr);
|
||||
nativeQuery.setParameter("endTime", endTime);
|
||||
nativeQuery.setParameter("startTime", startTime);
|
||||
nativeQuery.setParameter("formatDate", formatDate);
|
||||
return nativeQuery.getResultList();
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue