From 4bd4f50b4165953018a9f9174056d29d087fdaee Mon Sep 17 00:00:00 2001 From: szy833 <31844882+szy833@users.noreply.github.com> Date: 星期日, 16 一月 2022 23:32:51 +0800 Subject: [PATCH] Merge branch '648540858:wvp-28181-2.0' into wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/gb28181/event/online/OnlineEventListener.java | 2 src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java | 34 ++++++ src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java | 2 src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java | 38 +++++++ web_src/src/components/PushVideoList.vue | 18 +++ src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java | 50 ++++++++++ src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java | 4 pom.xml | 9 + web_src/src/components/dialog/importChannel.vue | 84 ++++++++++++++++ src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java | 50 ++++++++++ src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java | 3 11 files changed, 286 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 2a67fb5..991abc6 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ <version>2.1.3</version> </dependency> - <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> + <!-- json瑙f瀽搴揻astjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> @@ -203,6 +203,13 @@ <version>1.12</version> </dependency> + <!--excel瑙f瀽搴�--> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + <version>3.0.4</version> + </dependency> + <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> 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 12a50e1..5f0d14d 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 @@ -85,7 +85,7 @@ device.setOnline(1); Device deviceInstore = storager.queryVideoDevice(device.getDeviceId()); - if (deviceInstore.getOnline() == 0) { + if (deviceInstore != null && deviceInstore.getOnline() == 0) { List<DeviceChannel> deviceChannelList = storager.queryOnlineChannelsByDeviceId(device.getDeviceId()); eventPublisher.catalogEventPublish(null, deviceChannelList, CatalogEvent.ON); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java index 06c8b73..8a09de7 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.github.pagehelper.PageInfo; import java.util.List; @@ -65,4 +66,6 @@ void clean(); boolean saveToRandomGB(); + + void batchAdd(List<StreamPushItem> streamPushExcelDtoList); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java index c8bf191..ebfa124 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java @@ -22,6 +22,7 @@ import com.genersoft.iot.vmp.storager.dao.ParentPlatformMapper; import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper; import com.genersoft.iot.vmp.storager.dao.StreamPushMapper; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; @@ -321,4 +322,37 @@ } return true; } + + @Override + public void batchAdd(List<StreamPushItem> streamPushItems) { + streamPushMapper.addAll(streamPushItems); + gbStreamMapper.batchAdd(streamPushItems); + // 鏌ユ壘寮�鍚簡鍏ㄩ儴鐩存挱娴佸叡浜殑涓婄骇骞冲彴 + List<ParentPlatform> parentPlatforms = parentPlatformMapper.selectAllAhareAllLiveStream(); + if (parentPlatforms.size() > 0) { + for (StreamPushItem stream : streamPushItems) { + for (ParentPlatform parentPlatform : parentPlatforms) { + stream.setCatalogId(parentPlatform.getCatalogId()); + stream.setPlatformId(parentPlatform.getServerGBId()); + String streamId = stream.getStream(); + StreamProxyItem streamProxyItem = platformGbStreamMapper.selectOne(stream.getApp(), streamId, parentPlatform.getServerGBId()); + if (streamProxyItem == null) { + platformGbStreamMapper.add(stream); + eventPublisher.catalogEventPublishForStream(parentPlatform.getServerGBId(), stream, CatalogEvent.ADD); + }else { + if (!streamProxyItem.getGbId().equals(stream.getGbId())) { + // 姝ゆ祦浣跨敤鍙︿竴涓浗鏍嘔d宸茬粡涓庤骞冲彴鍏宠仈锛岀Щ闄ゆ璁板綍 + platformGbStreamMapper.delByAppAndStreamAndPlatform(stream.getApp(), streamId, parentPlatform.getServerGBId()); + platformGbStreamMapper.add(stream); + eventPublisher.catalogEventPublishForStream(parentPlatform.getServerGBId(), stream, CatalogEvent.ADD); + stream.setGbId(streamProxyItem.getGbId()); + eventPublisher.catalogEventPublishForStream(parentPlatform.getServerGBId(), stream, CatalogEvent.DEL); + } + } + } + } + + + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java new file mode 100644 index 0000000..de7307c --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java @@ -0,0 +1,50 @@ +package com.genersoft.iot.vmp.service.impl; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.service.IStreamPushService; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; + +import java.util.ArrayList; +import java.util.List; + +public class StreamPushUploadFileHandler extends AnalysisEventListener<StreamPushExcelDto> { + + private IStreamPushService pushService; + private String defaultMediaServerId; + private List<StreamPushItem> streamPushItems = new ArrayList<>(); + + public StreamPushUploadFileHandler(IStreamPushService pushService, String defaultMediaServerId) { + this.pushService = pushService; + this.defaultMediaServerId = defaultMediaServerId; + } + + @Override + public void invoke(StreamPushExcelDto streamPushExcelDto, AnalysisContext analysisContext) { + StreamPushItem streamPushItem = new StreamPushItem(); + streamPushItem.setApp(streamPushExcelDto.getApp()); + streamPushItem.setStream(streamPushExcelDto.getStream()); + streamPushItem.setGbId(streamPushExcelDto.getGbId()); + streamPushItem.setStatus(false); + streamPushItem.setStreamType("push"); + streamPushItem.setCreateStamp(System.currentTimeMillis()); + streamPushItem.setMediaServerId(defaultMediaServerId); + streamPushItem.setName(streamPushExcelDto.getName()); + streamPushItem.setOriginType(2); + streamPushItem.setOriginTypeStr("rtsp_push"); + streamPushItem.setTotalReaderCount("0"); + streamPushItems.add(streamPushItem); + if (streamPushItems.size() > 300) { + pushService.batchAdd(streamPushItems); + // 瀛樺偍瀹屾垚娓呯悊 list + streamPushItems.clear(); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴� + pushService.batchAdd(streamPushItems); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java index 82df331..15bb0f5 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; import org.apache.ibatis.annotations.*; import org.springframework.stereotype.Repository; @@ -82,7 +83,7 @@ void batchDel(List<StreamProxyItem> streamProxyItemList); @Insert("<script> " + - "insert into gb_stream " + + "REPLACE into gb_stream " + "(app, stream, gbId, name, " + "longitude, latitude, streamType, mediaServerId, status)" + "values " + @@ -93,7 +94,6 @@ "</foreach> " + "</script>") void batchAdd(List<StreamPushItem> subList); - @Update({"<script>" + "<foreach collection='gpsMsgInfos' item='item' separator=';'>" + diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java index c5b22f8..6a1093c 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java @@ -52,7 +52,7 @@ @Insert("<script>" + "INSERT INTO stream_push (app, stream, totalReaderCount, originType, originTypeStr, " + "createStamp, aliveSecond, mediaServerId) " + - "VALUES <foreach collection='streamPushItems' item='item' index='index' >" + + "VALUES <foreach collection='streamPushItems' item='item' index='index' separator=','>" + "( '${item.app}', '${item.stream}', '${item.totalReaderCount}', '${item.originType}', " + "'${item.originTypeStr}','${item.createStamp}', '${item.aliveSecond}', '${item.mediaServerId}' )" + " </foreach>" + diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java new file mode 100644 index 0000000..c0c7611 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/StreamPushExcelDto.java @@ -0,0 +1,50 @@ +package com.genersoft.iot.vmp.vmanager.bean; + +import com.alibaba.excel.annotation.ExcelProperty; + +public class StreamPushExcelDto { + + @ExcelProperty("鍚嶇О") + private String name; + + @ExcelProperty("搴旂敤鍚�") + private String app; + + @ExcelProperty("娴両D") + private String stream; + + @ExcelProperty("鍥芥爣ID") + private String gbId; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getApp() { + return app; + } + + public void setApp(String app) { + this.app = app; + } + + public String getStream() { + return stream; + } + + public void setStream(String stream) { + this.stream = stream; + } + + public String getGbId() { + return gbId; + } + + public void setGbId(String gbId) { + this.gbId = gbId; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java index 6dfc257..0c80d11 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java @@ -1,19 +1,29 @@ package com.genersoft.iot.vmp.vmanager.streamPush; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.read.metadata.ReadSheet; import com.genersoft.iot.vmp.gb28181.bean.GbStream; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.service.IMediaServerService; import com.genersoft.iot.vmp.service.IStreamPushService; -import com.genersoft.iot.vmp.vmanager.bean.WVPResult; +import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; 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.apache.poi.sl.usermodel.Sheet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; @Api(tags = "鎺ㄦ祦淇℃伅绠$悊") @Controller @@ -25,6 +35,9 @@ @Autowired private IStreamPushService streamPushService; + + @Autowired + private IMediaServerService mediaServerService; @ApiOperation("鎺ㄦ祦鍒楄〃鏌ヨ") @ApiImplicitParams({ @@ -88,5 +101,28 @@ return "fail"; } } + @PostMapping(value = "upload") + @ResponseBody + public String uploadChannelFile(@RequestParam(value = "file") MultipartFile file){ + if (file.isEmpty()) { + return "fail"; + } + //鑾峰彇鏂囦欢娴� + InputStream inputStream = null; + try { + String name = file.getName(); + inputStream = file.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + //浼犲叆鍙傛暟 + ExcelReader excelReader = EasyExcel.read(inputStream, StreamPushExcelDto.class, + new StreamPushUploadFileHandler(streamPushService, mediaServerService.getDefaultMediaServer().getId())).build(); + ReadSheet readSheet = EasyExcel.readSheet(0).build(); + excelReader.read(readSheet); + excelReader.finish(); + return "success"; + } + } diff --git a/web_src/src/components/PushVideoList.vue b/web_src/src/components/PushVideoList.vue index 6131d60..b519fb4 100644 --- a/web_src/src/components/PushVideoList.vue +++ b/web_src/src/components/PushVideoList.vue @@ -8,6 +8,13 @@ <div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;"> <span style="font-size: 1rem; font-weight: bold;">鎺ㄦ祦鍒楄〃</span> </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-upload2" size="mini" style="margin-right: 1rem;" type="primary" @click="importChannel">閫氶亾瀵煎叆</el-button> + <el-button icon="el-icon-download" size="mini" style="margin-right: 1rem;" type="primary" > + <a style="color: #FFFFFF; text-align: center; text-decoration: none" href="/static/file/鎺ㄦ祦閫氶亾瀵煎叆.zip" download='鎺ㄦ祦閫氶亾瀵煎叆.zip' >涓嬭浇妯℃澘</a> + </el-button> + + </div> <devicePlayer ref="devicePlayer"></devicePlayer> <addStreamTOGB ref="addStreamTOGB"></addStreamTOGB> <el-table :data="pushList" border style="width: 100%" :height="winHeight"> @@ -54,6 +61,7 @@ :total="total"> </el-pagination> <streamProxyEdit ref="streamProxyEdit" ></streamProxyEdit> + <importChannel ref="importChannel" ></importChannel> </el-main> </el-container> </div> @@ -64,13 +72,15 @@ import devicePlayer from './dialog/devicePlayer.vue' import addStreamTOGB from './dialog/addStreamTOGB.vue' import uiHeader from './UiHeader.vue' + import importChannel from './dialog/importChannel.vue' export default { name: 'pushVideoList', components: { devicePlayer, addStreamTOGB, streamProxyEdit, - uiHeader + uiHeader, + importChannel, }, data() { return { @@ -196,8 +206,12 @@ s = t.getSeconds(); // 鍙牴鎹渶瑕佸湪杩欓噷瀹氫箟鏃堕棿鏍煎紡 return y+'-'+(m<10?'0'+m:m)+'-'+(d<10?'0'+d:d)+' '+(h<10?'0'+h:h)+':'+(i<10?'0'+i:i)+':'+(s<10?'0'+s:s); - } + }, + importChannel: function () { + this.$refs.importChannel.openDialog(()=>{ + }) + }, } }; </script> diff --git a/web_src/src/components/dialog/importChannel.vue b/web_src/src/components/dialog/importChannel.vue new file mode 100644 index 0000000..6d83819 --- /dev/null +++ b/web_src/src/components/dialog/importChannel.vue @@ -0,0 +1,84 @@ +<template> + <div id="importChannel" v-loading="isLoging"> + <el-dialog + title="瀵煎叆閫氶亾鏁版嵁" + width="30rem" + top="2rem" + :append-to-body="true" + :close-on-click-modal="false" + :visible.sync="showDialog" + :destroy-on-close="true" + @close="close()" + > + <div> + <el-upload + class="upload-box" + drag + action="debug/api/push/upload" + name="file" + > + <i class="el-icon-upload"></i> + <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div> + <div class="el-upload__tip" slot="tip">鍙兘涓婁紶 csv / xls / xlsx 鏂囦欢</div> + </el-upload> + </div> + </el-dialog> + </div> +</template> + +<script> + +export default { + name: "importChannel", + computed: {}, + created() {}, + data() { + return { + submitCallback: null, + showDialog: false, + isLoging: false, + isEdit: false, + }; + }, + methods: { + openDialog: function (callback) { + this.showDialog = true; + this.submitCallback = callback; + }, + onSubmit: function () { + console.log("onSubmit"); + console.log(this.form); + this.$axios({ + method:"post", + url:`/api/platform/catalog/${!this.isEdit? "add":"edit"}`, + data: this.form + }) + .then((res)=> { + if (res.data.code === 0) { + console.log("娣诲姞/淇敼鎴愬姛") + if (this.submitCallback)this.submitCallback() + }else { + this.$message({ + showClose: true, + message: res.data.msg, + type: "error", + }); + } + this.close(); + }) + .catch((error)=> { + console.log(error); + }); + }, + close: function () { + this.showDialog = false; + this.$refs.form.resetFields(); + }, + }, +}; +</script> +<style> +.upload-box{ + text-align: center; +} +</style> -- Gitblit v1.8.0