Browse Source

新增104号模型:大量变更接警性质的预警模型

main
sjh 1 year ago
parent
commit
79a73895fb
  1. 79
      src/main/java/com/biutag/supervision/service/ModelClueService.java

79
src/main/java/com/biutag/supervision/service/ModelClueService.java

@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -239,6 +240,9 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
} else if (modelId == 103) { // 103号模型:接处警速度超过30分钟的异常数据 } else if (modelId == 103) { // 103号模型:接处警速度超过30分钟的异常数据
getModelCluesForModel103(sql, modelClues); getModelCluesForModel103(sql, modelClues);
return modelClues; return modelClues;
} else if (modelId == 104) { // 模型104:大量变更接警性质的预警模型
getModelCluesForModel104(sql, modelClues);
return modelClues;
} else { } else {
System.out.println("模型" + modelId + "开始查询数据库"); System.out.println("模型" + modelId + "开始查询数据库");
modelClues = modelClueDataMapper.selectDataByDynamicSql(sql); 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> uniqueKeys = modelClues.stream().map(ModelClue::getUniqueKey).filter(k -> k != null && !k.isEmpty()).toList();
List<String> oldUniqueKeys = new ArrayList<>(); 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); 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(); List<String> changeStatusIds = oldUniqueKeys.stream().filter(item -> !uniqueKeys.contains(item)).toList();
if (!changeStatusIds.isEmpty()) { 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) { private void mergeModelClues(List<ModelClue> modelClues2, List<ModelClue> modelClues1 , int no) {
for (ModelClue modelClue2 : modelClues2) { for (ModelClue modelClue2 : modelClues2) {
Iterator<ModelClue> iterator1 = modelClues1.iterator(); Iterator<ModelClue> iterator1 = modelClues1.iterator();
@ -1378,4 +1450,9 @@ public class ModelClueService extends ServiceImpl<ModelClueMapper, ModelClue> {
} }
return jqxz; return jqxz;
} }
public static String convertToPercentString(BigDecimal value) {
DecimalFormat decimalFormat = new DecimalFormat("0.0");
return decimalFormat.format(value.multiply(new BigDecimal("100"))) + "%";
}
} }

Loading…
Cancel
Save