联调文件管理页面

This commit is contained in:
guanj
2026-04-02 09:08:57 +08:00
parent 762965b1e4
commit 0b9aafc1b5
25 changed files with 829 additions and 437 deletions

View File

@@ -13,7 +13,7 @@
<pane style="background: #fff">
<div class="device-manage-right">
<el-form :inline="true" class="demo-form-inline" style="height: 42px">
<el-form-item style="position: relative; z-index: 2">
<el-form-item style="position: relative; z-index: 2" v-if="connectionMethod != 'MQTT'">
<el-button icon="el-icon-Plus" type="primary" @click="add" v-if="nodeLevel != 4">
{{
nodeLevel == 0
@@ -57,7 +57,13 @@
修改提交
</el-button>
</el-form-item>
<el-form-item style="right: 500px; position: absolute; overflow: hidden">
<el-form-item style="position: relative; z-index: 2" v-else>
<span style="font-size: 16px; font-weight: bold; color: var(--el-color-primary)">
治理设备/便携式设备不支持操作
</span>
</el-form-item>
<el-form-item style="right: 300px; position: absolute; overflow: hidden">
<LocationInformation
style="width: 16px; margin-right: 8px; color: var(--el-color-primary)"
/>
@@ -66,7 +72,7 @@
</span>
</el-form-item>
<el-form-item style="right: 0; position: absolute; overflow: hidden">
<div class="title" :class="titleList.length > 5 ? 'titleScroll' : ''">
<div class="title" :class="titleList.length > 2 ? 'titleScroll' : ''">
<span v-for="(item, index) in titleList" :key="index">
{{ index == 0 ? '' : ' > ' }}{{ item }}
</span>
@@ -82,28 +88,24 @@
ref="mainForm"
:model="formData"
>
<el-form-item
id="id100"
class="form-item"
label="设备名称:"
:rules="{ required: true, message: '请输入设备名称', trigger: 'blur' }"
>
<el-select
clearable
filterable
v-model="project[2].name"
:disabled="true"
placeholder="请选择设备类型"
>
<el-option
v-for="item in project"
:key="item.name"
:label="item.name"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<!--工程-->
<el-form-item
id="id300"
class="form-item"
label="工程名称:"
v-if="nodeLevel > 0 || pageStatus == 2"
prop="engineeringParam.name"
:rules="{ required: true, message: '请输入工程名称', trigger: 'blur' }"
>
<el-input
clearable
v-model="formData.engineeringParam.name"
placeholder="请输入工程名称"
:disabled="
!((nodeLevel == 1 && pageStatus == 3) || (nodeLevel == 0 && pageStatus == 2))
"
></el-input>
</el-form-item>
<!-- 省下拉框 -->
<el-form-item
id="id200"
@@ -157,25 +159,8 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item
id="id300"
class="form-item"
label="工程名称:"
v-if="nodeLevel > 0 || pageStatus == 2"
prop="engineeringParam.name"
:rules="{ required: true, message: '请输入工程名称', trigger: 'blur' }"
>
<el-input
clearable
v-model="formData.engineeringParam.name"
placeholder="请输入工程名称"
:disabled="
!((nodeLevel == 1 && pageStatus == 3) || (nodeLevel == 0 && pageStatus == 2))
"
></el-input>
</el-form-item>
<el-form-item
id="id300"
class="form-item"
label="描述:"
prop="engineeringParam.description"
@@ -190,6 +175,23 @@
"
></el-input>
</el-form-item>
<el-form-item
class="form-item"
label="排序:"
prop="engineeringParam.sort"
v-if="nodeLevel > 0 || pageStatus == 2"
:rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]"
>
<el-input
clearable
v-model.trim.number="formData.engineeringParam.sort"
placeholder="请输入排序"
:disabled="
!((nodeLevel == 1 && pageStatus == 3) || (nodeLevel == 0 && pageStatus == 2))
"
></el-input>
</el-form-item>
<!--项目-->
<div style="width: 100%" v-if="nodeLevel > 0 || pageStatus == 2">
<el-tabs
@@ -198,7 +200,7 @@
:addable="false"
:closable="pageStatus != 1"
@edit="handleDeviceTabsEdit"
@tab-click="tabChange('deviceIndex')"
@tab-click="tabChange('deviceIndex', $event)"
>
<el-tab-pane
v-for="(item, index) in formData.projectInfoList"
@@ -266,6 +268,63 @@
"
></el-input>
</el-form-item>
<el-form-item
label="拓扑图:"
:prop="'projectInfoList[' + index + '].topoId'"
:rules="[
{ required: true, message: '请选择拓扑图', trigger: 'change' }
]"
>
<el-select
v-model="item.topoId"
placeholder="请选择拓扑图"
popper-class="productSelector "
:disabled="
!(
(nodeLevel == 2 && pageStatus == 3) ||
((nodeLevel == 1 || (nodeLevel == 0 && pageStatus == 2)) &&
pageStatus == 2)
)
"
>
<el-option
v-for="item in images"
:key="item.id"
:label="item.name"
:value="item.id"
>
<span>
<img
:src="item.url"
v-if="item.url"
class="image-preview"
/>
</span>
<span style="float: right">
{{ item.name }}
</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item
class="form-item"
label="排序:"
:prop="'projectInfoList[' + index + '].sort'"
:rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]"
>
<el-input
clearable
v-model.trim.number="item.sort"
placeholder="请输入排序"
:disabled="
!(
(nodeLevel == 2 && pageStatus == 3) ||
((nodeLevel == 1 || (nodeLevel == 0 && pageStatus == 2)) &&
pageStatus == 2)
)
"
></el-input>
</el-form-item>
</div>
</el-tab-pane>
</el-tabs>
@@ -282,27 +341,27 @@
:addable="false"
:closable="pageStatus != 1"
@edit="handleBusBarTabsEdit"
@tab-click="tabChange('busBarIndex')"
@tab-click="tabChange('busBarIndex', $event)"
>
<el-tab-pane
v-for="(busItem, bIndex) in formData.deviceInfoList"
:key="bIndex"
:label="busItem.name ? busItem.name : '新建装置' + bIndex"
:label="busItem.name ? busItem.name : '新建设备' + bIndex"
:name="bIndex + ''"
>
<div class="flex mt10">
<div class="flex mt10" v-if="busItem.devAccessMethod == 'CLD'">
<el-form-item
class="form-item"
label="装置名称:"
label="设备名称:"
:prop="'deviceInfoList[' + bIndex + '].name'"
:rules="[
{ required: true, message: '请输入装置名称', trigger: 'blur' }
{ required: true, message: '请输入设备名称', trigger: 'blur' }
]"
>
<el-input
clearable
v-model="busItem.name"
placeholder="请输入装置名称"
placeholder="请输入设备名称"
:disabled="
!(
(nodeLevel == 3 && pageStatus == 3) ||
@@ -315,17 +374,17 @@
<el-form-item
id="id200"
class="form-item"
label="装置类型:"
label="设备类型:"
:prop="'deviceInfoList[' + bIndex + '].devType'"
:rules="[
{ required: true, message: '请选择装置类型', trigger: 'change' }
{ required: true, message: '请选择设备类型', trigger: 'change' }
]"
>
<el-select
clearable
filterable
v-model="busItem.devType"
placeholder="请选择装置类型"
placeholder="请选择设备类型"
style="width: 100%"
:disabled="
!(
@@ -346,17 +405,17 @@
<el-form-item
id="id200"
class="form-item"
label="装置型号:"
label="设备型号:"
:prop="'deviceInfoList[' + bIndex + '].devModel'"
:rules="[
{ required: true, message: '请选择装置型号', trigger: 'change' }
{ required: true, message: '请选择设备型号', trigger: 'change' }
]"
>
<el-select
clearable
filterable
v-model="busItem.devModel"
placeholder="请选择装置型号"
placeholder="请选择设备型号"
style="width: 100%"
:disabled="
!(
@@ -377,17 +436,17 @@
<el-form-item
id="id200"
class="form-item"
label="装置接入方式:"
label="设备接入方式:"
:prop="'deviceInfoList[' + bIndex + '].devAccessMethod'"
:rules="[
{ required: true, message: '请选择装置接入方式', trigger: 'change' }
{ required: true, message: '请选择设备接入方式', trigger: 'change' }
]"
>
<el-select
clearable
filterable
v-model="busItem.devAccessMethod"
placeholder="请选择装置接入方式"
placeholder="请选择设备接入方式"
style="width: 100%"
:disabled="
!(
@@ -403,11 +462,11 @@
<el-form-item
class="form-item"
label="装置mac地址:"
label="设备mac地址:"
:prop="'deviceInfoList[' + bIndex + '].mac'"
:rules="{
required: true,
message: '请输入装置mac地址',
message: '请输入设备mac地址',
trigger: 'blur'
}"
>
@@ -516,7 +575,7 @@
>
<el-input
clearable
v-model="busItem.sort"
v-model.trim.number="busItem.sort"
placeholder="请输入排序"
:disabled="
!(
@@ -528,6 +587,68 @@
></el-input>
</el-form-item>
</div>
<div class="flex mt10" v-else>
<el-form-item class="form-item" label="设备名称:">
<el-input
clearable
v-model="busItem.name"
placeholder="请输入设备名称"
:disabled="true"
></el-input>
</el-form-item>
<el-form-item id="id200" class="form-item" label="设备类型:">
<el-select
clearable
filterable
v-model="busItem.devType"
placeholder="请选择设备类型"
style="width: 100%"
:disabled="true"
>
<el-option
v-for="item in devTypeOptions"
:key="item.value"
:label="item.label || item.name"
:value="item.value || item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item id="id200" class="form-item" label="设备型号:">
<el-select
clearable
filterable
v-model="busItem.devModel"
placeholder="请选择设备型号"
style="width: 100%"
:disabled="true"
>
<el-option
v-for="option in devModelOptions"
:key="option.id"
:label="option.name"
:value="option.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item id="id200" class="form-item" label="设备接入方式:">
<el-select
clearable
filterable
v-model="busItem.devAccessMethod"
placeholder="请选择设备接入方式"
style="width: 100%"
:disabled="true"
>
<el-option label="CLD" value="CLD"></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="设备mac地址:">
<MacAddressInput
v-model="busItem.mac"
:disabled="!(pageStatus == 2 && nodeLevel == 2)"
/>
</el-form-item>
</div>
</el-tab-pane>
</el-tabs>
</div>
@@ -543,7 +664,7 @@
:addable="false"
:closable="pageStatus != 1"
@edit="handleLineTabsEdit"
@tab-click="tabChange('lineIndex')"
@tab-click="tabChange('lineIndex', $event)"
>
<el-tab-pane
v-for="(lineItem, lIndex) in formData.lineInfoList"
@@ -551,7 +672,7 @@
:label="lineItem.name ? lineItem.name : '新建监测点' + lIndex"
:name="lIndex + ''"
>
<div class="flex mt10">
<div class="flex mt10" v-if="connectionMethod != 'MQTT'">
<el-form-item
class="form-item"
label="监测点名称:"
@@ -1076,6 +1197,174 @@
</el-select>
</el-form-item>
</div>
<div class="flex mt10" v-else>
<el-form-item class="form-item" label="监测点名称:">
<el-input
clearable
v-model="lineItem.name"
placeholder="请输入监测点名称"
:disabled="true"
></el-input>
</el-form-item>
<el-form-item class="form-item" label="线路号:">
<el-select
clearable
filterable
v-model="lineItem.lineNo"
placeholder="请选择线路号"
:disabled="true"
>
<el-option
v-for="option in pointNumArr"
:key="option.name"
:label="option.name"
:value="option.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="接线方式:">
<el-select
clearable
filterable
v-model="lineItem.conType"
placeholder="请选择接线方式"
:disabled="true"
>
<el-option
v-for="option in wiringTypeArr"
:key="option.name"
:label="option.name"
:value="option.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="统计间隔:">
<el-select
clearable
filterable
v-model="lineItem.lineInterval"
placeholder="请选择统计间隔"
:disabled="true"
>
<el-option
v-for="option in lineSpaceArr"
:key="option.name"
:label="option.name"
:value="option.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="PT变比:">
<div style="width: 100%; display: flex; justify-content: space-between">
<el-input
clearable-number
:controls="false"
:min="1"
style="width: 48%"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="lineItem.ptRatio"
:disabled="true"
></el-input>
<span
style="
display: flex;
align-items: center;
justify-content: center;
"
>
:
</span>
<el-input
clearable-number
:controls="false"
:min="1"
style="width: 48%"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="lineItem.pt2Ratio"
:disabled="true"
></el-input>
</div>
</el-form-item>
<el-form-item class="form-item" label="CT变比:">
<div style="width: 100%; display: flex; justify-content: space-between">
<el-input
clearable-number
:controls="false"
:min="1"
style="width: 48%"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="lineItem.ctRatio"
:disabled="true"
></el-input>
<span
style="
display: flex;
align-items: center;
justify-content: center;
"
>
:
</span>
<el-input
clearable-number
:controls="false"
:min="1"
style="width: 48%"
oninput="value=value.replace(/[^\d]/g,'')"
v-model.number="lineItem.ct2Ratio"
:disabled="true"
></el-input>
</div>
</el-form-item>
<el-form-item class="form-item" label="电压等级:">
<el-select
clearable
filterable
v-model="lineItem.volGrade"
placeholder="请选择电压等级"
:disabled="true"
>
<el-option
v-for="option in voltageLevelOptions"
:key="option.value"
:label="option.name"
:value="option.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="监测位置:">
<el-select
clearable
filterable
v-model="lineItem.position"
placeholder="请选择监测位置"
:disabled="true"
>
<el-option
v-for="option in linePosition"
:key="option.id"
:label="option.name"
:value="option.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item class="form-item" label="通讯状态:">
<!-- 0运行1检修2停运3调试4退运 -->
<el-select
clearable
filterable
v-model="lineItem.runStatus"
placeholder="请选择通讯状态"
:disabled="true"
>
<el-option label="离线" :value="1" />
<el-option label="在线" :value="2" />
</el-select>
</el-form-item>
</div>
</el-tab-pane>
</el-tabs>
</div>
@@ -1163,8 +1452,10 @@ import {
pushLog,
queryPushResult
} from '@/api/cs-device-boot/cloudDeviceEntry'
import { getTopoTemplate } from '@/api/cs-device-boot/topologyTemplate'
import { getFileUrl } from '@/api/system-boot/file'
import tree from '@/assets/map/area.json'
import { queryByCode, queryCsDictTree } from '@/api/system-boot/dictTree'
import { queryByCode, queryCsDictTree, queryByid } from '@/api/system-boot/dictTree'
import MacAddressInput from '@/components/form/mac/MacAddressInput.vue'
import { auditEngineering } from '@/api/cs-device-boot/edData'
import { convertToObject } from 'typescript'
@@ -1219,7 +1510,8 @@ const formData = ref({
city: '',
description: '',
name: '',
province: ''
province: '',
sort: 0
}
})
@@ -1279,6 +1571,8 @@ interface ProjectInfo {
name: string
area: string
description: string
sort: number | string
topoId: string
}
// 项目信息列表
//const projectInfoList = ref<ProjectInfo[]>([])
@@ -1341,6 +1635,7 @@ const arrdess: any = ref((rule: any, value: any, callback: any) => {
callback(new Error('请输入正确IP/MAC地址'))
}
})
const connectionMethod = ref('')
// 省市选择相关数据
const provinceOptions = computed(() => areaTree)
@@ -1407,15 +1702,16 @@ const nodeClick = (e: anyObj, data: any) => {
pageStatus.value = 1
nodeData.value = e
if (nodeData.value.level == 0) {
if (nodeData.value.level == -1) {
nodeLevel.value = 0
} else if (nodeData.value.level == 0) {
nodeLevel.value = 1
} else if (nodeData.value.level == 1) {
//工程节点
nodeLevel.value = 1
nodeLevel.value = 2
} else if (nodeData.value.level == 2) {
//项目
nodeLevel.value = 2
nodeLevel.value = 3
} else if (nodeData.value.level == 3) {
//设备
nodeLevel.value = 3
@@ -1465,7 +1761,16 @@ const handleDialogClose = () => {
}
countdown.value = 0
}
const images: any = ref([])
const getImageList = async () => {
getTopoTemplate().then(res => {
images.value = res.data
images.value.forEach(async item => {
let row = await getFileUrl({ filePath: item.filePath })
item.url = row.data
})
})
}
const onAdd = async () => {
resultDialogVisible.value = true
pushResult.value = null
@@ -1606,13 +1911,16 @@ const queryNodeContent = () => {
}
getInfoById(nodeData.value.id).then((res: any) => {
connectionMethod.value = 'CLD'
Object.assign(formData.value.engineeringParam, res.data)
formData.value.engineeringParam.name = res.data.engineeringName
formData.value.engineeringParam.description = res.data.engineeringDescription
formData.value.engineeringParam.sort = res.data.sort
formData.value.projectInfoList = res.data.projectInfoList || []
if (nodeLevel.value >= 2) {
formData.value.deviceInfoList = res.data.deviceInfoList || []
connectionMethod.value = formData.value.deviceInfoList[0].devAccessMethod || 'CLD'
}
if (nodeLevel.value >= 3) {
formData.value.lineInfoList = res.data.lineInfoList || []
@@ -1640,6 +1948,7 @@ const add = () => {
// 初始化工程参数
formData.value.engineeringParam.city = ''
formData.value.engineeringParam.description = ''
formData.value.engineeringParam.sort = 0
formData.value.engineeringParam.name = ''
formData.value.engineeringParam.province = ''
// 清理其他层级数据
@@ -1652,7 +1961,9 @@ const add = () => {
formData.value.projectInfoList.push({
name: '',
area: '',
description: ''
description: '',
sort: 0,
topoId: ''
})
deviceIndex.value = (formData.value.projectInfoList.length - 1).toString()
// 清理设备和监测点数据
@@ -1716,13 +2027,13 @@ const update = () => {
})
return
}
if (nodeData.value.level == 0) {
ElMessage({
type: 'warning',
message: '不能修改根节点'
})
return
}
// if (nodeData.value.level == 0) {
// ElMessage({
// type: 'warning',
// message: '不能修改根节点'
// })
// return
// }
if (pageStatus.value == 2 || pageStatus.value == 3) {
if (pageStatus.value == 2) {
ElMessage({
@@ -1754,6 +2065,7 @@ const updateEngineering = (id: any) => {
id: id, // 工程ID用于修改
city: engData.city,
description: engData.description,
sort: engData.sort,
name: engData.name,
province: engData.province
}
@@ -1781,7 +2093,15 @@ const updateProjectFunc = (id: any) => {
return
}
deleteProject(id, currentProject.name, currentProject.area, currentProject.description, 1).then((res: any) => {
deleteProject(
id,
currentProject.name,
currentProject.area,
currentProject.description,
1,
currentProject.sort,
currentProject.topoId
).then((res: any) => {
ElMessage({
type: 'success',
message: '修改项目成功'
@@ -1906,13 +2226,13 @@ const remove = () => {
})
return
}
if (nodeData.value.level == 0) {
ElMessage({
type: 'error',
message: '无法删除根节点'
})
return
}
// if (nodeData.value.level == 0) {
// ElMessage({
// type: 'error',
// message: '无法删除根节点'
// })
// return
// }
if (nodeData.value.id == null) {
ElMessage.warning('无法删除该节点')
return
@@ -1945,7 +2265,7 @@ const remove = () => {
case 2: // 项目层级
// 删除项目后选中工程节点
const engineeringId = nodeData.value.pids ? nodeData.value.pids.split(',')[1] : null
deleteProject(nodeData.value.id, '', '', '', 0).then((res: any) => {
deleteProject(nodeData.value.id, '', '', '', 0, '', '').then((res: any) => {
ElMessage({
type: 'success',
message: res.message
@@ -2025,7 +2345,9 @@ const next = async () => {
formData.value.projectInfoList.push({
name: '',
area: '',
description: ''
description: '',
sort: 0,
topoId: ''
})
deviceIndex.value = (formData.value.projectInfoList.length - 1).toString()
nextfalg.value = false
@@ -2467,6 +2789,7 @@ const resetAllForms = () => {
// 清空工程表单
formData.value.engineeringParam.city = ''
formData.value.engineeringParam.description = ''
formData.value.engineeringParam.sort = 0
formData.value.engineeringParam.name = ''
formData.value.engineeringParam.province = ''
@@ -2475,6 +2798,7 @@ const resetAllForms = () => {
project.name = ''
project.area = ''
project.description = ''
;(project.sort = 0), (project.topoId = '')
})
// 清空设备表单
@@ -2534,6 +2858,7 @@ const submitData = () => {
engineering: {
city: formData.value.engineeringParam.city,
description: formData.value.engineeringParam.description,
sort: formData.value.engineeringParam.sort,
name: formData.value.engineeringParam.name,
province: formData.value.engineeringParam.province
}
@@ -2557,6 +2882,8 @@ const submitData = () => {
project: {
area: formData.value.projectInfoList[deviceIndex.value]?.area || '',
description: formData.value.projectInfoList[deviceIndex.value]?.description || '',
topoIds: [formData.value.projectInfoList[deviceIndex.value]?.topoId] || [],
sort: formData.value.projectInfoList[deviceIndex.value]?.sort || 0,
name: formData.value.projectInfoList[deviceIndex.value]?.name || '',
engineeringId: nodeData.value?.id || ''
}
@@ -2723,7 +3050,9 @@ const handleDeviceTabsEdit = (targetName: any, action: any) => {
formData.value.projectInfoList.push({
name: '',
area: '',
description: ''
description: '',
sort: 0,
topoId: ''
})
deviceIndex.value = (formData.value.projectInfoList.length - 1).toString()
} else if (action === 'remove') {
@@ -2741,7 +3070,9 @@ const handleDeviceTabsEdit = (targetName: any, action: any) => {
formData.value.projectInfoList[deviceIndex.value].name,
formData.value.projectInfoList[deviceIndex.value].area,
formData.value.projectInfoList[deviceIndex.value].description,
0 // 0表示删除
0, // 0表示删除
formData.value.projectInfoList[deviceIndex.value].sort,
formData.value.projectInfoList[deviceIndex.value].topoId
).then((res: any) => {
ElMessage({
type: 'success',
@@ -2924,12 +3255,13 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
}
}
const tabChange = (type: string) => {
const tabChange = (type: string, e: any) => {
if (type == 'deviceIndex') {
busBarIndex.value = '0'
lineIndex.value = '0'
} else if (type == 'busBarIndex') {
lineIndex.value = '0'
connectionMethod.value = formData.value.deviceInfoList[e.index].devAccessMethod
}
}
@@ -2962,7 +3294,7 @@ const reaseStatus = () => {
lineIndex.value = '0'
currentGdName.value = ''
}
const devModelOptions = ref([])
const area = async () => {
nodeAllList()
.then(res => {
@@ -2981,6 +3313,16 @@ const area = async () => {
})
.then(() => {
return queryByCode('Device_Type').then(res => {
queryByid(res.data.id).then((list: any) => {
devModelOptions.value = list.data.map((item: any, index: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
return queryCsDictTree(res.data.id).then(res => {
devTypeOptions.value = res.data
})
@@ -3000,6 +3342,7 @@ const area = async () => {
onMounted(() => {
nodeData.value.level = 0
getImageList()
nextTick(() => {
const dom = document.getElementById('navigation-splitpanes')
if (dom && dom.offsetHeight > 0) {
@@ -3074,14 +3417,14 @@ area()
background: #fff !important;
}
.title {
width: 500px;
overflow: hidden;
width: 300px;
// overflow: hidden;
// display: flex;
white-space: nowrap;
font-weight: bold;
}
.titleScroll {
animation: scroll 10s linear infinite; /* 滚动动画 */
animation: scroll 7s linear infinite; /* 滚动动画 */
}
@keyframes scroll {
0% {
@@ -3091,4 +3434,13 @@ area()
transform: translateX(-160%); /* 滚动到左侧 */
}
}
.image-preview {
height: 50px;
margin-top: 5px;
}
.productSelector .el-select-dropdown__item {
height: 60px;
line-height: 60px;
}
</style>

View File

@@ -697,7 +697,7 @@ const handleTrend = async () => {
.then((res: any) => {
if (res.code == 'A0000') {
trendDataTime.value = ''
ElMessage.success('装置应答成功')
ElMessage.success('设备应答成功')
//每隔30s调用一下接口通知后台推送mqtt消息
trendTimer.value = window.setInterval(() => {
if (!dataSet.value.includes('_realtimedata')) return
@@ -721,7 +721,7 @@ const handleTrend = async () => {
// }
})
} else {
ElMessage.warning('装置应答失败')
ElMessage.warning('设备应答失败')
}
})
.catch(e => {
@@ -753,7 +753,7 @@ const handleHarmonicSpectrum = async () => {
// getRealDataMqttMsg()
await getBasicRealData(lineId.value).then((res: any) => {
if (res.code == 'A0000') {
ElMessage.success('装置应答成功')
ElMessage.success('设备应答成功')
// mqttMessage.value = {}
realDataTimer.value = window.setInterval(() => {
@@ -783,7 +783,7 @@ const handleReturn = async () => {
tableLoading.value = true
await getBasicRealData(lineId.value).then((res: any) => {
if (res.code == 'A0000') {
ElMessage.success('装置应答成功')
ElMessage.success('设备应答成功')
// mqttMessage.value = {}
realDataTimer.value = window.setInterval(() => {
if (!dataSet.value.includes('_realtimedata')) return
@@ -998,7 +998,7 @@ const getRealDataMqttMsg = async () => {
await getBasicRealData(lineId.value)
.then((res: any) => {
if (res.code == 'A0000') {
ElMessage.success('装置应答成功')
ElMessage.success('设备应答成功')
mqttMessage.value = {}
realDataTimer.value = window.setInterval(async () => {
@@ -1162,7 +1162,7 @@ const getRealDataMqttMsg = async () => {
console.log('mqtt客户端已断开连接.....')
})
} else {
ElMessage.success('装置应答失败')
ElMessage.success('设备应答失败')
tableLoading.value = false
}
})

View File

@@ -241,7 +241,7 @@ const tableStore = new TableStore({
width: '180',
render: 'buttons',
buttons: [
//直连装置注册
//直连设备注册
{
title: '注册',
type: 'primary',

View File

@@ -19,7 +19,7 @@
</el-breadcrumb>
</div>
<!-- <el-button :icon="Refresh" @click="handleRestartDevice" type="primary" :loading="deviceRestartLoading">
装置重启
设备重启
</el-button> -->
</div>
@@ -205,7 +205,10 @@ import {
addDeviceDir,
delDeviceDir,
listDir,
downloadFileFromFrontr
downloadFileFromFrontr,
deleteCld,
uploadFileToFront,
mkdir
} from '@/api/cs-device-boot/fileService'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import { Delete, Download, Upload, Plus, Refresh, Search } from '@element-plus/icons-vue'
@@ -316,11 +319,11 @@ const vNode = () => {
])
}
//装置重启
//设备重启
const deviceRestartLoading = ref<boolean>(false)
const handleRestartDevice = () => {
deviceRestartLoading.value = true
ElMessageBox.prompt('二次校验密码确认', '装置重启', {
ElMessageBox.prompt('二次校验密码确认', '设备重启', {
confirmButtonText: '确认',
cancelButtonText: '取消',
customClass: 'customInput',
@@ -548,20 +551,37 @@ const reloadCurrentMenu = (msg: string) => {
const submitDeviceDir = () => {
formRef.value.validate((valid: any) => {
if (valid) {
let obj = {
nDid: nDid.value,
path:
activePath.value == '/'
? activePath.value + form.value.path
: activePath.value + '/' + form.value.path
}
loading.value = true
addDeviceDir(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
addDeviceDirOpen.value = false
if (devConType.value == 'CLD') {
let obj = {
devId: devId.value,
filePath:
activePath.value == '/'
? activePath.value + form.value.path
: activePath.value + '/' + form.value.path
}
})
loading.value = true
mkdir(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
addDeviceDirOpen.value = false
}
})
} else {
let obj = {
nDid: nDid.value,
path:
activePath.value == '/'
? activePath.value + form.value.path
: activePath.value + '/' + form.value.path
}
loading.value = true
addDeviceDir(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
addDeviceDirOpen.value = false
}
})
}
}
})
}
@@ -593,13 +613,30 @@ const handleDelDirOrFile = (row: any) => {
passwordConfirm(value)
.then((resp: any) => {
if (resp.code == 'A0000') {
delDeviceDir({ nDid: nDid.value, path: row.prjDataPath }).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
// ElMessage({ message: res.message, type: 'success', duration: 5000 })
}
})
if (devConType.value == 'CLD') {
deleteCld({
devId: devId.value,
filePath: row.prjDataPath
})
.then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
}
})
.catch(e => {
loading.value = false
})
} else {
delDeviceDir({ nDid: nDid.value, path: row.prjDataPath })
.then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
}
})
.catch(e => {
loading.value = false
})
}
}
})
.catch(e => {
@@ -636,17 +673,32 @@ const handleUpload = (e: any, fileList: any, row: any) => {
localStorage.setItem('fileName', fileName.value)
changeType.value = 'upload'
localStorage.setItem('changeType', changeType.value)
const obj = {
id: nDid.value,
file: e.raw,
filePath: row || row.prjDataPath
}
uploadDeviceFile(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
status.value = 100
if (devConType.value == 'CLD') {
const obj = {
devId: devId.value,
file: e.raw,
dirPath: row || row.prjDataPath
}
})
uploadFileToFront(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
status.value = 100
}
})
} else {
const obj = {
id: nDid.value,
file: e.raw,
filePath: row || row.prjDataPath
}
uploadDeviceFile(obj).then((res: any) => {
if (res.code == 'A0000') {
reloadCurrentMenu(res.message)
status.value = 100
}
})
}
}
watch(
() => activePathList.value,

View File

@@ -20,7 +20,7 @@
type="primary"
:loading="deviceRestartLoading"
>
装置重启
设备重启
</el-button>
</template>
<el-descriptions-item label="名称">
@@ -237,11 +237,11 @@ const openGroup = () => {
})
})
}
//装置重启
//设备重启
const deviceRestartLoading = ref<boolean>(false)
const handleRestartDevice = () => {
deviceRestartLoading.value = true
ElMessageBox.prompt('二次校验密码确认', '装置重启', {
ElMessageBox.prompt('二次校验密码确认', '设备重启', {
confirmButtonText: '确认',
cancelButtonText: '取消',
customClass: 'customInput',

View File

@@ -22,7 +22,7 @@
</div>
<!-- 新增设备列表 -->
<div class="device-list-section table-wrapper">
<!-- <div class="device-list-section table-wrapper">
<vxe-table v-bind="defaultAttribute" :data="deviceTableData" height="auto" style="width: 100%">
<vxe-column field="name" title="设备名称"></vxe-column>
<vxe-column title="操作" width="200px">
@@ -33,7 +33,7 @@
</template>
</vxe-column>
</vxe-table>
</div>
</div> -->
</div>
</div>
@@ -107,7 +107,7 @@
style="width: 100%"
>
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column field="name" title="设备名称"></vxe-column>
<vxe-column field="name" title="便携式设备名称"></vxe-column>
</vxe-table>
</div>
</div>
@@ -298,7 +298,7 @@ const addData = () => {
min-height: 0;
&:first-child {
margin-bottom: 10px;
// margin-bottom: 10px;
}
}
}

View File

@@ -6,12 +6,13 @@
:default-checked-keys="defaultCheckedKeys"
@checkChange="checkChange"
:height="35"
:engineering="true"
></DeviceTree>
<div class="device-manage-right" :style="{ height: pageHeight.height }">
<vxe-table v-bind="defaultAttribute" :data="tableData" height="auto" style="width: 100%">
<vxe-column field="enginerName" title="工程名称"></vxe-column>
<vxe-column field="projectName" title="项目名称"></vxe-column>
<vxe-column field="deviceName" title="装置名称"></vxe-column>
<vxe-column field="deviceName" title="设备名称"></vxe-column>
</vxe-table>
</div>
</div>

View File

@@ -7,12 +7,12 @@
@close="emit('closePopup')"
>
<el-form class="form-two" :model="form" label-width="100px" ref="formRef" :rules="rules">
<el-form-item label="装置类型:" prop="type">
<el-form-item label="设备类型:" prop="type">
<!-- <el-select v-model.trim="form.type" filterable placeholder="请选择" @change="typeChange">
<el-option v-for="item in TypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select> -->
<el-select v-model.trim="form.type" placeholder="请选择装置类型" @change="formDevTypeChange" clearable>
<el-select v-model.trim="form.type" placeholder="请选择设备类型" @change="formDevTypeChange" clearable>
<el-option
v-for="item in devTypeOptions"
:key="item.value"
@@ -21,7 +21,7 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置型号:" prop="devType">
<el-form-item label="设备型号:" prop="devType">
<!-- <el-select v-model.trim="form.devType" placeholder="请选择" filterable @change="devTypeChange">
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
@@ -29,7 +29,7 @@
<el-select
v-model.trim="form.devType"
filterable
placeholder="请选择装置型号"
placeholder="请选择设备型号"
clearable
@change="devTypeChange"
>
@@ -154,8 +154,8 @@ const form = reactive<any>({
file: []
})
const rules = {
type: [{ required: true, message: '请选择装置类型', trigger: 'change' }],
devType: [{ required: true, message: '请选择装置型号', trigger: 'change' }],
type: [{ required: true, message: '请选择设备类型', trigger: 'change' }],
devType: [{ required: true, message: '请选择设备型号', trigger: 'change' }],
versionNo: [{ required: true, message: '请输入版本号', trigger: 'blur' }],
versionType: [{ required: true, message: '请输入版本类型', trigger: 'blur' }],
versionAgreement: [{ required: true, message: '请输入协议版本', trigger: 'blur' }],

View File

@@ -11,7 +11,7 @@
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="装置型号">
<el-form-item label="设备型号">
<el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择" clearable>
<el-option
v-for="item in DevTypeOptions"
@@ -71,7 +71,7 @@ const tableStore = new TableStore({
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '装置型号', field: 'devTypeName' },
{ title: '设备型号', field: 'devTypeName' },
{ title: '模板名称', field: 'name' },
{ title: '版本号', field: 'versionNo' },
{ title: '版本时间', field: 'versionDate', sortable: true },

View File

@@ -2,8 +2,8 @@
<div class="default-main">
<TableHeader ref="tableHeaderRef" :showReset="false" showExport>
<template #select>
<el-form-item label="装置型号:">
<el-select v-model.trim="tableStore.table.params.devType" filterable placeholder="请选择装置型号" clearable>
<el-form-item label="设备型号:">
<el-select v-model.trim="tableStore.table.params.devType" filterable placeholder="请选择设备型号" clearable>
<el-option
v-for="item in DevTypeOptions"
:key="item.id"
@@ -55,7 +55,7 @@ const tableStore = new TableStore({
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '装置型号', field: 'devTypeName' ,minWidth: '100'},
{ title: '设备型号', field: 'devTypeName' ,minWidth: '100'},
{ title: '版本号', field: 'versionNo' ,minWidth: '100'},
{ title: '协议版本', field: 'versionAgreement' ,minWidth: '100'},
{ title: '版本日期', field: 'versionDate' ,minWidth: '100'},

View File

@@ -515,7 +515,7 @@ const tableStore = new TableStore({
width: 220,
render: 'buttons',
buttons: [
//直连装置注册
//直连设备注册
// {
// title: '注册',
// type: 'primary',

View File

@@ -10,8 +10,8 @@
<el-form-item label="版本日期" prop="name">
<el-input v-model.trim="form.name" placeholder="请输入版本日期"></el-input>
</el-form-item>
<el-form-item label="装置系列" prop="loadType">
<el-select v-model.trim="form.loadType" filterable clearable placeholder="请选择装置系列">
<el-form-item label="设备系列" prop="loadType">
<el-select v-model.trim="form.loadType" filterable clearable placeholder="请选择设备系列">
<el-option
v-for="item in DataTypeSelect"
:key="item.id"

View File

@@ -6,11 +6,11 @@
<el-input v-model="tableStore.table.params.keywords" clearable placeholder="请输入关键字" />
</el-form-item>
<el-form-item label="装置系列">
<el-form-item label="设备系列">
<el-select
v-model.trim="tableStore.table.params.devType"
filterable
placeholder="请选择装置系列"
placeholder="请选择设备系列"
clearable
>
<el-option
@@ -64,7 +64,7 @@ const tableStore = new TableStore({
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '装置系列', field: 'devTypeName', minWidth: '100' },
{ title: '设备系列', field: 'devTypeName', minWidth: '100' },
{ title: '版本号', field: 'versionNo', minWidth: '100' },
{ title: '协议版本', field: 'versionAgreement', minWidth: '100' },
{ title: '版本日期', field: 'versionDate', minWidth: '100' },

View File

@@ -20,11 +20,11 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置型号">
<el-form-item label="设备型号">
<el-select
v-model.trim="tableStore.table.params.devType"
filterable
placeholder="请选择装置型号"
placeholder="请选择设备型号"
clearable
>
<el-option
@@ -35,11 +35,11 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置系列">
<el-form-item label="设备系列">
<el-select
v-model.trim="tableStore.table.params.devType"
filterable
placeholder="请选择装置系列"
placeholder="请选择设备系列"
clearable
>
<el-option
@@ -50,11 +50,11 @@
></el-option>
</el-select>
</el-form-item>
<el-form-item label="升级装置筛选">
<el-form-item label="升级设备筛选">
<el-select
v-model.trim="tableStore.table.params.devType"
filterable
placeholder="请选择升级装置筛选"
placeholder="请选择升级设备筛选"
clearable
>
<el-option
@@ -104,12 +104,12 @@ const tableStore = new TableStore({
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '装置名称', field: 'devTypeName', minWidth: '100' },
{ title: '设备名称', field: 'devTypeName', minWidth: '100' },
{ title: '版本号', field: 'versionNo', minWidth: '100' },
{ title: '协议版本', field: 'versionAgreement', minWidth: '100' },
{ title: '版本日期', field: 'versionDate', minWidth: '100' },
{ title: '装置系列', field: 'versionDate', minWidth: '100' },
{ title: '装置型号', field: 'versionDate', minWidth: '100' },
{ title: '设备系列', field: 'versionDate', minWidth: '100' },
{ title: '设备型号', field: 'versionDate', minWidth: '100' },
{ title: '供电公司', field: 'versionDate', minWidth: '100' },
{ title: '变电站', field: 'versionDate', minWidth: '100' },
{