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