5-19会后bug修改

This commit is contained in:
wangxk 2025-05-21 09:06:33 +08:00
parent da1c45f4c6
commit 5aa90c2fcc
34 changed files with 597 additions and 299 deletions

View File

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

View File

@ -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":"标题"
}

View File

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

View File

@ -32,3 +32,12 @@ export function getHistoricalCurve(params:any){
params:params
});
}
//导出环境历史数据
export function exportDeviceWorkData(params:any){
return request({
url: '/auxcontrol/device-work-data/exportDeviceWorkData' ,
method: 'get',
params:params,
responseType: 'arraybuffer'
});
}

View File

@ -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
});

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

View File

@ -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);
}

View File

@ -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: '确定',

View File

@ -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
};
});

View File

@ -5857,19 +5857,16 @@ function setupWebSocket() {
//
.detailed-information {
position: fixed;
width: 100%;
height: 100%;
top: 0px;
z-index: 1002;
.examination {
.examination {
width: 406px;
height: 330px;
position: fixed;
background: url(@/assets/3d/sxjxq.png) no-repeat;
background-size: 100% 100%;
padding: 0 25px 15px;
.examination-title {
margin-top: 20px;
width: 100%;
@ -5899,8 +5896,7 @@ function setupWebSocket() {
margin-top: 11px;
}
}
}
}
}
:deep(.el-input-number__decrease) {

View File

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

View File

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

View File

@ -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);
@ -289,10 +309,21 @@ function gettoday() {
</div>
</div>
<div class="right_bottom">
<div class="title_right">
<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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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') {
@ -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,7 +129,7 @@ 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>{{
@ -147,12 +147,12 @@ const num = ref(0)
<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 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,8 +184,20 @@ 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>
@ -198,7 +212,7 @@ const num = ref(0)
<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>
@ -210,7 +224,8 @@ const num = ref(0)
</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>

View File

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

View File

@ -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()
@ -131,8 +143,8 @@ function drawEchart(item: any, index: any) {
containLabel: true,
borderColor: randomColor
},
xAxis:item.xAxis ,
yAxis:item.yAxis ,
xAxis: item.xAxis,
yAxis: item.yAxis,
series: item.series.map((series: any) => ({
...series,
itemStyle: { color: randomColor }
@ -162,9 +174,11 @@ 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="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-scrollbar height="440px">
<el-button style="margin-left: 10px;" @click="fenfault()" class="searchButton">故障分析</el-button>
</div>
<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>
</div>
<el-button class="searchButton" type="primary" style="margin: 10px 0px;"
@click="analysis()">开始分析</el-button>
<el-scrollbar height="80px">
<div class="fixed_params">
<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>
<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>
<el-scrollbar height="400px" v-loading="actionloading" style="margin-top: 10px;">
<div v-if="actionData" v-html="processedActionData" ></div>
</el-scrollbar>
<div class="right_botom">
分析结果<span v-if="!canshuList">--</span><span v-else>{{ canshuList }}</span>
</div>
</div>
</section>
</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;
// margin-bottom: 15px;
:deep(.el-scrollbar) {
height: auto !important;
}
.fixed_params_item {
margin-right: 20px;
span {
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
font-weight: 700;
font-size: 18px;
color: #00FFFF
}
}
}
}
.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;

View File

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

View File

@ -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">
@ -2384,7 +2393,7 @@ const open = () => {
<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="!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>

View File

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

View File

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

View File

@ -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,12 +314,12 @@ 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>
<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" />

View File

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

View File

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

View File

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