@ -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 < String , Object > queryNumByTags ( DmpMonitorNumDto dmpMonitorNumDto ) {
HashMap < String , Object > map = new HashMap < > ( ) ;
for ( String tag : dmpMonitorNumDto . getTags ( ) ) {
List < DmpMonitorJpaDto > imel = getImeiNum ( dmpMonitorNumDto . getStartTime ( ) , dmpMonitorNumDto . getEndTime ( ) , tag ) ;
List < HashMap < String , Object > > groupByTime = getGroupByTime ( dmpMonitorNumDto . getStartTime ( ) , dmpMonitorNumDto . getEndTime ( ) , imel ) ;
map . put ( tag , groupByTime ) ;
List < DmpMonitorJpaDto > mapData = getMapData ( dmpMonitorNumDto , 1 ) ;
HashMap < String , List < DmpMonitorJpaDto > > 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 < HashMap < String , Object > > groupByTime = getGroupByTime ( dmpMonitorNumDto . getStartTime ( ) , dmpMonitorNumDto . getEndTime ( ) , numMapGroupByTag . get ( key ) ) ;
map . put ( key , groupByTime ) ;
}
return map ;
}
@Override
public Map < String , Object > getDmpImeiLink ( DmpMonitorNumDto dmpMonitorNumDto ) {
HashMap < String , Object > map = new HashMap < > ( ) ;
for ( String tag : dmpMonitorNumDto . getTags ( ) ) {
List < DmpMonitorJpaDto > imel = getImeiNum ( dmpMonitorNumDto . getStartTime ( ) , dmpMonitorNumDto . getEndTime ( ) , tag ) ;
map . put ( tag , imel ) ;
}
return map ;
public Map < String , List < DmpMonitorJpaDto > > getDmpImeiLink ( DmpMonitorNumDto dmpMonitorNumDto ) {
List < DmpMonitorJpaDto > mapData = getMapData ( dmpMonitorNumDto , 2 ) ;
HashMap < String , List < DmpMonitorJpaDto > > mapGroupByTag = new HashMap < > ( ) ;
mapData . stream ( ) . collect ( Collectors . groupingBy ( DmpMonitorJpaDto : : getTag , Collectors . toList ( ) ) ) . forEach ( mapGroupByTag : : put ) ;
return mapGroupByTag ;
}
private List < DmpMonitorJpaDto > getImeiNum ( Date startDate , Date endDate , String tag ) {
List < DmpMonitorJpaDto > 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 < DmpMonitorJpaDto > getMapData ( DmpMonitorNumDto dmpMonitorNumDto , Integer flag ) {
List < String > jlArray = new ArrayList < > ( ) ;
List < String > ksArray = new ArrayList < > ( ) ;
List < String > ucArray = new ArrayList < > ( ) ;
List < String > vvArray = new ArrayList < > ( ) ;
List < String > bdArray = new ArrayList < > ( ) ;
List < String > 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 < DmpMonitorJpaDto > 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 < HashMap < String , Object > > getGroupByTime ( Date beginTime , Date endTime , List < DmpMonitorJpaDto > iemi ) {
/ * *
* 组 装 数 据 返 回 前 端 , 按 时 间 分 组
*
* @param beginTime
* @param endTime
* @param dto
* @return
* /
private List < HashMap < String , Object > > getGroupByTime ( Date beginTime , Date endTime , List < DmpMonitorJpaDto > dto ) {
List < HashMap < String , Object > > list = new ArrayList < > ( ) ;
int betweenDay = ( int ) DateUtil . between ( beginTime , endTime , DateUnit . DAY ) ;
for ( int i = 0 ; i < = betweenDay ; i + + ) {
HashMap < String , Object > map = new HashMap < > ( ) ;
Date dateTime = DateUtil . offsetDay ( beginTime , i ) ;
List < DmpMonitorJpaDto > 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 < DmpMonitorJpaDto > 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 < DmpMonitorJpaDto > 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 < DmpMonitorJpaDto > getImeiNumJpa ( String tableName , Date startDate , Date endDate , List < String > 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 < DmpMonitorJpaDto > getDmpMonitorJpaDto ( List list ) {
private List < DmpMonitorJpaDto > getDmpMonitorJpaDto ( List list , Integer flag ) {
List < DmpMonitorJpaDto > 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 ;