diff --git a/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java b/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java index 3117a17..c157a66 100644 --- a/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java +++ b/src/main/java/com/baiyee/adcallback/api/constants/SqlConstant.java @@ -32,14 +32,14 @@ public class SqlConstant { " FROM" + " `tabIndex` " + " WHERE" + - " tabIndex.`gmt_create` >= :startTime " + + " tabIndex.`gmt_create` > :startTime " + " AND gmt_create < :endTime " + " AND tag = :tagStr" + " GROUP BY" + " DATE DESC " + " ) _tmpAllTable " + "GROUP BY" + - " `date` DESC"; + " `date`"; } diff --git a/src/main/java/com/baiyee/adcallback/api/constants/TagTypeConstant.java b/src/main/java/com/baiyee/adcallback/api/constants/TagTypeConstant.java new file mode 100644 index 0000000..2ca0604 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/constants/TagTypeConstant.java @@ -0,0 +1,22 @@ +package com.baiyee.adcallback.api.constants; + +/** + * 0:巨量 1:百度 2:快手 3:UC 4:VIVO 5:广点通 + */ +public class TagTypeConstant { + private TagTypeConstant(){ + + } + + public static final int JL = 0; + + public static final int BD = 1; + + public static final int KS = 2; + + public static final int UC = 3; + + public static final int VIVO = 4; + + public static final int GDT = 5; +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java index 5283381..d4728ba 100644 --- a/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java +++ b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java @@ -2,8 +2,6 @@ package com.baiyee.adcallback.api.dto; import lombok.Data; -import java.util.Date; - /** * @author wujingtao * @date 2022/03/01 @@ -12,5 +10,7 @@ import java.util.Date; public class DmpMonitorJpaDto { private String imei; - private Date gmtCreate; + private String gmtCreate; + private String tag; + private Long num; } diff --git a/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java b/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java index 84f5006..3ca9b73 100644 --- a/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java +++ b/src/main/java/com/baiyee/adcallback/common/enums/DeliveryPlatformEnum.java @@ -26,12 +26,17 @@ public enum DeliveryPlatformEnum { /** * VIVO */ - VIVO("VIVO", 4), + VV("VV", 4), /** * 百度 */ - BD("BD", 5); + BD("BD", 5), + + /** + * 广点通 + */ + GD("GD", 6); /** * 类型 diff --git a/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java b/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java index f62cbdd..ebbdee6 100644 --- a/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java +++ b/src/main/java/com/baiyee/adcallback/common/enums/TableEnum.java @@ -26,12 +26,17 @@ public enum TableEnum { /** * VIVO */ - VIVO("tb_vivo_backdata"), + VV("tb_vivo_backdata"), /** * 百度 */ - BD("tb_bd_backdata"); + BD("tb_bd_backdata"), + + /** + * 广点通 + */ + GD("tb_gdt_backdata"); /** * 类型 diff --git a/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java b/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java index 4174ae3..d3d7430 100644 --- a/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java +++ b/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java @@ -1,7 +1,9 @@ package com.baiyee.adcallback.service; +import com.baiyee.adcallback.api.dto.DmpMonitorJpaDto; import com.baiyee.adcallback.api.dto.DmpMonitorNumDto; +import java.util.List; import java.util.Map; /** @@ -11,5 +13,5 @@ import java.util.Map; public interface DmpMonitorNumService { Map queryNumByTags(DmpMonitorNumDto dmpMonitorNumDto); - Map getDmpImeiLink(DmpMonitorNumDto dmpMonitorNumDto); + Map> getDmpImeiLink(DmpMonitorNumDto dmpMonitorNumDto); } diff --git a/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java index b456fc0..207633b 100644 --- a/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java +++ b/src/main/java/com/baiyee/adcallback/service/impl/AnalysisServiceImpl.java @@ -52,11 +52,11 @@ public class AnalysisServiceImpl implements AnalysisService { // 不传入结束时间默认今天 Date endTime = dto.getEndTime() != null ? dto.getEndTime() - : DateUtil.beginOfDay(DateUtil.date()); + : DateUtil.beginOfDay(DateUtil.date()); // 开始时间为空将往前一周 Date startTime = dto.getStartTime() != null ? dto.getStartTime() - : DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), 7)); + : DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), 7)); String formatDate = DateUtil.formatDate(startTime); Integer deliveryQuantity = dto.getDeliveryQuantity(); Long between = DateUtil.between(startTime, endTime, DateUnit.DAY); @@ -91,7 +91,7 @@ public class AnalysisServiceImpl implements AnalysisService { private List getQueryResults (String tagStr, String formatDate, Date endTime, Date startTime) { // 获取前缀判断来源 - int value = tagStr.contains(StrPool.UNDERLINE) ? DeliveryPlatformEnum.getValue + int value = tagStr.contains(StrPool.DASHED) ? DeliveryPlatformEnum.getValue (tagStr.substring(0, tagStr.indexOf(StrPool.DASHED))) : tagStr.equalsIgnoreCase(SqlConstant.TABLE_JU_QIAN) ? 1 : 999; String sqlString = CharSequenceUtil.EMPTY; @@ -110,12 +110,16 @@ public class AnalysisServiceImpl implements AnalysisService { break; case 4: // VIVO - sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.VIVO.getTableName()); + sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.VV.getTableName()); break; case 5: //百度 sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.BD.getTableName()); break; + case 6: + //广点通 + sqlString = SqlConstant.PARSE_DATA_SQL.replaceAll(SqlConstant.TABLE_STR, TableEnum.GD.getTableName()); + break; default: } if (CharSequenceUtil.isNotBlank(sqlString)) { diff --git a/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java index 0203647..6920130 100644 --- a/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java +++ b/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; +import java.math.BigInteger; import java.util.*; import java.util.stream.Collectors; @@ -35,107 +36,168 @@ public class DmpMonitorNumServiceImpl implements DmpMonitorNumService { @Override public Map queryNumByTags(DmpMonitorNumDto dmpMonitorNumDto) { HashMap map = new HashMap<>(); - for (String tag : dmpMonitorNumDto.getTags()) { - List imel = getImeiNum(dmpMonitorNumDto.getStartTime(), dmpMonitorNumDto.getEndTime(), tag); - List> groupByTime = getGroupByTime(dmpMonitorNumDto.getStartTime(), dmpMonitorNumDto.getEndTime(), imel); - map.put(tag, groupByTime); + List mapData = getMapData(dmpMonitorNumDto, 1); + HashMap> numMapGroupByTag = new HashMap<>(8); + mapData.stream().collect(Collectors.groupingBy(DmpMonitorJpaDto::getTag, Collectors.toList())).forEach(numMapGroupByTag::put); + for (String key : dmpMonitorNumDto.getTags()) { + if (!numMapGroupByTag.containsKey(key)) { + numMapGroupByTag.put(key, new ArrayList<>()); + } + } + for (String key : numMapGroupByTag.keySet()) { + List> groupByTime = getGroupByTime(dmpMonitorNumDto.getStartTime(), dmpMonitorNumDto.getEndTime(), numMapGroupByTag.get(key)); + map.put(key, groupByTime); } return map; } @Override - public Map getDmpImeiLink(DmpMonitorNumDto dmpMonitorNumDto) { - HashMap map = new HashMap<>(); - for (String tag : dmpMonitorNumDto.getTags()) { - List imel = getImeiNum(dmpMonitorNumDto.getStartTime(), dmpMonitorNumDto.getEndTime(), tag); - map.put(tag, imel); - } - return map; + public Map> getDmpImeiLink(DmpMonitorNumDto dmpMonitorNumDto) { + List mapData = getMapData(dmpMonitorNumDto, 2); + HashMap> mapGroupByTag = new HashMap<>(); + mapData.stream().collect(Collectors.groupingBy(DmpMonitorJpaDto::getTag, Collectors.toList())).forEach(mapGroupByTag::put); + return mapGroupByTag; } - private List getImeiNum(Date startDate, Date endDate, String tag) { - List imel = new ArrayList<>(); - - int value = tag.contains(StrPool.UNDERLINE) ? DeliveryPlatformEnum.getValue - (tag.substring(0, tag.indexOf(StrPool.DASHED))) : tag.equalsIgnoreCase(SqlConstant.TABLE_JU_QIAN) ? 1 : 999; - - switch (value) { - case 1: - // 巨量 - imel = getImeiNumJpa(TableEnum.JL.getTableName(), startDate, endDate, tag); - break; - case 2: - // 快手 - imel = getImeiNumJpa(TableEnum.KS.getTableName(), startDate, endDate, tag); - break; - case 3: - // UC - imel = getImeiNumJpa(TableEnum.UC.getTableName(), startDate, endDate, tag); - break; - case 4: - // VIVO - imel = getImeiNumJpa(TableEnum.VIVO.getTableName(), startDate, endDate, tag); - break; - case 5: - //百度 - imel = getImeiNumJpa(TableEnum.BD.getTableName(), startDate, endDate, tag); - break; - default: - break; + private List getMapData(DmpMonitorNumDto dmpMonitorNumDto, Integer flag) { + List jlArray = new ArrayList<>(); + List ksArray = new ArrayList<>(); + List ucArray = new ArrayList<>(); + List vvArray = new ArrayList<>(); + List bdArray = new ArrayList<>(); + List gdArray = new ArrayList<>(); + for (String tag : dmpMonitorNumDto.getTags()) { + int value = tag.contains(StrPool.DASHED) ? DeliveryPlatformEnum.getValue + (tag.substring(0, tag.indexOf(StrPool.DASHED))) : tag.equalsIgnoreCase(SqlConstant.TABLE_JU_QIAN) ? 1 : 999; + switch (value) { + case 1: + jlArray.add(tag); + break; + case 2: + // 快手 + ksArray.add(tag); + break; + case 3: + // UC + ucArray.add(tag); + break; + case 4: + // VIVO + vvArray.add(tag); + break; + case 5: + //百度 + bdArray.add(tag); + break; + case 6: + //广点通 + gdArray.add(tag); + break; + default: + break; + } } - return imel; + Date startTime = dmpMonitorNumDto.getStartTime(); + Date endTime = dmpMonitorNumDto.getEndTime(); + List listAll = new ArrayList<>(); + if (jlArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.JL.getTableName(), startTime, endTime, jlArray, flag)); + } else if (ksArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.KS.getTableName(), startTime, endTime, ksArray, flag)); + } else if (ucArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.UC.getTableName(), startTime, endTime, ucArray, flag)); + } else if (vvArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.VV.getTableName(), startTime, endTime, vvArray, flag)); + } else if (bdArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.BD.getTableName(), startTime, endTime, bdArray, flag)); + } else if (gdArray.size() > 0) { + listAll.addAll(getImeiNumJpa(TableEnum.GD.getTableName(), startTime, endTime, gdArray, flag)); + } + return listAll; } - //按时间分组 - private List> getGroupByTime(Date beginTime, Date endTime, List iemi) { + /** + * 组装数据返回前端,按时间分组 + * + * @param beginTime + * @param endTime + * @param dto + * @return + */ + private List> getGroupByTime(Date beginTime, Date endTime, List dto) { List> list = new ArrayList<>(); int betweenDay = (int) DateUtil.between(beginTime, endTime, DateUnit.DAY); for (int i = 0; i <= betweenDay; i++) { HashMap map = new HashMap<>(); - Date dateTime = DateUtil.offsetDay(beginTime, i); - List collect = iemi.stream().filter(c -> betweenByDay(dateTime, c.getGmtCreate())).collect(Collectors.toList()); - map.put("date", dateTime); - map.put("num", collect.size()); - list.add(map); + String dateTime = DateUtil.format(DateUtil.offsetDay(beginTime, i), "yyyy-MM-dd"); + if (dto.size() > 0) { + List collect = dto.stream().filter(c -> DateUtil.between(DateUtil.parseDate(dateTime), DateUtil.parseDate(c.getGmtCreate()), DateUnit.DAY) == 0).collect(Collectors.toList()); + if (collect.size() > 0) { + DmpMonitorJpaDto dmpMonitorJpaDto = collect.get(0); + map.put("date", dateTime); + map.put("num", dmpMonitorJpaDto.getNum()); + } else { + map.put("date", dateTime); + map.put("num", 0); + } + list.add(map); + } else { + map.put("date", dateTime); + map.put("num", 0); + list.add(map); + } } - return list; } - private static Boolean betweenByDay(Date begin, Date end) { - begin = DateUtil.parse(DateUtil.format(begin, "yyyy-MM-dd")); - end = DateUtil.parse(DateUtil.format(end, "yyyy-MM-dd")); - long between = DateUtil.between(begin, end, DateUnit.DAY); - return between == 0; - } - @Transactional(rollbackFor = Exception.class) - public List getImeiNumJpa(String tableName, Date startDate, Date endDate, String tag) { - StringBuilder sql = new StringBuilder(); - sql.append("select DISTINCT tb.gmt_create as gmtCreate ,tb.imei as imei from " + tableName + " as tb where 1=1"); - sql.append(" and tb.imei != :imei1 "); - sql.append(" and tb.imei != :imei2 "); - sql.append(" and tb.gmt_create >= :startDate "); - sql.append(" and tb.gmt_create <= :endDate "); - sql.append(" and tb.tag = :tag "); - Query query = entityManager.createNativeQuery(sql.toString()); + public List getImeiNumJpa(String tableName, Date startDate, Date endDate, List tags, Integer flag) { + String sql = getSqlString(tableName, flag); + Query query = entityManager.createNativeQuery(sql); query.setParameter("imei1", ""); query.setParameter("imei2", "__IMEI__"); query.setParameter("startDate", startDate); query.setParameter("endDate", endDate); - query.setParameter("tag", tag); + query.setParameter("tag", tags); query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = query.getResultList(); - return getDmpMonitorJpaDto(list); + return getDmpMonitorJpaDto(list, flag); + } + + private String getSqlString(String tableName, Integer flag) { + StringBuilder sql = new StringBuilder(); + if (1 == flag) { + sql.append(" select a.tag,a.date as date ,COUNT(*) as num FROM ( SELECT DISTINCT(tb.imei),tb.tag ,DATE_FORMAT( tb.gmt_create, '%Y-%m-%d' ) AS date FROM ").append(tableName).append(" as tb where "); + sql.append(" tb.imei != :imei1 "); + sql.append(" and tb.imei != :imei2 "); + sql.append(" and tb.gmt_create >= :startDate "); + sql.append(" and tb.gmt_create < :endDate "); + sql.append(" and tb.tag in :tag "); + sql.append(" ) a group by a.tag,a.date"); + } else { + sql.append("select DISTINCT DATE_FORMAT( tb.gmt_create, '%Y-%m-%d' ) as date ,tb.imei as imei ,tb.tag as tag from ").append(tableName).append(" as tb where"); + sql.append(" tb.imei != :imei1 "); + sql.append(" and tb.imei != :imei2 "); + sql.append(" and tb.gmt_create >= :startDate "); + sql.append(" and tb.gmt_create < :endDate "); + sql.append(" and tb.tag in :tag "); + } + return sql.toString(); } - private List getDmpMonitorJpaDto(List list) { + private List getDmpMonitorJpaDto(List list, Integer flag) { List tradeList = new ArrayList<>(); for (Object obj : list) { Map row = (Map) obj; DmpMonitorJpaDto trade = new DmpMonitorJpaDto(); - trade.setImei((String) row.get("imei")); - trade.setGmtCreate((Date) row.get("gmtCreate")); + if (1 == flag) { + BigInteger num = (BigInteger) row.get("num"); + trade.setNum(num.longValue()); + } else { + trade.setImei(row.get("imei").toString()); + } + trade.setGmtCreate(row.get("date").toString()); + trade.setTag(row.get("tag").toString()); tradeList.add(trade); } return tradeList; diff --git a/src/main/java/com/baiyee/adcallback/service/impl/GenerateServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/GenerateServiceImpl.java index 0ae075d..9e8f6cf 100644 --- a/src/main/java/com/baiyee/adcallback/service/impl/GenerateServiceImpl.java +++ b/src/main/java/com/baiyee/adcallback/service/impl/GenerateServiceImpl.java @@ -1,5 +1,6 @@ package com.baiyee.adcallback.service.impl; +import com.baiyee.adcallback.api.constants.TagTypeConstant; import com.baiyee.adcallback.service.GenerateService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -15,7 +16,7 @@ public class GenerateServiceImpl implements GenerateService { /** * * @param tag - * @param type 0:巨量 1:百度 2:快手 3:UC 4:VIVO + * @param type 0:巨量 1:百度 2:快手 3:UC 4:VIVO 5:广点通 * @return */ @Override @@ -24,17 +25,29 @@ public class GenerateServiceImpl implements GenerateService { String JL = "/api/jl/monitor?aid=__AID__&cid=__CID__&ctype=__CTYPE__&csite=__CSITE__&imei=__IMEI__&idfa=__IDFA__&oaid=__OAID__&os=__OS__&mac=__MAC__&mac1=__MAC1__&ip=__IP__&geo=__GEO__&TIMESTAMP=__TS__&callback_url=__CALLBACK_URL__&model=__MODEL__&caid1=__CAID1__&tag="; String BD = "/api/bd/monitor?userid=__USER_ID__&aid=__IDEA_ID__&pid=__PLAN_ID__&uid=__UNIT_ID__&callback_url=__CALLBACK_URL__&click_id=__CLICK_ID__&idfa=__IDFA__&imei_md5=__IMEI__&oaid=__OAID__&mac=__MAC__&ip=__IP__&os=__OS__&ts=__TS__&device_info=__DEVICE_INFO__&tag="; String UC = "/api/uc/monitor?imei={IMEI_SUM1}&oaid={OAID}&time={TS}&callback={CALLBACK_URL}&androidid={ANDROIDID_SUM1}&mac={MAC_SUM2}&ip={IP}&ua={UA}&acid={ACID}&gid={GID}&aid={AID}&cid={CID}&tag="; + String GDT = "/api/gdt/monitor?click_id=__CLICK__ID__&click_time=__CLICK__TIME__&impression_time=__IMPRESSION__TIME__&campaign_id=__CAMPAIGN__ID__&adgroup_id=__ADGROUP__ID__&ad_id=__AD__ID__&ad_platform_type=__AD__PLATFORM__TYPE__&ad_type=__AD__TYPE__&account_id=__ACCOUNT__ID__&agency_id=__AGENCY__ID__&click_sku_id=__CLICK__SKU__ID__&billing_event=__BILLING__EVENT__&deeplink_url=__DEEPLINK__URL__&universal_link=__UNIVERSAL__LINK__&page_url=__PAGE__URL__&device_os_type=__DEVICE__OS__TYPE__&process_time=__PROCESS__TIME__&promoted_object_id=__PROMOTED__OBJECT__ID__&promoted_object_type=__PROMOTED__OBJECT__TYPE__&real_cost=__REAL__COST__&request_id=__REQUEST__ID__&impression_id=__IMPRESSION__ID__&muid=__MUID__&hash_android_id=__HASH__ANDROID__ID__&ip=__IP__&user_agent=__USER__AGENT__&callback=__CALLBACK__&encrypted_position_id=__ENCRYPTED__POSITION__ID__&hash_oaid=__HASH__OAID__&caid=__CAID__&adgroup_name=__ADGROUP__NAME__&site_set_name=__SITE__SET__NAME__&campaign_name=__CAMPAIGN__NAME__&ad_name=__AD__NAME__&model=__MODEL__&tag="; + String KS = "/api/ks/monitor?&accountid=__ACCOUNTID__&aid=__AID__&cid=__CID__&did=__DID__&dname=__DNAME__&imeiMD5=__IMEI2__&oaid=__OAID__&mac=__MAC2__&androidid=__ANDROIDID2__&os=__OS__&ts=__TS__&ip=__IP__&ua=__UA__&csite=__CSITE__&model=__MODEL__&ac_creative=__AC_CREATIVE__&tag="; + String VIVO = "/api/vivo/monitor?os=__OS__&ip=__IP__&oaid=__OAID__&oaidplain=__OAIDPLAIN__&ua=__UA__&androidid=__ANDROIDID__&location=__LOCATION__&requestid=__REQUESTID__&requesttime=__REQUESTTIME__&advertiserid=__ADVERTISERID__&adname=__ADNAME__&creativeid=__CREATIVEID__&osversion=__OSVERSION__&model=__MODEL__&lang=__LANG__&resolution=__RESOLUTION__&nettype=__NETTYPE__&ts=__TS__&tag="; String generateDmp; switch (type){ - case 0: + case TagTypeConstant.JL: generateDmp = URL + JL + replaceTag; break; - case 1: + case TagTypeConstant.BD: generateDmp = URL + BD +replaceTag; break; - case 3: + case TagTypeConstant.KS: + generateDmp = URL + KS +replaceTag; + break; + case TagTypeConstant.UC: generateDmp = URL + UC + replaceTag; break; + case TagTypeConstant.VIVO: + generateDmp = URL + VIVO + replaceTag; + break; + case TagTypeConstant.GDT: + generateDmp = URL + GDT + replaceTag; + break; default: generateDmp = null; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0768d42..f22d935 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,7 +4,7 @@ spring: application: name: ad-callback profiles: - active: prod + active: dev jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss