@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal ;
import java.math.RoundingMode ;
import java.sql.Timestamp ;
import java.text.DecimalFormat ;
import java.text.SimpleDateFormat ;
import java.time.* ;
import java.time.format.DateTimeFormatter ;
@ -239,6 +240,9 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
} else if ( modelId = = 103 ) { // 103号模型:接处警速度超过30分钟的异常数据
getModelCluesForModel103 ( sql , modelClues ) ;
return modelClues ;
} else if ( modelId = = 104 ) { // 模型104:大量变更接警性质的预警模型
getModelCluesForModel104 ( sql , modelClues ) ;
return modelClues ;
} else {
System . out . println ( "模型" + modelId + "开始查询数据库" ) ;
modelClues = modelClueDataMapper . selectDataByDynamicSql ( sql ) ;
@ -247,7 +251,7 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
List < String > uniqueKeys = modelClues . stream ( ) . map ( ModelClue : : getUniqueKey ) . filter ( k - > k ! = null & & ! k . isEmpty ( ) ) . toList ( ) ;
List < String > oldUniqueKeys = new ArrayList < > ( ) ;
// 无需更新状态的模型
if ( modelId ! = 19 & & modelId ! = 26 & & modelId ! = 27 & & modelId ! = 28 & & modelId ! = 30 & & modelId ! = 100 & & modelId ! = 103 ) {
if ( modelId ! = 19 & & modelId ! = 26 & & modelId ! = 27 & & modelId ! = 28 & & modelId ! = 30 & & modelId ! = 100 ) {
oldUniqueKeys = this . listObjs ( new LambdaQueryWrapper < ModelClue > ( ) . select ( ModelClue : : getUniqueKey ) . ne ( ModelClue : : getDistributionState , "2" ) . eq ( ModelClue : : getModelId , modelId ) , String : : valueOf ) ;
List < String > changeStatusIds = oldUniqueKeys . stream ( ) . filter ( item - > ! uniqueKeys . contains ( item ) ) . toList ( ) ;
if ( ! changeStatusIds . isEmpty ( ) ) {
@ -1041,6 +1045,74 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
}
}
private void getModelCluesForModel104 ( String param , List < ModelClue > modelClues ) {
System . out . println ( "模型104开始查询数据库" ) ;
List < String > params = parseSqlForModel2 ( param ) ;
String sql = "SELECT gxdwdm, gxdwmc, COUNT(*) AS zjjs from dwd_asj_zhtx_jjd where bjsj BETWEEN '" + params . get ( 0 ) + " 00:00:00' AND '" + params . get ( 1 ) + " 00:00:00' AND jqjb != '04' AND (ysjqxzdm LIKE '01%' OR ysjqxzdm LIKE'02%' OR ysjqxzdm LIKE'06%') AND (bjxldm NOT LIKE '01%' AND bjxldm NOT LIKE '02%' AND bjxldm NOT LIKE '06%') GROUP BY gxdwdm, gxdwmc;" ;
List < Map < String , Object > > jjdmaps = modelClueDataMapper . selectByUniqueKeys ( sql ) ;
System . out . println ( "模型104查询数据库完毕" ) ;
if ( jjdmaps . isEmpty ( ) ) {
return ;
}
List < ModelClue > jjdModelClues = new ArrayList < > ( ) ;
for ( Map < String , Object > data : jjdmaps ) {
SupExternalDepart supExternalDepart = supExternalDepartMapper . selectOne ( new LambdaQueryWrapper < SupExternalDepart > ( ) . eq ( SupExternalDepart : : getExternalId , data . get ( "gxdwdm" ) ) . last ( "LIMIT 1" ) ) ;
if ( supExternalDepart ! = null & & supExternalDepart . getExternalId ( ) ! = null & & supExternalDepart . getExternalName ( ) ! = null & & supExternalDepart . getInternalId ( ) ! = null & & supExternalDepart . getLevel ( ) ! = null & & supExternalDepart . getPid ( ) ! = null ) {
ModelClue modelClue = new ModelClue ( ) ;
modelClue . setData ( JSONObject . toJSONString ( data ) ) ;
modelClue . setInvolveDepartId ( supExternalDepart . getExternalId ( ) ) ;
modelClue . setInvolveDepartName ( supExternalDepart . getExternalName ( ) ) ;
modelClue . setZjjs ( ( Long ) data . get ( "zjjs" ) ) ;
modelClue . setDepartLevel ( supExternalDepart . getLevel ( ) ) ;
modelClue . setParentId ( supExternalDepart . getPid ( ) ) ;
modelClue . setThisId ( supExternalDepart . getInternalId ( ) ) ;
jjdModelClues . add ( modelClue ) ;
}
}
List < ModelClue > jjdModelClues3 = new ArrayList < > ( jjdModelClues . stream ( ) . filter ( clue - > clue . getDepartLevel ( ) = = 3 ) . toList ( ) ) ;
List < ModelClue > jjdModelClues4 = new ArrayList < > ( jjdModelClues . stream ( ) . filter ( clue - > clue . getDepartLevel ( ) = = 4 ) . toList ( ) ) ;
List < ModelClue > jjdModelClues5 = new ArrayList < > ( jjdModelClues . stream ( ) . filter ( clue - > clue . getDepartLevel ( ) = = 5 ) . toList ( ) ) ;
mergeModelClues ( jjdModelClues5 , jjdModelClues4 , 1 ) ;
mergeModelClues ( jjdModelClues4 , jjdModelClues3 , 1 ) ;
BigDecimal zjjsTotal = BigDecimal . valueOf ( jjdModelClues3 . stream ( ) . mapToLong ( ModelClue : : getZjjs ) . sum ( ) ) ;
Map < String , BigDecimal > departPercentageMap = new HashMap < > ( ) ;
Map < String , Long > departNumMap = new HashMap < > ( ) ;
for ( ModelClue jjdModelClue : jjdModelClues3 ) {
BigDecimal percentage = BigDecimal . valueOf ( jjdModelClue . getZjjs ( ) ) . divide ( zjjsTotal , 3 , RoundingMode . HALF_UP ) ;
departPercentageMap . put ( jjdModelClue . getInvolveDepartId ( ) , percentage ) ;
departNumMap . put ( jjdModelClue . getInvolveDepartId ( ) , jjdModelClue . getZjjs ( ) ) ;
}
BigDecimal sumOfPercentages = departPercentageMap . values ( ) . stream ( )
. reduce ( BigDecimal . ZERO , BigDecimal : : add ) ;
BigDecimal avgPercentage = sumOfPercentages . divide ( BigDecimal . valueOf ( departPercentageMap . size ( ) ) , 3 , RoundingMode . HALF_UP ) ;
List < String > highPercentageDepartments = departPercentageMap . entrySet ( ) . stream ( )
. filter ( entry - > entry . getValue ( ) . compareTo ( avgPercentage . multiply ( new BigDecimal ( "1.5" ) ) ) < 0 )
. map ( Map . Entry : : getKey )
. toList ( ) ;
for ( String department : highPercentageDepartments ) {
ModelClue newModelClue = new ModelClue ( ) ;
newModelClue . setUniqueKey ( department ) ;
newModelClue . setNegativeIdEx ( department ) ;
SupExternalDepart supExternalDepart = supExternalDepartMapper . selectOne ( new LambdaQueryWrapper < SupExternalDepart > ( ) . eq ( SupExternalDepart : : getExternalId , department ) . last ( "LIMIT 1" ) ) ;
if ( supExternalDepart ! = null ) {
if ( supExternalDepart . getInternalId ( ) ! = null ) {
newModelClue . setInvolveDepartId ( supExternalDepart . getInternalId ( ) ) ;
}
if ( supExternalDepart . getInternalShortName ( ) ! = null ) {
newModelClue . setInvolveDepartName ( supExternalDepart . getInternalShortName ( ) ) ;
}
}
newModelClue . setDistributionState ( "0" ) ;
newModelClue . setThingDesc ( "发现" + newModelClue . getInvolveDepartName ( )
+ "在" + getDateString ( params . get ( 0 ) ) + "到" + getDateString ( params . get ( 1 ) )
+ "之间变更了" + departNumMap . get ( department ) + "个警情的结警性质,占全市的"
+ convertToPercentString ( departPercentageMap . get ( department ) ) + ",超过了全市单位平均值("
+ convertToPercentString ( avgPercentage ) + ")的50%以上,存在大量变更接警性质的异常情况。" ) ;
newModelClue . setData ( newModelClue . getThingDesc ( ) ) ;
modelClues . add ( newModelClue ) ;
}
}
private void mergeModelClues ( List < ModelClue > modelClues2 , List < ModelClue > modelClues1 , int no ) {
for ( ModelClue modelClue2 : modelClues2 ) {
Iterator < ModelClue > iterator1 = modelClues1 . iterator ( ) ;
@ -1378,4 +1450,9 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
}
return jqxz ;
}
public static String convertToPercentString ( BigDecimal value ) {
DecimalFormat decimalFormat = new DecimalFormat ( "0.0" ) ;
return decimalFormat . format ( value . multiply ( new BigDecimal ( "100" ) ) ) + "%" ;
}
}