From 5bcd8495e03b08ff417f74f816d20e028f9b1fe0 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期日, 20 二月 2022 16:22:43 +0800 Subject: [PATCH] 兼容海康不规范的xml,大幅度提高通道分页查询速度,优化节点的保活。 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 4 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java | 3 src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java | 2 src/main/resources/all-application.yml | 2 src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 31 ++++--- src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java | 2 src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 6 - src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java | 33 ++++++++ web_src/src/components/channelList.vue | 2 src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java | 11 +- src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java | 3 sql/mysql.sql | 1 src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java | 2 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 69 +++++++++++++---- src/main/resources/application-dev.yml | 2 sql/update.sql | 8 + src/main/resources/application-docker.yml | 2 src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 43 ++++------ 18 files changed, 145 insertions(+), 81 deletions(-) diff --git a/sql/mysql.sql b/sql/mysql.sql index 26ea595..4bab294 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -107,6 +107,7 @@ `certNum` varchar(50) DEFAULT NULL, `certifiable` int(11) DEFAULT NULL, `errCode` int(11) DEFAULT NULL, + `subCount` int(11) DEFAULT 0, `endTime` varchar(50) DEFAULT NULL, `secrecy` varchar(50) DEFAULT NULL, `ipAddress` varchar(50) DEFAULT NULL, diff --git a/sql/update.sql b/sql/update.sql index d6386ea..2a16265 100644 --- a/sql/update.sql +++ b/sql/update.sql @@ -1 +1,7 @@ -ALTER TABLE stream_proxy ADD status bit(1) not null; \ No newline at end of file +ALTER TABLE stream_proxy ADD status bit(1) not null; + +# 鍘婚櫎瀛愭煡璇紭鍖栨煡璇㈤�熷害 +alter table device_channel + add subCount int default 0 null; + +update device_channel dc set dc.subCount = (select te.count from (SELECT count(0) as count FROM device_channel WHERE parentId = dc.channelId) te) \ No newline at end of file diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java index 2b52bcd..3f549e5 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java @@ -11,7 +11,8 @@ @Configuration("mediaConfig") public class MediaConfig{ - @Value("${media.id:}") + // 淇敼蹇呴』閰嶇疆锛屼笉鍐嶆敮鎸佽嚜鍔ㄨ幏鍙� + @Value("${media.id}") private String id; @Value("${media.ip}") diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java index d4de725..390565c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java @@ -4,6 +4,7 @@ import gov.nist.javax.sip.SipStackImpl; import gov.nist.javax.sip.message.SIPRequest; import gov.nist.javax.sip.stack.SIPServerTransaction; +import org.apache.commons.lang3.ArrayUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; @@ -25,7 +26,12 @@ import javax.sip.message.Request; import javax.sip.message.Response; import java.io.ByteArrayInputStream; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * @description:澶勭悊鎺ユ敹IPCamera鍙戞潵鐨凷IP鍗忚璇锋眰娑堟伅 @@ -202,7 +208,32 @@ Request request = evt.getRequest(); SAXReader reader = new SAXReader(); reader.setEncoding(charset); - Document xml = reader.read(new ByteArrayInputStream(request.getRawContent())); + // 瀵规捣搴峰嚭鐜扮殑鏈浆涔夊瓧绗﹀仛澶勭悊銆� + String[] destStrArray = new String[]{"<",">","&","'","""}; + char despChar = '&'; // 鎴栬鍙墿灞曞吋瀹瑰叾浠栧瓧绗� + byte destBye = (byte) despChar; + List<Byte> result = new ArrayList<>(); + byte[] rawContent = request.getRawContent(); + for (int i = 0; i < rawContent.length; i++) { + if (rawContent[i] == destBye) { + boolean resul = false; + for (String destStr : destStrArray) { + if (i + destStr.length() <= rawContent.length) { + byte[] bytes = Arrays.copyOfRange(rawContent, i, i + destStr.length()); + resul = resul || (Arrays.equals(bytes,destStr.getBytes())); + } + } + if (resul) { + result.add(rawContent[i]); + } + }else { + result.add(rawContent[i]); + } + } + Byte[] bytes = new Byte[0]; + byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes)); + + Document xml = reader.read(new ByteArrayInputStream(bytesResult)); return xml.getRootElement(); } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index c5e01d8..8238a83 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -27,6 +27,9 @@ public JSONObject sendPost(MediaServerItem mediaServerItem, String api, Map<String, Object> param, RequestCallback callback) { OkHttpClient client = new OkHttpClient(); + if (mediaServerItem == null) { + return null; + } String url = String.format("http://%s:%s/index/api/%s", mediaServerItem.getIp(), mediaServerItem.getHttpPort(), api); JSONObject responseJSON = null; diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java index b56287b..de5d483 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -63,10 +63,9 @@ mediaServerService.addToDatabase(mediaConfig.getMediaSerItem()); }else { MediaServerItem mediaSerItem = mediaConfig.getMediaSerItem(); - mediaSerItem.setId(defaultMediaServer.getId()); mediaServerService.updateToDatabase(mediaSerItem); } - + mediaServerService.syncCatchFromDatabase(); // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁� hookSubscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_server_started,null, (MediaServerItem mediaServerItem, JSONObject response)->{ @@ -145,7 +144,6 @@ JSONArray data = responseJSON.getJSONArray("data"); if (data != null && data.size() > 0) { ZLMServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class); - ZLMServerConfig.setIp(mediaServerItem.getIp()); } } else { logger.error("[ {} ]-[ {}:{} ]绗瑊}娆′富鍔ㄨ繛鎺ュけ璐�, 2s鍚庨噸璇�", diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java index 16d8da7..042b2d1 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/event/ZLMKeepliveTimeoutListener.java @@ -65,7 +65,7 @@ if (mediaServerConfig == null) { publisher.zlmOfflineEventPublish(mediaServerId); }else { - logger.info("[zlm蹇冭烦鍒版湡]锛歿}楠岃瘉鍚巣lm浠嶅湪绾匡紝鍥炲蹇冭烦淇℃伅", mediaServerId); + logger.info("[zlm蹇冭烦鍒版湡]锛歿}楠岃瘉鍚巣lm浠嶅湪绾匡紝鎭㈠蹇冭烦淇℃伅", mediaServerId); // 娣诲姞zlm淇℃伅 mediaServerService.updateMediaServerKeepalive(mediaServerId, mediaServerConfig); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java index 41c59aa..ec2714f 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java @@ -22,7 +22,7 @@ MediaServerItem getOne(String generalMediaServerId); - MediaServerItem getOneByHostAndPort(String host, int port); + void syncCatchFromDatabase(); /** * 鏂扮殑鑺傜偣鍔犲叆 diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java index ccb2520..507d4e6 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java @@ -30,7 +30,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; import org.springframework.util.StringUtils; import java.text.ParseException; @@ -63,6 +67,12 @@ @Autowired private MediaServerMapper mediaServerMapper; + + @Autowired + DataSourceTransactionManager dataSourceTransactionManager; + + @Autowired + TransactionDefinition transactionDefinition; @Autowired private VideoStreamSessionManager streamSession; @@ -267,11 +277,6 @@ } @Override - public MediaServerItem getOneByHostAndPort(String host, int port) { - return mediaServerMapper.queryOneByHostAndPort(host, port); - } - - @Override public MediaServerItem getDefaultMediaServer() { return mediaServerMapper.queryDefault(); } @@ -323,7 +328,22 @@ @Override public int updateToDatabase(MediaServerItem mediaSerItem) { - return mediaServerMapper.update(mediaSerItem); + int result = 0; + if (mediaSerItem.isDefaultServer()) { + TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); + int delResult = mediaServerMapper.delDefault(); + if (delResult == 0) { + logger.error("绉婚櫎鏁版嵁搴撻粯璁lm鑺傜偣澶辫触"); + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return 0; + } + result = mediaServerMapper.add(mediaSerItem); + dataSourceTransactionManager.commit(transactionStatus); //鎵嬪姩鎻愪氦 + }else { + result = mediaServerMapper.update(mediaSerItem); + } + return result; } /** @@ -332,15 +352,13 @@ */ @Override public void zlmServerOnline(ZLMServerConfig zlmServerConfig) { - logger.info("[ ZLM锛歿} ]-[ {}:{} ]宸茶繛鎺�", + logger.info("[ ZLM锛歿} ]-[ {}:{} ]姝e湪杩炴帴", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); MediaServerItem serverItem = mediaServerMapper.queryOne(zlmServerConfig.getGeneralMediaServerId()); if (serverItem == null) { - serverItem = mediaServerMapper.queryOneByHostAndPort(zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); - } - if (serverItem == null) { - logger.warn("[鏈敞鍐岀殑zlm] 鎷掓帴鎺ュ叆锛氭潵鑷獅}锛歿}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + logger.warn("[鏈敞鍐岀殑zlm] 鎷掓帴鎺ュ叆锛歿}鏉ヨ嚜{}锛歿}", zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + logger.warn("璇锋鏌LM鐨�<general.mediaServerId>閰嶇疆鏄惁涓嶹VP鐨�<media.id>涓�鑷�"); return; } serverItem.setHookAliveInterval(zlmServerConfig.getHookAliveInterval()); @@ -368,11 +386,10 @@ serverItem.setStatus(true); if (StringUtils.isEmpty(serverItem.getId())) { - serverItem.setId(zlmServerConfig.getGeneralMediaServerId()); - mediaServerMapper.updateByHostAndPort(serverItem); - }else { - mediaServerMapper.update(serverItem); + logger.warn("[鏈敞鍐岀殑zlm] serverItem缂哄皯ID锛� 鏃犳硶鎺ュ叆锛歿}锛歿}", zlmServerConfig.getIp(),zlmServerConfig.getHttpPort() ); + return; } + mediaServerMapper.update(serverItem); String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetup.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId(); if (redisUtil.get(key) == null) { SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain()); @@ -387,7 +404,8 @@ setZLMConfig(serverItem, "0".equals(zlmServerConfig.getHookEnable())); publisher.zlmOnlineEventPublish(serverItem.getId()); - + logger.info("[ ZLM锛歿} ]-[ {}:{} ]杩炴帴鎴愬姛", + zlmServerConfig.getGeneralMediaServerId(), zlmServerConfig.getIp(), zlmServerConfig.getHttpPort()); } @@ -464,7 +482,7 @@ */ @Override public void setZLMConfig(MediaServerItem mediaServerItem, boolean restart) { - logger.info("[ ZLM锛歿} ]-[ {}:{} ]璁剧疆zlm", + logger.info("[ ZLM锛歿} ]-[ {}:{} ]姝e湪璁剧疆zlm", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); String protocol = sslEnabled ? "https" : "http"; String hookPrex = String.format("%s://%s:%s/index/hook", protocol, mediaServerItem.getHookIp(), serverPort); @@ -601,4 +619,21 @@ int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2; redisUtil.set(key, data, hookAliveInterval); } + + @Override + public void syncCatchFromDatabase() { + List<MediaServerItem> allInCatch = getAll(); + List<MediaServerItem> allInDatabase = mediaServerMapper.queryAll(); + Map<String, MediaServerItem> mediaServerItemMap = new HashMap<>(); + + for (MediaServerItem mediaServerItem : allInDatabase) { + mediaServerItemMap.put(mediaServerItem.getId(), mediaServerItem); + } + for (MediaServerItem mediaServerItem : allInCatch) { + if (mediaServerItemMap.get(mediaServerItem) == null) { + delete(mediaServerItem.getId()); + } + } + } + } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java index abcb1f4..723e9f1 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java @@ -398,12 +398,6 @@ void updateParentPlatformStatus(String platformGbID, boolean online); /** - * 鏇存柊濯掍綋鑺傜偣 - * @param mediaServerItem - */ - void updateMediaServer(MediaServerItem mediaServerItem); - - /** * 鏍规嵁濯掍綋ID鑾峰彇鍚敤/涓嶅惎鐢ㄧ殑浠g悊鍒楄〃 * @param id 濯掍綋ID * @param enable 鍚敤/涓嶅惎鐢� 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 32dd7df..9de19df 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 @@ -56,26 +56,20 @@ @Select(value = {" <script>" + "SELECT " + - "dc1.*, " + - "COUNT(dc2.channelId) as subCount " + + "dc.* " + "from " + - "device_channel dc1 " + - "left join device_channel dc2 on " + - "dc1.channelId = dc2.parentId " + + "device_channel dc " + "WHERE " + - "dc1.deviceId = #{deviceId} " + - " <if test='query != null'> AND (dc1.channelId LIKE '%${query}%' OR dc1.name LIKE '%${query}%' OR dc1.name LIKE '%${query}%')</if> " + - " <if test='parentChannelId != null'> AND dc1.parentId=#{parentChannelId} </if> " + - " <if test='online == true' > AND dc1.status=1</if>" + - " <if test='online == false' > AND dc1.status=0</if>" + - " <if test='hasSubChannel == true' > AND subCount >0</if>" + - " <if test='hasSubChannel == false' > AND subCount=0</if>" + - "GROUP BY dc1.channelId " + + "dc.deviceId = #{deviceId} " + + " <if test='query != null'> AND (dc.channelId LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " + + " <if test='parentChannelId != null'> AND dc.parentId=#{parentChannelId} </if> " + + " <if test='online == true' > AND dc.status=1</if>" + + " <if test='online == false' > AND dc.status=0</if>" + + " <if test='hasSubChannel == true' > AND dc.subCount > 0 </if>" + + " <if test='hasSubChannel == false' > AND dc.subCount = 0 </if>" + + "GROUP BY dc.channelId " + " </script>"}) List<DeviceChannel> queryChannels(String deviceId, String parentChannelId, String query, Boolean hasSubChannel, Boolean online); - - @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId}") - List<DeviceChannel> queryChannelsByDeviceId(String deviceId); @Select("SELECT * FROM device_channel WHERE deviceId=#{deviceId} AND channelId=#{channelId}") DeviceChannel queryChannel(String deviceId, String channelId); @@ -100,7 +94,7 @@ "dc.name, " + "de.manufacturer, " + "de.hostAddress, " + - "(SELECT count(0) FROM device_channel WHERE parentId = dc.channelId) as subCount, " + + "dc.subCount, " + "pgc.platformId as platformId, " + "pgc.catalogId as catalogId " + "FROM device_channel dc " + @@ -130,13 +124,13 @@ @Insert("<script> " + "insert into device_channel " + - "(channelId, deviceId, name, manufacture, model, owner, civilCode, block, " + + "(channelId, deviceId, name, manufacture, model, owner, civilCode, block, subCount, " + " address, parental, parentId, safetyWay, registerWay, certNum, certifiable, errCode, secrecy, " + " ipAddress, port, password, PTZType, status, streamId, longitude, latitude, createTime, updateTime) " + "values " + "<foreach collection='addChannels' index='index' item='item' separator=','> " + "('${item.channelId}', '${item.deviceId}', '${item.name}', '${item.manufacture}', '${item.model}', " + - "'${item.owner}', '${item.civilCode}', '${item.block}'," + + "'${item.owner}', '${item.civilCode}', '${item.block}',${item.subCount}," + "'${item.address}', ${item.parental}, '${item.parentId}', ${item.safetyWay}, ${item.registerWay}, " + "'${item.certNum}', ${item.certifiable}, ${item.errCode}, '${item.secrecy}', " + "'${item.ipAddress}', ${item.port}, '${item.password}', ${item.PTZType}, ${item.status}, " + @@ -156,6 +150,7 @@ "<if test='item.owner != null'>, owner='${item.owner}'</if>" + "<if test='item.civilCode != null'>, civilCode='${item.civilCode}'</if>" + "<if test='item.block != null'>, block='${item.block}'</if>" + + "<if test='item.subCount != null'>, block=${item.subCount}</if>" + "<if test='item.address != null'>, address='${item.address}'</if>" + "<if test='item.parental != null'>, parental=${item.parental}</if>" + "<if test='item.parentId != null'>, parentId='${item.parentId}'</if>" + @@ -182,21 +177,17 @@ @Select(value = {" <script>" + "SELECT " + - "dc1.*, " + - "COUNT(dc2.channelId) as subCount " + + "dc1.* " + "from " + "device_channel dc1 " + - "left join device_channel dc2 on " + - "dc1.channelId = dc2.parentId " + "WHERE " + "dc1.deviceId = #{deviceId} " + " <if test='query != null'> AND (dc1.channelId LIKE '%${query}%' OR dc1.name LIKE '%${query}%' OR dc1.name LIKE '%${query}%')</if> " + " <if test='parentChannelId != null'> AND dc1.parentId=#{parentChannelId} </if> " + " <if test='online == true' > AND dc1.status=1</if>" + " <if test='online == false' > AND dc1.status=0</if>" + - " <if test='hasSubChannel == true' > AND subCount >0</if>" + - " <if test='hasSubChannel == false' > AND subCount=0</if>" + - "GROUP BY dc1.channelId " + + " <if test='hasSubChannel == true' > AND dc1.subCount >0</if>" + + " <if test='hasSubChannel == false' > AND dc1.subCount=0</if>" + "ORDER BY dc1.channelId ASC " + "Limit #{limit} OFFSET #{start}" + " </script>"}) diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java index 4e09e79..0e37bbf 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/MediaServerMapper.java @@ -1,10 +1,7 @@ package com.genersoft.iot.vmp.storager.dao; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; -import org.apache.ibatis.annotations.Update; +import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; import java.util.List; @@ -122,14 +119,14 @@ @Select("SELECT * FROM media_server") List<MediaServerItem> queryAll(); - @Select("DELETE FROM media_server WHERE id='${id}'") + @Delete("DELETE FROM media_server WHERE id='${id}'") void delOne(String id); @Select("DELETE FROM media_server WHERE ip='${host}' and httpPort=${port}") void delOneByIPAndPort(String host, int port); - @Select("DELETE FROM media_server WHERE defaultServer=1;") - void delDefault(); + @Delete("DELETE FROM media_server WHERE defaultServer=1") + int delDefault(); @Select("SELECT * FROM media_server WHERE ip='${host}' and httpPort=${port}") MediaServerItem queryOneByHostAndPort(String host, int port); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java index 54a3c57..f745419 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java @@ -174,7 +174,7 @@ List<DeviceChannel> updateChannels = new ArrayList<>(); HashMap<String, DeviceChannel> channelsInStore = new HashMap<>(); if (channels != null && channels.size() > 0) { - List<DeviceChannel> channelList = deviceChannelMapper.queryChannelsByDeviceId(deviceId); + List<DeviceChannel> channelList = deviceChannelMapper.queryChannels(deviceId, null, null, null, null); if (channelList.size() == 0) { for (DeviceChannel channel : channels) { channel.setDeviceId(deviceId); @@ -239,6 +239,7 @@ // 鏁版嵁鍘婚噸 List<DeviceChannel> channels = new ArrayList<>(); StringBuilder stringBuilder = new StringBuilder(); + Map<String, Integer> subContMap = new HashMap<>(); if (deviceChannelList.size() > 1) { // 鏁版嵁鍘婚噸 Set<String> gbIdSet = new HashSet<>(); @@ -246,10 +247,26 @@ if (!gbIdSet.contains(deviceChannel.getChannelId())) { gbIdSet.add(deviceChannel.getChannelId()); channels.add(deviceChannel); + if (!StringUtils.isEmpty(deviceChannel.getParentId())) { + if (subContMap.get(deviceChannel.getParentId()) == null) { + subContMap.put(deviceChannel.getParentId(), 1); + }else { + Integer count = subContMap.get(deviceChannel.getParentId()); + subContMap.put(deviceChannel.getParentId(), count++); + } + } }else { stringBuilder.append(deviceChannel.getChannelId() + ","); } } + if (channels.size() > 0) { + for (DeviceChannel channel : channels) { + if (subContMap.get(channel.getChannelId()) != null){ + channel.setSubCount(subContMap.get(channel.getChannelId())); + } + } + } + }else { channels = deviceChannelList; } @@ -852,18 +869,6 @@ @Override public void updateParentPlatformStatus(String platformGbID, boolean online) { platformMapper.updateParentPlatformStatus(platformGbID, online); - } - - @Override - public void updateMediaServer(MediaServerItem mediaServerItem) { - String now = this.format.format(System.currentTimeMillis()); - mediaServerItem.setUpdateTime(now); - if (mediaServerMapper.queryOne(mediaServerItem.getId()) != null) { - mediaServerMapper.update(mediaServerItem); - }else { - mediaServerItem.setCreateTime(now); - mediaServerMapper.add(mediaServerItem); - } } @Override diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java index 4e223e9..c27fb0e 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java @@ -58,8 +58,6 @@ @GetMapping(value = "/media_server/list") @ResponseBody public WVPResult<List<MediaServerItem>> getMediaServerList(boolean detail){ - List<MediaServerItem> all = mediaServerService.getAll(); - WVPResult<List<MediaServerItem>> result = new WVPResult<>(); result.setCode(0); result.setMsg("success"); diff --git a/src/main/resources/all-application.yml b/src/main/resources/all-application.yml index 4d49661..e3b1ad1 100644 --- a/src/main/resources/all-application.yml +++ b/src/main/resources/all-application.yml @@ -93,7 +93,7 @@ #zlm 榛樿鏈嶅姟鍣ㄩ厤缃� media: - # [鍙�塢 zlm鏈嶅姟鍣ㄥ敮涓�id锛岀敤浜庤Е鍙慼ook鏃跺尯鍒槸鍝彴鏈嶅姟鍣�,general.mediaServerId + # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄥ敮涓�id锛岀敤浜庤Е鍙慼ook鏃跺尯鍒槸鍝彴鏈嶅姟鍣�,general.mediaServerId id: # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄧ殑鍐呯綉IP ip: 192.168.0.100 diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b104be9..55738fb 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -48,6 +48,8 @@ #zlm 榛樿鏈嶅姟鍣ㄩ厤缃� media: + # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄥ敮涓�id锛岀敤浜庤Е鍙慼ook鏃跺尯鍒槸鍝彴鏈嶅姟鍣�,general.mediaServerId + id: # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄧ殑鍐呯綉IP ip: # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄧ殑http.port diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml index 98c1335..96a9ad0 100644 --- a/src/main/resources/application-docker.yml +++ b/src/main/resources/application-docker.yml @@ -48,6 +48,8 @@ #zlm 榛樿鏈嶅姟鍣ㄩ厤缃� media: + # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄥ敮涓�id锛岀敤浜庤Е鍙慼ook鏃跺尯鍒槸鍝彴鏈嶅姟鍣�,general.mediaServerId + id: # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄧ殑鍐呯綉IP ip: ${ZLM_HOST:127.0.0.1} # [蹇呴』淇敼] zlm鏈嶅姟鍣ㄧ殑http.port diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue index 7dda69a..3cd4bc9 100644 --- a/web_src/src/components/channelList.vue +++ b/web_src/src/components/channelList.vue @@ -84,7 +84,7 @@ <!-- <el-button size="mini" icon="el-icon-video-play" v-if="scope.row.parental == 0" @click="sendDevicePush(scope.row)">鎾斁</el-button> --> <el-button size="mini" icon="el-icon-video-play" @click="sendDevicePush(scope.row)">鎾斁</el-button> <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="!!scope.row.streamId" @click="stopDevicePush(scope.row)">鍋滄</el-button> - <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">鏌ョ湅</el-button> + <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.subCount > 0" @click="changeSubchannel(scope.row)">鏌ョ湅</el-button> <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">璁惧褰曡薄</el-button> <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">褰曞儚鏌ヨ</el-button> --> </el-button-group> -- Gitblit v1.8.0