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