Merge remote-tracking branch 'origin/master'

This commit is contained in:
weitang 2025-04-24 18:16:13 +08:00
commit 94b13ac2f7
26 changed files with 1 additions and 14961 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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
+ '&current=' + 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

View File

@ -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&&currency(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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,5 +0,0 @@
<template>
<div>
巡视任务展示
</div>
</template>

File diff suppressed because it is too large Load Diff

View File

@ -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,