5-19会后bug修改
This commit is contained in:
parent
da1c45f4c6
commit
5aa90c2fcc
@ -22,12 +22,14 @@
|
||||
"dayjs": "^1.11.10",
|
||||
"default-passive-events": "^2.0.0",
|
||||
"docx-preview": "^0.1.15",
|
||||
"dompurify": "^3.2.6",
|
||||
"echarts": "^5.2.2",
|
||||
"element-plus": "^2.2.27",
|
||||
"gm-crypt": "^0.0.2",
|
||||
"js-base64": "^3.7.5",
|
||||
"js-cookie": "^3.0.1",
|
||||
"jsencrypt": "^3.3.2",
|
||||
"markdown-it": "^14.1.0",
|
||||
"moment": "^2.29.4",
|
||||
"nprogress": "^0.2.0",
|
||||
"path-browserify": "^1.0.1",
|
||||
@ -51,6 +53,7 @@
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^18.4.3",
|
||||
"@commitlint/config-conventional": "^16.2.1",
|
||||
"@types/dompurify": "^3.0.5",
|
||||
"@types/node": "^20.3.1",
|
||||
"@types/nprogress": "^0.2.0",
|
||||
"@types/path-browserify": "^1.0.0",
|
||||
|
@ -3,5 +3,7 @@ window.webConfig = {
|
||||
"wsApiBaseUrl": "ws://192.168.1.20:8090/",
|
||||
"webApiMonitorUrl": "http://192.168.1.20:18080",
|
||||
"answeringUrl":"http://121.37.111.42:8080/ui/chat/a9d56e68484c5594",
|
||||
"pythonUrl":"http://121.37.111.42:8080/api",
|
||||
"application_id":"6b915c22-351c-11f0-8b7c-0242ac130003",
|
||||
"webSystemTitle":"标题"
|
||||
}
|
@ -1,11 +1,24 @@
|
||||
<script setup lang="ts">
|
||||
import { ElConfigProvider } from 'element-plus';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
// import { nextTick } from 'process';
|
||||
import { ref, nextTick, provide } from 'vue';
|
||||
const appStore = useAppStore();
|
||||
|
||||
const isRouterAlive = ref(true)
|
||||
const reload = () => {
|
||||
isRouterAlive.value = false;
|
||||
nextTick(() => {
|
||||
isRouterAlive.value = true;
|
||||
});
|
||||
}
|
||||
provide('reload', reload)
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-config-provider :locale="appStore.locale" :size="appStore.size">
|
||||
<router-view />
|
||||
<router-view v-if="isRouterAlive" />
|
||||
</el-config-provider>
|
||||
</template>
|
||||
|
@ -31,4 +31,13 @@ export function getHistoricalCurve(params:any){
|
||||
method: 'get',
|
||||
params:params
|
||||
});
|
||||
}
|
||||
//导出环境历史数据
|
||||
export function exportDeviceWorkData(params:any){
|
||||
return request({
|
||||
url: '/auxcontrol/device-work-data/exportDeviceWorkData' ,
|
||||
method: 'get',
|
||||
params:params,
|
||||
responseType: 'arraybuffer'
|
||||
});
|
||||
}
|
@ -27,9 +27,9 @@ export function getTaskToDo(params:any){
|
||||
}
|
||||
|
||||
//分页查询检修计划
|
||||
export function getTaskList(params:any){
|
||||
export function getExaminePlanPage(params:any){
|
||||
return request({
|
||||
url: '/patroltasks/examine-plan/getTaskList' ,
|
||||
url: '/patroltasks/examine-plan/getExaminePlanPage' ,
|
||||
method: 'get',
|
||||
params:params
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
//获取表格内容
|
||||
export function getTaskList(params: any) {
|
||||
export function getQuartzJobList(params: any) {
|
||||
return request({
|
||||
url: '/system/quartzjob/getQuartzJobList',
|
||||
method: 'get',
|
||||
|
BIN
riis-web/src/assets/navigation/u126.png
Normal file
BIN
riis-web/src/assets/navigation/u126.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 428 B |
BIN
riis-web/src/assets/navigation/u157.png
Normal file
BIN
riis-web/src/assets/navigation/u157.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 449 B |
BIN
riis-web/src/assets/navigation/u331.png
Normal file
BIN
riis-web/src/assets/navigation/u331.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 473 B |
@ -400,6 +400,25 @@ onMounted(() => {
|
||||
audioElement.value.addEventListener('ended', () => {
|
||||
analyzer.stopAnalyze();
|
||||
});
|
||||
|
||||
// 自动播放逻辑
|
||||
if (props.fileUrl) {
|
||||
// 添加 loadeddata 事件监听器,确保音频加载完成后再播放
|
||||
const handleLoaded = () => {
|
||||
audioElement.value.play().catch(error => {
|
||||
console.error('自动播放失败:', error);
|
||||
// 提示用户需手动触发播放
|
||||
});
|
||||
};
|
||||
|
||||
// 监听 loadeddata 事件,确保音频加载完成
|
||||
audioElement.value.addEventListener('loadeddata', handleLoaded, { once: true });
|
||||
|
||||
// 如果音频已加载完成,直接播放(如缓存情况)
|
||||
if (audioElement.value.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA) {
|
||||
handleLoaded();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
@ -413,30 +432,40 @@ onBeforeUnmount(() => {
|
||||
/**
|
||||
* 文件URL变更监听器
|
||||
*/
|
||||
watch(() => props.fileUrl, async () => {
|
||||
watch(() => props.fileUrl, async () => {
|
||||
try {
|
||||
// 停止当前分析
|
||||
if (analyzer) {
|
||||
analyzer.stopAnalyze();
|
||||
await analyzer.audioContext.close();
|
||||
}
|
||||
|
||||
// 重置图表
|
||||
chartInstance.setOption({
|
||||
series: [{ data: [] }, { data: [] }, { data: [] }],
|
||||
graphic: [{ invisible: true }]
|
||||
}, true);
|
||||
|
||||
// 等待DOM更新
|
||||
await new Promise(resolve => setTimeout(resolve, 50));
|
||||
|
||||
// 创建新分析器
|
||||
|
||||
analyzer = new AudioAnalyzer();
|
||||
audioElement.value.load();
|
||||
|
||||
// 重新绑定事件监听器
|
||||
audioElement.value.removeEventListener('play', playHandler);
|
||||
audioElement.value.addEventListener('play', playHandler);
|
||||
|
||||
// 添加 loadeddata 事件监听器,确保新音频加载完成后播放
|
||||
const handleLoaded = () => {
|
||||
audioElement.value.play().catch(error => {
|
||||
console.error('文件加载后自动播放失败:', error);
|
||||
});
|
||||
};
|
||||
|
||||
audioElement.value.addEventListener('loadeddata', handleLoaded, { once: true });
|
||||
|
||||
// 如果音频已加载完成,直接播放(如缓存情况)
|
||||
if (audioElement.value.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA) {
|
||||
handleLoaded();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('文件加载失败:', error);
|
||||
}
|
||||
|
@ -25,6 +25,16 @@
|
||||
</el-badge>
|
||||
<div class="header-informationImg" v-else></div>
|
||||
</div>
|
||||
<div>
|
||||
<el-select v-if="userStore.stationData.length > 1" v-model="userStore.stationId" placeholder="Select" style="width: 160px;margin-right: 15px;"
|
||||
@change="changestation()">
|
||||
<el-option v-for="item in userStore.stationData" :key="item.stationId" :label="item.stationName"
|
||||
:value="item.stationId" />
|
||||
</el-select>
|
||||
<div v-if="userStore.stationData.length == 1" style="margin-right: 15px;">
|
||||
{{ userStore.stationData[0].stationName }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="nav-right-text" style="margin-right: 20px;">
|
||||
<div class="header-left-time" style="padding: 0;">用户名:{{ userStore.username }}</div>
|
||||
<!-- <div class="header-left-time" style="padding-top: 10px;">变电站:{{ userStore.regionName }}</div> -->
|
||||
@ -39,7 +49,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, onBeforeUnmount, nextTick, watch } from 'vue';
|
||||
import { ref, onMounted, onBeforeUnmount, nextTick, watch, inject } from 'vue';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import { getOneById, downloadConfigFile } from "@/api/versionVersioning";
|
||||
import Cookies from 'js-cookie';
|
||||
@ -54,6 +64,7 @@ import { getNotCheckAlarmCount } from '@/api/home';
|
||||
import { constantRoutes } from '@/router';
|
||||
import { useFullscreen } from '@vueuse/core';
|
||||
import { downloadFile } from '@/utils/index';
|
||||
const reload: any = inject('reload')
|
||||
const props = defineProps({
|
||||
CloseNav: {
|
||||
required: false,
|
||||
@ -106,6 +117,10 @@ function dateFormat(row: any) {
|
||||
return year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds;
|
||||
}
|
||||
}
|
||||
function changestation() {
|
||||
userStore.stationCode = userStore.stationData.find((item:any) => item.stationId === userStore.stationId)?.stationCode;
|
||||
reload()
|
||||
}
|
||||
function alarmInfoClick() {
|
||||
router.push(`/task/alarmInfo/index`)
|
||||
// let item = {
|
||||
@ -247,6 +262,31 @@ function getData() {
|
||||
})
|
||||
}
|
||||
const routers = useRoute();
|
||||
const ws1 = new WebSocket(userStore.wsApiBaseUrl + '/websocket/check_' + userStore.stationId);
|
||||
function setupWebSocket() {
|
||||
|
||||
ws1.onopen = () => {
|
||||
console.log('WebSocket连接失败');
|
||||
};
|
||||
ws1.onerror = (error: any) => {
|
||||
};
|
||||
ws1.onmessage = (e: any) => {
|
||||
console.log('收到服务器数据:')
|
||||
getMessage()
|
||||
}
|
||||
ws1.onclose = () => {
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
function getMessage() {
|
||||
getNotCheckAlarmCount({
|
||||
stationId: userStore.stationId
|
||||
}).then((res: any) => {
|
||||
alarmCount.value = res.data.count
|
||||
userStore.alarmCount = res.data.count
|
||||
})
|
||||
}
|
||||
onMounted(() => {
|
||||
getData()
|
||||
getTimes()
|
||||
@ -263,15 +303,8 @@ onMounted(() => {
|
||||
titleData.value.push(userStore.stationData[j])
|
||||
}
|
||||
|
||||
if (userStore.stationId != undefined && userStore.stationId != "") {
|
||||
getNotCheckAlarmCount({
|
||||
stationId: userStore.stationId
|
||||
}).then((res: any) => {
|
||||
alarmCount.value = res.data.count
|
||||
userStore.alarmCount = res.data.count
|
||||
})
|
||||
}
|
||||
|
||||
getMessage()
|
||||
setupWebSocket()
|
||||
navlist.value = navlist.value.concat(userStore.menuArr)
|
||||
|
||||
for (let i = 0; i < navlist.value.length; i++) {
|
||||
@ -295,6 +328,11 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
})
|
||||
onBeforeUnmount(() => {
|
||||
if (ws1 != null) {
|
||||
ws1.close()
|
||||
}
|
||||
})
|
||||
function logout() {
|
||||
ElMessageBox.confirm('确定注销并退出系统吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
|
@ -42,6 +42,8 @@ export const useUserStore = defineStore('user', () => {
|
||||
const webApiBaseUrl:any = process.env.NODE_ENV=='development'? import.meta.env.VITE_APP_BASE_API:window.webConfig.webApiBaseUrl
|
||||
const wsApiBaseUrl:any = process.env.NODE_ENV=='development'? import.meta.env.VITE_APP_BASE_WS:window.webConfig.wsApiBaseUrl
|
||||
const answeringUrl:any = window.webConfig.answeringUrl
|
||||
const pythonUrl:any = window.webConfig.pythonUrl
|
||||
const application_id:any = window.webConfig.application_id
|
||||
const promptTitle:any = ref('')
|
||||
// actions
|
||||
|
||||
@ -51,12 +53,12 @@ export const useUserStore = defineStore('user', () => {
|
||||
loginApi(loginData)
|
||||
.then((response:any) => {
|
||||
|
||||
if(response.msg.indexOf("updatePassword_") != -1){
|
||||
if(response.msg.split('_')[1]== "initial"){
|
||||
promptTitle.value = "您的密码为初始密码,存在安全风险,请立即修改初始密码!"
|
||||
}else{
|
||||
promptTitle.value = "您的密码已到期("+ response.msg.split('_')[1] +"天),请立即修改密码!"
|
||||
}
|
||||
if (response.msg.indexOf("您的密码为初始密码,存在安全风险,请立即修改初始密码!") != -1 || response.msg.indexOf("您的密码已到期") != -1) {
|
||||
promptTitle.value = response.msg
|
||||
// if (response.msg.indexOf("您的密码为初始密码,存在安全风险,请立即修改初始密码!") != -1) {
|
||||
// } else {
|
||||
// promptTitle.value = response.msg
|
||||
// }
|
||||
isExpire.value = true
|
||||
const { token } = response.data;
|
||||
Token.value = token;
|
||||
@ -251,7 +253,9 @@ export const useUserStore = defineStore('user', () => {
|
||||
webApiMonitorUrl,
|
||||
webApiBaseUrl,
|
||||
wsApiBaseUrl,
|
||||
answeringUrl
|
||||
answeringUrl,
|
||||
pythonUrl,
|
||||
application_id
|
||||
};
|
||||
});
|
||||
|
||||
|
@ -757,7 +757,7 @@
|
||||
</Eldialog>
|
||||
<!-- 详细信息弹窗 -->
|
||||
<div class="detailed-information" v-if="information">
|
||||
<div id="detailed-information" v-drag class="examination">
|
||||
<div id="detailed-information" v-drag class="examination">
|
||||
<div class="examination-title">{{ objRow.name }}</div>
|
||||
<div class="examination-close" @click.stop="information = false"><img src="@/assets/3d/u523.png" /></div>
|
||||
<div class="examination-contont" v-if="selType == '01'">
|
||||
@ -5857,50 +5857,46 @@ function setupWebSocket() {
|
||||
|
||||
//详细信息弹窗
|
||||
.detailed-information {
|
||||
|
||||
.examination {
|
||||
width: 406px;
|
||||
height: 330px;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0px;
|
||||
z-index: 1002;
|
||||
background: url(@/assets/3d/sxjxq.png) no-repeat;
|
||||
background-size: 100% 100%;
|
||||
padding: 0 25px 15px;
|
||||
|
||||
.examination {
|
||||
width: 406px;
|
||||
position: fixed;
|
||||
background: url(@/assets/3d/sxjxq.png) no-repeat;
|
||||
|
||||
.examination-title {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 16px;
|
||||
color: #009bff;
|
||||
background: url(@/assets/3d/u714.png) no-repeat;
|
||||
background-size: 100% 100%;
|
||||
padding: 0 25px 15px;
|
||||
|
||||
.examination-title {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
text-align: center;
|
||||
line-height: 40px;
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 16px;
|
||||
color: #009bff;
|
||||
background: url(@/assets/3d/u714.png) no-repeat;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
.examination-close {
|
||||
position: absolute;
|
||||
top: 30px;
|
||||
right: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.examination-contont {
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
|
||||
.examination-contont-text {
|
||||
margin-top: 11px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.examination-close {
|
||||
position: absolute;
|
||||
top: 30px;
|
||||
right: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.examination-contont {
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
|
||||
.examination-contont-text {
|
||||
margin-top: 11px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-input-number__decrease) {
|
||||
|
@ -240,7 +240,7 @@ const multipleTableRef = ref()
|
||||
function addMaster() {
|
||||
title.value = '选择主设备'
|
||||
masterble.value = true
|
||||
getbybay()
|
||||
getQuartzJobList()
|
||||
|
||||
}
|
||||
function handleClose1() {
|
||||
@ -264,9 +264,10 @@ const multipleSelection = ref()
|
||||
function handleSelectionChange(val: any) {
|
||||
multipleSelection.value = val;
|
||||
}
|
||||
function getbybay() {
|
||||
function getQuartzJobList() {
|
||||
masterLoading.value = true
|
||||
masterform.value.algorithmId = algorithmId.value
|
||||
masterform.value.stationCode = userStore.stationCode
|
||||
getComponentPage(masterform.value).then((res: any) => {
|
||||
masterLoading.value = false
|
||||
masterdata.value = res.data.records
|
||||
@ -281,7 +282,7 @@ function addmasteras() {
|
||||
})
|
||||
batchAddAlgorithmClassComponent(multipleSelection.value).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
getbybay()
|
||||
getQuartzJobList()
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '添加成功'
|
||||
@ -295,12 +296,12 @@ const bayList: any = ref([])
|
||||
function getcomponent() {
|
||||
getSubstationBayByArea({ stationCode: userStore.stationCode, areaId: masterform.value.areaId }).then((res: any) => {
|
||||
bayList.value = res.data
|
||||
getbybay()
|
||||
getQuartzJobList()
|
||||
})
|
||||
}
|
||||
const mainList: any = ref([])
|
||||
function getmainDevice() {
|
||||
getbybay()
|
||||
getQuartzJobList()
|
||||
getSubstationMaindeviceList({ bayId: masterform.value.bayId }).then((res: any) => {
|
||||
mainList.value = res.data
|
||||
})
|
||||
@ -552,7 +553,7 @@ onMounted(() => {
|
||||
<div>算法分类</div>
|
||||
</div>
|
||||
<div class="left_title_txt" @click="addAlgorithm()">
|
||||
<img src="@/assets/navigation/u126.svg" alt="" title="新增算法">
|
||||
<img src="@/assets/navigation/u126.png" alt="" title="新增算法">
|
||||
</div>
|
||||
</div>
|
||||
<el-input v-model="algorithmClassName" clearable placeholder="请输入名称" @change="gettreedata"
|
||||
@ -593,7 +594,7 @@ onMounted(() => {
|
||||
<template #default="scope">
|
||||
<span
|
||||
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
|
||||
<img src="@/assets/newimg/ht_xg.png" alt="" title="关联" @click="editmain(scope.row)"
|
||||
<img src="@/assets/tableIcon/ht_gl.png" alt="" title="关联" @click="editmain(scope.row)"
|
||||
style="cursor: pointer;">
|
||||
<img src="@/assets/newimg/ht_sc.png" alt="" title="删除" @click="delmain(scope.row)"
|
||||
style="cursor: pointer;">
|
||||
@ -707,7 +708,7 @@ onMounted(() => {
|
||||
<template #header>
|
||||
<div class="table_header">
|
||||
<div>操作</div>
|
||||
<img src="@/assets/navigation/u331.svg" alt="" title="增加算法" @click="addAlgorithmsan">
|
||||
<img src="@/assets/navigation/u331.png" alt="" title="增加算法" @click="addAlgorithmsan">
|
||||
</div>
|
||||
</template>
|
||||
<template #default="scope">
|
||||
@ -734,7 +735,7 @@ onMounted(() => {
|
||||
style="width: 100%;display: flex;justify-content: space-between;align-items: center;margin-top: 10px;">
|
||||
<div style="width: 100%;display: flex;align-items: center;">
|
||||
<el-input v-model="masterform.componentName" placeholder="请输入部件名称" clearable
|
||||
@change="getbybay()" style="width: 220px;margin-right: 10px;" />
|
||||
@change="getQuartzJobList()" style="width: 220px;margin-right: 10px;" />
|
||||
<el-select v-model="masterform.areaId" placeholder="区域 " @change="getcomponent()"
|
||||
style="width: 220px;margin-right: 10px;" @clear="cleraareaId()" clearable>
|
||||
<el-option v-for="item in areaList" :key="item.areaId" :label="item.areaName"
|
||||
@ -747,11 +748,11 @@ onMounted(() => {
|
||||
:value="item.bayId" />
|
||||
</el-select>
|
||||
<el-select v-model="masterform.mainDeviceId" placeholder="主设备" :disabled="!masterform.bayId"
|
||||
@change="getbybay()" style="width: 220px;margin-right: 10px;" clearable>
|
||||
@change="getQuartzJobList()" style="width: 220px;margin-right: 10px;" clearable>
|
||||
<el-option v-for="item in mainList" :key="item.mainDeviceId" :label="item.mainDeviceName"
|
||||
:value="item.mainDeviceId" />
|
||||
</el-select>
|
||||
<el-button class="searchButton" type="primary" @change="getbybay()">搜索</el-button>
|
||||
<el-button class="searchButton" type="primary" @change="getQuartzJobList()">搜索</el-button>
|
||||
</div>
|
||||
<el-button class="searchButton" type="primary" @click="addmasteras()">确定</el-button>
|
||||
</div>
|
||||
@ -767,7 +768,7 @@ onMounted(() => {
|
||||
<el-table-column prop="componentName" label="部件" align="center"></el-table-column>
|
||||
</el-table>
|
||||
<Page :total="mastertotal" v-model:size="masterform.size" v-model:current="masterform.current"
|
||||
@pagination="getbybay()"></Page>
|
||||
@pagination="getQuartzJobList()"></Page>
|
||||
</template>
|
||||
</Eldialog>
|
||||
<Eldialog v-if="mainble" :title="'关联参数'" :zIndex="2000" :width="'900px'" @before-close="handleClose2">
|
||||
|
@ -12,7 +12,7 @@ import { getTreefirst } from '@/api/device';
|
||||
import { stationOnline } from '@/api/substation';
|
||||
import { useAppStore } from '@/store/modules/app';
|
||||
import {
|
||||
getTaskList,
|
||||
getExaminePlanPage,
|
||||
addExaminePlan,
|
||||
updateExaminePlan,
|
||||
deleteExaminePlan,
|
||||
@ -28,6 +28,8 @@ import { getTreeList } from '@/api/linksignal';
|
||||
import { getDeviceByType, getaccType, getMainEquipment } from '@/api/device';
|
||||
import Page from '@/components/Pagination/page.vue';
|
||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
const userStore = useUserStore();
|
||||
|
||||
// 列表页面方法和变量
|
||||
//时间转换
|
||||
@ -98,10 +100,11 @@ function getData() {
|
||||
size: paramstable.value.size,
|
||||
current: paramstable.value.current,
|
||||
configName: paramstable.value.configName,
|
||||
bindStatus: paramstable.value.bindStatus
|
||||
bindStatus: paramstable.value.bindStatus,
|
||||
stationId:userStore.stationId
|
||||
};
|
||||
planLoading.value = true;
|
||||
getTaskList(params)
|
||||
getExaminePlanPage(params)
|
||||
.then((res: any) => {
|
||||
planLoading.value = false;
|
||||
tableData.value = res.data.records;
|
||||
|
@ -7,11 +7,12 @@ export default {
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, nextTick } from "vue";
|
||||
import { Search } from '@element-plus/icons-vue';
|
||||
import { getDeviceSignalTree, querySignalDataById, workpage, getHistoricalCurve } from "@/api/datasurvey/index";
|
||||
import { getDeviceSignalTree, querySignalDataById, workpage, getHistoricalCurve, exportDeviceWorkData } from "@/api/datasurvey/index";
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import Page from '@/components/Pagination/page.vue'
|
||||
import * as echarts from 'echarts'
|
||||
import dayjs from 'dayjs'
|
||||
import { downloadFile } from '@/utils/index';
|
||||
const userStore = useUserStore();
|
||||
//左侧树形控件
|
||||
interface Tree {
|
||||
@ -38,6 +39,7 @@ const signName = ref('')
|
||||
function getTreeData() {
|
||||
treeloading.value = true
|
||||
getDeviceSignalTree(signaform.value).then((res: any) => {
|
||||
treeloading.value = false
|
||||
if (res.code == 0) {
|
||||
treedata.value = res.data
|
||||
signaId.value = res.data[0].children[0].children[0].children[0].children[0].id
|
||||
@ -49,7 +51,7 @@ function getTreeData() {
|
||||
gettabledata()
|
||||
getechartdata()
|
||||
}
|
||||
treeloading.value = false
|
||||
|
||||
})
|
||||
}
|
||||
function handleNodeClick(data: any, node: any) {
|
||||
@ -139,8 +141,9 @@ function formatDate(isoString: any) {
|
||||
}
|
||||
//折线图数据
|
||||
const echartdata: any = ref({})
|
||||
const type = ref(1)
|
||||
function getechartdata() {
|
||||
getHistoricalCurve({ signalId: signaId.value }).then((res: any) => {
|
||||
getHistoricalCurve({ signalId: signaId.value,type:type.value }).then((res: any) => {
|
||||
echartdata.value = res.data
|
||||
drawEchart()
|
||||
})
|
||||
@ -186,6 +189,22 @@ function gettoday() {
|
||||
detaall.value[1] = endTime
|
||||
getTreeData()
|
||||
}
|
||||
// //导出点位
|
||||
function exportDevice() {
|
||||
const params = {
|
||||
stationId: userStore.stationId,
|
||||
startDate: detaall.value.length > 0 ? detaall.value[0] : '',
|
||||
endDate: detaall.value.length > 0 ? detaall.value[1] : '',
|
||||
signalId: signaId.value
|
||||
}
|
||||
loading.value = true
|
||||
exportDeviceWorkData(params).then((response: any) => {
|
||||
loading.value = false
|
||||
downloadFile(response, '监测数据', 'xlsx')
|
||||
}).catch(() => {
|
||||
loading.value = false
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -267,10 +286,11 @@ function gettoday() {
|
||||
<div class="cont_top_left">
|
||||
<el-date-picker v-model="detaall" type="datetimerange" start-placeholder="开始时间"
|
||||
end-placeholder="结束时间" @change="gettabledata" />
|
||||
<el-button style="margin-left: 10px;" @click="gettabledata"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" class="searchButton">搜索</el-button>
|
||||
<el-button style="margin-left: 10px;" @click="gettabledata" :disabled="loading"
|
||||
class="searchButton">搜索</el-button>
|
||||
</div>
|
||||
<div class="cont_top_right"> <el-button class="searchButton">导出</el-button></div>
|
||||
<div class="cont_top_right"> <el-button class="searchButton"
|
||||
@click="exportDevice()">导出</el-button></div>
|
||||
</div>
|
||||
<div class="cont_bottom">
|
||||
<el-table v-loading="loading" :data="tableData" style="width: 100%;height: calc(33vh);
|
||||
@ -278,7 +298,7 @@ function gettoday() {
|
||||
:row-class-name="tableRowClassName"
|
||||
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
|
||||
<el-table-column type="index" label="序号" width="50px" align="center" />
|
||||
<el-table-column label="采集时间" prop="startTime" align="center"></el-table-column>
|
||||
<el-table-column label="采集时间" prop="startTime" align="center"></el-table-column>
|
||||
<el-table-column label="监测数值" prop="value" align="center"></el-table-column>
|
||||
<el-table-column label="单位" prop="unit" align="center"></el-table-column>
|
||||
</el-table>
|
||||
@ -289,10 +309,21 @@ function gettoday() {
|
||||
</div>
|
||||
</div>
|
||||
<div class="right_bottom">
|
||||
<div class="title_right">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>历史曲线</div>
|
||||
<div style="display: flex;align-items: center;">
|
||||
<div class="title_right" style="width: 150px;">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>历史曲线</div>
|
||||
</div>
|
||||
<!-- <el-radio-group v-model="type" >
|
||||
<el-radio-button label="分钟" :value="1" />
|
||||
<el-radio-button label="小时" :value="2" />
|
||||
</el-radio-group> -->
|
||||
<!-- <div class="">
|
||||
<div>分钟</div>
|
||||
<div>小时</div>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<div id="deviceEachers" :style="{ width: '100%', height: '90%' }"></div>
|
||||
</div>
|
||||
</section>
|
||||
@ -342,7 +373,7 @@ function gettoday() {
|
||||
|
||||
.text_top {
|
||||
width: 100%;
|
||||
margin-top:30px ;
|
||||
margin-top: 30px;
|
||||
|
||||
.text_top_title {
|
||||
display: flex;
|
||||
@ -375,6 +406,7 @@ function gettoday() {
|
||||
width: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.content_one_title {
|
||||
width: 114px;
|
||||
height: 50px;
|
||||
@ -449,7 +481,7 @@ function gettoday() {
|
||||
|
||||
:deep(.el-tree-node.is-current>.el-tree-node__content) {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
// height: 40px;
|
||||
// color: #fff !important;
|
||||
}
|
||||
|
||||
@ -538,4 +570,8 @@ function gettoday() {
|
||||
:deep(.el-tree-node__label) {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
:deep(.el-tree-node__content) {
|
||||
height: 40px !important;
|
||||
}
|
||||
</style>
|
||||
|
@ -241,8 +241,8 @@ function getechartdata() {
|
||||
type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss" />
|
||||
</div>
|
||||
<el-button class="searchButton" @click="getEnvironment()">搜索</el-button>
|
||||
<el-button class="searchButton" @click="environmentReset()">重置</el-button>
|
||||
<el-button class="searchButton" @click="getEnvironment()" :disabled="treeloading" >搜索</el-button>
|
||||
<el-button class="searchButton" @click="environmentReset()" :disabled="treeloading" >重置</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-table :data="environment_data" :row-class-name="tableRowClassName" v-loading="treeloading"
|
||||
|
@ -465,7 +465,7 @@ onMounted(() => {
|
||||
width: 281px;
|
||||
min-width: 281px;
|
||||
height: calc(100vh - 140px);
|
||||
background: url(@/assets/videoimg/xsjk_280.png) no-repeat center center;
|
||||
background: url(@/assets/navigation/ty_260x988.png);
|
||||
background-size: 100% 100%;
|
||||
:deep(.el-scrollbar) {
|
||||
height: calc(100vh - 560px);
|
||||
|
@ -102,7 +102,7 @@ const params: any = ref({
|
||||
endDate: '',
|
||||
})
|
||||
function getdata() {
|
||||
console.log(tableData.value)
|
||||
treeloading.value = true
|
||||
if (tableData.value) {
|
||||
params.value.startDate = tableData.value[0]
|
||||
params.value.endDate = tableData.value[1]
|
||||
@ -110,7 +110,7 @@ function getdata() {
|
||||
params.value.startDate = ''
|
||||
params.value.endDate = ''
|
||||
}
|
||||
|
||||
treeloading.value = false
|
||||
getVoicePatrolPage(params.value).then((res: any) => {
|
||||
environment_data.value = res.data.records
|
||||
params.value.size = res.data.size
|
||||
@ -245,7 +245,7 @@ function open(row: any) {
|
||||
style="width: 300px; margin-right: 10px;" v-model="tableData" type="daterange"
|
||||
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
|
||||
<el-button class="searchButton" @click="getdata()">搜索</el-button>
|
||||
<el-button :disabled="treeloading" class="searchButton" @click="getdata()">搜索</el-button>
|
||||
<el-input v-model="minLong" clearable placeholder="录制时长"
|
||||
style="margin-left:30px ;width: 180px;">
|
||||
<template #append>
|
||||
@ -544,7 +544,7 @@ function open(row: any) {
|
||||
height: calc(100vh - 90px);
|
||||
// border: 1px solid rgba(0, 249, 162, 0.2);
|
||||
// background: rgba(17, 52, 44, 0.9);
|
||||
background: url(@/assets/monitorsystem/spjk_ytbj.png) no-repeat center center;
|
||||
background: url(@/assets/navigation/ty_260x988.png);
|
||||
background-size: 100% 100%;
|
||||
|
||||
:deep(img) {
|
||||
|
@ -9,7 +9,7 @@
|
||||
position: fixed;
|
||||
top: 60px;
|
||||
">
|
||||
<!-- <Modelset v-if="isModelset" :isautoRotate="isautoRotate" /> -->
|
||||
<Modelset v-if="isModelset" :isautoRotate="isautoRotate" />
|
||||
</div>
|
||||
<div class="three_button" @click="autoRotateClick">
|
||||
<span v-if="isautoRotate == true">暂停</span>
|
||||
|
@ -154,7 +154,8 @@ function getData() {
|
||||
deviceName: queryparams.value.deviceName,
|
||||
deviceModel: queryparams.value.deviceModel,
|
||||
deviceType: queryparams.value.deviceType,
|
||||
status: queryparams.value.status
|
||||
status: queryparams.value.status,
|
||||
stationId: userStore.stationId
|
||||
}
|
||||
queryDevice(params).then((res: any) => {
|
||||
tableData.value = res.data.records
|
||||
|
@ -345,10 +345,10 @@ function currency1(list: any, itemcode: any) {
|
||||
<template>
|
||||
<div class="faulttemplate-box">
|
||||
<aside id="silderLeft">
|
||||
<el-input v-model="CameraName" clearable placeholder="请输入部件名称" @clear="getData()" @keyup.enter="getData()"
|
||||
<el-input v-model="CameraName" clearable placeholder="请输入部件名称" @change="init()"
|
||||
style="width:100%;margin-top: 10px;" class="videomonitor-input">
|
||||
<template #suffix>
|
||||
<img src="@/assets/videoimg/u2937.png" style="cursor:pointer ;" @click="getData">
|
||||
<img src="@/assets/videoimg/u2937.png" style="cursor:pointer ;" @click="init()">
|
||||
</template>
|
||||
</el-input>
|
||||
<el-scrollbar height="calc(83vh)">
|
||||
|
@ -74,7 +74,8 @@ function getData() {
|
||||
deviceName: queryInfo.value.deviceName,
|
||||
deviceModel: queryInfo.value.deviceModel,
|
||||
deviceType: queryInfo.value.deviceType,
|
||||
status: queryInfo.value.status
|
||||
status: queryInfo.value.status,
|
||||
stationId:userStore.stationId
|
||||
}
|
||||
getSystemDevice(params).then((res: any) => {
|
||||
tableData.value = res.data.records
|
||||
@ -190,7 +191,7 @@ function formsubmit(formEl: any) {
|
||||
return
|
||||
}
|
||||
isSwitch.value = true
|
||||
manageFromm.value.stationId = userStore.stationId
|
||||
manageFromm.value.stationId = userStore.stationId
|
||||
if (manageFromm.value.id) {
|
||||
updateSystemDevice(manageFromm.value).then((res: any) => {
|
||||
if (res.code == 0) {
|
||||
|
@ -14,11 +14,11 @@ const url = userStore.webApiBaseUrl;
|
||||
function getInit() {
|
||||
let params = {
|
||||
id: props.alarminInfo.id,
|
||||
systemType:props.alarminInfo.systemType
|
||||
systemType: props.alarminInfo.systemType
|
||||
}
|
||||
//异常事件统计
|
||||
getAlarmLogById(params).then((res: any) => {
|
||||
res.data.checkResult = '1'
|
||||
// res.data.checkResult = '1'
|
||||
examinationInfo.value = res.data
|
||||
examinationInfo.value
|
||||
})
|
||||
@ -45,7 +45,7 @@ function confirmClick() {
|
||||
checkComment: examinationInfo.value.checkComment,
|
||||
custom1: num.value,
|
||||
taskAlarmType: examinationInfo.value.taskAlarmType,
|
||||
deviceId:examinationInfo.value.deviceid
|
||||
deviceId: examinationInfo.value.deviceid
|
||||
}
|
||||
setAlarmLogStatus(temporaryInfo).then((res: any) => {
|
||||
if (res != undefined && res.code == '0') {
|
||||
@ -87,9 +87,9 @@ function getArrType() { // 查询字典方法
|
||||
}
|
||||
onMounted(() => {
|
||||
getArrType()
|
||||
getInit()
|
||||
getInit()
|
||||
// examinationInfo.value = props.alarminInfo
|
||||
|
||||
|
||||
})
|
||||
const isVideo = ref(false)
|
||||
const num = ref(0)
|
||||
@ -110,12 +110,12 @@ const num = ref(0)
|
||||
<div class="public-details-title">告警信息{{ examinationInfo.status }}</div>
|
||||
</div>
|
||||
<div style="display: flex;">
|
||||
<div style="width:370px;height: 250px;">
|
||||
<div class="public-details-conent" >
|
||||
<div style="width:370px;">
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">点位名称:</div>
|
||||
<div>{{ examinationInfo.deviceName }}</div>
|
||||
</div>
|
||||
<div class="public-details-conent" >
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">设备名称:</div>
|
||||
<div>{{ examinationInfo.patroldeviceName }}</div>
|
||||
</div>
|
||||
@ -129,30 +129,30 @@ const num = ref(0)
|
||||
</div>
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">告警阈值:</div>
|
||||
<span style="display:block;" >
|
||||
<span style="display:block;">
|
||||
<!-- <span style="display: inline-block;width: 50%;text-align: left;"><span>预警:</span><span>{{
|
||||
examinationInfo.earlyMin }}-{{ examinationInfo.earlyMax }}</span></span> -->
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>一般:</span><span>{{
|
||||
examinationInfo.commonLower }}-{{ examinationInfo.commonUpper }}</span></span>
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>严重:</span><span>{{
|
||||
examinationInfo.seriousLower }}-{{ examinationInfo.seriousUpper }}</span></span>
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>危急:</span><span>{{
|
||||
examinationInfo.dangerLower }}-{{ examinationInfo.dangerLower }}</span></span>
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>一般:</span><span>{{
|
||||
examinationInfo.commonLower }}-{{ examinationInfo.commonUpper }}</span></span>
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>严重:</span><span>{{
|
||||
examinationInfo.seriousLower }}-{{ examinationInfo.seriousUpper }}</span></span>
|
||||
<span style="display: inline-block;width: 70%;text-align: left;"><span>危急:</span><span>{{
|
||||
examinationInfo.dangerLower }}-{{ examinationInfo.dangerLower }}</span></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">告警等级:</div>
|
||||
<div>{{ currency(AlarmLevelList, examinationInfo.alarmLevel) }}</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">告警时间:</div>
|
||||
<div >{{ examinationInfo.alarmDate }}</div>
|
||||
<div>{{ examinationInfo.alarmDate }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="examinationInfo.taskAlarmType != 4" style="width:290px;height: 200px;">
|
||||
<div v-if="examinationInfo.taskAlarmType != 4" style="width:290px;height: 200px;">
|
||||
<div style="width:100%;height:100%; position: relative;">
|
||||
<div title="查看图片" style="position: absolute;
|
||||
<div v-if="examinationInfo.defectFilePath" title="查看图片" style="position: absolute;
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
width: 26px;
|
||||
@ -166,8 +166,10 @@ const num = ref(0)
|
||||
|
||||
<img src="@/assets/monitorsystem/region/img.png" alt="">
|
||||
<el-image style="position: absolute;width:100%;height:100%; opacity: 0;"
|
||||
:src="url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)" :zoom-rate="1.2"
|
||||
:preview-src-list="[url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)]" :preview-teleported="true" fit="cover" />
|
||||
:src="url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)"
|
||||
:zoom-rate="1.2"
|
||||
:preview-src-list="[url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)]"
|
||||
:preview-teleported="true" fit="cover" />
|
||||
</div>
|
||||
<div title="查看视频" style="position: absolute;
|
||||
right: 40px;
|
||||
@ -182,23 +184,35 @@ const num = ref(0)
|
||||
background: rgba(0,0,0,0.5);">
|
||||
<img src="@/assets/monitorsystem/region/video.png" alt="" @click="isVideo = true">
|
||||
</div>
|
||||
<img style="width:100%;height:100%;" :src="url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)">
|
||||
|
||||
<span v-if="examinationInfo.defectFilePath">
|
||||
<video v-if="examinationInfo.defectFilePath.indexOf('mp4') != -1" width="300" height="400"
|
||||
:src="url + '/alarm/' + decodeURIComponent(examinationInfo.filePath)" loop autoplay preload="auto"
|
||||
controls></video>
|
||||
<div v-else-if="examinationInfo.fileType == 3" style="padding-top:20px;">
|
||||
<audio style="width: 100%;margin-top:30px;"
|
||||
:src="url + '/video/' + decodeURIComponent(examinationInfo.filePath)" controls>
|
||||
</audio>
|
||||
</div>
|
||||
<img v-else-if="examinationInfo.defectFilePath" style="width:100%;height:100%;"
|
||||
:src="url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)">
|
||||
</span>
|
||||
<!-- <img v-if="examinationInfo.defectFilePath" style="width:100%;height:100%;"
|
||||
:src="url + '/previewimage?type=alarm&filename=' + encodeURI(examinationInfo.defectFilePath)"> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">告警描述:</div>
|
||||
<div :title="examinationInfo.content" style="height:63px;width: 560px;display: -webkit-box;
|
||||
<div class="public-details-name">告警描述:</div>
|
||||
<div :title="examinationInfo.content" style="height:63px;width: 560px;display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
overflow: hidden;">{{ examinationInfo.content }}</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div style="display:flex;align-items: center;">
|
||||
<div class="public-details-line"></div>
|
||||
<div class="public-details-title" >核查确认</div>
|
||||
<div class="public-details-title">核查确认</div>
|
||||
</div>
|
||||
<div class="public-details-conent" style="align-items: center;">
|
||||
<div class="public-details-name" style="padding-right: 10px;">是否属实</div>
|
||||
@ -206,11 +220,12 @@ const num = ref(0)
|
||||
<el-radio label="1" size="large">是</el-radio>
|
||||
<el-radio label="0" size="large">否</el-radio>
|
||||
</el-radio-group>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name" style="padding-right: 10px;">反馈意见</div>
|
||||
<el-input v-model="examinationInfo.checkComment" style="width: 560px;" :rows="3" resize="none" type="textarea" placeholder="" />
|
||||
<el-input v-model="examinationInfo.checkComment" style="width: 560px;" :rows="3" resize="none"
|
||||
type="textarea" placeholder="" />
|
||||
</div>
|
||||
<div style="display:flex;justify-content:center;margin-top:25px">
|
||||
<!-- <div class="public-details-button" @click="isVideo=true">查看视频</div> -->
|
||||
@ -222,10 +237,11 @@ const num = ref(0)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Eldialog v-if="isVideo" :title="'查看摄像机'" :zIndex="2005" :width="'1200px'"
|
||||
@before-close="isVideo = false" :elclass="'ylclass'" >
|
||||
<Eldialog v-if="isVideo" :title="'查看摄像机'" :zIndex="2005" :width="'1200px'" @before-close="isVideo = false"
|
||||
:elclass="'ylclass'">
|
||||
<template v-slot:PopFrameContent>
|
||||
<Editvideo style="padding-top:10px ;" :_uid="2001" v-if="isVideo == true" :rowInfo="examinationInfo" :online="'1'" />
|
||||
<Editvideo style="padding-top:10px ;" :_uid="2001" v-if="isVideo == true" :rowInfo="examinationInfo"
|
||||
:online="'1'" />
|
||||
</template>
|
||||
</Eldialog>
|
||||
</div>
|
||||
@ -415,9 +431,10 @@ const num = ref(0)
|
||||
.public-examination {
|
||||
position: relative;
|
||||
width: 700px;
|
||||
height: 640px;
|
||||
// height: 640px;
|
||||
background: url(@/assets/giveanalarm/jg_xqbj1.png);
|
||||
background-size: 100% 100%;
|
||||
padding-bottom: 20px;
|
||||
|
||||
.public-examination-title {
|
||||
text-align: center;
|
||||
@ -539,7 +556,5 @@ const num = ref(0)
|
||||
|
||||
}
|
||||
|
||||
.ylclass{
|
||||
|
||||
}
|
||||
.ylclass {}
|
||||
</style>
|
||||
|
@ -9,6 +9,7 @@ import Editvideo from "@/views/linkagecontrol/Intelligentlinkage/editvideo.vue";
|
||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
||||
const emit = defineEmits(['closeGiveanalarm']);
|
||||
const userStore = useUserStore();
|
||||
const url = userStore.webApiBaseUrl;
|
||||
function detailsClick() {
|
||||
Explicit.value = true
|
||||
}
|
||||
@ -195,7 +196,7 @@ const handleChange = (value: any) => {
|
||||
<div class="public-details-title">告警信息{{ examinationInfo.status }}</div>
|
||||
</div>
|
||||
<div style="display: flex;">
|
||||
<div style="width:370px;height: 250px;">
|
||||
<div style="width:370px;">
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">点位名称:</div>
|
||||
<div>{{ examinationInfo.deviceName }}</div>
|
||||
@ -267,14 +268,26 @@ const handleChange = (value: any) => {
|
||||
background: rgba(0,0,0,0.5);">
|
||||
<img src="@/assets/monitorsystem/region/video.png" alt="" @click="isVideo = true">
|
||||
</div>
|
||||
<img style="width:100%;height:100%;" :src="examinationInfo.defectFilePath">
|
||||
<span v-if="examinationInfo.defectFilePath">
|
||||
<video v-if="examinationInfo.defectFilePath.indexOf('mp4') != -1" width="300" height="400"
|
||||
:src="url + '/alarm/' + decodeURIComponent(examinationInfo.filePath)" loop autoplay preload="auto"
|
||||
controls></video>
|
||||
<div v-else-if="examinationInfo.fileType == 3" style="padding-top:20px;">
|
||||
<audio style="width: 100%;margin-top:30px;"
|
||||
:src="url + '/video/' + decodeURIComponent(examinationInfo.filePath)" controls>
|
||||
</audio>
|
||||
</div>
|
||||
<img v-else-if="examinationInfo.defectFilePath" style="width:100%;height:100%;"
|
||||
:src="examinationInfo.defectFilePath">
|
||||
</span>
|
||||
<!-- <img style="width:100%;height:100%;" :src="examinationInfo.defectFilePath"> -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="public-details-conent">
|
||||
<div class="public-details-name">告警描述:</div>
|
||||
<div :title="examinationInfo.content" style="height:63px;width: 560px;display: -webkit-box;
|
||||
<div :title="examinationInfo.content" style="width: 560px;display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 3;
|
||||
overflow: hidden;">{{ examinationInfo.content }}</div>
|
||||
@ -501,9 +514,10 @@ const handleChange = (value: any) => {
|
||||
.public-examination {
|
||||
position: relative;
|
||||
width: 700px;
|
||||
height: 640px;
|
||||
// height: 640px;
|
||||
background: url(@/assets/giveanalarm/jg_xqbj1.png);
|
||||
background-size: 100% 100%;
|
||||
padding-bottom: 20px;
|
||||
|
||||
.public-examination-title {
|
||||
text-align: center;
|
||||
|
@ -1,5 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, reactive, nextTick } from 'vue'
|
||||
import { ref, onMounted, reactive, nextTick,computed } from 'vue'
|
||||
import MarkdownIt from 'markdown-it'
|
||||
import DOMPurify from 'dompurify'
|
||||
import Page from '@/components/Pagination/page.vue'
|
||||
import { ElMessageBox, ElMessage, ElTable, FormRules, ElTree } from 'element-plus'
|
||||
import { getDeviceByType } from '@/api/device'
|
||||
@ -8,7 +10,8 @@ import { useUserStore } from '@/store/modules/user';
|
||||
import * as echarts from 'echarts'
|
||||
import { getAlgorithmClassTree, getAlgorithmDeviceParams, getAlgorithmDeviceCurve, getAlgorithmParamsNameList, callAlgorithmAnalyse } from '@/api/question';
|
||||
import { fa } from 'element-plus/es/locale'
|
||||
const userStore = useUserStore();
|
||||
import axios from 'axios';
|
||||
const userStore = useUserStore();//pythonUrl
|
||||
//树形控件类型定义
|
||||
interface Tree {
|
||||
[x: string]: any;
|
||||
@ -32,6 +35,11 @@ const vMove = {
|
||||
};
|
||||
}
|
||||
}
|
||||
// 创建计算属性处理文本
|
||||
const md = new MarkdownIt()
|
||||
const processedActionData = computed(() => {
|
||||
return md.render(DOMPurify.sanitize(actionData.value))
|
||||
})
|
||||
const defaultProps = { label: "name" };
|
||||
const treeRef = ref<InstanceType<typeof ElTree>>()
|
||||
const treeData: any = ref([])
|
||||
@ -44,7 +52,8 @@ const algorithmId = ref('')
|
||||
const componentId = ref('')
|
||||
function init() {
|
||||
const params = {
|
||||
algorithmClassName: algorithmClassName.value
|
||||
algorithmClassName: algorithmClassName.value,
|
||||
stationCode: userStore.stationCode
|
||||
}
|
||||
treeloading.value = true
|
||||
getAlgorithmClassTree(params).then((res: any) => {
|
||||
@ -65,6 +74,7 @@ function init() {
|
||||
}
|
||||
})
|
||||
}
|
||||
const comainName = ref('')
|
||||
function handleNodeClick(data: any, node: any) {
|
||||
if (data.children.length != 0) {
|
||||
node.isCurrent = false
|
||||
@ -72,8 +82,10 @@ function handleNodeClick(data: any, node: any) {
|
||||
treeRef.value?.setCurrentKey(componentId.value);
|
||||
})
|
||||
} else {
|
||||
// console.log(data)
|
||||
componentId.value = data.id
|
||||
algorithmId.value = data.parentId
|
||||
|
||||
gatdata()
|
||||
getecharts()
|
||||
getfenList()
|
||||
@ -104,40 +116,40 @@ function getecharts() {
|
||||
})
|
||||
}
|
||||
function getRandomColor(): string {
|
||||
const hue = Math.floor(Math.random() * 360); // 色相 0~359
|
||||
const saturation = 70 + Math.floor(Math.random() * 20); // 饱和度 70~90%
|
||||
const lightness = 50 + Math.floor(Math.random() * 10); // 亮度 50~60%
|
||||
const hue = Math.floor(Math.random() * 360); // 色相 0~359
|
||||
const saturation = 70 + Math.floor(Math.random() * 20); // 饱和度 70~90%
|
||||
const lightness = 50 + Math.floor(Math.random() * 10); // 亮度 50~60%
|
||||
|
||||
return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
|
||||
return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
|
||||
}
|
||||
function drawEchart(item: any, index: any) {
|
||||
// 生成随机颜色
|
||||
const randomColor = getRandomColor();
|
||||
// 生成随机颜色
|
||||
const randomColor = getRandomColor();
|
||||
|
||||
let myChart = echarts.init(document.getElementById("deviceEachers" + index) as HTMLDivElement);
|
||||
myChart.setOption({
|
||||
tooltip: {
|
||||
trigger: 'axis'
|
||||
},
|
||||
legend: {
|
||||
data: [item.series[0].name],
|
||||
textStyle: { color: randomColor, fontSize: 14 }
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
top: '18%',
|
||||
containLabel: true,
|
||||
borderColor: randomColor
|
||||
},
|
||||
xAxis:item.xAxis ,
|
||||
yAxis:item.yAxis ,
|
||||
series: item.series.map((series: any) => ({
|
||||
...series,
|
||||
itemStyle: { color: randomColor }
|
||||
}))
|
||||
});
|
||||
let myChart = echarts.init(document.getElementById("deviceEachers" + index) as HTMLDivElement);
|
||||
myChart.setOption({
|
||||
tooltip: {
|
||||
trigger: 'axis'
|
||||
},
|
||||
legend: {
|
||||
data: [item.series[0].name],
|
||||
textStyle: { color: randomColor, fontSize: 14 }
|
||||
},
|
||||
grid: {
|
||||
left: '3%',
|
||||
right: '4%',
|
||||
bottom: '3%',
|
||||
top: '18%',
|
||||
containLabel: true,
|
||||
borderColor: randomColor
|
||||
},
|
||||
xAxis: item.xAxis,
|
||||
yAxis: item.yAxis,
|
||||
series: item.series.map((series: any) => ({
|
||||
...series,
|
||||
itemStyle: { color: randomColor }
|
||||
}))
|
||||
});
|
||||
}
|
||||
//fenxi
|
||||
const checloading = ref(false)
|
||||
@ -162,11 +174,13 @@ function analysis() {
|
||||
ElMessage.warning(res.data.msg)
|
||||
} else {
|
||||
ElMessage.success('分析成功')
|
||||
comainName.value = res.data.desc
|
||||
mapList.value = res.data.mapList
|
||||
canshuList.value = res.data.result.description
|
||||
getovercanshu()
|
||||
getaction()
|
||||
}
|
||||
|
||||
|
||||
|
||||
})
|
||||
}
|
||||
@ -179,7 +193,45 @@ function getovercanshu() {
|
||||
})
|
||||
})
|
||||
}
|
||||
//故障分析
|
||||
const fault = ref(false)
|
||||
function fenfault() {
|
||||
fault.value = true
|
||||
canshuList.value = ''
|
||||
actionData.value = ''
|
||||
gatdata()
|
||||
analysis()
|
||||
actionloading.value = true
|
||||
}
|
||||
//生成处理方案
|
||||
|
||||
const actionData = ref('')
|
||||
const actionloading = ref(false)
|
||||
function getaction() {
|
||||
|
||||
axios.get(userStore.pythonUrl + '/application/' + userStore.application_id + '/chat/open', {
|
||||
headers: {
|
||||
'AUTHORIZATION': 'application-2f942bee58ee12591b4a47deebd5b71b'
|
||||
}
|
||||
}).then((res: any) => {
|
||||
const object = ref(
|
||||
{
|
||||
message: comainName.value + canshuList.value,
|
||||
re_chat: false,
|
||||
stream: false,
|
||||
}
|
||||
)
|
||||
axios.post(userStore.pythonUrl + '/application/chat_message/' + res.data.data, object.value, {
|
||||
headers: {
|
||||
'AUTHORIZATION': 'application-2f942bee58ee12591b4a47deebd5b71b'
|
||||
}
|
||||
}).then((res: any) => {
|
||||
actionloading.value = false
|
||||
actionData.value = res.data.data.content
|
||||
// console.log(res.data)
|
||||
})
|
||||
})
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<div class="faulttemplate-box">
|
||||
@ -203,19 +255,24 @@ function getovercanshu() {
|
||||
</div>
|
||||
</aside>
|
||||
<section class="silderRight1">
|
||||
<div class="right_center" v-loading="checloading">
|
||||
<div class="tree_title">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>信号/点位折线图</div>
|
||||
<div class="right_center" v-loading="checloading"
|
||||
:style="parameter.length > 0 ? 'height: 77vh;' : 'height: 90vh;margin-bottom:0px;'">
|
||||
<div style="display: flex;justify-content: space-between;align-items: center;">
|
||||
<div class="tree_title">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>信号/点位折线图</div>
|
||||
</div>
|
||||
<el-button style="margin-left: 10px;" @click="fenfault()" class="searchButton">故障分析</el-button>
|
||||
</div>
|
||||
<el-scrollbar height="440px">
|
||||
|
||||
<el-scrollbar :height="parameter.length > 0 ? '70vh' : '85vh'">
|
||||
<div class="echarts_box">
|
||||
<div v-for="(item, index) in eacherslist" :id="'deviceEachers' + index"
|
||||
:style="{ width: '100%', height: '160px' }"></div>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<div class="right_yop" v-loading="fixloading">
|
||||
<div class="right_yop" v-loading="fixloading" v-if="parameter.length > 0">
|
||||
<div class="tree_title">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>固定参数</div>
|
||||
@ -228,26 +285,36 @@ function getovercanshu() {
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
<div class="right_bottom" v-loading="fenloading">
|
||||
<div class="tree_title">
|
||||
</section>
|
||||
<Eldialog v-model="fault" :close-on-click-modal="false" @before-close="fault = false" :title="'故障分析'"
|
||||
append-to-body width="1100px" draggable>
|
||||
<template v-slot:PopFrameContent>
|
||||
<div class="tree_title" style="padding: 5px 0px ;">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>参数详情</div>
|
||||
</div>
|
||||
<div class="fixed_params" style="margin-bottom: 15px;">
|
||||
<div v-for="item in fenList" class="fixed_params_item">
|
||||
<div>{{ item.paramName }}:<span>{{ item.paramValue ? item.paramValue : '--' }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tree_title" style="padding: 5px 0px ;">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>分析结果</div>
|
||||
</div>
|
||||
<el-button class="searchButton" type="primary" style="margin: 10px 0px;"
|
||||
@click="analysis()">开始分析</el-button>
|
||||
<el-scrollbar height="80px">
|
||||
<div class="fixed_params">
|
||||
<div v-for="item in fenList" class="fixed_params_item">
|
||||
<div>{{ item.paramName }}:<span>{{ item.paramValue ? item.paramValue : '--' }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
<div class="right_botom">
|
||||
分析结果:<span v-if="!canshuList">--</span><span v-else>{{ canshuList }}</span>
|
||||
<div class="fixed_params right_botom" style="margin-bottom: 15px;">{{ comainName }}<span>{{
|
||||
canshuList ? canshuList : '--' }}</span></div>
|
||||
<div class="tree_title" style="padding: 5px 0px ;">
|
||||
<img src="@/assets/navigation/ty_bq.png" alt="">
|
||||
<div>处理方案</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div>
|
||||
<el-scrollbar height="400px" v-loading="actionloading" style="margin-top: 10px;">
|
||||
<div v-if="actionData" v-html="processedActionData" ></div>
|
||||
</el-scrollbar>
|
||||
</div>
|
||||
</template>
|
||||
</Eldialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -275,6 +342,7 @@ function getovercanshu() {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
|
||||
|
||||
img {
|
||||
margin-right: 10px;
|
||||
}
|
||||
@ -297,7 +365,38 @@ function getovercanshu() {
|
||||
|
||||
|
||||
}
|
||||
:deep(.el-scrollbar__view) {
|
||||
color: #e6e6e6;
|
||||
line-height: 1.8;
|
||||
padding: 15px;
|
||||
|
||||
h3 {
|
||||
color: #409EFF;
|
||||
margin: 20px 0 10px;
|
||||
font-size: 18px;
|
||||
border-left: 4px solid #67C23A;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: #E6A23C;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: square inside;
|
||||
margin: 10px 0;
|
||||
|
||||
li {
|
||||
margin: 8px 0;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 20px 0;
|
||||
border: 0;
|
||||
border-top: 1px solid #606266;
|
||||
}
|
||||
}
|
||||
/* 拖动条 */
|
||||
.moveBtn {
|
||||
height: 100%;
|
||||
@ -317,6 +416,45 @@ function getovercanshu() {
|
||||
background-color: #60bfff;
|
||||
}
|
||||
|
||||
.fixed_params {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
|
||||
.fixed_params_item {
|
||||
margin-right: 10px;
|
||||
|
||||
span {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
color: #00FFFF
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.right_botom {
|
||||
width: 100%;
|
||||
font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 24px;
|
||||
color: #FFFFFF;
|
||||
|
||||
span {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 24px;
|
||||
letter-spacing: normal;
|
||||
color: #009900;
|
||||
}
|
||||
}
|
||||
|
||||
.silderRight1 {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
@ -338,36 +476,27 @@ function getovercanshu() {
|
||||
background: url(@/assets/navigation/110tu.png);
|
||||
background-size: 100% 100%;
|
||||
|
||||
.fixed_params {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
|
||||
.fixed_params_item {
|
||||
margin-right: 20px;
|
||||
|
||||
span {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
color: #00FFFF
|
||||
}
|
||||
}
|
||||
// margin-bottom: 15px;
|
||||
:deep(.el-scrollbar) {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.right_center {
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
height: calc(77vh);
|
||||
margin-bottom: 15px;
|
||||
box-sizing: border-box;
|
||||
padding: 15px;
|
||||
background: url(@/assets/navigation/sw1.png);
|
||||
background-size: 100% 100%;
|
||||
|
||||
:deep(.el-scrollbar) {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
.echarts_box {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
@ -385,44 +514,9 @@ function getovercanshu() {
|
||||
background: url(@/assets/navigation/sw.png);
|
||||
background-size: 100% 100%;
|
||||
|
||||
.fixed_params {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
font-size: 14px;
|
||||
|
||||
.fixed_params_item {
|
||||
margin-right: 10px;
|
||||
|
||||
span {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-size: 18px;
|
||||
color: #00FFFF
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.right_botom {
|
||||
width: 100%;
|
||||
font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-size: 16px;
|
||||
color: #FFFFFF;
|
||||
|
||||
span {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-size: 24px;
|
||||
letter-spacing: normal;
|
||||
color: #009900;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.el-scrollbar) {
|
||||
height: 80px !important;
|
||||
|
@ -8,10 +8,12 @@ export default {
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, reactive, watch } from 'vue'
|
||||
import { ElTable, ElMessage, ElMessageBox, FormRules } from 'element-plus'
|
||||
import { getTaskList, addTaskList, delTaskList, updataTaskList, setTaskList, changeItemOrder } from "@/api/taxkSetting";
|
||||
import { getQuartzJobList, addTaskList, delTaskList, updataTaskList, setTaskList, changeItemOrder } from "@/api/taxkSetting";
|
||||
import Page from '@/components/Pagination/page.vue'
|
||||
import Sortable from 'sortablejs';
|
||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
const userStore = useUserStore();
|
||||
//输入框内文字
|
||||
const input = ref('')
|
||||
//表格数据
|
||||
@ -356,9 +358,10 @@ function getTasklist() {
|
||||
const params = {
|
||||
jobName: input.value,
|
||||
size: size.value,
|
||||
current: current.value
|
||||
current: current.value,
|
||||
// stationId:userStore.stationId
|
||||
}
|
||||
getTaskList(params).then((res) => {
|
||||
getQuartzJobList(params).then((res) => {
|
||||
size.value = res.data.size
|
||||
current.value = res.data.current
|
||||
total.value = res.data.total
|
||||
|
@ -114,6 +114,7 @@ function getData() {
|
||||
treeloading.value = true
|
||||
SearchBox.value.type = activeName.value
|
||||
SearchBox.value.taskName = taskName.value
|
||||
SearchBox.value.stationId = userStore.stationId
|
||||
getdata(SearchBox.value).then((res: any) => {
|
||||
treeloading.value = false
|
||||
tableDataList.value = res.data.records
|
||||
@ -196,7 +197,9 @@ function verification(row: any, index: any) {
|
||||
password.value = ''
|
||||
}
|
||||
function secondPass() {
|
||||
disbutton.value = true
|
||||
secondauthPassword({ username: userStore.username, password: encrypt(password.value) }).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code != 1) {
|
||||
if (res.data == '二次密码认证错误!') {
|
||||
inputTrue.value = true
|
||||
@ -387,6 +390,7 @@ const stationlist = ref({
|
||||
function confirmClick(formEl: any) {
|
||||
formEl.validate((valid: any) => {
|
||||
if (valid) {
|
||||
disbutton.value = true
|
||||
if (info.value.fixedStartTime) {
|
||||
info.value.fixedStartTime = dateFormat(info.value.fixedStartTime)
|
||||
}
|
||||
@ -433,6 +437,7 @@ function confirmClick(formEl: any) {
|
||||
})
|
||||
|
||||
editTask(paramsall).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code != '1') {
|
||||
dialogVisible.value = false;
|
||||
ElMessage({
|
||||
@ -445,6 +450,7 @@ function confirmClick(formEl: any) {
|
||||
})
|
||||
} else {
|
||||
addTask(paramsall).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code != '1') {
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
@ -483,12 +489,14 @@ function deleteTask(row: any) {
|
||||
|
||||
}
|
||||
//多选删除
|
||||
const disbutton = ref(false)
|
||||
function delClick() {
|
||||
ElMessageBox.confirm('确定删除此巡视任务吗?', '删除提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
disbutton.value = true
|
||||
const allTaskId: any = ref([])
|
||||
deviceInfos.value.forEach((res: any) => {
|
||||
allTaskId.value.push(res.taskId)
|
||||
@ -503,6 +511,7 @@ function delClick() {
|
||||
message: "删除成功",
|
||||
});
|
||||
getData()
|
||||
disbutton.value = false
|
||||
}
|
||||
})
|
||||
})
|
||||
@ -2158,8 +2167,8 @@ const open = () => {
|
||||
<el-date-picker popper-class="elDatePicker" style="width: 300px; margin-right: 10px;" v-model="tableData"
|
||||
type="daterange" range-separator="至" start-placeholder="开始日期" @change="dataChange" end-placeholder="结束日期"
|
||||
value-format="YYYY-MM-DD" format="YYYY-MM-DD" />
|
||||
<el-button class="searchButton" @click="getData()">搜索</el-button>
|
||||
<el-button class="searchButton" @click="resetting()">重置</el-button>
|
||||
<el-button class="searchButton" @click="getData()" :disabled="treeloading" >搜索</el-button>
|
||||
<el-button class="searchButton" @click="resetting()" :disabled="treeloading" >重置</el-button>
|
||||
</div>
|
||||
<div>
|
||||
<el-button v-hasPerm="['add:task']" class="searchButton" @click="addClick">
|
||||
@ -2383,8 +2392,8 @@ const open = () => {
|
||||
</el-form>
|
||||
<span class="dialog-footer" v-if="info.datastatus == 1 || title == '复制巡视任务'"
|
||||
style="width:100%;margin:auto ; display: flex;display: -webkit-flex; justify-content: flex-end;-webkit-justify-content: flex-end;margin-top: 20px;">
|
||||
<div class="details-button" @click="handleClose">取消</div>
|
||||
<div class="details-button" @click="confirmClick(infoForm)">保存</div>
|
||||
<div class="details-button" @click="handleClose">取消</div>
|
||||
<div class="details-button" @click="!disbutton?confirmClick(infoForm):''">保存</div>
|
||||
</span>
|
||||
</div>
|
||||
<div v-show="tabs == 2" class="tabbas1-toner">
|
||||
@ -2392,12 +2401,12 @@ const open = () => {
|
||||
<div class="essential-top">
|
||||
<div style="margin-bottom: 20px;">
|
||||
<el-button class="searchButton" style="margin-left:0" type="primary"
|
||||
v-if="info.datastatus == 1 && title == '复制巡视任务'" @click="associationInterval">关联间隔</el-button>
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 && title == '复制巡视任务'"
|
||||
v-if="info.datastatus == 1 || title == '复制巡视任务'" @click="associationInterval">关联间隔</el-button>
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 || title == '复制巡视任务'"
|
||||
@click="associateMasterDevice">关联主设备</el-button>
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 && title == '复制巡视任务'"
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 || title == '复制巡视任务'"
|
||||
@click="AssociatedComponents">关联部件</el-button>
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 && title == '复制巡视任务'"
|
||||
<el-button class="searchButton" type="primary" v-if="info.datastatus == 1 || title == '复制巡视任务'"
|
||||
@click="AssociatedInspection">关联巡视点位</el-button>
|
||||
</div>
|
||||
</div>
|
||||
@ -2491,7 +2500,7 @@ const open = () => {
|
||||
<span class="dialog-footer" v-if="info.datastatus == 1 || title == '复制巡视任务'"
|
||||
style="width: 95%;margin: auto; display: flex;display: -webkit-flex; justify-content: flex-end;-webkit-justify-content: flex-end;margin-top: 10px;">
|
||||
<div class="details-button" @click="handleClose">取消</div>
|
||||
<div class="details-button" @click="confirmClick(infoForm)">保存</div>
|
||||
<div class="details-button" @click="!disbutton?confirmClick(infoForm):''">保存</div>
|
||||
</span>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
@ -2864,7 +2873,7 @@ const open = () => {
|
||||
</div>
|
||||
<span class="dialog-footer" style="display: flex;justify-content: center;margin-top: 10px;">
|
||||
<div class="details-button" @click="inputCLOse">取消</div>
|
||||
<div class="details-button" @click="secondPass">确定</div>
|
||||
<div class="details-button" @click="!disbutton?secondPass:''">确定</div>
|
||||
</span>
|
||||
</template>
|
||||
</Eldialog>
|
||||
|
@ -60,6 +60,7 @@ function getTypeTwo() {
|
||||
}
|
||||
//弹出框事件
|
||||
function sure(data: any, index: any) {
|
||||
disbutton.value = true
|
||||
if (index == 'one') {
|
||||
const params = {
|
||||
reviseValue: data.reviseValue,
|
||||
@ -68,6 +69,7 @@ function sure(data: any, index: any) {
|
||||
resultId: data.resultId
|
||||
}
|
||||
editCorrect(params).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code == 0) {
|
||||
Explicit.value = 0
|
||||
conclusion.value = ''
|
||||
@ -86,6 +88,7 @@ function sure(data: any, index: any) {
|
||||
examineFlag: 1
|
||||
}
|
||||
examination(params).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code == 0) {
|
||||
Explicit.value = 0
|
||||
conclusion.value = ''
|
||||
@ -144,6 +147,7 @@ function getTabledata(loading: any) {
|
||||
})
|
||||
}
|
||||
//修正
|
||||
const disbutton = ref(false)
|
||||
function correct(row: any) {
|
||||
conclusion.value = 1
|
||||
form.value = JSON.parse(JSON.stringify(row))
|
||||
@ -1104,7 +1108,7 @@ function retrunClick() {
|
||||
</div>
|
||||
<div style="width: 50%;margin:auto;display: flex;justify-content: space-around;">
|
||||
<div class="details-button" @click="Explicit = 0">取消</div>
|
||||
<div class="details-button" @click="sure(form, 'one')">确定</div>
|
||||
<div class="details-button" @click="!disbutton?sure(form, 'one'):'' ">确定</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -1131,7 +1135,7 @@ function retrunClick() {
|
||||
style="border: none;z-index:100;position: relative; color: #409eff;width: 110px;height: 33px;">取消</el-button>
|
||||
</div>
|
||||
<div style="position: relative;z-index: 100;width: 110px;height: 33px;">
|
||||
<el-button class="three-button" @click=" sure(examineComment, 'two')"
|
||||
<el-button class="three-button" @click="!disbutton?sure(form, 'one'):'' "
|
||||
style="border: none;z-index:100;position: relative; color: #409eff;width: 110px;height: 33px;">确定</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -190,12 +190,15 @@ function getData(val: any, loading: any) {
|
||||
})
|
||||
}
|
||||
//操作巡视任务
|
||||
const disbutton = ref(false)
|
||||
function Operate(row: any, optType: any) {
|
||||
disbutton.value = true
|
||||
if (row.isStationFlag == 1) {
|
||||
const paramsa = {
|
||||
stationcode: userStore.stationCode
|
||||
}
|
||||
stationOnline(paramsa).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res == 1) {
|
||||
const params = {
|
||||
taskTodoId: row.taskTodoId,
|
||||
@ -237,6 +240,7 @@ function Operate(row: any, optType: any) {
|
||||
optType: optType
|
||||
}
|
||||
operate(params).then((res: any) => {
|
||||
disbutton.value = false
|
||||
if (res.code == 0) {
|
||||
const typeText = ref('')
|
||||
if (optType == 'pause') {
|
||||
@ -523,14 +527,14 @@ function removePercentSign(str:any) {
|
||||
<template #default="scope">
|
||||
<div style="display: flex; justify-content: center;">
|
||||
<div v-hasPerm="['task:runnow']" v-if="scope.row.taskState == 0" class="button-style"
|
||||
@click="Operate(scope.row, 'runNow')">立即执行</div>
|
||||
@click=" !disbutton?Operate(scope.row, 'runNow'):''">立即执行</div>
|
||||
<div v-hasPerm="['task:suspend']" v-if="scope.row.taskState == 3" class="button-style"
|
||||
@click="Operate(scope.row, 'resume')">恢复</div>
|
||||
@click="!disbutton?Operate(scope.row, 'resume'):''">恢复</div>
|
||||
<div v-hasPerm="['task:suspend']" v-if="scope.row.taskState == 2 || scope.row.taskState == 0"
|
||||
class="button-style" @click="Operate(scope.row, 'pause')">暂停</div>
|
||||
class="button-style" @click="!disbutton?Operate(scope.row, 'pause'):''">暂停</div>
|
||||
|
||||
<div v-hasPerm="['task:shutdown']" v-if="scope.row.taskState == 0 || scope.row.taskState == 3"
|
||||
class="button-style" @click="Operate(scope.row, 'stop')">终止</div>
|
||||
class="button-style" @click="!disbutton?Operate(scope.row, 'stop'):''">终止</div>
|
||||
<div @click="detailed(scope.row)" class="button-style"><router-link :to="{
|
||||
path: '/patrolDetails',
|
||||
query: {
|
||||
|
@ -44,6 +44,9 @@ function getData(val: any) {
|
||||
if (date.value.length != 0) {
|
||||
info.value.startDate = date.value[0]
|
||||
info.value.endDate = date.value[1]
|
||||
}else{
|
||||
info.value.startDate = ''
|
||||
info.value.endDate = ''
|
||||
}
|
||||
|
||||
treeloading.value = true
|
||||
@ -200,7 +203,7 @@ const title = ref('')
|
||||
const isViewfile = ref(false)
|
||||
function viewReport(row: any) {
|
||||
title.value = row.taskName
|
||||
ViewfileUrl.value = userStore.webApiBaseUrl + '/patroltasks/task-todo/exportTaskTodo?taskTodoId=' + row.taskTodoId
|
||||
ViewfileUrl.value = userStore.webApiBaseUrl + '/patroltasks/task-todo/exportTaskTodoById?taskTodoId=' + row.taskTodoId+'&areaId='+info.value.areaId+'&bayId='+info.value.bayId
|
||||
isViewfile.value = true
|
||||
}
|
||||
function CloseView() {
|
||||
@ -229,6 +232,22 @@ onMounted(() => {
|
||||
date.value = [startDate, endDate]
|
||||
getData(1)
|
||||
})
|
||||
//控制行变色
|
||||
const tableRowClassName = ({
|
||||
row,
|
||||
rowIndex,
|
||||
}: {
|
||||
row: any
|
||||
rowIndex: number
|
||||
}) => {
|
||||
if (rowIndex % 2 === 0) {
|
||||
return 'warning-row'
|
||||
} else if (rowIndex % 2 === 1) {
|
||||
return 'success-row'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div style="padding:0 15px ;">
|
||||
@ -277,7 +296,7 @@ onMounted(() => {
|
||||
</div>
|
||||
|
||||
<!-- <div style="position: relative;"> -->
|
||||
<el-table :data="tableData" v-loading="treeloading"
|
||||
<el-table :data="tableData" v-loading="treeloading" :row-class-name="tableRowClassName"
|
||||
style="width: 100%;margin:auto;position: relative;margin: 5px 0; height:calc(78vh); overflow: auto "
|
||||
:header-cell-style="tableBg" stripe
|
||||
@selection-change="handleSelectionChange">
|
||||
@ -295,13 +314,13 @@ onMounted(() => {
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deviceSumnum" label="巡视点位总数量" align="center" />
|
||||
<el-table-column label="巡视结果" align="center">
|
||||
<template #default="scope" >
|
||||
<span>成功:{{ scope.row.result.successCount }};</span><span>失败:{{ scope.row.result.failCount }}</span><br />
|
||||
<span>正常:{{ scope.row.result.normalCount }};</span><span style="color: #FF3300;">异常:{{
|
||||
scope.row.result.abnormalCount }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="description" label="巡视结果" width="140px" align="center">
|
||||
<template #default="scope">
|
||||
<span>成功:{{ scope.row.deviceDeforeNum - scope.row.deviceFailureNum }};</span><span>失败:{{ scope.row.deviceFailureNum }}</span><br />
|
||||
<span>正常:{{ scope.row.deviceDeforeNum - scope.row.deviceFailureNum - scope.row.deviceUnusualnum }};</span><span style="color: #FF3300;">异常:{{scope.row.deviceUnusualnum }}</span>
|
||||
</template>
|
||||
|
||||
</el-table-column>
|
||||
<el-table-column prop="startTime" label="巡视开始时间" align="center" />
|
||||
<el-table-column prop="endTime" label="巡视结束时间" align="center" />
|
||||
<el-table-column prop="cexamineUserName" label="审核人" width="100px" align="center"/>
|
||||
|
@ -10,14 +10,14 @@
|
||||
</div>
|
||||
<div class="loadingBox1">变电站三维模型加载中... 请稍候!</div>
|
||||
</div>
|
||||
<el-button v-show="!isroam" class="THREE-button" :style="{ right: isRightList ? '630px' : '290px' }"
|
||||
<el-button v-show="!isroam" class="THREE-button" :style="{ right: isRightList ? '490px' : '290px' }"
|
||||
@click.stop="rangingClick">{{ !isranging
|
||||
? '开始' : '结束' }}测距</el-button>
|
||||
<el-button v-show="!isroam" :style="{ right: isRightList ? '490px' : '150px' }" @click="reset"
|
||||
<el-button v-show="!isroam" :style="{ right: isRightList ? '350px' : '150px' }" @click="reset"
|
||||
class="THREE-button">恢复初始态</el-button>
|
||||
<el-button class="THREE-button" :style="{ right: isRightList ? '350px' : '10px' }" @click.stop="roamClick">{{
|
||||
<!-- <el-button class="THREE-button" :style="{ right: isRightList ? '350px' : '10px' }" @click.stop="roamClick">{{
|
||||
!isroam
|
||||
? '开始' : '结束' }}漫游</el-button>
|
||||
? '开始' : '结束' }}漫游</el-button> -->
|
||||
<div v-show="isRightList" class="THREE-right-list" @click.stop>
|
||||
<div class="THREE-right-list-title">
|
||||
<span>
|
||||
@ -99,10 +99,10 @@
|
||||
<div v-show="selType == '02'" class="three-right-list-main-icon">
|
||||
<img v-show="i.objinfo != undefined" src="@/assets/3d/xq.png" title="巡视点位信息" alt="巡视点位信息"
|
||||
@click.stop="informationClick(i), listClick(i, index)">
|
||||
<img v-if="!i.objinfo && !i.objinfo.patroldeviceJson" src="@/assets/3d/sc_dis.png" title="实时视频" alt="实时视频">
|
||||
<img v-if="!i.objinfo " src="@/assets/3d/sc_dis.png" title="实时视频" alt="实时视频">
|
||||
<img v-else src="@/assets/3d/ks.png" title="实时视频-1" alt="实时视频-1" @click.stop="getDeviceVideo(i, 0)">
|
||||
<img v-show="i.objinfo == undefined" @click.stop src="@/assets/3d/xq_dis.png" title="巡视点位信息" alt="巡视点位信息">
|
||||
<img src="@/assets/sytlechange/u157.svg" alt="" title="历史记录"
|
||||
<img src="@/assets/navigation/u157.png" alt="" title="历史记录"
|
||||
@click.stop="historicalRecords(i), listClick(i, index)">
|
||||
</div>
|
||||
<div v-show="selType == '05'" class="THREE-right-list-main-icon">
|
||||
@ -166,7 +166,7 @@
|
||||
<!-- 详细信息弹窗 -->
|
||||
<div class="detailed-information" v-if="information">
|
||||
<div id="detailed-information" v-drag class="examination">
|
||||
<div class="examination-title">{{ objRow.name }}</div>
|
||||
<div class="examination-title" >{{ objRow.name }}</div>
|
||||
<div class="examination-close" @click.stop="information = false"><img src="@/assets/3d/u523.png" /></div>
|
||||
<div class="examination-contont" v-if="selType == '01'">
|
||||
<div class="examination-contont-text">设备编码:{{ objRow.userData.objinfo.patroldeviceCode }}</div>
|
||||
@ -266,13 +266,13 @@
|
||||
d="M989.866667 482.133333L597.333333 110.933333c-17.066667-17.066667-42.666667-17.066667-59.733333 0-17.066667 17.066667-17.066667 42.666667 0 59.733334l315.733333 298.666666H64c-25.6 0-42.666667 17.066667-42.666667 42.666667s17.066667 42.666667 42.666667 42.666667H853.333333l-315.733333 298.666666c-17.066667 17.066667-17.066667 42.666667 0 59.733334 8.533333 8.533333 21.333333 12.8 29.866667 12.8 8.533333 0 21.333333-4.266667 29.866666-12.8l392.533334-371.2c8.533333-8.533333 12.8-21.333333 12.8-29.866667s-4.266667-21.333333-12.8-29.866667z"
|
||||
fill="currentColor" p-id="2538"></path>
|
||||
</svg>
|
||||
上一个</el-button>
|
||||
上一条</el-button>
|
||||
<el-button class="searchButton1"
|
||||
style="color:#009bff;font-size:14px;border:1px solid #009bff;padding:3px 5px;height:32px;">共{{
|
||||
Length }}页,当前为第{{ Index + 1 }}页</el-button>
|
||||
Length }}条,当前为第{{ Index + 1 }}条</el-button>
|
||||
|
||||
<el-button class="searchButton1" @click.stop="nextPage" :disabled="Index + 1 == Length">
|
||||
下一个
|
||||
下一条
|
||||
<svg t="1686723317756" style="margin-left:5px" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" p-id="2537" xmlns:xlink="http://www.w3.org/1999/xlink" width="14"
|
||||
height="14">
|
||||
@ -308,7 +308,7 @@
|
||||
<span v-if="AlarmMapOne.alarmLevel == 4" style="color: #FF3300;">危急</span>
|
||||
</div>
|
||||
<div class="examine-contont-body-left-test" style="display: flex;">
|
||||
<div style="width:155px;">告警描述:</div>
|
||||
<div style="width:180px;">告警描述:</div>
|
||||
<div>{{ AlarmMapOne.content }}</div>
|
||||
</div>
|
||||
<div class="examine-contont-body-left-test">告警时间:{{ AlarmMapOne.alarmDate }}</div>
|
||||
|
@ -1251,7 +1251,7 @@ const isGaoliang:any = ref("")
|
||||
width: 300px;
|
||||
min-width: 300px;
|
||||
height: calc(100vh - 115px);
|
||||
background: url(@/assets/videoimg/spjk_300.png) no-repeat center center;
|
||||
background: url(@/assets/navigation/ty_260x988.png);
|
||||
background-size: 100% 100%;
|
||||
:deep(img){
|
||||
pointer-events:none;
|
||||
|
@ -465,7 +465,7 @@ onMounted(() => {
|
||||
width: 281px;
|
||||
min-width: 281px;
|
||||
height: calc(100vh - 140px);
|
||||
background: url(@/assets/videoimg/xsjk_280.png) no-repeat center center;
|
||||
background: url(@/assets/navigation/ty_260x988.png);
|
||||
background-size: 100% 100%;
|
||||
:deep(.el-scrollbar) {
|
||||
height: calc(100vh - 560px);
|
||||
|
Loading…
Reference in New Issue
Block a user