diff --git a/src/main/java/com/biutag/supervision/service/ModelClueService.java b/src/main/java/com/biutag/supervision/service/ModelClueService.java index 855e690..31b20f6 100644 --- a/src/main/java/com/biutag/supervision/service/ModelClueService.java +++ b/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.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 { } 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 { List uniqueKeys = modelClues.stream().map(ModelClue::getUniqueKey).filter(k -> k != null && !k.isEmpty()).toList(); List 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().select(ModelClue::getUniqueKey).ne(ModelClue::getDistributionState, "2").eq(ModelClue::getModelId, modelId), String::valueOf); List changeStatusIds = oldUniqueKeys.stream().filter(item -> !uniqueKeys.contains(item)).toList(); if (!changeStatusIds.isEmpty()) { @@ -1041,6 +1045,74 @@ public class ModelClueService extends ServiceImpl { } } + private void getModelCluesForModel104(String param, List modelClues) { + System.out.println("模型104开始查询数据库"); + List 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> jjdmaps = modelClueDataMapper.selectByUniqueKeys(sql); + System.out.println("模型104查询数据库完毕"); + if (jjdmaps.isEmpty()) { + return; + } + List jjdModelClues = new ArrayList<>(); + for (Map data : jjdmaps) { + SupExternalDepart supExternalDepart = supExternalDepartMapper.selectOne(new LambdaQueryWrapper().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 jjdModelClues3 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 3).toList()); + List jjdModelClues4 = new ArrayList<>(jjdModelClues.stream().filter(clue -> clue.getDepartLevel() == 4).toList()); + List 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 departPercentageMap = new HashMap<>(); + Map 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 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().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 modelClues2, List modelClues1 , int no) { for (ModelClue modelClue2 : modelClues2) { Iterator iterator1 = modelClues1.iterator(); @@ -1378,4 +1450,9 @@ public class ModelClueService extends ServiceImpl { } return jqxz; } + + public static String convertToPercentString(BigDecimal value) { + DecimalFormat decimalFormat = new DecimalFormat("0.0"); + return decimalFormat.format(value.multiply(new BigDecimal("100"))) + "%"; + } }