云平台自测问题修改

This commit is contained in:
guanj
2026-01-13 14:27:23 +08:00
parent e9d7231a75
commit 63433aa6dc
15 changed files with 790 additions and 729 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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