前置管理

This commit is contained in:
sjl
2025-10-17 09:55:43 +08:00
parent d9def45a8b
commit 1211277a0d
6 changed files with 825 additions and 102 deletions

View File

@@ -0,0 +1,56 @@
import createAxios from '@/utils/request'
// 新增前置机
export function addNode(data: any) {
return createAxios({
url: '/cs-device-boot/node/addNode',
method: 'post',
data: data
})
}
//修改前置机
export function updateNode(data: any) {
return createAxios({
url: '/cs-device-boot/node/updateNode',
method: 'put',
data: data
})
}
//删除前置机
export function delNode(data: any) {
return createAxios({
url: '/cs-device-boot/node/delNode',
method: 'post',
params: { id: data }
})
}
//查询前置-进程-设备-设备树
export function nodeDeviceTree(data: any) {
return createAxios({
url: '/cs-device-boot/node/getProcessNoAndDeviceById',
method: 'get',
params: data
})
}
//重启前置机进程
export function restartProcess(data: any) {
return createAxios({
url: '/cs-device-boot/node/restartProcess',
method: 'post',
params: data
})
}
//更新进程号
export function updateProcess(data: any) {
return createAxios({
url: '/cs-device-boot/node/updateDevProcessNo',
method: 'post',
params: data
})
}

View File

@@ -29,7 +29,6 @@ const width = ref('')
const info = (selectedNodeId?: string) => { const info = (selectedNodeId?: string) => {
console.log('tree.value:', selectedNodeId);
tree.value = [] tree.value = []
let arr1: any[] = [] let arr1: any[] = []
getCldTree().then(res => { getCldTree().then(res => {

View File

@@ -69,6 +69,7 @@
label-width="120px" label-width="120px"
:inline="true" :inline="true"
ref="mainForm" ref="mainForm"
> >
<el-form-item <el-form-item
id="id100" id="id100"
@@ -97,14 +98,15 @@
class="form-item" class="form-item"
label="省:" label="省:"
v-if="nodeLevel > 0 || pageStatus == 2" v-if="nodeLevel > 0 || pageStatus == 2"
:rules="[{ required: true, message: '请选择省', trigger: 'change' }]" prop="'engineeringParam.province'"
:rules="{ required: true, message: '请选择省', trigger: 'change' }"
> >
<el-select <el-select
filterable filterable
v-model="engineeringParam.province" v-model="engineeringParam.province"
:disabled="!((nodeLevel == 1 && pageStatus == 3) || (nodeLevel == 0 && pageStatus == 2))" :disabled="!((nodeLevel == 1 && pageStatus == 3) || (nodeLevel == 0 && pageStatus == 2))"
placeholder="请选择省" placeholder="请选择省"
@change="provinceChange" @change="provinceChange"
> >
<el-option <el-option
v-for="item in provinceOptions" v-for="item in provinceOptions"
@@ -120,7 +122,8 @@
class="form-item" class="form-item"
label="市:" label="市:"
v-if="(nodeLevel > 0 || pageStatus == 2)" v-if="(nodeLevel > 0 || pageStatus == 2)"
:rules="[{ required: true, message: '请选择市', trigger: 'change' }]" :prop="'engineeringParam.city'"
:rules="{ required: true, message: '请选择市', trigger: 'change' }"
> >
<el-select <el-select
filterable filterable
@@ -141,7 +144,8 @@
class="form-item" class="form-item"
label="工程名称:" label="工程名称:"
v-if="nodeLevel > 0 || pageStatus == 2" v-if="nodeLevel > 0 || pageStatus == 2"
:rules="[{ required: true, message: '请输入工程名称', trigger: 'blur' }]" :prop="'name'"
:rules="{ required: true, message: '请输入工程名称', trigger: 'blur' }"
> >
<el-input <el-input
v-model="engineeringParam.name" v-model="engineeringParam.name"
@@ -166,7 +170,8 @@
<el-tabs <el-tabs
v-model="deviceIndex" v-model="deviceIndex"
type="card" type="card"
:editable="pageStatus != 1" :addable="false"
:closable="pageStatus != 1"
@edit="handleDeviceTabsEdit" @edit="handleDeviceTabsEdit"
@tab-click="tabChange('deviceIndex')" @tab-click="tabChange('deviceIndex')"
> >
@@ -180,6 +185,7 @@
<el-form-item <el-form-item
class="form-item" class="form-item"
label="项目名称:" label="项目名称:"
:prop="'projectInfoList.' + index + '.name'"
:rules="[{ required: true, message: '请输入项目名称', trigger: 'blur' }]" :rules="[{ required: true, message: '请输入项目名称', trigger: 'blur' }]"
> >
<el-input <el-input
@@ -216,11 +222,12 @@
</div> </div>
<!--设备--> <!--设备-->
<div style="width: 100%" v-if="nodeLevel > 1 || pageStatus == 2"> <div style="width: 100%" v-if="(nodeLevel > 1 || pageStatus == 2) && (nodeLevel >= 2 || pageStatus == 2)">
<el-tabs <el-tabs
v-model="busBarIndex" v-model="busBarIndex"
type="card" type="card"
:editable="pageStatus != 1" :addable="false"
:closable="pageStatus != 1"
@edit="handleBusBarTabsEdit" @edit="handleBusBarTabsEdit"
@tab-click="tabChange('busBarIndex')" @tab-click="tabChange('busBarIndex')"
> >
@@ -366,11 +373,12 @@
</div> </div>
<!--监测点--> <!--监测点-->
<div style="width: 100%" v-if="nodeLevel > 2 || pageStatus == 2"> <div style="width: 100%" v-if="(nodeLevel > 2 || pageStatus == 2) && (nodeLevel >= 3 || pageStatus == 2)">
<el-tabs <el-tabs
type="card" type="card"
v-model="lineIndex" v-model="lineIndex"
:editable="pageStatus != 1" :addable="false"
:closable="pageStatus != 1"
@edit="handleLineTabsEdit" @edit="handleLineTabsEdit"
@tab-click="tabChange('lineIndex')" @tab-click="tabChange('lineIndex')"
> >
@@ -714,12 +722,10 @@ const nodeDataList=ref()
const nodeEventList=ref() const nodeEventList=ref()
const nodeClick = (e: anyObj, data: any) => { const nodeClick = (e: anyObj, data: any) => {
console.log(e, data)
nodeDataList.value = data nodeDataList.value = data
nodeEventList.value = e nodeEventList.value = e
treeClickCount.value++ treeClickCount.value++
if (treeClickCount.value > 2) return if (treeClickCount.value > 2) return
if (treeClickCount.value > 2) return
if (treeClickCount.value == 1) { if (treeClickCount.value == 1) {
if (pageStatus.value == 2 || pageStatus.value == 3) { if (pageStatus.value == 2 || pageStatus.value == 3) {
if (pageStatus.value == 3 || pageStatus.value == 2) { if (pageStatus.value == 3 || pageStatus.value == 2) {
@@ -749,12 +755,54 @@ const nodeClick = (e: anyObj, data: any) => {
}else if(nodeData.value.level == 4){ //监测点 }else if(nodeData.value.level == 4){ //监测点
nodeLevel.value = 4 nodeLevel.value = 4
} }
// 根据节点层级清理不需要的数据
cleanUnnecessaryData()
/**不是根节点请求数据 */ /**不是根节点请求数据 */
queryNodeContent() queryNodeContent()
treeClickCount.value = 0 treeClickCount.value = 0
} }
/**
* 根据当前节点层级清理不需要的数据
*/
const cleanUnnecessaryData = () => {
// 根据当前节点层级清理不需要的数据
switch(nodeLevel.value) {
case 0: // 根节点
// 清理所有数据
projectInfoList.value = []
deviceInfoList.value = []
lineInfoList.value = []
break
case 1: // 工程节点
// 清理设备和监测点数据
deviceInfoList.value = []
lineInfoList.value = []
break
case 2: // 项目节点
// 清理监测点数据
lineInfoList.value = []
break
case 3: // 设备节点
// 不清理任何数据
break
case 4: // 监测点节点
// 不清理任何数据
break
}
// 重置tab索引
if (nodeLevel.value < 2) {
deviceIndex.value = '0'
}
if (nodeLevel.value < 3) {
busBarIndex.value = '0'
}
if (nodeLevel.value < 4) {
lineIndex.value = '0'
}
}
const getparentsNode = (node: any) => { const getparentsNode = (node: any) => {
// 检查node是否存在以及是否有parent属性 // 检查node是否存在以及是否有parent属性
if (!node || !node.parent) { if (!node || !node.parent) {
@@ -818,6 +866,10 @@ const add = () => {
engineeringParam.value.description = '' engineeringParam.value.description = ''
engineeringParam.value.name = '' engineeringParam.value.name = ''
engineeringParam.value.province = '' engineeringParam.value.province = ''
// 清理其他层级数据
projectInfoList.value = []
deviceInfoList.value = []
lineInfoList.value = []
break break
case 1: // 新增项目添加一个新的项目tab case 1: // 新增项目添加一个新的项目tab
// 添加一个新的空项目到projectInfoList // 添加一个新的空项目到projectInfoList
@@ -827,6 +879,9 @@ const add = () => {
description: '' description: ''
}) })
deviceIndex.value = (projectInfoList.value.length - 1).toString() deviceIndex.value = (projectInfoList.value.length - 1).toString()
// 清理设备和监测点数据
deviceInfoList.value = []
lineInfoList.value = []
break break
case 2: // 新增设备添加一个新的设备tab case 2: // 新增设备添加一个新的设备tab
// 添加一个新的空设备到deviceInfoList // 添加一个新的空设备到deviceInfoList
@@ -842,6 +897,8 @@ const add = () => {
sort: 0 sort: 0
}) })
busBarIndex.value = (deviceInfoList.value.length - 1).toString() busBarIndex.value = (deviceInfoList.value.length - 1).toString()
// 清理监测点数据
lineInfoList.value = []
break break
case 3: // 新增监测点添加一个新的监测点tab case 3: // 新增监测点添加一个新的监测点tab
// 添加一个新的空监测点到lineInfoList // 添加一个新的空监测点到lineInfoList
@@ -943,7 +1000,7 @@ const updateProjectFunc = (id: any) => {
message: '修改项目成功' message: '修改项目成功'
}) })
pageStatus.value = 1 pageStatus.value = 1
TerminalRef.value.info() treedata()
}) })
} }
/** /**
@@ -1037,7 +1094,7 @@ const updateLineFunc = (id: any) => {
message: '修改监测点成功' message: '修改监测点成功'
}) })
pageStatus.value = 1 pageStatus.value = 1
TerminalRef.value.info() treedata()
}) })
} }
@@ -1088,14 +1145,13 @@ const remove = () => {
case 2: // 项目层级 case 2: // 项目层级
// 删除项目后选中工程节点 // 删除项目后选中工程节点
const engineeringId = nodeData.value.pids ? nodeData.value.pids.split(',')[1] : null const engineeringId = nodeData.value.pids ? nodeData.value.pids.split(',')[1] : null
console.log(engineeringId)
deleteProject(nodeData.value.id,'','','', 0).then((res: any) => { deleteProject(nodeData.value.id,'','','', 0).then((res: any) => {
ElMessage({ ElMessage({
type: 'success', type: 'success',
message: res.message message: res.message
}) })
reaseStatus() reaseStatus()
console.log('engineeringId',engineeringId)
if (engineeringId) { if (engineeringId) {
setTimeout(() => { setTimeout(() => {
treedata(engineeringId) treedata(engineeringId)
@@ -1159,74 +1215,85 @@ const remove = () => {
} }
// 下一步 // 下一步
const next = async () => { const next = async () => {
// 在新增模式下pageStatus == 2保存当前数据并创建下一个层级的Tab console.log('mainForm',mainForm.value.validate)
switch (nodeLevel.value) { await mainForm.value?.validate((valid: boolean) => {
case 0: // 工程层级下一步创建项目Tab console.log('valid', valid)
// 保存当前工程信息到临时存储 if (valid) {
tempAllLevelData.value.engineering = { ...engineeringParam.value }
// 创建新的项目Tab }
projectInfoList.value.push({ })
name: '',
area: '',
description: '',
})
deviceIndex.value = (projectInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 1
break
case 1: // 项目层级下一步创建设备Tab
// 保存当前项目信息到临时存储
const currentProject = { ...projectInfoList.value[deviceIndex.value] }
tempAllLevelData.value.projects[deviceIndex.value] = currentProject
// 创建新的设备Tab }
deviceInfoList.value.push({
name: '',
devModel: '',
devType: '',
devAccessMethod: 'CLD',
mac: '',
ndid: '',
nodeId: '',
cntractNo: '',
sort: 0
})
busBarIndex.value = (deviceInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 2
break
case 2: // 设备层级下一步创建监测点Tab
// 保存当前设备信息到临时存储
const currentDevice = { ...deviceInfoList.value[busBarIndex.value] }
tempAllLevelData.value.devices[busBarIndex.value] = currentDevice
// 创建新的监测点Tab const executeNextStep = () => {
lineInfoList.value.push({ // 在新增模式下pageStatus == 2保存当前数据并创建下一个层级的Tab
name: '', switch (nodeLevel.value) {
lineNo: 1, case 0: // 工程层级下一步创建项目Tab
conType: 0, // 保存当前工程信息到临时存储
lineInterval: 1, tempAllLevelData.value.engineering = { ...engineeringParam.value }
ptRatio: 0,
pt2Ratio: 0,
ctRatio: 0,
ct2Ratio: 0,
volGrade: '',
devMac: '',
})
lineIndex.value = (lineInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 3
break
case 3: // 监测点层级
// 保存当前监测点信息到临时存储
const currentLine = { ...lineInfoList.value[lineIndex.value] }
tempAllLevelData.value.lines[lineIndex.value] = currentLine
nextfalg.value = true // 创建新的项目Tab
nodeLevel.value = 4 projectInfoList.value.push({
break name: '',
} area: '',
description: '',
})
deviceIndex.value = (projectInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 1
break
case 1: // 项目层级下一步创建设备Tab
// 保存当前项目信息到临时存储
const currentProject = { ...projectInfoList.value[deviceIndex.value] }
tempAllLevelData.value.projects[deviceIndex.value] = currentProject
// 创建新的设备Tab
deviceInfoList.value.push({
name: '',
devModel: '',
devType: '',
devAccessMethod: 'CLD',
mac: '',
ndid: '',
nodeId: '',
cntractNo: '',
sort: 0
})
busBarIndex.value = (deviceInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 2
break
case 2: // 设备层级下一步创建监测点Tab
// 保存当前设备信息到临时存储
const currentDevice = { ...deviceInfoList.value[busBarIndex.value] }
tempAllLevelData.value.devices[busBarIndex.value] = currentDevice
// 创建新的监测点Tab
lineInfoList.value.push({
name: '',
lineNo: 1,
conType: 0,
lineInterval: 1,
ptRatio: 0,
pt2Ratio: 0,
ctRatio: 0,
ct2Ratio: 0,
volGrade: '',
devMac: '',
})
lineIndex.value = (lineInfoList.value.length - 1).toString()
nextfalg.value = false
nodeLevel.value = 3
break
case 3: // 监测点层级
// 保存当前监测点信息到临时存储
const currentLine = { ...lineInfoList.value[lineIndex.value] }
tempAllLevelData.value.lines[lineIndex.value] = currentLine
nextfalg.value = true
nodeLevel.value = 4
break
}
} }
// 撤销 // 撤销
@@ -1823,8 +1890,8 @@ const handleDeviceTabsEdit = (targetName: any, action: any) => {
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
// 如果是编辑现有项目 // 删除项目
if (pageStatus.value === 3 && projectInfoList.value[deviceIndex.value]?.id) { if (projectInfoList.value[deviceIndex.value]?.id) {
deleteProject( deleteProject(
projectInfoList.value[deviceIndex.value].id, projectInfoList.value[deviceIndex.value].id,
projectInfoList.value[deviceIndex.value].name, projectInfoList.value[deviceIndex.value].name,
@@ -1845,7 +1912,8 @@ const handleDeviceTabsEdit = (targetName: any, action: any) => {
// 重置相关索引 // 重置相关索引
busBarIndex.value = '0' busBarIndex.value = '0'
lineIndex.value = '0' lineIndex.value = '0'
TerminalRef.value.info() pageStatus.value = 1
treedata()
}) })
} else { } else {
// 如果是新增模式下删除未保存的项目 // 如果是新增模式下删除未保存的项目
@@ -1895,7 +1963,7 @@ const handleBusBarTabsEdit = (targetName: any, action: any) => {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
// 如果是编辑现有设备 // 如果是编辑现有设备
if (pageStatus.value === 3 && deviceInfoList.value[busBarIndex.value]?.id) { if ( deviceInfoList.value[busBarIndex.value]?.id) {
deleteEquipment(deviceInfoList.value[busBarIndex.value].id).then((res: any) => { deleteEquipment(deviceInfoList.value[busBarIndex.value].id).then((res: any) => {
ElMessage({ ElMessage({
type: 'success', type: 'success',
@@ -1908,7 +1976,8 @@ const handleBusBarTabsEdit = (targetName: any, action: any) => {
? (deviceInfoList.value.length - 1).toString() ? (deviceInfoList.value.length - 1).toString()
: '0' : '0'
lineIndex.value = '0' lineIndex.value = '0'
TerminalRef.value.info() pageStatus.value = 1
treedata()
}) })
} else { } else {
// 如果是新增模式下删除未保存的设备 // 如果是新增模式下删除未保存的设备
@@ -1958,8 +2027,8 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
// 如果是编辑现有监测点 // 如果是编辑现有监测点
if (pageStatus.value === 3 && lineInfoList.value[lineIndex.value]?.id) { if (lineInfoList.value[lineIndex.value]?.lineId) {
deleteLine(lineInfoList.value[lineIndex.value].id).then((res: any) => { deleteLine(lineInfoList.value[lineIndex.value].lineId).then((res: any) => {
ElMessage({ ElMessage({
type: 'success', type: 'success',
message: res.message message: res.message
@@ -1970,7 +2039,8 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
lineIndex.value = lineInfoList.value.length lineIndex.value = lineInfoList.value.length
? (lineInfoList.value.length - 1).toString() ? (lineInfoList.value.length - 1).toString()
: '0' : '0'
TerminalRef.value.info() pageStatus.value = 1
treedata()
}) })
} else { } else {
// 如果是新增模式下删除未保存的监测点 // 如果是新增模式下删除未保存的监测点
@@ -1991,6 +2061,7 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
}) })
} }
} }
const tabChange = (type: string) => { const tabChange = (type: string) => {
if (type == 'deviceIndex') { if (type == 'deviceIndex') {
busBarIndex.value = '0' busBarIndex.value = '0'
@@ -2006,6 +2077,9 @@ const treedata = (selectedNodeId?: string) => {
} else { } else {
TerminalRef.value.info(); TerminalRef.value.info();
} }
titleList.value = []
titleList.value.unshift('在线设备')
} }
/** /**
* 重置初始状态 * 重置初始状态

View File

@@ -983,10 +983,8 @@ const getRealDataMqttMsg = async () => {
// JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))) // JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message))))
// ) // )
let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message)))) let obj = JSON.parse(JSON.stringify(JSON.parse(new TextDecoder().decode(message))))
// console.log("🚀 ~ mqttRef.value.on ~ obj:", obj)
if (lineId.value != obj.lineId && adminInfo.userIndex != obj.userId) return if (lineId.value != obj.lineId || adminInfo.userIndex != obj.userId) return
// console.log("🚀 ~ mqttRef.value.on ~ obj:", obj)
// console.log("🚀 ~ mqttRef.value.on ~ formInline.dataLevel:", obj.dataLevel, formInline.dataLevel)
//处理mqtt数据 1转2除 2转1乘 //处理mqtt数据 1转2除 2转1乘
//如果消息返回值是二次值,下拉框是二次值只需要单位换算 除以1000 //如果消息返回值是二次值,下拉框是二次值只需要单位换算 除以1000
@@ -1101,6 +1099,7 @@ const getRealDataMqttMsg = async () => {
} }
if (obj.hasOwnProperty('pA') && obj.hasOwnProperty('pB')) { if (obj.hasOwnProperty('pA') && obj.hasOwnProperty('pB')) {
mqttMessage.value = obj mqttMessage.value = obj
//更新实时数据主页面值 //更新实时数据主页面值
realTimeFlag.value && realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value) realTimeFlag.value && realTimeRef.value && realTimeRef.value.setRealData(mqttMessage.value)
tableLoading.value = false tableLoading.value = false

View File

@@ -56,6 +56,7 @@ const tableStore: any = new TableStore({
title: '持续时间(s)', title: '持续时间(s)',
minWidth: 100, minWidth: 100,
formatter: (row: any) => { formatter: (row: any) => {
console.log('row.cellValue', row.cellValue)
row.cellValue = row.cellValue ? row.cellValue.toFixed(2) : '/' row.cellValue = row.cellValue ? row.cellValue.toFixed(2) : '/'
return row.cellValue return row.cellValue
}, sortable: true }, sortable: true
@@ -65,7 +66,8 @@ const tableStore: any = new TableStore({
title: '暂降(聚升)幅值(%)', title: '暂降(聚升)幅值(%)',
width: 100, width: 100,
formatter: (row: any) => { formatter: (row: any) => {
row.cellValue = row.cellValue + '' ? row.cellValue.toFixed(2) : '/' //row.cellValue = row.cellValue + '' ? row.cellValue.toFixed(2) : '/'
row.cellValue = row.cellValue != null ? Number(row.cellValue).toFixed(2) : '/'
if (String(row.cellValue).split('.')[1] == '00') { if (String(row.cellValue).split('.')[1] == '00') {
row.cellValue = String(row.cellValue).split('.')[0] row.cellValue = String(row.cellValue).split('.')[0]
} }

View File

@@ -0,0 +1,593 @@
<template>
<div class="default-main">
<div class="default">
<div style="flex: 1">
<TableHeader>
<template v-slot:select>
<el-form-item label="前置等级">
<el-select
v-model="tableStore.table.params.nodeGrade"
clearable
placeholder="请选择前置等级"
>
<el-option
v-for="item in fontdveoption"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="tableStore.table.params.searchState" clearable placeholder="请选择状态">
<el-option
v-for="item in statusoption"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</template>
<template v-slot:operation>
<el-button type="primary" class="ml10" @click="add" icon="el-icon-Plus">新增</el-button>
</template>
</TableHeader>
<Table
ref="tableRef"
:row-config="{ isCurrent: true, isHover: true }"
@current-change="currentChangeEvent"
></Table>
</div>
<div class="pd10" style="width: 400px" v-loading="loading">
<el-input v-model="filterText" placeholder="请输入内容" clearable show-word-limit @input="change">
<template #prefix>
<Icon name="el-icon-Search" style="font-size: 16px" />
</template>
</el-input>
<el-tree
:style="height"
style="overflow-y: auto"
:data="dataSource"
node-key="id"
ref="treeRef"
default-expand-all
:props="defaultProps"
:filter-node-method="filterNode"
>
<template #default="{ node, data }">
<div class="custom-tree-node">
<span>
<span v-if="data.processState != null">
{{ node.label }}
</span>
<span v-else>{{ data.subName }}_{{ data.name }}</span>
<span
v-if="data.processState != null"
class="iconSpan"
:style="{ background: data.processState == 0 ? '#ff0000' : '#00b07d' }"
></span>
</span>
<div>
<!-- <el-button type="primary" v-if="data.id == undefined" link icon="el-icon-Plus" ></el-button> -->
<el-button
style="margin-left: 4px"
icon="el-icon-Edit"
v-if="data.id"
type="primary"
@click="edit(data)"
link
></el-button>
<el-popconfirm
v-else
class="box-item"
title="确定重启吗?"
placement="bottom"
@confirm="restart(data)"
>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="warning" size="small" @click="confirm">确认</el-button>
</template>
<template #reference>
<el-button
style="margin-left: 4px"
icon="el-icon-Refresh"
type="warning"
link
@click.stop
></el-button>
</template>
</el-popconfirm>
</div>
</div>
</template>
</el-tree>
</div>
</div>
<!-- 重启确认对话框 -->
<el-dialog
draggable
title="重启确认"
v-model="restartDialogVisible"
:close-on-click-modal="false"
width="400px"
:before-close="cancelRestart"
>
<el-form :model="restartForm" label-width="80px" :rules="restartRules" ref="restartFormRef">
<el-form-item label="密码:" prop="password">
<el-input
v-model="restartForm.password"
type="password"
placeholder="请输入密码"
show-password
></el-input>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="cancelRestart"> </el-button>
<el-button type="primary" @click="confirmRestart"> </el-button>
</template>
</el-dialog>
<el-dialog
draggable
:title="dialogTitle"
v-model="dialogFormVisible"
:close-on-click-modal="false"
width="700px"
:before-close="resetForm"
>
<el-form :model="formData" label-width="120px" :rules="rules" ref="ruleFormRef">
<el-form-item label="名称:" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入名称"
maxlength="32"
show-word-limit
@input="handleInput"
></el-input>
</el-form-item>
<el-form-item label="IP:" prop="ip" class="top">
<el-input v-model="formData.ip" placeholder="请输入Ip"></el-input>
</el-form-item>
<el-form-item label="等级:" prop="nodeGrade" class="top">
<el-select v-model="formData.nodeGrade" placeholder="请选择等级" style="width: 100%">
<el-option
v-for="item in fontdveoption"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="最大终端数:" prop="nodeDevNum" class="top">
<el-input
v-model="formData.nodeDevNum"
onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5"
placeholder="请输入最大终端数"
></el-input>
</el-form-item>
<el-form-item label="最大进程数:" prop="maxProcessNum" class="top">
<el-input
v-model="formData.maxProcessNum"
onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5"
placeholder="请根据监测点规模填写合适进程数1个进程最大可承载200个监测点"
></el-input>
<!-- <el-select v-model="formData.maxProcessNum" placeholder="请选择等级" style="width: 100%">
<el-option
v-for="item in NumList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select> -->
</el-form-item>
<el-form-item label="排序:" prop="sort" class="top">
<el-input v-model="formData.sort" placeholder="请输入排序"></el-input>
</el-form-item>
<el-form-item label="描述:" prop="remark" class="top">
<el-input
v-model="formData.remark"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
placeholder="请输入描述"
></el-input>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="resetForm"> </el-button>
<el-button type="primary" @click="onSubmit"> </el-button>
</template>
</el-dialog>
<!-- 绑定进程号 -->
<el-dialog draggable title="绑定进程号" v-model="popUps" :close-on-click-modal="false" width="400px">
<el-select v-model="processNo" placeholder="请选择进程号" style="width: 100%">
<el-option
v-for="item in dataSource"
:key="item.name"
:label="item.name"
:value="item.name"
></el-option>
</el-select>
<template #footer>
<el-button @click="popUps = false"> </el-button>
<el-button type="primary" @click="bindTheProcess"> </el-button>
</template>
</el-dialog>
</div>
</template>
<script setup lang="ts">
import { mainHeight } from '@/utils/layout'
import TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { ref, onMounted, provide, reactive, nextTick } from 'vue'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { ElButton } from 'element-plus'
import {addNode,updateNode,delNode,nodeDeviceTree,restartProcess,updateProcess} from '@/api/cs-device-boot/frontManagement'
defineOptions({
name: 'govern/setting/frontManagement'
})
const filterText = ref('')
const fontdveoption: any = ref([
{ id: 0, name: '极重要' },
{ id: 1, name: '普通' },
{ id: 2, name: '备用' }
])
const statusoption: any = ref([
{ id: 0, name: '未启用' },
{ id: 1, name: '启用' }
])
const height = mainHeight(70)
const loading = ref(false)
const popUps = ref(false)
const tableRef = ref()
const processNo = ref('')
const ruleFormRef = ref()
const dataSource: any = ref([])
const defaultProps = {
children: 'deviceInfoList',
label: 'name'
}
const formData: any = ref({
name: '',
ip: '',
nodeGrade: '',
nodeDevNum: '',
sort: '',
remark: '',
maxProcessNum: ''
})
const rules = reactive({
name: [{ required: true, message: '名称不可为空', trigger: 'blur' }],
ip: [{ required: true, message: 'ip不可为空', trigger: 'blur' }],
nodeGrade: [{ required: true, message: '等级不可为空', trigger: 'blur' }],
nodeDevNum: [{ required: true, message: '最大终端数不可为空', trigger: 'blur' }],
maxProcessNum: [{ required: true, message: '最大进程数不可为空', trigger: 'blur' }],
sort: [{ required: true, message: '排序不可为空', trigger: 'blur' }],
remark: [{ required: true, message: '描述不可为空', trigger: 'blur' }]
})
const dialogFormVisible = ref(false)
const dialogTitle = ref('新增前置机')
const processId = ref('')
const tableStore = new TableStore({
url: '/cs-device-boot/node/nodeList',
method: 'POST',
column: [
{ title: '名称', field: 'name' },
{ title: 'IP', field: 'ip' },
{
title: '等级',
field: 'nodeGrade',
render: 'tag',
custom: {
0: 'success',
1: 'warning',
2: 'info'
},
replaceValue: {
0: '极重要',
1: '普通',
2: '备用'
}
},
{
title: '最大监测点数量',
field: 'nodeDevNum'
},
{
title: '最大进程数',
field: 'maxProcessNum'
},
{
title: '排序',
field: 'sort'
},
{
title: '状态',
field: 'state',
render: 'tag',
custom: {
0: 'warning',
1: 'success'
},
replaceValue: {
0: '未启用',
1: '启用'
}
},
{ title: '描述', field: 'remark' },
{
title: '操作',
align: 'center',
width: '180',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: async row => {
dialogFormVisible.value = true
dialogTitle.value = '前置机修改'
formData.value = JSON.parse(JSON.stringify(row))
}
},
{
name: 'del',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
delNode(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
beforeSearchFun: () => {
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '' && key !== 'nodeGrade' && key !== 'searchState') {
delete tableStore.table.params[key]
}
}
},
loadCallback: () => {
tableRef.value.getRef().setCurrentRow(tableStore.table.data[0])
currentChangeEvent()
}
})
const nodeId = ref('')
// 点击行
const currentChangeEvent = () => {
// 确保 tableRef 和当前记录存在
if (!tableRef.value || !tableRef.value.getRef().getCurrentRecord()) {
loading.value = false
dataSource.value = []
return
}
loading.value = true
dataSource.value = []
nodeDeviceTree({
id: tableRef.value.getRef().getCurrentRecord().id
})
.then(res => {
nodeId.value = tableRef.value.getRef().getCurrentRecord().id
// 检查返回的数据是否存在且不为空
if (res.data && res.data.processDeviceList) {
dataSource.value = res.data.processDeviceList.filter(item => (item.name = item.processNo + ''))
} else {
dataSource.value = []
}
loading.value = false
})
.catch(() => {
// 添加错误处理,确保 loading 状态也能关闭
dataSource.value = []
loading.value = false
})
}
// 重启进程
const restart = (data: any) => {
console.log('🚀 ~ restart ~ data:', data)
restartProcess({
deviceRebootType: data.processNo,
nodeId: nodeId.value,
processNo: 2
}).then(res => {
ElMessage.success('重启成功')
currentChangeEvent()
})
}
const treeRef = ref()
// 树过滤
const change = (val: any) => {
treeRef.value!.filter(filterText.value)
}
const edit = (data: any) => {
processNo.value = data.nodeProcess
processId.value = data.id
popUps.value = true
}
// 更新进程号
const bindTheProcess = () => {
updateProcess({
id: processId.value,
processNo: processNo.value
}).then((res: any) => {
ElMessage.success('修改成功!')
popUps.value = false
currentChangeEvent()
})
}
const filterNode = (value: string, data: any, node: any) => {
if (!value) return true
// return data.name.includes(value)
if (data.name) {
return chooseNode(value, data, node)
}
}
// 过滤父节点 / 子节点 (如果输入的参数是父节点且能匹配则返回该节点以及其下的所有子节点如果参数是子节点则返回该节点的父节点。name是中文字符enName是英文字符.
const chooseNode = (value: string, data: any, node: any) => {
if (data.name.indexOf(value) !== -1) {
return true
}
const level = node.level
// 如果传入的节点本身就是一级节点就不用校验了
if (level === 1) {
return false
}
// 先取当前节点的父节点
let parentData = node.parent
// 遍历当前节点的父节点
let index = 0
while (index < level - 1) {
// 如果匹配到直接返回此处name值是中文字符enName是英文字符。判断匹配中英文过滤
if (parentData.data.name.indexOf(value) !== -1) {
return true
}
// 否则的话再往上一层做匹配
parentData = parentData.parent
index++
}
// 没匹配到返回false
return false
}
tableStore.table.params.orderBy = 'desc'
tableStore.table.params.nodeGrade = ''
tableStore.table.params.searchState = ''
provide('tableStore', tableStore)
// 新增
const add = () => {
dialogFormVisible.value = true
dialogTitle.value = '新增前置机'
}
// 确认
const onSubmit = () => {
ruleFormRef.value.validate((valid: any) => {
if (valid) {
if (dialogTitle.value == '新增前置机') {
addNode(formData.value).then(res => {
ElMessage.success('新增前置机')
resetForm()
tableStore.onTableAction('search', {})
})
} else {
updateNode(formData.value).then(res => {
ElMessage.success('修改成功')
resetForm()
tableStore.onTableAction('search', {})
})
}
}
})
}
// 清空表格
const resetForm = () => {
dialogFormVisible.value = false
formData.value = {
name: '',
ip: '',
nodeGrade: '',
nodeDevNum: '',
sort: '',
remark: ''
}
}
const handleInput = (val: string) => {
formData.value.name = val.replace(/\s+/g, '')
}
onMounted(() => {
setTimeout(() => {
tableStore.index()
}, 100)
})
</script>
<style lang="scss" scoped>
.qrcode-label {
position: absolute;
top: 0;
right: 0;
z-index: -99;
display: flex;
align-items: center;
justify-content: center;
width: 180px;
height: 180px;
padding: 10px;
background: #fff;
flex-direction: column;
.qrcode-label-title {
margin-bottom: 10px;
font-size: 14px;
font-weight: bold;
}
.qrcode-label-img {
width: 140px;
height: 140px;
}
}
:deep(.default) {
display: flex;
.row--current {
background-color: var(--el-color-primary-light-8) !important;
}
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
width: 300px;
}
.iconSpan {
display: inline-block;
width: 8px;
height: 8px;
margin-left: 3px;
border-radius: 50%;
margin-bottom: 2px;
}
</style>