云平台自测问题修改
This commit is contained in:
@@ -72,7 +72,7 @@ const initListByIds = () => {
|
|||||||
|
|
||||||
const templateListData = () => {
|
const templateListData = () => {
|
||||||
getTemplateList({}).then(res => {
|
getTemplateList({}).then(res => {
|
||||||
templateList.value = res.data.filter(item => item.name === '稳态治理报表')
|
templateList.value = res.data.filter(item => item.reportForm == 4)
|
||||||
if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
|
if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
|
||||||
tableStore.table.params.tempId = templateList.value[0].id
|
tableStore.table.params.tempId = templateList.value[0].id
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ const initLineList = async () => {
|
|||||||
cslineList({}).then(res => {
|
cslineList({}).then(res => {
|
||||||
lineList.value = res.data
|
lineList.value = res.data
|
||||||
tableStore.table.params.lineId = lineList.value[0].lineId
|
tableStore.table.params.lineId = lineList.value[0].lineId
|
||||||
|
initCode()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,7 +435,6 @@ watch(
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await initLineList()
|
await initLineList()
|
||||||
await initCode()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
|
|||||||
@@ -1,294 +1,303 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="default-main">
|
<div class="default-main">
|
||||||
<div class="analyze-dvr" v-show="!isWaveCharts" :style="{ height: pageHeight.height }" v-loading="loading">
|
<div class="analyze-dvr" v-show="!isWaveCharts" :style="{ height: pageHeight.height }" v-loading="loading">
|
||||||
<DeviceTree @node-click="nodeClick" @init="nodeClick" @deviceTypeChange="deviceTypeChange"></DeviceTree>
|
<DeviceTree @node-click="nodeClick" @init="nodeClick" @deviceTypeChange="deviceTypeChange"></DeviceTree>
|
||||||
<div class="analyze-dvr-right" v-if="tableStore.table.params.deviceId">
|
<div class="analyze-dvr-right" v-if="tableStore.table.params.deviceId">
|
||||||
<TableHeader datePicker showExport>
|
<TableHeader datePicker showExport>
|
||||||
<template v-slot:select>
|
<template v-slot:select>
|
||||||
<el-form-item label="事件类型">
|
<el-form-item label="事件类型">
|
||||||
<el-select
|
<el-select
|
||||||
v-model.trim="tableStore.table.params.eventType"
|
v-model.trim="tableStore.table.params.eventType"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请选择事件类型"
|
placeholder="请选择事件类型"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in eventList"
|
v-for="item in eventList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="位置">
|
<el-form-item label="位置">
|
||||||
<el-select
|
<el-select
|
||||||
v-model.trim="tableStore.table.params.location"
|
v-model.trim="tableStore.table.params.location"
|
||||||
clearable
|
clearable
|
||||||
placeholder="请选择位置"
|
placeholder="请选择位置"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in locationList"
|
v-for="item in locationList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<Table v-if="view" ref="tableRef"></Table>
|
<Table v-if="view" ref="tableRef"></Table>
|
||||||
</div>
|
</div>
|
||||||
<el-empty v-else description="请选择设备" class="analyze-dvr-right" />
|
<el-empty v-else description="请选择设备" class="analyze-dvr-right" />
|
||||||
</div>
|
</div>
|
||||||
<waveFormAnalysis
|
<waveFormAnalysis
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
v-if="isWaveCharts"
|
v-if="isWaveCharts"
|
||||||
ref="waveFormAnalysisRef"
|
ref="waveFormAnalysisRef"
|
||||||
@handleHideCharts="isWaveCharts = false"
|
@handleHideCharts="isWaveCharts = false"
|
||||||
:wp="wp"
|
:wp="wp"
|
||||||
style="padding: 10px"
|
style="padding: 10px"
|
||||||
/>
|
/>
|
||||||
<!-- <div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
|
<!-- <div :style="{ height: pageHeight.height }" style="padding: 10px; overflow: hidden" v-if="!view">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<div v-if="view2" style="display: flex">
|
<div v-if="view2" style="display: flex">
|
||||||
<el-radio-group v-model.trim="value" @change="changeView">
|
<el-radio-group v-model.trim="value" @change="changeView">
|
||||||
<el-radio-button label="一次值" :value="1" />
|
<el-radio-button label="一次值" :value="1" />
|
||||||
<el-radio-button label="二次值" :value="2" />
|
<el-radio-button label="二次值" :value="2" />
|
||||||
|
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-button v-if="view2" @click="backbxlb" class="el-icon-refresh-right" icon="el-icon-Back"
|
<el-button v-if="view2" @click="backbxlb" class="el-icon-refresh-right" icon="el-icon-Back"
|
||||||
style="float: right">
|
style="float: right">
|
||||||
返回
|
返回
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-tabs v-if="view2" class="default-main" v-model.trim="bxactiveName" @tab-click="bxhandleClick">
|
<el-tabs v-if="view2" class="default-main" v-model.trim="bxactiveName" @tab-click="bxhandleClick">
|
||||||
<el-tab-pane label="瞬时波形" name="ssbx" class="boxbx pt10 pb10"
|
<el-tab-pane label="瞬时波形" name="ssbx" class="boxbx pt10 pb10"
|
||||||
:style="'height:' + bxecharts + ';overflow-y: scroll;'">
|
:style="'height:' + bxecharts + ';overflow-y: scroll;'">
|
||||||
<shushiboxi v-if="bxactiveName == 'ssbx' && showBoxi" :value="value" :boxoList="boxoList" :wp="wp">
|
<shushiboxi v-if="bxactiveName == 'ssbx' && showBoxi" :value="value" :boxoList="boxoList" :wp="wp">
|
||||||
</shushiboxi>
|
</shushiboxi>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane label="RMS波形" class="boxbx pt10 pb10" name="rmsbx"
|
<el-tab-pane label="RMS波形" class="boxbx pt10 pb10" name="rmsbx"
|
||||||
:style="'height:' + bxecharts + ';overflow-y: scroll;'">
|
:style="'height:' + bxecharts + ';overflow-y: scroll;'">
|
||||||
<rmsboxi v-if="bxactiveName == 'rmsbx' && showBoxi" :value="value" :boxoList="boxoList" :wp="wp">
|
<rmsboxi v-if="bxactiveName == 'rmsbx' && showBoxi" :value="value" :boxoList="boxoList" :wp="wp">
|
||||||
</rmsboxi>
|
</rmsboxi>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</div> -->
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, nextTick, provide, onMounted } from 'vue'
|
import { ref, nextTick, provide, onMounted } from 'vue'
|
||||||
import { mainHeight } from '@/utils/layout'
|
import { mainHeight } from '@/utils/layout'
|
||||||
import DeviceTree from '@/components/tree/govern/deviceTree.vue'
|
import DeviceTree from '@/components/tree/govern/deviceTree.vue'
|
||||||
import TableStore from '@/utils/tableStore'
|
import TableStore from '@/utils/tableStore'
|
||||||
import Table from '@/components/table/index.vue'
|
import Table from '@/components/table/index.vue'
|
||||||
import waveFormAnalysis from '@/views/govern/device/control/tabs/components/waveFormAnalysis.vue'
|
import waveFormAnalysis from '@/views/govern/device/control/tabs/components/waveFormAnalysis.vue'
|
||||||
import { analyseWave } from '@/api/common'
|
import { analyseWave } from '@/api/common'
|
||||||
import TableHeader from '@/components/table/header/index.vue'
|
import TableHeader from '@/components/table/header/index.vue'
|
||||||
|
|
||||||
import { getFileZip } from '@/api/cs-harmonic-boot/datatrend'
|
import { getFileZip } from '@/api/cs-harmonic-boot/datatrend'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'govern/analyze/DVR/index'
|
name: 'govern/analyze/DVR/index'
|
||||||
})
|
})
|
||||||
const pageHeight = mainHeight(20)
|
const pageHeight = mainHeight(20)
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const view = ref(true)
|
const view = ref(true)
|
||||||
const view2 = ref(false)
|
const view2 = ref(false)
|
||||||
const showBoxi = ref(true)
|
const showBoxi = ref(true)
|
||||||
const isWaveCharts = ref(false)
|
const isWaveCharts = ref(false)
|
||||||
const bxactiveName = ref('ssbx')
|
const bxactiveName = ref('ssbx')
|
||||||
const boxoList: any = ref({})
|
const boxoList: any = ref({})
|
||||||
const wp = ref({})
|
const wp = ref({})
|
||||||
const eventList = ref([
|
const eventList = ref([
|
||||||
{
|
{
|
||||||
value: 'Evt_Sys_DipStr',
|
value: 'Evt_Sys_DipStr',
|
||||||
label: '电压暂降'
|
label: '电压暂降'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'Evt_Sys_SwlStr',
|
value: 'Evt_Sys_SwlStr',
|
||||||
label: '电压暂升'
|
label: '电压暂升'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'Evt_Sys_IntrStr',
|
value: 'Evt_Sys_IntrStr',
|
||||||
label: '电压中断'
|
label: '电压中断'
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
const locationList = ref([
|
const locationList = ref([
|
||||||
{
|
{
|
||||||
value: 'grid',
|
value: 'grid',
|
||||||
label: '电网侧'
|
label: '电网侧'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 'load',
|
value: 'load',
|
||||||
label: '负载侧'
|
label: '负载侧'
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
const waveFormAnalysisRef = ref()
|
const waveFormAnalysisRef = ref()
|
||||||
|
|
||||||
const tableStore = new TableStore({
|
const tableStore = new TableStore({
|
||||||
url: '/cs-harmonic-boot/eventUser/queryEventpageWeb',
|
url: '/cs-harmonic-boot/eventUser/queryEventpageWeb',
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
column: [
|
column: [
|
||||||
{ title: '事件描述', field: 'showName' },
|
{ title: '事件描述', field: 'showName', minWidth: 150 },
|
||||||
{ title: '发生位置', field: 'evtParamPosition' },
|
{ title: '发生位置', field: 'evtParamPosition', minWidth: 150 },
|
||||||
{ title: '持续时间(s)', field: 'evtParamTm', sortable: true },
|
{
|
||||||
{
|
title: '持续时间(s)',
|
||||||
title: '暂降(聚升)幅值(%)',
|
field: 'evtParamTm',
|
||||||
field: 'evtParamVVaDepth',
|
sortable: true,
|
||||||
formatter: (row: any) => {
|
minWidth: 110,
|
||||||
let a = row.cellValue.split('%')[0] - 0
|
formatter: (row: any) => {
|
||||||
console.log('🚀 ~ a:', a)
|
return Math.floor(row.cellValue * 10000) / 100
|
||||||
return a ? a.toFixed(2) : '/'
|
}
|
||||||
}, sortable: true
|
},
|
||||||
},
|
{
|
||||||
{ title: '发生时刻', field: 'startTime', sortable: true },
|
title: '暂降(聚升)幅值(%)',
|
||||||
{
|
field: 'evtParamVVaDepth',
|
||||||
title: '操作',
|
minWidth: 150,
|
||||||
align: 'center',
|
formatter: (row: any) => {
|
||||||
width: '180',
|
let a = row.cellValue.split('%')[0] - 0
|
||||||
render: 'buttons',
|
return a ? a.toFixed(2) : '/'
|
||||||
buttons: [
|
},
|
||||||
{
|
sortable: true
|
||||||
name: 'edit',
|
},
|
||||||
text: '波形分析',
|
{ title: '发生时刻', field: 'startTime', sortable: true, minWidth: 180 },
|
||||||
type: 'primary',
|
{
|
||||||
icon: 'el-icon-DataLine',
|
title: '操作',
|
||||||
render: 'basicButton',
|
align: 'center',
|
||||||
disabled: row => {
|
width: '180',
|
||||||
return !row.wavePath && row.evtParamTm < 20
|
render: 'buttons',
|
||||||
},
|
buttons: [
|
||||||
|
{
|
||||||
click: async row => {
|
name: 'edit',
|
||||||
row.loading1 = true
|
text: '波形分析',
|
||||||
loading.value = true
|
type: 'primary',
|
||||||
isWaveCharts.value = true
|
icon: 'el-icon-DataLine',
|
||||||
await analyseWave(row.id)
|
render: 'basicButton',
|
||||||
.then(res => {
|
disabled: row => {
|
||||||
row.loading1 = false
|
return !row.wavePath && row.evtParamTm < 20
|
||||||
if (res != undefined) {
|
},
|
||||||
boxoList.value = row
|
|
||||||
boxoList.value.featureAmplitude =
|
click: async row => {
|
||||||
row.evtParamVVaDepth != '-' ? row.evtParamVVaDepth - 0 : null
|
row.loading1 = true
|
||||||
// boxoList.value.systemType = 'WX'
|
loading.value = true
|
||||||
wp.value = res.data
|
isWaveCharts.value = true
|
||||||
}
|
await analyseWave(row.id)
|
||||||
loading.value = false
|
.then(res => {
|
||||||
})
|
row.loading1 = false
|
||||||
.catch(() => {
|
if (res != undefined) {
|
||||||
row.loading1 = false
|
boxoList.value = row
|
||||||
loading.value = false
|
boxoList.value.featureAmplitude =
|
||||||
})
|
row.evtParamVVaDepth != '-' ? row.evtParamVVaDepth - 0 : null
|
||||||
|
// boxoList.value.systemType = 'WX'
|
||||||
nextTick(() => {
|
wp.value = res.data
|
||||||
waveFormAnalysisRef.value &&
|
}
|
||||||
waveFormAnalysisRef.value.getWpData(wp.value, boxoList.value, true)
|
loading.value = false
|
||||||
waveFormAnalysisRef.value && waveFormAnalysisRef.value.setHeight(false, 150)
|
})
|
||||||
})
|
.catch(() => {
|
||||||
}
|
row.loading1 = false
|
||||||
},
|
loading.value = false
|
||||||
{
|
})
|
||||||
name: 'edit',
|
|
||||||
text: '暂无波形',
|
nextTick(() => {
|
||||||
type: 'info',
|
waveFormAnalysisRef.value &&
|
||||||
icon: 'el-icon-DataLine',
|
waveFormAnalysisRef.value.getWpData(wp.value, boxoList.value, true)
|
||||||
render: 'basicButton',
|
waveFormAnalysisRef.value && waveFormAnalysisRef.value.setHeight(false, 150)
|
||||||
disabled: row => {
|
})
|
||||||
return !(!row.wavePath && row.evtParamTm < 20)
|
}
|
||||||
}
|
},
|
||||||
},
|
{
|
||||||
{
|
name: 'edit',
|
||||||
name: 'edit',
|
text: '暂无波形',
|
||||||
title: '波形下载',
|
type: 'info',
|
||||||
type: 'primary',
|
icon: 'el-icon-DataLine',
|
||||||
icon: 'el-icon-Check',
|
render: 'basicButton',
|
||||||
loading: 'loading2',
|
disabled: row => {
|
||||||
render: 'basicButton',
|
return !(!row.wavePath && row.evtParamTm < 20)
|
||||||
disabled: row => {
|
}
|
||||||
// && row.evtParamTm < 20
|
},
|
||||||
return !row.wavePath
|
{
|
||||||
},
|
name: 'edit',
|
||||||
click: row => {
|
title: '波形下载',
|
||||||
getFileZip({ eventId: row.id }).then(res => {
|
type: 'primary',
|
||||||
let blob = new Blob([res], { type: 'application/zip' }) // console.log(blob) // var href = window.URL.createObjectURL(blob); //创建下载的链接
|
icon: 'el-icon-Check',
|
||||||
const url = window.URL.createObjectURL(blob)
|
loading: 'loading2',
|
||||||
const link = document.createElement('a') // 创建a标签
|
render: 'basicButton',
|
||||||
link.href = url
|
disabled: row => {
|
||||||
link.download = row.wavePath.split('/')[2] || '波形文件' // 设置下载的文件名
|
// && row.evtParamTm < 20
|
||||||
document.body.appendChild(link)
|
return !row.wavePath
|
||||||
link.click() //执行下载
|
},
|
||||||
document.body.removeChild(link) //释放标签
|
click: row => {
|
||||||
})
|
getFileZip({ eventId: row.id }).then(res => {
|
||||||
}
|
let blob = new Blob([res], { type: 'application/zip' }) // console.log(blob) // var href = window.URL.createObjectURL(blob); //创建下载的链接
|
||||||
}
|
const url = window.URL.createObjectURL(blob)
|
||||||
]
|
const link = document.createElement('a') // 创建a标签
|
||||||
}
|
link.href = url
|
||||||
],
|
link.download = row.wavePath.split('/')[2] || '波形文件' // 设置下载的文件名
|
||||||
loadCallback: () => {
|
document.body.appendChild(link)
|
||||||
tableStore.table.data.forEach((item: any) => {
|
link.click() //执行下载
|
||||||
item.loading = false
|
document.body.removeChild(link) //释放标签
|
||||||
item.evtParamTm = item.evtParamTm.split('s')[0]
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
})
|
]
|
||||||
const flag = ref(false)
|
}
|
||||||
tableStore.table.params.type = 0
|
],
|
||||||
tableStore.table.params.eventType = ''
|
loadCallback: () => {
|
||||||
tableStore.table.params.location = ''
|
tableStore.table.data.forEach((item: any) => {
|
||||||
provide('tableStore', tableStore)
|
item.loading = false
|
||||||
const deviceTypeChange = (val: any, obj: any) => {
|
item.evtParamTm = item.evtParamTm.split('s')[0]
|
||||||
flag.value = true
|
})
|
||||||
nodeClick(obj)
|
}
|
||||||
}
|
})
|
||||||
const nodeClick = async (e: anyObj) => {
|
const flag = ref(false)
|
||||||
// console.log("🚀 ~ nodeClick ~ e:", e)
|
tableStore.table.params.type = 0
|
||||||
if (e.level == 2&& flag.value) {
|
tableStore.table.params.eventType = ''
|
||||||
loading.value = false
|
tableStore.table.params.location = ''
|
||||||
tableStore.table.params.deviceId = e.id
|
provide('tableStore', tableStore)
|
||||||
nextTick(() => {
|
const deviceTypeChange = (val: any, obj: any) => {
|
||||||
tableStore.index()
|
flag.value = true
|
||||||
})
|
nodeClick(obj)
|
||||||
}
|
}
|
||||||
}
|
const nodeClick = async (e: anyObj) => {
|
||||||
|
// console.log("🚀 ~ nodeClick ~ e:", e)
|
||||||
const changeView = () => {
|
if (e.level == 2 && flag.value) {
|
||||||
showBoxi.value = false
|
loading.value = false
|
||||||
setTimeout(() => {
|
tableStore.table.params.deviceId = e.id
|
||||||
showBoxi.value = true
|
nextTick(() => {
|
||||||
}, 0)
|
tableStore.index()
|
||||||
}
|
})
|
||||||
const bxhandleClick = (tab: any) => {
|
}
|
||||||
if (tab.name == 'ssbx') {
|
}
|
||||||
bxactiveName.value = 'ssbx'
|
|
||||||
} else if (tab.name == 'rmsbx') {
|
const changeView = () => {
|
||||||
bxactiveName.value = 'rmsbx'
|
showBoxi.value = false
|
||||||
}
|
setTimeout(() => {
|
||||||
// console.log(tab, event);
|
showBoxi.value = true
|
||||||
}
|
}, 0)
|
||||||
const backbxlb = () => {
|
}
|
||||||
view.value = true
|
const bxhandleClick = (tab: any) => {
|
||||||
view2.value = false
|
if (tab.name == 'ssbx') {
|
||||||
}
|
bxactiveName.value = 'ssbx'
|
||||||
const bxecharts = mainHeight(95).height as any
|
} else if (tab.name == 'rmsbx') {
|
||||||
</script>
|
bxactiveName.value = 'rmsbx'
|
||||||
|
}
|
||||||
<style lang="scss">
|
// console.log(tab, event);
|
||||||
.analyze-dvr {
|
}
|
||||||
display: flex;
|
const backbxlb = () => {
|
||||||
|
view.value = true
|
||||||
&-right {
|
view2.value = false
|
||||||
height: 100%;
|
}
|
||||||
overflow: hidden;
|
const bxecharts = mainHeight(95).height as any
|
||||||
flex: 1;
|
</script>
|
||||||
padding: 10px 10px 10px 0;
|
|
||||||
display: flex;
|
<style lang="scss">
|
||||||
flex-direction: column;
|
.analyze-dvr {
|
||||||
}
|
display: flex;
|
||||||
}
|
|
||||||
</style>
|
&-right {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 1;
|
||||||
|
padding: 10px 10px 10px 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,176 +1,176 @@
|
|||||||
<!-- 补召日志 -->
|
<!-- 补召日志 -->
|
||||||
<template>
|
<template>
|
||||||
<el-dialog modal-class="analysisList" v-model.trim="dialogVisible" title="补召日志" width="70%" draggable
|
<el-dialog modal-class="analysisList" v-model.trim="dialogVisible" title="补召日志" width="70%" draggable
|
||||||
@closed="close">
|
@closed="close">
|
||||||
<TableHeader date-picker :showReset="false">
|
<TableHeader date-picker :showReset="false">
|
||||||
<template #operation>
|
<template #operation>
|
||||||
<el-button type="primary" icon="el-icon-Connection" @click="handleImport">
|
<el-button type="primary" icon="el-icon-Connection" @click="handleImport">
|
||||||
离线补召
|
离线补召
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="primary" icon="el-icon-Monitor" @click="handleaddDevice">
|
<el-button type="primary" icon="el-icon-Monitor" @click="handleaddDevice">
|
||||||
在线补召
|
在线补召
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<Table ref="tableRef" />
|
<Table ref="tableRef" :height="`calc(45vh - 50px)`"/>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<popup ref="detailRef"></popup>
|
<popup ref="detailRef"></popup>
|
||||||
<!-- 离线数据导入组件 -->
|
<!-- 离线数据导入组件 -->
|
||||||
<!-- <offLineDataImport ref="offLineDataImportRef"></offLineDataImport> -->
|
<!-- <offLineDataImport ref="offLineDataImportRef"></offLineDataImport> -->
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref, onMounted, provide, onBeforeUnmount } from 'vue'
|
import { ref, onMounted, provide, onBeforeUnmount } from 'vue'
|
||||||
import TableStore from '@/utils/tableStore'
|
import TableStore from '@/utils/tableStore'
|
||||||
import Table from '@/components/table/index.vue'
|
import Table from '@/components/table/index.vue'
|
||||||
import TableHeader from '@/components/table/header/index.vue'
|
import TableHeader from '@/components/table/header/index.vue'
|
||||||
import offLineDataImport from '../offLineDataImport/index.vue'
|
import offLineDataImport from '../offLineDataImport/index.vue'
|
||||||
import popup from './popup.vue'
|
import popup from './popup.vue'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'offLineDataImport'
|
name: 'offLineDataImport'
|
||||||
})
|
})
|
||||||
const emit = defineEmits(['back'])
|
const emit = defineEmits(['back'])
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const height = ref(0)
|
const height = ref(0)
|
||||||
height.value = window.innerHeight < 1080 ? 230 : 450
|
height.value = window.innerHeight < 1080 ? 230 : 450
|
||||||
const detailRef: any = ref()
|
const detailRef: any = ref()
|
||||||
const lineId = ref('')
|
const lineId = ref('')
|
||||||
const deviceId = ref('')
|
const deviceId = ref('')
|
||||||
const deviceData = ref({})
|
const deviceData = ref({})
|
||||||
const { push, options, currentRoute } = useRouter()
|
const { push, options, currentRoute } = useRouter()
|
||||||
const tableStore: any = new TableStore({
|
const tableStore: any = new TableStore({
|
||||||
url: '/cs-device-boot/portableOfflLog/queryMainLogPage',
|
url: '/cs-device-boot/portableOfflLog/queryMainLogPage',
|
||||||
publicHeight: 420,
|
publicHeight: 420,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
column: [
|
column: [
|
||||||
// { width: '60', type: 'checkbox', fixed: 'left' },
|
// { width: '60', type: 'checkbox', fixed: 'left' },
|
||||||
{
|
{
|
||||||
title: '序号', width: 80, formatter: (row: any) => {
|
title: '序号', width: 80, formatter: (row: any) => {
|
||||||
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
|
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'projectName',
|
field: 'projectName',
|
||||||
title: '工程名称',
|
title: '工程名称',
|
||||||
minWidth: 170,
|
minWidth: 170,
|
||||||
formatter: row => {
|
formatter: row => {
|
||||||
return row.cellValue ? row.cellValue : '/'
|
return row.cellValue ? row.cellValue : '/'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ field: 'successCount', title: '成功解析数', minWidth: 150 },
|
{ field: 'successCount', title: '成功解析数', minWidth: 150 },
|
||||||
{ field: 'startTime', title: '导入开始时间', minWidth: 170, sortable: true },
|
{ field: 'startTime', title: '导入开始时间', minWidth: 170, sortable: true },
|
||||||
{ field: 'endTime', title: '导入结束时间', minWidth: 170 , sortable: true},
|
{ field: 'endTime', title: '导入结束时间', minWidth: 170 , sortable: true},
|
||||||
{
|
{
|
||||||
title: '解析状态',
|
title: '解析状态',
|
||||||
field: 'status',
|
field: 'status',
|
||||||
width: 100,
|
width: 100,
|
||||||
render: 'tag',
|
render: 'tag',
|
||||||
custom: {
|
custom: {
|
||||||
0: 'warning',
|
0: 'warning',
|
||||||
1: 'success',
|
1: 'success',
|
||||||
2: 'danger',
|
2: 'danger',
|
||||||
3: 'primary'
|
3: 'primary'
|
||||||
},
|
},
|
||||||
replaceValue: {
|
replaceValue: {
|
||||||
0: '未解析',
|
0: '未解析',
|
||||||
1: '解析成功',
|
1: '解析成功',
|
||||||
2: '解析失败',
|
2: '解析失败',
|
||||||
3: '文件不存在'
|
3: '文件不存在'
|
||||||
}
|
}
|
||||||
// formatter: row => {
|
// formatter: row => {
|
||||||
// return row.cellValue == 1 ? '未注册' : row.cellValue == 2 ? '注册' : '接入'
|
// return row.cellValue == 1 ? '未注册' : row.cellValue == 2 ? '注册' : '接入'
|
||||||
// },
|
// },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
width: '100',
|
width: '100',
|
||||||
render: 'buttons',
|
render: 'buttons',
|
||||||
buttons: [
|
buttons: [
|
||||||
{
|
{
|
||||||
name: 'edit',
|
name: 'edit',
|
||||||
title: '详情',
|
title: '详情',
|
||||||
type: 'primary',
|
type: 'primary',
|
||||||
icon: 'el-icon-EditPen',
|
icon: 'el-icon-EditPen',
|
||||||
render: 'basicButton',
|
render: 'basicButton',
|
||||||
click: row => {
|
click: row => {
|
||||||
// console.log(row.portableOfflLogList)
|
// console.log(row.portableOfflLogList)
|
||||||
detailRef.value.open(row.portableOfflLogList)
|
detailRef.value.open(row.portableOfflLogList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
beforeSearchFun: () => {
|
beforeSearchFun: () => {
|
||||||
// tableStore.table.params.devId = tableParams.value.devId
|
// tableStore.table.params.devId = tableParams.value.devId
|
||||||
// tableStore.table.params.lineId = tableParams.value.lineId
|
// tableStore.table.params.lineId = tableParams.value.lineId
|
||||||
// tableStore.table.params.list = tableParams.value.list
|
// tableStore.table.params.list = tableParams.value.list
|
||||||
// tableStore.table.params.type = 3
|
// tableStore.table.params.type = 3
|
||||||
},
|
},
|
||||||
loadCallback: () => {
|
loadCallback: () => {
|
||||||
// tableStore.table.data=[]
|
// tableStore.table.data=[]
|
||||||
tableStore.table.height = 400
|
tableStore.table.height = 400
|
||||||
// console.log(tableStore.table.publicHeight, 'tableStore.table.data')
|
// console.log(tableStore.table.publicHeight, 'tableStore.table.data')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
provide('tableStore', tableStore)
|
provide('tableStore', tableStore)
|
||||||
//返回
|
//返回
|
||||||
const handleBack = () => {
|
const handleBack = () => {
|
||||||
emit('back')
|
emit('back')
|
||||||
}
|
}
|
||||||
const open = (row: any) => {
|
const open = (row: any) => {
|
||||||
lineId.value = row.lineId
|
lineId.value = row.lineId
|
||||||
deviceData.value = row.deviceData
|
deviceData.value = row.deviceData
|
||||||
deviceId.value = row.deviceId
|
deviceId.value = row.deviceId
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
tableStore.index()
|
tableStore.index()
|
||||||
}, 10)
|
}, 10)
|
||||||
}
|
}
|
||||||
const close = () => {
|
const close = () => {
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
}
|
}
|
||||||
const updateViewportHeight = async () => {
|
const updateViewportHeight = async () => {
|
||||||
// height.value = window.innerHeight;
|
// height.value = window.innerHeight;
|
||||||
height.value = window.innerHeight < 1080 ? 230 : 450
|
height.value = window.innerHeight < 1080 ? 230 : 450
|
||||||
// tableStore.table.publicHeight = height.value
|
// tableStore.table.publicHeight = height.value
|
||||||
// await tableStore.index()
|
// await tableStore.index()
|
||||||
}
|
}
|
||||||
//设备补召
|
//设备补召
|
||||||
const handleaddDevice = () => {
|
const handleaddDevice = () => {
|
||||||
push({
|
push({
|
||||||
path: '/supplementaryRecruitment',
|
path: '/supplementaryRecruitment',
|
||||||
query: {
|
query: {
|
||||||
activeName: '0',
|
activeName: '0',
|
||||||
id: lineId.value,
|
id: lineId.value,
|
||||||
ndid: deviceData.value?.ndid,
|
ndid: deviceData.value?.ndid,
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const offLineDataImportRef = ref()
|
const offLineDataImportRef = ref()
|
||||||
const handleImport = () => {
|
const handleImport = () => {
|
||||||
//设备devId&监测点lineId带入组件
|
//设备devId&监测点lineId带入组件
|
||||||
// offLineDataImportRef.value && offLineDataImportRef.value.open(deviceId.value, lineId.value)
|
// offLineDataImportRef.value && offLineDataImportRef.value.open(deviceId.value, lineId.value)
|
||||||
push({
|
push({
|
||||||
path: '/supplementaryRecruitment',
|
path: '/supplementaryRecruitment',
|
||||||
query: {
|
query: {
|
||||||
activeName: '1',
|
activeName: '1',
|
||||||
lineId: lineId.value,
|
lineId: lineId.value,
|
||||||
deviceId: deviceId.value,
|
deviceId: deviceId.value,
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
updateViewportHeight() // 初始化视口高度
|
updateViewportHeight() // 初始化视口高度
|
||||||
window.addEventListener('resize', updateViewportHeight) // 监听窗口大小变化
|
window.addEventListener('resize', updateViewportHeight) // 监听窗口大小变化
|
||||||
})
|
})
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
window.removeEventListener('resize', updateViewportHeight) // 移除监听
|
window.removeEventListener('resize', updateViewportHeight) // 移除监听
|
||||||
})
|
})
|
||||||
defineExpose({ open })
|
defineExpose({ open })
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
@@ -498,9 +498,9 @@ const range = (start: any, end: any, step: any) => {
|
|||||||
const colors = ['#DAA520', '#2E8B57', '#A52a2a']
|
const colors = ['#DAA520', '#2E8B57', '#A52a2a']
|
||||||
const lineStyle = [{ type: 'solid' }, { type: 'dashed' }, { type: 'dotted' }]
|
const lineStyle = [{ type: 'solid' }, { type: 'dashed' }, { type: 'dotted' }]
|
||||||
|
|
||||||
const titleList: any = ref('')
|
const titleList: any = ref('(未绑定数据)')
|
||||||
const init = (flag: boolean) => {
|
const init = (flag: boolean) => {
|
||||||
titleList.value = ''
|
titleList.value = '(未绑定数据)'
|
||||||
let list: any = []
|
let list: any = []
|
||||||
|
|
||||||
//颜色数组
|
//颜色数组
|
||||||
@@ -574,6 +574,8 @@ const init = (flag: boolean) => {
|
|||||||
}).then(res => {
|
}).then(res => {
|
||||||
if (res.data.length == 0) {
|
if (res.data.length == 0) {
|
||||||
titleList.value = '(未绑定数据)'
|
titleList.value = '(未绑定数据)'
|
||||||
|
}else{
|
||||||
|
titleList.value = ''
|
||||||
}
|
}
|
||||||
chartTitle.value = chartTitle.value + titleList.value
|
chartTitle.value = chartTitle.value + titleList.value
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ const tableStore = new TableStore({
|
|||||||
{ title: '用户名称', field: 'userName', align: 'center', minWidth: '130' },
|
{ title: '用户名称', field: 'userName', align: 'center', minWidth: '130' },
|
||||||
{ title: '更新时间', field: 'updateTime', align: 'center', sortable: true, minWidth: '150' },
|
{ title: '更新时间', field: 'updateTime', align: 'center', sortable: true, minWidth: '150' },
|
||||||
{ title: '失败原因', field: 'failReason', align: 'center', minWidth: '200' },
|
{ title: '失败原因', field: 'failReason', align: 'center', minWidth: '200' },
|
||||||
{ title: '状态', field: 'result', align: 'center', minWidth: '120' },
|
{ title: '状态', field: 'result', align: 'center', minWidth: '100' },
|
||||||
{ title: '登录名', field: 'loginName', align: 'center', minWidth: '120' }
|
{ title: '登录名', field: 'loginName', align: 'center', minWidth: '120' }
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -1,107 +1,149 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="default-main" v-loading="loading">
|
<div class="default-main" v-loading="loading">
|
||||||
<TableHeader ref="tableHeaderRef">
|
<TableHeader ref="tableHeaderRef">
|
||||||
<template #select>
|
<template #select>
|
||||||
<el-form-item label="模版名称">
|
<el-form-item label="模版名称">
|
||||||
<el-input maxlength="32" show-word-limit v-model.trim="tableStore.table.params.name" clearable
|
<el-input
|
||||||
placeholder="请输入名称"></el-input>
|
maxlength="32"
|
||||||
</el-form-item>
|
show-word-limit
|
||||||
<el-form-item label="装置型号">
|
v-model.trim="tableStore.table.params.name"
|
||||||
<el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择" clearable>
|
clearable
|
||||||
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
|
placeholder="请输入名称"
|
||||||
:value="item.id"></el-option>
|
></el-input>
|
||||||
</el-select>
|
</el-form-item>
|
||||||
</el-form-item>
|
<el-form-item label="装置型号">
|
||||||
</template>
|
<el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择" clearable>
|
||||||
<template #operation>
|
<el-option
|
||||||
<el-upload action="" class="upload-demo" :show-file-list="false" :auto-upload="false"
|
v-for="item in DevTypeOptions"
|
||||||
:on-change="chooseFile">
|
:key="item.id"
|
||||||
<el-button :icon="Plus" type="primary" class="ml10">新增模版</el-button>
|
:label="item.name"
|
||||||
</el-upload>
|
:value="item.id"
|
||||||
</template>
|
></el-option>
|
||||||
</TableHeader>
|
</el-select>
|
||||||
<Table ref="tableRef" />
|
</el-form-item>
|
||||||
</div>
|
</template>
|
||||||
</template>
|
<template #operation>
|
||||||
<script setup lang="ts">
|
<el-upload
|
||||||
import { ref, onMounted, provide } from 'vue'
|
action=""
|
||||||
import TableStore from '@/utils/tableStore'
|
class="upload-demo"
|
||||||
import Table from '@/components/table/index.vue'
|
:accept="'.json'"
|
||||||
import TableHeader from '@/components/table/header/index.vue'
|
:show-file-list="false"
|
||||||
import { ElMessage } from 'element-plus'
|
:auto-upload="false"
|
||||||
import { queryByCode, queryByid } from '@/api/system-boot/dictTree'
|
:on-change="chooseFile"
|
||||||
import { Plus } from '@element-plus/icons-vue'
|
>
|
||||||
import { addDevModel } from '@/api/access-boot/analyzeModel'
|
<el-button :icon="Plus" type="primary" class="ml10">新增模版</el-button>
|
||||||
import { AuditDevModel } from '@/api/cs-device-boot/devmodel'
|
</el-upload>
|
||||||
|
</template>
|
||||||
defineOptions({
|
</TableHeader>
|
||||||
name: 'govern/manage/basic/template'
|
<Table ref="tableRef" />
|
||||||
})
|
</div>
|
||||||
const DevTypeOptions = ref()
|
</template>
|
||||||
const tableHeaderRef = ref()
|
<script setup lang="ts">
|
||||||
queryByCode('Direct_Connected_Device').then(res => {
|
import { ref, onMounted, provide } from 'vue'
|
||||||
queryByid(res.data.id).then(res => {
|
import TableStore from '@/utils/tableStore'
|
||||||
DevTypeOptions.value = res.data
|
import Table from '@/components/table/index.vue'
|
||||||
})
|
import TableHeader from '@/components/table/header/index.vue'
|
||||||
})
|
import { ElMessage } from 'element-plus'
|
||||||
const tableStore = new TableStore({
|
import { queryByCode, queryByid } from '@/api/system-boot/dictTree'
|
||||||
url: '/cs-device-boot/devmodel/queryDevModelPage',
|
import { Plus } from '@element-plus/icons-vue'
|
||||||
method: 'POST',
|
import { addDevModel } from '@/api/access-boot/analyzeModel'
|
||||||
column: [
|
import { AuditDevModel } from '@/api/cs-device-boot/devmodel'
|
||||||
{ title: '装置型号', field: 'devTypeName' },
|
import { getFileUrl, downLoadFile } from '@/api/cs-system-boot/manage'
|
||||||
{ title: '模板名称', field: 'name' },
|
defineOptions({
|
||||||
{ title: '版本号', field: 'versionNo' },
|
name: 'govern/manage/basic/template'
|
||||||
{ title: '版本时间', field: 'versionDate', sortable: true },
|
})
|
||||||
{
|
const DevTypeOptions = ref()
|
||||||
title: '操作',
|
const tableHeaderRef = ref()
|
||||||
align: 'center',
|
queryByCode('Direct_Connected_Device').then(res => {
|
||||||
width: '180',
|
queryByid(res.data.id).then(res => {
|
||||||
render: 'buttons',
|
DevTypeOptions.value = res.data
|
||||||
buttons: [
|
})
|
||||||
{
|
})
|
||||||
name: 'del',
|
const tableStore = new TableStore({
|
||||||
title: '删除',
|
url: '/cs-device-boot/devmodel/queryDevModelPage',
|
||||||
type: 'danger',
|
method: 'POST',
|
||||||
icon: 'el-icon-Delete',
|
column: [
|
||||||
render: 'confirmButton',
|
{ title: '装置型号', field: 'devTypeName' },
|
||||||
popconfirm: {
|
{ title: '模板名称', field: 'name' },
|
||||||
confirmButtonText: '确认',
|
{ title: '版本号', field: 'versionNo' },
|
||||||
cancelButtonText: '取消',
|
{ title: '版本时间', field: 'versionDate', sortable: true },
|
||||||
confirmButtonType: 'danger',
|
{
|
||||||
title: '确定删除吗?'
|
title: '操作',
|
||||||
},
|
align: 'center',
|
||||||
click: row => {
|
width: '180',
|
||||||
AuditDevModel({
|
render: 'buttons',
|
||||||
id: row.id,
|
buttons: [
|
||||||
status: 0
|
{
|
||||||
}).then(() => {
|
name: 'productSetting',
|
||||||
ElMessage.success('删除成功')
|
title: '下载模版',
|
||||||
tableStore.index()
|
type: 'primary',
|
||||||
})
|
icon: 'el-icon-EditPen',
|
||||||
}
|
render: 'basicButton',
|
||||||
}
|
click: row => {
|
||||||
]
|
downloadTheReport(row.filePath,row.devTypeName)
|
||||||
}
|
}
|
||||||
]
|
},
|
||||||
})
|
{
|
||||||
tableStore.table.params.devType = ''
|
name: 'del',
|
||||||
tableStore.table.params.name = ''
|
title: '删除',
|
||||||
provide('tableStore', tableStore)
|
type: 'danger',
|
||||||
onMounted(() => {
|
icon: 'el-icon-Delete',
|
||||||
tableStore.index()
|
render: 'confirmButton',
|
||||||
})
|
popconfirm: {
|
||||||
const loading = ref(false)
|
confirmButtonText: '确认',
|
||||||
const chooseFile = (e: any) => {
|
cancelButtonText: '取消',
|
||||||
console.warn(e)
|
confirmButtonType: 'danger',
|
||||||
loading.value = true
|
title: '确定删除吗?'
|
||||||
addDevModel(e.raw).then((res: any) => {
|
},
|
||||||
if (res.code == 'A0000') {
|
click: row => {
|
||||||
loading.value = false
|
AuditDevModel({
|
||||||
tableStore.index()
|
id: row.id,
|
||||||
}
|
status: 0
|
||||||
|
}).then(() => {
|
||||||
}).catch((e) => {
|
ElMessage.success('删除成功')
|
||||||
loading.value = false
|
tableStore.index()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
</script>
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
tableStore.table.params.devType = ''
|
||||||
|
tableStore.table.params.name = ''
|
||||||
|
provide('tableStore', tableStore)
|
||||||
|
onMounted(() => {
|
||||||
|
tableStore.index()
|
||||||
|
})
|
||||||
|
const loading = ref(false)
|
||||||
|
const chooseFile = (e: any) => {
|
||||||
|
console.warn(e)
|
||||||
|
loading.value = true
|
||||||
|
addDevModel(e.raw)
|
||||||
|
.then((res: any) => {
|
||||||
|
if (res.code == 'A0000') {
|
||||||
|
loading.value = false
|
||||||
|
tableStore.index()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(e => {
|
||||||
|
loading.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 下载报告
|
||||||
|
const downloadTheReport = (filePath: string,name:string) => {
|
||||||
|
downLoadFile(filePath).then(res => {
|
||||||
|
let blob = new Blob([res], {
|
||||||
|
type: ' application/json'
|
||||||
|
})
|
||||||
|
const url = window.URL.createObjectURL(blob)
|
||||||
|
const link = document.createElement('a') // 创建a标签
|
||||||
|
link.href = url
|
||||||
|
link.download = name+'.json' // 设置下载的文件名
|
||||||
|
document.body.appendChild(link)
|
||||||
|
link.click() //执行下载
|
||||||
|
document.body.removeChild(link)
|
||||||
|
ElMessage.success('下载成功')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ defineOptions({
|
|||||||
const adminInfo = useAdminInfo()
|
const adminInfo = useAdminInfo()
|
||||||
|
|
||||||
const hasAdmin =
|
const hasAdmin =
|
||||||
adminInfo.userType.some(item => item.includes('operation_manager') || item.includes('root')) ||
|
adminInfo.roleCode.some(item => item.includes('operation_manager') || item.includes('root')) ||
|
||||||
adminInfo.userType == 1
|
adminInfo.userType == 1
|
||||||
const tableRef = ref()
|
const tableRef = ref()
|
||||||
const popupRef = ref()
|
const popupRef = ref()
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ const choose = (files: any) => {
|
|||||||
const isJPEG = files.raw.type === 'image/jpeg'
|
const isJPEG = files.raw.type === 'image/jpeg'
|
||||||
const isPNG = files.raw.type === 'image/png'
|
const isPNG = files.raw.type === 'image/png'
|
||||||
if (!isJPG && !isPNG && !isJPEG) {
|
if (!isJPG && !isPNG && !isJPEG) {
|
||||||
ElMessage.warning('上传文件只能是 JPG/PNG 格式!')
|
ElMessage.warning('上传文件只能是 jpg/png 格式!')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ onMounted(() => {
|
|||||||
// })
|
// })
|
||||||
|
|
||||||
const stencil = (val: any) => {
|
const stencil = (val: any) => {
|
||||||
templatePolicy.value = val.filter((item: any) => item.name != '稳态治理报表')
|
templatePolicy.value = val.filter((item: any) => item.reportForm != '4')
|
||||||
Template.value = templatePolicy.value[0]
|
Template.value = templatePolicy.value[0]
|
||||||
reportForm.value = templatePolicy.value[0]?.reportForm
|
reportForm.value = templatePolicy.value[0]?.reportForm
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ const initListByIds = () => {
|
|||||||
}
|
}
|
||||||
const stencil = (val: any) => {
|
const stencil = (val: any) => {
|
||||||
console.log('🚀 ~ stencil ~ val:', val)
|
console.log('🚀 ~ stencil ~ val:', val)
|
||||||
templatePolicy.value = val.filter((item: any) => item.name == '稳态治理报表')
|
templatePolicy.value = val.filter((item: any) => item.reportForm == '4')
|
||||||
Template.value = templatePolicy.value[0]
|
Template.value = templatePolicy.value[0]
|
||||||
reportForm.value = templatePolicy.value[0]?.reportForm
|
reportForm.value = templatePolicy.value[0]?.reportForm
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog draggable :title="title" v-model.trim="formVisible" width="30%" :before-close="closeDialog">
|
<el-dialog draggable :title="title" v-model.trim="formVisible" width="500px" :before-close="closeDialog">
|
||||||
<el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm">
|
<el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm" class="form-one">
|
||||||
<el-form-item label="模板名称:" prop="name">
|
<el-form-item label="模板名称:" prop="name">
|
||||||
<el-input maxlength="32" show-word-limit placeholder="模板名称" v-model.trim="formdata.name"
|
<el-input maxlength="32" show-word-limit placeholder="模板名称" v-model.trim="formdata.name"
|
||||||
style="width: 100%"></el-input>
|
style="width: 100%"></el-input>
|
||||||
@@ -56,11 +56,15 @@ const reportFormList = [
|
|||||||
{
|
{
|
||||||
value: '2',
|
value: '2',
|
||||||
label: '统计报表'
|
label: '统计报表'
|
||||||
|
}, {
|
||||||
|
value: '4',
|
||||||
|
label: '治理前后对比报表'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '3',
|
value: '3',
|
||||||
label: '自定义报表'
|
label: '自定义报表'
|
||||||
}
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
const rules = {
|
const rules = {
|
||||||
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
|
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ const tableStore: any = new TableStore({
|
|||||||
column: [
|
column: [
|
||||||
{ field: 'name', title: '模板名称' },
|
{ field: 'name', title: '模板名称' },
|
||||||
{ field: 'reportForm', title: '模板类型',formatter: (row) => {
|
{ field: 'reportForm', title: '模板类型',formatter: (row) => {
|
||||||
return row.cellValue == 1 ? '电能质量报表类型' : row.cellValue == 2 ? '用能报表类型' : ''
|
return row.cellValue == 1 ? '分析报表' : row.cellValue == 2 ? '统计报表' : row.cellValue == 3 ? '自定义报表' : '治理前后对比报表'
|
||||||
} },
|
} },
|
||||||
{ field: 'updateBy', title: '更新用户' },
|
{ field: 'updateBy', title: '更新用户' },
|
||||||
{ field: 'createTime', title: '创建时间' , sortable: true},
|
{ field: 'createTime', title: '创建时间' , sortable: true},
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-slot:operation>
|
<template v-slot:operation>
|
||||||
<el-button type="primary" class="ml10" @click="add" icon="el-icon-Plus">新增</el-button>
|
<el-button type="primary" class="ml10" @click="add" icon="el-icon-Plus">新增</el-button>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
</TableHeader>
|
</TableHeader>
|
||||||
<Table
|
<Table
|
||||||
@@ -71,7 +70,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<template v-if="data.id">
|
<template v-if="data.id">
|
||||||
<el-tooltip content="编辑" placement="top">
|
<el-tooltip content="编辑" placement="left">
|
||||||
<el-button
|
<el-button
|
||||||
style="margin-left: 4px"
|
style="margin-left: 4px"
|
||||||
icon="el-icon-Edit"
|
icon="el-icon-Edit"
|
||||||
@@ -82,23 +81,22 @@
|
|||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<el-popconfirm title="确定重启吗?" placement="bottom" @confirm="restart(data)">
|
<el-popconfirm title="确定重启吗?" placement="left" @confirm="restart(data)">
|
||||||
<template #reference>
|
<template #reference>
|
||||||
<el-tooltip content="重启" placement="top">
|
<el-button
|
||||||
<el-button
|
style="margin-left: 4px"
|
||||||
style="margin-left: 4px"
|
icon="el-icon-Refresh"
|
||||||
icon="el-icon-Refresh"
|
type="warning"
|
||||||
type="warning"
|
link
|
||||||
link
|
@click.stop
|
||||||
/>
|
/>
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
</template>
|
||||||
<template #actions="{ confirm, cancel }">
|
<template #actions="{ confirm, cancel }">
|
||||||
<el-button size="small" @click="cancel">取消</el-button>
|
<el-button size="small" @click="cancel">取消</el-button>
|
||||||
<el-button type="warning" size="small" @click="confirm">确认</el-button>
|
<el-button type="warning" size="small" @click="confirm">确认</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-popconfirm>
|
</el-popconfirm>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -179,12 +177,17 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
|
||||||
<!-- 绑定进程号 -->
|
<!-- 绑定进程号 -->
|
||||||
<el-dialog draggable title="绑定进程号" v-model="popUps" :close-on-click-modal="false" width="400px">
|
<el-dialog draggable title="绑定进程号" v-model="popUps" :close-on-click-modal="false" width="400px">
|
||||||
<el-form :model="bindProcessForm" ref="bindProcessFormRef" label-width="80px" :rules="rules2" >
|
<el-form :model="bindProcessForm" ref="bindProcessFormRef" label-width="80px" :rules="rules2">
|
||||||
<el-form-item label="前置机" prop="nodeId">
|
<el-form-item label="前置机" prop="nodeId">
|
||||||
<el-select v-model="bindProcessForm.nodeId" placeholder="请选择前置机" style="width: 100%" clearable @change="handleNodeChange">
|
<el-select
|
||||||
|
v-model="bindProcessForm.nodeId"
|
||||||
|
placeholder="请选择前置机"
|
||||||
|
style="width: 100%"
|
||||||
|
clearable
|
||||||
|
@change="handleNodeChange"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in tableStore.table.data"
|
v-for="item in tableStore.table.data"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
@@ -193,9 +196,14 @@
|
|||||||
></el-option>
|
></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="进程号" prop="processNo">
|
<el-form-item label="进程号" prop="processNo">
|
||||||
<el-select v-model="bindProcessForm.processNo" placeholder="请选择进程号" style="width: 100%" clearable>
|
<el-select
|
||||||
|
v-model="bindProcessForm.processNo"
|
||||||
|
placeholder="请选择进程号"
|
||||||
|
style="width: 100%"
|
||||||
|
clearable
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in processOptions"
|
v-for="item in processOptions"
|
||||||
:key="item.name"
|
:key="item.name"
|
||||||
@@ -211,7 +219,6 @@
|
|||||||
<el-button type="primary" @click="bindTheProcess">确 定</el-button>
|
<el-button type="primary" @click="bindTheProcess">确 定</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -222,7 +229,14 @@ import { ref, onMounted, provide, reactive, nextTick } from 'vue'
|
|||||||
import Table from '@/components/table/index.vue'
|
import Table from '@/components/table/index.vue'
|
||||||
import TableHeader from '@/components/table/header/index.vue'
|
import TableHeader from '@/components/table/header/index.vue'
|
||||||
import { ElButton } from 'element-plus'
|
import { ElButton } from 'element-plus'
|
||||||
import {addNode,updateNode,delNode,nodeDeviceTree,restartProcess,updateProcess} from '@/api/cs-device-boot/frontManagement'
|
import {
|
||||||
|
addNode,
|
||||||
|
updateNode,
|
||||||
|
delNode,
|
||||||
|
nodeDeviceTree,
|
||||||
|
restartProcess,
|
||||||
|
updateProcess
|
||||||
|
} from '@/api/cs-device-boot/frontManagement'
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'govern/setting/frontManagement'
|
name: 'govern/setting/frontManagement'
|
||||||
@@ -427,7 +441,6 @@ const currentChangeEvent = () => {
|
|||||||
|
|
||||||
// 重启进程
|
// 重启进程
|
||||||
const restart = (data: any) => {
|
const restart = (data: any) => {
|
||||||
|
|
||||||
restartProcess({
|
restartProcess({
|
||||||
nodeId: nodeId.value,
|
nodeId: nodeId.value,
|
||||||
processNo: data.processNo
|
processNo: data.processNo
|
||||||
@@ -442,11 +455,10 @@ const change = (val: any) => {
|
|||||||
treeRef.value!.filter(filterText.value)
|
treeRef.value!.filter(filterText.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 修改 edit 方法
|
// 修改 edit 方法
|
||||||
const edit = (data: any) => {
|
const edit = (data: any) => {
|
||||||
bindProcessForm.value.processNo = data.nodeProcess
|
bindProcessForm.value.processNo = data.nodeProcess
|
||||||
bindProcessForm.value.nodeId = nodeId.value // 默认选中当前节点
|
bindProcessForm.value.nodeId = nodeId.value // 默认选中当前节点
|
||||||
processId.value = data.id
|
processId.value = data.id
|
||||||
popUps.value = true
|
popUps.value = true
|
||||||
|
|
||||||
@@ -466,7 +478,6 @@ const loadProcessOptionsForNode = (nodeId: string) => {
|
|||||||
} else {
|
} else {
|
||||||
processOptions.value = []
|
processOptions.value = []
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -477,13 +488,12 @@ const handleNodeChange = (nodeId: any) => {
|
|||||||
bindProcessForm.value.processNo = ''
|
bindProcessForm.value.processNo = ''
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 清除之前选中的进程号
|
// 清除之前选中的进程号
|
||||||
bindProcessForm.value.processNo = ''
|
bindProcessForm.value.processNo = ''
|
||||||
// 加载新选中前置机的进程号选项
|
// 加载新选中前置机的进程号选项
|
||||||
loadProcessOptionsForNode(nodeId)
|
loadProcessOptionsForNode(nodeId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 更新进程号
|
// 更新进程号
|
||||||
const bindTheProcess = () => {
|
const bindTheProcess = () => {
|
||||||
bindProcessFormRef.value.validate((valid: any) => {
|
bindProcessFormRef.value.validate((valid: any) => {
|
||||||
@@ -499,8 +509,6 @@ const bindTheProcess = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
const filterNode = (value: string, data: any, node: any) => {
|
const filterNode = (value: string, data: any, node: any) => {
|
||||||
if (!value) return true
|
if (!value) return true
|
||||||
@@ -537,7 +545,6 @@ const chooseNode = (value: string, data: any, node: any) => {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
tableStore.table.params.orderBy = 'desc'
|
tableStore.table.params.orderBy = 'desc'
|
||||||
tableStore.table.params.nodeGrade = ''
|
tableStore.table.params.nodeGrade = ''
|
||||||
tableStore.table.params.searchState = ''
|
tableStore.table.params.searchState = ''
|
||||||
@@ -591,8 +598,6 @@ onMounted(() => {
|
|||||||
tableStore.index()
|
tableStore.index()
|
||||||
}, 100)
|
}, 100)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@@ -623,7 +628,6 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
:deep(.default) {
|
:deep(.default) {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
}
|
}
|
||||||
.custom-tree-node {
|
.custom-tree-node {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|||||||
@@ -1,107 +1,107 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog draggable :title="title" v-model.trim="formVisible" width="30%" :before-close="closeDialog">
|
<el-dialog draggable :title="title" v-model.trim="formVisible" width="30%" :before-close="closeDialog">
|
||||||
<el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm">
|
<el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm">
|
||||||
<el-form-item label="模板名称:" prop="name">
|
<el-form-item label="模板名称:" prop="name">
|
||||||
<el-input maxlength="32" show-word-limit placeholder="模板名称" v-model.trim="formdata.name"
|
<el-input maxlength="32" show-word-limit placeholder="模板名称" v-model.trim="formdata.name"
|
||||||
style="width: 100%"></el-input>
|
style="width: 100%"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="部门:" prop="deptId">
|
<el-form-item label="部门:" prop="deptId">
|
||||||
<Area v-model.trim="formdata.deptId" style="width: 100%" collapse-tags
|
<Area v-model.trim="formdata.deptId" style="width: 100%" collapse-tags
|
||||||
:props="{ multiple: true, label: 'name', value: 'id', emitPath: false }" />
|
:props="{ multiple: true, label: 'name', value: 'id', emitPath: false }" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="模板类型:" prop="reportType">
|
<el-form-item label="模板类型:" prop="reportType">
|
||||||
<el-select style="width: 100%" v-model.trim="formdata.reportType" placeholder="请选择模板类型">
|
<el-select style="width: 100%" v-model.trim="formdata.reportType" placeholder="请选择模板类型">
|
||||||
<el-option v-for="item in classificationData" :key="item.id" :label="item.label"
|
<el-option v-for="item in classificationData" :key="item.id" :label="item.label"
|
||||||
:value="item.id"></el-option>
|
:value="item.id"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="报表类型:" prop="reportForm">
|
<el-form-item label="报表类型:" prop="reportForm">
|
||||||
<el-select style="width: 100%" v-model.trim="formdata.reportForm" placeholder="请选择报表类型">
|
<el-select style="width: 100%" v-model.trim="formdata.reportForm" placeholder="请选择报表类型">
|
||||||
<el-option v-for="item in reportFormList" :key="item.value" :label="item.label"
|
<el-option v-for="item in reportFormList" :key="item.value" :label="item.label"
|
||||||
:value="item.value"></el-option>
|
:value="item.value"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button @click="closeDialog">取 消</el-button>
|
<el-button @click="closeDialog">取 消</el-button>
|
||||||
<el-button type="primary" @click="preservation">确 定</el-button>
|
<el-button type="primary" @click="preservation">确 定</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import Area from '@/components/form/area/index.vue'
|
import Area from '@/components/form/area/index.vue'
|
||||||
import { getCustomReportTemplateById } from '@/api/harmonic-boot/luckyexcel'
|
import { getCustomReportTemplateById } from '@/api/harmonic-boot/luckyexcel'
|
||||||
import { ref, reactive } from 'vue'
|
import { ref, reactive } from 'vue'
|
||||||
const emit = defineEmits(['submitForm'])
|
const emit = defineEmits(['submitForm'])
|
||||||
const title = ref('')
|
const title = ref('')
|
||||||
const list = ref({})
|
const list = ref({})
|
||||||
const ruleForm = ref()
|
const ruleForm = ref()
|
||||||
const formVisible = ref(false)
|
const formVisible = ref(false)
|
||||||
const classificationData = [
|
const classificationData = [
|
||||||
{
|
{
|
||||||
label: '电能质量报表类型',
|
label: '电能质量报表类型',
|
||||||
id: '1'
|
id: '1'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '用能报表类型',
|
label: '用能报表类型',
|
||||||
id: '2'
|
id: '2'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
const reportFormList = [
|
const reportFormList = [
|
||||||
{
|
{
|
||||||
value: '1',
|
value: '1',
|
||||||
label: '分析报表'
|
label: '分析报表'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '2',
|
value: '2',
|
||||||
label: '统计报表'
|
label: '统计报表'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: '3',
|
value: '3',
|
||||||
label: '自定义报表'
|
label: '自定义报表'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
const rules = {
|
const rules = {
|
||||||
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
|
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
|
||||||
deptId: [{ required: true, message: '请选择部门', trigger: 'change' }],
|
deptId: [{ required: true, message: '请选择部门', trigger: 'change' }],
|
||||||
reportType: [{ required: true, message: '请选择模板类型', trigger: 'change' }],
|
reportType: [{ required: true, message: '请选择模板类型', trigger: 'change' }],
|
||||||
reportForm: [{ required: true, message: '请选择报表类型', trigger: 'change' }]
|
reportForm: [{ required: true, message: '请选择报表类型', trigger: 'change' }]
|
||||||
}
|
}
|
||||||
const formdata = ref({
|
const formdata = ref({
|
||||||
name: '',
|
name: '',
|
||||||
deptId: [],
|
deptId: [],
|
||||||
reportType: '',
|
reportType: '',
|
||||||
reportForm: ''
|
reportForm: ''
|
||||||
})
|
})
|
||||||
// 确定
|
// 确定
|
||||||
const preservation = () => {
|
const preservation = () => {
|
||||||
ruleForm.value.validate((valid: boolean) => {
|
ruleForm.value.validate((valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
emit('submitForm', formdata.value, title.value)
|
emit('submitForm', formdata.value, title.value)
|
||||||
formVisible.value = false
|
formVisible.value = false
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关闭
|
// 关闭
|
||||||
const closeDialog = () => {
|
const closeDialog = () => {
|
||||||
formVisible.value = false
|
formVisible.value = false
|
||||||
}
|
}
|
||||||
const open = (text: string, row?: any) => {
|
const open = (text: string, row?: any) => {
|
||||||
title.value = text
|
title.value = text
|
||||||
if (row.id) {
|
if (row.id) {
|
||||||
getCustomReportTemplateById({ id: row.id }).then(res => {
|
getCustomReportTemplateById({ id: row.id }).then(res => {
|
||||||
formdata.value = res.data
|
formdata.value = res.data
|
||||||
formdata.value.deptId = res.data.valueTitle.split(',')
|
formdata.value.deptId = res.data.valueTitle.split(',')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
formVisible.value = true
|
formVisible.value = true
|
||||||
}
|
}
|
||||||
const shutDown = () => {
|
const shutDown = () => {
|
||||||
formVisible.value = false
|
formVisible.value = false
|
||||||
}
|
}
|
||||||
defineExpose({ open,shutDown})
|
defineExpose({ open,shutDown})
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|||||||
Reference in New Issue
Block a user