From e9bba5e1c28f1fe31f86ba0462c880959b96f950 Mon Sep 17 00:00:00 2001 From: wxc <191104855@qq.com> Date: Tue, 28 Oct 2025 11:43:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=A8=A1=E5=9E=8B=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/mine/AlarmNotificationMapper.java | 12 ++ .../pojo/entity/mine/AlarmNotification.java | 155 ++++++++++++++++++ .../pojo/entity/mine/Model.java | 2 +- .../service/impl/ModelClueServiceImpl.java | 153 ++++++++++++++--- .../supervisiondata/task/TaskService.java | 24 ++- 5 files changed, 314 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/biutag/supervisiondata/mapper/mine/AlarmNotificationMapper.java create mode 100644 src/main/java/com/biutag/supervisiondata/pojo/entity/mine/AlarmNotification.java diff --git a/src/main/java/com/biutag/supervisiondata/mapper/mine/AlarmNotificationMapper.java b/src/main/java/com/biutag/supervisiondata/mapper/mine/AlarmNotificationMapper.java new file mode 100644 index 0000000..f6487ee --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/mapper/mine/AlarmNotificationMapper.java @@ -0,0 +1,12 @@ +package com.biutag.supervisiondata.mapper.mine; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.biutag.supervisiondata.pojo.entity.mine.AlarmNotification; + +/** + * @author wxc + * @date 2025/10/22 + */ +public interface AlarmNotificationMapper extends BaseMapper { + +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/AlarmNotification.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/AlarmNotification.java new file mode 100644 index 0000000..59241e4 --- /dev/null +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/AlarmNotification.java @@ -0,0 +1,155 @@ +package com.biutag.supervisiondata.pojo.entity.mine; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 预警通知 + * @author kami on 2024-11-16 10:51:18 + * @version 0.0.1 + * @since 1.8 + */ +@Data +@TableName("`alarm_notification`") +public class AlarmNotification implements Serializable { + + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 预警时间 + */ + @TableField("`alarm_time`") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm" , timezone = "GMT+8") + LocalDateTime alarmTime; + + @TableField("`alarm_type_id`") + Long alarmTypeId; + /** + * 预警类型 + */ + @TableField("`alarm_type`") + String alarmType; + + /** + * 被通知单位ID + */ + @TableField("`notification_depart_id`") + String notificationDepartId; + + /** + * 被通知单位机构名称 + */ + @TableField("`notification_depart_name`") + String notificationDepartName; + + /** + * 通知内容 + */ + @TableField("`alarm_content`") + String alarmContent; + + /** + * 回复状态0未回复1已回复 + */ + @TableField("`reply_state`") + Integer replyState; + + /** + * 回复情况内容 + */ + @TableField("`reply_result_content`") + String replyResultContent; + /** + * 线索id + */ + @TableField("`clue_id`") + Integer clueId; + /** + * 民警证件号 + */ + String policeIdCode; + /** + * 民警姓名 + */ + String policeName; + /** + * 警号 + */ + String policeNo; + + /** + * 创建时间 + */ + @TableField("`crt_time`") + LocalDateTime crtTime; + /** + * 创建用户 + */ + @TableField("`crt_user`") + String crtUser; + /** + * 创建单位 + */ + @TableField("`crt_depart_id`") + String crtDepartId; + /** + * 创建人名称 + */ + @TableField("`crt_name`") + String crtName; + /** + * 创建ip + */ + @TableField("`crt_host`") + String crtHost; + + /** + * 创建用户 + */ + @TableField("`upd_user`") + String updUser; + /** + * 创建单位 + */ + @TableField("`upd_depart_id`") + String updDepartId; + /** + * 创建人名称 + */ + @TableField("`upd_name`") + String updName; + /** + * 创建ip + */ + @TableField("`upd_host`") + String updHost; + + /** + * 修改时间 + */ + @TableField("`upd_time`") + LocalDateTime updTime; + + Integer del; + + // 是否要求回复 + private Boolean requestReply; + + // 通知回复时限 + private Integer replyLimit; + + private Integer modelId; + + +} diff --git a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/Model.java b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/Model.java index 73a4614..0a52350 100644 --- a/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/Model.java +++ b/src/main/java/com/biutag/supervisiondata/pojo/entity/mine/Model.java @@ -86,7 +86,7 @@ public class Model { // 建模方式 private String modelingMethod; - // 模型数据类型 + // 预警类型 private String modelDataType; @TableField("model_sql") diff --git a/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java b/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java index dcda181..b49e2c9 100644 --- a/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java +++ b/src/main/java/com/biutag/supervisiondata/service/impl/ModelClueServiceImpl.java @@ -1,5 +1,7 @@ package com.biutag.supervisiondata.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -8,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.biutag.supervisiondata.mapper.dwd.ModelClueDataMapper; +import com.biutag.supervisiondata.mapper.mine.AlarmNotificationMapper; import com.biutag.supervisiondata.mapper.mine.ModelClueMapper; import com.biutag.supervisiondata.mapper.wdpc2.ModelClueWdpc2Mapper; import com.biutag.supervisiondata.pojo.entity.mine.*; @@ -59,41 +62,135 @@ public class ModelClueServiceImpl implements ModelClueService { private final ModelClueDataDMRepository modelClueDataDMRepository; + private final AlarmNotificationMapper alarmNotificationMapper; + + private final SupDepartRepository departRepository; + public void generate(Integer modelId) { if (modelId == 1300) { updateDepart(); return; } - Model model = modelRepository.getById(modelId); - List modelClues = new ArrayList<>(); - if (!Objects.isNull(model) && model.getModelingMethod().equals("2")) { - modelClues.addAll(getModelClueBySql("customModel", modelId, model)); - } else if (!Objects.isNull(model) && model.getModelSql() != null) { - modelClues.addAll(getModelClueBySql(model.getModelSql(), modelId, null)); - } - System.out.println("模型结果1数量:" + modelClues.size()); - if (!modelClues.isEmpty()) { - List result = new ArrayList<>(); - for (ModelClue modelClue : modelClues) { - modelClue.setModelId(modelId); - modelClue.setCreateTime(LocalDateTime.now()); - if (modelClue.getInvolveDepartName() != null && !modelClue.getInvolveDepartName().isEmpty()) { - result.add(modelClue); + try { + Model model = modelRepository.getById(modelId); + List modelClues = new ArrayList<>(); + if (!Objects.isNull(model) && model.getModelingMethod().equals("2")) { + modelClues.addAll(getModelClueBySql("customModel", modelId, model)); + } else if (!Objects.isNull(model) && model.getModelSql() != null) { + modelClues.addAll(getModelClueBySql(model.getModelSql(), modelId, null)); + } + log.info("模型线索数量:" + modelClues.size()); + // 过滤掉单位为空的数据 + modelClues = modelClues.stream().filter(item -> StrUtil.isNotBlank(item.getInvolveDepartId())).toList(); + modelClues.forEach(item -> { + item.setModelId(modelId); + item.setCreateTime(LocalDateTime.now()); + }); + log.info("模型线索数量(过滤单位为空的数据):" + modelClues.size()); + int size; + log.info("模型的预警类型为 {}", model.getModelDataType()); + // 提醒通知 + if ("2".equals(model.getModelDataType())) { + // 保存提醒通知 + size = addAlarmNotification(modelClues, model); + } + // 模型线索 + else { + if (!modelClues.isEmpty()) { + modelClueMapper.insert(modelClues); } + size = modelClues.size(); } - System.out.println("模型结果2数量:" + modelClues.size()); - modelClueMapper.insert(result); - modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(result.size()).setCreateTime(LocalDateTime.now()).setState("success")); - } else { - modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(0).setCreateTime(LocalDateTime.now()).setState("fail").setErrMsg("数据为空")); - } - if (Objects.nonNull(model)) { + log.info("模型结果数据 入库数量:" + size); + modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(size).setCreateTime(LocalDateTime.now()).setState("success")); model.setLatestRunTime(LocalDateTime.now()); modelRepository.updateById(model); + } catch (RuntimeException e) { + log.error(e.getMessage(), e); + modelClueRecordRepository.getBaseMapper().insert(new ModelClueRecord().setModelId(modelId).setSize(0).setCreateTime(LocalDateTime.now()).setState("fail").setErrMsg(e.getMessage())); + } } + public int addAlarmNotification(List modelClues, Model model) { + if (modelClues.isEmpty()) { + return 0; + } + List list = new ArrayList<>(); + for (ModelClue item : modelClues) { + AlarmNotification notification = new AlarmNotification(); + notification.setAlarmTime(LocalDateTime.now()); + notification.setAlarmTypeId(3L); + notification.setAlarmType("提醒通知"); + notification.setNotificationDepartId(item.getInvolveDepartId()); + notification.setNotificationDepartName(item.getInvolveDepartName()); + notification.setAlarmContent(item.getThingDesc()); + notification.setReplyState(0); + notification.setModelId(model.getId()); + notification.setDel(0); + list.add(notification); + } + log.info("模型的提醒通知单位类型为 {}", model.getHandleDepartType()); + if ("1".equals(model.getHandleDepartType())) { + alarmNotificationMapper.insert(list); + return list.size(); + } + if ("2".equals(model.getHandleDepartType())) { + SupDepart depart = departRepository.getById(model.getHandleDepartId()); + list.forEach(item -> { + item.setNotificationDepartId(depart.getId()); + item.setNotificationDepartName(depart.getShortName()); + }); + alarmNotificationMapper.insert(list); + return list.size(); + } + // 问题涉及单位+指定单位 + if ("3".equals(model.getHandleDepartType())) { + alarmNotificationMapper.insert(list); + int size = list.size(); + for (AlarmNotification notification : list) { + SupDepart depart = departRepository.getById(notification.getNotificationDepartId()); + // 法制 17、督审 18、警保 19 + List groups = List.of(17, 18, 19); + if (depart.getLevel() == 2) { + List departs = departRepository.list(new LambdaQueryWrapper() + .eq(SupDepart::getPid, notification.getId()) + .in(SupDepart::getStatisticsGroupId, groups)); + if (!departs.isEmpty()) { + for (SupDepart d : departs) { + AlarmNotification n = new AlarmNotification(); + BeanUtil.copyProperties(notification, n); + n.setId(null); + n.setNotificationDepartId(d.getId()); + n.setNotificationDepartName(d.getShortName()); + alarmNotificationMapper.insert(n); + size += 1; + } + } + } + if (depart.getLevel() == 3) { + List departs = departRepository.list(new LambdaQueryWrapper() + .eq(SupDepart::getPid, depart.getPid()) + .in(SupDepart::getStatisticsGroupId, groups)); + if (!departs.isEmpty()) { + for (SupDepart d : departs) { + AlarmNotification n = new AlarmNotification(); + BeanUtil.copyProperties(notification, n); + n.setId(null); + n.setNotificationDepartId(d.getId()); + n.setNotificationDepartName(d.getShortName()); + alarmNotificationMapper.insert(n); + size += 1; + } + } + } + return size; + } + } + return 0; + } + public void generateCustomModels() { log.info("开始执行自建模型"); List customModels = modelRepository.getBaseMapper().selectList(Wrappers.lambdaQuery().eq(Model::getModelingMethod, "2")); @@ -176,7 +273,7 @@ public class ModelClueServiceImpl implements ModelClueService { oldUniqueKeys = modelClueRepository.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()) { - modelClueMapper.update(null, new LambdaUpdateWrapper().in(ModelClue::getUniqueKey, changeStatusIds).set(ModelClue::getDistributionState, "2")); + //modelClueMapper.update(null, new LambdaUpdateWrapper().in(ModelClue::getUniqueKey, changeStatusIds).set(ModelClue::getDistributionState, "2")); } } List needsInsertIds = new ArrayList<>(); @@ -246,6 +343,10 @@ public class ModelClueServiceImpl implements ModelClueService { } } thingDescGeneration = String.join("", thingDescGenerationSplit); + // 如果已存在,则跳过 + if (modelClueMapper.exists(new LambdaQueryWrapper().eq(ModelClue::getThingDesc, thingDescGeneration))) { + continue; + } SupExternalDepart supExternalDepart = supExternalDepartRepository.getOne(new LambdaQueryWrapper().eq(SupExternalDepart::getExternalId, Optional.ofNullable(map.get(modelGeneration.getInvolveDepartId())) .map(Object::toString).orElse("")).eq(SupExternalDepart::getSource, model.getClueDepartSource()).last("LIMIT 1")); String involveDepartName = ""; @@ -281,7 +382,7 @@ public class ModelClueServiceImpl implements ModelClueService { List oldUniqueKeys = modelClueRepository.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()) { - modelClueMapper.update(null, new LambdaUpdateWrapper().in(ModelClue::getUniqueKey, changeStatusIds).set(ModelClue::getDistributionState, "2")); + //modelClueMapper.update(null, new LambdaUpdateWrapper().in(ModelClue::getUniqueKey, changeStatusIds).set(ModelClue::getDistributionState, "2")); } List needsInsertIds = new ArrayList<>(); for (String uniqueKey : uniqueKeys) { @@ -913,7 +1014,7 @@ public class ModelClueServiceImpl implements ModelClueService { private void getModelCluesForModel20(String param, List modelClues) { System.out.println("模型20开始查询数据库"); // 定时任务 - String sql = "select * from dwd_qb_nbgl_lxqtscsygxjl where STR_TO_DATE(tjrq, '%Y-%m-%d') = (CURDATE() - INTERVAL 1 DAY);"; + String sql = "select * from dwd_qb_nbgl_lxqtscsygxjl where STR_TO_DATE(tjrq, '%Y-%m-%d') = (CURDATE() - INTERVAL 3 DAY);"; List> sqlList = modelClueDataMapper.selectByUniqueKeys(sql); System.out.println("模型20查询数据库完毕,结果数量:" + sqlList.size()); if (sqlList.isEmpty()) { @@ -943,7 +1044,7 @@ public class ModelClueServiceImpl implements ModelClueService { private void getModelCluesForModel22(String param, List modelClues) { System.out.println("模型22开始查询数据库"); // 定时任务 - String sql = "select * from \"JSDZ_4GDB\".\"v_anomaly_statistics\" where \"CREATETIME\" = \"" + getYesterdayString() + "\""; + String sql = "select * from \"JSDZ_4GDB\".\"v_anomaly_statistics\" where CREATETIME = '" + getYesterdayString() + "'"; List> sqlList = modelClueDataDMRepository.selectByUniqueKeys(sql); System.out.println("模型22查询数据库完毕,结果数量:" + sqlList.size()); if (sqlList.isEmpty()) { diff --git a/src/main/java/com/biutag/supervisiondata/task/TaskService.java b/src/main/java/com/biutag/supervisiondata/task/TaskService.java index 308433d..7f61d16 100644 --- a/src/main/java/com/biutag/supervisiondata/task/TaskService.java +++ b/src/main/java/com/biutag/supervisiondata/task/TaskService.java @@ -161,6 +161,13 @@ public class TaskService { log.info("模型3执行完毕"); } + @Scheduled(cron = "0 30 3 * * *") + public void runModel7() { + log.info("开始执行模型7"); + modelClueService.generate(7); + log.info("模型7执行完毕"); + } + @Scheduled(cron = "0 31 3 * * *") public void runModel10() { log.info("开始执行模型10"); @@ -176,27 +183,34 @@ public class TaskService { } @Scheduled(cron = "0 33 3 * * *") + public void runModel16() { + log.info("开始执行模型16"); + modelClueService.generate(15); + log.info("模型16执行完毕"); + } + + @Scheduled(cron = "0 34 3 * * *") public void runModel17() { log.info("开始执行模型17"); modelClueService.generate(17); log.info("模型17执行完毕"); } - @Scheduled(cron = "0 34 3 * * *") + @Scheduled(cron = "0 35 3 * * *") public void runModel19() { log.info("开始执行模型19"); modelClueService.generate(19); log.info("模型19执行完毕"); } - @Scheduled(cron = "0 35 3 * * *") + @Scheduled(cron = "0 36 3 * * *") public void runModel20() { log.info("开始执行模型20"); modelClueService.generate(20); log.info("模型20执行完毕"); } - @Scheduled(cron = "0 36 3 * * *") + @Scheduled(cron = "0 37 3 * * *") public void runModel22To29() { for (int i = 22; i <= 29; i++) { log.info("开始执行模型{}", i); @@ -244,9 +258,9 @@ public class TaskService { } /** - * 4点更新自建模型 + * 每天8点30更新自建模型 */ - @Scheduled(cron = "0 0 4 * * ?") + @Scheduled(cron = "0 30 8 * * ?") public void runCustomModels() { log.info("runCustomModels-------------------"); modelClueService.generateCustomModels();