From 9d537e23ce5a75e2b76a525a04b96a54d50bbf21 Mon Sep 17 00:00:00 2001 From: bynt Date: Mon, 7 Mar 2022 18:23:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E8=A7=A3=E6=9E=90=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adcallback/api/constants/SqlConstant.java | 45 ++++++ .../controller/DataAnalysisController.java | 21 ++- .../api/dto/DataAnalysisRequestDTO.java | 21 +++ .../api/dto/DataAnalysisResponseDTO.java | 37 +++++ .../adcallback/api/dto/QueryResultDTO.java | 23 +++ .../common/enums/DeliveryPlatformEnum.java | 55 +++++++ .../adcallback/common/enums/TableEnum.java | 42 ++++++ .../repository/entity/TbKsBackdataEntity.java | 1 - .../adcallback/service/AnalysisService.java | 22 +++ .../service/impl/AnalysisServiceImpl.java | 134 ++++++++++++++++++ src/main/resources/application-dev.yml | 3 + src/main/resources/application-prod.yml | 1 + src/main/resources/application.yml | 4 +- 13 files changed, 404 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java create mode 100644 src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisRequestDTO.java create mode 100644 src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisResponseDTO.java create mode 100644 src/main/java/com/baiyee/adcallback/api/dto/QueryResultDTO.java create mode 100644 src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java create mode 100644 src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java create mode 100644 src/main/java/com/baiyee/adcallback/service/AnalysisService.java create mode 100644 src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java diff --git a/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java b/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java new file mode 100644 index 0000000..3117a17 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java @@ -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"; + + +} diff --git a/src/main/java/com/baiyee/adcallback/api/controller/DataAnalysisController.java b/src/main/java/com/baiyee/adcallback/api/controller/DataAnalysisController.java index f3cad08..73eae4f 100644 --- a/src/main/java/com/baiyee/adcallback/api/controller/DataAnalysisController.java +++ b/src/main/java/com/baiyee/adcallback/api/controller/DataAnalysisController.java @@ -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>> queryByDataRequest + (@RequestBody List requestDTOList) { + return analysisService.processRequest(requestDTOList); + + } } diff --git a/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisRequestDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisRequestDTO.java new file mode 100644 index 0000000..17518b2 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisRequestDTO.java @@ -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; +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisResponseDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisResponseDTO.java new file mode 100644 index 0000000..d8d8df2 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/DataAnalysisResponseDTO.java @@ -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; + + + +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/QueryResultDTO.java b/src/main/java/com/baiyee/adcallback/api/dto/QueryResultDTO.java new file mode 100644 index 0000000..279a34f --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/QueryResultDTO.java @@ -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; +} diff --git a/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java b/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java new file mode 100644 index 0000000..84f5006 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java @@ -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; + } +} diff --git a/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java b/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java new file mode 100644 index 0000000..f62cbdd --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java @@ -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; + + +} diff --git a/src/main/java/com/baiyee/adcallback/repository/entity/TbKsBackdataEntity.java b/src/main/java/com/baiyee/adcallback/repository/entity/TbKsBackdataEntity.java index c0a9abc..974b602 100644 --- a/src/main/java/com/baiyee/adcallback/repository/entity/TbKsBackdataEntity.java +++ b/src/main/java/com/baiyee/adcallback/repository/entity/TbKsBackdataEntity.java @@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.sql.Timestamp; -import java.util.Objects; @Entity @Table(name = "tb_ks_backdata", schema = "db_ad", catalog = "") diff --git a/src/main/java/com/baiyee/adcallback/service/AnalysisService.java b/src/main/java/com/baiyee/adcallback/service/AnalysisService.java new file mode 100644 index 0000000..c7513ab --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/AnalysisService.java @@ -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>> + processRequest(List requestDTOList); +} diff --git a/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java new file mode 100644 index 0000000..b456fc0 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java @@ -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>> processRequest( + List requestDTOList) { + Map> map = new HashMap<>(16); + List 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 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 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 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<>(); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 163f383..cea1e1b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -45,3 +45,6 @@ spring: wall: config: multi-statement-allow: true + connect-properties: druid.stat.mergeSql=false + + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 9e88f0b..9b62370 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -43,3 +43,4 @@ spring: wall: config: multi-statement-allow: true + connect-properties: druid.stat.mergeSql=false diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0014780..0768d42 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,7 +4,7 @@ spring: application: name: ad-callback profiles: - active: dev + active: prod jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss @@ -55,4 +55,4 @@ short: ThreadNamePrefix: 'XXX-' generate: - url: https://cb.tuoz.net \ No newline at end of file + url: https://cb.tuoz.net