From c88b0a8bd61546651c71734f299028acf692901b Mon Sep 17 00:00:00 2001 From: mk1990 <37614016+mk1990@users.noreply.github.com> Date: 星期二, 26 四月 2022 15:32:23 +0800 Subject: [PATCH] Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java | 13 web_src/src/components/service/MediaServer.js | 4 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java | 109 + src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 12 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java | 4 web_src/package-lock.json | 597 ++++++-- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java | 12 web_src/index.html | 20 web_src/src/components/common/MapComponent.vue | 257 +++ src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java | 2 web_src/src/layout/index.vue | 24 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java | 6 src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java | 13 src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java | 1 src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java | 2 web_src/src/components/DeviceList.vue | 2 src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java | 5 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java | 62 web_src/src/components/live.vue | 563 +++---- src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java | 46 web_src/package.json | 3 src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java | 69 README.md | 2 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 5 web_src/static/images/gis/camera3.png | 0 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java | 11 web_src/static/images/gis/camera-offline.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java | 1 web_src/src/router/index.js | 29 web_src/src/components/dialog/queryTrace.vue | 100 + web_src/src/layout/UiHeader.vue | 2 web_src/static/images/arrow.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java | 24 web_src/static/images/gis/camera2.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java | 3 src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java | 6 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java | 13 web_src/src/components/service/DeviceService.js | 123 + web_src/src/App.vue | 20 web_src/src/components/common/DeviceTree.vue | 160 ++ src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 108 + web_src/static/images/gis/camera3-offline.png | 0 pom.xml | 2 web_src/static/images/gis/camera1.png | 0 web_src/src/components/devicePosition.vue | 682 ++++----- src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java | 14 src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 6 web_src/src/components/dialog/devicePlayer.vue | 4 web_src/static/images/gis/camera1-offline.png | 0 web_src/static/images/gis/camera2-offline.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java | 126 + src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java | 8 src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java | 2 web_src/static/css/iconfont.css | 48 src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java | 25 web_src/static/images/gis/camera.png | 0 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java | 13 /dev/null | 316 ---- web_src/static/css/iconfont.woff2 | 0 web_src/src/components/dialog/channelMapInfobox.vue | 65 web_src/src/components/common/jessibuca.vue | 309 ++++ src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java | 55 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java | 2 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java | 18 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 16 67 files changed, 2,825 insertions(+), 1,331 deletions(-) diff --git a/README.md b/README.md index aec9555..ee03012 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,8 @@ QQ缇�: 901799015, ZLM浣跨敤鏂囨。[https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit) QQ绉佷俊涓�鑸笉鍥�, 绮惧姏鏈夐檺.娆㈣繋澶у鍦ㄧ兢閲岃璁�.瑙夊緱椤圭洰瀵逛綘鏈夊府鍔╋紝娆㈣繋star鍜屾彁浜r銆� +# 鎺堟潈鍗忚 +鏈」鐩嚜鏈変唬鐮佷娇鐢ㄥ鏉剧殑MIT鍗忚锛屽湪淇濈暀鐗堟潈淇℃伅鐨勬儏鍐典笅鍙互鑷敱搴旂敤浜庡悇鑷晢鐢ㄣ�侀潪鍟嗕笟鐨勯」鐩�� 浣嗘槸鏈」鐩篃闆剁鐨勪娇鐢ㄤ簡涓�浜涘叾浠栫殑寮�婧愪唬鐮侊紝鍦ㄥ晢鐢ㄧ殑鎯呭喌涓嬭鑷鏇夸唬鎴栧墧闄わ紱 鐢变簬浣跨敤鏈」鐩�屼骇鐢熺殑鍟嗕笟绾犵悍鎴栦镜鏉冭涓轰竴姒備笌鏈」鐩強寮�鍙戣�呮棤鍏筹紝璇疯嚜琛屾壙鎷呮硶寰嬮闄┿�� 鍦ㄤ娇鐢ㄦ湰椤圭洰浠g爜鏃讹紝涔熷簲璇ュ湪鎺堟潈鍗忚涓悓鏃惰〃鏄庢湰椤圭洰渚濊禆鐨勭涓夋柟搴撶殑鍗忚 # 鑷磋阿 鎰熻阿浣滆�匸澶忔](https://github.com/xia-chu) 鎻愪緵杩欎箞妫掔殑寮�婧愭祦濯掍綋鏈嶅姟妗嗘灦,骞跺湪寮�鍙戣繃绋嬩腑缁欎簣鏀寔涓庡府鍔┿�� diff --git a/pom.xml b/pom.xml index befb74f..34a07e1 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ <groupId>com.genersoft</groupId> <artifactId>wvp-pro</artifactId> - <version>2.1.1</version> + <version>2.2.1</version> <name>web video platform</name> <description>鍥芥爣28181瑙嗛骞冲彴</description> diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java index e1d7c49..ef4492f 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java +++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java @@ -87,9 +87,12 @@ // 绉诲姩浣嶇疆璁㈤槄閫氱煡 public static final String VM_MSG_SUBSCRIBE_MOBILE_POSITION = "mobileposition"; - // 鎶ヨ璁㈤槄鐨勯�氱煡 + // 鎶ヨ璁㈤槄鐨勯�氱煡锛堟敹鍒版姤璀﹀悜redis鍙戝嚭閫氱煡锛� public static final String VM_MSG_SUBSCRIBE_ALARM = "alarm"; + // 鎶ヨ閫氱煡鐨勫彂閫� 锛堟敹鍒皉edis鍙戝嚭鐨勯�氱煡锛岃浆鍙戠粰鍏朵粬骞冲彴锛� + public static final String VM_MSG_SUBSCRIBE_ALARM_RECEIVE= "alarm_receive"; + // 璁惧鐘舵�佽闃呯殑閫氱煡 public static final String VM_MSG_SUBSCRIBE_DEVICE_STATUS = "device"; diff --git a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java index d46a8ea..6b45eb5 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/RedisConfig.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.conf; import com.genersoft.iot.vmp.common.VideoManagerConstants; +import com.genersoft.iot.vmp.service.impl.RedisAlarmMsgListener; import com.genersoft.iot.vmp.service.impl.RedisGPSMsgListener; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +49,9 @@ @Autowired private RedisGPSMsgListener redisGPSMsgListener; + @Autowired + private RedisAlarmMsgListener redisAlarmMsgListener; + @Bean public JedisPool jedisPool() { if (StringUtils.isBlank(password)) { @@ -93,6 +97,7 @@ RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(redisGPSMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_GPS)); + container.addMessageListener(redisAlarmMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM_RECEIVE)); return container; } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java index 6fa802d..bbc946b 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java @@ -29,7 +29,7 @@ Integer registerTimeInterval = 120; - private boolean alarm = false; + private boolean alarm; public void setIp(String ip) { this.ip = ip; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java new file mode 100644 index 0000000..96d25c4 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java @@ -0,0 +1,46 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +/** + * 閫氳繃redis鍒嗗彂鎶ヨ娑堟伅 + */ +public class AlarmChannelMessage { + /** + * 鍥芥爣缂栧彿 + */ + private String gbId; + + /** + * 鎶ヨ缂栧彿 + */ + private int alarmSn; + + + /** + * 鎶ヨ鎻忚堪 + */ + private String alarmDescription; + + public String getGbId() { + return gbId; + } + + public void setGbId(String gbId) { + this.gbId = gbId; + } + + public int getAlarmSn() { + return alarmSn; + } + + public void setAlarmSn(int alarmSn) { + this.alarmSn = alarmSn; + } + + public String getAlarmDescription() { + return alarmDescription; + } + + public void setAlarmDescription(String alarmDescription) { + this.alarmDescription = alarmDescription; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java index 8176c1c..530bce2 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java @@ -50,7 +50,30 @@ private double latitude; /** - * 鎶ヨ绫诲瀷 + * 鎶ヨ绫诲瀷, + * 鎶ヨ鏂瑰紡涓�2鏃�,涓嶆惡甯� AlarmType涓洪粯璁ょ殑鎶ヨ璁惧鎶ヨ, + * 鎼哄甫 AlarmType鍙栧�煎強瀵瑰簲鎶ヨ绫诲瀷濡備笅: + * 1-瑙嗛涓㈠け鎶ヨ; + * 2-璁惧闃叉媶鎶ヨ; + * 3-瀛樺偍璁惧纾佺洏婊℃姤璀�; + * 4-璁惧楂樻俯鎶ヨ; + * 5-璁惧浣庢俯鎶ヨ銆� + * 鎶ヨ鏂瑰紡涓�5鏃�,鍙栧�煎涓�: + * 1-浜哄伐瑙嗛鎶ヨ; + * 2-杩愬姩鐩爣妫�娴嬫姤璀�; + * 3-閬楃暀鐗╂娴嬫姤璀�; + * 4-鐗╀綋绉婚櫎妫�娴嬫姤璀�; + * 5-缁婄嚎妫�娴嬫姤璀�; + * 6-鍏ヤ镜妫�娴嬫姤璀�; + * 7-閫嗚妫�娴嬫姤璀�; + * 8-寰樺緤妫�娴嬫姤璀�; + * 9-娴侀噺缁熻鎶ヨ; + * 10-瀵嗗害妫�娴嬫姤璀�; + * 11-瑙嗛寮傚父妫�娴嬫姤璀�; + * 12-蹇�熺Щ鍔ㄦ姤璀︺�� + * 鎶ヨ鏂瑰紡涓�6鏃�,鍙栧�间笅: + * 1-瀛樺偍璁惧纾佺洏鏁呴殰鎶ヨ; + * 2-瀛樺偍璁惧椋庢墖鏁呴殰鎶ヨ銆� */ private String alarmType; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 1e6ef77..95576f3 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -4,7 +4,7 @@ /** - * 鏁版嵁搴撹嚜璧營D + * 鏁版嵁搴撹嚜澧濱D */ private int id; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java index feb6a72..1958b44 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java @@ -25,6 +25,9 @@ this.callId = callIdHeader.getCallId(); } + public SubscribeInfo() { + } + private String id; private int expires; private String callId; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java index e0e4a27..ef78d37 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/KeepaliveTimeoutListenerForPlatform.java @@ -52,7 +52,6 @@ public void onMessage(Message message, byte[] pattern) { // 鑾峰彇澶辨晥鐨刱ey String expiredKey = message.toString(); - logger.debug(expiredKey); // 骞冲彴蹇冭烦鍒版湡,闇�瑕侀噸鍙�, 鍒ゆ柇鏄惁宸茬粡澶氭鏈敹鍒板績璺冲洖澶�, 澶氭鏈敹鍒�,鍒欓噸鏂板彂璧锋敞鍐�, 娉ㄥ唽灏濊瘯澶氭鏈緱鍒板洖澶�,鍒欒涓哄钩鍙扮绾� String PLATFORM_KEEPLIVEKEY_PREFIX = VideoManagerConstants.PLATFORM_KEEPALIVE_PREFIX + userSetting.getServerId() + "_"; String PLATFORM_REGISTER_PREFIX = VideoManagerConstants.PLATFORM_REGISTER_PREFIX + userSetting.getServerId() + "_"; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java index b7992e4..4633256 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/offline/OfflineEventListener.java @@ -57,10 +57,8 @@ @Override public void onApplicationEvent(OfflineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("璁惧绂荤嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("璁惧绂荤嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDeviceId() + ",from:" + event.getFrom()); String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDeviceId(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java index b97457a..1fc1e46 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java @@ -59,10 +59,8 @@ @Override public void onApplicationEvent(OnlineEvent event) { - - if (logger.isDebugEnabled()) { - logger.debug("璁惧涓婄嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); - } + + logger.info("璁惧涓婄嚎浜嬩欢瑙﹀彂锛宒eviceId锛�" + event.getDevice().getDeviceId() + ",from:" + event.getFrom()); Device device = event.getDevice(); if (device == null) return; String key = VideoManagerConstants.KEEPLIVEKEY_PREFIX + userSetting.getServerId() + "_" + event.getDevice().getDeviceId(); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java index b2eb7ea..4965026 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordEndEventListener.java @@ -31,10 +31,8 @@ private Map<String, RecordEndEventHandler> handlerMap = new HashMap<>(); @Override public void onApplicationEvent(RecordEndEvent event) { - if (logger.isDebugEnabled()) { - logger.debug("褰曞儚鏌ヨ瀹屾垚浜嬩欢瑙﹀彂锛宒eviceId锛歿}, channelId: {}, 褰曞儚鏁伴噺{}鏉�", event.getRecordInfo().getDeviceId(), - event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); - } + logger.info("褰曞儚鏌ヨ瀹屾垚浜嬩欢瑙﹀彂锛宒eviceId锛歿}, channelId: {}, 褰曞儚鏁伴噺{}鏉�", event.getRecordInfo().getDeviceId(), + event.getRecordInfo().getChannelId(), event.getRecordInfo().getSumNum() ); if (handlerMap.size() > 0) { for (RecordEndEventHandler recordEndEventHandler : handlerMap.values()) { recordEndEventHandler.handler(event.getRecordInfo()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java index f9ef10c..019baf9 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java @@ -64,7 +64,7 @@ subscribe = subscribeHolder.getCatalogSubscribe(event.getPlatformId()); if (subscribe == null) { - logger.debug("鍙戦�佽闃呮秷鎭椂鍙戠幇璁㈤槄淇℃伅宸茬粡涓嶅瓨鍦�"); + logger.info("鍙戦�佽闃呮秷鎭椂鍙戠幇璁㈤槄淇℃伅宸茬粡涓嶅瓨鍦�"); return; } }else { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java index aea37b6..a8fae0f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java @@ -1,8 +1,7 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; import com.genersoft.iot.vmp.common.StreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; @@ -336,4 +335,13 @@ * @param cmdString 鍓嶇鎺у埗鎸囦护涓� */ boolean dragZoomCmd(Device device, String channelId, String cmdString); + + + /** + * 鍚戣澶囧彂閫佹姤璀OTIFY娑堟伅锛� 鐢ㄤ簬浜掕仈缁撴瀯涓嬶紝姝ゆ椂灏嗚澶囧綋鎴愪竴涓钩绾у钩鍙扮湅寰� + * @param device 璁惧 + * @param deviceAlarm 鎶ヨ淇℃伅淇℃伅 + * @return + */ + boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java index a900819..7007e5a 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java @@ -1,9 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.cmd; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; -import com.genersoft.iot.vmp.gb28181.bean.RecordInfo; -import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; @@ -76,6 +73,14 @@ boolean sendNotifyMobilePosition(ParentPlatform parentPlatform, GPSMsgInfo gpsMsgInfo, SubscribeInfo subscribeInfo); /** + * 鍚戜笂绾у洖澶嶆姤璀︽秷鎭� + * @param parentPlatform 骞冲彴淇℃伅 + * @param deviceAlarm 鎶ヨ淇℃伅淇℃伅 + * @return + */ + boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm); + + /** * 鍥炲catalog浜嬩欢-澧炲姞/鏇存柊 * @param parentPlatform * @param deviceChannels diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 89e70d0..3fcf2fb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -5,10 +5,7 @@ import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetting; -import com.genersoft.iot.vmp.gb28181.bean.Device; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; @@ -23,6 +20,7 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import gov.nist.javax.sip.SipProviderImpl; import gov.nist.javax.sip.SipStackImpl; +import gov.nist.javax.sip.message.MessageFactoryImpl; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.stack.SIPDialog; import org.slf4j.Logger; @@ -35,10 +33,7 @@ import javax.sip.*; import javax.sip.address.SipURI; -import javax.sip.header.CallIdHeader; -import javax.sip.header.ContentTypeHeader; -import javax.sip.header.ExpiresHeader; -import javax.sip.header.ViaHeader; +import javax.sip.header.*; import javax.sip.message.Request; import java.lang.reflect.Field; import java.text.ParseException; @@ -1777,4 +1772,101 @@ e.printStackTrace(); } } + + @Override + public boolean sendAlarmMessage(Device device, DeviceAlarm deviceAlarm) { + if (device == null) { + return false; + } + logger.info("[鍙戦�� 鎶ヨ閫氱煡] {}/{}->{},{}", device.getDeviceId(), deviceAlarm.getChannelId(), + deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); + try { + String characterSet = device.getCharset(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Notify>\r\n"); + deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); + deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); + deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); + deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); + deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); + deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); + deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); + deviceStatusXml.append("<info>\r\n"); + deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); + deviceStatusXml.append("</info>\r\n"); + deviceStatusXml.append("</Notify>\r\n"); + + CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + String tm = Long.toString(System.currentTimeMillis()); + Request request = headerProvider.createMessageRequest(device, deviceStatusXml.toString(), "z9hG4bK-ViaPtz-" + tm, "FromPtz" + tm, null, callIdHeader); + transmitRequest(device, request); + + + } catch (SipException | ParseException e) { + e.printStackTrace(); + return false; + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } + return true; + } + + private void sendNotify(Device device, String catalogXmlContent, + SubscribeInfo subscribeInfo, SipSubscribe.Event errorEvent, SipSubscribe.Event okEvent ) + throws NoSuchFieldException, IllegalAccessException, SipException, ParseException { + MessageFactoryImpl messageFactory = (MessageFactoryImpl) sipFactory.createMessageFactory(); + String characterSet = device.getCharset(); + // 璁剧疆缂栫爜锛� 闃叉涓枃涔辩爜 + messageFactory.setDefaultContentEncodingCharset(characterSet); + Dialog dialog = subscribeInfo.getDialog(); + if (dialog == null || !dialog.getState().equals(DialogState.CONFIRMED)) return; + SIPRequest notifyRequest = (SIPRequest)dialog.createRequest(Request.NOTIFY); + ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("Application", "MANSCDP+xml"); + notifyRequest.setContent(catalogXmlContent, contentTypeHeader); + + SubscriptionStateHeader subscriptionState = sipFactory.createHeaderFactory() + .createSubscriptionStateHeader(SubscriptionStateHeader.ACTIVE); + notifyRequest.addHeader(subscriptionState); + + EventHeader event = sipFactory.createHeaderFactory().createEventHeader(subscribeInfo.getEventType()); + if (subscribeInfo.getEventId() != null) { + event.setEventId(subscribeInfo.getEventId()); + } + notifyRequest.addHeader(event); + + SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); + if (subscribeInfo.getTransaction() != null) { + SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); + sipURI.setHost(request.getRemoteAddress().getHostAddress()); + sipURI.setPort(request.getRemotePort()); + }else { + sipURI.setHost(device.getIp()); + sipURI.setPort(device.getPort()); + } + + ClientTransaction transaction = null; + if ("TCP".equals(device.getTransport())) { + transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); + } else if ("UDP".equals(device.getTransport())) { + transaction = udpSipProvider.getNewClientTransaction(notifyRequest); + } + // 娣诲姞閿欒璁㈤槄 + if (errorEvent != null) { + sipSubscribe.addErrorSubscribe(subscribeInfo.getCallId(), errorEvent); + } + // 娣诲姞璁㈤槄 + if (okEvent != null) { + sipSubscribe.addOkSubscribe(subscribeInfo.getCallId(), okEvent); + } + if (transaction == null) { + logger.error("骞冲彴{}鐨凾ransport閿欒锛歿}",device.getDeviceId(), device.getTransport()); + return; + } + dialog.sendRequest(transaction); + + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java index 0fd8cc5..66af757 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java @@ -436,6 +436,48 @@ } @Override + public boolean sendAlarmMessage(ParentPlatform parentPlatform, DeviceAlarm deviceAlarm) { + if (parentPlatform == null) { + return false; + } + logger.info("[鍙戦�� 鎶ヨ璁㈤槄] {}/{}->{},{}", parentPlatform.getServerGBId(), deviceAlarm.getChannelId(), + deviceAlarm.getLongitude(), deviceAlarm.getLatitude()); + try { + String characterSet = parentPlatform.getCharacterSet(); + StringBuffer deviceStatusXml = new StringBuffer(600); + deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n"); + deviceStatusXml.append("<Notify>\r\n"); + deviceStatusXml.append("<CmdType>Alarm</CmdType>\r\n"); + deviceStatusXml.append("<SN>" + (int)((Math.random()*9+1)*100000) + "</SN>\r\n"); + deviceStatusXml.append("<DeviceID>" + deviceAlarm.getChannelId() + "</DeviceID>\r\n"); + deviceStatusXml.append("<AlarmPriority>" + deviceAlarm.getAlarmPriority() + "</AlarmPriority>\r\n"); + deviceStatusXml.append("<AlarmMethod>" + deviceAlarm.getAlarmMethod() + "</AlarmMethod>\r\n"); + deviceStatusXml.append("<AlarmTime>" + deviceAlarm.getAlarmTime() + "</AlarmTime>\r\n"); + deviceStatusXml.append("<AlarmDescription>" + deviceAlarm.getAlarmDescription() + "</AlarmDescription>\r\n"); + deviceStatusXml.append("<Longitude>" + deviceAlarm.getLongitude() + "</Longitude>\r\n"); + deviceStatusXml.append("<Latitude>" + deviceAlarm.getLatitude() + "</Latitude>\r\n"); + deviceStatusXml.append("<info>\r\n"); + deviceStatusXml.append("<AlarmType>" + deviceAlarm.getAlarmType() + "</AlarmType>\r\n"); + deviceStatusXml.append("</info>\r\n"); + deviceStatusXml.append("</Notify>\r\n"); + + CallIdHeader callIdHeader = parentPlatform.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId() + : udpSipProvider.getNewCallId(); + + String tm = Long.toString(System.currentTimeMillis()); + Request request = headerProviderPlarformProvider.createMessageRequest(parentPlatform, deviceStatusXml.toString(), "FromPtz" + tm, callIdHeader); + transmitRequest(parentPlatform, request); + + } catch (SipException | ParseException e) { + e.printStackTrace(); + return false; + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } + return true; + } + + @Override public boolean sendNotifyForCatalogAddOrUpdate(String type, ParentPlatform parentPlatform, List<DeviceChannel> deviceChannels, SubscribeInfo subscribeInfo, Integer index) { if (parentPlatform == null || deviceChannels == null || deviceChannels.size() == 0 || subscribeInfo == null) { return false; @@ -495,11 +537,16 @@ event.setEventId(subscribeInfo.getEventId()); } notifyRequest.addHeader(event); - SipURI sipURI = (SipURI) notifyRequest.getRequestURI(); - SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); - sipURI.setHost(request.getRemoteAddress().getHostAddress()); - sipURI.setPort(request.getRemotePort()); + if (subscribeInfo.getTransaction() != null) { + SIPRequest request = (SIPRequest) subscribeInfo.getTransaction().getRequest(); + sipURI.setHost(request.getRemoteAddress().getHostAddress()); + sipURI.setPort(request.getRemotePort()); + }else { + sipURI.setHost(parentPlatform.getServerIP()); + sipURI.setPort(parentPlatform.getServerPort()); + } + ClientTransaction transaction = null; if ("TCP".equals(parentPlatform.getTransport())) { transaction = tcpSipProvider.getNewClientTransaction(notifyRequest); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java index 8e03510..420f899 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java @@ -13,6 +13,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor; import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.SipUtils; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; @@ -149,11 +150,12 @@ logger.info("[鏀跺埌 绉诲姩浣嶇疆璁㈤槄]锛歿}/{}->{}.{}", mobilePosition.getDeviceId(), mobilePosition.getChannelId(), mobilePosition.getLongitude(), mobilePosition.getLatitude()); mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } @@ -223,12 +225,12 @@ mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java index 302ceda..e5d7aa0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.cmd; +import com.alibaba.fastjson.JSON; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.gb28181.bean.*; @@ -8,8 +9,10 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.service.IDeviceAlarmService; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; import org.dom4j.Element; @@ -20,7 +23,12 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; +import javax.sip.InvalidArgumentException; import javax.sip.RequestEvent; +import javax.sip.SipException; +import javax.sip.message.Response; + +import java.text.ParseException; import static com.genersoft.iot.vmp.gb28181.utils.XmlUtil.*; @@ -46,6 +54,9 @@ private IVideoManagerStorage storager; @Autowired + private IRedisCatchStorage redisCatchStorage; + + @Autowired private IDeviceAlarmService deviceAlarmService; @Autowired @@ -58,11 +69,22 @@ @Override public void handForDevice(RequestEvent evt, Device device, Element rootElement) { - if (!sipConfig.isAlarm()) { - return; + logger.info("鏀跺埌鏉ヨ嚜璁惧[{}]鐨勬姤璀﹂�氱煡", device.getDeviceId()); + // 鍥炲200 OK + try { + responseAck(evt, Response.OK); + } catch (SipException e) { + throw new RuntimeException(e); + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); } + Element deviceIdElement = rootElement.element("DeviceID"); String channelId = deviceIdElement.getText().toString(); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); deviceAlarm.setDeviceId(device.getDeviceId()); deviceAlarm.setChannelId(channelId); @@ -93,12 +115,12 @@ mobilePosition.setLongitude(deviceAlarm.getLongitude()); mobilePosition.setLatitude(deviceAlarm.getLatitude()); mobilePosition.setReportSource("GPS Alarm"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } @@ -110,9 +132,24 @@ deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); } } + + if (channelId.equals(sipConfig.getId())) { + // 鍙戦�佺粰骞冲彴鐨勬姤璀︿俊鎭�� 鍙戦�乺edis閫氱煡 + AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); + alarmChannelMessage.setAlarmSn(Integer.parseInt(deviceAlarm.getAlarmMethod())); + alarmChannelMessage.setAlarmDescription(deviceAlarm.getAlarmDescription()); + alarmChannelMessage.setGbId(channelId); + redisCatchStorage.sendAlarmMsg(alarmChannelMessage); + + return; + } + logger.debug("瀛樺偍鎶ヨ淇℃伅銆佹姤璀﹀垎绫�"); // 瀛樺偍鎶ヨ淇℃伅銆佹姤璀﹀垎绫� - deviceAlarmService.add(deviceAlarm); + if (sipConfig.isAlarm()) { + deviceAlarmService.add(deviceAlarm); + } + if (offLineDetector.isOnline(device.getDeviceId())) { publisher.deviceAlarmEventPublish(deviceAlarm); @@ -120,7 +157,59 @@ } @Override - public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element element) { + public void handForPlatform(RequestEvent evt, ParentPlatform parentPlatform, Element rootElement) { + logger.info("鏀跺埌鏉ヨ嚜骞冲彴[{}]鐨勬姤璀﹂�氱煡", parentPlatform.getServerGBId()); + // 鍥炲200 OK + try { + responseAck(evt, Response.OK); + } catch (SipException e) { + throw new RuntimeException(e); + } catch (InvalidArgumentException e) { + throw new RuntimeException(e); + } catch (ParseException e) { + throw new RuntimeException(e); + } + Element deviceIdElement = rootElement.element("DeviceID"); + String channelId = deviceIdElement.getText().toString(); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setDeviceId(parentPlatform.getServerGBId()); + deviceAlarm.setChannelId(channelId); + deviceAlarm.setAlarmPriority(getText(rootElement, "AlarmPriority")); + deviceAlarm.setAlarmMethod(getText(rootElement, "AlarmMethod")); + deviceAlarm.setAlarmTime(getText(rootElement, "AlarmTime")); + if (getText(rootElement, "AlarmDescription") == null) { + deviceAlarm.setAlarmDescription(""); + } else { + deviceAlarm.setAlarmDescription(getText(rootElement, "AlarmDescription")); + } + if (NumericUtil.isDouble(getText(rootElement, "Longitude"))) { + deviceAlarm.setLongitude(Double.parseDouble(getText(rootElement, "Longitude"))); + } else { + deviceAlarm.setLongitude(0.00); + } + if (NumericUtil.isDouble(getText(rootElement, "Latitude"))) { + deviceAlarm.setLatitude(Double.parseDouble(getText(rootElement, "Latitude"))); + } else { + deviceAlarm.setLatitude(0.00); + } + + if (!StringUtils.isEmpty(deviceAlarm.getAlarmMethod())) { + + if (deviceAlarm.getAlarmMethod().equals("5")) { + deviceAlarm.setAlarmType(getText(rootElement.element("Info"), "AlarmType")); + } + } + + if (channelId.equals(parentPlatform.getDeviceGBId())) { + // 鍙戦�佺粰骞冲彴鐨勬姤璀︿俊鎭�� 鍙戦�乺edis閫氱煡 + AlarmChannelMessage alarmChannelMessage = new AlarmChannelMessage(); + alarmChannelMessage.setAlarmSn(Integer.parseInt(deviceAlarm.getAlarmMethod())); + alarmChannelMessage.setAlarmDescription(deviceAlarm.getAlarmDescription()); + alarmChannelMessage.setGbId(channelId); + redisCatchStorage.sendAlarmMsg(alarmChannelMessage); + return; + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java index 471b2d7..2a53a3f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MobilePositionNotifyMessageHandler.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.notify.NotifyMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java index 92d0114..910524d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java @@ -12,6 +12,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.gb28181.utils.XmlUtil; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; @@ -199,12 +200,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(deviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java index dca2866..b070ed5 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/MobilePositionResponseMessageHandler.java @@ -8,6 +8,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler; import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.response.ResponseMessageHandler; +import com.genersoft.iot.vmp.gb28181.utils.Coordtransform; import com.genersoft.iot.vmp.gb28181.utils.NumericUtil; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.utils.GpsUtil; @@ -79,12 +80,12 @@ mobilePosition.setAltitude(0.0); } mobilePosition.setReportSource("Mobile Position"); - BaiduPoint bp = new BaiduPoint(); - bp = GpsUtil.Wgs84ToBd09(String.valueOf(mobilePosition.getLongitude()), String.valueOf(mobilePosition.getLatitude())); - logger.info("鐧惧害鍧愭爣锛�" + bp.getBdLng() + ", " + bp.getBdLat()); - mobilePosition.setGeodeticSystem("BD-09"); - mobilePosition.setCnLng(bp.getBdLng()); - mobilePosition.setCnLat(bp.getBdLat()); + // 榛樿鏉ユ簮鍧愭爣绯讳负WGS-84澶勭悊 + Double[] gcj02Point = Coordtransform.WGS84ToGCJ02(mobilePosition.getLongitude(), mobilePosition.getLatitude()); + logger.info("GCJ02鍧愭爣锛�" + gcj02Point[0] + ", " + gcj02Point[1]); + mobilePosition.setGeodeticSystem("GCJ-02"); + mobilePosition.setCnLng(gcj02Point[0] + ""); + mobilePosition.setCnLat(gcj02Point[1] + ""); if (!userSetting.getSavePositionHistory()) { storager.clearMobilePositionsByDeviceId(device.getDeviceId()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java new file mode 100644 index 0000000..5c12ff6 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/Coordtransform.java @@ -0,0 +1,126 @@ +package com.genersoft.iot.vmp.gb28181.utils; + +/** + * 鍧愭爣杞崲 + * 涓�涓彁渚涗簡鐧惧害鍧愭爣锛圔D09锛夈�佸浗娴嬪眬鍧愭爣锛堢伀鏄熷潗鏍囷紝GCJ02锛夈�佸拰WGS84鍧愭爣绯讳箣闂寸殑杞崲鐨勫伐鍏风被 + * 鍙傝�僪ttps://github.com/wandergis/coordtransform 鍐欑殑Java鐗堟湰 + * @author Xinconan + * @date 2016-03-18 + * @url https://github.com/xinconan/coordtransform + */ +public class Coordtransform { + + private static double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private static double PI = 3.1415926535897932384626; + private static double a = 6378245.0; + private static double ee = 0.00669342162296594323; + + /** + * 鐧惧害鍧愭爣绯� (BD-09) 涓� 鐏槦鍧愭爣绯� (GCJ-02)鐨勮浆鎹� + * 鍗� 鐧惧害 杞� 璋锋瓕銆侀珮寰� + * @param bd_lon + * @param bd_lat + * @return Double[lon,lat] + */ + public static Double[] BD09ToGCJ02(Double bd_lon,Double bd_lat){ + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta); + arr[1] = z * Math.sin(theta); + return arr; + } + + /** + * 鐏槦鍧愭爣绯� (GCJ-02) 涓庣櫨搴﹀潗鏍囩郴 (BD-09) 鐨勮浆鎹� + * 鍗宠胺姝屻�侀珮寰� 杞� 鐧惧害 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToBD09(Double gcj_lon,Double gcj_lat){ + double z = Math.sqrt(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); + double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); + Double[] arr = new Double[2]; + arr[0] = z * Math.cos(theta) + 0.0065; + arr[1] = z * Math.sin(theta) + 0.006; + return arr; + } + + /** + * WGS84杞珿CJ02 + * @param wgs_lon + * @param wgs_lat + * @return Double[lon,lat] + */ + public static Double[] WGS84ToGCJ02(Double wgs_lon,Double wgs_lat){ + if(outOfChina(wgs_lon, wgs_lat)){ + return new Double[]{wgs_lon,wgs_lat}; + } + double dlat = transformlat(wgs_lon - 105.0, wgs_lat - 35.0); + double dlng = transformlng(wgs_lon - 105.0, wgs_lat - 35.0); + double radlat = wgs_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + Double[] arr = new Double[2]; + arr[0] = wgs_lon + dlng; + arr[1] = wgs_lat + dlat; + return arr; + } + + /** + * GCJ02杞琖GS84 + * @param gcj_lon + * @param gcj_lat + * @return Double[lon,lat] + */ + public static Double[] GCJ02ToWGS84(Double gcj_lon,Double gcj_lat){ + if(outOfChina(gcj_lon, gcj_lat)){ + return new Double[]{gcj_lon,gcj_lat}; + } + double dlat = transformlat(gcj_lon - 105.0, gcj_lat - 35.0); + double dlng = transformlng(gcj_lon - 105.0, gcj_lat - 35.0); + double radlat = gcj_lat / 180.0 * PI; + double magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + double mglat = gcj_lat + dlat; + double mglng = gcj_lon + dlng; + return new Double[]{gcj_lon * 2 - mglng, gcj_lat * 2 - mglat}; + } + + private static Double transformlat(double lng, double lat) { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret; + } + + private static Double transformlng(double lng,double lat) { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret; + } + + /** + * outOfChina + * @鎻忚堪: 鍒ゆ柇鏄惁鍦ㄥ浗鍐咃紝涓嶅湪鍥藉唴鍒欎笉鍋氬亸绉� + * @param lng + * @param lat + * @return {boolean} + */ + private static boolean outOfChina(Double lng,Double lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); + }; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java index 8025818..eed3763 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java @@ -25,6 +25,7 @@ * */ public static String getChannelIdFromHeader(Request request) { Header subject = request.getHeader("subject"); + if (subject == null) return null; return ((Subject) subject).getSubject().split(":")[0]; } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java index 09e7a04..6ae09bd 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java @@ -211,6 +211,14 @@ deviceChannel.setParental(Integer.parseInt(XmlUtil.getText(itemDevice, "Parental"))); } deviceChannel.setParentId(XmlUtil.getText(itemDevice, "ParentID")); + String parentId = XmlUtil.getText(itemDevice, "ParentID"); + if (parentId != null && parentId.contains("/")) { + String lastParentId = parentId.substring(parentId.lastIndexOf("/") + 1); + deviceChannel.setParentId(lastParentId); + }else { + deviceChannel.setParentId(parentId); + } + if (XmlUtil.getText(itemDevice, "SafetyWay") == null || XmlUtil.getText(itemDevice, "SafetyWay") == "") { deviceChannel.setSafetyWay(0); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java new file mode 100644 index 0000000..2bff864 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RedisAlarmMsgListener.java @@ -0,0 +1,69 @@ +package com.genersoft.iot.vmp.service.impl; + +import com.alibaba.fastjson.JSON; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; +import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; + +@Component +public class RedisAlarmMsgListener implements MessageListener { + + private final static Logger logger = LoggerFactory.getLogger(RedisAlarmMsgListener.class); + + @Autowired + private ISIPCommander commander; + + @Autowired + private ISIPCommanderForPlatform commanderForPlatform; + + @Autowired + private IVideoManagerStorage storage; + + private final SimpleDateFormat formatForGB = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + + @Override + public void onMessage(Message message, byte[] bytes) { + logger.info("鏀跺埌鏉ヨ嚜REDIS鐨凙LARM閫氱煡锛� {}", new String(message.getBody())); + AlarmChannelMessage alarmChannelMessage = JSON.parseObject(message.getBody(), AlarmChannelMessage.class); + if (alarmChannelMessage == null) { + logger.warn("[REDIS鐨凙LARM閫氱煡]娑堟伅瑙f瀽澶辫触"); + return; + } + String gbId = alarmChannelMessage.getGbId(); + Device device = storage.queryVideoDevice(gbId); + ParentPlatform platform = storage.queryParentPlatByServerGBId(gbId); + + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setChannelId(gbId); + deviceAlarm.setAlarmDescription(alarmChannelMessage.getAlarmDescription()); + deviceAlarm.setAlarmMethod("" + alarmChannelMessage.getAlarmSn()); + deviceAlarm.setAlarmPriority("1"); + deviceAlarm.setAlarmTime(formatForGB.format(System.currentTimeMillis())); + deviceAlarm.setAlarmType("1"); + deviceAlarm.setLongitude(0); + deviceAlarm.setLatitude(0); + + + if (device != null && platform == null) { + commander.sendAlarmMessage(device, deviceAlarm); + }else if (device == null && platform != null){ + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + }else { + logger.warn("鏃犳硶纭畾" + gbId + "鏄钩鍙拌繕鏄澶�"); + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java index c6b7e64..8d18f52 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IRedisCatchStorage.java @@ -140,6 +140,12 @@ void sendStreamChangeMsg(String type, JSONObject jsonObject); /** + * 鍙戦�佹姤璀︽秷鎭� + * @param msg 娑堟伅鍐呭 + */ + void sendAlarmMsg(AlarmChannelMessage msg); + + /** * 娣诲姞娴佷俊鎭埌redis * @param mediaServerItem * @param app diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java index 9d12eb5..d3a9ae9 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorage.java @@ -5,7 +5,6 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageInfo; @@ -94,12 +93,6 @@ public List<DeviceChannel> queryChannelsByDeviceIdWithStartAndLimit(String deviceId, String query, Boolean hasSubChannel, Boolean online, int start, int limit); - /** - * 鑾峰彇鏌愪釜璁惧鐨勯�氶亾鏍� - * @param deviceId 璁惧ID - * @return - */ - List<DeviceChannelTree> tree(String deviceId); /** * 鑾峰彇鏌愪釜璁惧鐨勯�氶亾鍒楄〃 @@ -180,7 +173,7 @@ * @param count * @return */ - PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, String online, int page, int count); + PageInfo querySubChannels(String deviceId, String channelId, String query, Boolean hasSubChannel, Boolean online, int page, int count); /** @@ -285,7 +278,7 @@ * @param startTime * @param endTime */ - public List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime); + public List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime); /** * 鏌ヨ鏈�鏂扮Щ鍔ㄤ綅缃� diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java index 42e46e1..312d3e0 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java @@ -2,7 +2,6 @@ import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannelInPlatform; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -235,21 +234,6 @@ @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND status=1") List<DeviceChannel> queryOnlineChannelsByDeviceId(String deviceId); - - @Select(" SELECT\n" + - " id,\n" + - " channelId,\n" + - " deviceId,\n" + - " parentId,\n" + - " status,\n" + - " name as title,\n" + - " channelId as \"value\",\n" + - " channelId as \"key\",\n" + - " longitude,\n" + - " latitude\n" + - " from device_channel\n" + - " where deviceId = #{deviceId}") - List<DeviceChannelTree> tree(String deviceId); @Delete(value = {" <script>" + "DELETE " + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java index f3e4261..51da4a8 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMobilePositionMapper.java @@ -16,12 +16,12 @@ @Select(value = {" <script>" + "SELECT * FROM device_mobile_position" + - " WHERE deviceId = #{deviceId} " + + " WHERE deviceId = #{deviceId} and channelId = #{channelId} " + "<if test=\"startTime != null\"> AND time>=#{startTime}</if>" + "<if test=\"endTime != null\"> AND time<=#{endTime}</if>" + " ORDER BY time ASC" + " </script>"}) - List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String startTime, String endTime); + List<MobilePosition> queryPositionByDeviceIdAndTime(String deviceId, String channelId, String startTime, String endTime); @Select("SELECT * FROM device_mobile_position WHERE deviceId = #{deviceId}" + " ORDER BY time DESC LIMIT 1") diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java index fc78de4..e541c31 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java @@ -639,4 +639,10 @@ redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); } + @Override + public void sendAlarmMsg(AlarmChannelMessage msg) { + String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM; + logger.info("[redis 鎶ヨ閫氱煡] {}: {}", key, JSON.toJSON(msg)); + redis.convertAndSend(key, (JSONObject)JSON.toJSON(msg)); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java index fbb6e38..661a69b 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java @@ -13,8 +13,6 @@ import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.*; import com.genersoft.iot.vmp.storager.dao.dto.ChannelSourceInfo; -import com.genersoft.iot.vmp.utils.node.ForestNodeMerger; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -354,10 +352,6 @@ return deviceChannelMapper.queryChannelsByDeviceIdWithStartAndLimit(deviceId, null, query, hasSubChannel, online, start, limit); } - @Override - public List<DeviceChannelTree> tree(String deviceId) { - return ForestNodeMerger.merge(deviceChannelMapper.tree(deviceId)); - } @Override public List<DeviceChannel> queryChannelsByDeviceId(String deviceId) { @@ -365,9 +359,9 @@ } @Override - public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, String online, int page, int count) { + public PageInfo<DeviceChannel> querySubChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online, int page, int count) { PageHelper.startPage(page, count); - List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, null, null, null); + List<DeviceChannel> all = deviceChannelMapper.queryChannels(deviceId, parentChannelId, query, hasSubChannel, online); return new PageInfo<>(all); } @@ -504,8 +498,8 @@ * @param endTime */ @Override - public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String startTime, String endTime) { - return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, startTime, endTime); + public synchronized List<MobilePosition> queryMobilePositions(String deviceId, String channelId, String startTime, String endTime) { + return deviceMobilePositionMapper.queryPositionByDeviceIdAndTime(deviceId, channelId, startTime, endTime); } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java deleted file mode 100644 index 89e35a5..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/BaseNode.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.fasterxml.jackson.annotation.JsonInclude; - -import java.util.ArrayList; -import java.util.List; - -/** - * 鑺傜偣鍩虹被 - * - */ -public class BaseNode<T> implements INode<T> { - - private static final long serialVersionUID = 1L; - - /** - * 涓婚敭ID - */ - protected String channelId; - - /** - * 鐖惰妭鐐笽D - */ - protected String parentId; - - /** - * 瀛愬瓩鑺傜偣 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - protected List<T> children = new ArrayList<T>(); - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - * - * @return Boolean - */ - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public String getChannelId() { - return channelId; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public List<T> getChildren() { - return children; - } - - public void setChildren(List<T> children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java deleted file mode 100644 index d983c56..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNode.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 妫灄鑺傜偣绫� - * - */ -public class ForestNode extends BaseNode<ForestNode> { - - private static final long serialVersionUID = 1L; - - /** - * 鑺傜偣鍐呭 - */ - private Object content; - - public ForestNode(String id, String parentId, Object content) { - this.channelId = id; - this.parentId = parentId; - this.content = content; - } - - public Object getContent() { - return content; - } - - public void setContent(Object content) { - this.content = content; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java deleted file mode 100644 index affce9d..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 妫灄绠$悊绫� - * - * @author smallchill - */ -public class ForestNodeManager<T extends INode<T>> { - - /** - * 妫灄鐨勬墍鏈夎妭鐐� - */ - private final ImmutableMap<String, T> nodeMap; - - /** - * 妫灄鐨勭埗鑺傜偣ID - */ - private final Map<String, Object> parentIdMap = Maps.newHashMap(); - - public ForestNodeManager(List<T> nodes) { - nodeMap = Maps.uniqueIndex(nodes, INode::getChannelId); - } - - /** - * 鏍规嵁鑺傜偣ID鑾峰彇涓�涓妭鐐� - * - * @param id 鑺傜偣ID - * @return 瀵瑰簲鐨勮妭鐐瑰璞� - */ - public INode<T> getTreeNodeAt(String id) { - if (nodeMap.containsKey(id)) { - return nodeMap.get(id); - } - return null; - } - - /** - * 澧炲姞鐖惰妭鐐笽D - * - * @param parentId 鐖惰妭鐐笽D - */ - public void addParentId(String parentId) { - parentIdMap.put(parentId, ""); - } - - /** - * 鑾峰彇鏍戠殑鏍硅妭鐐�(涓�涓.鏋楀搴斿棰楁爲) - * - * @return 鏍戠殑鏍硅妭鐐归泦鍚� - */ - public List<T> getRoot() { - List<T> roots = new ArrayList<>(); - nodeMap.forEach((key, node) -> { - if (node.getParentId() == null || parentIdMap.containsKey(node.getChannelId())) { - roots.add(node); - } - }); - return roots; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java b/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java deleted file mode 100644 index 8df6f50..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/ForestNodeMerger.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import com.genersoft.iot.vmp.utils.CollectionUtil; - -import java.util.List; - -/** - * 妫灄鑺傜偣褰掑苟绫� - * - */ -public class ForestNodeMerger { - - /** - * 灏嗚妭鐐规暟缁勫綊骞朵负涓�涓.鏋楋紙澶氭5鏍戯級锛堝~鍏呰妭鐐圭殑children鍩燂級 - * 鏃堕棿澶嶆潅搴︿负O(n^2) - * - * @param items 鑺傜偣鍩� - * @return 澶氭5鏍戠殑鏍硅妭鐐归泦鍚� - */ - public static <T extends INode<T>> List<T> merge(List<T> items) { - ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (node != null) { - node.getChildren().add(forestNode); - } else { - forestNodeManager.addParentId(forestNode.getChannelId()); - } - } - }); - return forestNodeManager.getRoot(); - } - - public static <T extends INode<T>> List<T> merge(List<T> items, String[] parentIds) { - ForestNodeManager<T> forestNodeManager = new ForestNodeManager<>(items); - items.forEach(forestNode -> { - if (forestNode.getParentId() != null) { - INode<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId()); - if (CollectionUtil.contains(parentIds, forestNode.getChannelId())){ - forestNodeManager.addParentId(forestNode.getChannelId()); - } else { - if (node != null){ - node.getChildren().add(forestNode); - } - } - } - }); - return forestNodeManager.getRoot(); - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java deleted file mode 100644 index 2772747..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/INode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - -import java.io.Serializable; -import java.util.List; - -/** - * - * 鑺傜偣 - */ -public interface INode<T> extends Serializable { - - /** - * 涓婚敭 - * - * @return String - */ - String getChannelId(); - - /** - * 鐖朵富閿� - * - * @return String - */ - String getParentId(); - - /** - * 瀛愬瓩鑺傜偣 - * - * @return List<T> - */ - List<T> getChildren(); - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - * - * @return Boolean - */ - default Boolean getHasChildren() { - return false; - } - -} diff --git a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java b/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java deleted file mode 100644 index 71f1b2b..0000000 --- a/src/main/java/com/genersoft/iot/vmp/utils/node/TreeNode.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.genersoft.iot.vmp.utils.node; - - - -/** - * 鏍戝瀷鑺傜偣绫� - * - */ -public class TreeNode extends BaseNode<TreeNode> { - - private static final long serialVersionUID = 1L; - - private String title; - - private String key; - - private String value; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java deleted file mode 100644 index 73928a4..0000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTree.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.utils.node.INode; -import io.swagger.annotations.ApiModel; - -import java.util.ArrayList; -import java.util.List; - -@ApiModel(value = "DeviceChannelTree瀵硅薄", description = "DeviceChannelTree瀵硅薄") -public class DeviceChannelTree extends DeviceChannel implements INode<DeviceChannelTree> { - private static final long serialVersionUID = 1L; - - /** - * 涓婚敭ID - */ - private int id; - - /** - * 鐖惰妭鐐笽D - */ - private String parentId; - - private String parentName; - - private String title; - - private String key; - - private String value; - - /** - * 瀛愬瓩鑺傜偣 - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private List<DeviceChannelTree> children; - - /** - * 鏄惁鏈夊瓙瀛欒妭鐐� - */ - @JsonInclude(JsonInclude.Include.NON_EMPTY) - private Boolean hasChildren; - - @Override - public List<DeviceChannelTree> getChildren() { - if (this.children == null) { - this.children = new ArrayList<>(); - } - return this.children; - } - - @Override - public Boolean getHasChildren() { - if (children.size() > 0) { - return true; - } else { - return this.hasChildren; - } - } - - @Override - public int getId() { - return id; - } - - @Override - public void setId(int id) { - this.id = id; - } - - @Override - public String getParentId() { - return parentId; - } - - @Override - public void setParentId(String parentId) { - this.parentId = parentId; - } - - public String getParentName() { - return parentName; - } - - public void setParentName(String parentName) { - this.parentName = parentName; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public void setChildren(List<DeviceChannelTree> children) { - this.children = children; - } - - public void setHasChildren(Boolean hasChildren) { - this.hasChildren = hasChildren; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java deleted file mode 100644 index 96577d1..0000000 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/DeviceChannelTreeNode.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.genersoft.iot.vmp.vmanager.bean; - -import com.genersoft.iot.vmp.utils.node.TreeNode; - -public class DeviceChannelTreeNode extends TreeNode { - - private Integer status; - - private String deviceId; - - private String channelId; - - private Double lng; - - private Double lat; - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getChannelId() { - return channelId; - } - - public void setChannelId(String channelId) { - this.channelId = channelId; - } - - public Double getLng() { - return lng; - } - - public void setLng(Double lng) { - this.lng = lng; - } - - public Double getLat() { - return lat; - } - - public void setLat(Double lat) { - this.lat = lat; - } -} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java index c360843..7d11b15 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/MobilePosition/MobilePositionController.java @@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.util.StringUtil; import io.swagger.annotations.Api; @@ -65,10 +66,11 @@ @ApiImplicitParam(name = "start", value = "寮�濮嬫椂闂�", required = true, dataTypeClass = String.class), @ApiImplicitParam(name = "end", value = "缁撴潫鏃堕棿", required = true, dataTypeClass = String.class), }) - @GetMapping("/history/{deviceId}") - public ResponseEntity<List<MobilePosition>> positions(@PathVariable String deviceId, - @RequestParam(required = false) String start, - @RequestParam(required = false) String end) { + @GetMapping("/history/{deviceId}/{channelId}") + public ResponseEntity<WVPResult<List<MobilePosition>>> positions(@PathVariable String deviceId, + @PathVariable String channelId, + @RequestParam(required = false) String start, + @RequestParam(required = false) String end) { // if (logger.isDebugEnabled()) { // logger.debug("鏌ヨ璁惧" + deviceId + "鐨勫巻鍙茶建杩�"); // } @@ -79,9 +81,11 @@ if (StringUtil.isEmpty(end)) { end = null; } - - List<MobilePosition> result = storager.queryMobilePositions(deviceId, start, end); - return new ResponseEntity<>(result, HttpStatus.OK); + WVPResult<List<MobilePosition>> wvpResult = new WVPResult<>(); + wvpResult.setCode(0); + List<MobilePosition> result = storager.queryMobilePositions(deviceId, channelId, start, end); + wvpResult.setData(result); + return new ResponseEntity<>(wvpResult, HttpStatus.OK); } /** diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java index 434bbd4..e785856 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/alarm/AlarmController.java @@ -1,8 +1,14 @@ package com.genersoft.iot.vmp.vmanager.gb28181.alarm; +import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm; +import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; +import com.genersoft.iot.vmp.gb28181.bean.SubscribeInfo; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; +import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.service.IDeviceAlarmService; import com.genersoft.iot.vmp.service.IGbStreamService; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; @@ -31,7 +37,17 @@ @Autowired private IDeviceAlarmService deviceAlarmService; + @Autowired + private ISIPCommander commander; + + @Autowired + private ISIPCommanderForPlatform commanderForPlatform; + + @Autowired + private IVideoManagerStorage storage; + private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private SimpleDateFormat formatForGB = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); /** * 鍒嗛〉鏌ヨ鎶ヨ @@ -133,5 +149,51 @@ return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK); } + /** + * 娴嬭瘯鍚戜笂绾�/璁惧鍙戦�佹ā鎷熸姤璀﹂�氱煡 + * + * @param deviceId 鎶ヨid + * @return + */ + @ApiOperation("娴嬭瘯鍚戜笂绾�/璁惧鍙戦�佹ā鎷熸姤璀﹂�氱煡") + @GetMapping("/test/notify/alarm") + @ApiImplicitParams({ + @ApiImplicitParam(name="deviceId", value = "deviceId", required = true ,dataTypeClass = Integer.class) + }) + public ResponseEntity<WVPResult<String>> delete( + @RequestParam(required = false) String deviceId + ) { + if (StringUtils.isEmpty(deviceId)) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + Device device = storage.queryVideoDevice(deviceId); + ParentPlatform platform = storage.queryParentPlatByServerGBId(deviceId); + DeviceAlarm deviceAlarm = new DeviceAlarm(); + deviceAlarm.setChannelId(deviceId); + deviceAlarm.setAlarmDescription("test"); + deviceAlarm.setAlarmMethod("1"); + deviceAlarm.setAlarmPriority("1"); + deviceAlarm.setAlarmTime(formatForGB.format(System.currentTimeMillis())); + deviceAlarm.setAlarmType("1"); + deviceAlarm.setLongitude(115.33333); + deviceAlarm.setLatitude(39.33333); + + if (device != null && platform == null) { + commander.sendAlarmMessage(device, deviceAlarm); + }else if (device == null && platform != null){ + commanderForPlatform.sendAlarmMessage(platform, deviceAlarm); + }else { + WVPResult wvpResult = new WVPResult(); + wvpResult.setCode(0); + wvpResult.setMsg("鏃犳硶纭畾" + deviceId + "鏄钩鍙拌繕鏄澶�"); + return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK); + } + + WVPResult wvpResult = new WVPResult(); + wvpResult.setCode(0); + wvpResult.setMsg("success"); + return new ResponseEntity<WVPResult<String>>(wvpResult, HttpStatus.OK); + } + } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java index 95d2843..ab153ad 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -9,7 +9,6 @@ import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; -import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeHandlerTask; import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask; import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; @@ -17,14 +16,12 @@ import com.genersoft.iot.vmp.service.IDeviceService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; -import com.genersoft.iot.vmp.vmanager.bean.DeviceChannelTree; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import org.kxml2.wap.wv.WV; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -235,7 +232,7 @@ @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="count", value = "姣忛〉鏉℃暟", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = String.class), + @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = Boolean.class), @ApiImplicitParam(name="channelType", value = "閫氶亾绫诲瀷锛� 瀛愮洰褰�", dataTypeClass = Boolean.class), }) @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") @@ -244,7 +241,7 @@ int page, int count, @RequestParam(required = false) String query, - @RequestParam(required = false) String online, + @RequestParam(required = false) Boolean online, @RequestParam(required = false) Boolean channelType){ // if (logger.isDebugEnabled()) { @@ -450,11 +447,6 @@ return result; } - @GetMapping("/{deviceId}/tree") - @ApiOperation(value = "閫氶亾鏍戝舰缁撴瀯", notes = "閫氶亾鏍戝舰缁撴瀯") - public WVPResult<List<DeviceChannelTree>> tree(@PathVariable String deviceId) { - return WVPResult.Data(storager.tree(deviceId)); - } @GetMapping("/{deviceId}/sync_status") @ApiOperation(value = "鑾峰彇閫氶亾鍚屾杩涘害", notes = "鑾峰彇閫氶亾鍚屾杩涘害") diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java index 9d6b8fc..6fdadf2 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java @@ -63,7 +63,7 @@ public DeferredResult<ResponseEntity<RecordInfo>> recordinfo(@PathVariable String deviceId,@PathVariable String channelId, String startTime, String endTime){ if (logger.isDebugEnabled()) { - logger.debug(String.format("褰曞儚淇℃伅鏌ヨ API璋冪敤锛宒eviceId锛�%s 锛宻tartTime锛�%s锛� startTime锛�%s",deviceId, startTime, endTime)); + logger.debug(String.format("褰曞儚淇℃伅鏌ヨ API璋冪敤锛宒eviceId锛�%s 锛宻tartTime锛�%s锛� endTime锛�%s",deviceId, startTime, endTime)); } Device device = storager.queryVideoDevice(deviceId); diff --git a/web_src/index.html b/web_src/index.html index ca1b842..f69f16b 100644 --- a/web_src/index.html +++ b/web_src/index.html @@ -12,8 +12,26 @@ <script type="text/javascript" src="./static/js/jessibuca/jessibuca.js"></script> <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script> <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script> - <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=rk73w8dv1rkE4UdZsataG68VarhYQzrx&s=1"></script> <div id="app"></div> <!-- built files will be auto injected --> + <script> + // map缁勪欢鍏ㄥ眬鍙傛暟, 娉ㄩ噴姝ゅ唴瀹瑰彲浠ュ叧闂湴鍥惧姛鑳� + window.mapParam = { + // 鍧愭爣绯� GCJ-02 WGS-84, + coordinateSystem: "GCJ-02", + // 鍦板浘鐡︾墖鍦板潃 + tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8", + // 鐡︾墖澶у皬 + tileSize: 256, + // 榛樿灞傜骇 + zoom:10, + // 榛樿鍦板浘涓績鐐� + center:[116.41020, 39.915119], + // 鍦板浘鏈�澶у眰绾� + maxZoom:18, + // 鍦板浘鏈�灏忓眰绾� + minZoom: 3 + } + </script> </body> </html> diff --git a/web_src/package-lock.json b/web_src/package-lock.json index b1da39e..0d4c886 100644 --- a/web_src/package-lock.json +++ b/web_src/package-lock.json @@ -14,9 +14,10 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", @@ -57,13 +58,57 @@ "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", - "webpack-dev-server": "^2.11.5", + "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + }, + "bin": { + "gl-style-composite": "bin/gl-style-composite", + "gl-style-format": "bin/gl-style-format", + "gl-style-migrate": "bin/gl-style-migrate", + "gl-style-validate": "bin/gl-style-validate" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "node_modules/@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" }, "node_modules/@types/q": { "version": "1.5.4", @@ -214,6 +259,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -1434,34 +1480,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "node_modules/bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "node_modules/bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "node_modules/bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "node_modules/bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "dependencies": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "node_modules/bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "node_modules/bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -2678,6 +2696,11 @@ "engines": { "node": ">=8.0.0" } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -4880,6 +4903,28 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "node_modules/geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "dependencies": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/geotiff/node_modules/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + }, "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -5428,8 +5473,7 @@ "node_modules/ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "node_modules/iferr": { "version": "0.1.5", @@ -6042,6 +6086,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "node_modules/json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -6106,13 +6155,10 @@ "node": ">=0.10.0" } }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dependencies": { - "uc.micro": "^1.0.1" - } + "node_modules/lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "node_modules/load-json-file": { "version": "2.0.0", @@ -6335,25 +6381,10 @@ "node": ">=0.10.0" } }, - "node_modules/markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "dependencies": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "node_modules/mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "node_modules/math-expression-evaluator": { "version": "1.3.8", @@ -6377,11 +6408,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "node_modules/media-typer": { "version": "0.3.0", @@ -6783,8 +6809,7 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "node_modules/mississippi": { "version": "2.0.0", @@ -7246,6 +7271,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "node_modules/ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "dependencies": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "node_modules/ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -7512,6 +7558,11 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -7610,6 +7661,18 @@ }, "engines": { "node": ">=4" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" } }, "node_modules/pbkdf2": { @@ -10613,6 +10676,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "node_modules/proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -10745,6 +10813,19 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "node_modules/quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -10786,6 +10867,14 @@ }, "engines": { "node": ">= 0.8" + } + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "dependencies": { + "quickselect": "^2.0.0" } }, "node_modules/read-cache": { @@ -11225,6 +11314,14 @@ "node": ">=4" } }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -11308,6 +11405,11 @@ "dependencies": { "aproba": "^1.1.1" } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -11779,6 +11881,32 @@ "node": ">=0.8.0" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -11786,6 +11914,18 @@ "dev": true, "dependencies": { "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "dependencies": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" }, "engines": { "node": ">=0.10.0" @@ -11983,7 +12123,8 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "node_modules/ssri": { "version": "5.3.0", @@ -12479,11 +12620,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "node_modules/uglify-js": { "version": "3.4.10", "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", @@ -12853,13 +12989,11 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -12897,21 +13031,6 @@ "version": "2.6.12", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" - }, - "node_modules/vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "dependencies": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - }, - "peerDependencies": { - "vue": "^2.1.8" - } }, "node_modules/vue-clipboard2": { "version": "0.3.1", @@ -13298,6 +13417,16 @@ "dependencies": { "minimalistic-assert": "^1.0.0" } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" }, "node_modules/webpack": { "version": "3.12.0", @@ -14116,6 +14245,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", @@ -14244,6 +14378,41 @@ } }, "dependencies": { + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" + }, + "@mapbox/mapbox-gl-style-spec": { + "version": "13.23.1", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.23.1.tgz", + "integrity": "sha512-C6wh8A/5EdsgzhL6y6yl464VCQNIxK0yjrpnvCvchcFe3sNK2RbBw/J9u3m+p8Y6S6MsGuSMt3AkGAXOKMYweQ==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" + }, + "@petamoriken/float16": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.6.3.tgz", + "integrity": "sha512-Yx6Z93kmz3JVPYoPPRFJXnt2/G4kfaxRROcZVVHsE4zOClJXvkOVidv/JfvP6hWn16lykbKYKVzUsId6mqXdGg==" + }, "@types/q": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", @@ -14360,6 +14529,7 @@ "version": "1.0.10", "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -15493,34 +15663,6 @@ "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", "dev": true }, - "bmaplib.curveline": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bmaplib.curveline/-/bmaplib.curveline-1.0.0.tgz", - "integrity": "sha512-9wcFMVhiYxNPqpvsLDAADn3qDhNzXp2mA6VyHSHg2XOAgSooC7ZiujdFhy0sp+0QYjTfJ/MjmLuNoUg2HHxH4Q==" - }, - "bmaplib.heatmap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bmaplib.heatmap/-/bmaplib.heatmap-1.0.4.tgz", - "integrity": "sha512-rmhqUARBpUSJ9jXzUI2j7dIOqnc38bqubkx/8a349U2qtw/ulLUwyzRD535OrA8G7w5cz4aPKm6/rNvUAarg/Q==" - }, - "bmaplib.lushu": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/bmaplib.lushu/-/bmaplib.lushu-1.0.7.tgz", - "integrity": "sha512-LVvgpESPii6xGxyjnQjq8u+ic4NjvhdCPV/RiSS/PGTUdZKeTDS7prSpleJLZH3ES0+oc0gYn8bw0LtPYUSz2w==" - }, - "bmaplib.markerclusterer": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bmaplib.markerclusterer/-/bmaplib.markerclusterer-1.0.13.tgz", - "integrity": "sha512-VrLyWSiuDEVNi0yUfwOhFQ6z1oEEHS4w36GNu3iASu6p52QIx9uAXMUkuSCHReNR0bj2Cp9SA1dSx5RpojXajQ==", - "requires": { - "bmaplib.texticonoverlay": "^1.0.2" - } - }, - "bmaplib.texticonoverlay": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bmaplib.texticonoverlay/-/bmaplib.texticonoverlay-1.0.2.tgz", - "integrity": "sha512-4ZTWr4ZP3B6qEWput5Tut16CfZgII38YwM3bpyb4gFTQyORlKYryFp9WHWrwZZaHlOyYDAXG9SX0hka43jTADg==" - }, "bn.js": { "version": "5.1.3", "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.3.tgz", @@ -16578,6 +16720,11 @@ "mdn-data": "2.0.4", "source-map": "^0.6.1" } + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" }, "cssesc": { "version": "3.0.0", @@ -18425,6 +18572,27 @@ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, + "geotiff": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.0.5.tgz", + "integrity": "sha512-U5kVYm118YAmw2swiLu8rhfrYnDKOFI7VaMjuQwcq6Intuuid9Pyb4jjxYUxxkq8kOu2r7Am0Rmb52PObGp4pQ==", + "requires": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.0", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2" + }, + "dependencies": { + "pako": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==" + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", @@ -18892,8 +19060,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" }, "iferr": { "version": "0.1.5", @@ -19367,6 +19534,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "json3": { "version": "3.3.3", "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", @@ -19419,13 +19591,10 @@ "invert-kv": "^1.0.0" } }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "requires": { - "uc.micro": "^1.0.1" - } + "lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" }, "load-json-file": { "version": "2.0.0", @@ -19604,24 +19773,10 @@ "object-visit": "^1.0.0" } }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } - } + "mapbox-to-css-font": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz", + "integrity": "sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow==" }, "math-expression-evaluator": { "version": "1.3.8", @@ -19645,11 +19800,6 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "media-typer": { "version": "0.3.0", @@ -19976,8 +20126,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", - "dev": true + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" }, "mississippi": { "version": "2.0.0", @@ -20372,6 +20521,27 @@ "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", "dev": true }, + "ol": { + "version": "6.14.1", + "resolved": "https://registry.npmmirror.com/ol/-/ol-6.14.1.tgz", + "integrity": "sha512-sIcUWkGud3Y2gT3TJubSHlkyMXiPVh1yxfCPHxmY8+qtm79bB9oRnei9xHVIbRRG0Ro6Ldp5E+BMVSvYCxSpaA==", + "requires": { + "geotiff": "^2.0.2", + "ol-mapbox-style": "^7.1.1", + "pbf": "3.2.1", + "rbush": "^3.0.1" + } + }, + "ol-mapbox-style": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-7.1.1.tgz", + "integrity": "sha512-GLTEYiH/Ec9Zn1eS4S/zXyR2sierVrUc+OLVP8Ra0FRyqRhoYbXdko0b7OIeSHWdtJfHssWYefDOGxfTRUUZ/A==", + "requires": { + "@mapbox/mapbox-gl-style-spec": "^13.20.1", + "mapbox-to-css-font": "^2.4.1", + "webfont-matcher": "^1.1.0" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -20589,6 +20759,11 @@ "safe-buffer": "^5.1.1" } }, + "parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1598130878813&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-4.0.0.tgz", @@ -20666,6 +20841,15 @@ "dev": true, "requires": { "pify": "^3.0.0" + } + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" } }, "pbkdf2": { @@ -23119,6 +23303,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "protocol-buffers-schema": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", @@ -23230,6 +23419,16 @@ "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", "dev": true }, + "quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", @@ -23265,6 +23464,14 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + } + }, + "rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "requires": { + "quickselect": "^2.0.0" } }, "read-cache": { @@ -23648,6 +23855,14 @@ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz", @@ -23718,6 +23933,11 @@ "requires": { "aproba": "^1.1.1" } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "safe-buffer": { "version": "5.1.2", @@ -24097,6 +24317,14 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "sockjs-client": { @@ -24124,6 +24352,16 @@ } } }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz", @@ -24131,6 +24369,15 @@ "dev": true, "requires": { "is-plain-obj": "^1.0.0" + } + }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" } }, "source-list-map": { @@ -24296,7 +24543,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "5.3.0", @@ -24703,11 +24951,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1601823880483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", @@ -25034,10 +25277,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz?cache=0&sync_timestamp=1601826530476&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -25071,18 +25313,6 @@ "version": "2.6.12", "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz?cache=0&sync_timestamp=1600441238751&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue%2Fdownload%2Fvue-2.6.12.tgz", "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM=" - }, - "vue-baidu-map": { - "version": "0.21.22", - "resolved": "https://registry.npmjs.org/vue-baidu-map/-/vue-baidu-map-0.21.22.tgz", - "integrity": "sha512-WQMPCih4UTh0AZCKKH/OVOYnyAWjfRNeK6BIeoLmscyY5aF8zzlJhz/NOHLb3mdztIpB0Z6aohn4Jd9mfCSjQw==", - "requires": { - "bmaplib.curveline": "^1.0.0", - "bmaplib.heatmap": "^1.0.4", - "bmaplib.lushu": "^1.0.7", - "bmaplib.markerclusterer": "^1.0.13", - "markdown-it": "^8.4.0" - } }, "vue-clipboard2": { "version": "0.3.1", @@ -25420,6 +25650,16 @@ "requires": { "minimalistic-assert": "^1.0.0" } + }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "webfont-matcher": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/webfont-matcher/-/webfont-matcher-1.1.0.tgz", + "integrity": "sha512-ov8lMvF9wi4PD7fK2Axn9PQEpO9cYI0fIoGqErwd+wi8xacFFDmX114D5Q2Lw0Wlgmb+Qw/dKI2KTtimrJf85g==" }, "webpack": { "version": "3.12.0", @@ -26091,6 +26331,11 @@ "safe-buffer": "~5.1.0" } }, + "xml-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.0.2.tgz", + "integrity": "sha512-rEn0FvKi+YGjv9omf22oAf+0d6Ly/sgJ/CUufU/nOzS7SRLmgwSujrewc03KojXxt+aPaTRpm593TgehtUBMSQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz?cache=0&sync_timestamp=1596697437792&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxtend%2Fdownload%2Fxtend-4.0.2.tgz", diff --git a/web_src/package.json b/web_src/package.json index 20fc3a2..1e7f043 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -16,9 +16,10 @@ "element-ui": "^2.15.6", "fingerprintjs2": "^2.1.2", "moment": "^2.29.1", + "ol": "^6.14.1", "postcss-pxtorem": "^5.1.1", + "uuid": "^8.3.2", "vue": "^2.6.11", - "vue-baidu-map": "^0.21.22", "vue-clipboard2": "^0.3.1", "vue-clipboards": "^1.3.0", "vue-contextmenujs": "^1.3.13", diff --git a/web_src/src/App.vue b/web_src/src/App.vue index e114545..3590f73 100644 --- a/web_src/src/App.vue +++ b/web_src/src/App.vue @@ -81,4 +81,24 @@ text-align: center; padding-top: 0px !important; } + +/*瀹氫箟婊氬姩鏉¢珮瀹藉強鑳屾櫙 楂樺鍒嗗埆瀵瑰簲妯珫婊氬姩鏉$殑灏哄*/ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +/*瀹氫箟婊氬姩鏉¤建閬� 鍐呴槾褰�+鍦嗚*/ +::-webkit-scrollbar-track { + border-radius: 4px; + background-color: #F5F5F5; +} + +/*瀹氫箟婊戝潡 鍐呴槾褰�+鍦嗚*/ +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: #c8c8c8; + box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); + -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); +} </style> diff --git a/web_src/src/api/deviceApi.js b/web_src/src/api/deviceApi.js deleted file mode 100644 index 830164f..0000000 --- a/web_src/src/api/deviceApi.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from 'axios'; - -export const tree = (deviceId) => { - return axios({ - url: `/api/device/query/${deviceId}/tree`, - method: 'get' - }) -} - -export const deviceList = (page, count) => { - return axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page, - count - } - }) -} \ No newline at end of file diff --git a/web_src/src/components/DeviceList.vue b/web_src/src/components/DeviceList.vue index d934fe6..62cba31 100644 --- a/web_src/src/components/DeviceList.vue +++ b/web_src/src/components/DeviceList.vue @@ -194,7 +194,7 @@ this.$router.push(`/channelList/${row.deviceId}/0/15/1`); }, showDevicePosition: function (row) { - this.$router.push(`/devicePosition/${row.deviceId}/0/15/1`); + this.$router.push(`/map?deviceId=${row.deviceId}`); }, //gb28181骞冲彴瀵规帴 diff --git a/web_src/src/components/channelTree.vue b/web_src/src/components/channelTree.vue deleted file mode 100644 index ae9eac7..0000000 --- a/web_src/src/components/channelTree.vue +++ /dev/null @@ -1,70 +0,0 @@ -<template> - <div> - <el-tree :data="channelList" :props="props" @node-click="sendDevicePush"> - <span slot-scope="{ node }"> - <span v-if="node.isLeaf"> - <i class="el-icon-video-camera" :style="{color:node.disabled==1?'#67C23A':'#F56C6C'}"></i> - </span> - <span v-else> - <i class="el-icon-folder"></i> - </span> - <span> - {{ node.label }} - </span> - </span> - </el-tree> - </div> -</template> -<script> -import ChannelTreeItem from "@/components/channelTreeItem" -import {tree} from '@/api/deviceApi' - -export default { - components: { - ChannelTreeItem, - }, - props:{ - device: { - type: Object, - required: true - } - }, - data() { - return { - loading: false, - channelList: [], - props: { - label: 'title', - children: 'children', - isLeaf: 'hasChildren', - disabled: 'status' - }, - } - }, - computed: { - - }, - mounted() { - this.leafs = [] - this.getTree() - }, - methods: { - getTree() { - this.loading = true - var that = this - tree(this.device.deviceId).then(function (res) { - console.log(res.data.data); - that.channelList = res.data.data; - that.loading = false; - }).catch(function (error) { - console.log(error); - that.loading = false; - }); - }, - sendDevicePush(c) { - if(c.hasChildren) return - this.$emit('sendDevicePush',c) - } - } -} -</script> \ No newline at end of file diff --git a/web_src/src/components/channelTreeItem.vue b/web_src/src/components/channelTreeItem.vue deleted file mode 100644 index 7f2a2a5..0000000 --- a/web_src/src/components/channelTreeItem.vue +++ /dev/null @@ -1,74 +0,0 @@ -<template> - <div> - <!-- <div :index="item.key" v-for="(item,i) in list" :key="i+'-'"> - <el-submenu v-if="item.hasChildren"> - <template slot="title"> - <i class="el-icon-video-camera"></i> - <span slot="title">{{item.title || item.deviceId}}</span> - </template> - <channel-list :list="item.children" @sendDevicePush="sendDevicePush"></channel-list> - </el-submenu> - <el-menu-item v-else :index="item.key" @click="sendDevicePush(item)"> - <template slot="title" > - <i class="el-icon-switch-button" :style="{color:item.status==1?'#67C23A':'#F56C6C'}"></i> - <span slot="title">{{item.title}}</span> - </template> - </el-menu-item> - </div> --> - <div > - <template v-if="!item.hasChildren"> - <el-menu-item :index="item.key" @click="sendDevicePush(item)"> - <i class="el-icon-video-camera" :style="{color:item.status==1?'#67C23A':'#F56C6C'}"></i> - {{item.title}} - </el-menu-item> - </template> - - <el-submenu v-else :index="item.key"> - <template slot="title" > - <i class="el-icon-location-outline"></i> - {{item.title}} - </template> - - <template v-for="child in item.children"> - <channel-item - v-if="child.hasChildren" - :item="child" - :key="child.key" - @sendDevicePush="sendDevicePush"/> - <el-menu-item v-else :key="child.key" :index="child.key" @click="sendDevicePush(child)"> - <i class="el-icon-video-camera" :style="{color:child.status==1?'#67C23A':'#F56C6C'}"></i> - {{child.title}} - </el-menu-item> - </template> - </el-submenu> - </div> - </div> -</template> -<script> -export default { - name:'ChannelItem', - props:{ - list:Array, - channelId: String, - item: { - type: Object, - required: true - } - }, - data () { - return { - - } - }, - watch: { - channelId(val) { - console.log(val); - } - }, - methods: { - sendDevicePush(c) { - this.$emit('sendDevicePush',c) - } - } -} -</script> diff --git a/web_src/src/components/common/DeviceTree.vue b/web_src/src/components/common/DeviceTree.vue new file mode 100644 index 0000000..fab895f --- /dev/null +++ b/web_src/src/components/common/DeviceTree.vue @@ -0,0 +1,160 @@ +<template> + <div id="DeviceTree" style="width: 100%;height: 100%; background-color: #FFFFFF; overflow: auto"> + <el-container> + <el-header>璁惧鍒楄〃</el-header> + <el-main style="background-color: #ffffff;"> + <div class="device-tree-main-box"> + <el-tree :props="defaultProps" :load="loadNode" lazy @node-click="handleNodeClick"@node-contextmenu="handleContextMenu" style="min-width: 100%; display:inline-block !important;"> + <span class="custom-tree-node" slot-scope="{ node, data }" style="width: 100%"> + <span v-if="node.data.type === 0 && node.data.online" title="鍦ㄧ嚎璁惧" class="device-online iconfont icon-jiedianleizhukongzhongxin2"></span> + <span v-if="node.data.type === 0 && !node.data.online " title="绂荤嚎璁惧" class="device-offline iconfont icon-jiedianleizhukongzhongxin2"></span> + <span v-if="node.data.type === 2 && node.data.online" title="鐩綍" class="device-online iconfont icon-jiedianleilianjipingtai"></span> + <span v-if="node.data.type === 2 && !node.data.online" title="鐩綍" class="device-offline iconfont icon-jiedianleilianjipingtai"></span> + <span v-if="node.data.type === 3 && node.data.online " title="鍦ㄧ嚎閫氶亾" class="device-online iconfont icon-shebeileijiankongdian"></span> + <span v-if="node.data.type === 3 && !node.data.online" title="鍦ㄧ嚎閫氶亾" class="device-offline iconfont icon-shebeileijiankongdian"></span> + <span v-if="node.data.type === 4 && node.data.online " title="鍦ㄧ嚎閫氶亾-鐞冩満" class="device-online iconfont icon-shebeileiqiuji"></span> + <span v-if="node.data.type === 4 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鐞冩満" class="device-offline iconfont icon-shebeileiqiuji"></span> + <span v-if="node.data.type === 5 && node.data.online " title="鍦ㄧ嚎閫氶亾-鍗婄悆" class="device-online iconfont icon-shebeileibanqiu"></span> + <span v-if="node.data.type === 5 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鍗婄悆" class="device-offline iconfont icon-shebeileibanqiu"></span> + <span v-if="node.data.type === 6 && node.data.online " title="鍦ㄧ嚎閫氶亾-鏋満" class="device-online iconfont icon-shebeileiqiangjitongdao"></span> + <span v-if="node.data.type === 6 && !node.data.online" title="鍦ㄧ嚎閫氶亾-鏋満" class="device-offline iconfont icon-shebeileiqiangjitongdao"></span> + <span v-if="node.data.online" style="padding-left: 1px" class="device-online">{{ node.label }}</span> + <span v-if="!node.data.online" style="padding-left: 1px" class="device-offline">{{ node.label }}</span> + <span> + <i v-if="node.data.hasGPS && node.data.online" style="color: #9d9d9d" class="device-online iconfont icon-dizhi"></i> + <i v-if="node.data.hasGPS && !node.data.online" style="color: #9d9d9d" class="device-offline iconfont icon-dizhi"></i> + </span> + </span> + </el-tree> + </div> + </el-main> + </el-container> + </div> +</template> + +<script> +import DeviceService from "../service/DeviceService.js"; + +export default { + name: 'DeviceTree', + data() { + return { + deviceService: new DeviceService(), + defaultProps: { + children: 'children', + label: 'name', + isLeaf: 'isLeaf' + } + }; + }, + props: ['clickEvent', 'contextMenuEvent'], + methods: { + handleNodeClick(data,node,element) { + console.log("鐐瑰嚮浜嬩欢") + console.log(data) + if(typeof (this.clickEvent) == "function") { + this.clickEvent(data.userData) + } + }, + handleContextMenu(event,data,node,element) { + console.log("鍙抽敭鐐瑰嚮浜嬩欢") + if(typeof (this.contextMenuEvent) == "function") { + this.contextMenuEvent(event, data.userData) + } + }, + loadNode: function(node, resolve){ + if (node.level === 0) { + this.deviceService.getAllDeviceList((data)=>{ + console.log(data) + if (data.length > 0) { + let nodeList = [] + for (let i = 0; i < data.length; i++) { + console.log(data[i].name) + let node = { + name: data[i].name || data[i].deviceId, + isLeaf: false, + id: data[i].deviceId, + type: data[i].online, + online: data[i].online === 1, + userData: data[i] + } + nodeList.push(node); + } + resolve(nodeList) + }else { + resolve([]) + } + }, (error)=>{ + + }) + } + if (node.level === 1) { + this.deviceService.getAllChannel(true, node.data.id, (catalogData) => { + this.deviceService.getAllChannel(false, node.data.id, (channelData) => { + let data = catalogData.concat(channelData) + this.channelDataHandler(data, resolve) + }) + }) + }else if (node.level > 1){ + this.deviceService.getAllSubChannel(true, node.data.deviceId, node.data.id, (catalogData)=>{ + this.deviceService.getAllSubChannel(false, node.data.deviceId, node.data.id, (channelData)=>{ + let data = catalogData.concat(channelData) + this.channelDataHandler(data, resolve) + }) + }) + } + }, + channelDataHandler: function (data, resolve) { + if (data.length > 0) { + let nodeList = [] + for (let i = 0; i < data.length; i++) { + let type = 3; + if (data[i].subCount > 0) { + type = 2; + }else if (data[i].ptztype === 1 ) { // 1-鐞冩満;2-鍗婄悆;3-鍥哄畾鏋満;4-閬ユ帶鏋満 + type = 4; + }else if (data[i].ptztype === 2) { + type = 5; + }else if (data[i].ptztype === 3 || data[i].ptztype === 4) { + type = 6; + } + let node = { + name: data[i].name || data[i].channelId, + isLeaf: data[i].subCount === 0, + id: data[i].channelId, + deviceId: data[i].deviceId, + type: type, + online: data[i].status === 1, + hasGPS: data[i].longitude*data[i].latitude !== 0, + userData: data[i] + } + nodeList.push(node); + } + resolve(nodeList) + }else { + resolve([]) + } + } + }, + destroyed() { + // if (this.jessibuca) { + // this.jessibuca.destroy(); + // } + // this.playing = false; + // this.loaded = false; + // this.performance = ""; + }, +} +</script> + +<style> +.device-tree-main-box{ + text-align: left; +} +.device-online{ + color: #252525; +} +.device-offline{ + color: #727272; +} +</style> diff --git a/web_src/src/components/common/MapComponent.vue b/web_src/src/components/common/MapComponent.vue new file mode 100644 index 0000000..2d8600d --- /dev/null +++ b/web_src/src/components/common/MapComponent.vue @@ -0,0 +1,257 @@ +<template> + <div id="mapContainer" ref="mapContainer" style="width: 100%;height: 100%;"></div> +</template> + +<script> +import 'ol/ol.css'; +import Map from 'ol/Map'; +import OSM from 'ol/source/OSM'; +import XYZ from 'ol/source/XYZ'; +import VectorSource from 'ol/source/Vector'; +import Tile from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import Style from 'ol/style/Style'; +import Icon from 'ol/style/Icon'; +import View from 'ol/View'; +import Feature from 'ol/Feature'; +import Overlay from 'ol/Overlay'; +import {Point, LineString} from 'ol/geom'; +import {get as getProj, fromLonLat} from 'ol/proj'; +import {ZoomSlider, Zoom} from 'ol/control'; +import {containsCoordinate} from 'ol/extent'; + +import {v4} from 'uuid' + +let olMap = null; + +export default { + name: 'MapComponent', + data() { + return { + + + }; + }, + created(){ + this.$nextTick(() => { + setTimeout(()=>{ + this.init() + }, 100) + }) + + }, + props: [], + mounted () { + + }, + methods: { + init(){ + + let center = fromLonLat([116.41020, 39.915119]); + if (mapParam.center) { + center = fromLonLat(mapParam.center); + } + const view = new View({ + center: center, + zoom: mapParam.zoom || 10, + projection: this.projection, + maxZoom: mapParam.maxZoom || 19, + minZoom: mapParam.minZoom || 1, + }); + let tileLayer = null; + if (mapParam.tilesUrl) { + tileLayer = new Tile({ + source: new XYZ({ + projection: getProj("EPSG:3857"), + wrapX: false, + tileSize: 256 || mapParam.tileSize, + url: mapParam.tilesUrl + }) + }) + }else { + tileLayer = new Tile({ + preload: 4, + source: new OSM(), + }) + } + olMap = new Map({ + target: this.$refs.mapContainer, // 瀹瑰櫒ID + layers: [tileLayer], // 榛樿鍥惧眰 + view: view, // 瑙嗗浘 + controls:[ // 鎺т欢 + // new ZoomSlider(), + new Zoom(), + ] , + }) + console.log(3222) + }, + setCenter(point){ + + }, + zoomIn(zoom){ + + }, + zoomOut(zoom){ + + }, + centerAndZoom(point,zoom,callback){ + var zoom_ = olMap.getView().getZoom(); + zoom = zoom|| zoom_; + var duration = 600; + olMap.getView().setCenter(fromLonLat(point)) + olMap.getView().animate({ + zoom: zoom , + duration: duration + }); + }, + panTo(point, zoom){ + let duration = 800; + + olMap.getView().cancelAnimations() + olMap.getView().animate({ + center: fromLonLat(point), + duration: duration + }); + if (!containsCoordinate(olMap.getView().calculateExtent(), fromLonLat(point))) { + olMap.getView().animate({ + zoom: olMap.getView().getZoom() - 1, + duration: duration / 2 + }, { + zoom: zoom || olMap.getView().getZoom(), + duration: duration / 2 + }); + } + + }, + fit(layer){ + let extent = layer.getSource().getExtent(); + if (extent) { + olMap.getView().fit(extent,{ + duration : 600, + padding: [100, 100, 100, 100] + }); + } + + + }, + openInfoBox(position, content, offset){ + let id = v4() + // let infoBox = document.createElement("div"); + // infoBox.innerHTML = content ; + // infoBox.setAttribute("infoBoxId", id) + let overlay = new Overlay({ + id:id, + autoPan:true, + autoPanAnimation:{ + duration: 250 + }, + element: content, + positioning:"bottom-center", + offset:offset, + // className:overlayStyle.className + }); + olMap.addOverlay(overlay); + overlay.setPosition(fromLonLat(position)); + return id; + }, + closeInfoBox(id){ + olMap.getOverlayById(id).setPosition(undefined) + // olMap.removeOverlay(olMap.getOverlayById(id)) + }, + /** + * 娣诲姞鍥惧眰 + * @param data + * [ + * { + * + * position: [119.1212,45,122], + * image: { + * src:"/images/123.png", + * anchor: [0.5, 0.5] + * + * } + * } + * + * ] + */ + addLayer(data, clickEvent){ + let style = new Style(); + if (data.length > 0) { + let features = []; + for (let i = 0; i < data.length; i++) { + let feature = new Feature(new Point(fromLonLat(data[i].position))); + feature.customData = data[i].data; + let cloneStyle = style.clone() + cloneStyle.setImage(new Icon({ + anchor: data[i].image.anchor, + crossOrigin: 'Anonymous', + src: data[i].image.src, + })) + feature.setStyle(cloneStyle) + features.push(feature); + } + let source = new VectorSource(); + source.addFeatures(features); + let vectorLayer = new VectorLayer({ + source:source, + style:style, + renderMode:"image", + declutter: false + }) + olMap.addLayer(vectorLayer) + if (typeof clickEvent == "function") { + olMap.on("click", (event)=>{ + vectorLayer.getFeatures(event.pixel).then((features)=>{ + if (features.length > 0) { + let items = [] + for (let i = 0; i < features.length; i++) { + items.push(features[i].customData) + } + clickEvent(items) + } + }) + + + }) + } + + return vectorLayer; + } + }, + removeLayer(layer){ + olMap.removeLayer(layer) + }, + + addLineLayer(positions) { + if (positions.length > 0) { + let points = []; + for (let i = 0; i < positions.length; i++) { + points.push(fromLonLat(positions[i])); + } + let line = new LineString(points) + let lineFeature = new Feature(line); + + let source = new VectorSource(); + source.addFeature(lineFeature); + let vectorLayer = new VectorLayer({ + source: source, + }) + olMap.addLayer(vectorLayer) + return vectorLayer; + } + } + }, + destroyed() { + // if (this.jessibuca) { + // this.jessibuca.destroy(); + // } + // this.playing = false; + // this.loaded = false; + // this.performance = ""; + }, +} +</script> + +<style> + +</style> diff --git a/web_src/src/components/common/jessibuca.vue b/web_src/src/components/common/jessibuca.vue new file mode 100644 index 0000000..d05890b --- /dev/null +++ b/web_src/src/components/common/jessibuca.vue @@ -0,0 +1,309 @@ +<template> + <div id="container" ref="containerId" @dblclick="fullscreenSwich" style="width: 100%"> + <div class="buttons-box" id="buttonsBox"> + <div class="buttons-box-left"> + <i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i> + <i v-if="playing" class="iconfont icon-pause jessibuca-btn" @click="pause"></i> + <i class="iconfont icon-stop jessibuca-btn" @click="destroy"></i> + <i v-if="isNotMute" class="iconfont icon-audio-high jessibuca-btn" @click="jessibuca.mute()"></i> + <i v-if="!isNotMute" class="iconfont icon-audio-mute jessibuca-btn" @click="jessibuca.cancelMute()"></i> + </div> + <div class="buttons-box-right"> + <span class="jessibuca-btn">{{ kBps }} kb/s</span> + <!-- <i class="iconfont icon-file-record1 jessibuca-btn"></i>--> + <!-- <i class="iconfont icon-xiangqing2 jessibuca-btn" ></i>--> + <i class="iconfont icon-camera1196054easyiconnet jessibuca-btn" @click="jessibuca.screenshot('鎴浘','png',0.5)" + style="font-size: 1rem !important"></i> + <i class="iconfont icon-shuaxin11 jessibuca-btn" @click="playBtnClick"></i> + <i v-if="!fullscreen" class="iconfont icon-weibiaoti10 jessibuca-btn" @click="fullscreenSwich"></i> + <i v-if="fullscreen" class="iconfont icon-weibiaoti11 jessibuca-btn" @click="fullscreenSwich"></i> + </div> + </div> + </div> +</template> + +<script> +export default { + name: 'jessibuca', + data() { + return { + jessibuca: null, + playing: false, + isNotMute: false, + quieting: false, + fullscreen: false, + loaded: false, // mute + speed: 0, + performance: "", // 宸ヤ綔鎯呭喌 + kBps: 0, + btnDom: null, + videoInfo: null, + volume: 1, + rotate: 0, + vod: true, // 鐐规挱 + forceNoOffscreen: false, + }; + }, + props: ['videoUrl', 'error', 'hasAudio', 'height'], + mounted() { + window.onerror = (msg) => { + // console.error(msg) + }; + let paramUrl = decodeURIComponent(this.$route.params.url) + this.$nextTick(() => { + this.updatePlayerDomSize() + window.onresize = () => { + this.updatePlayerDomSize() + } + if (typeof (this.videoUrl) == "undefined") { + this.videoUrl = paramUrl; + } + this.btnDom = document.getElementById("buttonsBox"); + console.log("鍒濆鍖栨椂鐨勫湴鍧�涓�: " + this.videoUrl) + this.play(this.videoUrl) + }) + }, + watch: { + videoUrl(newData, oldData) { + this.play(newData) + }, + immediate: true + }, + methods: { + updatePlayerDomSize() { + let dom = document.getElementById('container'); + const width = dom.parentNode.clientWidth + dom.style.width = width + 'px'; + dom.style.height = (9 / 16) * width + "px"; + }, + create() { + let options = {}; + console.log(this.$refs.containerId) + console.log("hasAudio " + this.hasAudio) + + this.jessibuca = new window.Jessibuca(Object.assign( + { + container: this.$refs.containerId, + videoBuffer: 0.2, // 鏈�澶х紦鍐叉椂闀匡紝鍗曚綅绉� + isResize: true, + decoder: "static/js/jessibuca/decoder.js", + useMSE: false, + showBandwidth: false, + isFlv: true, + // text: "WVP-PRO", + // background: "static/images/zlm-logo.png", + loadingText: "鍔犺浇涓�", + hasAudio: typeof (this.hasAudio) == "undefined" ? true : this.hasAudio, + debug: false, + supportDblclickFullscreen: false, // 鏄惁鏀寔灞忓箷鐨勫弻鍑讳簨浠讹紝瑙﹀彂鍏ㄥ睆锛屽彇娑堝叏灞忎簨浠躲�� + operateBtns: { + fullscreen: false, + screenshot: false, + play: false, + audio: false, + recorder: false, + }, + record: "record", + vod: this.vod, + forceNoOffscreen: this.forceNoOffscreen, + isNotMute: this.isNotMute, + }, + options + )); + + let _this = this; + this.jessibuca.on("load", function () { + console.log("on load init"); + }); + + this.jessibuca.on("log", function (msg) { + console.log("on log", msg); + }); + this.jessibuca.on("record", function (msg) { + console.log("on record:", msg); + }); + this.jessibuca.on("pause", function () { + _this.playing = false; + }); + this.jessibuca.on("play", function () { + _this.playing = true; + }); + this.jessibuca.on("fullscreen", function (msg) { + console.log("on fullscreen", msg); + _this.fullscreen = msg + }); + + this.jessibuca.on("mute", function (msg) { + console.log("on mute", msg); + _this.isNotMute = !msg; + }); + this.jessibuca.on("audioInfo", function (msg) { + // console.log("audioInfo", msg); + }); + + this.jessibuca.on("videoInfo", function (msg) { + // this.videoInfo = msg; + console.log("videoInfo", msg); + + }); + + this.jessibuca.on("bps", function (bps) { + // console.log('bps', bps); + + }); + let _ts = 0; + this.jessibuca.on("timeUpdate", function (ts) { + // console.log('timeUpdate,old,new,timestamp', _ts, ts, ts - _ts); + _ts = ts; + }); + + this.jessibuca.on("videoInfo", function (info) { + console.log("videoInfo", info); + }); + + this.jessibuca.on("error", function (error) { + console.log("error", error); + }); + + this.jessibuca.on("timeout", function () { + console.log("timeout"); + }); + + this.jessibuca.on('start', function () { + console.log('start'); + }) + + this.jessibuca.on("performance", function (performance) { + let show = "鍗¢】"; + if (performance === 2) { + show = "闈炲父娴佺晠"; + } else if (performance === 1) { + show = "娴佺晠"; + } + _this.performance = show; + }); + this.jessibuca.on('buffer', function (buffer) { + // console.log('buffer', buffer); + }) + + this.jessibuca.on('stats', function (stats) { + // console.log('stats', stats); + }) + + this.jessibuca.on('kBps', function (kBps) { + _this.kBps = Math.round(kBps); + }); + + // 鏄剧ず鏃堕棿鎴� PTS + this.jessibuca.on('videoFrame', function () { + + }) + + // + this.jessibuca.on('metadata', function () { + + }); + }, + playBtnClick: function (event) { + this.play(this.videoUrl) + }, + play: function (url) { + console.log(url) + if (this.jessibuca) { + this.destroy(); + } + this.create(); + this.jessibuca.on("play", () => { + this.playing = true; + this.loaded = true; + this.quieting = this.jessibuca.quieting; + }); + if (this.jessibuca.hasLoaded()) { + this.jessibuca.play(url); + } else { + this.jessibuca.on("load", () => { + console.log("load 鎾斁") + this.jessibuca.play(url); + }); + } + }, + pause: function () { + if (this.jessibuca) { + this.jessibuca.pause(); + } + this.playing = false; + this.err = ""; + this.performance = ""; + }, + destroy: function () { + if (this.jessibuca) { + this.jessibuca.destroy(); + } + if (document.getElementById("buttonsBox") == null) { + document.getElementById("container").appendChild(this.btnDom) + } + this.jessibuca = null; + this.playing = false; + this.err = ""; + this.performance = ""; + + }, + eventcallbacK: function (type, message) { + // console.log("player 浜嬩欢鍥炶皟") + // console.log(type) + // console.log(message) + }, + fullscreenSwich: function () { + let isFull = this.isFullscreen() + this.jessibuca.setFullscreen(!isFull) + this.fullscreen = !isFull; + }, + isFullscreen: function () { + return document.fullscreenElement || + document.msFullscreenElement || + document.mozFullScreenElement || + document.webkitFullscreenElement || false; + } + }, + destroyed() { + if (this.jessibuca) { + this.jessibuca.destroy(); + } + this.playing = false; + this.loaded = false; + this.performance = ""; + }, +} +</script> + +<style> +.buttons-box { + width: 100%; + height: 28px; + background-color: rgba(43, 51, 63, 0.7); + position: absolute; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + left: 0; + bottom: 0; + user-select: none; + z-index: 10; +} + +.jessibuca-btn { + width: 20px; + color: rgb(255, 255, 255); + line-height: 27px; + margin: 0px 10px; + padding: 0px 2px; + cursor: pointer; + text-align: center; + font-size: 0.8rem !important; +} + +.buttons-box-right { + position: absolute; + right: 0; +} +</style> diff --git a/web_src/src/components/devicePosition.vue b/web_src/src/components/devicePosition.vue index 0ffd5fa..a807363 100644 --- a/web_src/src/components/devicePosition.vue +++ b/web_src/src/components/devicePosition.vue @@ -1,383 +1,357 @@ <template> - <div id="devicePosition" style="height: 100%"> - <div style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center;"> - <span style="font-size: 1rem; font-weight: 500">璁惧瀹氫綅 ({{ parentChannelId == 0 ? deviceId : parentChannelId }})</span> + <div id="devicePosition" style="width: 100vw; height: 91vh;"> + <el-container v-if="onOff" style="height: 91vh;" v-loading="isLoging"> + <el-aside width="auto" style="background-color: #ffffff"> + <DeviceTree ref="deviceTree" :clickEvent="clickEvent" :contextMenuEvent="contextmenuEventHandler" ></DeviceTree> + </el-aside> + <el-main style="height: 91vh; padding: 0"> + <MapComponent ref="map"></MapComponent> + </el-main> + </el-container> + <div v-if="!onOff" style="width: 100%; height:100%; text-align: center; line-height: 5rem"> + <p>鍦板浘鍔熻兘宸插叧闂�</p> </div> - <div style="background-color: #ffffff; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left; font-size: 14px;"> - <el-button icon="el-icon-arrow-left" size="mini" style="margin-right: 1rem" type="primary" @click="showDevice">杩斿洖</el-button> - <!-- <span class="demonstration">浠�</span> --> - <el-date-picker v-model="searchFrom" type="datetime" placeholder="閫夋嫨寮�濮嬫棩鏈熸椂闂�" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> - <el-date-picker v-model="searchTo" type="datetime" placeholder="閫夋嫨缁撴潫鏃ユ湡鏃堕棿" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> - <el-button-group> - <el-button icon="el-icon-search" size="mini" type="primary" @click="showHistoryPath">鍘嗗彶杞ㄨ抗</el-button> - <el-button icon="el-icon-search" size="mini" style="margin-right: 1rem" type="primary" @click="showLatestPosition">鏈�鏂颁綅缃�</el-button> - </el-button-group> - <el-tag style="width: 5rem; text-align: center" size="medium">杩囨湡鏃堕棿</el-tag> - <el-input-number size="mini" v-model="expired" :min="300" :controls="false" style="width: 4rem;"></el-input-number> - <el-tag style="width: 5rem; text-align: center" size="medium">涓婃姤鍛ㄦ湡</el-tag> - <el-input-number size="mini" v-model="interval" :min="1" :controls="false" style="width: 4rem;"></el-input-number> - <el-button-group> - <el-button icon="el-icon-search" size="mini" type="primary" @click="subscribeMobilePosition">浣嶇疆璁㈤槄</el-button> - <el-button icon="el-icon-search" size="mini" type="primary" @click="unSubscribeMobilePosition">鍙栨秷璁㈤槄</el-button> - </el-button-group> - <el-checkbox size="mini" style="margin-right: 1rem; float: right" v-model="autoList" @change="autoListChange" >鑷姩鍒锋柊</el-checkbox> + <div ref="infobox" v-if="channel != null " > + <div v-if="channel != null" class="infobox-content"> + <el-descriptions class="margin-top" :title="channel.name" :column="1" :colon="true" size="mini" :labelStyle="labelStyle" > + <el-descriptions-item label="鐢熶骇鍘傚晢">{{channel.manufacture}}</el-descriptions-item> + <el-descriptions-item label="鍨嬪彿">{{channel.model}}</el-descriptions-item> + <el-descriptions-item label="璁惧褰掑睘" >{{channel.owner}}</el-descriptions-item> + <el-descriptions-item label="琛屾斂鍖哄煙" >{{channel.civilCode}}</el-descriptions-item> + <el-descriptions-item label="瀹夎鍦板潃" >{{channel.address == null?'鏈煡': channel.address}}</el-descriptions-item> + <el-descriptions-item label="浜戝彴绫诲瀷" >{{channel.ptztypeText}}</el-descriptions-item> + <el-descriptions-item label="缁忕含搴�" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> + <el-descriptions-item label="鐘舵��"> + <el-tag size="small" v-if="channel.status === 1">鍦ㄧ嚎</el-tag> + <el-tag size="small" type="info" v-if="channel.status === 0">绂荤嚎</el-tag> + </el-descriptions-item> + </el-descriptions> + <div style="padding-top: 10px"> + <el-button type="primary" size="small" title="鎾斁" icon="el-icon-video-play" @click="play(channel)"></el-button> + <el-button type="primary" size="small" title="缂栬緫浣嶇疆" icon="el-icon-edit" @click="edit(channel)"></el-button> + <el-button type="primary" size="small" title="杞ㄨ抗鏌ヨ" icon="el-icon-map-location" @click="getTrace(channel)"></el-button> + </div> + <span class="infobox-close el-icon-close" @click="closeInfoBox()"></span> + </div> </div> - <div class="mapContainer" style="background-color: #ffffff; position: relative; padding: 1rem 0.5rem 0.5rem 0.5rem; text-align: center; height: calc(100% - 10rem);"> - <div class="baidumap" id="allmap"></div> - </div> + <devicePlayer ref="devicePlayer" ></devicePlayer> + <queryTrace ref="queryTrace" ></queryTrace> </div> </template> <script> -import uiHeader from "../layout/UiHeader.vue"; -import geoTools from "./GeoConvertTools.js"; +import MapComponent from "./common/MapComponent.vue"; +import DeviceService from "./service/DeviceService"; +import DeviceTree from "./common/DeviceTree"; +import channelMapInfobox from "./dialog/channelMapInfobox"; +import devicePlayer from './dialog/devicePlayer.vue' +import queryTrace from './dialog/queryTrace.vue' + export default { - name: "devicePosition", - components: { - uiHeader, - }, - data() { - return { - pickerOptions: { - shortcuts: [{ - text: '浠婂ぉ', - onClick(picker) { - picker.$emit('pick', new Date()); - } - }, { - text: '鏄ㄥぉ', - onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24); - picker.$emit('pick', date); - } - }, { - text: '涓�鍛ㄥ墠', - onClick(picker) { - const date = new Date(); - date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); - picker.$emit('pick', date); - } - }] + name: "devicePosition", + components: { + MapComponent, + DeviceTree, + channelMapInfobox, + devicePlayer, + queryTrace, + }, + data() { + return { + onOff: typeof window.mapParam !== "undefined", + deviceService: new DeviceService(), + layer: null, + lineLayer: null, + channel: null, + infoBoxId: null, + labelStyle: { + width: "56px" + }, + isLoging: false, + }; + }, + created() { + if (this.$route.query.deviceId) { + console.log(this.$route.query.deviceId) + // this.$refs.deviceTree.openByDeivceId(this.$route.query.deivceId) + setTimeout(()=>{ // 寤惰繜浠ョ瓑寰呭湴鍥惧姞杞藉畬鎴� TODO 鍚庣画淇敼涓洪�氳繃鏄疄闄呰繖锛涚姸鎬佸姞鍥炶皟瀹屾垚 + this.deviceService.getAllChannel(false, this.$route.query.deviceId, this.channelsHandler) + }, 1000) + + } + }, + destroyed() { + + }, + methods: { + clickEvent: function (data) { + if (data.channelId && data.subCount == 0) { + // 鐐瑰嚮閫氶亾 + if (data.longitude * data.latitude === 0) { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } else { + if (this.layer != null) { + this.$refs.map.removeLayer(this.layer); + } + this.closeInfoBox() + this.layer = this.$refs.map.addLayer([{ + position: [data.longitude, data.latitude], + image: { + src: this.getImageByChannel(data), + anchor: [0.5, 1] }, - deviceId: this.$route.params.deviceId, - showHistoryPosition: false, //鏄剧ず鍘嗗彶杞ㄨ抗 - startTime: null, - endTime: null, - searchFrom: null, - searchTo: null, - expired: 600, - interval: 5, - mobilePositionList: [], - mapPointList: [], - parentChannelId: this.$route.params.parentChannelId, - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - total: 0, - beforeUrl: "/deviceList", - isLoging: false, - autoList: false, - }; - }, - mounted() { - this.initData(); - this.initBaiduMap(); - if (this.autoList) { - this.updateLooper = setInterval(this.initData, 5000); + data: data + }], this.featureClickEvent) + this.$refs.map.panTo([data.longitude, data.latitude], mapParam.maxZoom) } + } }, - destroyed() { - // this.$destroy("videojs"); - clearTimeout(this.updateLooper); + contextmenuEventHandler: function (event, data) { + if (data.channelId && data.subCount == 0) { + // 鐐瑰嚮閫氶亾 + this.$contextmenu({ + items: [ + { + label: "鎾斁", + icon: "el-icon-video-play", + disabled: false, + onClick: () => { + this.play(data); + } + }, + { + label: "缂栬緫浣嶇疆", + icon: "el-icon-edit", + disabled: false, + onClick: () => { + this.edit(data) + } + }, + { + label: "杞ㄨ抗鏌ヨ", + icon: "el-icon-map-location", + disabled: false, + onClick: () => { + this.getTrace(data) + } + } + ], + event, // 榧犳爣浜嬩欢淇℃伅 + customClass: "custom-class", // 鑷畾涔夎彍鍗� class + zIndex: 3000, // 鑿滃崟鏍峰紡 z-index + }); + } else { + this.deviceOrSubChannelMenu(event, data) + } + }, - methods: { - initData: function () { - // if (this.parentChannelId == "" || this.parentChannelId == 0) { - // this.getDeviceChannelList(); - // } else { - // this.showSubchannels(); - // } - }, - initParam: function () { - // this.deviceId = this.$route.params.deviceId; - // this.parentChannelId = this.$route.params.parentChannelId; - // this.currentPage = parseInt(this.$route.params.page); - // this.count = parseInt(this.$route.params.count); - // if (this.parentChannelId == "" || this.parentChannelId == 0) { - // this.beforeUrl = "/deviceList"; - // } - }, - initBaiduMap() { - this.map = new BMap.Map("allmap"); // 鍒涘缓鍦板浘瀹炰緥 - let points = []; - let point = new BMap.Point(116.231398, 39.567445); // 鍒涘缓鐐瑰潗鏍� - this.map.centerAndZoom(point, 5); // 鍒濆鍖栧湴鍥撅紝璁剧疆涓績鐐瑰潗鏍囧拰鍦板浘绾у埆 - this.map.enableScrollWheelZoom(true); //寮�鍚紶鏍囨粴杞缉鏀� - this.map.addControl(new BMap.NavigationControl()); - this.map.addControl(new BMap.ScaleControl()); - this.map.addControl(new BMap.OverviewMapControl()); - this.map.addControl(new BMap.MapTypeControl()); - //map.setMapStyle({ style: 'midnight' }) //鍦板浘椋庢牸 - }, - currentChange: function (val) { - // var url = `/${this.$router.currentRoute.name}/${this.deviceId}/${this.parentChannelId}/${this.count}/${val}`; - // console.log(url); - // this.$router.push(url).then(() => { - // this.initParam(); - // this.initData(); - // }); - }, - handleSizeChange: function (val) { - // var url = `/${this.$router.currentRoute.name}/${this.$router.params.deviceId}/${this.$router.params.parentChannelId}/${val}/1`; - // this.$router.push(url).then(() => { - // this.initParam(); - // this.initData(); - // }); - }, - showDevice: function () { - this.$router.push(this.beforeUrl).then(() => { - this.initParam(); - this.initData(); - }); - }, - autoListChange: function () { - if (this.autoList) { - this.updateLooper = setInterval(this.initData, 1500); - } else { - window.clearInterval(this.updateLooper); + deviceOrSubChannelMenu: function (event, data) { + // 鐐瑰嚮璁惧 + this.$contextmenu({ + items: [ + { + label: "瀹氫綅", + icon: "el-icon-s-promotion", + disabled: false, + onClick: () => { + if (!data.channelId) { + this.deviceService.getAllChannel(false, data.deviceId, this.channelsHandler) + } + if (data.channelId && data.subCount > 0) { + // 鐐瑰嚮瀛愮洰褰� + this.deviceService.getAllSubChannel(false, data.deviceId, data.channelId, this.channelsHandler) + } } - }, - showHistoryPath: function () { - this.map.clearOverlays(); - this.mapPointList = []; - this.mobilePositionList = []; - if (!!this.searchFrom) { - this.startTime = this.toGBString(this.searchFrom); - console.log(this.startTime); - } else{ - this.startTime = null; - } - if (!!this.searchTo) { - this.endTime = this.toGBString(this.searchTo); - console.log(this.endTime); - } else { - this.endTime = null; - } - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/history/${this.deviceId}`, - params: { - start: self.startTime, - end: self.endTime, - }, - }).then(function (res) { - self.total = res.data.length; - self.mobilePositionList = res.data; - console.log(self.mobilePositionList); - if (self.total == 0) { - self.$message({ - showClose: true, - message: '鏈壘鍒扮鍚堟潯浠剁殑绉诲姩浣嶇疆淇℃伅', - type: 'error' - }); - } else { - self.$nextTick(() => { - self.showMarkPoints(self); - }); - } - }).catch(function (error) { - console.log(error); - }); - }, - showLatestPosition: function() { - this.map.clearOverlays(); - this.mapPointList = []; - this.mobilePositionList = []; - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/latest/${this.deviceId}` - }).then(function (res) { - console.log(res.data); - self.total = res.data.length; - self.mobilePositionList.push(res.data); - console.log(self.mobilePositionList); - if (self.total == 0) { - self.$message({ - showClose: true, - message: '鏈壘鍒扮鍚堟潯浠剁殑绉诲姩浣嶇疆淇℃伅', - type: 'error' - }); - } else { - self.$nextTick(() => { - self.showMarkPoints(self); - }); - } - }).catch(function (error) { - console.log(error); - }); - }, - subscribeMobilePosition: function() { - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/subscribe/${this.deviceId}`, - params: { - expires: self.expired, - interval: self.interval, - }, - }).then(function (res) { - console.log(res.data); - }) - .catch(function (error) { - console.log(error); - }); - }, - unSubscribeMobilePosition: function() { - let self = this; - this.$axios({ - method: 'get', - url:`/api/position/subscribe/${this.deviceId}`, - params: { - expires: 0, - interval: self.interval, - }, - }) - .then(function (res) { - console.log(res.data); - }).catch(function (error) { - console.log(error); - }); - }, - toGBString: function (dateTime) { - return ( - dateTime.getFullYear() + - "-" + this.twoDigits(dateTime.getMonth() + 1) + - "-" + this.twoDigits(dateTime.getDate()) + - "T" + this.twoDigits(dateTime.getHours()) + - ":" + this.twoDigits(dateTime.getMinutes()) + - ":" + this.twoDigits(dateTime.getSeconds()) - ); - }, - twoDigits: function (num) { - if (num < 10) { - return "0" + num; - } else { - return "" + num; - } - }, - showMarkPoints: function(self) { - let that = self; - let npointJ = null; - let npointW = null; - let point = null; - for (let i = 0; i < self.mobilePositionList.length; i++) { - if (self.mobilePositionList[i].geodeticSystem == "BD-09") { - npointJ = self.mobilePositionList[i].cnLng; - npointW = self.mobilePositionList[i].cnLat; - point = new BMap.Point(npointJ, npointW); - } else { - npointJ = self.mobilePositionList[i].longitude; - npointW = self.mobilePositionList[i].latitude; - let bd2 = geoTools.GPSToBaidu(npointJ, npointW); - point = new BMap.Point(bd2.lat, bd2.lng); - } - self.mapPointList.push(point); - let marker = new BMap.Marker(point); // 鍒涘缓鏍囨敞 - self.map.addOverlay(marker); // 灏嗘爣娉ㄦ坊鍔犲埌鍦板浘涓� - //鎻愮ず淇℃伅 鍙互瑙f瀽 HTML鏍囩浠ュ強CSS - let infoWindow = new BMap.InfoWindow(`<p style='text-align:left;font-weight:800'>璁惧: ${self.mobilePositionList[i].deviceId}</p> - <p style='text-align:left;font-weight:0'>鏃堕棿: ${self.mobilePositionList[i].time}</p>`); - // 榧犳爣绉讳笂鏍囨敞鐐硅鍙戠敓鐨勪簨 - marker.addEventListener("mouseover", function () { - this.openInfoWindow(infoWindow); - }); - // 榧犳爣绉诲紑鏍囨敞鐐硅鍙戠敓鐨勪簨 - marker.addEventListener("mouseout", function () { - this.closeInfoWindow(infoWindow); - }); - // 榧犳爣鐐瑰嚮鏍囨敞鐐硅鍙戠敓鐨勪簨鎯� - marker.addEventListener("click", function () { - alert("鐐瑰嚮"); - }); - } - let view = that.map.getViewport(eval(self.mapPointList)); - that.map.centerAndZoom(view.center, view.zoom); - }, + } + ], + event, // 榧犳爣浜嬩欢淇℃伅 + customClass: "custom-class", // 鑷畾涔夎彍鍗� class + zIndex: 3000, // 鑿滃崟鏍峰紡 z-index + }); + }, + channelsHandler: function (channels) { + console.log(2) + if (channels.length > 0) { + this.clean() + this.closeInfoBox() + let params = []; + for (let i = 0; i < channels.length; i++) { + if (channels[i].longitude * channels[i].latitude === 0) { + continue; + } + let item = { + position: [channels[i].longitude, channels[i].latitude], + image: { + src: this.getImageByChannel(channels[i]), + anchor: [0.5, 1] + }, + data: channels[i] + } + params.push(item); + } + console.log(3) + + this.layer = this.$refs.map.addLayer(params, this.featureClickEvent) + console.log(4) + if (params.length === 1) { + this.$refs.map.panTo([channels[0].longitude, channels[0].latitude], mapParam.maxZoom) + } else if (params.length > 1) { + this.$refs.map.fit(this.layer) + } else { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } + } else { + this.$message.error('鏈幏鍙栧埌浣嶇疆淇℃伅'); + } + }, + getImageByChannel: function (channel) { + let src = "static/images/gis/camera.png" + switch (channel.ptztype) { + case 1: + if (channel.status === 1) { + src = "static/images/gis/camera1.png" + } else { + src = "static/images/gis/camera1-offline.png" + } + break; + case 2: + if (channel.status === 1) { + src = "static/images/gis/camera2.png" + } else { + src = "static/images/gis/camera2-offline.png" + } + break; + case 3: + if (channel.status === 1) { + src = "static/images/gis/camera3.png" + } else { + src = "static/images/gis/camera3-offline.png" + } + break; + default: + if (channel.status === 1) { + src = "static/images/gis/camera.png" + } else { + src = "static/images/gis/camera-offline.png" + } + } + return src; + }, + featureClickEvent: function (channels) { + this.closeInfoBox() + if (channels.length > 0) { + this.channel = channels[0] + } + this.$nextTick(() => { + this.infoBoxId = this.$refs.map.openInfoBox([this.channel.longitude, this.channel.latitude], this.$refs.infobox, [0, -50]) + }) + }, + closeInfoBox: function () { + if (this.infoBoxId != null) { + this.$refs.map.closeInfoBox(this.infoBoxId) + } + }, + play: function (channel) { + + let deviceId = channel.deviceId; + this.isLoging = true; + let channelId = channel.channelId; + console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + let that = this; + this.$axios({ + method: 'get', + url: '/api/play/start/' + deviceId + '/' + channelId + }).then(function (res) { + that.isLoging = false; + if (res.data.code === 0) { + + that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { + streamInfo: res.data.data, + hasAudio: channel.hasAudio + }); + + } else { + that.$message.error(res.data.msg); + } + }).catch(function (e) { + }); + }, + edit: function (data) { + this.$message.warning('鏆備笉鏀寔'); + }, + getTrace: function (data) { + // this.$message.warning('鏆備笉鏀寔'); + this.clean() + this.$refs.queryTrace.openDialog(data, (channelPositions) => { + console.log("getTrace") + console.log(channelPositions) + if (channelPositions.length === 0) { + this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅'); + } else { + let positions = []; + for (let i = 0; i < channelPositions.length; i++) { + if (channelPositions[i].cnLng * channelPositions[i].cnLat > 0) { + positions.push([channelPositions[i].cnLng, channelPositions[i].cnLat]) + } + + } + if (positions.length === 0) { + this.$message.success('鏈煡璇㈠埌杞ㄨ抗淇℃伅'); + return; + } + this.lineLayer = this.$refs.map.addLineLayer(positions) + this.$refs.map.fit(this.lineLayer) + } + }) + }, + clean: function (){ + if (this.lineLayer != null) { + this.$refs.map.removeLayer(this.lineLayer) + } + if (this.infoBoxId != null) { + this.$refs.map.closeInfoBox(this.infoBoxId) + } + if (this.layer != null) { + this.$refs.map.removeLayer(this.layer) + } + } + }, + }; </script> <style> -.videoList { - display: flex; - flex-wrap: wrap; - align-content: flex-start; +.infobox-content{ + width: 260px; + background-color: #FFFFFF; + padding: 10px; + border-radius: 10px; + border: 1px solid #e2e2e2; } -.video-item { - position: relative; - width: 15rem; - height: 10rem; - margin-right: 1rem; - background-color: #000000; -} - -.video-item-img { +.infobox-content::after { position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - width: 100%; - height: 100%; -} - -.video-item-img:after { + bottom: -11px; + left: 130px; + display: block; content: ""; - display: inline-block; - position: absolute; - z-index: 2; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - width: 3rem; - height: 3rem; - background-image: url("../assets/loading.png"); - background-size: cover; - background-color: #000000; + width: 16px; + height: 16px; + background: url('~@static/images/arrow.png') no-repeat center; } - -.video-item-title { +.infobox-close { position: absolute; - bottom: 0; + right: 1rem; + top: 1rem; color: #000000; - background-color: #ffffff; - line-height: 1.5rem; - padding: 0.3rem; - width: 14.4rem; + cursor:pointer } - -.baidumap { +.el-descriptions__title { + font-size: 1rem; + font-weight: 700; + padding: 20px 20px 0px 23px; + text-align: center; width: 100%; - height: 100%; - border: none; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; -} - -/* 鍘婚櫎鐧惧害鍦板浘鐗堟潈閭h瀛� 鍜� 鐧惧害logo */ -.baidumap > .BMap_cpyCtrl { - display: none !important; -} -.baidumap > .anchorBL { - display: none !important; } </style> diff --git a/web_src/src/components/dialog/channelMapInfobox.vue b/web_src/src/components/dialog/channelMapInfobox.vue new file mode 100644 index 0000000..2ef0e52 --- /dev/null +++ b/web_src/src/components/dialog/channelMapInfobox.vue @@ -0,0 +1,65 @@ +<template> + <div id="channelMapInfobox" style="display: none"> + <div > + <el-descriptions class="margin-top" title="channel.name" :column="4" direction="vertical"> + <el-descriptions-item label="鐢熶骇鍘傚晢">{{channel.manufacture}}</el-descriptions-item> + <el-descriptions-item label="鍨嬪彿">{{channel.model}}</el-descriptions-item> + <el-descriptions-item label="璁惧褰掑睘" >{{channel.owner}}</el-descriptions-item> + <el-descriptions-item label="琛屾斂鍖哄煙" >{{channel.civilCode}}</el-descriptions-item> + <el-descriptions-item label="瀹夎鍦板潃" >{{channel.address}}</el-descriptions-item> + <el-descriptions-item label="浜戝彴绫诲瀷" >{{channel.ptztypeText}}</el-descriptions-item> + <el-descriptions-item label="缁忕含搴�" >{{channel.longitude}},{{channel.latitude}}</el-descriptions-item> + <el-descriptions-item label="鐘舵��"> + <el-tag size="small" v-if="channel.status === 1">鍦ㄧ嚎</el-tag> + <el-tag size="small" v-if="channel.status === 0">绂荤嚎</el-tag> + </el-descriptions-item> + </el-descriptions> + </div> + + <devicePlayer ref="devicePlayer" v-loading="isLoging"></devicePlayer> + </div> +</template> + +<script> +import devicePlayer from '../dialog/devicePlayer.vue' + +export default { + name: "channelMapInfobox", + props: ['channel'], + computed: {devicePlayer}, + created() {}, + data() { + return { + showDialog: false, + isLoging: false + }; + }, + methods: { + + play: function (){ + let deviceId = this.channel.deviceId; + this.isLoging = true; + let channelId = this.channel.channelId; + console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + let that = this; + this.$axios({ + method: 'get', + url: '/api/play/start/' + deviceId + '/' + channelId + }).then(function (res) { + that.isLoging = false; + if (res.data.code === 0) { + that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { + streamInfo: res.data.data, + hasAudio: this.channel.hasAudio + }); + } else { + that.$message.error(res.data.msg); + } + }).catch(function (e) { + }); + }, + close: function () { + }, + }, +}; +</script> diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index 2eb3acb..f0b4512 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -4,7 +4,7 @@ <el-dialog title="瑙嗛鎾斁" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" @close="close()"> <!-- <LivePlayer v-if="showVideoDialog" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" :message="videoError" :hasaudio="hasaudio" fluent autoplay live></LivePlayer> --> <div style="width: 100%; height: 100%"> - <player containerId="container" ref="videoPlayer" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></player> + <player ref="videoPlayer" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></player> </div> <div id="shared" style="text-align: right; margin-top: 1rem;"> <el-tabs v-model="tabActiveName" @tab-click="tabHandleClick"> @@ -185,7 +185,7 @@ // import player from '../dialog/rtcPlayer.vue' // import LivePlayer from '@liveqing/liveplayer' // import player from '../dialog/easyPlayer.vue' -import player from '../dialog/jessibuca.vue' +import player from '../common/jessibuca.vue' import recordDownload from '../dialog/recordDownload.vue' export default { name: 'devicePlayer', diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/dialog/jessibuca.vue deleted file mode 100644 index 339d3a2..0000000 --- a/web_src/src/components/dialog/jessibuca.vue +++ /dev/null @@ -1,316 +0,0 @@ -<template> - <div :id="containerId" :ref="containerId" style="width: 100%;height: auto; background-color: #000" @dblclick="fullscreenSwich"> - <div class="buttons-box" id="buttonsBox"> - <div class="buttons-box-left"> - <i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i> - <i v-if="playing" class="iconfont icon-pause jessibuca-btn" @click="pause"></i> - <i class="iconfont icon-stop jessibuca-btn" @click="destroy"></i> - <i v-if="isNotMute" class="iconfont icon-audio-high jessibuca-btn" @click="jessibuca.mute()"></i> - <i v-if="!isNotMute" class="iconfont icon-audio-mute jessibuca-btn" @click="jessibuca.cancelMute()"></i> - </div> - <div class="buttons-box-right"> - <span class="jessibuca-btn">{{kBps}} kb/s</span> - <!-- <i class="iconfont icon-file-record1 jessibuca-btn"></i>--> - <!-- <i class="iconfont icon-xiangqing2 jessibuca-btn" ></i>--> - <i class="iconfont icon-camera1196054easyiconnet jessibuca-btn" @click="jessibuca.screenshot('鎴浘','png',0.5)" style="font-size: 1rem !important"></i> - <i class="iconfont icon-shuaxin11 jessibuca-btn" @click="playBtnClick"></i> - <i v-if="!fullscreen" class="iconfont icon-weibiaoti10 jessibuca-btn" @click="fullscreenSwich"></i> - <i v-if="fullscreen" class="iconfont icon-weibiaoti11 jessibuca-btn" @click="fullscreenSwich"></i> - </div> - </div> - </div> -</template> - -<script> -export default { - name: 'jessibuca', - data() { - return { - jessibuca: null, - playing: false, - isNotMute: false, - quieting: false, - fullscreen: false, - loaded: false, // mute - speed: 0, - performance: "", // 宸ヤ綔鎯呭喌 - kBps: 0, - btnDom: null, - videoInfo: null, - volume: 1, - rotate: 0, - vod: true, // 鐐规挱 - forceNoOffscreen: false, - }; - }, - props: ['containerId','videoUrl', 'error', 'hasAudio', 'height'], - mounted () { - window.onerror = (msg) => { - // console.error(msg) - }; - let paramUrl = decodeURIComponent(this.$route.params.url) - this.$nextTick(() =>{ - let dom = document.getElementById(this.containerId); - if (dom.parentNode.clientHeight == 0) { - dom.style.height = (9/16 ) * dom.clientWidth + "px" - } - dom.style.height = dom.parentNode.clientHeight + "px"; - dom.style.width = dom.parentNode.clientWidth + "px"; - - if (typeof (this.videoUrl) == "undefined") { - this.videoUrl = paramUrl; - } - this.btnDom = document.getElementById("buttonsBox"); - console.log("鍒濆鍖栨椂鐨勫湴鍧�涓�: " + this.videoUrl) - this.play(this.videoUrl) - }) - }, - watch:{ - videoUrl(newData, oldData){ - this.play(newData) - }, - immediate:true - }, - methods: { - create(){ - let options = {}; - console.log(this.$refs[this.containerId]) - console.log("hasAudio " + this.hasAudio) - - this.jessibuca = new window.Jessibuca(Object.assign( - { - container: this.$refs[this.containerId], - videoBuffer: 0.2, // 鏈�澶х紦鍐叉椂闀匡紝鍗曚綅绉� - isResize: true, - decoder:"static/js/jessibuca/decoder.js", - useMSE: false, - showBandwidth: false, - isFlv: true, - // text: "WVP-PRO", - // background: "static/images/zlm-logo.png", - loadingText: "鍔犺浇涓�", - hasAudio: typeof (this.hasAudio) =="undefined"? true: this.hasAudio, - debug: false, - supportDblclickFullscreen: false, // 鏄惁鏀寔灞忓箷鐨勫弻鍑讳簨浠讹紝瑙﹀彂鍏ㄥ睆锛屽彇娑堝叏灞忎簨浠躲�� - operateBtns: { - fullscreen: false, - screenshot: false, - play: false, - audio: false, - recorder: false, - }, - record: "record", - vod: this.vod, - forceNoOffscreen: this.forceNoOffscreen, - isNotMute: this.isNotMute, - }, - options - )); - - let _this = this; - this.jessibuca.on("load", function () { - console.log("on load init"); - }); - - this.jessibuca.on("log", function (msg) { - console.log("on log", msg); - }); - this.jessibuca.on("record", function (msg) { - console.log("on record:", msg); - }); - this.jessibuca.on("pause", function () { - _this.playing = false; - }); - this.jessibuca.on("play", function () { - _this.playing = true; - }); - this.jessibuca.on("fullscreen", function (msg) { - console.log("on fullscreen", msg); - _this.fullscreen = msg - }); - - this.jessibuca.on("mute", function (msg) { - console.log("on mute", msg); - _this.isNotMute = !msg; - }); - this.jessibuca.on("audioInfo", function (msg) { - // console.log("audioInfo", msg); - }); - - this.jessibuca.on("videoInfo", function (msg) { - // this.videoInfo = msg; - console.log("videoInfo", msg); - - }); - - this.jessibuca.on("bps", function (bps) { - // console.log('bps', bps); - - }); - let _ts = 0; - this.jessibuca.on("timeUpdate", function (ts) { - // console.log('timeUpdate,old,new,timestamp', _ts, ts, ts - _ts); - _ts = ts; - }); - - this.jessibuca.on("videoInfo", function (info) { - console.log("videoInfo", info); - }); - - this.jessibuca.on("error", function (error) { - console.log("error", error); - }); - - this.jessibuca.on("timeout", function () { - console.log("timeout"); - }); - - this.jessibuca.on('start', function () { - console.log('start'); - }) - - this.jessibuca.on("performance", function (performance) { - let show = "鍗¢】"; - if (performance === 2) { - show = "闈炲父娴佺晠"; - } else if (performance === 1) { - show = "娴佺晠"; - } - _this.performance = show; - }); - this.jessibuca.on('buffer', function (buffer) { - // console.log('buffer', buffer); - }) - - this.jessibuca.on('stats', function (stats) { - // console.log('stats', stats); - }) - - this.jessibuca.on('kBps', function (kBps) { - _this.kBps = Math.round(kBps); - }); - - // 鏄剧ず鏃堕棿鎴� PTS - this.jessibuca.on('videoFrame', function () { - - }) - - // - this.jessibuca.on('metadata', function () { - - }); - }, - resize(){ - if (this.jessibuca){ - this.jessibuca.resize() - this.$nextTick(() =>{ - let dom = document.getElementById(this.containerId); - if (dom.parentNode.clientHeight == 0) { - dom.style.height = (9/16 ) * dom.clientWidth + "px" - } - dom.style.height = dom.parentNode.clientHeight + "px"; - dom.style.width = dom.parentNode.clientWidth + "px"; - }) - } - }, - playBtnClick: function (event){ - this.play(this.videoUrl) - }, - play: function (url) { - console.log(url) - if (this.jessibuca) { - this.destroy(); - } - this.create(); - this.jessibuca.on("play", () => { - this.playing = true; - this.loaded = true; - this.quieting = this.jessibuca.quieting; - }); - if (this.jessibuca.hasLoaded()) { - this.jessibuca.play(url); - } else { - this.jessibuca.on("load", () => { - console.log("load 鎾斁") - this.jessibuca.play(url); - }); - } - }, - pause: function () { - if (this.jessibuca) { - this.jessibuca.pause(); - } - this.playing = false; - this.err = ""; - this.performance = ""; - }, - destroy: function () { - if (this.jessibuca) { - this.jessibuca.destroy(); - } - if (document.getElementById("buttonsBox") == null) { - document.getElementById("container").appendChild(this.btnDom) - } - this.jessibuca = null; - this.playing = false; - this.err = ""; - this.performance = ""; - - }, - eventcallbacK: function(type, message) { - // console.log("player 浜嬩欢鍥炶皟") - // console.log(type) - // console.log(message) - }, - fullscreenSwich: function (){ - let isFull = this.isFullscreen() - this.jessibuca.setFullscreen(!isFull) - this.fullscreen = !isFull; - }, - isFullscreen: function (){ - return document.fullscreenElement || - document.msFullscreenElement || - document.mozFullScreenElement || - document.webkitFullscreenElement || false; - } - }, - destroyed() { - if (this.jessibuca) { - this.jessibuca.destroy(); - } - this.playing = false; - this.loaded = false; - this.performance = ""; - }, -} -</script> - -<style> - .buttons-box{ - width: 100%; - height: 28px; - background-color: rgba(43, 51, 63, 0.7); - position: absolute; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - left: 0; - bottom: 0; - user-select: none; - z-index: 10; - } - .jessibuca-btn{ - width: 20px; - color: rgb(255, 255, 255); - line-height: 27px; - margin: 0px 10px; - padding: 0px 2px; - cursor: pointer; - text-align: center; - font-size: 0.8rem !important; - } - .buttons-box-right { - position: absolute; - right: 0; - } -</style> diff --git a/web_src/src/components/dialog/queryTrace.vue b/web_src/src/components/dialog/queryTrace.vue new file mode 100644 index 0000000..bb12765 --- /dev/null +++ b/web_src/src/components/dialog/queryTrace.vue @@ -0,0 +1,100 @@ +<template> + <div id="queryTrace" > + <el-dialog + title="鏌ヨ杞ㄨ抗" + width="40%" + top="2rem" + :close-on-click-modal="false" + :visible.sync="showDialog" + :destroy-on-close="true" + @close="close()" + > + <div v-loading="isLoging"> + <el-date-picker v-model="searchFrom" type="datetime" placeholder="閫夋嫨寮�濮嬫棩鏈熸椂闂�" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> + <el-date-picker v-model="searchTo" type="datetime" placeholder="閫夋嫨缁撴潫鏃ユ湡鏃堕棿" default-time="00:00:00" size="mini" style="width: 11rem;" align="right" :picker-options="pickerOptions"></el-date-picker> + <el-button icon="el-icon-search" size="mini" type="primary" @click="onSubmit">鏌ヨ</el-button> + </div> + + </el-dialog> + </div> +</template> + +<script> +import DeviceService from '../service/DeviceService' + +export default { + name: "deviceEdit", + props: [], + computed: {}, + created() {}, + data() { + return { + deviceService: new DeviceService(), + pickerOptions: { + shortcuts: [{ + text: '浠婂ぉ', + onClick(picker) { + picker.$emit('pick', new Date()); + } + }, { + text: '鏄ㄥぉ', + onClick(picker) { + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24); + picker.$emit('pick', date); + } + }, { + text: '涓�鍛ㄥ墠', + onClick(picker) { + const date = new Date(); + date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', date); + } + }] + }, + searchFrom: null, + searchTo: null, + listChangeCallback: null, + showDialog: false, + isLoging: false, + channel: null, + callback: null, + }; + }, + methods: { + openDialog: function (channel, callback) { + console.log(channel) + this.showDialog = true; + this.callback = callback; + this.channel = channel; + }, + + onSubmit: function () { + console.log("onSubmit"); + this.isLoging = true; + this.$axios.get(`/api/position/history/${this.channel.deviceId}/${this.channel.channelId}`, { + }).then((res)=> { + this.isLoging = false; + if (typeof this.callback == "function") { + if (res.data.code == 0) { + this.callback(res.data.data) + this.close() + }else { + this.$message.error(res.data.msg); + } + + } + }).catch(function (error) { + this.isLoging = false; + console.error(error); + }) + }, + close: function () { + this.showDialog = false; + this.isLoging = false; + this.callback = null; + this.channel = null; + }, + }, +}; +</script> diff --git a/web_src/src/components/live.vue b/web_src/src/components/live.vue index 366672d..f6edcdf 100644 --- a/web_src/src/components/live.vue +++ b/web_src/src/components/live.vue @@ -1,36 +1,24 @@ <template> - <div id="devicePosition" style="height: 100%;width: 100%"> - <el-container v-loading="loading" element-loading-text="鎷煎懡鍔犺浇涓�"> + <div id="devicePosition" style="width:100vw; height: 91vh"> + <el-container v-loading="loading" style="height: 91vh;" element-loading-text="鎷煎懡鍔犺浇涓�"> <el-aside width="300px" style="background-color: #ffffff"> - <div style="text-align: center;padding-top: 20px;">璁惧鍒楄〃</div> - <el-menu v-loading="loading"> - <el-submenu v-for="device in deviceList" :key="device.deviceId" :index="device.deviceId" @click="sendDevicePush(item)"> - <template slot="title" > - <i class="el-icon-location-outline"></i> - {{device.name}} - </template> - <ChannelTree :device="device" @sendDevicePush="sendDevicePush"></ChannelTree> - </el-submenu> - </el-menu> + <DeviceTree :clickEvent="clickEvent" :contextMenuEvent="contextMenuEvent"></DeviceTree> </el-aside> <el-container> - <!-- <LivePlay></LivePlay> --> - <el-header height="40px" style="text-align: left;font-size: 17px;line-height: 40px;"> + <el-header height="5vh" style="text-align: left;font-size: 17px;line-height:5vh"> 鍒嗗睆: <i class="el-icon-full-screen btn" :class="{active:spilt==1}" @click="spilt=1"/> <i class="el-icon-menu btn" :class="{active:spilt==4}" @click="spilt=4"/> <i class="el-icon-s-grid btn" :class="{active:spilt==9}" @click="spilt=9"/> </el-header> - <el-main> - <div style="width: 100%;height: calc( 100vh - 150px );display: flex;flex-wrap: wrap;background-color: #000;"> + <el-main style="padding: 0;"> + <div style="width: 99%;height: 85vh;display: flex;flex-wrap: wrap;background-color: #000;"> <div v-for="i in spilt" :key="i" class="play-box" :style="liveStyle" :class="{redborder:playerIdx == (i-1)}" @click="playerIdx = (i-1)" > - <div v-if="!videoUrl[i-1]" style="color: #ffffff;font-size: 30px;font-weight: bold;">{{i}}</div> - <player v-else :ref="'player'+i" :videoUrl="videoUrl[i-1]" fluent autoplay :height="true" - :containerId="'player'+i" @screenshot="shot" @destroy="destroy"></player> - <!-- <player v-else ref="'player'+i" :idx="'player'+i" :visible.sync="showVideoDialog" :videoUrl="videoUrl[i-1]" :height="true" :hasAudio="hasAudio" fluent autoplay live ></player> --> + <div v-if="!videoUrl[i-1]" style="color: #ffffff;font-size: 30px;font-weight: bold;">{{ i }}</div> + <player v-else :videoUrl="videoUrl[i-1]" fluent autoplay @screenshot="shot" @destroy="destroy"/> </div> </div> </el-main> @@ -40,313 +28,268 @@ </template> <script> - import uiHeader from "../layout/UiHeader.vue"; - import player from './dialog/jessibuca.vue' - import ChannelTree from './channelTree.vue' +import uiHeader from "../layout/UiHeader.vue"; +import player from './common/jessibuca.vue' +import DeviceTree from './common/DeviceTree.vue' - export default { - name: "live", - components: { - uiHeader, player, ChannelTree - }, - data() { - return { - showVideoDialog: true, - hasAudio: false, - videoUrl:[''], - spilt:1,//鍒嗗睆 - playerIdx:0,//婵�娲绘挱鏀惧櫒 +export default { + name: "live", + components: { + uiHeader, player, DeviceTree + }, + data() { + return { + videoUrl: [''], + spilt: 1,//鍒嗗睆 + playerIdx: 0,//婵�娲绘挱鏀惧櫒 - deviceList: [], //璁惧鍒楄〃 - currentDevice: {}, //褰撳墠鎿嶄綔璁惧瀵硅薄 + updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 + count: 15, + total: 0, - videoComponentList: [], - updateLooper: 0, //鏁版嵁鍒锋柊杞鏍囧織 - currentDeviceChannelsLenth:0, - winHeight: window.innerHeight - 200, - currentPage:1, - count:15, - total:0, - getDeviceListLoading: false, + //channel + loading: false + }; + }, + mounted() { - //channel - searchSrt: "", - channelType: "", - online: "", - channelTotal:0, - deviceChannelList:[], - loading:false - }; - }, - mounted() { - this.initData(); + }, + created() { + this.checkPlayByParam() + }, - }, - created(){ - this.checkPlayByParam() - }, - - computed:{ - liveStyle(){ - if(this.spilt==1){ - return {width:'100%',height:'100%'} - }else if(this.spilt==4){ - return {width:'49%',height:'49%'} - }else if(this.spilt==9){ - return {width:'32%',height:'32%'} - } - } - }, - watch:{ - spilt(newValue){ - console.log("鍒囨崲鐢诲箙;"+newValue) - let that = this - for (let i = 1; i <= newValue; i++) { - if(!that.$refs['player'+i]){ - continue - } - this.$nextTick(()=>{ - if(that.$refs['player'+i] instanceof Array){ - that.$refs['player'+i][0].resize() - }else { - that.$refs['player'+i].resize() - } - }) - - } - window.localStorage.setItem('split',newValue) - }, - '$route.fullPath':'checkPlayByParam' - }, - destroyed() { - clearTimeout(this.updateLooper); - }, - methods: { - initData: function () { - this.getDeviceList(); - - }, - destroy(idx) { - console.log(idx); - this.clear(idx.substring(idx.length-1)) - }, - getDeviceList: function() { - let that = this; - this.$axios({ - method: 'get', - url:`/api/device/query/devices`, - params: { - page: that.currentPage, - count: that.count - } - }).then(function (res) { - console.log(res.data.list); - that.total = res.data.total; - - that.deviceList = res.data.list.map(item=>{return {deviceChannelList:[],...item}}); - that.getDeviceListLoading = false; - }).catch(function (error) { - console.log(error); - that.getDeviceListLoading = false; - }); - }, - //閫氱煡璁惧涓婁紶濯掍綋娴� - sendDevicePush: function (itemData) { - if(itemData.status===0){ - this.$message.error('璁惧绂荤嚎!'); - return - } - this.save(itemData) - let deviceId = itemData.deviceId; - // this.isLoging = true; - let channelId = itemData.channelId; - console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId ); - let idxTmp = this.playerIdx - let that = this; - this.loading = true - this.$axios({ - method: 'get', - url: '/api/play/start/' + deviceId + '/' + channelId - }).then(function (res) { - // that.isLoging = false; - console.log('=====----=====') - console.log(res) - if (res.data.code == 0 && res.data.data) { - itemData.playUrl = res.data.data.httpsFlv - that.setPlayUrl(res.data.data.ws_flv,idxTmp) - }else { - that.$message.error(res.data.msg); - } - }).catch(function (e) { - }).finally(()=>{ - that.loading = false - }); - }, - setPlayUrl(url,idx){ - this.$set(this.videoUrl,idx,url) - let _this = this - setTimeout(()=>{ - window.localStorage.setItem('videoUrl',JSON.stringify(_this.videoUrl)) - },100) - - }, - checkPlayByParam(){ - let {deviceId,channelId} = this.$route.query - if(deviceId && channelId){ - this.sendDevicePush({deviceId,channelId}) - } - }, - convertImageToCanvas(image) { - var canvas = document.createElement("canvas"); - canvas.width = image.width; - canvas.height = image.height; - canvas.getContext("2d").drawImage(image, 0, 0); - return canvas; - }, - shot(e){ - // console.log(e) - // send({code:'image',data:e}) - var base64ToBlob = function(code) { - let parts = code.split(';base64,'); - let contentType = parts[0].split(':')[1]; - let raw = window.atob(parts[1]); - let rawLength = raw.length; - let uInt8Array = new Uint8Array(rawLength); - for(let i = 0; i < rawLength; ++i) { - uInt8Array[i] = raw.charCodeAt(i); - } - return new Blob([uInt8Array], { - type: contentType - }); - }; - let aLink = document.createElement('a'); - let blob = base64ToBlob(e); //new Blob([content]); - let evt = document.createEvent("HTMLEvents"); - evt.initEvent("click", true, true); //initEvent 涓嶅姞鍚庝袱涓弬鏁板湪FF涓嬩細鎶ラ敊 浜嬩欢绫诲瀷锛屾槸鍚﹀啋娉★紝鏄惁闃绘娴忚鍣ㄧ殑榛樿琛屼负 - aLink.download = '鎴浘'; - aLink.href = URL.createObjectURL(blob); - aLink.click(); - }, - save(item){ - let dataStr = window.localStorage.getItem('playData') || '[]' - let data = JSON.parse(dataStr); - data[this.playerIdx] = item - window.localStorage.setItem('playData',JSON.stringify(data)) - }, - clear(idx) { - let dataStr = window.localStorage.getItem('playData') || '[]' - let data = JSON.parse(dataStr); - data[idx-1] = null; - console.log(data); - window.localStorage.setItem('playData',JSON.stringify(data)) - }, - loadAndPlay(){ - let dataStr = window.localStorage.getItem('playData') || '[]' - let data = JSON.parse(dataStr); - - data.forEach((item,i)=>{ - if(item){ - this.playerIdx = i - this.sendDevicePush(item) - } - }) + computed: { + liveStyle() { + if (this.spilt == 1) { + return {width: '100%', height: '100%'} + } else if (this.spilt == 4) { + return {width: '49%', height: '49%'} + } else if (this.spilt == 9) { + return {width: '32%', height: '32%'} } } - }; + }, + watch: { + spilt(newValue) { + console.log("鍒囨崲鐢诲箙;" + newValue) + let that = this + for (let i = 1; i <= newValue; i++) { + if (!that.$refs['player' + i]) { + continue + } + this.$nextTick(() => { + if (that.$refs['player' + i] instanceof Array) { + that.$refs['player' + i][0].resize() + } else { + that.$refs['player' + i].resize() + } + }) + + } + window.localStorage.setItem('split', newValue) + }, + '$route.fullPath': 'checkPlayByParam' + }, + destroyed() { + clearTimeout(this.updateLooper); + }, + methods: { + destroy(idx) { + console.log(idx); + this.clear(idx.substring(idx.length - 1)) + }, + clickEvent: function (data) { + if (data.channelId && data.subCount == 0) { + this.sendDevicePush(data) + } + }, + contextMenuEvent: function (data) { + + }, + //閫氱煡璁惧涓婁紶濯掍綋娴� + sendDevicePush: function (itemData) { + if (itemData.status === 0) { + this.$message.error('璁惧绂荤嚎!'); + return + } + this.save(itemData) + let deviceId = itemData.deviceId; + // this.isLoging = true; + let channelId = itemData.channelId; + console.log("閫氱煡璁惧鎺ㄦ祦1锛�" + deviceId + " : " + channelId); + let idxTmp = this.playerIdx + let that = this; + this.loading = true + this.$axios({ + method: 'get', + url: '/api/play/start/' + deviceId + '/' + channelId + }).then(function (res) { + // that.isLoging = false; + console.log('=====----=====') + console.log(res) + if (res.data.code == 0 && res.data.data) { + itemData.playUrl = res.data.data.httpsFlv + that.setPlayUrl(res.data.data.ws_flv, idxTmp) + } else { + that.$message.error(res.data.msg); + } + }).catch(function (e) { + }).finally(() => { + that.loading = false + }); + }, + setPlayUrl(url, idx) { + this.$set(this.videoUrl, idx, url) + let _this = this + setTimeout(() => { + window.localStorage.setItem('videoUrl', JSON.stringify(_this.videoUrl)) + }, 100) + + }, + checkPlayByParam() { + let {deviceId, channelId} = this.$route.query + if (deviceId && channelId) { + this.sendDevicePush({deviceId, channelId}) + } + }, + shot(e) { + // console.log(e) + // send({code:'image',data:e}) + var base64ToBlob = function (code) { + let parts = code.split(';base64,'); + let contentType = parts[0].split(':')[1]; + let raw = window.atob(parts[1]); + let rawLength = raw.length; + let uInt8Array = new Uint8Array(rawLength); + for (let i = 0; i < rawLength; ++i) { + uInt8Array[i] = raw.charCodeAt(i); + } + return new Blob([uInt8Array], { + type: contentType + }); + }; + let aLink = document.createElement('a'); + let blob = base64ToBlob(e); //new Blob([content]); + let evt = document.createEvent("HTMLEvents"); + evt.initEvent("click", true, true); //initEvent 涓嶅姞鍚庝袱涓弬鏁板湪FF涓嬩細鎶ラ敊 浜嬩欢绫诲瀷锛屾槸鍚﹀啋娉★紝鏄惁闃绘娴忚鍣ㄧ殑榛樿琛屼负 + aLink.download = '鎴浘'; + aLink.href = URL.createObjectURL(blob); + aLink.click(); + }, + save(item) { + let dataStr = window.localStorage.getItem('playData') || '[]' + let data = JSON.parse(dataStr); + data[this.playerIdx] = item + window.localStorage.setItem('playData', JSON.stringify(data)) + }, + clear(idx) { + let dataStr = window.localStorage.getItem('playData') || '[]' + let data = JSON.parse(dataStr); + data[idx - 1] = null; + console.log(data); + window.localStorage.setItem('playData', JSON.stringify(data)) + }, + } +}; </script> <style> - .btn{ - margin: 0 10px; +.btn { + margin: 0 10px; - } - .btn:hover{ - color: #409EFF; - } - .btn.active{ - color: #409EFF; +} - } - .redborder{ - border: 2px solid red !important; - } - .play-box{ - background-color: #000000; - border: 2px solid #505050; - display: flex; - align-items: center; - justify-content: center; - } +.btn:hover { + color: #409EFF; +} + +.btn.active { + color: #409EFF; + +} + +.redborder { + border: 2px solid red !important; +} + +.play-box { + background-color: #000000; + border: 2px solid #505050; + display: flex; + align-items: center; + justify-content: center; +} </style> <style> - .videoList { - display: flex; - flex-wrap: wrap; - align-content: flex-start; - } +.videoList { + display: flex; + flex-wrap: wrap; + align-content: flex-start; +} - .video-item { - position: relative; - width: 15rem; - height: 10rem; - margin-right: 1rem; - background-color: #000000; - } +.video-item { + position: relative; + width: 15rem; + height: 10rem; + margin-right: 1rem; + background-color: #000000; +} - .video-item-img { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - width: 100%; - height: 100%; - } +.video-item-img { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + width: 100%; + height: 100%; +} - .video-item-img:after { - content: ""; - display: inline-block; - position: absolute; - z-index: 2; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: auto; - width: 3rem; - height: 3rem; - background-image: url("../assets/loading.png"); - background-size: cover; - background-color: #000000; - } +.video-item-img:after { + content: ""; + display: inline-block; + position: absolute; + z-index: 2; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + width: 3rem; + height: 3rem; + background-image: url("../assets/loading.png"); + background-size: cover; + background-color: #000000; +} - .video-item-title { - position: absolute; - bottom: 0; - color: #000000; - background-color: #ffffff; - line-height: 1.5rem; - padding: 0.3rem; - width: 14.4rem; - } +.video-item-title { + position: absolute; + bottom: 0; + color: #000000; + background-color: #ffffff; + line-height: 1.5rem; + padding: 0.3rem; + width: 14.4rem; +} - .baidumap { - width: 100%; - height: 100%; - border: none; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - } +.baidumap { + width: 100%; + height: 100%; + border: none; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; +} - /* 鍘婚櫎鐧惧害鍦板浘鐗堟潈閭h瀛� 鍜� 鐧惧害logo */ - .baidumap > .BMap_cpyCtrl { - display: none !important; - } - .baidumap > .anchorBL { - display: none !important; - } +/* 鍘婚櫎鐧惧害鍦板浘鐗堟潈閭h瀛� 鍜� 鐧惧害logo */ +.baidumap > .BMap_cpyCtrl { + display: none !important; +} + +.baidumap > .anchorBL { + display: none !important; +} </style> diff --git a/web_src/src/components/service/DeviceService.js b/web_src/src/components/service/DeviceService.js new file mode 100644 index 0000000..6149579 --- /dev/null +++ b/web_src/src/components/service/DeviceService.js @@ -0,0 +1,123 @@ +import axios from 'axios'; + +class DeviceService{ + + constructor() { + this.$axios = axios; + } + + getDeviceList(currentPage, count, callback, errorCallback){ + this.$axios({ + method: 'get', + url:`/api/device/query/devices`, + params: { + page: currentPage, + count: count + } + }).then((res) => { + if (typeof (callback) == "function") callback(res.data) + }).catch((error) => { + console.log(error); + if (typeof (errorCallback) == "function") errorCallback(error) + }); + } + getAllDeviceList(callback, errorCallback) { + let currentPage = 1; + let count = 100; + let deviceList = [] + this.getAllDeviceListIteration(deviceList, currentPage, count, (data) => { + if (typeof (callback) == "function") callback(data) + }, errorCallback) + } + + getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) { + this.getDeviceList(currentPage, count, (data) => { + if (data.list) { + deviceList = deviceList.concat(data.list); + if (deviceList.length < data.total) { + currentPage ++ + this.getAllDeviceListIteration(deviceList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(deviceList) + } + } + }, errorCallback) + } + + + getAllChannel(isCatalog, deviceId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) { + this.getChanel(isCatalog, deviceId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllChannelIteration(isCatalog, deviceId, catalogList, currentPage, count, callback, errorCallback) + }else { + console.log(1) + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getChanel(isCatalog, deviceId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/devices/${deviceId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } + + + getAllSubChannel(isCatalog, deviceId, channelId, callback, errorCallback) { + let currentPage = 1; + let count = 100; + let catalogList = [] + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + } + + getAllSubChannelIteration(isCatalog, deviceId,channelId, catalogList, currentPage, count, callback, errorCallback) { + this.getSubChannel(isCatalog, deviceId, channelId, currentPage, count, (data) => { + if (data.list) { + catalogList = catalogList.concat(data.list); + if (catalogList.length < data.total) { + currentPage ++ + this.getAllSubChannelIteration(isCatalog, deviceId, channelId, catalogList, currentPage, count, callback, errorCallback) + }else { + if (typeof (callback) == "function") callback(catalogList) + } + } + }, errorCallback) + } + getSubChannel(isCatalog, deviceId, channelId, currentPage, count, callback, errorCallback) { + this.$axios({ + method: 'get', + url: `/api/device/query/sub_channels/${deviceId}/${channelId}/channels`, + params:{ + page: currentPage, + count: count, + query: "", + online: "", + channelType: isCatalog + } + }).then((res) =>{ + if (typeof (callback) == "function") callback(res.data) + }).catch(errorCallback); + } +} + +export default DeviceService; diff --git a/web_src/src/components/service/MediaServer.js b/web_src/src/components/service/MediaServer.js index 36474ea..d4446f0 100644 --- a/web_src/src/components/service/MediaServer.js +++ b/web_src/src/components/service/MediaServer.js @@ -10,9 +10,9 @@ this.$axios({ method: 'get', url:`/api/server/media_server/online/list`, - }).then(function (res) { + }).then((res) => { if (typeof (callback) == "function") callback(res.data) - }).catch(function (error) { + }).catch((error) => { console.log(error); }); } diff --git a/web_src/src/layout/UiHeader.vue b/web_src/src/layout/UiHeader.vue index 10410bd..a0a252c 100644 --- a/web_src/src/layout/UiHeader.vue +++ b/web_src/src/layout/UiHeader.vue @@ -5,6 +5,7 @@ <el-menu-item index="/control">鎺у埗鍙�</el-menu-item> <el-menu-item index="/live">瀹炴椂鐩戞帶</el-menu-item> <el-menu-item index="/deviceList">鍥芥爣璁惧</el-menu-item> + <el-menu-item index="/map">鐢靛瓙鍦板浘</el-menu-item> <el-menu-item index="/pushVideoList">鎺ㄦ祦鍒楄〃</el-menu-item> <el-menu-item index="/streamProxyList">鎷夋祦浠g悊</el-menu-item> <el-menu-item index="/cloudRecord">浜戠褰曞儚</el-menu-item> @@ -47,7 +48,6 @@ if (this.$route.path.startsWith("/channelList")) { this.activeIndex = "/deviceList" } - }, mounted() { window.addEventListener('beforeunload', e => this.beforeunloadHandler(e)) diff --git a/web_src/src/layout/index.vue b/web_src/src/layout/index.vue index 4fdbc72..dccf662 100644 --- a/web_src/src/layout/index.vue +++ b/web_src/src/layout/index.vue @@ -24,26 +24,6 @@ } </script> <style> -/*瀹氫箟婊氬姩鏉¢珮瀹藉強鑳屾櫙 楂樺鍒嗗埆瀵瑰簲妯珫婊氬姩鏉$殑灏哄*/ -::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -/*瀹氫箟婊氬姩鏉¤建閬� 鍐呴槾褰�+鍦嗚*/ -::-webkit-scrollbar-track { - border-radius: 4px; - background-color: #F5F5F5; -} - -/*瀹氫箟婊戝潡 鍐呴槾褰�+鍦嗚*/ -::-webkit-scrollbar-thumb { - border-radius: 4px; - background-color: #c8c8c8; - box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); - -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .1); -} - /*瀹氫箟鏍囬鏍�*/ .page-header { background-color: #FFFFFF; @@ -64,10 +44,6 @@ } </style> <style scoped> -.el-main { - margin: 0; -} - .fade-enter { visibility: hidden; opacity: 0; diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js index 356bc33..8844862 100644 --- a/web_src/src/router/index.js +++ b/web_src/src/router/index.js @@ -16,8 +16,9 @@ import sip from '../components/setting/Sip.vue' import media from '../components/setting/Media.vue' import live from '../components/live.vue' +import deviceTree from '../components/common/DeviceTree.vue' -import wasmPlayer from '../components/dialog/jessibuca.vue' +import wasmPlayer from '../components/common/jessibuca.vue' import rtcPlayer from '../components/dialog/rtcPlayer.vue' const originalPush = VueRouter.prototype.push @@ -98,14 +99,9 @@ component: media, }, { - path: '/play/wasm/:url', - name: 'wasmPlayer', - component: wasmPlayer, - }, - { - path: '/play/rtc/:url', - name: 'rtcPlayer', - component: rtcPlayer, + path: '/map', + name: 'devicePosition', + component: devicePosition, }, ] }, @@ -114,5 +110,20 @@ name: '鐧诲綍', component: login, }, + { + path: '/test', + name: 'deviceTree', + component: deviceTree, + }, + { + path: '/play/wasm/:url', + name: 'wasmPlayer', + component: wasmPlayer, + }, + { + path: '/play/rtc/:url', + name: 'rtcPlayer', + component: rtcPlayer, + }, ] }) diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css index 0698271..2a08b07 100644 --- a/web_src/static/css/iconfont.css +++ b/web_src/static/css/iconfont.css @@ -1,8 +1,6 @@ @font-face { font-family: "iconfont"; /* Project id 1291092 */ - src: url('iconfont.woff2?t=1647245982270') format('woff2'), - url('iconfont.woff?t=1647245982270') format('woff'), - url('iconfont.ttf?t=1647245982270') format('truetype'); + src: url('iconfont.woff2?t=1650436696596') format('woff2'); } .iconfont { @@ -13,6 +11,50 @@ -moz-osx-font-smoothing: grayscale; } +.icon-jiedianleizhukongzhongxin1:before { + content: "\e9d0"; +} + +.icon-jiedianleizhukongzhongxin2:before { + content: "\e9d1"; +} + +.icon-jiedianleilianjipingtai:before { + content: "\e9d3"; +} + +.icon-jiedianleiquyu:before { + content: "\e9d4"; +} + +.icon-shebeileigis:before { + content: "\e9ec"; +} + +.icon-shebeileibanqiu:before { + content: "\e9f5"; +} + +.icon-shebeileibanqiugis:before { + content: "\e9f6"; +} + +.icon-shebeileijiankongdian:before { + content: "\ea07"; +} + +.icon-shebeileiqiangjitongdao:before { + content: "\ea15"; +} + +.icon-shebeileiqiuji:before { + content: "\ea17"; +} + +.icon-shebeileiqiujigis:before { + content: "\ea18"; +} + .icon-xitongxinxi:before { content: "\e7d6"; } diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2 index 4833708..7204137 100644 --- a/web_src/static/css/iconfont.woff2 +++ b/web_src/static/css/iconfont.woff2 Binary files differ diff --git a/web_src/static/images/arrow.png b/web_src/static/images/arrow.png new file mode 100644 index 0000000..4d8df46 --- /dev/null +++ b/web_src/static/images/arrow.png Binary files differ diff --git a/web_src/static/images/gis/camera-offline.png b/web_src/static/images/gis/camera-offline.png new file mode 100644 index 0000000..67eb0fc --- /dev/null +++ b/web_src/static/images/gis/camera-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera.png b/web_src/static/images/gis/camera.png new file mode 100644 index 0000000..a93bd55 --- /dev/null +++ b/web_src/static/images/gis/camera.png Binary files differ diff --git a/web_src/static/images/gis/camera1-offline.png b/web_src/static/images/gis/camera1-offline.png new file mode 100644 index 0000000..597209b --- /dev/null +++ b/web_src/static/images/gis/camera1-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera1.png b/web_src/static/images/gis/camera1.png new file mode 100644 index 0000000..e5f2b5f --- /dev/null +++ b/web_src/static/images/gis/camera1.png Binary files differ diff --git a/web_src/static/images/gis/camera2-offline.png b/web_src/static/images/gis/camera2-offline.png new file mode 100644 index 0000000..4ddae23 --- /dev/null +++ b/web_src/static/images/gis/camera2-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera2.png b/web_src/static/images/gis/camera2.png new file mode 100644 index 0000000..073bceb --- /dev/null +++ b/web_src/static/images/gis/camera2.png Binary files differ diff --git a/web_src/static/images/gis/camera3-offline.png b/web_src/static/images/gis/camera3-offline.png new file mode 100644 index 0000000..f05c2a3 --- /dev/null +++ b/web_src/static/images/gis/camera3-offline.png Binary files differ diff --git a/web_src/static/images/gis/camera3.png b/web_src/static/images/gis/camera3.png new file mode 100644 index 0000000..b40f67b --- /dev/null +++ b/web_src/static/images/gis/camera3.png Binary files differ -- Gitblit v1.8.0