Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
94b13ac2f7
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,297 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "NoHomologousAnalysis", // 非同源对比分析
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref, onMounted, } from "vue";
|
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
|
||||||
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
|
|
||||||
import { getNonHomologousAnalysis } from '@/api/NoHomologousAnalysis';
|
|
||||||
|
|
||||||
import { getMainEquipment, getBayType, getDeviceByType, } from "@/api/device";
|
|
||||||
import moment from 'moment'
|
|
||||||
const userStore = useUserStore();
|
|
||||||
//获取表格数据
|
|
||||||
//表格所需参数
|
|
||||||
const date: any = ref([])
|
|
||||||
const queryInfo: any = ref({
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
})
|
|
||||||
//表格数据
|
|
||||||
const tableData: any = ref([])
|
|
||||||
const interval: any = ref([])
|
|
||||||
function getData() {
|
|
||||||
let params: any = {
|
|
||||||
stationCode: queryInfo.value.stationCode,
|
|
||||||
taskName: queryInfo.value.taskName,
|
|
||||||
mainDeviceName: queryInfo.value.mainDeviceName,
|
|
||||||
componentName: queryInfo.value.componentName,
|
|
||||||
recognitionType: queryInfo.value.recognitionType,
|
|
||||||
}
|
|
||||||
if (date.value) {
|
|
||||||
params.startDate = date.value[0]
|
|
||||||
params.endDate = date.value[1]
|
|
||||||
}
|
|
||||||
getNonHomologousAnalysis(params).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
for (let j = 0; j < res.data[i].resultList.length; j++) {
|
|
||||||
res.data[i].resultList[j].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].resultList[j].defectFilePath)
|
|
||||||
res.data[i].resultList[j].FilePathList = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].resultList[j].defectFilePath)
|
|
||||||
res.data[i].resultList[j].tempfilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].resultList[j].filePath)
|
|
||||||
res.data[i].resultList[j].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].resultList[j].filePath)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tableData.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
date.value = []
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
queryInfo.value = {
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
}
|
|
||||||
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
onMounted(() => {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
getData()
|
|
||||||
notification()
|
|
||||||
})
|
|
||||||
function notification() {
|
|
||||||
// 识别类型
|
|
||||||
recognition_type.value = []
|
|
||||||
getDeviceByType({ dictcode: 'recognition_type' }).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
if (res.data[i].itemcode == '1' || res.data[i].itemcode == '2' || res.data[i].itemcode == '4') {
|
|
||||||
recognition_type.value.push(res.data[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//识别类型
|
|
||||||
const recognition_type = ref()
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div style="padding: 60px 15px 10px;">
|
|
||||||
<div class="main">
|
|
||||||
<div style="height:45px;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage">
|
|
||||||
<el-input v-model="queryInfo.taskName" placeholder="请输入任务名称" @clear="getData" @keyup.enter="getData" clearable
|
|
||||||
style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage">
|
|
||||||
<el-input v-model="queryInfo.mainDeviceName" placeholder="请输入主设备" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.componentName" placeholder="请输入部件" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div class="screenHomepage">
|
|
||||||
<el-select :teleported="false" :popper-append-to-body="false" v-model="queryInfo.recognitionType"
|
|
||||||
class="mx-[10px] selType" placeholder="识别类型" @change="getData" clearable>
|
|
||||||
<el-option v-for="item in recognition_type" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<div style=" " class="screenHomepage">
|
|
||||||
<el-date-picker style="width: 300px;" v-model="date" type="daterange" range-separator="至"
|
|
||||||
start-placeholder="开始时间" popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
|
|
||||||
end-placeholder="结束时间" :clearable="false" @change="getData" />
|
|
||||||
</div>
|
|
||||||
<el-button class="searchButton" @click="getData">搜索</el-button>
|
|
||||||
<el-button class="searchButton" @click="resetting()">重置</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="rightNav">
|
|
||||||
<el-scrollbar>
|
|
||||||
<div class="listbox" v-for="(item, index) in tableData" :key="'a' + index">
|
|
||||||
<div style="display: flex;align-items: center;margin-bottom: 15px;">
|
|
||||||
<div class="NoHomologousAnalysis-title">{{ item.taskName }}</div>
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;">
|
|
||||||
<div>
|
|
||||||
<div class="listinformation" v-for="(items, indexs) in item.resultList" :key="'b' + indexs">
|
|
||||||
<div style="width: 50px;text-align: center;">01</div>
|
|
||||||
<div
|
|
||||||
style="min-width: calc(100vw - 250px);display: flex;align-items: center;justify-content: space-between;">
|
|
||||||
<div class="listname" style="width:18%">所属设备:{{ items.mainDeviceName }}</div>
|
|
||||||
<div class="listname" style="width:15%">所属部件:{{ items.componentName }}</div>
|
|
||||||
<div class="listname" style="width:27%">摄像机名称:{{ items.patroldeviceName }}</div>
|
|
||||||
<div class="listname" style="width: 150px;">识别结果:
|
|
||||||
<span v-if="items.valueType == 'meter' || items.valueType == 'infrared'">
|
|
||||||
<span v-if="items.analysisResult == '异常'" style="color: red;font-size: 16px;font-weight: bold;"> {{
|
|
||||||
items.value }} {{ items.unit }}</span>
|
|
||||||
<span v-else> {{ items.value }} {{ items.unit }}</span>
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="items.conf != null && items.conf != ''">{{ items.conf }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="width: 150px;">分析结论:
|
|
||||||
<span v-if="items.analysisResult == '正常'" style="color: rgb(0, 249, 162)">正常</span>
|
|
||||||
<span v-if="items.analysisResult == '异常'"
|
|
||||||
style="color: rgb(255, 51, 0);color: red;font-size: 16px;font-weight: bold;">异常</span>
|
|
||||||
<span v-if="items.analysisResult == '设备检修'" style="color: rgb(0, 153, 255)">设备检修</span>
|
|
||||||
<span v-if="items.analysisResult == '采集失败'" style="color: rgb(0, 153, 255)">采集失败</span>
|
|
||||||
<span v-if="items.analysisResult == '识别失败'" style="color: rgb(0, 153, 255)">识别失败</span>
|
|
||||||
<span v-if="items.analysisResult == '失败'" style="color: rgb(255, 189, 0)">失败</span>
|
|
||||||
<span v-if="items.analysisResult == '成功'" style="color: rgb(0, 249, 162)">成功</span>
|
|
||||||
<span v-if="items.analysisResult == '' || items.analysisResult == null">--</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="width: 60px;text-align: center;">
|
|
||||||
<el-image v-if="items.defectFilePath != undefined && items.defectFilePath != ''"
|
|
||||||
style="width: 30px; height: 30px;margin:auto" :src="items.smallFilePath" :zoom-rate="1.2"
|
|
||||||
:preview-src-list="items.FilePathList" :preview-teleported="true" fit="cover" /><el-image
|
|
||||||
v-else-if="items.filePath != undefined && items.filePath != ''"
|
|
||||||
style="width: 30px; height: 30px;margin:auto" :src="items.tempfilePath" :zoom-rate="1.2"
|
|
||||||
:preview-src-list="items.srcList" :preview-teleported="true" fit="cover" />
|
|
||||||
<span v-else>--</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="width: 240px;">巡视时间:{{ items.patroldeviceDate }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
width: 123px;
|
|
||||||
height: 125px;
|
|
||||||
background-color: rgba(255, 255, 255, 0.05);
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
color: #FFFFFF;font-size: 16px;">
|
|
||||||
差值:<span v-if="item.difference != null && item.difference != '' && item.difference <= item.alertvalue"
|
|
||||||
style="color:#FFBD00;font-size: 20px;">{{ item.difference }}</span>
|
|
||||||
<span v-if="item.difference != null && item.difference != '' && item.difference > item.alertvalue"
|
|
||||||
style="color:red;font-size: 20px;">{{ item.difference }}</span>
|
|
||||||
<span v-if="item.difference == null || item.difference == '' > item.alertvalue"
|
|
||||||
style="font-size: 20px;">--</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-show="tableData.length==0" class="none">暂无数据</div>
|
|
||||||
</el-scrollbar>
|
|
||||||
</div></div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.main {
|
|
||||||
width: 100%;
|
|
||||||
background: url(@/assets/\monitorsystem/xqfx_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
.searchButton {
|
|
||||||
border: #009bff solid 1px;
|
|
||||||
background-color: #009bff;
|
|
||||||
color: #fff;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightNav {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 260px);
|
|
||||||
margin-top: 10px;
|
|
||||||
padding-top: 10px;
|
|
||||||
position: relative;
|
|
||||||
background: url(@/assets/MenuIcon/xsyue_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper) {
|
|
||||||
background-color: transparent !important;
|
|
||||||
box-shadow: (0 0 0 1px #225b7e) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__inner) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-select-dropdown__wrap) {
|
|
||||||
background-color: #17212e !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-date-editor .el-range-input) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listbox {
|
|
||||||
width: 100%;
|
|
||||||
height: 195px;
|
|
||||||
border: 1px solid #2a3d4d;
|
|
||||||
border-radius: 4px;
|
|
||||||
background: #17212e;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding: 10px;
|
|
||||||
|
|
||||||
.NoHomologousAnalysis-title {
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listinformation {
|
|
||||||
width: calc(100vw - 210px);
|
|
||||||
height: 60px;
|
|
||||||
margin-right: 10px;
|
|
||||||
background-color: rgba(255, 255, 255, 0.05);
|
|
||||||
color: #ffffff;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 14px;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
|
|
||||||
.listname {
|
|
||||||
padding: 0 3px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.listinformation:hover {
|
|
||||||
border: 1px solid #009bff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.none{
|
|
||||||
width: 100%;
|
|
||||||
height: 195px;
|
|
||||||
line-height: 195px;
|
|
||||||
border: 1px solid #2a3d4d;
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #ccc;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,346 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "NoInPhaseAnalysis", // 非同相对比分析
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref, onMounted, nextTick } from "vue";
|
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import { getNonCoherentAnalysis } from '@/api/NoHomologousAnalysis';
|
|
||||||
|
|
||||||
import moment from 'moment'
|
|
||||||
const userStore = useUserStore();
|
|
||||||
//获取表格数据
|
|
||||||
//表格所需参数
|
|
||||||
const queryInfo: any = ref({
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
})
|
|
||||||
const taskName = ref()
|
|
||||||
const date: any = ref([])
|
|
||||||
const info: any = ref({
|
|
||||||
size: 10,
|
|
||||||
current: 1,
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
startDate: '',
|
|
||||||
endDate: '',
|
|
||||||
taskName: '',
|
|
||||||
type: '',
|
|
||||||
bayId: ''
|
|
||||||
})
|
|
||||||
const treeloading = ref(false)
|
|
||||||
//表格数据
|
|
||||||
const tableData: any = ref([])
|
|
||||||
function getData() {
|
|
||||||
let params: any = {
|
|
||||||
stationCode: queryInfo.value.stationCode,
|
|
||||||
taskName: queryInfo.value.taskName,
|
|
||||||
mainDeviceName: queryInfo.value.mainDeviceName,
|
|
||||||
componentName: queryInfo.value.componentName,
|
|
||||||
recognitionType: queryInfo.value.recognitionType,
|
|
||||||
}
|
|
||||||
if (date.value) {
|
|
||||||
params.startDate = date.value[0]
|
|
||||||
params.endDate = date.value[1]
|
|
||||||
}
|
|
||||||
getNonCoherentAnalysis(params).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
for (let j = 0; j < res.data[i].taskResultList.length; j++) {
|
|
||||||
res.data[i].taskResultList[j].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].taskResultList[j].defectFilePath)
|
|
||||||
res.data[i].taskResultList[j].FilePathList = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].taskResultList[j].defectFilePath)
|
|
||||||
res.data[i].taskResultList[j].tempfilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].taskResultList[j].filePath)
|
|
||||||
res.data[i].taskResultList[j].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].taskResultList[j].filePath)]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tableData.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
date.value = []
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
queryInfo.value = {
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
}
|
|
||||||
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
notification()
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
|
|
||||||
nextTick(() => {
|
|
||||||
getData()
|
|
||||||
});
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
const DevicePhase: any = ref([])
|
|
||||||
function notification() {
|
|
||||||
// 识别类型
|
|
||||||
recognition_type.value = []
|
|
||||||
getDeviceByType({ dictcode: 'recognition_type' }).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
if (res.data[i].itemcode == '1' || res.data[i].itemcode == '2' || res.data[i].itemcode == '4') {
|
|
||||||
recognition_type.value.push(res.data[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
getDeviceByType({ dictcode: 'DevicePhase' }).then((res: any) => {
|
|
||||||
DevicePhase.value = res.data
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
//识别类型
|
|
||||||
const recognition_type = ref()
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div style="padding: 60px 15px 10px;">
|
|
||||||
<div class="main">
|
|
||||||
<div style="height:45px;position: relative;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.taskName" placeholder="请输入任务名称" @clear="getData" @keyup.enter="getData" clearable
|
|
||||||
style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.mainDeviceName" placeholder="请输入主设备" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.componentName" placeholder="请输入部件" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div class="screenHomepage selType">
|
|
||||||
<el-select :teleported="false" :popper-append-to-body="false" v-model="queryInfo.recognitionType"
|
|
||||||
class="mr-[10px] selType" placeholder="识别类型" @change="getData" clearable>
|
|
||||||
<el-option v-for="item in recognition_type" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<div class="screenHomepage">
|
|
||||||
<el-date-picker style="width: 300px;" v-model="date" type="daterange" range-separator="至"
|
|
||||||
start-placeholder="开始时间" popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
|
|
||||||
end-placeholder="结束时间" :clearable="false" @change="getData" />
|
|
||||||
</div>
|
|
||||||
<el-button class="searchButton" @click="getData">搜索</el-button>
|
|
||||||
<el-button class="searchButton" @click="resetting()">重置</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="rightNav">
|
|
||||||
<el-scrollbar>
|
|
||||||
<div class="listbox" v-for="(item, index) in tableData" :key="'a' + index">
|
|
||||||
<div style="display: flex;align-items: center;margin-bottom: 15px;">
|
|
||||||
<div class="NoHomologousAnalysis-line"></div>
|
|
||||||
<div class="NoHomologousAnalysis-title">{{ item.name }}</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="listinformationheader">
|
|
||||||
<div style="width: 80px;text-align: center;">序号</div>
|
|
||||||
<div class="listname" style="width:60px">相位</div>
|
|
||||||
<div
|
|
||||||
style="min-width: calc(100vw - 735px);display: flex;align-items: center;justify-content: space-between;">
|
|
||||||
<div class="listname" style="width:33.3%">设备名称</div>
|
|
||||||
<div class="listname" style="width:33.3%">部件名称</div>
|
|
||||||
<div class="listname" style="width:33.3%">摄像机名称</div>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="min-width: 150px;">巡视结果</div>
|
|
||||||
<div class="listname" style="min-width: 150px;">巡视结论</div>
|
|
||||||
<div class="listname" style="min-width: 80px;text-align: center;">巡视图片</div>
|
|
||||||
<div class="listname" style="min-width: 180px;">巡视时间</div>
|
|
||||||
</div>
|
|
||||||
<div class="listinformation" v-for="(items, indexs) in item.taskResultList" :key="'b' + indexs">
|
|
||||||
<div style="width: 80px;text-align: center;">{{ '0' + (indexs + 1) }}</div>
|
|
||||||
<div class="listname" style="width:60px">
|
|
||||||
<span>{{ currency(DevicePhase, items.phase) }}</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style="min-width: calc(100vw - 735px);display: flex;align-items: center;justify-content: space-between;">
|
|
||||||
<div class="listname" style="width:33.3%">{{ items.mainDeviceName }}</div>
|
|
||||||
<div class="listname" style="width:33.3%">{{ items.componentName }}</div>
|
|
||||||
<div class="listname" style="width:33.3%">{{ items.patroldeviceName }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="min-width: 150px;">
|
|
||||||
<span v-if="items.valueType == 'meter' || items.valueType == 'infrared'">
|
|
||||||
<span v-if="items.analysisResult == '异常'" style="color: red;font-size: 16px;font-weight: bold;"> {{
|
|
||||||
items.value }} {{ items.unit }}</span>
|
|
||||||
<span v-else style="color: #00F9A2;"> {{ items.value }} {{ items.unit }}</span>
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="items.conf != null && items.conf != ''" style="color: #00F9A2;">{{ items.conf }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="min-width: 150px;">
|
|
||||||
<span v-if="items.analysisResult == '正常'" style="color: rgb(0, 249, 162)">正常</span>
|
|
||||||
<span v-if="items.analysisResult == '异常'"
|
|
||||||
style="color: rgb(255, 51, 0);color: red;font-size: 16px;font-weight: bold;">异常</span>
|
|
||||||
<span v-if="items.analysisResult == '设备检修'" style="color: rgb(0, 153, 255)">设备检修</span>
|
|
||||||
<span v-if="items.analysisResult == '采集失败'" style="color: rgb(0, 153, 255)">采集失败</span>
|
|
||||||
<span v-if="items.analysisResult == '识别失败'" style="color: rgb(0, 153, 255)">识别失败</span>
|
|
||||||
<span v-if="items.analysisResult == '失败'" style="color: rgb(255, 189, 0)">失败</span>
|
|
||||||
<span v-if="items.analysisResult == '成功'" style="color: rgb(0, 249, 162)">成功</span>
|
|
||||||
<span v-if="items.analysisResult == '' || items.analysisResult == null">--</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="min-width: 80px;text-align: center;">
|
|
||||||
<el-image v-if="items.defectFilePath != undefined && items.defectFilePath != ''"
|
|
||||||
style="width: 30px; height: 30px;margin:auto" :src="items.smallFilePath" :zoom-rate="1.2"
|
|
||||||
:preview-src-list="items.FilePathList" :preview-teleported="true" fit="cover" /><el-image
|
|
||||||
v-else-if="items.filePath != undefined && items.filePath != ''"
|
|
||||||
style="width: 30px; height: 30px;margin:auto" :src="items.tempfilePath" :zoom-rate="1.2"
|
|
||||||
:preview-src-list="items.srcList" :preview-teleported="true" fit="cover" />
|
|
||||||
<span v-else>--</span>
|
|
||||||
</div>
|
|
||||||
<div class="listname" style="min-width: 180px;">{{ items.patroldeviceDate }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-show="tableData.length == 0" class="none">暂无数据</div>
|
|
||||||
</el-scrollbar>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.main {
|
|
||||||
width: 100%;
|
|
||||||
background: url(@/assets/\monitorsystem/xqfx_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.searchButton {
|
|
||||||
border: #009bff solid 1px;
|
|
||||||
background-color: #009bff;
|
|
||||||
color: #fff;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.rightNav {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 260px);
|
|
||||||
margin-top: 10px;
|
|
||||||
padding-top: 10px;
|
|
||||||
position: relative;
|
|
||||||
background: url(@/assets/MenuIcon/xsyue_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper) {
|
|
||||||
background-color: transparent !important;
|
|
||||||
box-shadow: (0 0 0 1px #225b7e) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__inner) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-select-dropdown__wrap) {
|
|
||||||
background-color: #17212e !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-date-editor .el-range-input) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listbox {
|
|
||||||
width: 100%;
|
|
||||||
border: 1px solid #2a3d4d;
|
|
||||||
border-radius: 4px;
|
|
||||||
background: #17212e;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding: 10px;
|
|
||||||
|
|
||||||
.NoHomologousAnalysis-title {
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.listinformationheader {
|
|
||||||
width: calc(100vw - 80px);
|
|
||||||
height: 44px;
|
|
||||||
margin-right: 10px;
|
|
||||||
background-color: rgba(255, 255, 255, 0.05);
|
|
||||||
color: #B5D7FF;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 14px;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
|
|
||||||
.listname {
|
|
||||||
padding: 0 3px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.listinformation {
|
|
||||||
width: calc(100vw - 80px);
|
|
||||||
height: 44px;
|
|
||||||
margin-right: 10px;
|
|
||||||
color: #ffffff;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 14px;
|
|
||||||
border: 1px solid transparent;
|
|
||||||
|
|
||||||
.listname {
|
|
||||||
padding: 0 3px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.listinformation:hover {
|
|
||||||
border: 1px solid #009bff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.none {
|
|
||||||
width: 100%;
|
|
||||||
height: 195px;
|
|
||||||
line-height: 195px;
|
|
||||||
border: 1px solid #2a3d4d;
|
|
||||||
border-radius: 4px;
|
|
||||||
color: #ccc;
|
|
||||||
text-align: center;
|
|
||||||
}</style>
|
|
@ -1,417 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "NoInPhaseAnalysis", // 趋势变化对比分析
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import { ref, onMounted, } from "vue";
|
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
import moment from 'moment'
|
|
||||||
import * as echarts from 'echarts';
|
|
||||||
import { getTrendChangeDeviceList, getTrendChangeAnalysisList } from '@/api/NoHomologousAnalysis';
|
|
||||||
|
|
||||||
const userStore = useUserStore();
|
|
||||||
//获取表格数据
|
|
||||||
//表格所需参数
|
|
||||||
const date: any = ref([])
|
|
||||||
const total: any = ref(0)
|
|
||||||
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 dataloading = ref(false)
|
|
||||||
const queryInfo: any = ref({
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
size: 10,
|
|
||||||
current: 1,
|
|
||||||
deviceName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
})
|
|
||||||
const tableData: any = ref([])
|
|
||||||
function getData() {
|
|
||||||
let params: any = {
|
|
||||||
stationCode: queryInfo.value.stationCode,
|
|
||||||
deviceName: queryInfo.value.deviceName,
|
|
||||||
mainDeviceName: queryInfo.value.mainDeviceName,
|
|
||||||
componentName: queryInfo.value.componentName,
|
|
||||||
recognitionType: queryInfo.value.recognitionType,
|
|
||||||
size: queryInfo.value.size,
|
|
||||||
current: queryInfo.value.current
|
|
||||||
}
|
|
||||||
if (date.value) {
|
|
||||||
params.startDate = date.value[0]
|
|
||||||
params.endDate = date.value[1]
|
|
||||||
}
|
|
||||||
getTrendChangeDeviceList(params).then((res: any) => {
|
|
||||||
dataloading.value = false
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
date.value = []
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
queryInfo.value = {
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
size: 10,
|
|
||||||
current: 1,
|
|
||||||
deviceName: "",
|
|
||||||
mainDeviceName: "",
|
|
||||||
componentName: "",
|
|
||||||
recognitionType: "",
|
|
||||||
}
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
function returnClick(row: any) {
|
|
||||||
isMap.value = false
|
|
||||||
myChart = null
|
|
||||||
}
|
|
||||||
function viewClick(row: any) {
|
|
||||||
isMap.value = true
|
|
||||||
let params: any = {
|
|
||||||
deviceId: row.deviceId
|
|
||||||
}
|
|
||||||
if (date.value) {
|
|
||||||
params.startDate = date.value[0]
|
|
||||||
params.endDate = date.value[1]
|
|
||||||
}
|
|
||||||
getTrendChangeAnalysisList(params).then((res: any) => {
|
|
||||||
contrastInfo.value = {
|
|
||||||
deviceName: row.deviceName,
|
|
||||||
max: res.data.max,
|
|
||||||
min: res.data.min,
|
|
||||||
difference: res.data.difference,
|
|
||||||
}
|
|
||||||
option.value.xAxis.data = []
|
|
||||||
option.value.series[0].data = []
|
|
||||||
option.value.xAxis.data = res.data.date
|
|
||||||
option.value.series[0].data = res.data.deviceList
|
|
||||||
|
|
||||||
option.value.series[0].markLine.data[0].yAxis = Number(res.data.lowerValue)
|
|
||||||
option.value.series[0].markLine.data[1].yAxis = Number(res.data.upperValue)
|
|
||||||
|
|
||||||
option.value.visualMap.pieces[0].min = Number(res.data.lowerValue)
|
|
||||||
option.value.visualMap.pieces[0].max = Number(res.data.upperValue)
|
|
||||||
setTimeout(() => {
|
|
||||||
myChart = echarts.init(document.getElementById("myChartId") as HTMLDivElement);
|
|
||||||
myChart.setOption(option.value)
|
|
||||||
}, 50)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
let myChart: any = null
|
|
||||||
const option: any = ref({
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis'
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
top: '20',
|
|
||||||
left: '50',
|
|
||||||
right: '50',
|
|
||||||
bottom: '20',
|
|
||||||
containLabel: true
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category',
|
|
||||||
data: [],
|
|
||||||
axisLine: {
|
|
||||||
lineStyle: {
|
|
||||||
color: 'rgba(202,237,255,1)',
|
|
||||||
type: 'solid'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
axisLabel: {
|
|
||||||
fontSize: 16,
|
|
||||||
color: '#FFCC00'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
show: true,
|
|
||||||
type: 'value',
|
|
||||||
axisLine: {
|
|
||||||
show: true, //是否显示刻度线
|
|
||||||
lineStyle: {
|
|
||||||
color: 'rgba(202,237,255,1)',
|
|
||||||
type: 'solid',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
series: [
|
|
||||||
{
|
|
||||||
data: [],
|
|
||||||
type: 'line',
|
|
||||||
symbol: 'circle',
|
|
||||||
symbolSize: 10,
|
|
||||||
markLine: {
|
|
||||||
silent: true,
|
|
||||||
lineStyle: {
|
|
||||||
color: 'red'
|
|
||||||
},
|
|
||||||
data: [
|
|
||||||
|
|
||||||
{
|
|
||||||
yAxis: 0.15
|
|
||||||
},
|
|
||||||
{
|
|
||||||
yAxis: 0.35
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}],
|
|
||||||
visualMap:
|
|
||||||
{
|
|
||||||
type: 'piecewise',
|
|
||||||
show: false,
|
|
||||||
dimension: 1,
|
|
||||||
seriesIndex: 0,
|
|
||||||
pieces: [
|
|
||||||
{
|
|
||||||
// 不指定 min,表示 min 为无限大(-Infinity)。
|
|
||||||
min: 0.15, // 没有设置最小值,表明当前范围 [-Infinity, max] 变色
|
|
||||||
max: 0.35,
|
|
||||||
color: 'blue'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
outOfRange: { // 在选中范围外 的视觉元素,这里设置在正常范围内的图形颜色
|
|
||||||
color: 'red'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// visualMap: {
|
|
||||||
// top: 50,
|
|
||||||
// right: 10,
|
|
||||||
// pieces: [
|
|
||||||
// {
|
|
||||||
// gt: 0,
|
|
||||||
// lte: 50,
|
|
||||||
// color: '#93CE07'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// gt: 50,
|
|
||||||
// lte: 100,
|
|
||||||
// color: '#FBDB0F'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// gt: 100,
|
|
||||||
// lte: 150,
|
|
||||||
// color: '#FC7D02'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// gt: 150,
|
|
||||||
// lte: 200,
|
|
||||||
// color: '#FD0100'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// gt: 200,
|
|
||||||
// lte: 300,
|
|
||||||
// color: '#AA069F'
|
|
||||||
// },
|
|
||||||
// {
|
|
||||||
// gt: 300,
|
|
||||||
// color: '#AC3B2A'
|
|
||||||
// }
|
|
||||||
// ],
|
|
||||||
// outOfRange: {
|
|
||||||
// color: '#999'
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
})
|
|
||||||
onMounted(() => {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
date.value = [startDate, endDate]
|
|
||||||
getData()
|
|
||||||
|
|
||||||
window.onresize = function () { // 自适应大小
|
|
||||||
if (myChart != null) {
|
|
||||||
myChart.resize();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
})
|
|
||||||
const isMap = ref(false)
|
|
||||||
const contrastInfo: any = ref({})
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div style="padding: 60px 15px 10px;">
|
|
||||||
<div class="main">
|
|
||||||
<div style="height:45px;position: relative;display: flex;align-items: center; justify-content: space-between;"
|
|
||||||
v-if="isMap == false">
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<div style="margin-right:10px ;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.deviceName" placeholder="请输入点位名称" @clear="getData" @keyup.enter="getData" clearable
|
|
||||||
style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.mainDeviceName" placeholder="请输入主设备" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div style="margin-right:10px;" class="screenHomepage ">
|
|
||||||
<el-input v-model="queryInfo.componentName" placeholder="请输入部件" @clear="getData" @keyup.enter="getData"
|
|
||||||
clearable style="width: 170px;" />
|
|
||||||
</div>
|
|
||||||
<div class="screenHomepage">
|
|
||||||
<el-date-picker style="width: 300px;" v-model="date" type="daterange" range-separator="至"
|
|
||||||
start-placeholder="开始时间" popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
|
|
||||||
end-placeholder="结束时间" :clearable="false" @change="getData" />
|
|
||||||
</div>
|
|
||||||
<el-button class="searchButton" @click="getData">搜索</el-button>
|
|
||||||
<el-button class="searchButton" @click="resetting()">重置</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="rightNav" v-if="isMap == false">
|
|
||||||
<el-table :data="tableData" :row-class-name="tableRowClassName" class="PatrolMonitoring" v-loading="dataloading"
|
|
||||||
style="width: 100%;margin:auto;position: relative;height:calc(100% - 35px); overflow: auto "
|
|
||||||
:header-cell-style="{ background: '#253b51', color: '#B5D7FF', height: '43px' }">
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="80px" />
|
|
||||||
<el-table-column prop="deviceName" label="点位名称" />
|
|
||||||
<el-table-column prop="mainDeviceName" label="主设备名称" />
|
|
||||||
<el-table-column prop="componentName" label="部件名称" />
|
|
||||||
<el-table-column label="操作" width="200px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<div style="display: flex;justify-content: space-around;">
|
|
||||||
<div class="button-style" @click="viewClick(scope.row)">查看详情</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<div style="display: flex;justify-content: center;margin-top: 10px;">
|
|
||||||
<Page style="position: relative;z-index: 100;" :total="total" v-model:size="queryInfo.size" :jumper="'hide'"
|
|
||||||
v-model:current="queryInfo.current" @pagination="getData"></Page>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="rightNav" style="height:calc(100vh - 205px);padding-top: 0;margin-top:0;" v-else>
|
|
||||||
<div
|
|
||||||
style="display: flex;align-items: center;justify-content: space-between; flex-wrap: wrap;padding-bottom: 10px;">
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<div class="NoInPhaseAnalysis-title">分析结果</div>
|
|
||||||
</div>
|
|
||||||
<div class="button-style" @click="returnClick">返回</div>
|
|
||||||
</div>
|
|
||||||
<img src="@/assets/monitorsystem/xqfx_bj1.png" style="margin-bottom: 20px;" alt="">
|
|
||||||
<div>
|
|
||||||
<div style="display: flex;align-items: center;justify-content:space-between ;padding: 0 40px;">
|
|
||||||
<div style="font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
color: #FFFFFF;
|
|
||||||
font-size: 24px;">
|
|
||||||
{{ contrastInfo.deviceName }}
|
|
||||||
</div>
|
|
||||||
<div style="font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;">
|
|
||||||
<span>最大值:</span>
|
|
||||||
<span style="font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 28px;
|
|
||||||
color: #FF3300;">{{ contrastInfo.max }}</span>
|
|
||||||
<span style="padding-left: 40px;">最小值:</span>
|
|
||||||
<span style="font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 28px;
|
|
||||||
color: #00F9A2;">{{ contrastInfo.min }}</span>
|
|
||||||
<span style="padding-left: 40px;">差值:</span>
|
|
||||||
<span style="font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 28px;">{{ contrastInfo.difference }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="myChartId" style="width: 100%;height:calc(100% - 85px);"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.main {
|
|
||||||
width: 100%;
|
|
||||||
background: url(@/assets/\monitorsystem/xqfx_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
.searchButton {
|
|
||||||
border: #009bff solid 1px;
|
|
||||||
background-color: #009bff;
|
|
||||||
color: #fff;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
.rightNav {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 260px);
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__body-wrapper) {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table) {
|
|
||||||
--el-table-row-hover-bg-color: transparent !important;
|
|
||||||
--el-table-border-color: transparent !important;
|
|
||||||
--el-table-bg-color: transparent !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__empty-text) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper) {
|
|
||||||
background-color: transparent !important;
|
|
||||||
box-shadow: (0 0 0 1px #225b7e) inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__inner) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-select-dropdown__wrap) {
|
|
||||||
background-color: #17212e !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-date-editor .el-range-input) {
|
|
||||||
color: #fff !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.NoInPhaseAnalysis-title {
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,926 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "dataanalysis", // 数据对比分析
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { ref, onMounted, nextTick } from "vue";
|
|
||||||
import { getSubstationMainDeviceTree, getDeviceByMainDevice, getAnalysisCurve, getTaskResultList, exportTaskResultList, previewTaskResultList } from "@/api/dataanalysis/index";
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import { Search } from '@element-plus/icons-vue'
|
|
||||||
import * as echarts from 'echarts';
|
|
||||||
import moment from 'moment'
|
|
||||||
import { downloadFile } from '@/utils/index';
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import Viewfile from '@/components/Viewfile/index.vue'
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
const userStore = useUserStore();
|
|
||||||
function getData() {
|
|
||||||
getInit()
|
|
||||||
}
|
|
||||||
const mainDeviceName = ref("")
|
|
||||||
const treeData: any = ref([])
|
|
||||||
function getInit() {
|
|
||||||
const params = {
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
mainDeviceName: mainDeviceName.value
|
|
||||||
}
|
|
||||||
getSubstationMainDeviceTree(params).then((res: any) => {
|
|
||||||
treeData.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function resetting() {
|
|
||||||
queryInfo.value.meterType = MeterType.value
|
|
||||||
queryInfo.value.recognitionType = recognitionType.value
|
|
||||||
queryInfo.value.current = 1
|
|
||||||
queryInfo.value.size = 10
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value = [startDate, endDate]
|
|
||||||
getByMainDevice()
|
|
||||||
}
|
|
||||||
const dateArr: any = ref([])
|
|
||||||
const queryInfo: any = ref({
|
|
||||||
meterType: "",
|
|
||||||
recognitionType: "",
|
|
||||||
current: 1, // 当前页
|
|
||||||
size: 10, // 页大小
|
|
||||||
})
|
|
||||||
function getByMainDevice() { // 获取巡视点位
|
|
||||||
tableData.value = []
|
|
||||||
const params = {
|
|
||||||
mainDeviceId: mainDeviceId.value.join(','),
|
|
||||||
meterType: queryInfo.value.meterType,
|
|
||||||
recognitionType: queryInfo.value.recognitionType,
|
|
||||||
startDate: "",
|
|
||||||
endDate: ""
|
|
||||||
}
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
params.startDate = dateArr.value[0]
|
|
||||||
params.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
if (mainDeviceId.value.length == 0) {
|
|
||||||
deviceId.value = []
|
|
||||||
pointList.value = []
|
|
||||||
myChart.clear()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
getDeviceByMainDevice(params).then((res: any) => {
|
|
||||||
paramChart.value.xAxis.data = []
|
|
||||||
paramChart.value.series = []
|
|
||||||
paramChart.value.legend.data = []
|
|
||||||
if (res != undefined && res.code == '0') {
|
|
||||||
let deviceIds: any = []
|
|
||||||
for (let i = 0; i < deviceId.value.length; i++) {
|
|
||||||
for (let j = 0; j < res.data.length; j++) {
|
|
||||||
if (deviceId.value[i] == res.data[j].deviceId) {
|
|
||||||
deviceIds.push(deviceId.value[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deviceId.value = deviceIds
|
|
||||||
if (deviceId.value.length != 0) {
|
|
||||||
Eacherstable(deviceId.value)
|
|
||||||
getResultData()
|
|
||||||
} else {
|
|
||||||
myChart.clear()
|
|
||||||
}
|
|
||||||
pointList.value = res.data
|
|
||||||
} else {
|
|
||||||
deviceId.value = []
|
|
||||||
pointList.value = []
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
interface Tree {
|
|
||||||
id: string
|
|
||||||
label: string
|
|
||||||
children?: Tree[]
|
|
||||||
}
|
|
||||||
const defaultprops = {
|
|
||||||
label: "mainDeviceName",
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentNodeKey = ref("")
|
|
||||||
const MeterTypeList: any = ref([]) // 表计类型
|
|
||||||
const recognitionType: any = ref("") // 表计类型
|
|
||||||
const MeterType: any = ref("") // 识别类型
|
|
||||||
const recognitionTypeList: any = ref([]) // 识别类型
|
|
||||||
function getDict() {
|
|
||||||
const paramstype = {
|
|
||||||
dictcode: 'recognition_type'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstype).then((res: any) => {
|
|
||||||
recognitionTypeList.value = []
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
if (res.data[i].custom1 == '数值分析') {
|
|
||||||
recognitionTypeList.value.push(res.data[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (recognitionTypeList.value[0].itemcode != undefined) {
|
|
||||||
queryInfo.value.recognitionType = recognitionTypeList.value[0].itemcode
|
|
||||||
recognitionType.value = recognitionTypeList.value[0].itemcode
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
|
||||||
const paramstypes = {
|
|
||||||
dictcode: 'MeterType'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstypes).then((res: any) => {
|
|
||||||
MeterTypeList.value = res.data
|
|
||||||
queryInfo.value.meterType = res.data[0].itemcode
|
|
||||||
MeterType.value = MeterTypeList.value[0].itemcode
|
|
||||||
})
|
|
||||||
getDeviceByType({ dictcode: 'exportFields' }).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.length; i++)
|
|
||||||
checkList.value.push(res.data[i].itemcode + '-' + res.data[i].dictname)
|
|
||||||
keyData.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
function handleNodeClick(data: Tree, node: any) {
|
|
||||||
}
|
|
||||||
const handleCheckChange = (
|
|
||||||
data: Tree,
|
|
||||||
checked: boolean,
|
|
||||||
indeterminate: boolean
|
|
||||||
) => {
|
|
||||||
}
|
|
||||||
|
|
||||||
const mainDeviceId: any = ref([])
|
|
||||||
function currentChecked(nodeObj: any, SelectedObj: any) {
|
|
||||||
mainDeviceId.value = []
|
|
||||||
let ids = SelectedObj.checkedKeys.concat(SelectedObj.halfCheckedKeys) as any[]
|
|
||||||
for (let i = 0; i < ids.length; i++) {
|
|
||||||
if (ids[i] != undefined) {
|
|
||||||
mainDeviceId.value.push(ids[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getByMainDevice()
|
|
||||||
}
|
|
||||||
const checkAll = ref(false)
|
|
||||||
const isIndeterminate = ref(false)
|
|
||||||
const pointList: any = ref([])
|
|
||||||
const handleCheckAllChange = (val: boolean) => {
|
|
||||||
deviceId.value = val ? pointList : []
|
|
||||||
isIndeterminate.value = false
|
|
||||||
}
|
|
||||||
let myChart: any = null
|
|
||||||
|
|
||||||
let paramChart: any = ref({
|
|
||||||
legend: {
|
|
||||||
data: [],
|
|
||||||
textStyle: {
|
|
||||||
color: "#fff"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
left: '2%',
|
|
||||||
right: '2%',
|
|
||||||
bottom: '10%',
|
|
||||||
containLabel: false,
|
|
||||||
},
|
|
||||||
tooltip: {
|
|
||||||
trigger: 'axis',
|
|
||||||
axisPointer: {
|
|
||||||
type: 'cross',
|
|
||||||
crossStyle: {
|
|
||||||
color: '#ffffff',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
toolbox: {
|
|
||||||
feature: {
|
|
||||||
// saveAsImage: {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
xAxis: {
|
|
||||||
type: 'category',
|
|
||||||
boundaryGap: false,
|
|
||||||
axisLabel: {//y轴文字的配置
|
|
||||||
textStyle: {
|
|
||||||
color: "#ffffff",//Y轴内容文字颜色
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data: []
|
|
||||||
},
|
|
||||||
yAxis: {
|
|
||||||
type: 'value',
|
|
||||||
axisLabel: {//y轴文字的配置
|
|
||||||
textStyle: {
|
|
||||||
color: "#ffffff",//Y轴内容文字颜色
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
series: [],
|
|
||||||
})
|
|
||||||
function dateChang() {
|
|
||||||
getByMainDevice()
|
|
||||||
}
|
|
||||||
const deviceId: any = ref([])
|
|
||||||
const handlecheckedPointChange = (value: any) => {
|
|
||||||
deviceId.value = value
|
|
||||||
|
|
||||||
Eacherstable(value)
|
|
||||||
getResultData()
|
|
||||||
// const checkedCount = value.length
|
|
||||||
// checkAll.value = checkedCount === pointList.length
|
|
||||||
// isIndeterminate.value = checkedCount > 0 && checkedCount < pointList.length
|
|
||||||
}
|
|
||||||
function Eacherstable(deviceId: any) {
|
|
||||||
paramChart.value.xAxis.data = []
|
|
||||||
paramChart.value.series = []
|
|
||||||
paramChart.value.legend.data = []
|
|
||||||
if (deviceId.length == 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const params = {
|
|
||||||
deviceId: deviceId.join(","),
|
|
||||||
startDate: "",
|
|
||||||
endDate: ""
|
|
||||||
}
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
params.startDate = dateArr.value[0]
|
|
||||||
params.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
getAnalysisCurve(params).then((res: any) => {
|
|
||||||
myChart.clear()
|
|
||||||
paramChart.value.xAxis.data = []
|
|
||||||
paramChart.value.series = []
|
|
||||||
paramChart.value.legend.data = []
|
|
||||||
paramChart.value.xAxis.data = res.data.date
|
|
||||||
for (let i = 0; i < res.data.device.length; i++) {
|
|
||||||
|
|
||||||
paramChart.value.legend.data.push(res.data.device[i].name)
|
|
||||||
paramChart.value.series.push({
|
|
||||||
name: res.data.device[i].name,
|
|
||||||
type: 'line',
|
|
||||||
data: res.data.device[i].values
|
|
||||||
})
|
|
||||||
}
|
|
||||||
myChart.setOption(paramChart.value);
|
|
||||||
})
|
|
||||||
// 绘制图表
|
|
||||||
}
|
|
||||||
const navActive = ref(0)
|
|
||||||
function navClick(index: any) {
|
|
||||||
navActive.value = index
|
|
||||||
|
|
||||||
if (navActive.value == 0) {
|
|
||||||
setTimeout(() => {
|
|
||||||
myChart.resize();
|
|
||||||
}, 100)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
const dataloading = ref(false)
|
|
||||||
const tableData: any = ref([])
|
|
||||||
const total = ref()
|
|
||||||
function getResultData() { // 数据对比分析列表
|
|
||||||
queryInfo.value.startDate = ""
|
|
||||||
queryInfo.value.endDate = ""
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
const params = {
|
|
||||||
deviceId: deviceId.value.join(","),
|
|
||||||
startDate: queryInfo.value.startDate,
|
|
||||||
endDate: queryInfo.value.endDate,
|
|
||||||
current: queryInfo.value.current,
|
|
||||||
size: queryInfo.value.size,
|
|
||||||
}
|
|
||||||
tableData.value = []
|
|
||||||
if (deviceId.value.length == 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
dataloading.value = true
|
|
||||||
getTaskResultList(params).then((res: any) => {
|
|
||||||
dataloading.value = false
|
|
||||||
for (let i = 0; i < res.data.records.length; i++) {
|
|
||||||
if (res.data.records[i].smallFilePath != null) {
|
|
||||||
res.data.records[i].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
res.data.records[i].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)]
|
|
||||||
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
} else {
|
|
||||||
res.data.records[i].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data.records[i].filePath)
|
|
||||||
res.data.records[i].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data.records[i].filePath)]
|
|
||||||
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data.records[i].filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
}).catch(() => {
|
|
||||||
dataloading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//控制行变色
|
|
||||||
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 isImgBox = ref(false)
|
|
||||||
const ImgPath = ref("")
|
|
||||||
function imgClick(row: any) {
|
|
||||||
ImgPath.value = row
|
|
||||||
isImgBox.value = true
|
|
||||||
}
|
|
||||||
const ViewfileUrl = ref("")
|
|
||||||
const isViewfile = ref(false)
|
|
||||||
const previewTaskData = ref([])
|
|
||||||
function viewReport() {
|
|
||||||
|
|
||||||
isViewfile.value = true
|
|
||||||
if (dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = {
|
|
||||||
deviceId: deviceId.value.join(","),
|
|
||||||
startDate: queryInfo.value.startDate,
|
|
||||||
endDate: queryInfo.value.endDate
|
|
||||||
}
|
|
||||||
previewTaskResultList(params).then((res: any) => {
|
|
||||||
|
|
||||||
previewTaskData.value = res.data
|
|
||||||
for (let i = 0; i < res.data.length; i++) {
|
|
||||||
if (res.data[i].smallFilePath != null) {
|
|
||||||
res.data[i].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].defectFilePath)
|
|
||||||
res.data[i].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].defectFilePath)]
|
|
||||||
|
|
||||||
res.data[i].defectFilePath = userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].defectFilePath)
|
|
||||||
} else {
|
|
||||||
res.data[i].smallFilePath = userStore.webApiBaseUrl + "/previewimage?size=small&filename=" + encodeURI(res.data[i].filePath)
|
|
||||||
res.data[i].srcList = [userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].filePath)]
|
|
||||||
|
|
||||||
res.data[i].defectFilePath = userStore.webApiBaseUrl + "/previewimage?filename=" + encodeURI(res.data[i].filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}).catch(() => {
|
|
||||||
});
|
|
||||||
if (dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
ViewfileUrl.value = userStore.webApiBaseUrl +
|
|
||||||
|
|
||||||
'/patroltasks/task-todo/exportTaskResultList?deviceId=' + deviceId.value.join(",")
|
|
||||||
+ '&startDate=' + queryInfo.value.startDate
|
|
||||||
+ '&endDate=' + queryInfo.value.endDate
|
|
||||||
+ '¤t=' + queryInfo.value.current
|
|
||||||
+ '&size=9999'
|
|
||||||
|
|
||||||
}
|
|
||||||
function CloseView() {
|
|
||||||
isViewfile.value = false
|
|
||||||
}
|
|
||||||
// 导出
|
|
||||||
function leadingOut() {
|
|
||||||
if (dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = {
|
|
||||||
deviceId: deviceId.value.join(","),
|
|
||||||
startDate: queryInfo.value.startDate,
|
|
||||||
endDate: queryInfo.value.endDate,
|
|
||||||
current: queryInfo.value.current,
|
|
||||||
size: queryInfo.value.size,
|
|
||||||
exportFields: checkList.value.join(",")
|
|
||||||
}
|
|
||||||
exportTaskResultList(params).then((response: any) => {
|
|
||||||
downloadFile(response, '警告信息', 'xlsx')
|
|
||||||
}).catch(() => {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function handleClose() {
|
|
||||||
isViewfile.value = false
|
|
||||||
}
|
|
||||||
onMounted(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
const oBox = document.getElementById('telescopicids')
|
|
||||||
const leftid: any = document.getElementById('richleft')
|
|
||||||
const rightid: any = document.getElementById('richright')
|
|
||||||
|
|
||||||
const idbox: any = document.getElementById('richboxid')
|
|
||||||
let X: any, oBoxW: any, oBoxW1: any
|
|
||||||
if (oBox) {
|
|
||||||
oBox.onmousedown = (ev) => {
|
|
||||||
var elem = document.createElement('div')
|
|
||||||
elem.style.cssText = 'position:absolute;top: 0;width:100%;height:100%;z-index:9999;cursor:w-resize'
|
|
||||||
elem.id = 'newMask'
|
|
||||||
document.body.appendChild(elem)
|
|
||||||
var oEvent = ev || event
|
|
||||||
X = oEvent.clientX
|
|
||||||
oBoxW = leftid.offsetWidth
|
|
||||||
oBoxW1 = rightid.offsetWidth
|
|
||||||
// // 鼠标移动
|
|
||||||
document.onmousemove = (ev) => {
|
|
||||||
var oEvent = ev || event
|
|
||||||
var XX = oEvent.clientX
|
|
||||||
leftid.style.width = 100 / ((idbox.offsetWidth - 20) / (oBoxW + (XX - X))) + '%'
|
|
||||||
rightid.style.width = 100 / ((idbox.offsetWidth - 20) / (oBoxW1 + (X - XX))) + '%'
|
|
||||||
myChart.resize();
|
|
||||||
}
|
|
||||||
// 鼠标移开
|
|
||||||
document.onmouseup = (ev) => {
|
|
||||||
var newMask: any = document.getElementById('newMask')
|
|
||||||
if (newMask) {
|
|
||||||
newMask.parentNode.removeChild(newMask)
|
|
||||||
}
|
|
||||||
document.onmousedown = null
|
|
||||||
document.onmousemove = null
|
|
||||||
// basicsId.style.cursor = ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 100)
|
|
||||||
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value = [startDate, endDate]
|
|
||||||
getDict()
|
|
||||||
getInit()
|
|
||||||
|
|
||||||
myChart = echarts.init(document.getElementById("myChartId") as HTMLDivElement);
|
|
||||||
window.onresize = function () { // 自适应大小
|
|
||||||
myChart.resize();
|
|
||||||
};
|
|
||||||
|
|
||||||
})
|
|
||||||
const keyData: any = ref([])
|
|
||||||
const checkList: any = ref([])
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<div class="el-overlay" v-if="isImgBox">
|
|
||||||
<div class="notification">
|
|
||||||
<img style="position:absolute;top: 15px;right: 20px;cursor:pointer;" src="@/assets/MenuIcon/u523.png" alt=""
|
|
||||||
@click="isImgBox = false">
|
|
||||||
<div class="notification-title">图片预览</div>
|
|
||||||
<div style="
|
|
||||||
width: 100%;
|
|
||||||
height: 860px;display: flex;align-items: center;justify-content: center;">
|
|
||||||
<img :src="ImgPath" alt="" style="max-width:1150px ;max-height: 800px;">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="richboxid" class="dataanalysis-box">
|
|
||||||
<div id="richleft" class="dataanalysis-left">
|
|
||||||
<div class="stationboard-box-title">
|
|
||||||
<div>设备列表</div>
|
|
||||||
</div>
|
|
||||||
<el-input v-model="mainDeviceName" :suffix-icon="Search" clearable placeholder="主设备名称" @clear="getData()"
|
|
||||||
@keyup.enter="getData()" style="margin-left:13px;width: 100%;margin-top:10px;" class="dataanalysis-input" />
|
|
||||||
|
|
||||||
<el-scrollbar style="margin-left:20px ;margin-top:10px ;" height="100%">
|
|
||||||
<el-tree :data="treeData" :props="defaultprops" show-checkbox default-expand-all
|
|
||||||
@check-change="handleCheckChange" @check="currentChecked" :current-node-key="currentNodeKey"
|
|
||||||
node-key="mainDeviceId">
|
|
||||||
<template #default="{ node }">
|
|
||||||
<span>{{ node.data.name }}</span>
|
|
||||||
<span>{{ node.label }}</span>
|
|
||||||
</template>
|
|
||||||
</el-tree>
|
|
||||||
</el-scrollbar>
|
|
||||||
</div>
|
|
||||||
<div id="telescopicids" class="telescopicidsbgcolor"
|
|
||||||
style="margin-left: 8px; width: 4px;height: 100%; cursor:w-resize; z-index:99"></div>
|
|
||||||
<div id="richright" class="dataanalysis-right">
|
|
||||||
<div style="height:37px;position: relative;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;" class="screenHomepage">
|
|
||||||
<el-select class="mr-2 selType" v-model="queryInfo.recognitionType"
|
|
||||||
placeholder="识别类型" @change="getByMainDevice" :teleported="false" :popper-append-to-body="false">
|
|
||||||
<el-option v-for="item in recognitionTypeList" :key="item.id" :label="item.dictname"
|
|
||||||
:value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-select class="mr-2 selType" v-model="queryInfo.meterType" placeholder="表计类型"
|
|
||||||
@change="getByMainDevice" :teleported="false" :popper-append-to-body="false">
|
|
||||||
<el-option v-for="item in MeterTypeList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-date-picker v-model="dateArr" type="daterange" range-separator="至" start-placeholder="开始时间"
|
|
||||||
popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD" end-placeholder="结束时间"
|
|
||||||
style="max-width: 370px;" @change="dateChang" :clearable="false" />
|
|
||||||
<el-button class="searchButton" @click="getByMainDevice">搜索</el-button>
|
|
||||||
<el-button class="searchButton" @click="resetting">重置</el-button>
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<el-button class="searchButton" @click="viewReport" :disabled="deviceId.length == 0">查看报告</el-button>
|
|
||||||
<div>
|
|
||||||
<el-popover placement="bottom" :width="60" trigger="click" popper-class="checkbox-group">
|
|
||||||
<template #reference>
|
|
||||||
<el-button :disabled="tableData.length == 0" class="searchButton">导出</el-button>
|
|
||||||
</template>
|
|
||||||
<el-checkbox-group v-model="checkList">
|
|
||||||
<el-checkbox v-for="city in keyData" :key="city.itemcode + '-' + city.dictname"
|
|
||||||
:label="city.itemcode + '-' + city.dictname">{{ city.dictname }}</el-checkbox>
|
|
||||||
</el-checkbox-group>
|
|
||||||
<el-button @click="leadingOut" style="margin-left: 20px;margin-top: 10px;">确定导出</el-button>
|
|
||||||
</el-popover>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dataanalysis-top">
|
|
||||||
<div class="stationboard-box-title">
|
|
||||||
<div>巡视点位</div>
|
|
||||||
</div>
|
|
||||||
<div style="padding: 0 20px;">
|
|
||||||
<el-checkbox-group v-model="deviceId" :max="10" @change="handlecheckedPointChange">
|
|
||||||
<el-checkbox v-for="city in pointList" :key="city.deviceId" :label="city.deviceId">{{ city.deviceName
|
|
||||||
}}</el-checkbox>
|
|
||||||
</el-checkbox-group>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dataanalysis-bottom">
|
|
||||||
<div class="stationboard-box-title !h-[50px]" style="justify-content: space-between;flex-wrap: wrap;">
|
|
||||||
<div style="display: flex;align-items: center;margin-top: 4px;">
|
|
||||||
<div>分析结果</div>
|
|
||||||
</div>
|
|
||||||
<div style="display: flex;margin-right: 20px;">
|
|
||||||
<div class="nav-list" :class="{ 'nav-active': navActive == 0 }" @click="navClick(0)">分析曲线</div>
|
|
||||||
<div class="nav-list" :class="{ 'nav-active': navActive == 1 }" @click="navClick(1)">分析列表</div>
|
|
||||||
</div>
|
|
||||||
<div class="w-full">
|
|
||||||
<img src="@/assets/monitorsystem/xsfx_bj2.png" alt="" style="width: 100%;" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="padding: 0 15px;height:calc(100% - 61px);">
|
|
||||||
<div v-show="navActive == 0" id="myChartId" style="width: 100%;height:calc(100%);"></div>
|
|
||||||
<el-table v-if="navActive == 1" row-key="id" :data="tableData" :row-class-name="tableRowClassName"
|
|
||||||
class="PatrolMonitoring" v-loading="dataloading" element-loading-background="rgb(11, 40, 34)"
|
|
||||||
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(100% - 40px); overflow: auto "
|
|
||||||
:header-cell-style="{ background: '#253b51', color: '#B5D7FF', height: '43px' }">
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="60px" />
|
|
||||||
<el-table-column prop="areaName" label="区域名称" min-width="120px" />
|
|
||||||
<el-table-column prop="bayName" label="间隔名称" min-width="120px" />
|
|
||||||
<el-table-column prop="patroldeviceName" label="设备名称" min-width="120px" />
|
|
||||||
<el-table-column prop="componentName" label="部件名称" min-width="120px" />
|
|
||||||
<el-table-column prop="deviceName" label="巡视点位" min-width="120px" />
|
|
||||||
<el-table-column prop="time" label="巡视时间" width="170px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.time != undefined && scope.row.time != ''">{{ scope.row.time }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="value" label="巡视结果" width="120px">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.valueType == 'meter' || scope.row.valueType == 'infrared'">
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'" style="color: red;font-size: 16px;font-weight: bold;">
|
|
||||||
{{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
<span v-else> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="scope.row.conf != null && scope.row.conf != ''">{{ scope.row.conf }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column prop="desc" label="识别类型" width="140px">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.desc != null && scope.row.desc != ''">{{ scope.row.desc }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="analysisResult" label="巡视结论" width="100px">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.analysisResult == '正常'" style="color: rgb(0, 155, 255, 1)">正常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'"
|
|
||||||
style="color: rgb(255, 51, 0);color: red;font-size: 16px;font-weight: bold;">异常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '设备检修'" style="color: rgb(0, 153, 255)">设备检修</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '失败'" style="color: rgb(255, 189, 0)">失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '截图失败'" style="color: rgb(255, 189, 0)">截图失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '成功'" style="color: rgb(0, 155, 255, 1)">成功</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '' || scope.row.analysisResult == null">--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column prop="defectFilePath" label="巡视图片" width="90px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-image v-if="scope.row.filePath" style="width: 30px; height: 30px;margin:auto"
|
|
||||||
:src="scope.row.smallFilePath" :zoom-rate="1.2" :preview-src-list="scope.row.srcList"
|
|
||||||
:preview-teleported="true" fit="cover" />
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<div style="display: flex;justify-content: center;">
|
|
||||||
<Page v-if="navActive == 1" style="position: relative;z-index: 100;" :total="total"
|
|
||||||
v-model:size="queryInfo.size" :jumper="'hide'" v-model:current="queryInfo.current"
|
|
||||||
@pagination="getResultData()"></Page>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-dialog width="1200px" class="viewItemFileDialog" :title="'数据对比分析报告'" v-model='isViewfile'
|
|
||||||
:before-close="handleClose" :close-on-click-modal="false" :close-on-press-escape="false" draggable>
|
|
||||||
<el-table :data="previewTaskData" class="previewTaskTable" border v-loading="dataloading"
|
|
||||||
element-loading-background="rgb(11, 40, 34)"
|
|
||||||
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(100vh - 140px); overflow: auto "
|
|
||||||
:header-cell-style="{ height: '35px' }">
|
|
||||||
<el-table-column prop="areaName" label="区域名称" min-width="100px" align="center" />
|
|
||||||
<el-table-column prop="bayName" label="间隔名称" min-width="100px" align="center" />
|
|
||||||
<el-table-column prop="patroldeviceName" label="设备名称" min-width="120px" align="center" />
|
|
||||||
<el-table-column prop="componentName" label="部件名称" min-width="100px" align="center" />
|
|
||||||
<el-table-column prop="deviceName" label="巡视点位" min-width="120px" align="center" />
|
|
||||||
<!-- <el-table-column prop="deviceName" label="巡视结果" min-width="120px" align="center"/>
|
|
||||||
<el-table-column prop="deviceName" label="识别类型" min-width="120px" align="center"/>
|
|
||||||
<el-table-column prop="deviceName" label="巡视结论" min-width="120px" align="center"/>
|
|
||||||
<el-table-column prop="deviceName" label="巡视时间" min-width="120px" align="center"/>
|
|
||||||
<el-table-column prop="deviceName" label="巡视图片" min-width="100px" align="center"/>
|
|
||||||
-->
|
|
||||||
<el-table-column prop="value" label="巡视结果" min-width="120px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.valueType == 'meter' || scope.row.valueType == 'infrared'">
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'"> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
<span v-else> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="scope.row.conf != null && scope.row.conf != ''">{{ scope.row.conf }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column prop="desc" label="识别类型" min-width="120px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.desc != null && scope.row.desc != ''">{{ scope.row.desc }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="analysisResult" label="巡视结论" min-width="100px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.analysisResult == '正常'">正常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'">异常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '设备检修'">设备检修</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '失败'">失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '截图失败'">截图失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '成功'">成功</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '' || scope.row.analysisResult == null">--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="time" label="巡视时间" min-width="90px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.time != undefined && scope.row.time != ''">{{ scope.row.time }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
|
|
||||||
<el-table-column prop="defectFilePath" label="巡视图片" min-width="120px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-image v-if="scope.row.filePath" style="width: 30px; height: 30px;margin:auto"
|
|
||||||
:src="scope.row.smallFilePath" :zoom-rate="1.2" :preview-src-list="scope.row.srcList"
|
|
||||||
:preview-teleported="true" fit="cover" />
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
</el-table>
|
|
||||||
</el-dialog>
|
|
||||||
|
|
||||||
<!-- <Viewfile v-if="isViewfile" :title="'数据对比分析报告'" :showTime="true" :url="ViewfileUrl" :type="'xlsx'" :clientHeight="600" @update="CloseView"/> -->
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.dataanalysis-box {
|
|
||||||
padding: 60px 15px 0;
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: calc(100vh - 100px);
|
|
||||||
|
|
||||||
.telescopicidsbgcolor {
|
|
||||||
background: #009BFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
.telescopicidsbgcolor:hover {
|
|
||||||
background: #4bb7ff !important;
|
|
||||||
}
|
|
||||||
.searchButton {
|
|
||||||
border: #009BFF solid 1px;
|
|
||||||
background-color: #009BFF;
|
|
||||||
color: #ffffff;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper) {
|
|
||||||
background: transparent;
|
|
||||||
box-shadow: 0 0 0 1px #225b7e inset;
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper:hover) {
|
|
||||||
box-shadow: 0 0 0 1px #225b7e inset;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-input__wrapper .el-input__icon) {
|
|
||||||
color: #225b7e;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tree-node__content) {
|
|
||||||
font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dataanalysis-left {
|
|
||||||
width: 261px;
|
|
||||||
min-width: 261px;
|
|
||||||
height: 100%;
|
|
||||||
background: url(@/assets/monitorsystem/spjk_lbbj.png) no-repeat center center;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
padding-right: 30px;
|
|
||||||
|
|
||||||
:deep(.is-checked >.el-tree-node__content) {
|
|
||||||
background-color: transparent !important;
|
|
||||||
color: #009BFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tree-node.is-current .el-tree-node__content:hover) {
|
|
||||||
background-color: transparent !important;
|
|
||||||
color: #009BFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tree-node__content:hover) {
|
|
||||||
color: #009BFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-scrollbar) {
|
|
||||||
height: calc(100% - 106px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tree {
|
|
||||||
background: transparent;
|
|
||||||
color: #ffffff;
|
|
||||||
--el-tree-node-hover-bg-color: transparent;
|
|
||||||
--el-tree-text-color: rgb(0, 155, 255, 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dataanalysis-right {
|
|
||||||
width: calc(100vw - 261px);
|
|
||||||
height: 100%;
|
|
||||||
margin-left: 8px
|
|
||||||
}
|
|
||||||
|
|
||||||
.stationboard-box-title {
|
|
||||||
font-family: '阿里妈妈数黑体 Bold', '阿里妈妈数黑体';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #ffffff;
|
|
||||||
height: 44px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
padding-left: 20px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dataanalysis-top {
|
|
||||||
width: 100%;
|
|
||||||
height: 140px;
|
|
||||||
background: url(@/assets/monitorsystem/xsfx_bj1.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dataanalysis-bottom {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 197px);
|
|
||||||
background: url(@/assets/monitorsystem/xsfx_bj.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
:deep(.el-table) {
|
|
||||||
background: transparent !important;
|
|
||||||
--el-table-row-hover-bg-color: transparent !important;
|
|
||||||
--el-table-border-color: transparent !important;
|
|
||||||
--el-table-current-row-bg-color: transparent !important;
|
|
||||||
--el-table-header-bg-color: transparent !important;
|
|
||||||
--el-table-fixed-box-shadow: transparent !important;
|
|
||||||
--el-table-bg-color: transparent !important;
|
|
||||||
--el-table-tr-bg-color: transparent !important;
|
|
||||||
--el-table-expanded-cell-bg-color: transparent !important;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.success-row) {
|
|
||||||
background-color: rgba(255, 255, 255, 0.047) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.nav-list {
|
|
||||||
width: 80px;
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
text-align: center;
|
|
||||||
background: url(@/assets/monitorsystem/xsri_qh.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: rgba(255, 255, 255, 1);
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-active {
|
|
||||||
background: url(@/assets/monitorsystem/xsri_qh1.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-overlay {
|
|
||||||
position: fixed;
|
|
||||||
z-index: 2023;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 2000;
|
|
||||||
height: 100%;
|
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
width: 1200px;
|
|
||||||
height: 900px;
|
|
||||||
position: absolute;
|
|
||||||
top: 20px;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
margin: auto;
|
|
||||||
background: url(@/assets/monitorsystem/xsri_yltu.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
.notification-title {
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 38px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.previewTaskTable {
|
|
||||||
:deep(.el-table__cell) {
|
|
||||||
padding: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.cell) {
|
|
||||||
padding: 0 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,535 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "abnormaldevice", // 异常点位查询
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import { ref, onMounted, nextTick } from "vue";
|
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
|
||||||
import { getAbnormalDeviceList,exportAbnormalDevice } from "@/api/abnormaldevice";
|
|
||||||
import { getSubstationNaviTree } from "@/api/makeTask";
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import { downloadFile } from '@/utils/index';
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
|
||||||
import { getTreeData } from "@/api/equipment";
|
|
||||||
import moment from 'moment'
|
|
||||||
const userStore = useUserStore();
|
|
||||||
//左侧树形控件
|
|
||||||
interface Tree {
|
|
||||||
[x: string]: any;
|
|
||||||
label: string;
|
|
||||||
children?: Tree[];
|
|
||||||
}
|
|
||||||
const defaultProps = {
|
|
||||||
children: "children",
|
|
||||||
label: "name"
|
|
||||||
};
|
|
||||||
// 查询参数
|
|
||||||
const queryInfo:any = ref({
|
|
||||||
|
|
||||||
current: 1, // 当前页
|
|
||||||
size:10, // 页大小
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: '', // 任务名称
|
|
||||||
deviceName: '', // 点位
|
|
||||||
patroldeviceName: '', // 设备
|
|
||||||
componentName: '', // 部件名称
|
|
||||||
recognitionType: '', // 识别类型
|
|
||||||
status: '', // 巡视结论
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
})
|
|
||||||
//获取表格数据
|
|
||||||
//表格所需参数
|
|
||||||
const dateArr: any = ref([])
|
|
||||||
const total = ref(0)
|
|
||||||
const treeloading = ref(false)
|
|
||||||
//表格数据
|
|
||||||
const tableData: any = ref([])
|
|
||||||
const vMove = {
|
|
||||||
mounted(el: any) {
|
|
||||||
el.onmousedown = function (e: any) {
|
|
||||||
var init = e.clientX;
|
|
||||||
var parent: any = document.getElementById("IntelligentlinkageLeft");
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function getData() {
|
|
||||||
queryInfo.value.startDate = ""
|
|
||||||
queryInfo.value.endDate = ""
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
tableloading.value = true
|
|
||||||
getAbnormalDeviceList(queryInfo.value).then((res: any) => {
|
|
||||||
tableloading.value = false
|
|
||||||
for(let i = 0 ;i<res.data.records.length;i++){
|
|
||||||
if(res.data.records[i].smallFilePath != null){
|
|
||||||
res.data.records[i].smallFilePath = userStore.webApiBaseUrl +"/previewimage?size=small&filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
res.data.records[i].srcList = [userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)]
|
|
||||||
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
}else{
|
|
||||||
res.data.records[i].smallFilePath = userStore.webApiBaseUrl +"/previewimage?size=small&filename=" + encodeURI(res.data.records[i].filePath)
|
|
||||||
res.data.records[i].srcList = [userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].filePath)]
|
|
||||||
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
queryInfo.value.size = res.data.size
|
|
||||||
queryInfo.value.current = res.data.current
|
|
||||||
}).catch(()=>{
|
|
||||||
tableloading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
queryInfo.value = {
|
|
||||||
current: 1, // 当前页
|
|
||||||
size:10, // 页大小
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskName: '', // 任务名称
|
|
||||||
deviceName: '', // 点位
|
|
||||||
patroldeviceName: '', // 设备
|
|
||||||
componentName: '', // 部件名称
|
|
||||||
recognitionType: '', // 识别类型
|
|
||||||
status: '',
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
}
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment( new Date(year,month-1,day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value=[startDate,endDate]
|
|
||||||
getData()
|
|
||||||
treeRef.value?.setCurrentKey()
|
|
||||||
}
|
|
||||||
const recognitionTypeList:any = ref([])
|
|
||||||
const DeviceClassList:any = ref([])
|
|
||||||
function getArrType() {
|
|
||||||
const paramstype = {
|
|
||||||
dictcode: 'recognition_type'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstype).then((res: any) => {
|
|
||||||
recognitionTypeList.value = res.data
|
|
||||||
})
|
|
||||||
|
|
||||||
const paramstypes = {
|
|
||||||
dictcode: 'DeviceClass'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstypes).then((res: any) => {
|
|
||||||
DeviceClassList.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
const ImgPath = ref("")
|
|
||||||
// 导出
|
|
||||||
function leadingOut() {
|
|
||||||
if (dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
tableloading.value = true
|
|
||||||
exportAbnormalDevice(queryInfo.value).then((response: any) => {
|
|
||||||
tableloading.value = false
|
|
||||||
downloadFile(response, '异常点位信息', 'xlsx')
|
|
||||||
}).catch(()=>{
|
|
||||||
tableloading.value = false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const treedata:any = ref([])
|
|
||||||
const tableloading:any = ref([])
|
|
||||||
const currentNodeKey = ref("")
|
|
||||||
const orgId = ref("");
|
|
||||||
const Maindata: any = ref({})
|
|
||||||
const treeRef = ref();
|
|
||||||
function getTree() {
|
|
||||||
const params = {
|
|
||||||
stationId: userStore.stationId
|
|
||||||
}
|
|
||||||
treeloading.value= true
|
|
||||||
getSubstationNaviTree(params).then((res: any) => {
|
|
||||||
if (res.data.length == 0) {
|
|
||||||
tableData.value = []
|
|
||||||
}
|
|
||||||
treedata.value = res.data
|
|
||||||
treeloading.value = false
|
|
||||||
nextTick(() => {
|
|
||||||
treeRef.value?.setCurrentKey(orgId.value);
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch((error: any) => {
|
|
||||||
treeloading.value = false
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
// 导航树点击事件
|
|
||||||
function handleNodeClick(data: any, node: any) {
|
|
||||||
// node.isCurrent = false
|
|
||||||
Maindata.value = data
|
|
||||||
orgId.value = data.bayId;
|
|
||||||
if(node.level == 1){
|
|
||||||
queryInfo.value.stationCode = userStore.stationCode
|
|
||||||
queryInfo.value.areaId = ""
|
|
||||||
}else if(node.level == 2){
|
|
||||||
queryInfo.value.stationCode = ""
|
|
||||||
queryInfo.value.bayId = ""
|
|
||||||
queryInfo.value.areaId = data.children[0].areaId
|
|
||||||
}else if(node.level == 3){
|
|
||||||
queryInfo.value.stationCode =""
|
|
||||||
queryInfo.value.areaId = ""
|
|
||||||
queryInfo.value.bayId = data.bayId
|
|
||||||
}
|
|
||||||
getData()
|
|
||||||
|
|
||||||
}
|
|
||||||
onMounted(() => {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment( new Date(year,month-1,day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value=[startDate,endDate]
|
|
||||||
getTree()
|
|
||||||
getData()
|
|
||||||
getArrType()
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="Intelligentlinkage-box">
|
|
||||||
<div id="IntelligentlinkageLeft" class="Intelligentlinkage-left" >
|
|
||||||
<div class="Intelligentlinkage-box-title">
|
|
||||||
<div class="imgname">数据列表</div>
|
|
||||||
</div>
|
|
||||||
<el-scrollbar style="margin-top:10px ;height: calc(100vh - 220px);" height="calc(100vh - 220px)" v-loading="treeloading">
|
|
||||||
<el-tree ref="treeRef" :expand-on-click-node="false"
|
|
||||||
node-key="bayId" :data="treedata" :current-node-key="currentNodeKey" :highlight-current="true"
|
|
||||||
:props="defaultProps" @node-click="handleNodeClick"
|
|
||||||
default-expand-all>
|
|
||||||
<template #default="{ node }">
|
|
||||||
<span class="treeActive">{{node.label}}</span>
|
|
||||||
</template>
|
|
||||||
</el-tree>
|
|
||||||
</el-scrollbar>
|
|
||||||
</div>
|
|
||||||
<main class="abnormaldevice">
|
|
||||||
<div style="position: relative;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;">
|
|
||||||
<div class="screenHomepage"><el-input v-model="queryInfo.taskName" placeholder="请输入任务名称" clearable
|
|
||||||
@clear="getData()" @keyup.enter="getData()" /></div>
|
|
||||||
<div style="margin-left: 10px;" class="screenHomepage"><el-input v-model="queryInfo.deviceName" placeholder="请输入点位名称" clearable
|
|
||||||
@clear="getData()" @keyup.enter="getData()" /></div>
|
|
||||||
<div style="margin-left: 10px;" class="screenHomepage"><el-input v-model="queryInfo.patroldeviceName" placeholder="请输入设备名称" clearable
|
|
||||||
@clear="getData()" @keyup.enter="getData()" /></div>
|
|
||||||
<div style="margin-left: 10px;" class="screenHomepage"><el-input v-model="queryInfo.componentName" placeholder="请输入部件名称" clearable
|
|
||||||
@clear="getData()" @keyup.enter="getData()" /></div>
|
|
||||||
<div style="" class="screenHomepage">
|
|
||||||
<el-select v-model="queryInfo.recognitionType" class="m-2 selType" :teleported="false" :popper-append-to-body="false" clearable placeholder="识别类型" @change="getData" >
|
|
||||||
<el-option v-for="item in recognitionTypeList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
</div>
|
|
||||||
<!-- <div style="margin-top: 15px;">
|
|
||||||
<el-select v-model="queryInfo.status" class="m-2" placeholder="巡视结论" @change="getData" @clear="getData()">
|
|
||||||
<el-option v-for="item in InspectionType" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
</div> -->
|
|
||||||
<div class="screenHomepage">
|
|
||||||
<el-date-picker v-model="dateArr" type="daterange" range-separator="至" start-placeholder="开始时间"
|
|
||||||
popper-class="elDatePicker"
|
|
||||||
format="YYYY-MM-DD" value-format="YYYY-MM-DD" end-placeholder="结束时间" :clearable="false" @change="getData" />
|
|
||||||
</div>
|
|
||||||
<el-button class="searchButton" type="primary" @click="getData()" >搜索</el-button>
|
|
||||||
<el-button class="searchButton" type="primary" @click="resetting()">重置</el-button>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<el-button class="searchButton" type="primary" @click="leadingOut">导出</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<el-table :data="tableData" v-loading="tableloading"
|
|
||||||
element-loading-text="正在加载数据,请耐心等待..."
|
|
||||||
element-loading-background="rgb(11, 40, 34)" style="width:calc(100%);margin:auto;position: relative;margin: 5px 0px; height:calc(100vh - 270px);"
|
|
||||||
:header-cell-style="tableBg" stripe
|
|
||||||
>
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="50px" />
|
|
||||||
<el-table-column prop="areaName" label="区域名称" min-width="100px" />
|
|
||||||
<el-table-column prop="bayName" label="间隔名称" min-width="100px" />
|
|
||||||
<el-table-column prop="taskName" label="任务名称" min-width="140px" />
|
|
||||||
<el-table-column prop="patroldeviceName" label="设备名称" min-width="150px"/>
|
|
||||||
<el-table-column prop="componentName" label="部件名称" min-width="100px"/>
|
|
||||||
<el-table-column prop="deviceName" label="点位名称" min-width="100px"/>
|
|
||||||
<el-table-column prop="deviceClass" label="点位分类" width="80px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="currency(DeviceClassList,scope.row.deviceClass) != undefined&¤cy(DeviceClassList,scope.row.deviceClass) != ''">{{currency(DeviceClassList,scope.row.deviceClass)}}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="recognitionType" label="识别类型" width="120px">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.recognitionType !=null &&scope.row.recognitionType !=''">{{ currency(recognitionTypeList,scope.row.recognitionType) }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="time" label="巡视时间" width="100px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.time != undefined &&scope.row.time != ''">{{scope.row.time}}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="value" label="巡视结果" width="120px">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-tooltip raw-content>
|
|
||||||
<template #content>
|
|
||||||
<div style="padding:5px">预警区间: {{ scope.row.threshold.earlyMin }} ~ {{ scope.row.threshold.earlyMax }}</div>
|
|
||||||
<div style="padding:5px">一般区间: {{ scope.row.threshold.sameMin }} ~ {{ scope.row.threshold.sameMax }}</div>
|
|
||||||
<div style="padding:5px">严重区间: {{ scope.row.threshold.seriousMin }} ~ {{ scope.row.threshold.seriousMax }}</div>
|
|
||||||
<div style="padding:5px">危急区间: {{ scope.row.threshold.criticalMin }} ~ {{ scope.row.threshold.criticalMax }}</div>
|
|
||||||
</template>
|
|
||||||
<span v-if="scope.row.valueType=='meter'|| scope.row.valueType=='infrared'">
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'" style="color: red;font-size: 16px;font-weight: bold;"> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
<span v-else> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
|
||||||
</span>
|
|
||||||
<span v-else>
|
|
||||||
<span v-if="scope.row.conf !=null &&scope.row.conf !=''">{{ scope.row.conf }}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</span>
|
|
||||||
</el-tooltip>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="analysisResult" label="巡视结论" width="100px">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.analysisResult == '正常'" style="color: rgb(0, 249, 162)">正常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '异常'" style="color: rgb(255, 51, 0);color: red;font-size: 16px;font-weight: bold;">异常</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '设备检修'" style="color: rgb(0, 153, 255)">设备检修</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '失败'" style="color: rgb(255, 189, 0)">失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '截图失败'" style="color: rgb(255, 189, 0)">截图失败</span>
|
|
||||||
<span v-if="scope.row.analysisResult == '成功'" style="color: rgb(0, 249, 162)">成功</span>
|
|
||||||
<span v-if="scope.row.analysisResult == ''||scope.row.analysisResult == null">--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="defectFilePath" label="巡视图片" width="70px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<el-image
|
|
||||||
v-if=" scope.row.filePath "
|
|
||||||
style="width: 30px; height: 30px;margin:auto"
|
|
||||||
:src="scope.row.smallFilePath"
|
|
||||||
:zoom-rate="1.2"
|
|
||||||
:preview-src-list="scope.row.srcList"
|
|
||||||
:preview-teleported="true"
|
|
||||||
fit="cover"
|
|
||||||
/>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column prop="cexamineUserName" label="审核人" width="90px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.cexamineUserName != undefined &&scope.row.cexamineUserName != ''">{{scope.row.cexamineUserName}}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="examineDate" label="审核时间" width="100px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.examineDate != undefined &&scope.row.examineDate != ''">{{scope.row.examineDate}}</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<!-- </div> -->
|
|
||||||
|
|
||||||
<div style="display: flex;justify-content: center;margin-top: 5px;">
|
|
||||||
<Page style="position: relative;z-index: 100;" :total="total" v-model:size="queryInfo.size"
|
|
||||||
:jumper="'hide'" v-model:current="queryInfo.current" @pagination="getData()"></Page>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
|
|
||||||
.Intelligentlinkage-box {
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding:15px;
|
|
||||||
padding-top:60px;
|
|
||||||
padding-bottom:0;
|
|
||||||
height: calc(100vh - 90px);
|
|
||||||
}
|
|
||||||
.Intelligentlinkage-left {
|
|
||||||
position: relative;
|
|
||||||
width: 260px;
|
|
||||||
min-width: 261px;
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
background: url(@/assets/newimg/spjk_lbbj.png) no-repeat center center;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
.nav-box {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-left: 20px;
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
.nav-list {
|
|
||||||
width: 65px;
|
|
||||||
height: 30px;
|
|
||||||
line-height: 30px;
|
|
||||||
border: 1px solid rgb(95, 143, 125);
|
|
||||||
font-family: 'MicrosoftYaHei Regular', 'MicrosoftYaHei';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #00F9A2;
|
|
||||||
text-align: center;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-right: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-active {
|
|
||||||
// font-weight: bold;
|
|
||||||
// color: rgb(255, 255, 255);
|
|
||||||
background: rgba(0, 249, 162, 0.2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tree {
|
|
||||||
background: transparent;
|
|
||||||
color: #ffffff;
|
|
||||||
--el-tree-node-hover-bg-color: transparent;
|
|
||||||
--el-tree-text-color: rgb(0, 249, 162, 0.5);
|
|
||||||
// --el-tree-expand-icon-color: var(--el-text-color-placeholder);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.Intelligentlinkage-box-title {
|
|
||||||
font-family: '阿里妈妈数黑体 Bold', '阿里妈妈数黑体';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #fff;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 44px;
|
|
||||||
padding-left: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.IntelligentlinkageRight {
|
|
||||||
flex: 1;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 90px);
|
|
||||||
margin-left: 15px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.imgbg {
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.searchButton {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
.abnormaldeviceImg {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 90px);
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.abnormaldevice {
|
|
||||||
flex: 1;
|
|
||||||
position: relative;
|
|
||||||
padding: 0 15px;
|
|
||||||
padding-top:10px;
|
|
||||||
width: 50%;
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
margin-left: 15px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
background: url(@/assets/newimg/cjrw_1890.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 弹窗
|
|
||||||
.el-overlay {
|
|
||||||
position: fixed;
|
|
||||||
z-index: 2023;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 2000;
|
|
||||||
height: 100%;
|
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
margin: auto;
|
|
||||||
/* background: url(/src/assets/monitorsystem/xsri_yltu.png); */
|
|
||||||
background-size: 100% 100%;
|
|
||||||
.notification-title {
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 38px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification-body {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 15px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,845 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "alarmInfo", // 警告信息确认
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import { ref, onMounted, nextTick, watch } from "vue";
|
|
||||||
import JessibucaPlayer from '@/components/jessibuca/index1.vue'
|
|
||||||
import { ElMessage } from "element-plus";
|
|
||||||
import { getAlarmLogPage, setAlarmLogStatus, setBatchAlarmLogStatus } from "@/api/alarmInfo";
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import moment from 'moment'
|
|
||||||
import axios from 'axios';
|
|
||||||
import { getNotCheckAlarmCount } from '@/api/home';
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
|
||||||
const userStore = useUserStore();
|
|
||||||
|
|
||||||
watch(() => userStore.alarmCount, (newValue, oldValue) => {
|
|
||||||
getData()
|
|
||||||
},
|
|
||||||
{ deep: true })
|
|
||||||
|
|
||||||
const treeloading = ref(false)
|
|
||||||
const tableData: any = ref([])
|
|
||||||
// 查询参数
|
|
||||||
const queryInfo: any = ref({
|
|
||||||
|
|
||||||
current: 1, // 当前页
|
|
||||||
size: 10, // 页大小
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskAlarmType: '', // 告警来源
|
|
||||||
alarmLevel: '', // 告警等级
|
|
||||||
checkFlag: '0', // 状态
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
})
|
|
||||||
const dateArr: any = ref([])
|
|
||||||
tableData.value = []
|
|
||||||
const alarmInfo: any = ref({})
|
|
||||||
const total = ref()
|
|
||||||
function getData() { // 获取列表信息
|
|
||||||
queryInfo.value.startDate = ""
|
|
||||||
queryInfo.value.endDate = ""
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
treeloading.value = true
|
|
||||||
getAlarmLogPage(queryInfo.value).then((res: any) => {
|
|
||||||
for (let i = 0; i < res.data.records.length; i++) {
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl + "/previewimage?type=alarm&filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
treeloading.value = false
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
queryInfo.value.size = res.data.size
|
|
||||||
queryInfo.value.current = res.data.current
|
|
||||||
}).catch(() => {
|
|
||||||
treeloading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
queryInfo.value = {
|
|
||||||
current: 1, // 当前页
|
|
||||||
size: 10, // 页大小
|
|
||||||
stationCode: userStore.stationCode,
|
|
||||||
taskAlarmType: '', // 告警来源
|
|
||||||
alarmLevel: '', // 告警等级
|
|
||||||
checkFlag: '0', // 状态
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
}
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value = [startDate, endDate]
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
//表格多选事件
|
|
||||||
const multipleSelection = ref([])
|
|
||||||
const alarmId: any = ref([])
|
|
||||||
const handleSelectionChange = (val: any) => {
|
|
||||||
multipleSelection.value = val
|
|
||||||
alarmId.value = []
|
|
||||||
multipleSelection.value.forEach((item: any) => {
|
|
||||||
if (item.checkFlag == 0) {
|
|
||||||
alarmId.value.push(item.id)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const Explicit = ref(false)
|
|
||||||
const examinationInfo: any = ref({
|
|
||||||
checkResult: "1"
|
|
||||||
})
|
|
||||||
function examinationAllClick(row: any) {
|
|
||||||
doubleHit.value = false
|
|
||||||
examinationInfo.value = {
|
|
||||||
checkResult: "1"
|
|
||||||
}
|
|
||||||
isCheckAll.value = true
|
|
||||||
Explicit.value = true
|
|
||||||
}
|
|
||||||
function examinationClick(row: any) {
|
|
||||||
doubleHit.value = false
|
|
||||||
isCheckAll.value = false
|
|
||||||
examinationInfo.value = row
|
|
||||||
examinationInfo.value.checkResult = "1"
|
|
||||||
Explicit.value = true
|
|
||||||
}
|
|
||||||
const playDeviceId = ref("")
|
|
||||||
const playChannelId = ref("")
|
|
||||||
function queryRecordDetails(row: any) {
|
|
||||||
playDeviceId.value = ""
|
|
||||||
playChannelId.value = ""
|
|
||||||
let startTimeStr = moment(new Date(alarmInfo.value.alarmDate).getTime() - 15 * 1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
let endTimeStr = moment(new Date(alarmInfo.value.alarmDate).getTime() + 15 * 1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/gb_record/queryNvrRecord/' + alarmInfo.value.patroldeviceCode + '/' + alarmInfo.value.patroldeviceCode + '?startTime=' + startTimeStr + '&endTime=' + endTimeStr, {}).then((res: any) => {
|
|
||||||
if (res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
clickNum.value = clickNum.value +1
|
|
||||||
playDeviceId.value = res.data.data.deviceId
|
|
||||||
playChannelId.value = res.data.data.channelId
|
|
||||||
setTime(startTimeStr, endTimeStr);
|
|
||||||
playRecord()
|
|
||||||
}
|
|
||||||
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function rowClick(row: any) {
|
|
||||||
if (row.id == alarmInfo.value.id) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
alarmInfo.value = row
|
|
||||||
queryRecordDetails(row.alarmDate)
|
|
||||||
|
|
||||||
// let startTimeStr = moment(new Date(row.alarmDate).getTime() - 30*1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
// let endTimeStr = moment(new Date(row.alarmDate).getTime() + 30*1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
// setTime(startTimeStr, endTimeStr);
|
|
||||||
// playRecord()
|
|
||||||
}
|
|
||||||
const doubleHit = ref(false)
|
|
||||||
function confirmClick() {
|
|
||||||
if (doubleHit.value == true) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
doubleHit.value = true
|
|
||||||
if (isCheckAll.value == false) {
|
|
||||||
const temporaryInfo = {
|
|
||||||
id: examinationInfo.value.id,
|
|
||||||
checkFlag: 1,
|
|
||||||
checkResult: examinationInfo.value.checkResult,
|
|
||||||
checkComment: examinationInfo.value.checkComment,
|
|
||||||
taskAlarmType: examinationInfo.value.taskAlarmType,
|
|
||||||
deviceId: examinationInfo.value.deviceid
|
|
||||||
}
|
|
||||||
setAlarmLogStatus(temporaryInfo).then((res: any) => {
|
|
||||||
if (res != undefined && res.code == '0') {
|
|
||||||
ElMessage({
|
|
||||||
type: "success",
|
|
||||||
message: "核查成功",
|
|
||||||
});
|
|
||||||
getNotCheckAlarmCount({ stationId: userStore.stationId }).then((res: any) => {
|
|
||||||
userStore.alarmCount = res.data.count
|
|
||||||
})
|
|
||||||
Explicit.value = false
|
|
||||||
getData()
|
|
||||||
} else {
|
|
||||||
doubleHit.value = false
|
|
||||||
}
|
|
||||||
}).catch(() => {
|
|
||||||
ElMessage({
|
|
||||||
type: "error",
|
|
||||||
message: "核查失败",
|
|
||||||
});
|
|
||||||
doubleHit.value = false
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
|
|
||||||
let alarmJson = {
|
|
||||||
ids: alarmId.value.join(","),
|
|
||||||
checkFlag: 1,
|
|
||||||
checkResult: examinationInfo.value.checkResult,
|
|
||||||
checkComment: examinationInfo.value.checkComment,
|
|
||||||
}
|
|
||||||
const temporaryInfo = {
|
|
||||||
alarmJson: JSON.stringify(alarmJson)
|
|
||||||
}
|
|
||||||
setBatchAlarmLogStatus(temporaryInfo).then((res: any) => {
|
|
||||||
if (res != undefined && res.code == '0') {
|
|
||||||
ElMessage({
|
|
||||||
type: "success",
|
|
||||||
message: "核查成功",
|
|
||||||
});
|
|
||||||
getNotCheckAlarmCount({ stationId: userStore.stationId }).then((res: any) => {
|
|
||||||
userStore.alarmCount = res.data.count
|
|
||||||
})
|
|
||||||
Explicit.value = false
|
|
||||||
getData()
|
|
||||||
} else {
|
|
||||||
doubleHit.value = false
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}).catch(() => {
|
|
||||||
ElMessage({
|
|
||||||
type: "error",
|
|
||||||
message: "核查失败",
|
|
||||||
});
|
|
||||||
doubleHit.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
const startTime = ref('2023-05-12 09:08:37')
|
|
||||||
const endTime = ref('2023-05-12 14:51:18')
|
|
||||||
const chooseDate = ref('2023-05-12')
|
|
||||||
|
|
||||||
const tmpTime = ref(0)
|
|
||||||
const tmpStartTime = ref(0)
|
|
||||||
|
|
||||||
function setTime(startTimes: any, endTimes: any) {
|
|
||||||
startTime.value = startTimes;
|
|
||||||
endTime.value = endTimes;
|
|
||||||
let start: any = (new Date(startTime.value).getTime() - new Date(chooseDate.value + " 00:00:00").getTime()) / 1000;
|
|
||||||
let end: any = (new Date(endTime.value).getTime() - new Date(chooseDate.value + " 00:00:00").getTime()) / 1000;
|
|
||||||
tmpTime.value = new Date(endTimes).getTime() - new Date(startTimes).getTime()
|
|
||||||
tmpStartTime.value = new Date(startTimes).getTime()
|
|
||||||
}
|
|
||||||
const streamId = ref("")
|
|
||||||
function gbPlay() {// 视频回放播放功能
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/resume/' + streamId.value, {}).then((res: any) => {
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function gbPause() { // 视频回放暂停功能
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/pause/' + streamId.value, {}).then((res: any) => {
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function closeVideo(index: any) { // 关闭视频
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const videoUrl = ref('')
|
|
||||||
const isCheckAll = ref(false)
|
|
||||||
|
|
||||||
const AlarmLevelList: any = ref([]) // 告警等级
|
|
||||||
const AlarmSourceList: any = ref([])
|
|
||||||
const checkFlagList: any = ref([{
|
|
||||||
id: "0",
|
|
||||||
itemcode: "0",
|
|
||||||
dictname: "未核查"
|
|
||||||
}, {
|
|
||||||
id: "1",
|
|
||||||
itemcode: "1",
|
|
||||||
dictname: "已审核"
|
|
||||||
}, {
|
|
||||||
id: "2",
|
|
||||||
itemcode: "2",
|
|
||||||
dictname: "已修正"
|
|
||||||
}
|
|
||||||
])
|
|
||||||
function getArrType() { // 查询字典方法
|
|
||||||
const paramstype = {
|
|
||||||
dictcode: 'AlarmLevel'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstype).then((res: any) => {
|
|
||||||
AlarmLevelList.value = res.data
|
|
||||||
})
|
|
||||||
|
|
||||||
const paramstypes = {
|
|
||||||
dictcode: 'AlarmSource'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstypes).then((res: any) => {
|
|
||||||
AlarmSourceList.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
const ImgPath = ref("")
|
|
||||||
const streamInfo: any = ref({})
|
|
||||||
const app = ref("")
|
|
||||||
const mediaServerId = ref("")
|
|
||||||
const ssrc = ref("")
|
|
||||||
const recordVideoPlayer:any = ref(null)
|
|
||||||
function stopPlayRecord (callback:any) {
|
|
||||||
recordVideoPlayer.value.pause()
|
|
||||||
videoUrl.value = '';
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/stop/' + playDeviceId.value + "/" + playChannelId.value + "/" + streamId.value, {}).then((res: any) => {
|
|
||||||
if (callback) callback()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const clickNum = ref(0)
|
|
||||||
function sliderChange(e: any) {
|
|
||||||
if (streamId.value !== "") {
|
|
||||||
stopPlayRecord(()=> {
|
|
||||||
streamId.value = "";
|
|
||||||
sliderChange(e);
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/start/' + playDeviceId.value + "/" + playChannelId.value + '?startTime=' + e + '&endTime=' + endTime.value, {}).then((res: any) => {
|
|
||||||
|
|
||||||
if (res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
streamInfo.value = res.data.data;
|
|
||||||
app.value = res.data.data.app;
|
|
||||||
streamId.value = res.data.data.stream;
|
|
||||||
mediaServerId.value = res.data.data.mediaServerId;
|
|
||||||
ssrc.value = res.data.data.ssrc;
|
|
||||||
videoUrl.value = getUrlByStreamInfo()
|
|
||||||
}
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function playRecord() {
|
|
||||||
if (streamId.value !== "") {
|
|
||||||
stopPlayRecord(()=> {
|
|
||||||
streamId.value = "";
|
|
||||||
playRecord();
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/start/' + playDeviceId.value + "/" + playChannelId.value + '?startTime=' + startTime.value + '&endTime=' + endTime.value, {}).then((res: any) => {
|
|
||||||
if (res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
streamInfo.value = res.data.data;
|
|
||||||
app.value = res.data.data.app;
|
|
||||||
streamId.value = res.data.data.stream;
|
|
||||||
mediaServerId.value = res.data.data.mediaServerId;
|
|
||||||
ssrc.value = res.data.data.ssrc;
|
|
||||||
videoUrl.value = getUrlByStreamInfo()
|
|
||||||
}
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function getUrlByStreamInfo() {
|
|
||||||
if (location.protocol === "https:") {
|
|
||||||
videoUrl.value = streamInfo.value["wss_flv"]
|
|
||||||
} else {
|
|
||||||
videoUrl.value = streamInfo.value["ws_flv"]
|
|
||||||
}
|
|
||||||
return videoUrl.value;
|
|
||||||
|
|
||||||
}
|
|
||||||
onMounted(() => {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
dateArr.value = [startDate, endDate]
|
|
||||||
getArrType()
|
|
||||||
getData()
|
|
||||||
})
|
|
||||||
const num = ref(0)
|
|
||||||
const handleChange = (value: any) => {
|
|
||||||
if (typeof value === 'number') {
|
|
||||||
if (value.toString().indexOf(".") != -1) {
|
|
||||||
ElMessage({
|
|
||||||
type: 'error',
|
|
||||||
message: '请输入整数',
|
|
||||||
})
|
|
||||||
num.value = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="alarmInfo-box">
|
|
||||||
<Eldialog v-if="Explicit == true" :title="isCheckAll == false?'核查确认':'批量核查'" :zIndex="2000" :width="'670px'"
|
|
||||||
@before-close="Explicit = false" >
|
|
||||||
<template v-slot:PopFrameContent>
|
|
||||||
<div style="padding:10px ;">
|
|
||||||
<div v-if="isCheckAll == false">
|
|
||||||
<div style="display:flex;align-items: center;margin-bottom: 10px;">
|
|
||||||
<div class="details-line"></div>
|
|
||||||
<div class="details-title">告警信息</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">间隔名称:</div>
|
|
||||||
<div>{{ examinationInfo.bayName }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">设备名称:</div>
|
|
||||||
<div>{{ examinationInfo.patroldeviceName }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">部件名称:</div>
|
|
||||||
<div>{{ examinationInfo.componentName }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">告警来源:</div>
|
|
||||||
<div>{{ currency(AlarmSourceList, examinationInfo.taskAlarmType) }}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">告警等级:</div>
|
|
||||||
<div>{{ currency(AlarmLevelList, examinationInfo.alarmLevel) }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name">告警描述:</div>
|
|
||||||
<div>{{ examinationInfo.content }}</div>
|
|
||||||
</div>
|
|
||||||
<div style="display:flex;align-items: center;margin-bottom: 10px;margin-top: 30px;">
|
|
||||||
<div class="details-line"></div>
|
|
||||||
<div class="details-title">核查确认</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent" style="align-items: center;">
|
|
||||||
<div class="details-name" style="padding-right: 10px;">是否属实</div>
|
|
||||||
|
|
||||||
<el-radio-group v-model="examinationInfo.checkResult"
|
|
||||||
:disabled="examinationInfo.checkFlag != 0 && examinationInfo.checkFlag != undefined">
|
|
||||||
<el-radio label="1" size="large">是</el-radio>
|
|
||||||
<el-radio label="0" size="large">否</el-radio>
|
|
||||||
</el-radio-group>
|
|
||||||
</div>
|
|
||||||
<div class="details-conent">
|
|
||||||
<div class="details-name" style="padding-right: 10px;">反馈意见</div>
|
|
||||||
<el-input v-model="examinationInfo.checkComment"
|
|
||||||
:readonly="examinationInfo.checkFlag != 0 && examinationInfo.checkFlag != undefined" :rows="3" resize="none"
|
|
||||||
type="textarea" placeholder="" />
|
|
||||||
</div>
|
|
||||||
<div style="display:flex;justify-content:center;margin-top:40px">
|
|
||||||
<div class="details-button" @click="Explicit = false">取消</div>
|
|
||||||
<div class="details-button" v-if="examinationInfo.checkFlag == 0 || examinationInfo.checkFlag == undefined"
|
|
||||||
@click="confirmClick">确定</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</Eldialog>
|
|
||||||
<div class="alarmInfo-left">
|
|
||||||
<div style="position: relative;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;padding:5px 0;" class="screenHomepage">
|
|
||||||
<el-select v-model="queryInfo.taskAlarmType" class="marginright" placeholder="告警来源" @change="getData"
|
|
||||||
:teleported="false" :popper-append-to-body="false" clearable>
|
|
||||||
<el-option v-for="item in AlarmSourceList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-select v-model="queryInfo.alarmLevel" class="marginright" placeholder="告警等级" @change="getData"
|
|
||||||
:teleported="false" :popper-append-to-body="false" clearable>
|
|
||||||
<el-option v-for="item in AlarmLevelList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-select v-model="queryInfo.checkFlag" class="marginright" placeholder="状态" @change="getData"
|
|
||||||
:teleported="false" :popper-append-to-body="false" clearable>
|
|
||||||
<el-option v-for="item in checkFlagList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-date-picker v-model="dateArr" type="daterange" range-separator="至" start-placeholder="开始时间"
|
|
||||||
popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD" end-placeholder="结束时间"
|
|
||||||
:clearable="false" @change="getData" />
|
|
||||||
<el-button class="searchButton" type="primary" @click="getData">搜索</el-button>
|
|
||||||
<el-button class="searchButton" type="primary" @click="resetting">重置</el-button>
|
|
||||||
</div>
|
|
||||||
<div style="min-width: 170px;">
|
|
||||||
<!-- <el-button class="searchButton" type="primary" :disabled="multipleSelection.length == 0">上报</el-button> -->
|
|
||||||
<el-button class="searchButton" type="primary" @click="examinationAllClick"
|
|
||||||
:disabled="multipleSelection.length == 0">批量核查</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-table row-key="id" :data="tableData" stripe :header-cell-style="tableBg"
|
|
||||||
v-loading="treeloading" element-loading-background="rgb(11, 40, 34)" highlight-current-row
|
|
||||||
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(100vh - 270px); overflow: auto "
|
|
||||||
@selection-change="handleSelectionChange" @row-click="rowClick">
|
|
||||||
<el-table-column type="selection" width="30" align="center" />
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="50px"></el-table-column>
|
|
||||||
<el-table-column prop="patroldeviceName" min-width="80px" label="设备名称" />
|
|
||||||
<el-table-column prop="componentName" min-width="80px" label="部件名称" />
|
|
||||||
<el-table-column prop="deviceName" label="点位名称" min-width="80px" />
|
|
||||||
<el-table-column prop="materialId" label="实物ID" width="80px" 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" width="70px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.deviceClass == 1">Ⅰ类</span>
|
|
||||||
<span v-if="scope.row.deviceClass == 2">Ⅱ类</span>
|
|
||||||
<span v-if="scope.row.deviceClass == 3">Ⅲ类</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="taskAlarmType" label="告警来源" width="110px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span>{{ currency(AlarmSourceList, scope.row.taskAlarmType) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="alarmLevel" label="告警等级" width="90px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.alarmLevel == 1" style="color: #0099FF;">{{ currency(AlarmLevelList,
|
|
||||||
scope.row.alarmLevel) }}</span>
|
|
||||||
<span v-if="scope.row.alarmLevel == 2" style="color: #FFFF00;">{{ currency(AlarmLevelList,
|
|
||||||
scope.row.alarmLevel) }}</span>
|
|
||||||
<span v-if="scope.row.alarmLevel == 3" style="color: #FF9900;">{{ currency(AlarmLevelList,
|
|
||||||
scope.row.alarmLevel) }}</span>
|
|
||||||
<span v-if="scope.row.alarmLevel == 4" style="color: #FF3300;">{{ currency(AlarmLevelList,
|
|
||||||
scope.row.alarmLevel) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="defectType" label="缺陷类别" width="90px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.defectType == 'wcaqm'">未正确佩戴安全帽</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'wcgz'">未穿长袖工作服</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'ryjjph'">人员聚集/徘徊</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'hzyw'">烟火</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'xdwcr'">小动物</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'yw_gkxfw'">异物_挂空悬浮物</span>
|
|
||||||
<span v-else-if="scope.row.defectType == 'sly_dmyw'">渗漏油</span>
|
|
||||||
<span v-else>--</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="alarmDate" label="告警时间" width="100px" align="center" />
|
|
||||||
<el-table-column prop="checkFlag" label="状态" width="70px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span>{{ currency(checkFlagList, scope.row.checkFlag) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="操作" width="80px" align="center" fixed="right">
|
|
||||||
<template #default="scope">
|
|
||||||
<div style="display: flex;justify-content: space-around;">
|
|
||||||
<img title="核查" style="cursor: pointer;" src="@/assets/tableIcon/hecha.png" @click.stop="examinationClick(scope.row)">
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<div style="display: flex;justify-content: center;margin-top: 5px;">
|
|
||||||
<Page style="position: relative;z-index: 100;" :total="total" v-model:size="queryInfo.size"
|
|
||||||
v-model:current="queryInfo.current" @pagination="getData()"></Page>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="alarmInfo-right">
|
|
||||||
<div style="width: 100%;height: 50%;">
|
|
||||||
<div style="display:flex;align-items: center;">
|
|
||||||
<div class="alarmInfo-line"></div>
|
|
||||||
<div class="alarmInfo-title"> <span class="fontFamily">历史录像 </span> <span
|
|
||||||
style="font-weight: 100;color: #fff;font-size: 16px;"> (视频采集前后15秒)</span></div>
|
|
||||||
</div>
|
|
||||||
<div class="video-box">
|
|
||||||
<div v-if="alarmInfo.id == undefined">
|
|
||||||
<img src="@/assets/monitorsystem/gjqr_wsp.png">
|
|
||||||
<div style=" font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: rgba(255, 255, 255, 0.6);
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 10px;">暂无视频</div>
|
|
||||||
</div>
|
|
||||||
<JessibucaPlayer v-if="alarmInfo.id != undefined" ref="recordVideoPlayer" :isrecord="'alarmInfo'" :_uid="99"
|
|
||||||
:visible.sync="true" :videoUrl="videoUrl" height="100px" :tmpTime="tmpTime" :endTime="endTime"
|
|
||||||
:tmpStartTime="tmpStartTime" :chooseDate="chooseDate" :hasAudio="false" fluent autoplay live
|
|
||||||
:clickNum="clickNum" @closeVideo="closeVideo" @sliderChange="sliderChange" @gbPlay="gbPlay" @gbPause="gbPause"></JessibucaPlayer>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="alarmInfo-visitation">
|
|
||||||
<div style="display:flex;align-items: center;height: 40px;padding-left: 15px;padding-top:10px">
|
|
||||||
<div class="alarmInfo-line"></div>
|
|
||||||
<div class="alarmInfo-title" style="color: #fff;"> <span class="fontFamily">告警图片</span> </div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="alarmimg">
|
|
||||||
<div v-if="alarmInfo.id == undefined">
|
|
||||||
<img src="@/assets/monitorsystem/gjqr_wtp.png">
|
|
||||||
<div style="font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: rgba(255, 255, 255, 0.6);
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 10px;">暂无图片</div>
|
|
||||||
</div>
|
|
||||||
<div style="width: 96%;height: 90%;" v-if="alarmInfo.id != undefined">
|
|
||||||
<div style="width:100%;height:80%; position: relative;">
|
|
||||||
<div 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);">
|
|
||||||
<img src="@/assets/monitorsystem/xsri_fd.png" alt="">
|
|
||||||
<el-image style="position: absolute;width:100%;height:100%; opacity: 0;" :src="alarmInfo.defectFilePath"
|
|
||||||
:zoom-rate="1.2" :preview-src-list="[alarmInfo.defectFilePath]" :preview-teleported="true"
|
|
||||||
fit="cover" />
|
|
||||||
</div>
|
|
||||||
<img style="width:100%;height:100%;" :src="alarmInfo.defectFilePath">
|
|
||||||
</div>
|
|
||||||
<div style="padding-top:10px">巡视结果:<span style="color:#ff2525">{{ alarmInfo.value }}{{ alarmInfo.unit
|
|
||||||
}}</span></div>
|
|
||||||
<div style="display:flex;">
|
|
||||||
<div style="min-width:70px;">告警描述:</div>
|
|
||||||
<div style="color:#ff2525">{{ alarmInfo.content }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.alarmInfo-box {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 15px;
|
|
||||||
padding-top: 60px;
|
|
||||||
padding-bottom: 0;
|
|
||||||
|
|
||||||
.alarmInfo-left {
|
|
||||||
padding: 8px 15px;
|
|
||||||
width: calc(65vw);
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
background: url(@/assets/newimg/xsjk_1235_700.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
margin-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alarmInfo-right {
|
|
||||||
width: calc(33.5vw);
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-content: space-between;
|
|
||||||
|
|
||||||
.alarmInfo-line {
|
|
||||||
width: 4px;
|
|
||||||
height: 15px;
|
|
||||||
background: inherit;
|
|
||||||
background-color: #009BFF;
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alarmInfo-title {
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.video-box {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 45px);
|
|
||||||
background-color: rgba(40, 40, 40, 1);
|
|
||||||
margin-top: 10px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.alarmInfo-visitation {
|
|
||||||
width: 100%;
|
|
||||||
height: 50%;
|
|
||||||
background: url(@/assets/patrolmonitor/xsjk_640.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.alarmimg {
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 45px);
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.searchButton {
|
|
||||||
// border: #059a67 solid 1px;
|
|
||||||
// background-color: #08503a;
|
|
||||||
// color: #00F9A2;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 弹窗
|
|
||||||
.el-overlay {
|
|
||||||
position: fixed;
|
|
||||||
z-index: 2023;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 2000;
|
|
||||||
height: 100%;
|
|
||||||
background-color: rgba(0, 0, 0, 0.5);
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
.notification {
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
.notification-title {
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 38px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.notification-body {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 15px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.examination {
|
|
||||||
width: 670px;
|
|
||||||
height: 650px;
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
right: 0px;
|
|
||||||
left: 0px;
|
|
||||||
bottom: 0px;
|
|
||||||
margin: auto;
|
|
||||||
background: url(@/assets/monitorsystem/ejectbg/xsri_xz.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
.examination-title {
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 38px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.examination-body {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 15px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.examinationAll {
|
|
||||||
width: 670px;
|
|
||||||
height: 420px;
|
|
||||||
position: absolute;
|
|
||||||
top: 0px;
|
|
||||||
right: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
margin: auto;
|
|
||||||
background: url(@/assets/monitorsystem/ejectbg/u1243.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
|
|
||||||
.examination-title {
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
height: 40px;
|
|
||||||
line-height: 38px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.examination-body {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 15px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.details-line {
|
|
||||||
width: 4px;
|
|
||||||
height: 10px;
|
|
||||||
background: inherit;
|
|
||||||
background-color: rgb(64, 158, 255);
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-title {
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: rgb(64, 158, 255);
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-conent {
|
|
||||||
font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
padding: 7px 0;
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-name {
|
|
||||||
min-width: 95px;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.marginright{
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,178 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "record",
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import { onMounted, ref } from "vue";
|
|
||||||
import { querylog } from "@/api/task";
|
|
||||||
import { getTreefirst,getDeviceByType } from "@/api/device";
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import moment from 'moment'
|
|
||||||
|
|
||||||
//定义表格数据
|
|
||||||
const tableData: any = ref([]);
|
|
||||||
|
|
||||||
// 查询数据
|
|
||||||
const queryParams = ref({
|
|
||||||
current: 1,
|
|
||||||
size: 20,
|
|
||||||
stationcode: '',
|
|
||||||
startdate: '',
|
|
||||||
enddate: '',
|
|
||||||
type: '',
|
|
||||||
querystr: '',
|
|
||||||
});
|
|
||||||
// 日期查询
|
|
||||||
const operationTime: any = ref();
|
|
||||||
// 分页-总页数
|
|
||||||
const total = ref(0);
|
|
||||||
// 表格加载
|
|
||||||
const loading = ref(false)
|
|
||||||
//传输信息类型
|
|
||||||
const DeviceClassList = ref()
|
|
||||||
// 获取当天日期
|
|
||||||
function getNowFormatDate() {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment(new Date(year, month - 1, day)).format('YYYY-MM-DD')
|
|
||||||
operationTime.value = [startDate,endDate]
|
|
||||||
// init()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 初始化加载
|
|
||||||
function init() {
|
|
||||||
if (operationTime.value != null) {
|
|
||||||
queryParams.value.startdate = operationTime.value[0];
|
|
||||||
queryParams.value.enddate = operationTime.value[1];
|
|
||||||
}
|
|
||||||
loading.value = true;
|
|
||||||
querylog(queryParams.value).then((result: any) => {
|
|
||||||
tableData.value = result.data.records;
|
|
||||||
total.value = result.data.total;
|
|
||||||
queryParams.value.size = result.data.size
|
|
||||||
queryParams.value.current = result.data.current
|
|
||||||
loading.value = false;
|
|
||||||
}).catch((err: any) => {
|
|
||||||
loading.value = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//搜索选择框
|
|
||||||
const optionSelect = ref()
|
|
||||||
function searchBox() {
|
|
||||||
getTreefirst().then((res: any) => {
|
|
||||||
optionSelect.value = res.data
|
|
||||||
queryParams.value.stationcode = optionSelect.value[0].stationCode
|
|
||||||
})
|
|
||||||
const params = {
|
|
||||||
dictcode: 'TransLogType'
|
|
||||||
}
|
|
||||||
getDeviceByType(params).then((res:any)=>{
|
|
||||||
DeviceClassList.value = res.data
|
|
||||||
init()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
searchBox();
|
|
||||||
getNowFormatDate();
|
|
||||||
});
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
function dateFormat(row: any) {
|
|
||||||
const daterc = row;
|
|
||||||
if (daterc != null) {
|
|
||||||
var date = new Date(daterc);
|
|
||||||
var year = date.getFullYear();
|
|
||||||
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
|
|
||||||
date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
|
|
||||||
var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
|
|
||||||
var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
|
|
||||||
var minutes = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
|
|
||||||
var seconds = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
|
|
||||||
// 拼接
|
|
||||||
return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<div class="record-box">
|
|
||||||
<div
|
|
||||||
style="margin-bottom: 10px;display: flex; display: -webkit-flex; align-items: center; -webkit-align-items: center;">
|
|
||||||
<el-select v-model="queryParams.stationcode" placeholder="变电站" @change="init"
|
|
||||||
style="width: 220px;margin-right:10px;">
|
|
||||||
<el-option v-for="item in optionSelect" :key="item.stationId" :label="item.stationName"
|
|
||||||
:value="item.stationCode" />
|
|
||||||
</el-select>
|
|
||||||
<el-select v-model="queryParams.type" placeholder="传输信息类型" clearable @change="init"
|
|
||||||
style="width: 160px;margin-right:10px;">
|
|
||||||
<el-option v-for="item in DeviceClassList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-input v-model="queryParams.querystr" placeholder="请输入传输信息描述" clearable @clear="init()"
|
|
||||||
@keyup.enter="init()" style="margin-right:15px ;width: 200px;" />
|
|
||||||
<div style="width: 260px;">
|
|
||||||
<el-date-picker v-model="operationTime" type="daterange" range-separator="至" start-placeholder="开始时间"
|
|
||||||
popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD" end-placeholder="结束时间"
|
|
||||||
:clearable="false" @change="init" style="width: 250px;" />
|
|
||||||
</div>
|
|
||||||
<el-button type="primary" style="margin-left: 10px" @click="init">搜索</el-button>
|
|
||||||
</div>
|
|
||||||
<el-table v-loading="loading" :data="tableData"
|
|
||||||
style="width: 100%; height: calc(100vh - 266px);margin-bottom: 20px;" border
|
|
||||||
:header-cell-style="{ background: 'rgb(250 250 250)', height: '50px' }">
|
|
||||||
<el-table-column type="index" label="序号" width="70" align="center"></el-table-column>
|
|
||||||
<el-table-column prop="stationCode" label="变电站编号" width="100"></el-table-column>
|
|
||||||
<el-table-column prop="stationName" label="变电站名称" width="240"></el-table-column>
|
|
||||||
<el-table-column prop="transtype" label="传输信息类型" width="240">
|
|
||||||
<template #default="scope">
|
|
||||||
<span >{{ currency(DeviceClassList,scope.row.transtype) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="transTime" label="传输时间" width="240">
|
|
||||||
<template #default="scope">
|
|
||||||
<span>{{ dateFormat(scope.row.transTime) }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="transdesc" label="传输信息描述"></el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<Page :total="total" v-model:size="queryParams.size" v-model:current="queryParams.current" @pagination="init()">
|
|
||||||
</Page>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped >
|
|
||||||
.record-box {
|
|
||||||
padding: 20px;
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 130px);
|
|
||||||
overflow: auto;
|
|
||||||
background-color: rgba(255, 255, 255, 1);
|
|
||||||
border: none;
|
|
||||||
border-radius: 3px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-table__cell) {
|
|
||||||
color: #383838;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* :deep(.el-select .el-input) {
|
|
||||||
width: 80px !important;
|
|
||||||
} */
|
|
||||||
</style>
|
|
@ -1,512 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "silentmonitor", // 静默监视
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
<script setup lang="ts">
|
|
||||||
import Page from '@/components/Pagination/page.vue'
|
|
||||||
import { ref, onMounted, nextTick } from "vue";
|
|
||||||
import JessibucaPlayer from '@/components/jessibuca/index1.vue'
|
|
||||||
import { ElMessage } from "element-plus";
|
|
||||||
import { getAlarmListByType,getAlarmListPage,getSubstationAreaByCode } from "@/api/silentmonitor";
|
|
||||||
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import moment from 'moment'
|
|
||||||
import axios from 'axios';
|
|
||||||
import { useUserStore } from '@/store/modules/user';
|
|
||||||
const userStore = useUserStore();
|
|
||||||
const treeloading = ref(false)
|
|
||||||
const tableData:any = ref([])
|
|
||||||
// 查询参数
|
|
||||||
const queryInfo:any = ref({
|
|
||||||
current: 1, // 当前页
|
|
||||||
size:10, // 页大小
|
|
||||||
stationId:userStore.stationId,
|
|
||||||
areaId:'', // 区域ID
|
|
||||||
patrolDeviceName:'', // 摄像机名称
|
|
||||||
monitorType:'', // 告警类型
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
desc:'',
|
|
||||||
})
|
|
||||||
const dateArr: any = ref([])
|
|
||||||
tableData.value = []
|
|
||||||
const alarmInfo:any = ref({})
|
|
||||||
const total = ref(0)
|
|
||||||
function getData() { // 获取列表信息
|
|
||||||
queryInfo.value.startDate = ""
|
|
||||||
queryInfo.value.endDate = ""
|
|
||||||
if (dateArr.value != null && dateArr.value.length != 0) {
|
|
||||||
queryInfo.value.startDate = dateArr.value[0]
|
|
||||||
queryInfo.value.endDate = dateArr.value[1]
|
|
||||||
}
|
|
||||||
treeloading.value = true
|
|
||||||
getAlarmListByType(queryInfo.value).then((res: any) => {
|
|
||||||
treeloading.value = false
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
}).catch(()=>{
|
|
||||||
treeloading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
//重置
|
|
||||||
function resetting() {
|
|
||||||
queryInfo.value = {
|
|
||||||
current: 1, // 当前页
|
|
||||||
size:10, // 页大小
|
|
||||||
stationId:userStore.stationId,
|
|
||||||
areaId:'', // 区域ID
|
|
||||||
patrolDeviceName:'', // 摄像机名称
|
|
||||||
monitorType:'', // 告警类型
|
|
||||||
startDate: '', // 开始时间
|
|
||||||
endDate: '',// 结束时间
|
|
||||||
}
|
|
||||||
dateArr.value = []
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
const playDeviceId = ref("")
|
|
||||||
const playChannelId = ref("")
|
|
||||||
function queryRecordDetails(row:any){
|
|
||||||
playDeviceId.value = ""
|
|
||||||
playChannelId.value = ""
|
|
||||||
let startTimeStr = moment(new Date(row).getTime() - 15*1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
let endTimeStr = moment(new Date(row).getTime() + 15*1000).format("YYYY-MM-DD HH:mm:ss");
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/gb_record/queryNvrRecord/' + alarmInfo.value.patroldeviceCode + '/' +alarmInfo.value.patroldeviceCode + '?startTime=' + startTimeStr + '&endTime=' + endTimeStr, {}).then((res: any) => {
|
|
||||||
if(res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
clickNum.value = clickNum.value +1
|
|
||||||
playDeviceId.value = res.data.data.deviceId
|
|
||||||
playChannelId.value = res.data.data.channelId
|
|
||||||
setTime(startTimeStr, endTimeStr);
|
|
||||||
playRecord()
|
|
||||||
}
|
|
||||||
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function rowClick(row:any){
|
|
||||||
if(row.areaId == alarmInfo.value.areaId && row.monitorType == alarmInfo.value.monitorType ){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
alarmInfo.value = row
|
|
||||||
queryRecordDetails(row.alarmDate)
|
|
||||||
getGiveanalarm()
|
|
||||||
}
|
|
||||||
function rowGiveanalarmClick(row:any){
|
|
||||||
queryRecordDetails(row.alarmDate)
|
|
||||||
}
|
|
||||||
|
|
||||||
const startTime = ref('')
|
|
||||||
const endTime = ref('')
|
|
||||||
const tmpTime = ref(0)
|
|
||||||
const tmpStartTime = ref(0) // 视频开始时间
|
|
||||||
|
|
||||||
function setTime(startTimes:any, endTimes:any){
|
|
||||||
startTime.value = startTimes;
|
|
||||||
endTime.value = endTimes;
|
|
||||||
tmpTime.value = new Date(endTimes).getTime() - new Date(startTimes).getTime()
|
|
||||||
tmpStartTime.value = new Date(startTimes).getTime()
|
|
||||||
}
|
|
||||||
const streamId = ref("")
|
|
||||||
function gbPlay(){// 视频回放播放功能
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/resume/' + streamId.value, {}).then((res: any) => {
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function gbPause(){ // 视频回放暂停功能
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/pause/' + streamId.value, {}).then((res: any) => {
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const videoUrl = ref('ws://192.168.1.119:81/rtp/47868E3C.live.flv')
|
|
||||||
const isCheckAll = ref(false)
|
|
||||||
|
|
||||||
const AreaList:any = ref([]) // 告警等级
|
|
||||||
const SilentMonitoringTypeList:any = ref([])
|
|
||||||
const checkFlagList:any = ref([{
|
|
||||||
id:"0",
|
|
||||||
itemcode:"0",
|
|
||||||
dictname:"未核查"
|
|
||||||
},{
|
|
||||||
id:"1",
|
|
||||||
itemcode:"1",
|
|
||||||
dictname:"已审核"
|
|
||||||
},{
|
|
||||||
id:"2",
|
|
||||||
itemcode:"2",
|
|
||||||
dictname:"已修正"
|
|
||||||
}
|
|
||||||
])
|
|
||||||
function getArrType() { // 查询字典方法
|
|
||||||
const params = {
|
|
||||||
stationCode: userStore.stationCode
|
|
||||||
}
|
|
||||||
getSubstationAreaByCode(params).then((res: any) => {
|
|
||||||
AreaList.value = res.data
|
|
||||||
})
|
|
||||||
|
|
||||||
const paramstypes = {
|
|
||||||
dictcode: 'SilentMonitoringType'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramstypes).then((res: any) => {
|
|
||||||
SilentMonitoringTypeList.value = res.data
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const streamInfo:any = ref({})
|
|
||||||
const app = ref("")
|
|
||||||
const mediaServerId = ref("")
|
|
||||||
const ssrc = ref("")
|
|
||||||
const clickNum = ref(0)
|
|
||||||
const recordVideoPlayer:any = ref(null)
|
|
||||||
function stopPlayRecord (callback:any) {
|
|
||||||
recordVideoPlayer.value.pause()
|
|
||||||
videoUrl.value = '';
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/stop/' + playDeviceId.value + "/" + playChannelId.value + "/" + streamId.value, {}).then((res: any) => {
|
|
||||||
if (callback) callback()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function sliderChange(e:any){
|
|
||||||
if (streamId.value !== "") {
|
|
||||||
stopPlayRecord(()=> {
|
|
||||||
streamId.value = "";
|
|
||||||
sliderChange(e);
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/start/' + playDeviceId.value + "/" + playChannelId.value + '?startTime=' + e + '&endTime=' + endTime.value, {}).then((res: any) => {
|
|
||||||
if(res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
streamInfo.value = res.data.data;
|
|
||||||
app.value = res.data.data.app;
|
|
||||||
streamId.value = res.data.data.stream;
|
|
||||||
mediaServerId.value = res.data.data.mediaServerId;
|
|
||||||
ssrc.value = res.data.data.ssrc;
|
|
||||||
videoUrl.value = getUrlByStreamInfo()
|
|
||||||
}
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function playRecord (){
|
|
||||||
if (streamId.value !== "") {
|
|
||||||
stopPlayRecord(()=> {
|
|
||||||
streamId.value = "";
|
|
||||||
playRecord();
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
axios.get(userStore.webApiMonitorUrl + '/api/playback/start/' + playDeviceId.value + "/" + playChannelId.value + '?startTime=' + startTime.value + '&endTime=' + endTime.value, {}).then((res: any) => {
|
|
||||||
if(res.data.code === 0) {
|
|
||||||
// 处理时间信息
|
|
||||||
streamInfo.value = res.data.data;
|
|
||||||
app.value = res.data.data.app;
|
|
||||||
streamId.value = res.data.data.stream;
|
|
||||||
mediaServerId.value = res.data.data.mediaServerId;
|
|
||||||
ssrc.value = res.data.data.ssrc;
|
|
||||||
videoUrl.value = getUrlByStreamInfo()
|
|
||||||
}
|
|
||||||
}).catch(function (error: any) {
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function getUrlByStreamInfo(){
|
|
||||||
if (location.protocol === "https:") {
|
|
||||||
videoUrl.value = streamInfo.value["wss_flv"]
|
|
||||||
}else {
|
|
||||||
videoUrl.value = streamInfo.value["ws_flv"]
|
|
||||||
}
|
|
||||||
return videoUrl.value;
|
|
||||||
|
|
||||||
}
|
|
||||||
const giveanalarmData:any = ref([])
|
|
||||||
|
|
||||||
const giveanalarmArr:any = ref([])
|
|
||||||
const searchInfo:any =ref({
|
|
||||||
current: 1, // 当前页
|
|
||||||
size:10, // 页大小
|
|
||||||
})
|
|
||||||
const giveanalarmloading:any =ref(false)
|
|
||||||
const giveanalarmtotal:any =ref(0)
|
|
||||||
function resetgiveanalarm() {// 重置告警信息
|
|
||||||
giveanalarmArr.value = []
|
|
||||||
getGiveanalarm()
|
|
||||||
}
|
|
||||||
function getGiveanalarm() { // 获取列表信息
|
|
||||||
|
|
||||||
searchInfo.value.startDate = ""
|
|
||||||
searchInfo.value.endDate = ""
|
|
||||||
if (giveanalarmArr.value != null && giveanalarmArr.value.length != 0) {
|
|
||||||
searchInfo.value.startDate = giveanalarmArr.value[0]
|
|
||||||
searchInfo.value.endDate = giveanalarmArr.value[1]
|
|
||||||
}
|
|
||||||
searchInfo.value.patrolDeviceCode = alarmInfo.value.patroldeviceCode
|
|
||||||
searchInfo.value.monitorType = alarmInfo.value.monitorType
|
|
||||||
|
|
||||||
giveanalarmloading.value = true
|
|
||||||
getAlarmListPage(searchInfo.value).then((res: any) => {
|
|
||||||
giveanalarmloading.value = false
|
|
||||||
for(let i = 0 ;i<res.data.records.length;i++){
|
|
||||||
res.data.records[i].smallFilePath = userStore.webApiBaseUrl +"/previewimage?size=small&filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
res.data.records[i].srcList = [userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)]
|
|
||||||
res.data.records[i].defectFilePath = userStore.webApiBaseUrl +"/previewimage?filename=" + encodeURI(res.data.records[i].defectFilePath)
|
|
||||||
}
|
|
||||||
giveanalarmData.value = res.data.records
|
|
||||||
giveanalarmtotal.value = res.data.total
|
|
||||||
}).catch(()=>{
|
|
||||||
giveanalarmloading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function sortChange(column:any){
|
|
||||||
if(column.order == "descending"){
|
|
||||||
if(column.prop == "count"){
|
|
||||||
queryInfo.value.asc = "count"
|
|
||||||
queryInfo.value.desc = null
|
|
||||||
}else{
|
|
||||||
queryInfo.value.asc = "alarmDate"
|
|
||||||
queryInfo.value.desc = null
|
|
||||||
}
|
|
||||||
// 正序
|
|
||||||
} else if(column.order == "ascending") {
|
|
||||||
if(column.prop == "count"){
|
|
||||||
queryInfo.value.asc = null
|
|
||||||
queryInfo.value.desc = "count"
|
|
||||||
}else{
|
|
||||||
queryInfo.value.asc = null
|
|
||||||
queryInfo.value.desc = "alarmDate"
|
|
||||||
}
|
|
||||||
// column.order == "ascending" 上升
|
|
||||||
} else {
|
|
||||||
queryInfo.value.asc = null
|
|
||||||
queryInfo.value.desc = null
|
|
||||||
}
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
const ImgPath = ref("")
|
|
||||||
onMounted(() => {
|
|
||||||
let endDate = moment(new Date()).format('YYYY-MM-DD')
|
|
||||||
const now = new Date(endDate)
|
|
||||||
const year = now.getFullYear();
|
|
||||||
const month = now.getMonth();
|
|
||||||
const day = now.getDate();
|
|
||||||
let startDate = moment( new Date(year,month-1,day)).format('YYYY-MM-DD')
|
|
||||||
giveanalarmArr.value=[startDate,endDate]
|
|
||||||
getArrType()
|
|
||||||
getData()
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<div class="alarmInfo-box">
|
|
||||||
<div class="alarmInfo-left">
|
|
||||||
<div style="position: relative;display: flex;align-items: center; justify-content: space-between;">
|
|
||||||
<div style="display: flex;align-items: center;padding:5px 0;" >
|
|
||||||
<el-input v-model="queryInfo.patrolDeviceName" style="width:200px" placeholder="摄像机名称" clearable class="marginright"
|
|
||||||
@clear="getData()" @keyup.enter="getData()" />
|
|
||||||
<el-select v-model="queryInfo.areaId" class="marginright" placeholder="区域" @change="getData" :teleported="false" :popper-append-to-body="false" clearable>
|
|
||||||
<el-option v-for="item in AreaList" :key="item.areaId" :label="item.areaName" :value="item.areaId" />
|
|
||||||
</el-select>
|
|
||||||
<el-select v-model="queryInfo.monitorType" placeholder="告警类型" @change="getData" :teleported="false" :popper-append-to-body="false" clearable>
|
|
||||||
<el-option v-for="item in SilentMonitoringTypeList" :key="item.id" :label="item.dictname" :value="item.itemcode" />
|
|
||||||
</el-select>
|
|
||||||
<el-button class="searchButton" type="primary" @click="getData">搜索</el-button>
|
|
||||||
<el-button class="searchButton" type="primary" @click="resetting">重置</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-table :data="tableData"
|
|
||||||
v-loading="treeloading" highlight-current-row element-loading-background="rgb(11, 40, 34)"
|
|
||||||
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(100vh - 270px); overflow: auto "
|
|
||||||
stripe :header-cell-style="tableBg"
|
|
||||||
@row-click="rowClick" @sort-change="sortChange"
|
|
||||||
>
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="50px" />
|
|
||||||
<el-table-column prop="patroldeviceName" label="摄像机名称" />
|
|
||||||
<el-table-column prop="areaName" label="区域名称" />
|
|
||||||
<el-table-column prop="place" label="安装位置" />
|
|
||||||
<el-table-column prop="monitorType" label="告警类型" width="160px" align="center">
|
|
||||||
<template #default="scope">
|
|
||||||
<span>{{currency(SilentMonitoringTypeList,scope.row.monitorType)}}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="alarmDate" label="最近告警时间" width="170px" align="center" sortable="alarmDate"/>
|
|
||||||
<el-table-column prop="count" label="告警次数" width="120px" align="center" sortable="custom">
|
|
||||||
<template #default="scope">
|
|
||||||
<span style="color: #FFBD00;">{{scope.row.count}}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<div style="display: flex;justify-content: center;margin-top: 5px;">
|
|
||||||
<Page style="position: relative;z-index: 100;" :total="total" v-model:size="queryInfo.size"
|
|
||||||
v-model:current="queryInfo.current" @pagination="getData()"></Page>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="alarmInfo-right">
|
|
||||||
<div style="width: 100%;height: 50%;">
|
|
||||||
<div style="display:flex;align-items: center;">
|
|
||||||
<div class="alarmInfo-line"></div>
|
|
||||||
<div class="alarmInfo-title">历史录像 <span style="font-weight: 100;color: #fff;font-size: 16px;"> (视频采集前后15秒)</span></div>
|
|
||||||
</div>
|
|
||||||
<div class="video-box">
|
|
||||||
<div v-if="alarmInfo.patroldeviceCode == undefined">
|
|
||||||
<img src="@/assets/monitorsystem/gjqr_wsp.png">
|
|
||||||
<div style=" font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: rgba(255, 255, 255, 0.6);
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 10px;">暂无视频</div>
|
|
||||||
</div>
|
|
||||||
<JessibucaPlayer v-if="alarmInfo.patroldeviceCode != undefined" ref="recordVideoPlayer" :isrecord="'alarmInfo'" :_uid="99" :visible.sync="true" :videoUrl="videoUrl" height="100px"
|
|
||||||
:tmpTime="tmpTime"
|
|
||||||
:endTime="endTime" :tmpStartTime="tmpStartTime"
|
|
||||||
:hasAudio="false" fluent autoplay live
|
|
||||||
:clickNum="clickNum" @sliderChange="sliderChange" @gbPlay="gbPlay" @gbPause="gbPause"></JessibucaPlayer>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="alarmInfo-visitation">
|
|
||||||
<div style="display:flex;align-items: center;height: 40px;padding-left: 15px;padding-top:10px">
|
|
||||||
<div class="alarmInfo-line"></div>
|
|
||||||
<div class="alarmInfo-title">告警列表</div>
|
|
||||||
</div>
|
|
||||||
<div class="alarmimg">
|
|
||||||
<div v-if="alarmInfo.patroldeviceCode == undefined">
|
|
||||||
<img src="@/assets/monitorsystem/jmjs_wnr.png">
|
|
||||||
<div style="font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: rgba(255, 255, 255, 0.6);
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 10px;">暂无内容</div>
|
|
||||||
</div>
|
|
||||||
<div style="width:100%;height:100%;padding:0 20px" v-if="alarmInfo.patroldeviceCode != undefined">
|
|
||||||
<div style="display: flex;align-items: center;padding-top:20px">
|
|
||||||
<span>告警时间:</span>
|
|
||||||
<el-date-picker v-model="giveanalarmArr" type="daterange" range-separator="至" start-placeholder="开始时间"
|
|
||||||
popper-class="elDatePicker" format="YYYY-MM-DD" value-format="YYYY-MM-DD" end-placeholder="结束时间" :clearable="false" style="max-width: 370px;"
|
|
||||||
@change="getGiveanalarm"/>
|
|
||||||
</div>
|
|
||||||
<el-table :data="giveanalarmData" stripe :header-cell-style="tableBg"
|
|
||||||
v-loading="giveanalarmloading" highlight-current-row element-loading-background="rgb(11, 40, 34)"
|
|
||||||
style="width: 100%;margin:auto;position: relative;margin-top: 15px; height:calc(100% - 85px); overflow: auto "
|
|
||||||
@row-click="rowGiveanalarmClick">
|
|
||||||
<el-table-column type="index" align="center" label="序号" width="50px" />
|
|
||||||
<el-table-column prop="alarmDate" label="告警时间" width="170px" align="center"/>
|
|
||||||
<el-table-column prop="content" label="告警信息" />
|
|
||||||
<el-table-column prop="defectFilePath" label="告警图片" width="90px" show>
|
|
||||||
<template #default="scope">
|
|
||||||
<el-image
|
|
||||||
style="width: 40px; height: 40px"
|
|
||||||
:src="scope.row.smallFilePath"
|
|
||||||
:zoom-rate="1.2"
|
|
||||||
:preview-src-list="scope.row.srcList"
|
|
||||||
:preview-teleported="true"
|
|
||||||
fit="cover"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<Page style="position: relative;z-index: 100;margin-top: 5px;" :total="giveanalarmtotal" v-model:size="searchInfo.size"
|
|
||||||
v-model:current="searchInfo.current" @pagination="getGiveanalarm()"
|
|
||||||
:jumper="'hide'"
|
|
||||||
></Page>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.alarmInfo-box {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 15px;
|
|
||||||
padding-top: 60px;
|
|
||||||
padding-bottom: 0;
|
|
||||||
|
|
||||||
.alarmInfo-left{
|
|
||||||
padding: 8px 15px;
|
|
||||||
margin-right: 15px;
|
|
||||||
width: calc(65vw);
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
background: url(@/assets/newimg/xsjk_1235_700.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
.alarmInfo-right{
|
|
||||||
width: calc(33.5vw);
|
|
||||||
height: calc(100vh - 160px);
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-content: space-between;
|
|
||||||
overflow:auto;
|
|
||||||
.alarmInfo-line{
|
|
||||||
width: 4px;
|
|
||||||
height: 15px;
|
|
||||||
background: inherit;
|
|
||||||
background-color: #009BFF;
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
.alarmInfo-title{
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 18px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
.video-box{
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 45px);
|
|
||||||
background-color: rgba(40, 40, 40, 1);
|
|
||||||
margin-top: 10px;
|
|
||||||
display:flex;
|
|
||||||
justify-content:center;
|
|
||||||
align-items:center;
|
|
||||||
}
|
|
||||||
.alarmInfo-visitation{
|
|
||||||
width: 100%;
|
|
||||||
height: 50%;
|
|
||||||
background: url(@/assets/patrolmonitor/xsjk_640.png);
|
|
||||||
background-size: 100% 100%;
|
|
||||||
}
|
|
||||||
.alarmimg{
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100% - 65px);
|
|
||||||
display:flex;
|
|
||||||
align-items:center;
|
|
||||||
justify-content:center;
|
|
||||||
font-family: 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.searchButton {
|
|
||||||
// border: #059a67 solid 1px;
|
|
||||||
// background-color: #08503a;
|
|
||||||
// color: #00F9A2;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
.marginright{
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,611 +0,0 @@
|
|||||||
<script lang="ts">
|
|
||||||
export default {
|
|
||||||
name: "todoPlan",
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
// 任务执行计划
|
|
||||||
import { ref, onMounted, nextTick } from "vue";
|
|
||||||
import { getTreefirst } from "@/api/device";
|
|
||||||
import {
|
|
||||||
getTaskByStationId,
|
|
||||||
getTaskToDoList,
|
|
||||||
getTaskToDo
|
|
||||||
} from "@/api/task";
|
|
||||||
import { getDeviceByType } from "@/api/device";
|
|
||||||
import { useAppStore } from '@/store/modules/app';
|
|
||||||
import Page from '@/components/Pagination/page.vue';
|
|
||||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
|
||||||
//左侧树形控件
|
|
||||||
interface Tree {
|
|
||||||
[x: string]: any;
|
|
||||||
label: string;
|
|
||||||
children?: Tree[];
|
|
||||||
}
|
|
||||||
const defaultProps = {
|
|
||||||
children: "children",
|
|
||||||
label: "taskName"
|
|
||||||
};
|
|
||||||
const taskName = ref("");
|
|
||||||
const treedata: any = ref([]);
|
|
||||||
const treeRef = ref();
|
|
||||||
const treeloading = ref(true);
|
|
||||||
const currentNodeKey = ref("");
|
|
||||||
const patrolData: any = ref();
|
|
||||||
const querydata: any = ref();
|
|
||||||
const taskId = ref("");
|
|
||||||
//获取企业树形信息
|
|
||||||
const value = ref()
|
|
||||||
const optionSelect = ref()
|
|
||||||
function getSelect() {
|
|
||||||
getTreefirst().then((res: any) => {
|
|
||||||
optionSelect.value = res.data
|
|
||||||
value.value = res.data[0].stationName
|
|
||||||
getTree(res.data[0].stationId)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function qublicQuery() { // 前端通过任务名称查询
|
|
||||||
let arr = []
|
|
||||||
let newPublicData = JSON.parse(JSON.stringify(querydata.value))
|
|
||||||
if (taskName.value != '') {
|
|
||||||
newPublicData.forEach((item: any) => {
|
|
||||||
if (item.taskName.toLowerCase().indexOf(taskName.value.toLowerCase()) !== -1) {
|
|
||||||
arr.push(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
arr = newPublicData
|
|
||||||
}
|
|
||||||
treedata.value = arr
|
|
||||||
currentNodeKey.value = ""
|
|
||||||
taskId.value = ""
|
|
||||||
tableData.value = []
|
|
||||||
nextTick(() => {
|
|
||||||
if (treedata.value.length != 0) {
|
|
||||||
currentNodeKey.value = treedata.value[0].taskId
|
|
||||||
taskId.value = treedata.value[0].taskId
|
|
||||||
getData()
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
function getTree(val: any) { // 左侧巡查任务Data
|
|
||||||
const params = {
|
|
||||||
stationId: val
|
|
||||||
}
|
|
||||||
treeloading.value = true
|
|
||||||
getTaskByStationId(params).then((res: any) => {
|
|
||||||
treedata.value = []
|
|
||||||
querydata.value = []
|
|
||||||
if (res.data != null && res.data.length != 0) {
|
|
||||||
treedata.value = JSON.parse(JSON.stringify(res.data))
|
|
||||||
querydata.value = JSON.parse(JSON.stringify(res.data))
|
|
||||||
}
|
|
||||||
|
|
||||||
treeloading.value = false
|
|
||||||
loading.value = true
|
|
||||||
currentNodeKey.value = ""
|
|
||||||
taskId.value = ""
|
|
||||||
nextTick(() => {
|
|
||||||
if (res.data.length != 0) {
|
|
||||||
currentNodeKey.value = res.data[0].taskId
|
|
||||||
taskId.value = treedata.value[0].taskId
|
|
||||||
}
|
|
||||||
getData()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch((error: any) => {
|
|
||||||
treeloading.value = false
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
// 导航树点击事件
|
|
||||||
function handleNodeClick(data: Tree, node: any) {
|
|
||||||
taskId.value = data.taskId;
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
// 右侧表格
|
|
||||||
|
|
||||||
const deviceName = ref('')
|
|
||||||
const tableData: any = ref()
|
|
||||||
const loading = ref(false)
|
|
||||||
const paramstable = ref({
|
|
||||||
size: 10,
|
|
||||||
current: 1,
|
|
||||||
deviceName: '',
|
|
||||||
type: '',
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
const taskInfo: any = ref({
|
|
||||||
taskName: ""
|
|
||||||
})
|
|
||||||
const total = ref()
|
|
||||||
function getData() {
|
|
||||||
loading.value = true
|
|
||||||
const params = {
|
|
||||||
taskId: taskId.value,
|
|
||||||
taskState: tabs.value,
|
|
||||||
current: paramstable.value.current,
|
|
||||||
size: paramstable.value.size,
|
|
||||||
}
|
|
||||||
if (taskId.value == "") {
|
|
||||||
tableData.value = []
|
|
||||||
loading.value = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
getTaskToDoList(params).then((res: any) => {
|
|
||||||
tableData.value = res.data.records
|
|
||||||
total.value = res.data.total
|
|
||||||
paramstable.value.size = res.data.size
|
|
||||||
paramstable.value.current = res.data.current
|
|
||||||
loading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const tabs = ref(0)
|
|
||||||
function tabClick(num: any) {
|
|
||||||
tabs.value = num
|
|
||||||
paramstable.value.current = 1
|
|
||||||
getData()
|
|
||||||
}
|
|
||||||
//弹窗关闭
|
|
||||||
const infoForm = ref()
|
|
||||||
function handleClose() {
|
|
||||||
if (infoForm.value != null) infoForm.value.resetFields();
|
|
||||||
dialogVisible.value = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
const dialogVisible = ref(false);
|
|
||||||
const title = ref("");
|
|
||||||
|
|
||||||
//查看
|
|
||||||
function handleView(row: any) {
|
|
||||||
title.value = "查看";
|
|
||||||
const params = {
|
|
||||||
taskTodoId: row.taskTodoId,
|
|
||||||
|
|
||||||
}
|
|
||||||
getTaskToDo(params).then((res: any) => {
|
|
||||||
taskInfo.value = res.data
|
|
||||||
patrolData.value = res.data.taskResult
|
|
||||||
})
|
|
||||||
dialogVisible.value = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
const TaskTypeData: any = ref();
|
|
||||||
const InspectionTypeData: any = ref();
|
|
||||||
const TaskPriorityData: any = ref();
|
|
||||||
function getDict() {
|
|
||||||
const params = {
|
|
||||||
dictcode: 'TaskType'
|
|
||||||
}
|
|
||||||
getDeviceByType(params).then((res: any) => {
|
|
||||||
TaskTypeData.value = res.data
|
|
||||||
})
|
|
||||||
const paramsss = {
|
|
||||||
dictcode: 'InspectionType'
|
|
||||||
}
|
|
||||||
getDeviceByType(paramsss).then((res: any) => {
|
|
||||||
InspectionTypeData.value = res.data
|
|
||||||
})
|
|
||||||
const paramss = {
|
|
||||||
dictcode: 'TaskPriority'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
getDeviceByType(paramss).then((res: any) => {
|
|
||||||
TaskPriorityData.value = res.data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function currency(list: any, itemcode: any) {
|
|
||||||
let dictname = ''
|
|
||||||
list.forEach((element: any) => {
|
|
||||||
if (element.itemcode == itemcode) {
|
|
||||||
dictname = element.dictname
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return dictname
|
|
||||||
}
|
|
||||||
//获取用户列表信息
|
|
||||||
onMounted(() => {
|
|
||||||
getDict();
|
|
||||||
getSelect();
|
|
||||||
});
|
|
||||||
|
|
||||||
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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="faulttemplate-box">
|
|
||||||
<aside id="silderLeft">
|
|
||||||
<el-select v-model="value" placeholder=""
|
|
||||||
style="width: 100% !important; padding:5px; display: flex; justify-content: center" @change="getTree">
|
|
||||||
<el-option v-for="item in optionSelect" :key="item.stationId" :label="item.stationName"
|
|
||||||
:value="item.stationId" style="width:100%" />
|
|
||||||
</el-select>
|
|
||||||
|
|
||||||
|
|
||||||
<el-input v-model="taskName" placeholder="请输入任务名称" @input="qublicQuery()" style="width: 100% ; padding:5px;" />
|
|
||||||
<el-scrollbar height="calc(100vh - 250px)">
|
|
||||||
<el-tree ref="treeRef" :class="useAppStore().size === 'default' ? 'silderLeft-large' : 'silderLeft-default'"
|
|
||||||
node-key="taskId" :data="treedata" :current-node-key="currentNodeKey" :highlight-current="true"
|
|
||||||
:props="defaultProps" v-loading="treeloading" @node-click="handleNodeClick">
|
|
||||||
<template #default="{ node, data }">
|
|
||||||
<div class="custom-tree-node" style="display: flex; align-items: center;">
|
|
||||||
<svg v-if="data.type == 1" style="margin-right:5px" version="1.1" id="图层_1"
|
|
||||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
width="16" height="16" viewBox="0 0 16 16" xml:space="preserve">
|
|
||||||
<title>例行巡视</title>
|
|
||||||
<path class="st0" d="M14,6.3V1.5H1.3v13.2H8c0.3,0,0.5,0.2,0.6,0.4c0,0,0,0,0,0c0.2,0.5-0.1,1-0.6,1H0.5c-0.3,0-0.6-0.3-0.6-0.6V0.7
|
|
||||||
c0-0.3,0.3-0.6,0.6-0.6h14.3c0.3,0,0.6,0.3,0.6,0.6v5.6c0,0.4-0.3,0.7-0.7,0.7C14.3,7,14,6.7,14,6.3L14,6.3z M8.7,4.4h3.4
|
|
||||||
c0.4,0,0.7,0.3,0.7,0.7c0,0.4-0.3,0.7-0.7,0.7H8.7c-0.4,0-0.7-0.3-0.7-0.7C7.9,4.8,8.3,4.4,8.7,4.4z M2.5,5.1c0.2-0.3,0.7-0.4,1-0.1
|
|
||||||
c0.2,0.2,0.5,0.2,0.7,0l1.2-1.2c0.3-0.3,0.7-0.3,1,0.1l0,0c0.2,0.3,0.2,0.6-0.1,0.9L4.3,6.8C4.2,6.9,4.1,7,3.9,7S3.6,6.9,3.5,6.8
|
|
||||||
L2.6,5.9C2.4,5.7,2.3,5.3,2.5,5.1z M2.5,9.6c0.2-0.3,0.7-0.4,1-0.1c0.2,0.2,0.5,0.2,0.7,0l1.2-1.2c0.3-0.3,0.7-0.3,1,0.1l0,0
|
|
||||||
c0.2,0.3,0.2,0.6-0.1,0.9l-2.1,2.1c-0.1,0.1-0.3,0.2-0.4,0.2c-0.2,0-0.3-0.1-0.4-0.2l-0.9-0.9C2.4,10.3,2.3,9.9,2.5,9.6z M12.7,11.8
|
|
||||||
h-2.3c0,0,0,0.1,0,0.1v2.7h2.3v-2.7C12.7,11.9,12.7,11.8,12.7,11.8z M13.2,10.2l0.2-0.3c0.2-0.3,0-0.7-0.4-0.7h-3
|
|
||||||
c-0.3,0-0.5,0.4-0.4,0.7l0.2,0.3c0.1,0.1,0.2,0.2,0.4,0.2h2.7C13,10.4,13.2,10.3,13.2,10.2z M9.3,15.4V12c0-0.1,0-0.2-0.1-0.3
|
|
||||||
L7.2,8.3C7.2,8.2,7.2,8.1,7.2,8c0.1-0.1,0.1-0.1,0.3-0.1h8.1c0.1,0,0.2,0.1,0.3,0.1c0.1,0.1,0,0.2,0,0.3l-1.9,3.4
|
|
||||||
c-0.1,0.1-0.1,0.2-0.1,0.3v3.4c0,0.3-0.3,0.6-0.6,0.6H9.8C9.5,16,9.3,15.8,9.3,15.4z"
|
|
||||||
fill="currentColor" />
|
|
||||||
</svg>
|
|
||||||
<svg v-if="data.type == 2" style="margin-right:5px" version="1.1" id="图层_1"
|
|
||||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
width="16" height="16" viewBox="0 0 16 16" xml:space="preserve">
|
|
||||||
<title>特殊巡视</title>
|
|
||||||
<path class="st0"
|
|
||||||
d="M10.3,14.5H1.7c-0.2,0-0.4-0.2-0.4-0.4V2.7c0-0.2,0.2-0.4,0.4-0.4C2,2.3,2.3,2,2.3,1.7S2,1,1.7,1
|
|
||||||
C0.7,1,0,1.8,0,2.7v11.4c0,0.9,0.8,1.7,1.7,1.7h8.7c0.4,0,0.6-0.3,0.6-0.6C11,14.8,10.7,14.5,10.3,14.5z"
|
|
||||||
fill="currentColor" />
|
|
||||||
<path class="st0" d="M13,2.3L13,2.3c0.3,0,0.4,0.2,0.4,0.4v6c0,0.4,0.3,0.6,0.6,0.6v0c0.4,0,0.6-0.3,0.6-0.6v-6
|
|
||||||
C14.7,1.8,13.9,1,13,1h0c-0.4,0-0.6,0.3-0.6,0.6S12.6,2.3,13,2.3z" fill="currentColor" />
|
|
||||||
<rect x="4.8" y="0.7" class="st0" width="4.9" height="1.3" fill="currentColor" />
|
|
||||||
<rect x="2.9" y="-0.2" class="st0" width="1.3" height="2.3" fill="currentColor" />
|
|
||||||
<rect x="10.3" y="-0.2" class="st0" width="1.3" height="2.3" fill="currentColor" />
|
|
||||||
<path class="st0" d="M15.5,12.7c-0.1-0.2-0.3-0.4-0.6-0.4h-2.7l0.8-0.8c0.3-0.3,0.3-0.6,0-0.9c-0.2-0.3-0.6-0.3-0.9,0l-1.9,1.9
|
|
||||||
c-0.2,0.2-0.2,0.5-0.1,0.7c0.1,0.2,0.3,0.4,0.6,0.4h2.7l-0.7,0.7c-0.3,0.3-0.3,0.6,0,0.9c0.1,0.1,0.3,0.2,0.5,0.2
|
|
||||||
c0.2,0,0.3-0.1,0.5-0.2l1.8-1.8C15.6,13.2,15.6,13,15.5,12.7z" fill="currentColor" />
|
|
||||||
<path class="st0"
|
|
||||||
d="M3.3,6h7.9c0.4,0,0.6-0.3,0.6-0.6c0-0.4-0.3-0.6-0.6-0.6H3.3C2.9,4.7,2.7,5,2.7,5.3C2.7,5.7,2.9,6,3.3,6z"
|
|
||||||
fill="currentColor" />
|
|
||||||
<path class="st0" d="M3.3,12.4h2.5c0.4,0,0.6-0.3,0.6-0.6c0-0.4-0.3-0.6-0.6-0.6H3.3c-0.4,0-0.6,0.3-0.6,0.6
|
|
||||||
C2.7,12.1,2.9,12.4,3.3,12.4z" fill="currentColor" />
|
|
||||||
<path class="st0"
|
|
||||||
d="M3.3,9.2h7.4c0.4,0,0.6-0.3,0.6-0.6S11,7.9,10.7,7.9H3.3c-0.4,0-0.6,0.3-0.6,0.6S2.9,9.2,3.3,9.2z"
|
|
||||||
fill="currentColor" />
|
|
||||||
|
|
||||||
</svg>
|
|
||||||
<svg v-if="data.type == 3" style="margin-right:5px" version="1.1" id="图层_1"
|
|
||||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
width="16" height="16" viewBox="0 0 16 16" xml:space="preserve">
|
|
||||||
<title>专项巡视</title>
|
|
||||||
<path class="st0"
|
|
||||||
d="M1.9,14.8c-0.1-0.1-0.2-0.3-0.2-0.5V1.8c0-0.2,0.1-0.4,0.2-0.5C2,1.1,2.2,1,2.4,1h7.4v2.5
|
|
||||||
c0,0.8,0.7,1.5,1.5,1.5h2.5l0,1.1h1l0-2.1l-4-4.1H2.1C1.3,0,0.7,0.7,0.6,1.5v12.9c0,0.8,0.7,1.5,1.5,1.5h6.3l0-1H2.4
|
|
||||||
C2.2,15,2,14.9,1.9,14.8z M10.8,1.2l2.8,2.9h-2.1c-0.2,0-0.4-0.1-0.5-0.2c-0.1-0.1-0.2-0.3-0.2-0.5L10.8,1.2z"
|
|
||||||
fill="currentColor" />
|
|
||||||
<path class="st0" d="M7.9,7.8L7.9,7.8l-4.1,0c-0.3,0-0.6,0.2-0.6,0.5c0,0.3,0.2,0.5,0.6,0.5h4.1c0.3,0,0.6-0.2,0.6-0.5
|
|
||||||
C8.4,8.1,8.2,7.8,7.9,7.8z" fill="currentColor" />
|
|
||||||
<path class="st0" d="M14.5,7.3h-3.8c-0.5,0-1,0.4-1,1v6.4c0,0.5,0.4,1,1,1c0,0,0.1,0,0.2-0.1c0,0,1.7-1.7,1.7-1.7s1.6,1.7,1.7,1.7
|
|
||||||
c0.1,0.1,0.2,0.1,0.2,0.1c0.5,0,1-0.4,1-1V8.2C15.5,7.7,15,7.3,14.5,7.3z M14.5,14.2c0,0.1-0.1,0.2-0.2,0.2l-1.8-1.6l-1.8,1.6
|
|
||||||
c-0.1,0-0.2-0.1-0.2-0.2V8.4c0-0.1,0.1-0.2,0.2-0.2h3.5c0.1,0,0.2,0.1,0.2,0.2V14.2z"
|
|
||||||
fill="currentColor" />
|
|
||||||
<path class="st0" d="M3.7,10.8c-0.3,0-0.6,0.2-0.6,0.5c0,0.3,0.2,0.5,0.6,0.5h4.1c0.3,0,0.6-0.2,0.6-0.5c0-0.3-0.2-0.5-0.6-0.5H3.7
|
|
||||||
z" fill="currentColor" />
|
|
||||||
</svg>
|
|
||||||
<svg v-if="data.type == 4" style="margin-right:5px" version="1.1" id="图层_1"
|
|
||||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
width="16" height="16" viewBox="0 0 16 16" xml:space="preserve">
|
|
||||||
<title>自定义巡视</title>
|
|
||||||
<path class="st0" d="M13.8,9.2c-0.3,0-0.6,0.3-0.6,0.6v4.9H2.1V1.2h9l2.1,2.3v2c0,0.3,0.3,0.6,0.6,0.6c0.3,0,0.6-0.3,0.6-0.6V3.3
|
|
||||||
c0-0.2-0.1-0.3-0.2-0.4l-2.5-2.7C11.7,0.1,11.5,0,11.3,0H1.5C1.2,0,0.9,0.3,0.9,0.6v14.8c0,0.3,0.3,0.6,0.6,0.6h12.3
|
|
||||||
c0.3,0,0.6-0.3,0.6-0.6V9.8C14.4,9.5,14.1,9.2,13.8,9.2z" fill="currentColor" />
|
|
||||||
<path class="st0" d="M15.5,6.4c-0.2-0.3-0.6-0.3-0.9-0.1l-8.6,6.2c0,0,0,0,0,0c-0.3,0.2-0.3,0.6-0.1,0.9c0.1,0.2,0.3,0.3,0.5,0.3
|
|
||||||
c0.1,0,0.3,0,0.4-0.1l8.6-6.2C15.7,7.1,15.7,6.7,15.5,6.4z" fill="currentColor" />
|
|
||||||
<path class="st0"
|
|
||||||
d="M8.9,3.7H4C3.6,3.7,3.3,4,3.3,4.3c0,0.3,0.3,0.6,0.6,0.6h4.9c0.3,0,0.6-0.3,0.6-0.6C9.5,4,9.2,3.7,8.9,3.7z"
|
|
||||||
fill="currentColor" />
|
|
||||||
<path class="st0"
|
|
||||||
d="M8.9,7.4H4C3.6,7.4,3.3,7.7,3.3,8S3.6,8.6,4,8.6h4.9c0.3,0,0.6-0.3,0.6-0.6S9.2,7.4,8.9,7.4z"
|
|
||||||
fill="currentColor" />
|
|
||||||
</svg>
|
|
||||||
<span>{{ data.taskName }}</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-tree>
|
|
||||||
</el-scrollbar>
|
|
||||||
<div class="moveBtn" v-move>
|
|
||||||
<div class="moveBtn-line" v-move></div>
|
|
||||||
</div>
|
|
||||||
</aside>
|
|
||||||
<section class="silderRight">
|
|
||||||
<div class="draggable">
|
|
||||||
<div class="tabbas">
|
|
||||||
<div @click="tabClick(0)" :class="tabs == 0 ? 'tabbas1' : ''">待执行</div>
|
|
||||||
<div @click="tabClick(1)" :class="tabs == 1 ? 'tabbas1' : ''">历史执行</div>
|
|
||||||
</div>
|
|
||||||
<el-table v-loading="loading" :data="tableData" style="width: 100%;margin-bottom: 15px;" row-key="id" border
|
|
||||||
default-expand-all stripe :header-cell-style="tableBg" :height="'calc(100vh - 280px)'">
|
|
||||||
<el-table-column type="index" label="序号" width="80" align="center" />
|
|
||||||
<el-table-column label="任务编号" prop="taskCode" min-width="110"></el-table-column>
|
|
||||||
<el-table-column label="巡视类型" prop="type" min-width="120">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ currency(InspectionTypeData, scope.row.type) }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="任务类型" prop="taskType" min-width="120">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ currency(TaskTypeData, scope.row.taskType) }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="优先级" prop="priority" min-width="120">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ currency(TaskPriorityData, scope.row.priority) }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="计划执行时间" prop="planStartTime" width="210"></el-table-column>
|
|
||||||
<el-table-column v-if="tabs == 1" label="执行时间" prop="startTime" width="210"></el-table-column>
|
|
||||||
<el-table-column label="状态" prop="taskState" width="100">
|
|
||||||
<template #default="scope">
|
|
||||||
<span v-if="scope.row.taskState == 0">待执行</span>
|
|
||||||
<span v-if="scope.row.taskState == 1">已执行</span>
|
|
||||||
<span v-if="scope.row.taskState == 2">正在执行</span>
|
|
||||||
<span v-if="scope.row.taskState == 3">暂停</span>
|
|
||||||
<span v-if="scope.row.taskState == 4">终止</span>
|
|
||||||
<span v-if="scope.row.taskState == 5">未执行</span>
|
|
||||||
<span v-if="scope.row.taskState == 6">超期</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="操作" width="90" fixed="right" align="center"
|
|
||||||
style="display: flex; display: -webkit-flex;">
|
|
||||||
<template #default="scope">
|
|
||||||
<span
|
|
||||||
style="display: flex;display: -webkit-flex; justify-content: space-around;-webkit-justify-content: space-around; ">
|
|
||||||
<img src="@/assets/tableIcon/xsjk_ckxq.png" alt="" title="查看详情" @click="handleView(scope.row)"
|
|
||||||
style="cursor: pointer;">
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
<Page :total="total" v-model:size="paramstable.size" v-model:current="paramstable.current"
|
|
||||||
@pagination="getData()"></Page>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<Eldialog v-model="dialogVisible" @before-close="handleClose" title="详情" append-to-body width="1175px" draggable>
|
|
||||||
<template v-slot:PopFrameContent>
|
|
||||||
<div class="displayflex">
|
|
||||||
<div class="line"></div>
|
|
||||||
<div class="title">基本信息</div>
|
|
||||||
</div>
|
|
||||||
<div class="displayflextext" style="margin-bottom:20px">
|
|
||||||
<div>任务编码:</div>
|
|
||||||
<div style="width: 160px;">{{ taskInfo.taskCode }}</div>
|
|
||||||
<div>任务名称:</div>
|
|
||||||
<div style="width: 200px;">{{ taskInfo.taskName }}</div>
|
|
||||||
<div>巡视类型:</div>
|
|
||||||
<div style="width: 150px;">{{ currency(InspectionTypeData, taskInfo.type) }}</div>
|
|
||||||
<div>优先级:</div>
|
|
||||||
<div style="width: 100px;">{{ currency(TaskPriorityData, taskInfo.priority) }}</div>
|
|
||||||
<div>计划执行时间:</div>
|
|
||||||
<div>{{ taskInfo.planStartTime }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="displayflextext">
|
|
||||||
<div v-if="tabs == 1">执行时间:</div>
|
|
||||||
<div v-if="tabs == 1" style="width: 160px;">{{ taskInfo.startTime }}</div>
|
|
||||||
<div>任务状态:</div>
|
|
||||||
<div style="width: 200px;">
|
|
||||||
<span v-if="taskInfo.taskState == 0">待执行</span>
|
|
||||||
<span v-if="taskInfo.taskState == 1">已执行</span>
|
|
||||||
<span v-if="taskInfo.taskState == 2">正在执行</span>
|
|
||||||
<span v-if="taskInfo.taskState == 3">暂停</span>
|
|
||||||
<span v-if="taskInfo.taskState == 4">终止</span>
|
|
||||||
<span v-if="taskInfo.taskState == 5">未执行</span>
|
|
||||||
<span v-if="taskInfo.taskState == 6">超期</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="displayflex">
|
|
||||||
<div class="line"></div>
|
|
||||||
<div class="title">巡视点位</div>
|
|
||||||
</div>
|
|
||||||
<el-table :data="patrolData" style="width: 100%;" row-key="id" border default-expand-all
|
|
||||||
ref="multipleTableReflist"
|
|
||||||
:header-cell-style="tableBg" stripe
|
|
||||||
:height="'calc(100vh - 320px)'">
|
|
||||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
|
||||||
<el-table-column label="巡视点位名称" prop="deviceName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="所属变电站" prop="stationName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="所属区域" prop="areaName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="所属间隔" prop="bayName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="所属主设备" prop="mainDeviceName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="所属部件" prop="componentName" show-overflow-tooltip></el-table-column>
|
|
||||||
<el-table-column label="摄像头" prop="patroldeviceName"></el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</template>
|
|
||||||
</Eldialog>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.faulttemplate-box {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
display: -webkit-flex;
|
|
||||||
padding-top:60px;
|
|
||||||
// background-color: #f2f4f9;
|
|
||||||
|
|
||||||
}
|
|
||||||
.silderRight {
|
|
||||||
flex: 1;
|
|
||||||
width: 100%;
|
|
||||||
height: calc(100vh - 155px);
|
|
||||||
overflow: auto;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 15px;
|
|
||||||
padding-bottom: 0px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin-left: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// :deep(.el-tree-node.is-current>.el-tree-node__content) {
|
|
||||||
// width: 100%;
|
|
||||||
// height: 40px;
|
|
||||||
// background-color: #179f84 !important;
|
|
||||||
// color: #fff !important;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// :deep(.el-select .el-input.is-focus .el-input__wrapper) {
|
|
||||||
// box-shadow: 0 0 0 1px #179f84 inset !important;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// :deep(.el-select .el-input__wrapper.is-focus) {
|
|
||||||
// box-shadow: 0 0 0 1px #179f84 inset !important;
|
|
||||||
// }
|
|
||||||
|
|
||||||
:deep(.el-tree-node__content) {
|
|
||||||
width: 100% !important;
|
|
||||||
height: 40px !important;
|
|
||||||
margin: auto !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-form-item) {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-form-item__label) {
|
|
||||||
width: 115px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-dialog) {
|
|
||||||
margin-top: 20px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-form-item__error) {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:deep(.el-tooltip__trigger) {
|
|
||||||
width: 100% !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
//tabs
|
|
||||||
.tabbas {
|
|
||||||
width: 100%;
|
|
||||||
border-bottom: 1px solid #009bff;
|
|
||||||
display: flex;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
color:#B5D7FF;
|
|
||||||
|
|
||||||
div {
|
|
||||||
width: 70px;
|
|
||||||
height: 51px;
|
|
||||||
line-height: 51px;
|
|
||||||
margin-left: 10px;
|
|
||||||
text-align: center;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tabbas1 {
|
|
||||||
width: 70px;
|
|
||||||
height: 51px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 51px;
|
|
||||||
color: #009bff !important;
|
|
||||||
border-bottom: 3px solid #009bff !important;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin-left: 10px;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.displayflex {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
|
|
||||||
.line {
|
|
||||||
width: 5px;
|
|
||||||
height: 14px;
|
|
||||||
background: #009bff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
padding-left: 10px;
|
|
||||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
|
||||||
font-weight: 700;
|
|
||||||
font-style: normal;
|
|
||||||
font-size: 16px;
|
|
||||||
color: rgb(181, 215, 255);
|
|
||||||
text-decoration: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.displayflextext {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom: 40px;
|
|
||||||
font-family: 微软雅黑;
|
|
||||||
font-weight: 400;
|
|
||||||
font-style: normal;
|
|
||||||
color: rgb(181, 215, 255);
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg:hover {
|
|
||||||
fill: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 拖动条 */
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#silderLeft {
|
|
||||||
width: 300px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
border-radius: 3px;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
.moveBtn {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}</style>
|
|
||||||
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
巡视任务展示
|
|
||||||
</div>
|
|
||||||
</template>
|
|
File diff suppressed because it is too large
Load Diff
@ -25,7 +25,7 @@ export default ({ mode }: ConfigEnv): UserConfig => {
|
|||||||
proxy: {
|
proxy: {
|
||||||
[env.VITE_APP_BASE_API]: {
|
[env.VITE_APP_BASE_API]: {
|
||||||
// 线上API地址
|
// 线上API地址
|
||||||
target: 'http://192.168.1.20:8070/',
|
target: 'http://192.168.1.20:8090/',
|
||||||
// 本地API地址
|
// 本地API地址
|
||||||
// target: 'http://192.168.1.152:8080/riis-system',
|
// target: 'http://192.168.1.152:8080/riis-system',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
Loading…
Reference in New Issue
Block a user