diff --git a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/show/vo/AlarmVideoVo.java b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/show/vo/AlarmVideoVo.java new file mode 100644 index 0000000..c58f1f1 --- /dev/null +++ b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/show/vo/AlarmVideoVo.java @@ -0,0 +1,32 @@ +package com.hnac.hzims.alarm.show.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springblade.core.mp.support.QueryField; +import org.springblade.core.mp.support.SqlCondition; + +/** + * @author ysj + * @date 2023/03/17 10:02:33 + * @version 4.0.0 + */ +@Data +public class AlarmVideoVo { + + @ApiModelProperty("视频设备编码") + private String pointCode; + + @ApiModelProperty("视频名称") + @QueryField(condition = SqlCondition.LIKE) + private String videoName; + + @ApiModelProperty("视频服务器host") + private String videoHost; + + @ApiModelProperty("运管中心appSecret") + private String videoAppSecret; + + @ApiModelProperty("运管中心appKey") + private String videoAppKey; +} + diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/controller/ShowAlarmController.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/controller/ShowAlarmController.java index 2621f48..c1d24d0 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/controller/ShowAlarmController.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/controller/ShowAlarmController.java @@ -3,11 +3,11 @@ package com.hnac.hzims.alarm.show.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.hnac.hzims.alarm.config.entity.AlarmEntity; +import com.hnac.hzims.alarm.config.vo.AlarmCountVo; +import com.hnac.hzims.alarm.show.service.AlarmService; +import com.hnac.hzims.alarm.show.vo.AlarmVideoVo; import com.hnac.hzims.alarm.show.vo.ShowQueryVo; import com.hnac.hzims.alarm.source.service.SystemAlarmService; -import com.hnac.hzims.alarm.show.service.AlarmService; -import com.hnac.hzims.alarm.config.vo.AlarmCountVo; -import com.hnac.hzims.equipment.entity.EmVideoBandingEntity; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -56,12 +56,14 @@ public class ShowAlarmController extends BladeController { return R.data(alarmService.counts(showCount)); } - @GetMapping("/getVideosByStationAndRealId") + @GetMapping("/alarmVideos") @ApiOperationSupport(order = 4) @ApiOperation(value = "站点") - public R> getVideosByStationAndRealId(@ApiParam("站点编号") @RequestParam String stationCode, - @ApiParam("监测点ID") @RequestParam String realId) { - return R.data(alarmService.getVideosByStationAndRealId(stationCode,realId)); + public R> alarmVideos(@ApiParam("站点编号") @RequestParam(required = false) String stationCode, + @ApiParam("设备编号") @RequestParam(required = false) String deviceCode, + @ApiParam("监测点ID") @RequestParam(required = false) String realId, + @ApiParam("告警类型") @RequestParam Integer alarmType) { + return R.data(alarmService.alarmVideos(stationCode,deviceCode,realId,alarmType)); } } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java index 6aeed81..93b8ccc 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java @@ -3,9 +3,9 @@ package com.hnac.hzims.alarm.show.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.hnac.hzims.alarm.config.entity.AlarmEntity; import com.hnac.hzims.alarm.config.vo.AlarmCountVo; +import com.hnac.hzims.alarm.show.vo.AlarmVideoVo; import com.hnac.hzims.alarm.show.vo.ShowQueryVo; import com.hnac.hzims.business.ws.alart.vo.AlartParamVo; -import com.hnac.hzims.equipment.entity.EmVideoBandingEntity; import org.springblade.core.mp.base.BaseService; import org.springframework.web.socket.TextMessage; @@ -24,11 +24,5 @@ public interface AlarmService extends BaseService { TextMessage majorAlarm(AlartParamVo param); - /** - * 根据站点、realId 获取视频列表 - * @param stationCode 站点编号 - * @param realId hz3000点位信息 - * @return 视频列表 - */ - List getVideosByStationAndRealId(String stationCode,String realId); + List alarmVideos(String stationCode, String deviceCode, String realId,Integer alarmType); } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java index 92c67b5..16dbe36 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java @@ -1,44 +1,49 @@ package com.hnac.hzims.alarm.show.service.impl; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.hnac.hzims.alarm.config.service.AlarmConfigService; import com.hnac.hzims.alarm.config.constants.AlarmConstants; import com.hnac.hzims.alarm.config.entity.AlarmEntity; +import com.hnac.hzims.alarm.config.service.AlarmConfigService; +import com.hnac.hzims.alarm.config.vo.AlarmCountVo; +import com.hnac.hzims.alarm.config.vo.ChildAlarmCountVo; import com.hnac.hzims.alarm.show.mapper.AlarmMapper; import com.hnac.hzims.alarm.show.service.AlarmHandleService; import com.hnac.hzims.alarm.show.service.AlarmService; +import com.hnac.hzims.alarm.show.vo.AlarmVideoVo; import com.hnac.hzims.alarm.show.vo.ShowQueryVo; import com.hnac.hzims.alarm.source.service.MessageService; -import com.hnac.hzims.alarm.config.vo.AlarmCountVo; -import com.hnac.hzims.alarm.config.vo.ChildAlarmCountVo; import com.hnac.hzims.business.ws.alart.vo.AlartParamVo; import com.hnac.hzims.equipment.entity.EmInfoEntity; import com.hnac.hzims.equipment.entity.EmVideoBandingEntity; import com.hnac.hzims.equipment.feign.IEmInfoClient; import com.hnac.hzims.equipment.feign.IEmVideoClient; +import com.hnac.hzims.fdp.util.HttpRequestUtil; import com.hnac.hzims.message.dto.MailMessageDTO; import com.hnac.hzims.message.fegin.IMessageClient; import com.hnac.hzims.operational.station.entity.StationEntity; +import com.hnac.hzims.operational.station.entity.StationVideoTypeEntity; import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzinfo.sdk.v5.device.DeviceDataClient; +import com.hnac.hzims.operational.station.feign.IStationVideoTypeClient; import com.hnac.hzinfo.sdk.v5.device.client.DeviceClient; import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceAttrVO; -import com.hnac.hzinfo.sdk.v5.project.ProjectClient; -import lombok.AllArgsConstructor; +import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceEventVO; +import com.hnac.hzinfo.sdk.v5.device.vo.DeviceInstanceFuncVO; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.CollectionUtil; -import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.StringUtil; import org.springblade.system.user.entity.User; import org.springblade.system.user.feign.IUserClient; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; -import org.springframework.util.Assert; import org.springframework.web.socket.TextMessage; import java.util.*; @@ -47,7 +52,7 @@ import java.util.stream.Collectors; /** * @author ysj */ -@AllArgsConstructor +@RequiredArgsConstructor @Service @Slf4j public class AlarmServiceImpl extends BaseServiceImpl implements AlarmService { @@ -63,10 +68,18 @@ public class AlarmServiceImpl extends BaseServiceImpl private final IStationClient stationClient; private final IMessageClient messageClient; + private final IEmInfoClient emInfoClient; + private final DeviceClient deviceClient; + private final IEmVideoClient emVideoClient; + private final IStationVideoTypeClient stationVideoTypeClient; + + @Value("${hzims.url.getFaultGraphInfo}") + private String FAULTGRAPH_INFO_PATH; + /** * 查询告警列表 * @param showQuery @@ -234,7 +247,8 @@ public class AlarmServiceImpl extends BaseServiceImpl return new TextMessage(JSONObject.toJSONString(alarms.stream().sorted(Comparator.comparing(AlarmEntity::getAlarmTime).reversed()).collect(Collectors.toList()))); } - @Override + + /* @Override public List getVideosByStationAndRealId(String stationCode, String realId) { R stationR = stationClient.getStationByCode(stationCode); Assert.isTrue(stationR.isSuccess() && Func.isNotEmpty(stationR.getData()), () -> { @@ -250,8 +264,8 @@ public class AlarmServiceImpl extends BaseServiceImpl String emCodes = emInfoList.stream().parallel() .filter(this::isBandingVideoByEmCode) .filter(this::isDeviceCodeExist) + .filter(em -> this.isRealIdBanding(realId, em.getNumber())) .map(EmInfoEntity::getNumber) - .filter(number -> this.isRealIdBanding(realId, number)) .collect(Collectors.joining(",")); Assert.isTrue(StringUtil.isNotBlank(emCodes) && Func.isNotEmpty(emCodes), () -> { throw new ServiceException("未获取到设备!"); @@ -261,7 +275,7 @@ public class AlarmServiceImpl extends BaseServiceImpl throw new ServiceException("获取设备绑定视频列表失败!"); }); return videoListR.getData().stream().distinct().collect(Collectors.toList()); - } + }*/ /** * 验证设备编号是否绑定视频 @@ -279,9 +293,20 @@ public class AlarmServiceImpl extends BaseServiceImpl * @return 绑定结果 */ private Boolean isRealIdBanding(String realId,String emCode) { - R> deviceAttrR = deviceClient.getOnlineAttr(emCode); - if(deviceAttrR.isSuccess() && CollectionUtil.isNotEmpty(deviceAttrR.getData())) { - return deviceAttrR.getData().stream().anyMatch(attr -> realId.equals(attr.getFacDeviceAttrId())); + // 属性 + R> attrs = deviceClient.getOnlineAttr(emCode); + if(attrs.isSuccess() && CollectionUtil.isNotEmpty(attrs.getData())) { + return attrs.getData().stream().anyMatch(attr -> realId.equals(attr.getFacDeviceAttrId())); + } + // 事件 + R> events = deviceClient.getOnlineEvent(emCode); + if(events.isSuccess() && CollectionUtil.isNotEmpty(events.getData())) { + return events.getData().stream().anyMatch(event -> realId.equals(event.getFacDeviceEventId())); + } + // 功能 + R> funcs = deviceClient.getOnlineFunc(emCode); + if(funcs.isSuccess() && CollectionUtil.isNotEmpty(funcs.getData())) { + return funcs.getData().stream().anyMatch(func -> realId.equals(func.getFacDeviceFuncId())); } return false; } @@ -402,4 +427,164 @@ public class AlarmServiceImpl extends BaseServiceImpl } } } + + /** + * 获取告警视频信息 + * @param stationCode + * @param deviceCode + * @param realId + * @return + */ + @Override + public List alarmVideos(String stationCode, String deviceCode, String realId,Integer alarmType) { + // 步骤1、根据设备编号查询视频信息 + if(StringUtil.isNotBlank(deviceCode)){ + return this.deviceVideos(stationCode,deviceCode); + } + // 步骤2、根据采集点查询视频信息 + if(StringUtil.isNotBlank(realId)){ + // 智能预警 + if(AlarmConstants.EARLY.equals(alarmType)){ + return this.earlyVideos(stationCode,realId); + // 通讯中断、通讯异常查询站点视频 + }else if(AlarmConstants.INTERRUPT.equals(alarmType) || AlarmConstants.ABNORMAL.equals(alarmType)){ + return this.stationVideos(stationCode); + // 其他告警 + }else{ + return this.realIdVideos(stationCode,realId); + } + } + // 步骤3.根据站点编号查询视频信息 + if(StringUtil.isNotBlank(stationCode)){ + return this.stationVideos(stationCode); + } + throw new ServiceException("未查询到告警视频信息!"); + } + + /** + *查询站点绑定视频信息 + * @param stationCode + */ + private List stationVideos(String stationCode) { + List videos = stationVideoTypeClient.listByStationId(stationCode); + if(CollectionUtil.isEmpty(videos)){ + throw new ServiceException("站点暂无视频信息!"); + + } + return videos.stream().distinct().map(video->{ + AlarmVideoVo alarmVideo = new AlarmVideoVo(); + alarmVideo.setVideoHost(video.getVideoHost()); + alarmVideo.setVideoName(video.getName()); + alarmVideo.setVideoAppKey(video.getAppKey()); + alarmVideo.setVideoAppSecret(video.getAppSecret()); + alarmVideo.setPointCode(video.getPointCode()); + return alarmVideo; + }).collect(Collectors.toList()); + } + + + /** + * 查询设备绑定视频信息 + * @param deviceCode + * @return + */ + private List deviceVideos(String stationCode,String deviceCode) { + // 查询设备绑定视频点位 + R> videos = emVideoClient.getEmBandingVideos(deviceCode); + if(!videos.isSuccess() || CollectionUtil.isEmpty(videos.getData())){ + // 查询站点 + R station = stationClient.getStationByCode(stationCode); + if(!station.isSuccess() || ObjectUtil.isEmpty(station.getData())){ + throw new ServiceException("未查询到设备绑定视频信息!"); + } + // 查询设备 + R device = emInfoClient.getEmInfoByEmCode(deviceCode); + if(!device.isSuccess() || ObjectUtil.isEmpty(device.getData())){ + throw new ServiceException("未查询到设备绑定视频信息!"); + } + throw new ServiceException("请在设备信息菜单绑定" + station.getData().getName() + "-" + device.getData().getName() + "视频信息!"); + } + return videos.getData().stream().distinct().map(video->{ + AlarmVideoVo alarmVideo = new AlarmVideoVo(); + alarmVideo.setVideoHost(video.getVideoHost()); + alarmVideo.setVideoName(video.getVideoName()); + alarmVideo.setVideoAppKey(video.getVideoAppKey()); + alarmVideo.setVideoAppSecret(video.getVideoAppSecret()); + alarmVideo.setPointCode(video.getPointCode()); + return alarmVideo; + }).collect(Collectors.toList()); + } + + /** + * 查询智能预警视频信息 + * @param stationCode + * @param faultId + */ + private List earlyVideos(String stationCode, String faultId) { + // 调用FDP接口查询设备编号 + Map param = new HashMap<>(); + param.put("faultId", faultId); + String result = HttpRequestUtil.postCall(param, FAULTGRAPH_INFO_PATH, "POST"); + if (StringUtil.isBlank(result)) { + throw new ServiceException("未查询到智能预警设备信息!"); + } + HashMap map = JSONObject.parseObject(result, new TypeReference>() { + }); + if (ObjectUtil.isEmpty(map)) { + throw new ServiceException("未查询到智能预警设备信息!"); + } + List> data = JSONObject.parseObject(MapUtils.getString(map, "data"), new TypeReference>>() { + }); + if (CollectionUtil.isEmpty(data)) { + throw new ServiceException("未查询到智能预警设备信息!"); + } + String deviceCode = (String) data.get(0).get("TAOS_INSTANCE"); + if(StringUtil.isBlank(deviceCode)){ + throw new ServiceException("未查询到智能预警设备信息!"); + } + return this.deviceVideos(stationCode,deviceCode); + } + + /** + * 查询采集点绑定视频信息 + * @param stationCode + * @param realId + */ + private List realIdVideos(String stationCode, String realId) { + // 查询站点 + R station = stationClient.getStationByCode(stationCode); + if(!station.isSuccess() || ObjectUtil.isEmpty(station)){ + throw new ServiceException("未查询到告警采集点绑定视频信息!"); + } + EmInfoEntity param = new EmInfoEntity(); + param.setDepartment(station.getData().getRefDept()); + // 查询设备 + R> devices = emInfoClient.emInfoList(param); + if(!devices.isSuccess() || CollectionUtil.isEmpty(devices.getData())){ + throw new ServiceException("未查询到告警采集点绑定视频信息!"); + } + String deviceCodes = devices.getData().stream().parallel() + .filter(this::isBandingVideoByEmCode) + .filter(this::isDeviceCodeExist) + .map(EmInfoEntity::getNumber) + .filter(number -> this.isRealIdBanding(realId, number)) + .collect(Collectors.joining(",")); + if(StringUtil.isEmpty(deviceCodes)){ + throw new ServiceException("未查询到告警采集点绑定视频信息!"); + } + // 查询设备绑定视频点位 + R> videos = emVideoClient.getEmBandingVideos(deviceCodes); + if(!videos.isSuccess() || CollectionUtil.isEmpty(videos.getData())){ + throw new ServiceException("请在设备信息菜单绑定" + station.getData().getName() + "的设备视频绑定信息!"); + } + return videos.getData().stream().distinct().map(video->{ + AlarmVideoVo alarmVideo = new AlarmVideoVo(); + alarmVideo.setVideoHost(video.getVideoHost()); + alarmVideo.setVideoName(video.getVideoName()); + alarmVideo.setVideoAppKey(video.getVideoAppKey()); + alarmVideo.setVideoAppSecret(video.getVideoAppSecret()); + alarmVideo.setPointCode(video.getPointCode()); + return alarmVideo; + }).collect(Collectors.toList()); + } } \ No newline at end of file