Commit 622ee9f7 authored by zhanglw's avatar zhanglw

车辆监控视频

parent 4c3b9713
......@@ -2780,6 +2780,43 @@ var HttpReq = function(){
params:param,
})
},
//车队视频监控-获取车队树
jkCarTree: function(param){
return request({
url: '/api/carMonitor/carTree',
method: 'get',
params:param,
})
},
//车队视频监控-摄像头
jkcarMonitorFind: function(param){
return request({
url: '/api/carMonitor',
method: 'get',
params:param,
})
},
jkcarMonitorAdd: function(data){
return request({
url: '/api/carMonitor',
method: 'POST',
data:data,
})
},
jkcarMonitorEdit: function(data){
return request({
url: '/api/carMonitor',
method: 'PUT',
data:data,
})
},
jkcarMonitorDelete: function(data){
return request({
url: '/api/carMonitor',
method: 'Delete',
data:data,
})
},
},
......
......@@ -5,27 +5,25 @@
<el-aside width="20vw" style="height: 89vh;margin-top: 5.5vh;z-index: 3;">
<div class="videoCarsInput">
<div style="color: #A6F6F9;">选择车牌号:</div>
<el-select v-model="searchCarText" placeholder="选择车牌号" @change="searchCarFn()">
<el-option v-for="item in searchCarData" :key="item.number" :label="item.number" :value="item.number"></el-option>
</el-select>
<el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
</div>
<el-tree
:data="videoData"
:props="defaultProps"
@node-click="handleNodeClick"
accordion
>
<el-tree :data="carListTree" :props="defaultProps" accordion highlight-current
:filter-node-method="filterNode" @current-change="handleNodeClick" ref="tree">
<div slot-scope="{ node }" class="roadClass">{{ node.label }}</div>
</el-tree>
</el-aside>
<DPcomputer17 class="DPcomputer17Class"></DPcomputer17>
<div v-if="noPtz" class="noPtzVideo1">
<div v-show="noPtz" class="noPtzVideo1">
<video id="videoRealtime" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" data-setup="{}" style="width: 100%;height: 100%;">
您的浏览器不支持:HTML5 video.
</video>
noPtzCameraList
<el-select v-model="cameraSrc" class="noPtzCameraList" @change="videoPlay()">
<el-option v-for="item in cameraList" :key="item.id" :label="item.monitorName" :value="item.monitorUrl" style="font-size:16px;font-weight:400"></el-option>
</el-select>
<el-button class="noPtzCloseStyle" type="danger" icon="el-icon-close" @click="noPtzCloseFn()" size="mini">关闭</el-button>
<iframe :src="iframeSrc" class="iframeSingle"></iframe>
</div>
<div class="aiAnalysisRightViews">
......@@ -118,24 +116,34 @@ import * as echarts from 'echarts';
import axios from 'axios'
import moment from 'moment';
import DPcomputer17 from '../../views/MLargeScreen/components/smallComponents/DPcomputer17.vue'
import 'video.js/dist/video-js.css'
import videojs from 'video.js'
import 'videojs-contrib-hls'
export default {
components:{
DPcomputer17,
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
data() {
return {
videoPlayer: null,
filterText: '',
carListTree: [],
defaultProps: {
children: 'children',
label: 'label'
},
cameraList:[],
cameraSrc:'',
videoAlarmAllTimer:null,
imgSrcStart:process.env.VUE_APP_LOCAL_API2,
iframeSrc:'',
defaultIframeSrc:'http://oa.gemho.cn:8088/808gps/open/player/video.html?lang=zh&channel=9&account=admin&password=admin&vehiIdno=',
aiAnalysisTableData:[],
videoData: [],
defaultProps: {
children: "children",
label: "label",
},
noPtz:false,
noPtz: false,
aiTabPosition:'今天',
echarts1Data:[{ value: 0, name: '接打电话' }, { value: 0, name: '分神驾驶' }, { value: 0, name: '前向碰撞' }, { value: 0, name: '疲劳驾驶' }, { value: 0, name: '接近报警' }],
echarts2Data:{
......@@ -150,16 +158,13 @@ export default {
total:0,
handle:0,
},
//所有车的信息
searchCarText:'',
//视频数据
videoSrc:'',
videoSrcShow:false,
//图片数据
elimageSrc:'',
elimageSrcShow:false,
//车辆数据
searchCarData:[],
};
},
mounted() {
......@@ -168,50 +173,56 @@ export default {
this.videoAlarmAllTimer = setInterval(()=>{
this.aiTabPositionFn(this.aiTabPosition);
},10000)
this.videoPlayer = videojs('videoRealtime', {
bigPlayButton: false,
textTrackDisplay: false,
posterImage: true,
errorDisplay: false,
controlBar: true
}, function () {
console.log('video ready!')
})
setTimeout(()=>{
},3000);
},
methods: {
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
getCode() {
//获取车辆信息
HttpReq.truckDispatching.carInformationQuery({size:9999}).then((res) => {
if(res.code == 200){
this.searchCarData = res.data.content;
}
})
//分区数据
HttpReq.truckDispatching.carMonitoringFleetQuery({size: 999}).then((res) => {
let data1 = [];
res.content.forEach((item) => {
item.label = item.name;
data1.push(item);
});
if (res != "") {
//总摄像头数据
HttpReq.truckDispatching.carMonitoringCarsQuery({size: 999}).then((res) => {
let fenquName = [];
res.content.forEach((item,index) => {
item.ref = "video" + index;
item.label = item.carnumber;
fenquName.push(item);
});
data1.forEach((item) => {
item.children = [];
fenquName.forEach((itemSon,index)=>{
if(item.id == itemSon.motorcadeId){
item.children.push(itemSon);
}
})
});
this.videoData = data1;
})
HttpReq.truckDispatching.jkCarTree().then((res) => {
if (res.code == 200) {
this.carListTree = res.data;
}
})
},
videoPlay(){
this.videoPlayer.src({src:this.cameraSrc,type:'application/x-mpegURL'});
this.videoPlayer.play();
},
handleNodeClick(data) {
if (data.children) {
return
} else {
this.iframeSrc = this.defaultIframeSrc + data.carnumber;
HttpReq.truckDispatching.jkcarMonitorFind({carNumber: data.label}).then((res) => {
if (res.code == 200) {
if(res.data && res.data.length){
this.noPtz = true;
this.cameraList = res.data;
this.cameraSrc = this.cameraList[0].monitorUrl;
this.videoPlay();
}else{
this.noPtzCloseFn();
this.$notify({
title: '该车无视频监控!',
type: 'warning',
duration: 2500
});
}
}
})
}
},
aiTabPositionFn(text){
......@@ -705,20 +716,7 @@ export default {
changeTime1(row){
return this.currentTime1(row.stm);
},
searchCarFn(){
HttpReq.truckDispatching.carMonitoringCarsQuery({carnumber:this.searchCarText}).then((res) => {
if(res.totalElements == 0){
this.$notify({
title: '该车无视频监控!',
type: 'warning',
duration: 2500
});
}else{
this.noPtz = true;
this.iframeSrc = this.defaultIframeSrc + res.content[0].carnumber;
}
})
},
//关闭视频
closeVideo(){
this.videoSrcShow = false;
......@@ -736,7 +734,8 @@ export default {
clearInterval(this.videoAlarmAllTimer);
this.videoAlarmAllTimer = null;
}
this.iframeSrc = '';
this.videoPlayer.dispose();
this.videoPlayer = null;
this.noPtz = false;
this.videoSrcShow = false;
this.videoSrc = '';
......@@ -790,7 +789,7 @@ export default {
scrollbar-width: none;
}
.videoCars .el-tree-node__content {
height: 50px;
height: 40px;
background-color: rgba(32,42,67,0.95);
width: 20vw;
}
......@@ -806,18 +805,21 @@ export default {
.videoCars .el-tree-node__content>.el-tree-node__expand-icon{
display: none;
}
.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{
background-color:rgba(200,200,200,0.25);
}
.videoCars .roadClass{
height: 45px;
height: 35px;
width: 90%;
line-height: 45px;
line-height: 35px;
text-align: center;
font-size: 19px;
font-size: 18px;
font-weight: 600;
letter-spacing: 2px;
color: white;
border-radius: 5px;
background: linear-gradient(to bottom, #30CFBE, #007EFF);
margin: 0px auto;
margin: 0 auto;
}
.videoCars .el-tree-node__children{
width: 90%;
......@@ -841,7 +843,7 @@ export default {
letter-spacing: 2px;
color: #A6F6F9;
border-radius: 5px;
background: linear-gradient(to bottom, rgba(32,42,67,0.95), rgba(32,42,67,0.95));
background: linear-gradient(to bottom, rgba(32,42,67,0), rgba(32,42,67,0));
margin: 0px auto;
}
.video111 .el-input--small .el-input__inner{
......@@ -858,11 +860,18 @@ export default {
}
.noPtzCloseStyle{
position: absolute;
top:0.5vh;
right: 0.5vh;
top:2vh;
right: 1vh;
font-size: 20px;
cursor: pointer;
}
.noPtzCameraList{
position: absolute;
top:2vh;
left: 1vh;
font-size: 18px;
cursor: pointer;
}
.noPtzVideo1{
width: 60vw;
height: 94.5vh;
......
......@@ -260,6 +260,19 @@
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="网络类型:" class="form-cell">
<div class="cell-box">
<el-select v-model="formData.xxxxx" placeholder="无" class="cell-input">
<el-option v-for="item in sdOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="传感器初始值:" class="form-cell">
......@@ -269,6 +282,177 @@
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="初始值x方向:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="初始值y方向:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="初始值z方向:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="报警状态:" class="form-cell">
<div class="cell-box">
<el-select v-model="formData.xxxxx" placeholder="无" class="cell-input">
<el-option v-for="item in sdOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="浸润线埋深(米):" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="检验周期:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="库水位设备类型:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="X位移:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="Y位移:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="Z位移:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="孔深(浸润线):" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="设备深度(浸润线):" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="距剖面起始点距离:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="库水位设备编号:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="干滩坡度角:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="干滩安全超高:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<div class="grid-content">
<el-form-item label="排水量流速:" class="form-cell">
<div class="cell-box">
<el-input v-model="formData.xxxxx" class="cell-input"></el-input>
</div>
</el-form-item>
</div>
</el-col>
</el-row>
</el-form>
......@@ -298,7 +482,7 @@ export default {
return {
configUrl: basePathUrl + 'config/config.json',
title: '新增',
visible: false,
visible: true,
loading: false,
page: 1,
size: 10,
......@@ -356,7 +540,7 @@ export default {
color: "#ff0000",
outline: true,
outlineColor: "#000000",
outlineWidth: 2,
outlineWidth: 5,
pixelOffsetY: -24,
distanceDisplayCondition: true,
distanceDisplayCondition_far: 500000,
......@@ -412,6 +596,7 @@ export default {
},
cancelForm() {
this.visible = false;
this.$refs.formViewRef.resetFields();
},
tableRowClassName({row, rowIndex}) {
},
......@@ -443,8 +628,6 @@ export default {
// this.reqUpdateItem(this.form, item)
// }
alert(9999);
} else {
alert(666)
}
});
},
......
<template>
<div class="common-page device-manage">
<div class="option page-row">
<!--工具栏-->
<div class="head-container">
<!-- 搜索 -->
<label class="el-form-item-label" style="font-weight: 500;">设备号</label>
<el-input v-model="query.formId" clearable size="small" placeholder="请输入设备号" style="width:180px;"/>
<label class="el-form-item-label" style="font-weight: 500;">报警状态</label>
<el-select v-model="query.stu" placeholder="请选择">
<el-option v-for="item in stuOpts" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<label class="el-form-item-label" style="font-weight: 500;">日期范围</label>
<el-date-picker
v-model="query.createTime"
type="datetimerange"
value-format="yyyy-MM-dd HH:MM:SS"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
<el-button size="mini" type="success" icon="el-icon-search" @click="toSearch">搜索</el-button>
<el-button size="mini" icon="el-icon-refresh" @click="clearLimit">重置</el-button>
</div>
</div>
<!-- 表格 -->
<div class="panel-bottom page-row">
<div class="ctin-box">
<div class="content-within">
<div class="content-fix">
<div class="toolbar" style="text-align:right">
<el-button size="mini" type="primary" icon="el-icon-refresh" @click="loadData">刷新</el-button>
<el-button size="mini" type="success" icon="el-icon-s-data" @click="toAdd">图表</el-button>
<el-button size="mini" type="warning" icon="el-icon-document" @click="toAdd">导出</el-button>
</div>
<div class="content">
<el-table :data="tableData" v-loading="loading" border style="width:auto" :row-class-name="tableRowClassName">
<el-table-column prop="formId" label="设备名称" align="center"></el-table-column>
<el-table-column prop="username" label="设备编号" align="center"></el-table-column>
<el-table-column prop="carNo" label="x变化量" align="center"></el-table-column>
<el-table-column prop="carClass" label="y变化量" align="center"></el-table-column>
<el-table-column prop="createTime" label="z变化量" align="center"></el-table-column>
<el-table-column prop="createTime" label="是否报警" align="center"></el-table-column>
<el-table-column prop="createTime" label="监测时间" align="center"></el-table-column>
</el-table>
<!--分页组件-->
<el-pagination :total="total" :current-page="page" style="margin-top: 8px;"
layout="total, prev, pager, next, sizes" @size-change="sizeChange"
@current-change="pageChange"/>
</div>
</div>
</div>
</div>
</div>
<!-- 表单渲染 -->
<el-dialog append-to-body :close-on-click-modal="true" :before-close="cancelForm" :visible.sync="visible" :title="title" width="800px">
<el-form :model="formData" :rules="rules" ref="formViewRef" :inline="true" :status-icon="true" size="mini">
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="text" @click="cancelForm">取消</el-button>
<el-button type="primary" @click="submitForm('formViewRef', formData)">确认</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {Tools, HttpReq, Dates} from '@/assets/js/common.js';
import mars3dViewerMap from "../../../components/mars3d/Map5.vue";
import * as mars3d from "mars3d";
import * as Cesium from "mars3d-cesium";
import kongzhidiantubiao from "../../../assets/images/cutGraph/kongzhidian1.png";
export default {
name: 'surfaceDisplacementLog',
components: {
mars3dViewerMap,
},
data() {
const basePathUrl = window.basePathUrl || ''
return {
configUrl: basePathUrl + 'config/config.json',
title: '新增',
visible: false,
loading: false,
page: 1,
size: 10,
total: 0,
query: {},
stuOpts: [
{label: '离线', value: 0},
{label: '在线', value: 1},
],
sdOptions: [
{label: '一类设备', value: 1},
{label: '二类设备', value: 2},
],
tableData: [],
formData: {
lng: '',
lat: '',
name: '',
devType: '',
devNo: '',
devUnit: '',
installDate: '',
manufactor: '',
},
rules: {
lng: {required: true, message: '请在地图上放置设备', trigger: 'blur'},
name: {required: true, message: ' ', trigger: 'blur'},
devType: {required: true, message: ' ', trigger: 'blur'},
devNo: {required: true, message: ' ', trigger: 'blur'},
devUnit: {required: true, message: ' ', trigger: 'blur'},
installDate: {required: true, message: ' ', trigger: 'blur'},
manufactor: {required: true, message: ' ', trigger: 'blur'},
},
}
},
mounted() {
this.$nextTick(() => {
this.loadData();
})
},
methods: {
onMapload(map) {
map.unbindContextMenu();
var graphicLayer = new mars3d.layer.GraphicLayer();
map.addLayer(graphicLayer);
const graphic = new mars3d.graphic.PointEntity({
style: {
color: "#ff0000",
pixelSize: 10,
outlineColor: "#ffffff",
outlineWidth: 2,
label: {
text: "放置位置",
font_size: 18,
color: "#ff0000",
outline: true,
outlineColor: "#000000",
outlineWidth: 5,
pixelOffsetY: -24,
distanceDisplayCondition: true,
distanceDisplayCondition_far: 500000,
distanceDisplayCondition_near: 0
}
},
})
graphicLayer.addGraphic(graphic);
map.on(mars3d.EventType.click, (event) => {
let p = mars3d.LngLatPoint.fromCartesian(event.cartesian);
this.formData.lng = p.lng;
this.formData.lat = p.lat;
graphicLayer.eachGraphic((graphic) => {
graphic.addDynamicPosition(Cesium.Cartesian3.fromDegrees(p.lng, p.lat, 0), 0)
})
});
},
loadData() {
var sort = 'id,desc';
var param = this.query;
param.page = this.page - 1;
param.pageSize = this.size;
param.sort = sort;
this.$nextTick(() => {
//获取安检信息
HttpReq.truckDispatching.ajReportListFind(param).then((res) => {
if (res.code == 200) {
this.loading = false;
this.tableData = res.data.records;
this.total = res.data.total;
}
})
})
},
toAdd() {
this.title = '新增';
this.visible = true;
},
toEdit() {
},
toDelete(item) {
var id = item.id;
this.$confirm('确认删除该条数据吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then((e) => {
}).catch((e) => {
})
},
cancelForm() {
this.visible = false;
},
tableRowClassName({row, rowIndex}) {
},
// 点击搜索
toSearch() {
this.page = 1;
this.loadData();
},
// 重置搜索
clearLimit() {
this.query = {};
this.loadData()
},
pageChange(e) {
this.page = e
this.loadData()
},
sizeChange(e) {
this.page = 1
this.size = e
this.loadData()
},
submitForm(validateName, item) {
this.$refs[validateName].validate(valid => {
if (valid) {
// if (this.title === '新增') {
// this.reqAddItem(this.form, item)
// } else {
// this.reqUpdateItem(this.form, item)
// }
alert(9999);
} else {
alert(666)
}
});
},
},
}
</script>
<style rel="stylesheet/scss" lang="scss" scope>
.el-table .warning-row {
background: oldlace;
}
.el-table .success-row {
background: #f0f9eb;
}
.cell-input {
//min-width: 220px;
}
.form-cell {
margin: 0 !important;
width: 100%;
}
.grid-content {
//border: 1px solid rgba(100, 100, 100, 0.1);
padding: 5px 30px;
}
.cell-box .el-input__inner {
border: 1px solid rgba(100, 100, 100, 0.1);
}
.cell-box .el-input.is-disabled .el-input__inner {
border: 1px solid rgba(100, 100, 100, 0.1);
background: white;
cursor: text;
}
.cell-box .el-input.is-disabled .el-input__icon {
cursor: text;
}
.cell-box .el-icon-arrow-up:before {
content: '';
}
.mapcontainer {
height: 30vh;
width: 680px;
overflow: hidden;
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment