From cc7218dbd49bd5b10fbc2752c321c8f1727bb961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Wed, 13 Mar 2024 13:34:29 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=A7=86=E9=A2=91AI=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcWarningController.java | 10 + .../zc/business/mapper/DcWarningMapper.java | 4 + .../device/handler/DeviceMessageHandler.java | 236 ++++++++++++++---- .../business/service/IDcWarningService.java | 2 + .../service/impl/DcWarningServiceImpl.java | 6 +- .../mapper/business/DcWarningMapper.xml | 24 +- 6 files changed, 233 insertions(+), 49 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java index dd997365..df443061 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java @@ -119,5 +119,15 @@ public class DcWarningController extends BaseController } return toAjax(dcWarningService.deleteDcWarningByStringId(dcWarning)); } + /** + *视频AI 上报 条件查询 + */ + @GetMapping("/selectDcWarningoTherConfiglist") + public TableDataInfo selectDcWarningoTherConfig(DcWarning dcWarning) + { + startPage(); + List> list = dcWarningService.selectDcWarningoTherConfig(dcWarning); + return getDataTable(list); + } } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java index 58d60eaf..a55e1ed6 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java @@ -66,4 +66,8 @@ public interface DcWarningMapper int updateState(DcWarning dcWarning); //感知事件删除 int deleteDcWarningByStringId(DcWarning dcWarning); + + //AI视频 + List> selectDcWarningoTherConfig(DcWarning dcWarning); + } diff --git a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java index edc3a8b5..45213776 100644 --- a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java +++ b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java @@ -25,16 +25,20 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** * 设备消息处理 + * * @author xiepufeng */ @Service public class DeviceMessageHandler { - + private final int EVENT_AI = 1; + private final int EVENT_STATE = 1; + private final int EVENTEND_STATE = 4; private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource @@ -101,6 +105,7 @@ public class DeviceMessageHandler { /** * 摄像头检测事件处理 + * * @param event 事件数据 */ private void cameraDetectionEventHandle(JSONObject event) { @@ -108,62 +113,199 @@ public class DeviceMessageHandler { JSONObject data = event.getJSONObject("data"); DcWarning dcWarning = new DcWarning(); + /** + * case "constructionEnd":"施工结束"; + * case "congestionEnd":"拥堵结束"; + * case "illegalParkingEnd":"违停结束"; + * case "lowVisibilityEnd":"低环境能见度结束"; + * case "singleVehicleBreakdownEnd":"单车抛锚结束"; + * case "pedestrianEnd":"行人事件结束"; + * case "abandonedObjectEnd":"抛洒物结束"; + * trafficAccidentEnd 交通事故结束 + * case "unknown":"未知"; + * case "desc":"单车抛锚是指单辆车抛锚(故障)停止";//4-5 + * */ + + String illegalTrafficEventSubType = data.getString("illegalTrafficEventSubType"); + if (!illegalTrafficEventSubType.equals("constructionEnd") && + !illegalTrafficEventSubType.equals("congestionEnd") && + !illegalTrafficEventSubType.equals("illegalParkingEnd") && + !illegalTrafficEventSubType.equals("lowVisibilityEnd") && + !illegalTrafficEventSubType.equals("singleVehicleBreakdownEnd") && + !illegalTrafficEventSubType.equals("pedestrianEnd") && + !illegalTrafficEventSubType.equals("trafficAccidentEnd") && + !illegalTrafficEventSubType.equals("abandonedObjectEnd") + ) { + // 桩号 + dcWarning.setStakeMark(data.getString("stakeMark")); + // 方向 + dcWarning.setDirection(data.getString("direction")); + // 警情状态 + dcWarning.setWarningState(WarningStateEnum.REPORTED.getCode()); + // 捕获时间 + Long captureTime = data.getLong("captureTime"); + // 预警时间 + dcWarning.setWarningTime(new Date(captureTime)); + // 信息来源 + dcWarning.setWarningSource(WarningSourceEnum.VIDEO_AI.getCode()); + // 事件主类型 + dcWarning.setWarningType(data.getInteger("warningType")); + + String warningSubclass = data.getString("warningSubclass"); + // 子类型 + dcWarning.setWarningSubclass(warningSubclass); + + String stakeMarkDescription = data.getString("stakeMarkDescription"); + String title = stakeMarkDescription + WarningSubclassEnum.getDecorateInfo(warningSubclass); + // 标题 + dcWarning.setWarningTitle(title); + dcWarning.setRemark(convertTimestampToString(captureTime) + " " + title); + // 影响车道 + dcWarning.setLane(String.valueOf(data.getInteger("relatedLaneNo"))); + // 物联设备id + String iotDeviceId = event.getString("deviceId"); + + DcDevice dcDevice = redisCache.getCacheMapValue(RedisKeyConstants.DC_DEVICES, iotDeviceId); + if (dcDevice != null) { + // 所属机构 + dcWarning.setDeptId(dcDevice.getGroupId()); + } + + JSONArray pictures = data.getJSONArray("pictures"); + JSONArray video = data.getJSONArray("videoList"); + // List pictureList = pictures.stream().map(picture -> (iotAddress + "/profile" + picture)).collect(Collectors.toList()); + JSONObject otherConfig = new JSONObject(); + otherConfig.put("pictures", pictures); + /**视频地址*/ + otherConfig.put("videoList", video); + /** 事件id*/ // 去掉空格和双引号 + Long targetId = data.getLong("targetId"); + otherConfig.put("targetId", targetId); + /**事件位置*/ + Long coordinate = data.getLong("coordinate"); + otherConfig.put("coordinate", coordinate); - // 桩号 - dcWarning.setStakeMark(data.getString("stakeMark")); - // 方向 - dcWarning.setDirection(data.getString("direction")); - // 警情状态 - dcWarning.setWarningState(WarningStateEnum.REPORTED.getCode()); - // 捕获时间 - Long captureTime = data.getLong("captureTime"); - // 预警时间 - dcWarning.setWarningTime(new Date(captureTime)); - // 信息来源 - dcWarning.setWarningSource(WarningSourceEnum.VIDEO_AI.getCode()); - // 事件主类型 - dcWarning.setWarningType(data.getInteger("warningType")); - - String warningSubclass = data.getString("warningSubclass"); - // 子类型 - dcWarning.setWarningSubclass(warningSubclass); - - String stakeMarkDescription = data.getString("stakeMarkDescription"); - - String title = stakeMarkDescription + WarningSubclassEnum.getDecorateInfo(warningSubclass); - - // 标题 - dcWarning.setWarningTitle(title); - dcWarning.setRemark(convertTimestampToString(captureTime) + " " + title); - // 影响车道 - dcWarning.setLane(String.valueOf(data.getInteger("relatedLaneNo"))); - - // 物联设备id - String iotDeviceId = event.getString("deviceId"); +/* JSONObject combinedData = new JSONObject(); + combinedData.put("address", otherConfig);*/ + dcWarning.setOtherConfig(otherConfig.toString()); + dcWarningService.insertDcWarning(dcWarning); - DcDevice dcDevice = redisCache.getCacheMapValue(RedisKeyConstants.DC_DEVICES, iotDeviceId); - if (dcDevice != null) { - // 所属机构 - dcWarning.setDeptId(dcDevice.getGroupId()); } +//无法判定事件结束上报的类型有:占用应急车道,路障,逆行,机占非 + //非持续性事件:拥堵、 + if (illegalTrafficEventSubType.equals("congestion")) { + //无ID无框 + extracted(data, dcWarning); + } + //持续性事件 + //行人结束事件上报(无ID无框) + if (illegalTrafficEventSubType.equals("pedestrianEnd")) { + //无ID无框 + extracted(data, dcWarning); + } + //能见度(无ID无框) + if (illegalTrafficEventSubType.equals("lowVisibilityEnd")) { + //无ID无框 + extracted(data, dcWarning); + } + //施工(无ID有框) + if (illegalTrafficEventSubType.equals("constructionEnd")) { + extracted1(data, dcWarning); + } + //抛洒物(有ID有框) + if (illegalTrafficEventSubType.equals("abandonedObjectEnd")){ + extracted3(data, dcWarning); + } + //事故(有ID有框) + if(illegalTrafficEventSubType.equals("trafficAccidentEnd")){ + extracted3(data, dcWarning); - JSONArray pictures = data.getJSONArray("pictures"); - JSONArray video = data.getJSONArray("videoList"); + } + //车辆抛锚有ID有框) + if(illegalTrafficEventSubType.equals("singleVehicleBreakdownEnd")){ + extracted3(data, dcWarning); - // List pictureList = pictures.stream().map(picture -> (iotAddress + "/profile" + picture)).collect(Collectors.toList()); + } + //违停(有ID有框) + if(illegalTrafficEventSubType.equals("illegalParkingEnd")){ + extracted3(data, dcWarning); - JSONObject otherConfig = new JSONObject(); - otherConfig.put("pictures", pictures); - /**视频地址*/ - otherConfig.put("videoList", video); + } + } +//(有ID有框) + private void extracted3(JSONObject data, DcWarning dcWarning) { + //事件上报ID + String targetId = data.getString("targetId"); + //事件位置 + String coordinate = data.getString("coordinate"); + String stakeMark = data.getString("stakeMark"); + dcWarning.setStakeMark(stakeMark); + // 事件主类型 + dcWarning.setWarningType(data.getInteger("warningType")); + dcWarning.setWarningSource(EVENT_AI);//事件来源 + dcWarning.setWarningState(EVENT_STATE);//事件状态 + List> hashMaps = dcWarningService.selectDcWarningoTherConfig(dcWarning); + + for (HashMap hashMap : hashMaps) { + String id = (String) hashMap.get("Id"); + String targetIdEvent = (String) hashMap.get("targetId"); + //事件位置 + String coordinateEvent = (String) hashMap.get("coordinate"); + if (coordinate.equals(coordinateEvent)&&targetId.equals(targetIdEvent)) { + DcWarning dcWarning2 = new DcWarning(); + dcWarning2.setId(id); + //自动确定状态 + dcWarning2.setWarningState(EVENTEND_STATE); + dcWarningService.updateDcWarning(dcWarning2); + } -/* JSONObject combinedData = new JSONObject(); - combinedData.put("address", otherConfig);*/ + } + } - dcWarning.setOtherConfig(otherConfig.toString()); + //无ID有框 + private void extracted1(JSONObject data, DcWarning dcWarning) { + //事件位置 + String coordinate = data.getString("coordinate"); + String stakeMark = data.getString("stakeMark"); + dcWarning.setStakeMark(stakeMark); + // 事件主类型 + dcWarning.setWarningType(data.getInteger("warningType")); + dcWarning.setWarningSource(EVENT_AI);//事件来源 + dcWarning.setWarningState(EVENT_STATE);//事件状态 + List> hashMaps = dcWarningService.selectDcWarningoTherConfig(dcWarning); + + for (HashMap hashMap : hashMaps) { + String id = (String) hashMap.get("Id"); + //事件位置 + String coordinateEvent = (String) hashMap.get("coordinate"); + if (coordinate.equals(coordinateEvent)) { + DcWarning dcWarning2 = new DcWarning(); + dcWarning2.setId(id); + //自动确定状态 + dcWarning2.setWarningState(EVENTEND_STATE); + dcWarningService.updateDcWarning(dcWarning2); + } - dcWarningService.insertDcWarning(dcWarning); + } + } + //无ID无框 + private void extracted(JSONObject data, DcWarning dcWarning) { + // 桩号 + String stakeMark = data.getString("stakeMark"); + dcWarning.setStakeMark(stakeMark); + // 事件主类型 + dcWarning.setWarningType(data.getInteger("warningType")); + dcWarning.setWarningSource(EVENT_AI);//事件来源 + dcWarning.setWarningState(EVENT_STATE);//事件状态 + List> hashMaps = dcWarningService.selectDcWarningoTherConfig(dcWarning); + for (HashMap hashMap : hashMaps) { + String id = (String) hashMap.get("Id"); + DcWarning dcWarning2 = new DcWarning(); + dcWarning2.setId(id); + dcWarning2.setWarningState(EVENTEND_STATE); + dcWarningService.updateDcWarning(dcWarning2); + } } /** diff --git a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java index 0a670456..837c6dfa 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java @@ -67,4 +67,6 @@ public interface IDcWarningService AjaxResult updateWarningConvert(DcWarning dcWarning); //感知事件删除 int deleteDcWarningByStringId(DcWarning dcWarning); + List> selectDcWarningoTherConfig(DcWarning dcWarning); + } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index 7dc23f6d..93112275 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -165,5 +165,9 @@ public class DcWarningServiceImpl implements IDcWarningService public int deleteDcWarningByStringId(DcWarning dcWarning) { return dcWarningMapper.deleteDcWarningByStringId(dcWarning); } - + @Override + public List> selectDcWarningoTherConfig(DcWarning dcWarning) + { + return dcWarningMapper.selectDcWarningoTherConfig(dcWarning); + } } diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index d8b6a869..04da5447 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -24,7 +24,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + + + + + + + select id, stake_mark stakeMark, direction, dept_id deptId, warning_state warningState,vehicle_type vehicleType, @@ -154,4 +161,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + \ No newline at end of file From 3142890ba3cfd7fc544857d6922475d8d58e8991 Mon Sep 17 00:00:00 2001 From: mengff <1198151809@qq.com> Date: Wed, 13 Mar 2024 14:15:23 +0800 Subject: [PATCH 2/3] =?UTF-8?q?--=E6=A3=80=E6=B5=8B=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=88=87=E6=8D=A2dc=5Fdevice=E8=A1=A8=20--?= =?UTF-8?q?=E5=88=87=E6=8D=A2device=5Fid=E4=B8=BA=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=20--=E6=9B=B4=E6=94=B9=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zc/business/controller/DeviceStatus.java | 27 +++++++------ .../business/controller/StatusController.java | 38 ++++++++++--------- .../java/com/zc/business/domain/Status.java | 12 ++++++ .../mapper/business/StatusMapper.xml | 24 ++++++++---- 4 files changed, 64 insertions(+), 37 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java b/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java index 33572392..659453ba 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java +++ b/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java @@ -1,5 +1,6 @@ package com.zc.business.controller; +import com.github.pagehelper.util.StringUtil; import com.ruoyi.common.utils.spring.SpringUtils; import com.zc.business.domain.DcDevice; import com.zc.business.service.IDcDeviceService; @@ -54,25 +55,29 @@ public class DeviceStatus { Callable task = () -> { try { Status status = new Status(); - InetAddress address = InetAddress.getByName(device.getDeviceIp()); - String lostRate = getPingPacketLossRate(device.getDeviceIp()); - boolean reachable = address.isReachable(5000); // Timeout: 5 seconds - status.setDeviceNo(device.getStakeMark()); status.setDeviceName(device.getDeviceName()); status.setDeviceIp(device.getDeviceIp()); + status.setDeviceId(device.getId()); LocalDateTime localDateTime = LocalDateTime.now(); status.setTime(localDateTime); - status.setLostRate(lostRate); - - if (reachable) { - status.setDeviceStatus(1); - status.setSuccessRate("100.00%"); - } else { + if(StringUtil.isNotEmpty(device.getDeviceIp())) { + InetAddress address = InetAddress.getByName(device.getDeviceIp()); + String lostRate = getPingPacketLossRate(device.getDeviceIp()); + boolean reachable = address.isReachable(5000); // Timeout: 5 seconds + status.setLostRate(lostRate); + if (reachable) { + status.setDeviceStatus(1); + status.setSuccessRate("100.00%"); + } else { + status.setDeviceStatus(0); + status.setSuccessRate("0.00%"); + } + }else{ status.setDeviceStatus(0); status.setSuccessRate("0.00%"); + status.setLostRate("100.00%"); } - statusService.Add(status); } catch (IOException e) { System.out.println("Error pinging " + device.getDeviceIp() + ": " + e.getMessage()); diff --git a/zc-business/src/main/java/com/zc/business/controller/StatusController.java b/zc-business/src/main/java/com/zc/business/controller/StatusController.java index e1e633de..382c4cda 100644 --- a/zc-business/src/main/java/com/zc/business/controller/StatusController.java +++ b/zc-business/src/main/java/com/zc/business/controller/StatusController.java @@ -100,23 +100,23 @@ public class StatusController extends BaseController { public AjaxResult getTypeList() { HashMap itemTypeMap = new HashMap<>(); - itemTypeMap.put("1", "高清网络枪型固定摄像机"); - itemTypeMap.put("2", "高清网络球形摄像机"); - itemTypeMap.put("3", "桥下高清网络球形摄像机"); - itemTypeMap.put("4", "360°全景摄像机"); - itemTypeMap.put("5", "180°全景摄像机"); - itemTypeMap.put("6", "门架式可变信息标志"); - itemTypeMap.put("7", "雨棚可变信息标志"); - itemTypeMap.put("8", "站前悬臂式可变信息标志"); - itemTypeMap.put("9", "气象检测器"); - itemTypeMap.put("10", "路段语音广播系统"); - itemTypeMap.put("11", "护栏碰撞预警系统"); - itemTypeMap.put("12", "毫米波雷达"); - itemTypeMap.put("13", "合流区预警系统"); - itemTypeMap.put("14", "激光疲劳唤醒"); - itemTypeMap.put("15", "一类交通量调查站"); - itemTypeMap.put("16", "智能行车诱导系统"); - itemTypeMap.put("17", "智能设备箱"); + itemTypeMap.put("1-1", "高清网络枪型固定摄像机"); + itemTypeMap.put("1-2", "高清网络球形摄像机"); + itemTypeMap.put("1-3", "桥下高清网络球形摄像机"); + itemTypeMap.put("1-4", "360°全景摄像机"); + itemTypeMap.put("1-5", "180°全景摄像机"); + itemTypeMap.put("2-1", "门架式可变信息标志"); + itemTypeMap.put("2-3", "雨棚可变信息标志"); + itemTypeMap.put("2-4", "站前悬臂式可变信息标志"); + itemTypeMap.put("3", "气象检测器"); + itemTypeMap.put("5", "路段语音广播系统"); + itemTypeMap.put("6", "护栏碰撞预警系统"); + itemTypeMap.put("7", "毫米波雷达"); + itemTypeMap.put("8", "合流区预警系统"); + itemTypeMap.put("10", "激光疲劳唤醒"); + itemTypeMap.put("11", "一类交通量调查站"); + itemTypeMap.put("12", "智能行车诱导系统"); + itemTypeMap.put("13", "智能设备箱"); LocalDateTime todayStart = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS); LocalDateTime currentTime = LocalDateTime.now(); Status status = new Status(); @@ -153,7 +153,9 @@ public class StatusController extends BaseController { maps.put("failRate",failRate); //总数 maps.put("sum",String.valueOf(groupItems.size())); - subMap.put(itemTypeMap.get(entrys.getKey()),maps); + if(itemTypeMap.get(entrys.getKey())!=null) { + subMap.put(itemTypeMap.get(entrys.getKey()), maps); + } } Map maps=new HashMap<>(); double lostRate = lastEntry.stream() diff --git a/zc-business/src/main/java/com/zc/business/domain/Status.java b/zc-business/src/main/java/com/zc/business/domain/Status.java index dc146c21..0b79747c 100644 --- a/zc-business/src/main/java/com/zc/business/domain/Status.java +++ b/zc-business/src/main/java/com/zc/business/domain/Status.java @@ -117,6 +117,10 @@ public class Status { @Excel(name = "状态") private int deviceStatus; + + + + private Long deviceId; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern ="yyyy-MM-dd HH:mm:ss") @Excel(name = "监测时间", width = 30, dateFormat = "yyyy-MM-dd") @@ -194,6 +198,14 @@ public class Status { this.content = content; } + public Long getDeviceId() { + return deviceId; + } + + public void setDeviceId(Long deviceId) { + this.deviceId = deviceId; + } + @Excel(name = "型号") private String model; diff --git a/zc-business/src/main/resources/mapper/business/StatusMapper.xml b/zc-business/src/main/resources/mapper/business/StatusMapper.xml index 03ae6dde..7b6d216b 100644 --- a/zc-business/src/main/resources/mapper/business/StatusMapper.xml +++ b/zc-business/src/main/resources/mapper/business/StatusMapper.xml @@ -7,15 +7,16 @@ + - + - - + + @@ -33,6 +34,9 @@ device_status, + + device_id, + time, @@ -57,6 +61,9 @@ #{status.deviceStatus,jdbcType=INTEGER}, + + #{status.deviceId,jdbcType=BIGINT}, + #{status.time,jdbcType=DATE}, @@ -68,7 +75,7 @@ - #{status.deviceIp,jdbcType=VARCHAR}, + #{status.deviceIp,jdbcType=VARCHAR} @@ -78,9 +85,10 @@ From 950bbf27e0425b522dd2e1e9ee1ae7fc93e36ed0 Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Wed, 13 Mar 2024 14:34:28 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E5=BC=B9=E6=A1=86=E4=B8=AD=EF=BC=8C=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E6=93=8D=E4=BD=9C=E8=8E=B7=E5=8F=96=E6=83=85=E6=8A=A5?= =?UTF-8?q?=E6=9D=BF=E6=92=AD=E6=94=BE=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcEmergencyPlansController.java | 20 ++ .../zc/business/domain/DcEmergencyPlans.java | 8 +- .../service/DcEmergencyPlansService.java | 11 + .../impl/DcEmergencyPlansServiceImpl.java | 313 +++++++++++++----- 4 files changed, 262 insertions(+), 90 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java index 49f634f9..91f32974 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java @@ -78,6 +78,26 @@ public class DcEmergencyPlansController extends BaseController { return AjaxResult.success(dcEmergencyPlansList); } + /** + * 交通事件-情报板确认回显原始模板 + */ + @ApiOperation("交通事件-情报板确认回显原始模板") + @PreAuthorize("@ss.hasPermi('business:plans:list')") + @PostMapping("/event/board/confirm") + public AjaxResult eventBoardConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + return AjaxResult.success(dcEmergencyPlansService.eventBoardConfirm(dcEventAnDcEmergencyPlans)); + } + + /** + * 感知事件-情报板确认回显原始模板 + */ + @ApiOperation("感知事件-情报板确认回显原始模板") + @PreAuthorize("@ss.hasPermi('business:plans:list')") + @PostMapping("/warning/board/confirm") + public AjaxResult warningBoardConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + return AjaxResult.success(dcEmergencyPlansService.warningBoardConfirm(dcEventAnDcEmergencyPlans)); + } + /** * 感知事件-情报板自动生成文字 */ diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java b/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java index 771d60b1..6e381ec6 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java @@ -81,11 +81,17 @@ public class DcEmergencyPlans { @ApiModelProperty("事件分类") private int eventCategory; + /** + * 执行操作列表 + */ + @ApiModelProperty("执行操作列表") + private List dcExecuteAction; + /** * 执行操作 */ @ApiModelProperty("执行操作") - private List dcExecuteAction; + private DcExecuteAction executeAction; } diff --git a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java index a6583053..3109ae0e 100644 --- a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java +++ b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java @@ -3,6 +3,7 @@ package com.zc.business.service; import com.zc.business.domain.*; import java.util.List; +import java.util.Map; /** * 事件预案Service接口 @@ -45,6 +46,16 @@ public interface DcEmergencyPlansService { */ List selectDcEmergencyPlansByWarningType(DcWarning dcWarning); + /** + * 交通事件-情报板确认回显原始模板 + */ + Map> eventBoardConfirm(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + + /** + * 感知事件-情报板确认回显原始模板 + */ + Map> warningBoardConfirm(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + /** * 交通事件确定 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index 239f75af..ff29c094 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; import com.zc.business.constant.DeviceFunctionIdConstants; import com.zc.business.constant.DeviceTypeConstants; import com.zc.business.controller.BroadcastController; @@ -158,6 +159,227 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } } + /** + * 交通事件-情报板确认回显原始模板 + */ + @Override + public Map> eventBoardConfirm(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 获取事件数据 + DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); + // 方向 + String direction = dcEvent.getDirection(); + // 事件桩号 + dcEvent.setStakeMark(dcEvent.getStakeMark().replace("K","")); + String[] markArray = dcEvent.getStakeMark().split("\\+"); + if (markArray[1].length() < 3) { + // 不足三位 补零 + markArray[1] = String.format("%0" + 3 + "d", markArray[1]); + } + DcExecuteAction executeAction = dcEventAnDcEmergencyPlans.getDcEmergencyPlans().getExecuteAction(); + List dcDevices = ruleFiltering(executeAction, markArray, direction); + return getBoardTemplate(dcDevices); + } + + /** + * 感知事件-情报板确认回显原始模板 + */ + @Override + public Map> warningBoardConfirm(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 获取事件数据 + DcWarning dcWarning = dcEventAnDcEmergencyPlans.getDcWarning(); + // 方向 + String direction = dcWarning.getDirection(); + // 事件桩号 + dcWarning.setStakeMark(dcWarning.getStakeMark().replace("K","")); + String[] markArray = dcWarning.getStakeMark().split("\\+"); + if (markArray[1].length() < 3) { + // 不足三位 补零 + markArray[1] = String.format("%0" + 3 + "d", markArray[1]); + } + DcExecuteAction executeAction = dcEventAnDcEmergencyPlans.getDcEmergencyPlans().getExecuteAction(); + List dcDevices = ruleFiltering(executeAction, markArray, direction); + return getBoardTemplate(dcDevices); + } + + /** + * 情报板设备执行3A功能,获取模板 + */ + public Map> getBoardTemplate(List dcDevices) { + Map> map = new HashMap<>(); + dcDevices.forEach(dcDevice -> { + try { + if (StringUtils.isEmpty(dcDevice.getIotDeviceId())) { + return; + } + AjaxResult ajaxResult = dcDeviceController.getDeviceRealtimeProperty(dcDevice.getIotDeviceId(), "3A", new HashMap<>()); + if (ajaxResult.get("code").equals(200)) { + JSONObject properties = JSON.parseObject(JSON.parseObject(ajaxResult.get("data").toString()).get("3A").toString()); + JSONArray contentArray = JSONArray.parseArray(properties.get("content").toString()); + List list = new ArrayList<>(); + contentArray.forEach(content -> { + DcInfoBoardTemplate dcInfoBoardTemplate = new DcInfoBoardTemplate(); + JSONObject jsonObject = JSON.parseObject(content.toString()); + String displayAreaWidth = jsonObject.get("displayAreaWidth").toString(); + String displayAreaHeight = jsonObject.get("displayAreaHeight").toString(); + // 内容 + dcInfoBoardTemplate.setContent(jsonObject.get("textContent").toString()); + // 前景颜色 + dcInfoBoardTemplate.setFontColor(jsonObject.get("foregroundColor").toString()); + // 屏幕尺寸 + dcInfoBoardTemplate.setScreenSize(displayAreaWidth+"*"+displayAreaHeight); + // 字号 + dcInfoBoardTemplate.setFontSize(jsonObject.get("fontSize").toString()); + // 字体风格 + dcInfoBoardTemplate.setFontType(jsonObject.get("fontStyle").toString()); + // 字距 + dcInfoBoardTemplate.setFontSpacing(jsonObject.get("fontSpacing").toString()); + // 停留时间 + dcInfoBoardTemplate.setStopTime(jsonObject.get("residenceTime").toString()); + // 入屏方式 + dcInfoBoardTemplate.setInScreenMode(jsonObject.get("screenEntryMethod").toString()); + // 水平对齐 + dcInfoBoardTemplate.setFormatStyle(jsonObject.get("horizontalAlignment").toString()); + list.add(dcInfoBoardTemplate); + }); + map.put(dcDevice.getDeviceName(),list); + } + } catch (Exception e) { + e.printStackTrace(); + } + }); + + return map; + } + + /** + * 执行操作中的规则筛选 + * @param dcExecuteAction + * @param markArray + * @param direction + * @return + */ + public List ruleFiltering(DcExecuteAction dcExecuteAction,String[] markArray,String direction){ + + Integer searchRule = dcExecuteAction.getSearchRule(); + List start = new ArrayList<>(); + List end = new ArrayList<>(); + // 设备列表 + List dcDevices = new ArrayList<>(); + Map parameter = new HashMap<>(); + parameter.put("deviceType", dcExecuteAction.getDeviceType()); + // 根据不同的检索规则条件 获取设备 + if (searchRule.equals(1)) { + // 指定设备资源 + // 根据设备id,获取设备集合 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + JSONObject otherConfig = JSON.parseObject(dcExecuteAction.getOtherConfig()); + List deviceList = (List)otherConfig.get("deviceList"); + queryWrapper.in(DcDevice::getIotDeviceId, deviceList); + dcDevices = dcDeviceService.list(queryWrapper); + } + else if (searchRule.equals(2)) { + + // 事件上游最近 + if (direction.equals("1")) { + // 上行 取最大的几个 + start.add("55"); + start.add("379"); + end.add(markArray[0]); + end.add(markArray[1]); + parameter.put("startStakeMark", start); + parameter.put("endStakeMark", end); + dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); + Collections.sort(dcDevices, new Comparator() { + @Override + public int compare(DcDevice o1, DcDevice o2) { + return o2.getStakeMark().compareTo(o1.getStakeMark()); + } + }); + if (dcDevices.size() > 0) { + dcDevices = dcDevices.subList(0 , dcExecuteAction.getNumber()); + } + } else { + // 下行 取最小的几个 + start.add(markArray[0]); + start.add(markArray[1]); + end.add("208"); + end.add("154"); + parameter.put("startStakeMark", start); + parameter.put("endStakeMark", end); + dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); + Collections.sort(dcDevices, new Comparator() { + @Override + public int compare(DcDevice o1, DcDevice o2) { + return o1.getStakeMark().compareTo(o2.getStakeMark()); + } + }); + if (dcDevices.size() > 0) { + dcDevices = dcDevices.subList(0, dcExecuteAction.getNumber()); + } + } + + } + else if (searchRule.equals(3)) { + // 事件下游最近 + if (direction.equals("1")) { + // 上行 取最大的几个 + start.add(markArray[0]); + start.add(markArray[1]); + end.add("208"); + end.add("154"); + parameter.put("startStakeMark", start); + parameter.put("endStakeMark", end); + dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); + Collections.sort(dcDevices, new Comparator() { + @Override + public int compare(DcDevice o1, DcDevice o2) { + return o1.getStakeMark().compareTo(o2.getStakeMark()); + } + }); + if (dcDevices.size() > 0) { + dcDevices = dcDevices.subList(0, dcExecuteAction.getNumber()); + } + + } else { + // 下行 取最小的几个 + start.add("55"); + start.add("379"); + end.add(markArray[0]); + end.add(markArray[1]); + parameter.put("startStakeMark", start); + parameter.put("endStakeMark", end); + dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); + Collections.sort(dcDevices, new Comparator() { + @Override + public int compare(DcDevice o1, DcDevice o2) { + return o2.getStakeMark().compareTo(o1.getStakeMark()); + } + }); + // 需要对查出的设备,按照桩号进行排序从小到大 + if (dcDevices.size() > 0) { + dcDevices = dcDevices.subList(0, dcExecuteAction.getNumber()); + } + } + } + else { + // 最近公里数 + Integer kilometers = Integer.parseInt(markArray[0].replaceAll("K", "")); + // 根据事件桩号、公里数 计算出 桩号范围 + start.add(String.valueOf(kilometers - dcExecuteAction.getNumber())); + start.add(markArray[1]); + end.add(String.valueOf(kilometers + dcExecuteAction.getNumber())); + end.add(markArray[1]); + // 构造查询条件 + parameter.put("startStakeMark", start); + parameter.put("endStakeMark", end); + parameter.put("deviceType", dcExecuteAction.getDeviceType()); + // 根据桩号范围,查询附近设备 + dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); + } + + return dcDevices; + } + /** * 交通事件确定 @@ -291,6 +513,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 存储所有设备的执行结果 JSONArray resultArray = new JSONArray(); // 事件桩号 + stakeMark = stakeMark.replace("K",""); String[] markArray = stakeMark.split("\\+"); if (markArray[1].length() < 3) { // 不足三位 补零 @@ -304,95 +527,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { //获取事件预案中的 执行操作配置 dcEmergencyPlans.getDcExecuteAction() .forEach(dcExecuteAction -> { - Integer searchRule = dcExecuteAction.getSearchRule(); - List start = new ArrayList<>(); - List end = new ArrayList<>(); - // 设备列表 - List dcDevices = new ArrayList<>(); - Map parameter = new HashMap<>(); - parameter.put("deviceType", dcExecuteAction.getDeviceType()); - // 根据不同的检索规则条件 获取设备 - if (searchRule.equals(1)) { - // 指定设备资源 - // 根据设备id,获取设备集合 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - JSONObject otherConfig = JSON.parseObject(dcExecuteAction.getOtherConfig()); - List deviceList = (List)otherConfig.get("deviceList"); - queryWrapper.in(DcDevice::getIotDeviceId, deviceList); - dcDevices = dcDeviceService.list(queryWrapper); - } - else if (searchRule.equals(2)) { - - // 事件上游最近 - if (direction.equals("1")) { - // 上行 取最大的几个 - start.add("55"); - start.add("378.7"); - end.add(markArray[0]); - end.add(markArray[1]); - parameter.put("startStakeMark", start); - parameter.put("endStakeMark", end); - dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); - dcDevices = dcDevices.subList(dcDevices.size() - dcExecuteAction.getNumber(), dcDevices.size()); - } else { - // 下行 取最小的几个 - start.add(markArray[0]); - start.add(markArray[1]); - end.add("208"); - end.add("153.4"); - parameter.put("startStakeMark", start); - parameter.put("endStakeMark", end); - dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); - dcDevices = dcDevices.subList(0, dcExecuteAction.getNumber()); - } - -// // 定义Comparator来比较DcDevice对象的stakeMark字段 -// Comparator comparator = Comparator.comparing(DcDevice::getStakeMark); -// // 对dcDevices进行升序排序 -// Collections.sort(dcDevices, comparator); -// // 对dcDevices进行降序排序 -// Collections.sort(dcDevices, comparator.reversed()); - } - else if (searchRule.equals(3)) { - // 事件下游最近 - if (direction.equals("1")) { - // 上行 取最大的几个 - start.add(markArray[0]); - start.add(markArray[1]); - end.add("208"); - end.add("153.4"); - parameter.put("startStakeMark", start); - parameter.put("endStakeMark", end); - dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); - dcDevices = dcDevices.subList(0, dcExecuteAction.getNumber()); - - } else { - // 下行 取最小的几个 - start.add("55"); - start.add("378.7"); - end.add(markArray[0]); - end.add(markArray[1]); - parameter.put("startStakeMark", start); - parameter.put("endStakeMark", end); - dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); - dcDevices = dcDevices.subList(dcDevices.size() - dcExecuteAction.getNumber(), dcDevices.size()); - } - } - else { - // 最近公里数 - Integer kilometers = Integer.parseInt(markArray[0].replaceAll("K", "")); - // 根据事件桩号、公里数 计算出 桩号范围 - start.add(String.valueOf(kilometers - dcExecuteAction.getNumber())); - start.add(markArray[1]); - end.add(String.valueOf(kilometers + dcExecuteAction.getNumber())); - end.add(markArray[1]); - // 构造查询条件 - parameter.put("startStakeMark", start); - parameter.put("endStakeMark", end); - parameter.put("deviceType", dcExecuteAction.getDeviceType()); - // 根据桩号范围,查询附近设备 - dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); - } + List dcDevices = ruleFiltering(dcExecuteAction, markArray, direction); try { // 根据不通设备类型,执行不通的功能操作