2025-5-12讨论bug更改

This commit is contained in:
wangxk 2025-05-14 09:48:50 +08:00
parent fe5c319357
commit 172404f84d
22 changed files with 1373 additions and 625 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

After

Width:  |  Height:  |  Size: 416 B

View File

@ -540,9 +540,39 @@ export default {
eventcallbacK: function (type, message) {
},
fullscreenSwich: function () {
const userStore = useUserStore()
if (this.devicechannelInfo) {
if(this.zhu){
let isFull = this.isFullscreen()
jessibucaPlayer[this._uid].setFullscreen(!isFull)
this.fullscreen = !isFull;
return
}
if (this.fullscreen) {
axios.get(userStore.webApiMonitorUrl + '/api/play/stop/' + this.devicechannelInfo.deviceId + '/' + this.devicechannelInfo.channelId, {}).then((res) => { })
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + this.devicechannelInfo.deviceId + '/' + this.devicechannelInfo.channelId + '_sub', {}).then((res) => {
this.play(res.data.data.ws_flv)
let isFull = this.isFullscreen()
jessibucaPlayer[this._uid].setFullscreen(!isFull)
this.fullscreen = !isFull;
})
} else {
axios.get(userStore.webApiMonitorUrl + '/api/play/stop/' + this.devicechannelInfo.deviceId + '/' + this.devicechannelInfo.channelId + '_sub', {}).then((res) => { })
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + this.devicechannelInfo.deviceId + '/' + this.devicechannelInfo.channelId, {}).then((res) => {
this.play(res.data.data.ws_flv)
let isFull = this.isFullscreen()
jessibucaPlayer[this._uid].setFullscreen(!isFull)
this.fullscreen = !isFull;
})
}
} else {
let isFull = this.isFullscreen()
jessibucaPlayer[this._uid].setFullscreen(!isFull)
this.fullscreen = !isFull;
}
// if(this.fullscreen
},
isFullscreen: function () {
return document.fullscreenElement ||

View File

@ -480,7 +480,26 @@ audio::-webkit-media-controls-current-time-display,
audio::-webkit-media-controls-time-remaining-display {
color: #fff;
}
/* 轨道 */
audio::-webkit-media-controls-timeline::before {
content: '';
display: block;
height: 6px;
background-color: #ff0000; /* 已播放部分颜色 */
}
/* 滑块 */
audio::-webkit-media-controls-timeline::after {
content: '';
display: block;
width: 12px;
height: 12px;
background-color: #ff0000;
border-radius: 50%;
position: relative;
top: -6px;
left: 0;
}
/* Firefox兼容样式 */
@-moz-document url-prefix() {
audio {

View File

@ -9,13 +9,22 @@
:class="{ 'nav-active': activeIndex == index }" @click.stop="navClick(item, index)">
<div class="nav-imgtitle">{{ item.name }}</div>
<div class="nav-sonbox" v-if="item.children != undefined && item.hide == true">
<div class="nav-son-list" v-for="(items, indexs) in item.children"
@click.stop="navSonClick(item, index, items)">{{ items.name }}
<div v-for="(items, indexs) in item.children">
<div class="nav-son-list" v-if="items.name != '异常告警管理'" @click.stop="navSonClick(item, index, items)">
{{ items.name }}
</div>
</div>
</div>
</div>
</div>
<div class="nav-right-box">
<div class="header-information" @click="alarmInfoClick">
<el-badge :value="alarmCount" :max="99" class="item" v-if="alarmCount != 0">
<div class="header-informationImg"></div>
</el-badge>
<div class="header-informationImg" v-else></div>
</div>
<div class="nav-right-text" style="margin-right: 20px;">
<div class="header-left-time" style="padding: 0;">用户名{{ userStore.username }}</div>
<!-- <div class="header-left-time" style="padding-top: 10px;">变电站{{ userStore.regionName }}</div> -->
@ -99,12 +108,12 @@ function dateFormat(row: any) {
}
function alarmInfoClick() {
router.push(`/task/alarmInfo/index`)
let item = {
name: "告警核认",
opturl: "/task/alarmInfo/index"
}
activeSonIndex.value = 2
navSonClick(navlist.value[2], 2, item)
// let item = {
// name: "",
// opturl: "/task/alarmInfo/index"
// }
// activeSonIndex.value = 2
// navSonClick(navlist.value[2], 2, item)
}
function navSonClick(row: any, index: any, item: any) {
isElicon.value = true
@ -397,7 +406,7 @@ watch(() => props.CloseNav, (newValue, oldValue) => {
background-size: 100% 100%;
width: 100%;
height: 62px;
z-index:99999 !important;
z-index: 99999 !important;
.times {
font-family: '微软雅黑';
@ -470,7 +479,7 @@ watch(() => props.CloseNav, (newValue, oldValue) => {
margin-left: -12px;
position: absolute;
top: 40px;
z-index:9999;
z-index: 9999;
.nav-son-list {
width: 100%;
@ -608,8 +617,8 @@ watch(() => props.CloseNav, (newValue, oldValue) => {
background: url(@/assets/monitorsystem/top_gj.png);
.header-informationImg {
width: 18px;
height: 18px;
width: 16px;
height: 16px;
background: url(@/assets/monitorsystem/top_gj1.png);
}
@ -936,7 +945,37 @@ watch(() => props.CloseNav, (newValue, oldValue) => {
align-items: center;
margin-right: 10px;
margin-bottom: 10px;
color:#ffffff;
color: #ffffff;
.header-information {
cursor: pointer;
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-right: 25px;
width: 30px;
height: 30px;
// background: url(@/assets/monitorsystem/top_gj.png);
.header-informationImg {
width: 16px;
height: 16px;
background: url(@/assets/monitorsystem/top_gj1.png);
background-size: 100% 100%;
}
.header-informationDian {
position: absolute;
top: 5px;
left: 15px;
width: 6px;
height: 6px;
border-radius: 50%;
background: red;
}
}
}
.iscursorinitial {

View File

@ -123,7 +123,7 @@ function closeClick() {
position: fixed;
top: 0;
left: 0;
z-index: 98;
z-index: 2000;
width: 100%;
transition: width 0.28s;
// background: #ffffff;

View File

@ -5282,7 +5282,7 @@ ws1.onclose = () => {
left: 0;
right: 0;
bottom: 0;
background: #131a25;
background: #001b4a;
display: flex;
align-items: center;
justify-content: center;

View File

@ -443,6 +443,7 @@ const getacaType: any = ref()
const Metertype = ref()
const auxitype = ref()
function addClick() {
activeName.value = 'first'
threshold.value = ''
beforName.value = ''
info.value = {
@ -525,6 +526,8 @@ const getacaTypeBayId = ref()
const PictureAnalysisType = ref()
//
const PictureDefectAnalysisType = ref()
//
const voiceAnalysisTypeList = ref()
//
const PictureDiscriminateAnalysisType = ref()
//
@ -565,7 +568,10 @@ function notification() {
getDeviceByType(paramsect).then((res: any) => {
PictureDefectAnalysisType.value = res.data
})
//
getDeviceByType({ dictcode: 'VoiceAnalysisType' }).then((res: any) => {
voiceAnalysisTypeList.value = res.data
})
//
const paramsscr = {
dictcode: 'PictureDiscriminateAnalysisType'
@ -660,6 +666,7 @@ function mainChange(row: any) {
const deviceIdText = ref()
const miannDeviceId = ref()
function handleEdit(row: any) {
activeName.value = 'first'
duration.value = row.duration
threshold.value = ''
beforName.value = ''
@ -1345,7 +1352,7 @@ const vMove = {
const activeName = ref('first')
const handleClick1 = (tab: TabsPaneContext, event: Event) => {
console.log(tab.props.name, event);
if(tab.props.name == 'three'){
if (tab.props.name == 'three') {
getData1()
}
}
@ -1392,11 +1399,10 @@ function getData1() {
}
const multipleTableRef = ref()
function handleSelectionChange(val: any) {
if (val.length > 1) {
if (val.length == 2) {
val.pop()
multipleTableRef.value!.toggleRowSelection(val[0], undefined)
}
if (val[0]) {
}else{
vicode.value[0].patroldevice_name = val[0].patroldeviceName
vicode.value[0].patroldevice_code = val[0].patroldeviceCode
}
@ -1413,7 +1419,7 @@ function handleSelectionChange(val: any) {
<el-tabs v-model="activeName" @tab-click="handleClick1">
<el-tab-pane label="基本信息" name="first">
<el-form ref="infoForm" :model="info" label-width="140px"
style="display: flex; flex-wrap: wrap; margin: 5px;height:593px;" :rules="rules">
style="display: flex; flex-wrap: wrap; margin: 5px;" :rules="rules">
<el-form-item label="巡视点位编号" style="width:50%" prop="deviceCode">
<el-input v-model="info.deviceCode" style="width: 90%;margin-left: 8px;"
placeholder="请输入巡视点位编号"></el-input>
@ -1519,6 +1525,20 @@ function handleSelectionChange(val: any) {
:label="item.dictname" :value="item.itemcode" />
</el-select>
</el-form-item>
<el-form-item label="声纹设备缺陷类型" style="width:50%">
<el-select v-model="info.voiceAnalysisTypeList" placeholder="请选择"
:disabled="info.recognitionTypeList != 5" style="width: 90%;margin-left: 8px;"
multiple clearable>
<el-option v-for="item in voiceAnalysisTypeList" :key="item.id"
:label="item.dictname" :value="item.itemcode" />
</el-select>
</el-form-item>
<el-form-item label="相位" style="width:50%">
<el-select v-model="info.phase" style="width:90%" clearable>
<el-option v-for="item in DevicePhase" :key="item.id" :label="item.dictname"
:value="item.itemcode" />
</el-select>
</el-form-item>
<el-form-item label="正常范围下限" prop="lowerValue" style="width:50%">
<el-input v-model="info.lowerValue" style="width: 90%;margin-left: 8px;"
placeholder="请输入正常范围下限"></el-input>
@ -1569,12 +1589,9 @@ function handleSelectionChange(val: any) {
<div style="width:90%;display:flex;">
</div>
</el-form>
<span class="dialog-footer"
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;margin-top: 10px;">
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;">
<div class="details-button" @click="handleClose">取消</div>
<div class="details-button" @click="confirmClick(infoForm)">确定</div>
@ -1693,10 +1710,9 @@ function handleSelectionChange(val: any) {
<Page :total="total1" v-model:size="paramstable1.size" v-model:current="paramstable1.current"
@pagination="getData1()"></Page>
<span class="dialog-footer"
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: flex-end;-webkit-justify-content: flex-end;margin-top: 20px;">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="confirmClick(infoForm)"
style="margin-right: 15px;">保存</el-button>
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content:center;-webkit-justify-content:center;margin-top: 20px;">
<div class="details-button" @click="handleClose">取消</div>
<div class="details-button" @click="confirmClick(infoForm)">确定</div>
</span>
</el-tab-pane>
</el-tabs>

View File

@ -11,6 +11,7 @@ import { getDeviceSignalTree, querySignalDataById, workpage, getHistoricalCurve
import { useUserStore } from '@/store/modules/user';
import Page from '@/components/Pagination/page.vue'
import * as echarts from 'echarts'
import dayjs from 'dayjs'
const userStore = useUserStore();
//
interface Tree {
@ -174,8 +175,17 @@ function drawEchart() {
})
}
onMounted(() => {
getTreeData()
gettoday()
})
function gettoday() {
// 0
let startTime = dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
let endTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
detaall.value[0] = startTime
detaall.value[1] = endTime
getTreeData()
}
</script>
<template>
@ -201,40 +211,7 @@ onMounted(() => {
<div>信号信息</div>
</div>
<div class="text_top">
<div class="text_top_title">
<div></div>所属网关机信息
</div>
<div class="text_top_content" v-loading="dignaloading">
<div class="content_one">
<div class="content_one_title">设备类型</div>
<div class="content_one_text">{{ signaldata.deviceType }}</div>
</div>
<div class="content_one">
<div class="content_one_title">设备名称</div>
<div class="content_one_text">{{ signaldata.deviceName }}</div>
</div>
<div class="content_one">
<div class="content_one_title">设备型号</div>
<div class="content_one_text">{{ signaldata.deviceModel }}</div>
</div>
<div class="content_one">
<div class="content_one_title">ip地址</div>
<div class="content_one_text">{{ signaldata.ipAddr }}</div>
</div>
<div class="content_one">
<div class="content_one_title">协议类型</div>
<div class="content_one_text">{{ signaldata.protocol }}</div>
</div>
<div class="content_one">
<div class="content_one_title">采集频率</div>
<div class="content_one_text">{{ signaldata.frequency }}</div>
</div>
</div>
</div>
<div class="text_top">
<div class="text_top_title">
<div></div>型号信息
</div>
<div class="text_top_content" v-loading="dignaloading">
<div class="content_one">
<div class="content_one_title">信号编号</div>
@ -260,9 +237,27 @@ onMounted(() => {
<div class="content_one_title">遥控遥调类型</div>
<div class="content_one_text">{{ signaldata.ykytType }}</div>
</div>
<div class="content_one">
<div class="content_one_title">设备名称</div>
<div class="content_one_text">{{ signaldata.deviceName }}</div>
</div>
<div class="content_one">
<div class="content_one_title">设备型号</div>
<div class="content_one_text">{{ signaldata.deviceModel }}</div>
</div>
<div class="content_one">
<div class="content_one_title">协议类型</div>
<div class="content_one_text">{{ signaldata.protocol }}</div>
</div>
<div class="content_one">
<div class="content_one_title">采集频率</div>
<div class="content_one_text">{{ signaldata.frequency }}</div>
</div>
</div>
</div>
</div>
<div class="top_left">
<div class="title_right">
<img src="@/assets/navigation/ty_bq.png" alt="">
@ -278,14 +273,14 @@ onMounted(() => {
<div class="cont_top_right"> <el-button class="searchButton">导出</el-button></div>
</div>
<div class="cont_bottom">
<el-table v-loading="loading" :data="tableData" style="width: 100%;height: calc(30vh);
<el-table v-loading="loading" :data="tableData" style="width: 100%;height: calc(33vh);
overflow: auto;;margin-bottom: 15px;" row-key="id" default-expand-all
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="index" label="序号" width="50px" align="center" />
<el-table-column label="采集时间" prop="startTime" width="120"></el-table-column>
<el-table-column label="监测数值" prop="value"></el-table-column>
<el-table-column label="单位" prop="unit"></el-table-column>
<el-table-column label="采集时间" prop="startTime" width="160" align="center"></el-table-column>
<el-table-column label="监测数值" prop="value" align="center"></el-table-column>
<el-table-column label="单位" prop="unit" align="center"></el-table-column>
</el-table>
<Page :total="total" v-model:size="tableform.size" v-model:current="tableform.current"
@pagination="gettabledata()">
@ -344,8 +339,10 @@ onMounted(() => {
box-sizing: border-box;
padding: 20px;
.text_top {
width: 100%;
margin-top:20px ;
.text_top_title {
display: flex;
@ -378,27 +375,26 @@ onMounted(() => {
width: 50%;
display: flex;
align-items: center;
.content_one_title {
width: 114px;
height: 50px;
height: 75px;
text-align: center;
line-height: 50px;
line-height: 75px;
border-top: 1px solid #00397c;
border-left: 1px solid #00397c;
background-color: #002562;
font-size: 14px;
font-size: 16px;
color: #B5D7FF;
}
.content_one_text {
width: 267px;
height: 50px;
height: 75px;
text-align: center;
line-height: 50px;
line-height: 75px;
border-top: 1px solid #00397c;
border-left: 1px solid #00397c;
font-size: 14px;
font-size: 16px;
color: #B5D7FF;
}
}

View File

@ -8,11 +8,14 @@ export default {
import { ref, onMounted, onBeforeUnmount, } from 'vue'
import Page from '@/components/Pagination/page.vue'
import { useUserStore } from '@/store/modules/user';
import { getWeatherLogList,getDeviceWorkData } from "@/api/home";
import { getWeatherLogPage,getdeviceworkdata} from "@/api/environmentalMonitoring";
import { getWeatherLogList, getDeviceWorkData } from "@/api/home";
import { getWeatherLogPage, getdeviceworkdata } from "@/api/environmentalMonitoring";
import { getDeviceByType } from "@/api/device";
import { getHistoricalCurve } from "@/api/datasurvey/index";
import dayjs from 'dayjs'
import * as echarts from 'echarts'
const userStore = useUserStore();
const tableData = ref([])
const tableData: any = ref([])
const treeloading = ref(false)
const total = ref()
//
@ -32,44 +35,49 @@ const tableRowClassName = ({
}
//
const environment_params = ref({
current:1,
size:10,
startDate:'',
endDate:'',
patroldeviceName:'',
stationId:userStore.stationId,
const environment_params: any = ref({
current: 1,
size: 10,
startDate: '',
endDate: '',
patroldeviceName: '',
stationId: userStore.stationId,
})
const hutotal:any = ref('')
const hutotal: any = ref('')
const environment_data = ref([])
// const treeloading = ref(false)
function getEnvironment() {
if(tableData.value){
if (tableData.value) {
environment_params.value.startDate = tableData.value[0]
environment_params.value.endDate = tableData.value[1]
}else{
} else {
environment_params.value.startDate = ''
environment_params.value.endDate = ''
}
environment_params.value.signalId = signalId.value
getdeviceworkdata(environment_params.value).then((res: any) => {
environment_data.value = res.data.records
environment_params.value.size = res.data.size
environment_params.value.current = res.data.current
hutotal.value = res.data.total
})
}
function environmentReset(){
if( tableData.value){
function environmentReset() {
environmentInfo
if (tableData.value) {
tableData.value.length = 0
}
environment_params.value.patroldeviceName = ''
getEnvironment()
signalId.value = environmentInfo.value[0].signalId
tabs.value = 0
// getEnvironment()
gettoday()
}
// WebSocket
const environment = ref()
const environmentInfo:any = ref([])
const environmentInfo: any = ref([])
// const ws1 = new WebSocket(userStore.wsApiBaseUrl + '/websocket/vibe_run_data_' + userStore.userId);
// function setupWebSocket() {
@ -123,10 +131,9 @@ function getInit() {
}
onMounted(() => {
gettoday()
getInit()
//setupWebSocket()
getEnvironment()
gettype()
});
// onBeforeUnmount(() => {
// if (ws1 != null) {
@ -142,36 +149,92 @@ function currency(list: any, itemcode: any) {
})
return dictname
}
const EquipmentType:any= ref([])
function gettype(){
const EquipmentType: any = ref([])
function gettype() {
getDeviceByType({ dictcode: 'system' }).then((res: any) => {
EquipmentType.value = res.data
signalId.value = res.data[0].signalId
getEnvironment()
getechartdata()
})
}
const tabs = ref(0)
const signalId = ref('')
function getscenetable(index: any, signalId1: any) {
tabs.value = index
signalId.value = signalId1
getEnvironment()
getechartdata()
}
function gettoday() {
// 0
let startTime = dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
let endTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
tableData.value[0] = startTime
tableData.value[1] = endTime
gettype()
}
const echartdata: any = ref({})
function getechartdata() {
getHistoricalCurve({ signalId: signalId.value }).then((res: any) => {
echartdata.value = res.data
drawEchart()
})
function drawEchart() {
let myChart = echarts.init(document.getElementById("deviceEachers") as HTMLDivElement);
myChart.setOption({
title: {
text: ''
},
tooltip: {
trigger: 'axis'
},
legend: {
data: ['Step Start', 'Step Middle', 'Step End']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: echartdata.value.xAxis,
yAxis: echartdata.value.yAxis,
series: echartdata.value.series
})
}
}
</script>
<template>
<div class="all_box">
<div class="img_box">
<div class="img_box_one" v-for="(item,index) in environmentInfo">
<div :class="tabs == index ? 'img_box_one1' : 'img_box_one'" v-for="(item, index) in environmentInfo"
@click="getscenetable(index, item.signalId)">
<div><img :src="`/environment/${item.itemcode}.png`" alt=""></div>
<div class="img_box_nei">
<div class="img_text1">{{ item.dictname }}</div>
<div v-if="item.value != '无'" class="img_text2">{{item.dictname == '风向'? item.value: Number(item.value).toFixed(2)}}<span class="img_unit"> {{ item.unit }}</span></div>
<div v-else class="img_text2">{{item.value}}</div>
<div v-if="item.value != '无'" class="img_text2">{{ item.dictname == '风向' ? item.value :
Number(item.value).toFixed(2) }}<span class="img_unit"> {{ item.unit }}</span></div>
<div v-else class="img_text2">{{ item.value }}</div>
</div>
</div>
</div>
<div style="display: flex;align-items: center;justify-content: space-between;">
<div class="environment_table">
<div class="table-title">
<div class="table_left">
<div class="screenHomepage">
<el-input v-model="environment_params.patroldeviceName" placeholder="请输入设备名称" clearable @change="getEnvironment()"
style="margin-right:15px ;width: 200px;" />
<el-date-picker class="screenHomepage" popper-class="elDatePicker" @change="getEnvironment()"
style="width: 300px; margin-right: 10px;" v-model="tableData" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
<el-date-picker class="screenHomepage" popper-class="elDatePicker"
@change="getEnvironment()" style="width: 400px; margin-right: 10px;" v-model="tableData"
type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" />
</div>
<el-button class="searchButton" @click="getEnvironment()">搜索</el-button>
<el-button class="searchButton" @click="environmentReset()">重置</el-button>
@ -182,25 +245,26 @@ function gettype(){
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(56vh); overflow: auto "
:header-cell-style="{ background: '#253b51', color: '#b5d7ff', height: '50px' }">
<el-table-column type="index" label="序号" width="80px" align="center" />
<el-table-column property="deviceName" label="监控设备名称" align="center" />
<el-table-column property="signalName" label="监控信号名称" align="center" />
<el-table-column property="systemcode" label="所属系统" align="center" width="100px">
<template #default="scope">
<span>{{ currency(EquipmentType, scope.row.systemcode) }}</span>
</template>
</el-table-column>
<el-table-column property="signalName" label="气象参数名称" align="center" />
<el-table-column property="startTime" label="采集时间" align="center" width="160px" />
<el-table-column property="taskName" label="监测数值" align="center" width="100px">
<template #default="scope">
<div v-if="scope.row.value">{{ scope.row.value }}{{scope.row.unit}}</div>
<div v-if="scope.row.value">{{ scope.row.value }}{{ scope.row.unit }}</div>
</template>
</el-table-column>
<el-table-column property="startTime" label="采集时间" align="center" width="160px" />
</el-table>
<div style="width:100%;display:flex;align-items:center;margin-top:10px;">
<Page style="margin:0 auto ;" :total="hutotal" v-model:size="environment_params.size" :jumper="'hide'"
v-model:current="environment_params.current" @pagination="getEnvironment()"></Page>
<Page style="margin:0 auto ;" :total="hutotal" v-model:size="environment_params.size"
:jumper="'hide'" v-model:current="environment_params.current" @pagination="getEnvironment()">
</Page>
</div>
</div>
<div class="environment_table">
<div id="deviceEachers" :style="{ width: '100%', height: '90%' }"></div>
</div>
</div>
</div>
</template>
<style scoped lang="scss">
@ -219,14 +283,57 @@ function gettype(){
justify-content: space-between;
margin: 20px 0px;
.img_box_one {
.img_box_one1 {
width: 220px;
height: 150px;
background: url(@/assets/navigation/hjjc_sjbj.png) ;
background: url(@/assets/navigation/hjjc_sjbj.png);
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: space-around;
background-color: #00ffff2f;
border: #00ffff 1px solid;
cursor: pointer;
.img_box_nei {
display: flex;
align-items: center;
flex-direction: column;
margin-top: 10px;
.img_text1 {
font-family: '微软雅黑';
font-weight: 400;
font-style: normal;
font-size: 18px;
color: #FFFFFF;
}
.img_text2 {
font-family: '钉钉进步体 Bold', '钉钉进步体';
font-weight: 700;
font-size: 24px;
color: #00ffff;
.img_unit {
font-family: '钉钉进步体 Bold', '钉钉进步体';
font-weight: 700;
font-size: 18px;
color: rgba(255, 255, 255, 0.298039215686275);
}
}
}
}
.img_box_one {
width: 220px;
height: 150px;
background: url(@/assets/navigation/hjjc_sjbj.png);
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: space-around;
cursor: pointer;
.img_box_nei {
display: flex;
@ -260,11 +367,11 @@ function gettype(){
}
.environment_table {
width: 1881px;
width: 935px;
height: calc(69vh);
background: url(@/assets/navigation/hjjc_BK.png) ;
background: url(@/assets/navigation/sbjc_488.png);
background-size: 100% 100%;
margin: 0 auto;
// margin: 0 auto;
box-sizing: border-box;
padding: 15px;
@ -281,10 +388,4 @@ function gettype(){
}
}
.environment_table1{
height: calc(83vh);
background: url(@/assets/station_2/hjjc_9.png) no-repeat;
margin-top:20px;
}
</style>

View File

@ -5,17 +5,17 @@ export default {
</script>
<script setup lang="ts">
import { ref, onMounted, nextTick,onBeforeUnmount } from "vue";
import { ElMessage,ElMessageBox } from "element-plus";
import { ref, onMounted, nextTick, onBeforeUnmount } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { getCameraByArea, getSubstationDeviceById } from "@/api/videomonitor/index";
import Cookies from 'js-cookie';
import {getDeviceByType} from "@/api/device";
import { getDeviceByType } from "@/api/device";
import JessibucaPlayer from '@/components/jessibuca/index1.vue'
import Classstyle from '@/components/jessibuca/cssindex.vue'
import axios from 'axios';
import { useUserStore } from '@/store/modules/user';
import { localStorage } from '@/utils/localStorage';
import { updatePersonalInfo,queryUserByID } from '@/api/user';
import { updatePersonalInfo, queryUserByID } from '@/api/user';
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
import Videorecord from '@/views/videomonitor/videorecord/index.vue';
const userStore = useUserStore();
@ -119,7 +119,7 @@ function screenNumClick(num: any) {
CameraActive.value = 0
CameraCLick(CameraActive.value)
currentPage.value = 1
pagingClick(CameraActive.value,num)
pagingClick(CameraActive.value, num)
animationInfo()
}
const deviceId = ref("") //
@ -148,8 +148,8 @@ function videoInit(row: any) {
JessibucaList.value[i].issignal = false
}
}
setTimeout(()=>{
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + deviceId.value + '/' + channelId.value, {}).then((res: any) => {
setTimeout(() => {
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + deviceId.value + '/' + channelId.value + (screenNum.value == 4 || screenNum.value == 9 || screenNum.value == 16 ? '_sub' : ''), {}).then((res: any) => {
isswitch.value = false
if (res.data.data != undefined) {
JessibucaList.value[CameraActive.value].urls = res.data.data.ws_flv
@ -170,7 +170,7 @@ function videoInit(row: any) {
}).catch(function (error: any) {
isswitch.value = false
})
},100)
}, 100)
}
@ -198,7 +198,7 @@ function handleNodeClick(data: any, node: any) {
let patroldeviceId: any = data.patroldeviceId
const params = {
id: patroldeviceId,
channelid:data.channelId
channelid: data.channelId
}
getSubstationDeviceById(params).then((res: any) => {
if (res.data == null) {
@ -206,8 +206,8 @@ function handleNodeClick(data: any, node: any) {
patroldeviceName: "",
type: null,
place: "",
duration:"",
rate:""
duration: "",
rate: ""
}
} else {
cameraInfo.value = res.data
@ -216,7 +216,7 @@ function handleNodeClick(data: any, node: any) {
}
}
const currentNodeKey = ref("")
function updateVideoRecord(){
function updateVideoRecord() {
const obj = {
JessibucaList: JessibucaList.value,
screenNum: screenNum.value
@ -225,18 +225,18 @@ function updateVideoRecord(){
id: userStore.userId,
custom1: JSON.stringify(obj),
}
updatePersonalInfo(params).then((res:any) => {
updatePersonalInfo(params).then((res: any) => {
})
}
onBeforeUnmount(() => {
updateVideoRecord()
if(timer.value !=null){
if (timer.value != null) {
clearInterval(timer.value)
}
})
function mouseleave(){
function mouseleave() {
updateVideoRecord()
}
@ -282,7 +282,7 @@ function presetPosition(cmdCode: any, presetPos: any) { // 预置位操作 ---
})
}
function quxiao(){
function quxiao() {
isGaoliang.value = ''
}
function condensationChang(command: any) { //
@ -349,25 +349,25 @@ function closeVideo(index: any) { // 关闭视频
JessibucaList.value[index].patroldeviceId = ""
JessibucaList.value[index].issignal = false
}
const playbackInfo:any = ref({})
const dialogVisible:any = ref(false)
function playbackVideo(index:any){
const playbackInfo: any = ref({})
const dialogVisible: any = ref(false)
function playbackVideo(index: any) {
playbackInfo.value = JessibucaList.value[index]
// channelId: "34020000001320000002"
// deviceId:"34020000001320000002"
// hide: true
// id:1
// issignal: false
// patroldeviceId: "3f2c9db2bc994ed69c4c9ae2e040ae95"
// urls: "ws://192.168.1.151:81/rtp/34020000001320000002_34020000001320000002.live.flv?0.5651038611217907"
// videofmp4:"http://192.168.1.151:81/rtp/34020000001320000002_34020000001320000002.live.mp4"
// channelId: "34020000001320000002"
// deviceId:"34020000001320000002"
// hide: true
// id:1
// issignal: false
// patroldeviceId: "3f2c9db2bc994ed69c4c9ae2e040ae95"
// urls: "ws://192.168.1.151:81/rtp/34020000001320000002_34020000001320000002.live.flv?0.5651038611217907"
// videofmp4:"http://192.168.1.151:81/rtp/34020000001320000002_34020000001320000002.live.mp4"
if(playbackInfo.value.channelId != null){
if (playbackInfo.value.channelId != null) {
dialogVisible.value = true
}
}
function handleClose(){
function handleClose() {
dialogVisible.value = false
}
@ -376,11 +376,11 @@ const cameraInfo: any = ref({
patroldeviceName: "",
type: null,
place: "",
duration:"",
rate:""
duration: "",
rate: ""
})
function CameraCLick(index:any) {
if(isswitch.value == true){
function CameraCLick(index: any) {
if (isswitch.value == true) {
ElMessage({
type: 'error',
message: '正在加载监控视频,请耐心等待!',
@ -393,7 +393,7 @@ function CameraCLick(index:any) {
queryRecordDetails()
const params = {
id: JessibucaList.value[CameraActive.value].patroldeviceId,
channelid:JessibucaList.value[CameraActive.value].channelId
channelid: JessibucaList.value[CameraActive.value].channelId
}
getSubstationDeviceById(params).then((res: any) => {
if (res.data == null) {
@ -401,8 +401,8 @@ function CameraCLick(index:any) {
patroldeviceName: "",
type: null,
place: "",
duration:"",
rate:""
duration: "",
rate: ""
}
} else {
cameraInfo.value = res.data
@ -439,7 +439,7 @@ function timeout(videoUrl: any) {
}
}
function RefreshLoad(info: any) {
if(info.deviceId == ""){
if (info.deviceId == "") {
return
}
deviceId.value = info.deviceId
@ -452,7 +452,7 @@ function RefreshLoad(info: any) {
return
}
isswitch.value = true
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + deviceId.value + '/' + channelId.value, {}).then((res: any) => {
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + deviceId.value + '/' + channelId.value + (screenNum.value == 4 || screenNum.value == 9 || screenNum.value == 16 ? '_sub' : ''), {}).then((res: any) => {
isswitch.value = false
if (res.data.data != undefined) {
JessibucaList.value[CameraActive.value].urls = res.data.data.ws_flv
@ -476,7 +476,7 @@ function RefreshLoad(info: any) {
function allRefresh() {
for (let i = 0; i < tableData.value.length; i++) {
if (JessibucaList.value[i + strlength.value].deviceId != '') {
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + JessibucaList.value[i + strlength.value].deviceId + '/' + JessibucaList.value[i + strlength.value].channelId, {}).then((res: any) => {
axios.get(userStore.webApiMonitorUrl + '/api/play/start/' + JessibucaList.value[i + strlength.value].deviceId + '/' + JessibucaList.value[i + strlength.value].channelId + (screenNum.value == 4 || screenNum.value == 9 || screenNum.value == 16 ? '_sub' : ''), {}).then((res: any) => {
if (res.data.data != undefined) {
tableData.value[i].urls = res.data.data.ws_flv + '?' + Math.random()
tableData.value[i].videofmp4 = res.data.data.fmp4
@ -567,8 +567,8 @@ function getVideoList() {
id: userStore.userId
}
queryUserByID(params).then((res: any) => {
if (res.data.custom1 != ''&&res.data.custom1 != null) {
let CookiesName: any =res.data.custom1;
if (res.data.custom1 != '' && res.data.custom1 != null) {
let CookiesName: any = res.data.custom1;
JessibucaList.value = JSON.parse(CookiesName).JessibucaList
screenNum.value = JSON.parse(CookiesName).screenNum
deviceId.value = JessibucaList.value[0].deviceId
@ -579,8 +579,8 @@ function getVideoList() {
} else {
CameraActive.value = 0
}
pagingClick(0,screenNum.value)
}).catch(()=>{
pagingClick(0, screenNum.value)
}).catch(() => {
CameraActive.value = 0
})
}
@ -617,15 +617,15 @@ function GetDateTime(dayNum: any) {
function queryRecordDetails(){
let startTime = GetDateTime(-90) +' 00:00:00'
let endTime = GetDateTime(0) +' 23:59:59'
if(deviceId.value == undefined || deviceId.value ==''){
function queryRecordDetails() {
let startTime = GetDateTime(-90) + ' 00:00:00'
let endTime = GetDateTime(0) + ' 23:59:59'
if (deviceId.value == undefined || deviceId.value == '') {
return
}
}
function addVideo(){
function addVideo() {
ElMessageBox.confirm(
'确定新增视频组吗',
'新增提示',
@ -635,7 +635,7 @@ function addVideo(){
type: 'warning',
}
)
.then( async () => {
.then(async () => {
for (let i = 0; i < 16; i++) {
JessibucaList.value.push({
@ -648,11 +648,11 @@ function addVideo(){
issignal: false
})
}
pagingClick(currentPage.value-1,screenNum.value)
pagingClick(currentPage.value - 1, screenNum.value)
})
}
function delVideo(){
function delVideo() {
ElMessageBox.confirm(
'确定删除视频组吗?',
'删除提示',
@ -662,48 +662,48 @@ function delVideo(){
type: 'warning',
}
)
.then( async () => {
JessibucaList.value.splice(JessibucaList.value.length-16,16)
pagingClick(0,screenNum.value)
.then(async () => {
JessibucaList.value.splice(JessibucaList.value.length - 16, 16)
pagingClick(0, screenNum.value)
})
}
const currentPage:any = ref(1)
const tableData:any = ref([])
const total:any = ref(0)
const totalSize:any = ref(0)
const isTimer=ref(false)
const temporaryList:any=ref([])
const strlength:any=ref(0)
const endlength:any=ref(0)
function pagingClick(pageIndex:any ,pageNum:any ){
const currentPage: any = ref(1)
const tableData: any = ref([])
const total: any = ref(0)
const totalSize: any = ref(0)
const isTimer = ref(false)
const temporaryList: any = ref([])
const strlength: any = ref(0)
const endlength: any = ref(0)
function pagingClick(pageIndex: any, pageNum: any) {
tableData.value=[]
temporaryList.value=[]
if(screenNum.value != 16){
tableData.value = []
temporaryList.value = []
if (screenNum.value != 16) {
let num = 0
for(let a=JessibucaList.value.length -1;a>=0;a--){
if(JessibucaList.value[a].urls !=""){
for (let a = JessibucaList.value.length - 1; a >= 0; a--) {
if (JessibucaList.value[a].urls != "") {
num = a
break
}
}
if(screenNum.value == 1){
for(let b=0;b<=num;b++){
if (screenNum.value == 1) {
for (let b = 0; b <= num; b++) {
temporaryList.value.push(JessibucaList.value[b])
}
total.value = num + 1
}else if(screenNum.value == 4 || screenNum.value == 9){
for(let b=0;b<=num;b++){
} else if (screenNum.value == 4 || screenNum.value == 9) {
for (let b = 0; b <= num; b++) {
temporaryList.value.push(JessibucaList.value[b])
}
total.value = num + 1
let remainder = 0
remainder = (num + 1)%screenNum.value
if((num + 1)<screenNum.value){
remainder = (num + 1) % screenNum.value
if ((num + 1) < screenNum.value) {
remainder = screenNum.value - remainder
}
for(let c=0;c<remainder;c++){
for (let c = 0; c < remainder; c++) {
temporaryList.value.push({
id: 1 + temporaryList.value.length,
urls: "",
@ -716,40 +716,40 @@ function pagingClick(pageIndex:any ,pageNum:any ){
}
}
}else{
temporaryList.value= JessibucaList.value
} else {
temporaryList.value = JessibucaList.value
total.value = JessibucaList.value.length
}
strlength.value = pageNum * (pageIndex);
endlength.value = pageNum * (pageIndex + 1);
totalSize.value = Math.ceil(temporaryList.value.length/pageNum)
if(endlength>temporaryList.value.length){
totalSize.value = Math.ceil(temporaryList.value.length / pageNum)
if (endlength > temporaryList.value.length) {
endlength.value = temporaryList.value.length
}
//
for (let i = strlength.value; i < endlength.value; i++) {
tableData.value.push(temporaryList.value[i]);
}
setTimeout(()=>{
setTimeout(() => {
allRefresh()
},100)
}, 100)
}
const handleCurrentChange = (val: number) => {
pagingClick(val-1,screenNum.value)
CameraActive.value =screenNum.value * (val-1)
pagingClick(val - 1, screenNum.value)
CameraActive.value = screenNum.value * (val - 1)
}
const timer:any =ref(null)
const timer: any = ref(null)
//
function animationInfo(){
if(timer.value != null){
function animationInfo() {
if (timer.value != null) {
clearInterval(timer.value)
}
if(isTimer.value == true){
if (isTimer.value == true) {
var tast = /^\+?[1-9][0-9]*$/; //
if(tast.test(minute.value) == false){
if (tast.test(minute.value) == false) {
ElMessage({
type: 'error',
message: '请输入正整数',
@ -759,19 +759,19 @@ function animationInfo(){
return false
}
var millisecond = JSON.parse(JSON.stringify(minute.value)) * 60000
timer.value = setInterval(()=>{
if(currentPage.value >= totalSize.value){
timer.value = setInterval(() => {
if (currentPage.value >= totalSize.value) {
currentPage.value = 1
}else{
} else {
currentPage.value = currentPage.value + 1
}
pagingClick(currentPage.value-1,screenNum.value)
CameraActive.value =screenNum.value * (currentPage.value-1)
},millisecond)
pagingClick(currentPage.value - 1, screenNum.value)
CameraActive.value = screenNum.value * (currentPage.value - 1)
}, millisecond)
}
}
const minute:any = ref(2)
const isGaoliang:any = ref("")
const minute: any = ref(2)
const isGaoliang: any = ref("")
</script>
<template>
<div>
@ -799,8 +799,8 @@ const isGaoliang:any = ref("")
<span v-if="node.data.type == 10 && node.data.useMode == 10">
<span v-if="node.level != 1" :style="{ color: node.data.online == '1' ? '#009bff' : 'red' }">
<svg style="margin-right: 5px;" t="1682315445615" class="icon" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="11437" xmlns:xlink="http://www.w3.org/1999/xlink" width="20"
height="20">
xmlns="http://www.w3.org/2000/svg" p-id="11437" xmlns:xlink="http://www.w3.org/1999/xlink"
width="20" height="20">
<path fill="currentColor" d="M218.3 124.6h77.8l635.8 415.2-223.8 165.5h-48.7L117.7 338.7v-51.9z"
p-id="11438"></path>
<path fill="currentColor"
@ -831,7 +831,8 @@ const isGaoliang:any = ref("")
</el-scrollbar>
</div>
<div id="telescopicids" class="telescopicidsbgcolor"
style="margin-left: 8px; min-width: 4px !important;height: calc(100vh - 90px); cursor:w-resize; z-index:1"></div>
style="margin-left: 8px; min-width: 4px !important;height: calc(100vh - 90px); cursor:w-resize; z-index:1">
</div>
<div class="videomonitor-content" id="contentid">
<div class="videomonitor-content-nav">
<div style="display: flex;align-items: center;">
@ -845,25 +846,19 @@ const isGaoliang:any = ref("")
<img v-else src="@/assets/monitorsystem/spjk_16p.png" alt="" @click="screenNumClick(16)">
</div>
<div style="display: flex;align-items: center;">
<el-checkbox v-model="isTimer" label="轮播" size="large" @change="animationInfo" style="margin:0 10px 0px 30px">轮播</el-checkbox>
<el-checkbox v-model="isTimer" label="轮播" size="large" @change="animationInfo"
style="margin:0 10px 0px 30px">轮播</el-checkbox>
<el-input v-model="minute" placeholder="" oninput="value=value.replace(/^\.+|[^\d]/g,'')"
style="margin-right:20px ;width: 80px;height: 28px;" class="videomonitor-input">
<template #suffix>
<span>分钟</span>
</template>
</el-input>
<el-pagination
class="paginationclass"
background
v-model:current-page="currentPage"
:page-size="screenNum"
:small="true"
layout="pager"
:total="total"
@current-change="handleCurrentChange"
/>
<div title="添加视频版块" style="position: relative; margin-left:10px;margin-right:5px;cursor:pointer; width:24px;height:24px;font-size:18px;background:rgba(0, 155, 255, 1);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:3px"
@click="addVideo" v-if="screenNum == 16" >
<el-pagination class="paginationclass" background v-model:current-page="currentPage" :page-size="screenNum"
:small="true" layout="pager" :total="total" @current-change="handleCurrentChange" />
<div title="添加视频版块"
style="position: relative; margin-left:10px;margin-right:5px;cursor:pointer; width:24px;height:24px;font-size:18px;background:rgba(0, 155, 255, 1);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:3px"
@click="addVideo" v-if="screenNum == 16">
<!-- <el-icon><Plus /></el-icon> -->
<div style="
width: 12px;
@ -880,18 +875,17 @@ const isGaoliang:any = ref("")
background-color: #fff"></div>
</div>
<div title="删除视频版块" style="cursor:pointer; width:24px;height:24px;font-size:18px;background:rgba(0, 155, 255, 1);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:3px"
@click="delVideo" v-if="screenNum == 16 && JessibucaList.length>16">
<div title="删除视频版块"
style="cursor:pointer; width:24px;height:24px;font-size:18px;background:rgba(0, 155, 255, 1);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:3px"
@click="delVideo" v-if="screenNum == 16 && JessibucaList.length > 16">
<div style="
width: 12px;
height: 2px;
background: inherit;
background-color: #fff"></div>
</div>
<img title="监控视频全部重载" src="@/assets/monitorpublic/spjk_sx.png" style=""
@click="allRefresh" />
<img title="监控视频全部关闭" src="@/assets/monitorsystem/spjk_gb.png" style=""
@click="allClose" />
<img title="监控视频全部重载" src="@/assets/monitorpublic/spjk_sx.png" style="" @click="allRefresh" />
<img title="监控视频全部关闭" src="@/assets/monitorsystem/spjk_gb.png" style="" @click="allClose" />
</div>
@ -901,52 +895,74 @@ const isGaoliang:any = ref("")
<div class="Jessibuca-box">
<div class="Camera-img" v-if="screenNum == 1" v-for="(item, index) in tableData" :key="item.id"
:class="{ 'CameraActive': (item.id -1) == CameraActive }" @click="CameraCLick(item.id - 1)">
:class="{ 'CameraActive': (item.id - 1) == CameraActive }" @click="CameraCLick(item.id - 1)">
<div style="position: absolute;z-index: 99;color: #fff;
border-radius:50%;height:22px;width:22px;line-height:22px;text-align:center"> {{ item.id }}</div>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef" :_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{'deviceId':JessibucaList[index + strlength].deviceId,'channelId':JessibucaList[index + strlength].channelId}" :videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls" :hasAudio="false" fluent autoplay live
@closeVideo="closeVideo" @timeout="timeout" @playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false" :_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef" :VideoInfo="JessibucaList[index + strlength]"
:issignal="JessibucaList[index + strlength].issignal" @RefreshLoad="RefreshLoad"></Classstyle>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef"
:_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{ 'deviceId': JessibucaList[index + strlength].deviceId, 'channelId': JessibucaList[index + strlength].channelId }"
:videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls"
:hasAudio="false" fluent autoplay live @closeVideo="closeVideo" @timeout="timeout"
@playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false"
:_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef"
:VideoInfo="JessibucaList[index + strlength]" :issignal="JessibucaList[index + strlength].issignal"
@RefreshLoad="RefreshLoad"></Classstyle>
</div>
<div class="Camera-img4" v-if="screenNum == 4" v-for="(item, index) in tableData" :key="item.id"
:class="{ 'CameraActive': (item.id -1) == CameraActive }" @click="CameraCLick(item.id - 1)">
:class="{ 'CameraActive': (item.id - 1) == CameraActive }" @click="CameraCLick(item.id - 1)">
<div style="position: absolute;z-index: 99;color: #fff;
border-radius:50%;height:22px;width:22px;line-height:22px;text-align:center"> {{ item.id }}</div>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef" :_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{'deviceId':JessibucaList[index + strlength].deviceId,'channelId':JessibucaList[index + strlength].channelId}" :videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls" :hasAudio="false" fluent autoplay live
@closeVideo="closeVideo" @timeout="timeout" @playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false" :_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef" :VideoInfo="JessibucaList[index + strlength]"
:issignal="JessibucaList[index + strlength].issignal" @RefreshLoad="RefreshLoad"></Classstyle>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef"
:_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{ 'deviceId': JessibucaList[index + strlength].deviceId, 'channelId': JessibucaList[index + strlength].channelId }"
:videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls"
:hasAudio="false" fluent autoplay live @closeVideo="closeVideo" @timeout="timeout"
@playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false"
:_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef"
:VideoInfo="JessibucaList[index + strlength]" :issignal="JessibucaList[index + strlength].issignal"
@RefreshLoad="RefreshLoad"></Classstyle>
</div>
<div class="Camera-img9" v-if="screenNum == 9" v-for="(item, index) in tableData" :key="item.id"
:class="{ 'CameraActive': (item.id -1) == CameraActive }" @click="CameraCLick(item.id - 1)">
:class="{ 'CameraActive': (item.id - 1) == CameraActive }" @click="CameraCLick(item.id - 1)">
<div style="position: absolute;z-index: 99;color: #fff;
border-radius:50%;height:22px;width:22px;line-height:22px;text-align:center"> {{ item.id }}</div>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef" :_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{'deviceId':JessibucaList[index + strlength].deviceId,'channelId':JessibucaList[index + strlength].channelId}" :videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls" :hasAudio="false" fluent autoplay live
@closeVideo="closeVideo" @timeout="timeout" @playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false" :_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef" :VideoInfo="JessibucaList[index + strlength]"
:issignal="JessibucaList[index + strlength].issignal" @RefreshLoad="RefreshLoad"></Classstyle>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef"
:_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{ 'deviceId': JessibucaList[index + strlength].deviceId, 'channelId': JessibucaList[index + strlength].channelId }"
:videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls"
:hasAudio="false" fluent autoplay live @closeVideo="closeVideo" @timeout="timeout"
@playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false"
:_uid="JessibucaList[index + strlength].id" @closeVideo="closeVideo" :ref="setRef"
:VideoInfo="JessibucaList[index + strlength]" :issignal="JessibucaList[index + strlength].issignal"
@RefreshLoad="RefreshLoad"></Classstyle>
</div>
<div class="Camera-img16" v-if="screenNum == 16" v-for="(item, index) in tableData" :key="item.id"
:class="{ 'CameraActive': (item.id -1) == CameraActive }" @click="CameraCLick(item.id - 1)">
:class="{ 'CameraActive': (item.id - 1) == CameraActive }" @click="CameraCLick(item.id - 1)">
<div style="position: absolute;z-index: 99;color: #fff;
border-radius:50%;height:22px;width:22px;line-height:22px;text-align:center"> {{ item.id }}</div>
<!-- <video style="width:100%;height:100% ;" :src="'http://192.168.1.119:81/rtp/34020000001320000002_34020000001320000002.live.mp4'" autoplay controls /> -->
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef" :_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{'deviceId':JessibucaList[index + strlength].deviceId,'channelId':JessibucaList[index + strlength].channelId}" :videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls" :hasAudio="false" fluent autoplay live
@closeVideo="closeVideo" @timeout="timeout" @playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false" :_uid="JessibucaList[index + strlength].id" :ref="setRef" @closeVideo="closeVideo" :VideoInfo="JessibucaList[index + strlength]"
:issignal="JessibucaList[index + strlength].issignal" @RefreshLoad="RefreshLoad"></Classstyle>
<JessibucaPlayer v-if="JessibucaList[index + strlength].hide == true" :isClose="true" :ref="setRef"
:_uid="JessibucaList[index + strlength].id" :visible.sync="true"
:devicechannelInfo="{ 'deviceId': JessibucaList[index + strlength].deviceId, 'channelId': JessibucaList[index + strlength].channelId }"
:videofmp4="JessibucaList[index + strlength].videofmp4" :videoUrl="JessibucaList[index + strlength].urls"
:hasAudio="false" fluent autoplay live @closeVideo="closeVideo" @timeout="timeout"
@playbackVideo="playbackVideo"></JessibucaPlayer>
<Classstyle v-if="JessibucaList[index + strlength].hide == false"
:_uid="JessibucaList[index + strlength].id" :ref="setRef" @closeVideo="closeVideo"
:VideoInfo="JessibucaList[index + strlength]" :issignal="JessibucaList[index + strlength].issignal"
@RefreshLoad="RefreshLoad"></Classstyle>
</div>
</div>
</div>
<div class="videomonitor-righthide" id="righthide">
<img v-if="isHideRight" style="cursor: pointer;" src="@/assets/publicimg/put1.png" alt="" @click="hideClick(false)">
<img v-if="!isHideRight" style="cursor: pointer;" src="@/assets/publicimg/putaway.png" alt="" @click="hideClick(true)">
<img v-if="isHideRight" style="cursor: pointer;" src="@/assets/publicimg/put1.png" alt=""
@click="hideClick(false)">
<img v-if="!isHideRight" style="cursor: pointer;" src="@/assets/publicimg/putaway.png" alt=""
@click="hideClick(true)">
</div>
<div class="videomonitor-right" id="richright" v-show="ishide">
<div class="stationboard-box-title">
@ -964,29 +980,35 @@ const isGaoliang:any = ref("")
<div class="Camera-left-button9" @click="presetPosition(130, beforehandPosition)"></div>
</div>
<div class="focallengthbox">
<div class="focallength1" :class="{'gaolaing': isGaoliang=='zoomout'}" @mousedown="ptzCamera('zoomout')" @mouseup="ptzCamera('stop')">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == 'zoomout' }" @mousedown="ptzCamera('zoomout')"
@mouseup="ptzCamera('stop')">
<img src="@/assets/videoimg/left.png" style="width:8px;height:12px" alt="">
</div>
<div class="focallength2">缩放</div>
<div class="focallength1" :class="{'gaolaing': isGaoliang=='zoomin'}" @mousedown="ptzCamera('zoomin')" @mouseup="ptzCamera('stop')">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == 'zoomin' }" @mousedown="ptzCamera('zoomin')"
@mouseup="ptzCamera('stop')">
<img src="@/assets/videoimg/right.png" style="width:8px;height:12px" alt="">
</div>
</div>
<div class="focallengthbox">
<div class="focallength1" :class="{'gaolaing': isGaoliang=='66'}" @mousedown="condensationChang('减')" @mouseup="quxiao">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == '66' }" @mousedown="condensationChang('减')"
@mouseup="quxiao">
<img src="@/assets/videoimg/left.png" style="width:8px;height:12px" alt="">
</div>
<div class="focallength2">光聚</div>
<div class="focallength1" :class="{'gaolaing': isGaoliang=='65'}" @mousedown="condensationChang('加')" @mouseup="quxiao">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == '65' }" @mousedown="condensationChang('加')"
@mouseup="quxiao">
<img src="@/assets/videoimg/right.png" style="width:8px;height:12px" alt="">
</div>
</div>
<div class="focallengthbox">
<div class="focallength1" :class="{'gaolaing': isGaoliang=='72'}" @mousedown="apertureChang('减')" @mouseup="quxiao">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == '72' }" @mousedown="apertureChang('减')"
@mouseup="quxiao">
<img src="@/assets/videoimg/left.png" style="width:8px;height:12px" alt="">
</div>
<div class="focallength2">光圈</div>
<div class="focallength1" :class="{'gaolaing': isGaoliang=='70'}" @mousedown="apertureChang('加')" @mouseup="quxiao">
<div class="focallength1" :class="{ 'gaolaing': isGaoliang == '70' }" @mousedown="apertureChang('加')"
@mouseup="quxiao">
<img src="@/assets/videoimg/right.png" style="width:8px;height:12px" alt="">
</div>
</div>
@ -996,9 +1018,11 @@ const isGaoliang:any = ref("")
font-weight: 400;
font-style: normal;
color: #FFFFFF;">灯光</span>
<el-switch style="display: block;margin-left:10px" v-model="isLighting" inline-prompt @change="lightingClick" active-value="255" inactive-value="0" />
<el-switch style="display: block;margin-left:10px" v-model="isLighting" inline-prompt @change="lightingClick"
active-value="255" inactive-value="0" />
<span style="display: block;padding-left:70px;font-size: 14px; color: rgba(255, 255, 255, 0.8);">红外</span>
<el-switch style="display: block;margin-left:10px" v-model="isInfrared" inline-prompt @change="infraredClick" active-value="255" inactive-value="0" />
<el-switch style="display: block;margin-left:10px" v-model="isInfrared" inline-prompt @change="infraredClick"
active-value="255" inactive-value="0" />
</div>
<div style="display: flex;align-items: center; padding-top: 25px;padding-left: 15px;">
<span
@ -1050,8 +1074,8 @@ const isGaoliang:any = ref("")
</div>
<Eldialog v-if="dialogVisible" :title="'视频回放'" :zIndex="2000" :width="'calc(100vw - 80px)'"
@before-close="handleClose" :elclass="'ylclass'" >
<Eldialog v-if="dialogVisible" :title="'视频回放'" :zIndex="200000000000" :width="'calc(100vw - 80px)'"
@before-close="handleClose" :elclass="'ylclass'">
<template v-slot:PopFrameContent>
<Videorecord v-if="dialogVisible" :playbackInfo="playbackInfo"> </Videorecord>
</template>
@ -1092,7 +1116,8 @@ const isGaoliang:any = ref("")
// background: rgba(17, 52, 44, 0.9);
background: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
padding:0 14px;
padding: 0 14px;
.nav-box {
padding-top: 10px;
width: 100%;
@ -1206,6 +1231,7 @@ const isGaoliang:any = ref("")
height: calc(100% - 40px);
display: flex;
flex-wrap: wrap;
.Camera-img4 {
width: 50%;
height: 50%;
@ -1253,14 +1279,20 @@ const isGaoliang:any = ref("")
height: calc(100vh - 115px);
background: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
:deep(img){
pointer-events:none;
-webkit-touch-callout:none; /*系统默认菜单被禁用*/
-webkit-user-select:none; /*webkit浏览器*/
-khtml-user-select:none; /*早期浏览器*/
-moz-user-select:none;/*火狐*/
-ms-user-select:none; /*IE10*/
user-select:none;
:deep(img) {
pointer-events: none;
-webkit-touch-callout: none;
/*系统默认菜单被禁用*/
-webkit-user-select: none;
/*webkit浏览器*/
-khtml-user-select: none;
/*早期浏览器*/
-moz-user-select: none;
/*火狐*/
-ms-user-select: none;
/*IE10*/
user-select: none;
}
.Camera-operate-buttons {
@ -1290,6 +1322,7 @@ const isGaoliang:any = ref("")
text-align: left;
}
.informationcontent {
width: 165px;
height: 36px;
@ -1344,22 +1377,22 @@ const isGaoliang:any = ref("")
// :deep(.el-input__wrapper .el-input__icon) {
// color: rgb(7, 168, 114);
// }
.paginationclass{
:deep(.el-pager li){
.paginationclass {
:deep(.el-pager li) {
margin: 0 5px;
}
}
:deep(.is-checked .el-checkbox__inner::after) {
:deep(.is-checked .el-checkbox__inner::after) {
color: #ffffff;
}
}
:deep(.el-checkbox__label) {
:deep(.el-checkbox__label) {
color: rgba(255, 255, 255, 1) !important;
}
}
.Camera-left-button1{
.Camera-left-button1 {
cursor: pointer;
position: absolute;
top: 3px;
@ -1368,8 +1401,9 @@ const isGaoliang:any = ref("")
height: 57px;
background: url(@/assets/videoimg/sxj_1.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button2{
}
.Camera-left-button2 {
cursor: pointer;
position: absolute;
top: 10px;
@ -1378,8 +1412,9 @@ const isGaoliang:any = ref("")
height: 72px;
background: url(@/assets/videoimg/sxj_2.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button3{
}
.Camera-left-button3 {
cursor: pointer;
position: absolute;
top: 62px;
@ -1388,8 +1423,9 @@ const isGaoliang:any = ref("")
height: 75px;
background: url(@/assets/videoimg/sxj_3.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button4{
}
.Camera-left-button4 {
cursor: pointer;
position: absolute;
top: 121px;
@ -1398,8 +1434,9 @@ const isGaoliang:any = ref("")
height: 73px;
background: url(@/assets/videoimg/sxj_4.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button5{
}
.Camera-left-button5 {
cursor: pointer;
position: absolute;
top: 147px;
@ -1408,8 +1445,9 @@ const isGaoliang:any = ref("")
height: 57px;
background: url(@/assets/videoimg/sxj_5.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button6{
}
.Camera-left-button6 {
cursor: pointer;
position: absolute;
top: 125px;
@ -1418,8 +1456,9 @@ const isGaoliang:any = ref("")
height: 72px;
background: url(@/assets/videoimg/sxj_6.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button7{
}
.Camera-left-button7 {
cursor: pointer;
position: absolute;
top: 69px;
@ -1428,8 +1467,9 @@ const isGaoliang:any = ref("")
height: 73px;
background: url(@/assets/videoimg/sxj_7.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button8{
}
.Camera-left-button8 {
cursor: pointer;
position: absolute;
top: 12px;
@ -1438,8 +1478,9 @@ const isGaoliang:any = ref("")
height: 72px;
background: url(@/assets/videoimg/sxj_8.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button9{
}
.Camera-left-button9 {
cursor: pointer;
position: absolute;
top: 58px;
@ -1448,86 +1489,96 @@ const isGaoliang:any = ref("")
height: 91px;
background: url(@/assets/videoimg/sxj_9.png) no-repeat center center;
background-size: 100% 100%;
}
}
.Camera-left-button1:hover{
.Camera-left-button1:hover {
background: url(@/assets/videoimg/sxj_1.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_11.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button2:hover{
}
.Camera-left-button2:hover {
background: url(@/assets/videoimg/sxj_2.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_21.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button3:hover{
}
.Camera-left-button3:hover {
background: url(@/assets/videoimg/sxj_3.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_31.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button4:hover{
}
.Camera-left-button4:hover {
background: url(@/assets/videoimg/sxj_4.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_41.png) no-repeat center center;
background-size: 100% 100%;
}
}
.Camera-left-button5:hover{
.Camera-left-button5:hover {
background: url(@/assets/videoimg/sxj_5.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_51.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button6:hover{
}
.Camera-left-button6:hover {
background: url(@/assets/videoimg/sxj_6.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_61.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button7:hover{
}
.Camera-left-button7:hover {
background: url(@/assets/videoimg/sxj_7.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_71.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button8:hover{
}
.Camera-left-button8:hover {
background: url(@/assets/videoimg/sxj_8.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_81.png) no-repeat center center;
background-size: 100% 100%;
}
.Camera-left-button9:hover{
}
.Camera-left-button9:hover {
background: url(@/assets/videoimg/sxj_9.png) no-repeat center center;
background: url(@/assets/videoimg/sxj_91.png) no-repeat center center;
background-size: 100% 100%;
}
.focallengthbox{
}
.focallengthbox {
display: flex;
padding-left: 40px;
padding-top: 10px;
.focallength1{
border: 1px solid rgba(50, 177, 245,0.4);
.focallength1 {
border: 1px solid rgba(50, 177, 245, 0.4);
width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items:center ;
align-items: center;
cursor: pointer;
}
.focallength2{
.focallength2 {
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border-top: 1px solid rgba(50, 177, 245,0.4);
border-bottom: 1px solid rgba(50, 177, 245,0.4);
border-top: 1px solid rgba(50, 177, 245, 0.4);
border-bottom: 1px solid rgba(50, 177, 245, 0.4);
width: 140px;
height: 40px;
display: flex;
justify-content: center;
align-items:center ;
align-items: center;
font-size: 14px;
color: #B5D7FF;
}
}
.gaolaing{
background:rgba(50, 177, 245,0.4)
}
</style>
}
.gaolaing {
background: rgba(50, 177, 245, 0.4)
}
</style>

View File

@ -5,7 +5,7 @@ export default {
</script>
<script setup lang="ts">
import { ref, onMounted, nextTick, onBeforeUnmount } from "vue";
import { ref, onMounted, nextTick, onBeforeUnmount,computed } from "vue";
import { ElMessage } from "element-plus";
import { getVoicePrintByArea, getVoicePatrolPage, executeVoicePatrolTask } from "@/api/videomonitor/index";
import Page from '@/components/Pagination/page.vue'
@ -79,6 +79,7 @@ onBeforeUnmount(() => {
onMounted(() => {
getInit()
})
const tableData = ref([])
const treeloading = ref(false)
const environment_data = ref([

View File

@ -244,8 +244,13 @@
</div>
</div>
<div class="stationboard-right1" id="tableTr">
<div class="stationboard-box-title">
<div class="img_txt"> <img src=@/assets/navigation/ty_bq.png alt=""><span>告警列表</span></div>
<div class="stationboard-box-title" style="padding-bottom:0px ;">
<div style="display: flex;align-items: center;justify-content: space-between;width: 100%;">
<div class="img_txt">
<img src=@/assets/navigation/ty_bq.png alt=""><span>告警列表</span>
</div>
<el-button class="searchButton" @click="alarmInfoClick" >详情</el-button>
</div>
</div>
<div class="table_body">
<div class="table_th">
@ -259,10 +264,10 @@
:class="{ 'table_active': index % 2 == 0 }" @dblclick="processClick(item)">
<div class="tr1 tr" :title="item.content">{{ item.content }}</div>
<div class="tr2 tr">
<span v-if="item.alarmLevel == 1" style="color: #98E0FF;">预警</span>
<span v-if="item.alarmLevel == 2" style="color: #0ACAFF;">一般</span>
<span v-if="item.alarmLevel == 3" style="color: #6B86FF;">严重</span>
<span v-if="item.alarmLevel == 4" style="color: #FF9C29;">危急</span>
<span v-if="item.alarmLevel == 1" style="color: #0099FF;">预警</span>
<span v-if="item.alarmLevel == 2" style="color: #FFFF00;">一般</span>
<span v-if="item.alarmLevel == 3" style="color: #FF9900;">严重</span>
<span v-if="item.alarmLevel == 4" style="color: #FF3300;">危急</span>
</div>
<div class="tr3 tr">{{ dateFormat(item.alarmDate) }}</div>
</div>
@ -340,6 +345,7 @@ import Modelset from './3DModelSet.vue';
import { getTaskTodoStatByMonth } from "@/api/areaboard";
import { useUserStore } from '@/store/modules/user';
import * as echarts from 'echarts';
import router from '@/router';
const userStore = useUserStore();
watch(() => userStore.alarmCount, (newValue, oldValue) => {
alarmCount.value = newValue
@ -362,6 +368,10 @@ function dateFormat(row: any) {
return month + "-" + day + " " + hours + ":" + minutes;
}
}
function alarmInfoClick() {
router.push(`/task/alarmInfo/index`)
}
const tableTop = ref(0)
const tableList: any = ref([])
let tableTimer: any = null

View File

@ -2,7 +2,7 @@
<div class="login-container">
<img :src="loginImg" alt="" style="position: absolute;top: 0;width: 100vw !important;max-width:100vw!important;height:100vh">
<div class="login-container-center">
<div class="title-container">
<div class="title-container" style="width: 461px;">
<img src="@/assets/login/bt.png" alt="" style="margin: auto;">
</div>
<div class="login-container-right">

View File

@ -124,7 +124,7 @@ const num = ref(0)
<div>{{ examinationInfo.componentName }}</div>
</div>
<div class="public-details-conent">
<div v-if="examinationInfo.alarmSourceType == 1" class="public-details-name">告警来源</div>
<div v-if="examinationInfo.taskAlarmType == 4" class="public-details-name">告警来源</div>
<div>{{ currency(AlarmSourceList, examinationInfo.taskAlarmType) }}</div>
</div>
<div class="public-details-conent">
@ -150,7 +150,7 @@ const num = ref(0)
<div >{{ examinationInfo.alarmDate }}</div>
</div>
</div>
<div v-if="examinationInfo.alarmSourceType == 1" style="width:290px;height: 200px;">
<div v-if="examinationInfo.taskAlarmType == 4" style="width:290px;height: 200px;">
<div style="width:100%;height:100%; position: relative;">
<div title="查看图片" style="position: absolute;
right: 5px;

View File

@ -208,7 +208,7 @@ const handleChange = (value: any) => {
<div class="public-details-name">部件名称</div>
<div>{{ examinationInfo.componentName }}</div>
</div>
<div class="public-details-conent" v-if="examinationInfo.alarmSourceType == 1">
<div class="public-details-conent" v-if="examinationInfo.taskAlarmType == 4">
<div class="public-details-name">告警来源</div>
<div>{{ currency(AlarmSourceList, examinationInfo.taskAlarmType) }}</div>
</div>
@ -236,7 +236,7 @@ const handleChange = (value: any) => {
<div>{{ examinationInfo.alarmDate }}</div>
</div>
</div>
<div v-if="examinationInfo.alarmSourceType == 1" style="width:290px;height: 200px;">
<div v-if="examinationInfo.taskAlarmType == 4" style="width:290px;height: 200px;">
<div style="width:100%;height:100%; position: relative;">
<div title="查看图片" style="position: absolute;
right: 5px;

View File

@ -311,7 +311,7 @@ onBeforeUnmount(() => {
left: 0;
right: 0;
bottom: 0;
background: #07241c;
background: #001b4a;
display: flex;
align-items: center;
justify-content: center;

View File

@ -0,0 +1,475 @@
<script setup lang="ts">
import { ref, onMounted, reactive, nextTick } from 'vue'
import Page from '@/components/Pagination/page.vue'
import { ElMessageBox, ElMessage, ElTable, FormRules, ElTree } from 'element-plus'
import { getDeviceByType } from '@/api/device'
import { queryDevice, addDevice, updateDevice, deleteDeviceById, deleteDeviceByIds, updateDeviceByIds } from '@/api/auxiliarymanage/index';
import { getGatewayList } from '@/api/systemmanage'
import { getdevicedata } from "@/api/device";
import Eldialog from '@/components/seccmsdialog/eldialog.vue'
import { useUserStore } from '@/store/modules/user';
import {
getBayTree,
} from "@/api/makeTask";
const userStore = useUserStore();
//
interface Tree {
[x: string]: any;
label: string;
children?: Tree[];
}
const vMove = {
mounted(el: any) {
el.onmousedown = function (e: any) {
var init = e.clientX;
var parent: any = document.getElementById("silderLeft");
const initWidth: any = parent.offsetWidth;
document.onmousemove = function (e) {
var end = e.clientX;
var newWidth = end - init + initWidth;
parent.style.width = newWidth + "px";
};
document.onmouseup = function () {
document.onmousemove = document.onmouseup = null;
};
};
}
}
const tableRowClassName = ({
row,
rowIndex,
}: {
row: any
rowIndex: number
}) => {
if (rowIndex % 2 === 0) {
return 'warning-row'
} else if (rowIndex % 2 === 1) {
return 'success-row'
}
return ''
}
const defaultProps = { label: "dictname" };
const defaultProps1 = {
children: "children",
label: "name"
};
const checktreenode: any = ref({})
const handleNodeClick = (data: Tree) => {
};
const treeRef = ref<InstanceType<typeof ElTree>>()
const treeData: any = ref([])
const treeloading = ref(false)
onMounted(() => {
init()
})
function init() {
const params = {
dictcode: 'FaultDiagnosisType'
}
treeloading.value = true
getDeviceByType(params).then((res: any) => {
if (res.data.length !== 0 && res.data !== null) {
treeData.value = res.data
treeloading.value = false
if (res.data.length !== 0 && res.data !== null) {
nextTick(() => {
treeRef.value?.setCurrentKey(res.data[0].id);
checktreenode.value.code = res.data[0].itemcode
checktreenode.value.name = res.data[0].dictname
});
}
}
})
}
function handleClose() {
serviceOpen.value = false
tieupswitch.value = false
}
//
const serviceOpen = ref(true)
function uphold() {
serviceOpen.value = true
}
//
const tableData = ref([])
const loading = ref(false)
//
const title = ref('')
const tieupswitch = ref(false)
function tieupdevice(row: any) {
title.value = '关联' + row
tieupswitch.value = true
getbaytree()
}
//
//
const treedata = ref([])
const treeRefbay: any = ref(null)
const weitreeloading = ref(false)
const bayId = ref('')
function getbaytree() {
const params = {
stationId: userStore.stationId
}
weitreeloading.value = true
getBayTree(params).then((res: any) => {
if (res.data.length == 0) {
weitableData.value.length = 0
}
weitreeloading.value = false
treedata.value = res.data
bayId.value = res.data[0].children[0].children[0].bayId
nextTick(() => {
treeRefbay.value?.setCurrentKey(bayId.value);
});
// getPointsData()
})
}
//
const currentNodeKeybay = ref("")
function handClick(data: Tree, node: any) {
if (data.children) {
node.isCurrent = false
currentNodeKeybay.value = ""
nextTick(() => {
currentNodeKeybay.value = bayId.value
})
} else {
bayId.value = data.bayId;
}
}
//
const weitableData = ref([])
const tableloading = ref(false)
const bayName = ref('')
// const componentIds = ref('')
// const mainDeviceIds = ref('')
function getPointsData() {
tableloading.value = true
const params = {
bayId: bayId.value,
// componentId: componentIds.value,
// mainDeviceId: mainDeviceIds.value,
status: 0,
// patrolDeviceCode: info.value.robotCode,
deviceName: bayName.value
}
getdevicedata(params).then((res: any) => {
tableloading.value = false
weitableData.value = res.data.records
res.data.records.forEach((res: any) => {
res['id'] = res.deviceId
})
})
}
function handPointsChange(val: any) {
}
function resetComponent() {
bayId.value = ''
getPointsData()
}
</script>
<template>
<div class="faulttemplate-box">
<aside id="silderLeft">
<el-tree v-loading="treeloading" ref="treeRef" node-key="id" :data="treeData" :highlight-current="true"
:props="defaultProps" :expand-on-click-node="false" @node-click="handleNodeClick"
style="height: calc(87vh); overflow: auto;margin-top: 10px;">
</el-tree>
<div class="moveBtn" v-move>
<div class="moveBtn-line"></div>
</div>
</aside>
<section class="silderRight1">
<div class="right_yop">
<div class="right_button"><el-button class="searchButton" type="primary" @click="uphold">维护</el-button>
</div>
<div>
</div>
</div>
<div></div>
</section>
<Eldialog v-if="serviceOpen" :title="'维护'" :zIndex="2000" :width="'60%'" @before-close="handleClose">
<template v-slot:PopFrameContent>
<div>
<div>
<el-button class="searchButton" type="primary" @click="tieupdevice('点位')">关联点位</el-button>
<el-button class="searchButton" type="primary" @click="tieupdevice('信号')">关联信号</el-button>
</div>
<div class="tieup">
<div class="tieup_title">
<div class="tieup_title_line"></div>
<div class="tieup_title_text">关联结果</div>
</div>
<div>
<el-table ref="multipleTableRef" :data="tableData" :row-class-name="tableRowClassName"
:v-loading="loading"
style="width: 100%;margin-bottom: 20px;height: calc(35vh);overflow: auto;" row-key="id"
default-expand-all
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column label="序号" type="index" width="50" />
<el-table-column label="设备编号" prop="deviceCode" />
</el-table>
</div>
<span class="dialog-footer"
style="width: 95%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;margin-top: 10px;">
<div class="details-button" @click="handleClose">取消</div>
<div class="details-button" @click="">保存</div>
</span>
</div>
</div>
</template>
</Eldialog>
<Eldialog v-if="tieupswitch" :title="title" :zIndex="2000" :width="'80%'" @before-close="handleClose">
<template v-slot:PopFrameContent>
<div class="faulttemplate-box1">
<aside id="silderLeft1">
<div class="displayflex">
<div class="line"></div>
<div class="title" style="font-size: 14px;color: #fff;">数据列表</div>
</div>
<el-scrollbar>
<el-tree ref="treeRefbay" node-key="bayId" :data="treedata"
:current-node-key="currentNodeKeybay" v-loading="weitreeloading"
:highlight-current="true" :props="defaultProps1" @node-click="handClick">
</el-tree>
</el-scrollbar>
</aside>
<section class="silderRightDialog">
<div
style="display: flex;display: -webkit-flex; justify-content: space-between; -webkit-justify-content: space-between; margin:5px">
<div style="display: flex;display: -webkit-flex; align-items: center;width: 80%;">
<el-input v-model="bayName" placeholder="请输入巡视点位名称" clearable @clear="getPointsData()"
@change="getPointsData()" style="margin-right:15px ;width: 30%;" />
<el-button class="searchButton" @click="getPointsData()">搜索</el-button>
<el-button class="searchButton" @click="resetComponent()">重置</el-button>
</div>
<div><el-button class="searchButton" @click="">添加</el-button></div>
</div>
<div class="draggable">
<el-table ref="multipleTableRef" :data="weitableData" :row-class-name="tableRowClassName"
:v-loading="loading"
style="width: 100%;margin-bottom: 20px;height: calc(35vh);overflow: auto;" row-key="id"
default-expand-all
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="selection" width="30" align="center" />
<el-table-column label="序号" type="index" width="50"></el-table-column>
<el-table-column label="巡视点位名称" prop="deviceName"></el-table-column>
<el-table-column label="所属主设备" prop="mainDeviceName"></el-table-column>
<el-table-column label="所属部件" prop="componentName"></el-table-column>
</el-table>
</div>
</section>
</div>
</template>
</Eldialog>
</div>
</template>
<style scoped lang="scss">
.silderLeft-default {
:deep(.el-tree-node__label) {
font-size: 16px !important;
}
}
.faulttemplate-box {
height: 100%;
display: flex;
display: -webkit-flex;
background-color: #f2f4f900;
padding: 15px 15px 0px 15px;
}
#silderLeft {
width: 300px;
padding: 5px 0px 10px;
box-sizing: border-box;
border-radius: 3px;
position: relative;
background: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
&:hover {
.moveBtn {
opacity: 1;
}
}
}
/* 拖动条 */
.moveBtn {
height: 100%;
width: 15px;
padding: 0 6px;
opacity: 0;
position: absolute;
right: -15px;
top: 0;
}
.moveBtn-line {
width: 100%;
height: 100%;
cursor: col-resize;
user-select: none;
background-color: #60bfff;
}
.silderRight1 {
flex: 1;
width: 100%;
height: calc(100vh - 160px);
overflow: auto;
background-color: rgba(255, 255, 255, 0);
border-radius: 3px;
box-sizing: border-box;
margin-left: 15px;
.right_yop {
width: 100%;
height: calc(60vh);
box-sizing: border-box;
padding: 15px;
background: url(@/assets/navigation/sw1.png);
background-size: 100% 100%;
.right_button {
display: flex;
justify-content: end;
}
}
}
//
.tieup {
width: 100%;
.tieup_title {
width: 100%;
display: flex;
align-items: center;
color: #fff;
font-size: 18px;
margin: 10px 0px;
.tieup_title_line {
width: 6px;
height: 16px;
background-color: #009bff;
margin-right: 10px;
}
}
}
/////////
///
///
.faulttemplate-box1 {
height: 100%;
display: flex;
display: -webkit-flex;
padding-top: 15px;
#silderLeft1 {
width: 300px;
padding: 10px;
box-sizing: border-box;
background-image: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
height: calc(70vh);
overflow: auto;
}
.silderRightDialog {
flex: 1;
width: 100%;
height: calc(70vh);
overflow: auto;
// background-color: rgba(255, 255, 255, 1); navigation/ty_260x988.png riis-web/src/assets/navigation/ty_1614x988.png
border-radius: 3px;
box-sizing: border-box;
margin-left: 15px;
background: url(@/assets/navigation/ty_1614x988.png);
background-size: 100% 100%;
padding: 10px;
}
}
.displayflex {
display: flex;
align-items: center;
.line {
width: 5px;
height: 14px;
background: #0099ff;
}
.title {
padding-left: 10px;
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
font-weight: 700;
font-style: normal;
font-size: 16px;
color: #303133;
text-decoration: none !important;
}
}
:deep(.el-tree-node.is-current>.el-tree-node__content) {
width: 100%;
height: 40px;
// color: #fff !important;
}
:deep(.el-tree) {
background-color: #ffffff00 !important;
--el-tree-node-hover-bg-color: #0099ff09;
}
:deep(.el-tree-node__content) {
width: 100% !important;
height: 40px !important;
margin: auto !important;
}
:deep(.el-table:not(.el-table--border) .el-table__cell) {
border: none;
color: #fff;
}
:deep(.el-tree) {
background-color: #ffffff00 !important;
--el-tree-node-hover-bg-color: #0099ff09;
}
:deep(.el-input) {
--el-input-bg-color: #ffffff00 !important;
}
:deep(.el-input-group__append) {
background: #ffffff00 !important;
}
:deep(.el-input .el-input__count .el-input__count-inner) {
background-color: rgba(240, 248, 255, 0);
}
:deep(.el-scrollbar) {
height: 95% !important;
}
</style>

View File

@ -183,7 +183,7 @@ function rowClick(row: any) {
if (row.id == alarmInfo.value.id ) {
return
}
if (row.alarmSourceType == 2) {
if (row.taskAlarmType == 4) {
ElMessage({message:'辅控任务暂无图片和视频',type:'warning'})
return
}
@ -577,36 +577,36 @@ const isVideo = ref(false)
style="width: 100%;margin:auto;position: relative;margin-top: 0px; height:calc(75vh); overflow: auto "
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }"
@selection-change="handleSelectionChange" @row-click="rowClick">
<el-table-column type="selection" width="55" align="center" />
<el-table-column type="index" align="center" label="序号" width="60px"></el-table-column>
<el-table-column prop="patroldeviceName" label="设备名称" />
<el-table-column prop="componentName" label="部件名称" />
<el-table-column prop="deviceName" label="点位名称" />
<el-table-column prop="materialId" label="实物ID">
<el-table-column type="selection" width="20" align="center" />
<el-table-column type="index" align="center" label="序号" width="40px"></el-table-column>
<el-table-column prop="patroldeviceName" label="设备名称" align="center" />
<el-table-column prop="componentName" label="部件名称" align="center" />
<el-table-column prop="deviceName" label="点位名称" align="center" />
<el-table-column prop="materialId" label="实物ID" align="center">
<template #default="scope">
<span v-if="scope.row.materialId">{{ scope.row.materialId }}</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column label="点位分类" prop="appearanceType">
<el-table-column label="点位分类" prop="appearanceType" align="center">
<template #default="scope">
<span v-if="scope.row.pointType == 1"></span>
<span v-if="scope.row.pointType == 2"></span>
<span v-if="scope.row.pointType == 3"></span>
</template>
</el-table-column>
<el-table-column prop="taskAlarmType" label="告警来源" width="110px" align="center">
<el-table-column prop="taskAlarmType" label="告警来源" width="80px" align="center">
<template #default="scope">
<span>{{ currency(AlarmSourceList, scope.row.taskAlarmType) }}</span>
</template>
</el-table-column>
<el-table-column prop="alarmType" label="告警类型" width="110px" align="center">
<el-table-column prop="alarmType" label="告警类型" width="80px" align="center">
<template #default="scope">
<span>{{ currency(AlarmTypeArr,scope.row.alarmSourceType == '1'? scope.row.alarmType : scope.row.fkAlarmType) }}</span>
<span>{{ currency(AlarmTypeArr,scope.row.taskAlarmType == '4'? scope.row.alarmType : scope.row.fkAlarmType) }}</span>
</template>
</el-table-column>
<el-table-column prop="alarmLevel" label="告警等级" width="90px" align="center">
<el-table-column prop="alarmLevel" label="告警等级" width="80px" align="center">
<template #default="scope">
<span v-if="scope.row.alarmLevel == 1" style="color: #0099FF;">{{ currency(AlarmLevelList,
scope.row.alarmLevel) }}</span>
@ -752,7 +752,7 @@ const isVideo = ref(false)
<div class="details-name">部件名称</div>
<div>{{ examinationInfo.componentName }}</div>
</div>
<div class="details-conent" v-if="examinationInfo.alarmSourceType == 1">
<div class="details-conent" v-if="examinationInfo.taskAlarmType == 4">
<div class="details-name">告警来源</div>
<div>{{ currency(AlarmSourceList, examinationInfo.taskAlarmType) }}</div>
</div>
@ -762,7 +762,7 @@ const isVideo = ref(false)
<div>{{ currency(AlarmLevelList, examinationInfo.alarmLevel) }}</div>
</div>
</div>
<div style="width:290px;height: 180px;margin: 0px 0px 10px 0px ;" v-if="examinationInfo.alarmSourceType == 1">
<div style="width:290px;height: 180px;margin: 0px 0px 10px 0px ;" v-if="examinationInfo.taskAlarmType == 4">
<div style="width:100%;height:100%; position: relative;">
<div title="查看图片" style="position: absolute;right: 5px;top: 5px;width: 26px;height: 26px;border-radius: 4px;
display: flex;align-items: center;justify-content: center;cursor: pointer;background: rgba(0,0,0,0.5);">

View File

@ -22,6 +22,7 @@ import {
PatrolTask,
getRobotAndUavList
} from "@/api/makeTask";
import dayjs from 'dayjs'
import { secondauthPassword } from '@/api/robotmonitoring'
import { getdevicedata } from "@/api/device";
import { encrypt, decrypt } from '@/utils/sm4';
@ -1484,7 +1485,16 @@ onMounted(() => {
getarrType()
GetSelect()
getrobotUAV()
gettoday()
});
function gettoday() {
// 0
let startTime = dayjs().startOf('day').format('YYYY-MM-DD HH:mm:ss')
//
let endTime = dayjs().format('YYYY-MM-DD HH:mm:ss')
tableData.value[0] = startTime
tableData.value[1] = endTime
}
//
function changeType(row: any) {
info.value.priority = row

View File

@ -5285,7 +5285,7 @@ ws1.onclose = () => {
left: 0;
right: 0;
bottom: 0;
background: #131a25;
background: #001b4a;
display: flex;
align-items: center;
justify-content: center;

View File

@ -2875,7 +2875,7 @@ function nextPage() {
left: 0;
right: 0;
bottom: 0;
background: #131a25;
background: #001b4a;
display: flex;
align-items: center;
justify-content: center;