From e4515af549c8fdfad479f3dc632b7d33a807476d Mon Sep 17 00:00:00 2001 From: wujingtao Date: Wed, 2 Mar 2022 10:20:54 +0800 Subject: [PATCH] =?UTF-8?q?DMP=E7=9B=91=E6=B5=8B=E8=8E=B7=E5=8F=96imei?= =?UTF-8?q?=E6=95=B0=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DmpMonitorNumController.java | 32 +++++ .../adcallback/api/dto/DmpMonitorJpaDto.java | 16 +++ .../adcallback/api/dto/DmpMonitorNumDto.java | 23 +++ .../service/DmpMonitorNumService.java | 15 ++ .../impl/DmpMonitorNumServiceImpl.java | 135 ++++++++++++++++++ 5 files changed, 221 insertions(+) create mode 100644 src/main/java/com/baiyee/adcallback/api/controller/DmpMonitorNumController.java create mode 100644 src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java create mode 100644 src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorNumDto.java create mode 100644 src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java create mode 100644 src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java diff --git a/src/main/java/com/baiyee/adcallback/api/controller/DmpMonitorNumController.java b/src/main/java/com/baiyee/adcallback/api/controller/DmpMonitorNumController.java new file mode 100644 index 0000000..a4afa2b --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/controller/DmpMonitorNumController.java @@ -0,0 +1,32 @@ +package com.baiyee.adcallback.api.controller; + +import com.baiyee.adcallback.api.dto.DmpMonitorNumDto; +import com.baiyee.adcallback.service.DmpMonitorNumService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author wujingtao + * @date 2022/03/01 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/dmp") +public class DmpMonitorNumController { + private final DmpMonitorNumService dmpMonitorNumService; + + @PostMapping(value = "/imeiNumber") + public ResponseEntity getDmpNumByTags(@RequestBody DmpMonitorNumDto dmpMonitorNumDto) { + return new ResponseEntity<>(dmpMonitorNumService.queryNumByTags(dmpMonitorNumDto), HttpStatus.OK); + } + + @PostMapping(value = "/imeiLink") + public ResponseEntity getDmpImeiLink(@RequestBody DmpMonitorNumDto dmpMonitorNumDto) { + return new ResponseEntity<>(dmpMonitorNumService.getDmpImeiLink(dmpMonitorNumDto), HttpStatus.OK); + } +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java new file mode 100644 index 0000000..5283381 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorJpaDto.java @@ -0,0 +1,16 @@ +package com.baiyee.adcallback.api.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * @author wujingtao + * @date 2022/03/01 + */ +@Data +public class DmpMonitorJpaDto { + + private String imei; + private Date gmtCreate; +} diff --git a/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorNumDto.java b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorNumDto.java new file mode 100644 index 0000000..15e33d8 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/api/dto/DmpMonitorNumDto.java @@ -0,0 +1,23 @@ +package com.baiyee.adcallback.api.dto; + +import com.sun.istack.NotNull; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * @author wujingtao + * @date 2022/03/01 + */ +@Data +public class DmpMonitorNumDto { + @NotNull + private Date startTime; + @NotNull + private Date endTime; + @NotNull + private List tags; + + private String mail; +} diff --git a/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java b/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java new file mode 100644 index 0000000..4174ae3 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/DmpMonitorNumService.java @@ -0,0 +1,15 @@ +package com.baiyee.adcallback.service; + +import com.baiyee.adcallback.api.dto.DmpMonitorNumDto; + +import java.util.Map; + +/** + * @author wujingtao + * @date 2022/03/01 + */ +public interface DmpMonitorNumService { + Map queryNumByTags(DmpMonitorNumDto dmpMonitorNumDto); + + Map getDmpImeiLink(DmpMonitorNumDto dmpMonitorNumDto); +} diff --git a/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java b/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java new file mode 100644 index 0000000..8b4bb83 --- /dev/null +++ b/src/main/java/com/baiyee/adcallback/service/impl/DmpMonitorNumServiceImpl.java @@ -0,0 +1,135 @@ +package com.baiyee.adcallback.service.impl; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import com.baiyee.adcallback.api.dto.DmpMonitorJpaDto; +import com.baiyee.adcallback.api.dto.DmpMonitorNumDto; +import com.baiyee.adcallback.service.DmpMonitorNumService; +import lombok.RequiredArgsConstructor; +import org.hibernate.query.internal.NativeQueryImpl; +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author wujingtao + * @date 2022/03/01 + */ +@Service +@RequiredArgsConstructor +public class DmpMonitorNumServiceImpl implements DmpMonitorNumService { + + @PersistenceContext + EntityManager entityManager; + + @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); + } + 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); + List list = imel.stream().map(DmpMonitorJpaDto::getImei).collect(Collectors.toList()); + map.put(tag, list); + } + return map; + } + + private List getImeiNum(Date startDate, Date endDate, String tag) { + List imel = new ArrayList<>(); + String tagName = tag.split("-").length > 0 ? tag.split("-")[0] : null; + if (tagName == null) { + return imel; + } + switch (tagName) { + case "jl": + imel = getImeiNumJpa("tb_jl_backdata", startDate, endDate, tag); + break; + case "bd": + imel = getImeiNumJpa("tb_bd_backdata", startDate, endDate, tag); + break; + case "ks": + imel = getImeiNumJpa("tb_ks_backdata", startDate, endDate, tag); + break; + case "uc": + imel = getImeiNumJpa("tb_uc_backdata", startDate, endDate, tag); + break; + default: + break; + } + return imel; + } + + //按时间分组 + private List> getGroupByTime(Date beginTime, Date endTime, List iemi) { + 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); + } + + 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); + if (between == 0) { + return true; + } + return false; + } + + @Transactional(rollbackFor = Exception.class) + public List getImeiNumJpa(String tableName, Date startDate, Date endDate, String tag) { + StringBuilder sql = new StringBuilder(); + sql.append("select 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()); + query.setParameter("imei1", ""); + query.setParameter("imei2", "__IMEI__"); + query.setParameter("startDate", startDate); + query.setParameter("endDate", endDate); + query.setParameter("tag", tag); + query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); + List list = query.getResultList(); + return getDmpMonitorJpaDto(list); + } + + private List getDmpMonitorJpaDto(List list) { + 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")); + tradeList.add(trade); + } + return tradeList; + } +}