请求解析图标数据

master
bynt 3 years ago
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; package com.baiyee.adcallback.api.controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.baiyee.adcallback.api.common.CommonResponse;
import org.springframework.web.bind.annotation.RestController; 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 * @author Enzo
* @date : 2022/3/1 * @date : 2022/3/1
*/ */
@RestController @RestController
@RequiredArgsConstructor
@RequestMapping("/data/analysis") @RequestMapping("/data/analysis")
public class DataAnalysisController { 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;
}

@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*; import javax.persistence.*;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Objects;
@Entity @Entity
@Table(name = "tb_ks_backdata", schema = "db_ad", catalog = "") @Table(name = "tb_ks_backdata", schema = "db_ad", catalog = "")

@ -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<>();
}
}

@ -45,3 +45,6 @@ spring:
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
connect-properties: druid.stat.mergeSql=false

@ -43,3 +43,4 @@ spring:
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
connect-properties: druid.stat.mergeSql=false

@ -4,7 +4,7 @@ spring:
application: application:
name: ad-callback name: ad-callback
profiles: profiles:
active: dev active: prod
jackson: jackson:
time-zone: GMT+8 time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss
@ -55,4 +55,4 @@ short:
ThreadNamePrefix: 'XXX-' ThreadNamePrefix: 'XXX-'
generate: generate:
url: https://cb.tuoz.net url: https://cb.tuoz.net

Loading…
Cancel
Save