From 649320930f81cfe87d5e18c2788a4dcabe352b83 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 26 Nov 2025 18:37:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8Eisc=E5=8F=96=E8=BD=A6=E8=BE=86?= =?UTF-8?q?=E4=B8=8D=E5=AE=89=E5=85=A8=E8=A1=8C=E4=B8=BA=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=88=E8=B6=85=E9=80=9F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baotou/entity/CarDangerDetectRecord.java | 18 +- .../CarDangerDetectRecordServiceImpl.java | 8 +- .../constant/DictionaryConstant.java | 4 + .../java/com/zhgd/xmgl/task/CarInfoTask.java | 181 +++++++++++++----- 4 files changed, 150 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/CarDangerDetectRecord.java b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/CarDangerDetectRecord.java index 1999fb835..aa5db8f84 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/entity/CarDangerDetectRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/entity/CarDangerDetectRecord.java @@ -73,10 +73,10 @@ public class CarDangerDetectRecord implements Serializable { private java.lang.String alarmDesc; /** - * 类型 1-烟感报警,2-明火报警,3-人员到底报警,4-未带安全帽报警,5-区域入侵报警,6-越界入侵报警,7-人员聚集报警, 8-反光衣、9-裸土覆盖,13口罩识别,14徘徊预警,15物体滞留监测,16绊线监测 + * 类型 1-车辆超速 */ - @Excel(name = "类型 1-烟感报警,2-明火报警,3-人员到底报警,4-未带安全帽报警,5-区域入侵报警,6-越界入侵报警,7-人员聚集报警, 8-反光衣、9-裸土覆盖,13口罩识别,14徘徊预警,15物体滞留监测,16绊线监测", width = 15) - @ApiModelProperty(value = "类型 1-烟感报警,2-明火报警,3-人员到底报警,4-未带安全帽报警,5-区域入侵报警,6-越界入侵报警,7-人员聚集报警, 8-反光衣、9-裸土覆盖,13口罩识别,14徘徊预警,15物体滞留监测,16绊线监测") + @Excel(name = "类型 1-车辆超速", width = 15) + @ApiModelProperty(value = "类型 1-车辆超速") private java.lang.Integer alarmType; /** * 位置 @@ -152,8 +152,18 @@ public class CarDangerDetectRecord implements Serializable { private java.util.Date updateDate; @ApiModelProperty(value = "是否推送给承包商") private Boolean isPushed; - @ApiModelProperty(value = "处置方式:1:违章再教育;2:加入黑名单;") + @ApiModelProperty(value = "处置方式:1:违章再教育;2:加入黑名单;") private Integer handleType; + /** + * 车牌号 + */ + @ApiModelProperty(value = "车牌号") + private String carNumber; + /** + * 当前车速(km/h) + */ + @ApiModelProperty(value = "当前车速(km/h)") + private java.math.BigDecimal currentSpeed; /** * 推送人id字符串数组 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CarDangerDetectRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CarDangerDetectRecordServiceImpl.java index e3d074a22..8ccf02b0a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CarDangerDetectRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/service/impl/CarDangerDetectRecordServiceImpl.java @@ -178,7 +178,7 @@ public class CarDangerDetectRecordServiceImpl extends ServiceImpl setAlarmTypeName(String projectSn, List carDangerDetectRecords) { - List dictList = dictionaryItemService.getDictList(DictionaryConstant.AI_ANALYSE_HARD_WARE_ALARM_RECORD_TYPE, projectSn); + List dictList = dictionaryItemService.getDictList(DictionaryConstant.CAR_DANGER_DETECT_RECORD_ALARM_TYPE, projectSn); Map typeMap = dictList.stream().collect(Collectors.toMap(DictionaryItem::getData, Function.identity(), (dictionaryItem, dictionaryItem2) -> dictionaryItem)); for (CarDangerDetectRecord record : carDangerDetectRecords) { DictionaryItem item = typeMap.get(record.getAlarmType() + ""); @@ -454,7 +454,7 @@ public class CarDangerDetectRecordServiceImpl extends ServiceImpl dictList = dictionaryItemService.getDictList(DictionaryConstant.AI_ANALYSE_HARD_WARE_ALARM_RECORD_TYPE, record.getProjectSn()); + List dictList = dictionaryItemService.getDictList(DictionaryConstant.CAR_DANGER_DETECT_RECORD_ALARM_TYPE, record.getProjectSn()); try { Map typeMap = dictList.stream().collect(Collectors.toMap(DictionaryItem::getData, Function.identity(), (dictionaryItem, dictionaryItem2) -> dictionaryItem)); DictionaryItem item = typeMap.get(record.getAlarmType() + ""); @@ -550,7 +550,7 @@ public class CarDangerDetectRecordServiceImpl extends ServiceImpl dictList = dictionaryItemService.getDictList(DictionaryConstant.AI_ANALYSE_HARD_WARE_ALARM_RECORD_TYPE, record.getProjectSn()); + List dictList = dictionaryItemService.getDictList(DictionaryConstant.CAR_DANGER_DETECT_RECORD_ALARM_TYPE, record.getProjectSn()); Map typeMap = dictList.stream().collect(Collectors.toMap(DictionaryItem::getData, Function.identity(), (dictionaryItem, dictionaryItem2) -> dictionaryItem)); DictionaryItem item = typeMap.get(record.getAlarmType() + ""); String name = Optional.ofNullable(item).map(DictionaryItem::getName).orElse(String.valueOf(record.getAlarmType())); diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java index b57113705..2ca6cb3f9 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java @@ -9,6 +9,10 @@ public interface DictionaryConstant { * AI分析硬件设备报警记录类型 */ String AI_ANALYSE_HARD_WARE_ALARM_RECORD_TYPE = "ai_analyse_hard_ware_alarm_record_type"; + /** + * 车辆不安全行为报警类型 + */ + String CAR_DANGER_DETECT_RECORD_ALARM_TYPE = "car_danger_detect_record_alarm_type"; /** * 隧道定位各项目的标签消失时间配置 */ diff --git a/src/main/java/com/zhgd/xmgl/task/CarInfoTask.java b/src/main/java/com/zhgd/xmgl/task/CarInfoTask.java index 85bc5cd7b..7cc220301 100644 --- a/src/main/java/com/zhgd/xmgl/task/CarInfoTask.java +++ b/src/main/java/com/zhgd/xmgl/task/CarInfoTask.java @@ -1,5 +1,7 @@ package com.zhgd.xmgl.task; +import java.util.Date; + import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; @@ -9,6 +11,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.redis.lock.RedisRepository; import com.zhgd.xmgl.base.HikvisionEventsPictureRq; import com.zhgd.xmgl.call.HikvisionCall; +import com.zhgd.xmgl.modules.baotou.entity.CarDangerDetect; +import com.zhgd.xmgl.modules.baotou.entity.CarDangerDetectRecord; +import com.zhgd.xmgl.modules.baotou.service.ICarDangerDetectRecordService; +import com.zhgd.xmgl.modules.baotou.service.ICarDangerDetectService; import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.entity.CarInfoApprovalFlow; import com.zhgd.xmgl.modules.car.entity.CarMeasureSpeedData; @@ -63,6 +69,12 @@ public class CarInfoTask { private ICarMeasureSpeedDevService carMeasureSpeedDevService; @Autowired private ICarMeasureSpeedDataService carMeasureSpeedDataService; + @Lazy + @Autowired + private ICarDangerDetectRecordService carDangerDetectRecordService; + @Lazy + @Autowired + private ICarDangerDetectService carDangerDetectService; /** * 定时删除/更新过期的车辆,并下发新的预约时间的车辆到海康 @@ -108,64 +120,127 @@ public class CarInfoTask { } else { start = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); } - String end = DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + String end = DateUtil.format(DateUtil.offsetMinute(new Date(), -2), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); redisRepository.set(queryTimeKey, end); List projects = projectMapper.selectList(new LambdaQueryWrapper() .eq(Project::getSyncHikvision, 1)); - List speedDevs = carMeasureSpeedDevService.list(); - Map> projectMap = speedDevs.stream().collect(Collectors.groupingBy(CarMeasureSpeedDev::getProjectSn)); - for (Map.Entry> entry : projectMap.entrySet()) { - List list = entry.getValue(); - Map devMap = list.stream().collect(Collectors.toMap(CarMeasureSpeedDev::getDevSn, Function.identity())); - String projectSn = entry.getKey(); - Optional hasProject = projects.stream().filter(project -> Objects.equals(project.getProjectSn(), projectSn)).findFirst(); - if (hasProject.isPresent()) { - Project project = hasProject.get(); - try { - JSONObject param = new JSONObject(); - HikvisionUtil.addPageParamIfAbsent(param); - param.put("beginTime", start); - param.put("endTime", DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")); - JSONObject rsJo = HikvisionUtil.getSpeedDataList(project, param); - if (HikvisionUtil.isSuccess(rsJo)) { - JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); - JSONArray listJa = dataJo.getJSONArray("list"); - if (CollUtil.isNotEmpty(listJa)) { - for (int i = 0; i < listJa.size(); i++) { - JSONObject jo = listJa.getJSONObject(i); - Integer illegalType = jo.getInteger("illegalType"); - if (!Objects.equals(illegalType, 1) && !Objects.equals(illegalType, 7)) { - continue; - } - String monitoringId = jo.getString("monitoringId"); - CarMeasureSpeedDev dev = devMap.get(monitoringId); - if (dev == null) { - continue; - } - String plateNo = jo.getString("plateNo"); - BigDecimal speed = jo.getBigDecimal("speed"); - Date time = DateUtil.parse(jo.getString("crossTime")); - CarMeasureSpeedData data = new CarMeasureSpeedData(); - data.setDevSn(monitoringId); - data.setCarNumber(plateNo); - data.setIsExceed(NumberUtil.isGreater(speed, dev.getThreshold()) ? 1 : 0); - data.setCurrentSpeed(speed); - data.setExceedingThreshold(Objects.equals(data.getIsExceed(), 1) ? NumberUtil.sub(speed, dev.getThreshold()) : new BigDecimal("0")); - String platePicUrl = jo.getString("carPicUri"); - String svrIndex = jo.getString("aswSyscode"); - if (StringUtils.isNotBlank(platePicUrl)) { - data.setSnapshotImage(hikvisionCall.saveToLocal(HikvisionCall.getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); - } - data.setUploadTime(time); - data.setProjectSn(dev.getProjectSn()); - carMeasureSpeedDataService.add(data); - } - } - } - } catch (Exception e) { - log.error("定时到海康拉取车辆超速错误:", e); + Map> projectMap = carMeasureSpeedDevService.list().stream().collect(Collectors.groupingBy(CarMeasureSpeedDev::getProjectSn)); + Map> dangerDetectProjectMap = carDangerDetectService.list().stream().collect(Collectors.groupingBy(CarDangerDetect::getProjectSn)); + for (Project project : projects) { + try { + JSONArray listJa = getSpeedDataList(start, project); + if (CollUtil.isEmpty(listJa)) { + continue; } + Map devMap = Optional.ofNullable(projectMap.get(project.getProjectSn())).map(m -> m.stream().collect(Collectors.toMap(CarMeasureSpeedDev::getDevSn, Function.identity()))).orElse(null); + List speedDatas = buildSpeedData(listJa, devMap, project); + if (CollUtil.isNotEmpty(speedDatas)) { + carMeasureSpeedDataService.saveBatch(speedDatas); + } + + Map carDangerDevMap = Optional.ofNullable(dangerDetectProjectMap.get(project.getProjectSn())).map(m -> m.stream().collect(Collectors.toMap(CarDangerDetect::getHardwareId, Function.identity()))).orElse(null); + List carDangers = buildCarDangerData(listJa, carDangerDevMap, project); + if (CollUtil.isNotEmpty(carDangers)) { + carDangerDetectRecordService.saveBatch(carDangers); + } + + } catch (Exception e) { + log.error("定时到海康拉取车辆超速错误:", e); } } + + } + + private List buildCarDangerData(JSONArray listJa, Map carDangerDevMap, Project project) throws Exception { + List datas = new ArrayList<>(); + if (CollUtil.isNotEmpty(listJa)) { + for (int i = 0; i < listJa.size(); i++) { + JSONObject jo = listJa.getJSONObject(i); + Integer illegalType = jo.getInteger("illegalType"); + if (!Objects.equals(illegalType, 1) && !Objects.equals(illegalType, 7)) { + continue; + } + String monitoringId = jo.getString("monitoringId"); + CarDangerDetect dev = carDangerDevMap.get(monitoringId); + if (dev == null) { + continue; + } + String plateNo = jo.getString("plateNo"); + BigDecimal speed = jo.getBigDecimal("speed"); + Date time = DateUtil.parse(jo.getString("crossTime")); + CarDangerDetectRecord data = new CarDangerDetectRecord(); + data.setProjectSn(dev.getProjectSn()); + data.setHardwareName(dev.getHardwareName()); + data.setHardwareId(dev.getHardwareId()); + String platePicUrl = jo.getString("carPicUri"); + String svrIndex = jo.getString("aswSyscode"); + if (StringUtils.isNotBlank(platePicUrl)) { + data.setImageUrl(hikvisionCall.saveToLocal(HikvisionCall.getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); + } + data.setAlarmDesc(dev.getHardwareName()); + data.setAlarmType(1); + data.setLocation(dev.getHardwareName()); + data.setCreateTime(DateUtil.formatDateTime(time)); + data.setIsPushed(false); + data.setCarNumber(plateNo); + data.setCurrentSpeed(speed); + datas.add(data); + } + } + return datas; + } + + private List buildSpeedData(JSONArray listJa, Map devMap, Project project) throws Exception { + List datas = new ArrayList<>(); + if (CollUtil.isNotEmpty(listJa)) { + for (int i = 0; i < listJa.size(); i++) { + JSONObject jo = listJa.getJSONObject(i); + Integer illegalType = jo.getInteger("illegalType"); + if (!Objects.equals(illegalType, 1) && !Objects.equals(illegalType, 7)) { + continue; + } + String monitoringId = jo.getString("monitoringId"); + CarMeasureSpeedDev dev = devMap.get(monitoringId); + if (dev == null) { + continue; + } + String plateNo = jo.getString("plateNo"); + BigDecimal speed = jo.getBigDecimal("speed"); + Date time = DateUtil.parse(jo.getString("crossTime")); + CarMeasureSpeedData data = new CarMeasureSpeedData(); + data.setDevSn(monitoringId); + data.setCarNumber(plateNo); + data.setIsExceed(NumberUtil.isGreater(speed, dev.getThreshold()) ? 1 : 0); + data.setCurrentSpeed(speed); + data.setExceedingThreshold(Objects.equals(data.getIsExceed(), 1) ? NumberUtil.sub(speed, dev.getThreshold()) : new BigDecimal("0")); + String platePicUrl = jo.getString("carPicUri"); + String svrIndex = jo.getString("aswSyscode"); + if (StringUtils.isNotBlank(platePicUrl)) { + data.setSnapshotImage(hikvisionCall.saveToLocal(HikvisionCall.getHikvisionEventsPicture(new HikvisionEventsPictureRq(svrIndex, platePicUrl), project.getArtemisConfigHost(), project.getArtemisConfigAppKey(), project.getArtemisConfigAppSecret()))); + } + data.setUploadTime(time); + data.setProjectSn(dev.getProjectSn()); + datas.add(data); + } + } + return datas; + } + + private JSONArray getSpeedDataList(String start, Project project) { + try { + JSONObject param = new JSONObject(); + HikvisionUtil.addPageParamIfAbsent(param); + param.put("beginTime", start); + param.put("endTime", DateUtil.format(new Date(), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")); + JSONObject rsJo = HikvisionUtil.getSpeedDataList(project, param); + if (HikvisionUtil.isSuccess(rsJo)) { + JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); + return dataJo.getJSONArray("list"); + } + } catch (Exception e) { + log.error("定时http到海康拉取车辆超速错误:{}", e.getMessage()); + log.error("", e); + } + return null; } }