SmartSubstationPlatform/riis-web/src/views/basedata/algorithm/index.vue

1123 lines
45 KiB
Vue
Raw Normal View History

2025-05-15 15:37:03 +08:00
<script lang="ts">
export default {
name: "algorithm",
};
</script>
<script setup lang="ts">
import { ref, onMounted, nextTick } from "vue";
import { ElMessageBox, ElMessage } from "element-plus";
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
import Page from '@/components/Pagination/page.vue'
import { useUserStore } from '@/store/modules/user';
import {
getAlgorithmClassList,
addAlgorithmClassAndParams,
getAlgorithmParamsList,
deleteAlgorithmClass,
getSubstationAreaByCode,
getSubstationBayByArea,
getAlgorithmClassComponentPage,
getComponentPage,
batchAddAlgorithmClassComponent,
getSubstationMaindeviceList,
deleteAlgorithmClassComponent,
batchAddAlgorithmDevice
} from "@/api/algorithm";
import {
getTreelist,
getDeviceByType,
getdevicedata,
getMainEquipment,
getBayType,
} from "@/api/device";
import {
getDeviceTree,
queryDeviceSignal
} from '@/api/equipmentsignal';
import { publicTree } from '@/utils/validate';
const userStore = useUserStore();
const defaultProps = {
label: "algorithmClassName"
};
const defaultProps1 = {
children: "children",
label: "name"
};
const treedata = ref([])
const currentNodeKey = ref("")
const treeloading = ref(false)
const treeRef = ref()
const algorithmClassName = ref('')
function gettreedata() {
treeloading.value = true
getAlgorithmClassList({ algorithmClassName: algorithmClassName.value }).then((res: any) => {
treedata.value = res.data
treeloading.value = false
algorithmId.value = res.data[0].id
gatdata()
nextTick(() => {
treeRef.value?.setCurrentKey(algorithmId.value);
});
})
}
//新增算法
const algorithmible = ref(false)
const title = ref('')
function addAlgorithm() {
algorithmible.value = true
title.value = '新增算法'
algorithmData.value.length = 0
algorithmform.value = {
algorithmClassCode: '',
algorithmClassName: '',
serviceAddress: '',
description: ''
}
}
function editAlgorithm(row: any) {
algorithmible.value = true
title.value = '修改算法'
algorithmform.value = JSON.parse(JSON.stringify(row));
getAlgorithmParamsList({ algorithmId: row.id }).then((res: any) => {
algorithmData.value = res.data
})
}
function delAlgorithm(row: any) {
ElMessageBox.confirm("确定删除此算法吗?", "删除提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteAlgorithmClass({ id: row.id }).then((res: any) => {
if (res.code == '0') {
gettreedata()
ElMessage({
type: 'success',
message: '删除成功',
})
}
})
})
}
function handleClose() {
ruleFormRef.value.resetFields();
algorithmible.value = false
}
function handleNodeClick(data: any, node: any) {
algorithmId.value = data.id
gatdata()
}
const moderules: any = ref({
algorithmClassCode: [{ required: true, message: "请输入算法编号", trigger: "blur" }],
algorithmClassName: [{ required: true, message: "请输入算法名称", trigger: "blur" }],
serviceAddress: [{ required: true, message: "请输入算法描述", trigger: "blur" }],
});
const algorithmform: any = ref({
algorithmClassCode: '',
algorithmClassName: '',
serviceAddress: '',
description: ''
})
const dataarr = ref([
{
dictname: '否',
itemcode: '0'
},
{
dictname: '是',
itemcode: '1'
},
])
const algorithmData: any = ref([])
const algorithmDialog = ref(false)
const paramType: any = ref([])
function addAlgorithmsan() {
algorithmData.value.push({
paramOrder: '', //参数序号
paramName: '', //参数名称
paramDesc: '', //参数中文描述
paramType: '', //参数类型:[('01', '单个文本'), ('02', '文本数组'), ('03', '单个数值'), ('04', '数值数组'), ('05', 'Json对象'),('06', 'Json数组'), ('07', 'csv数据文件'), ('08', '单张图片'),('09', '图片文件包'),('10', 'Json文件')]
paramUnit: '', //自定义描述参数单位
paramRange: '', //参数范围
defaultValues: '', //默认值
paramFixed: '', //是否固定参数01当为否时需要关联巡视点位或者信号'
algor: true
})
}
function saveAlgor(row: any) {
2025-05-17 14:51:04 +08:00
if (row.algor) {
if (!(row.paramName && row.paramType && row.paramFixed)) {
ElMessage.warning('请填写参数名称,类型和是否固定参数')
return
} else {
row.algor = !row.algor
}
} else {
row.algor = !row.algor
}
2025-05-15 15:37:03 +08:00
}
function delAlgor(row: any) {
algorithmData.value.splice(row.$index, 1);
}
const areaList: any = ref([])
function gettype() {
getDeviceByType({ dictcode: 'paramType' }).then((res: any) => {
paramType.value = res.data
})
getSubstationAreaByCode({ stationCode: userStore.stationCode }).then((res: any) => {
areaList.value = res.data
})
getDeviceByType({ dictcode: 'ykytType' }).then((ress: any) => {
typeoptions.value = ress.data
})
}
const ruleFormRef = ref();
//用户弹窗-保存
function confirmClick(formEl: any) {
formEl.validate((valid: any) => {
if (valid) {
algorithmData.value.forEach((item: any, index: any) => {
item.paramOrder = index + 1
})
2025-05-17 14:51:04 +08:00
for (let i = 0; i < algorithmData.value.length; i++) {
if (!(algorithmData.value[i].paramName && algorithmData.value[i].paramType &&algorithmData.value[i].paramFixed)) {
ElMessage.warning('请填写参数名称,类型和是否固定参数')
return
}
}
2025-05-15 15:37:03 +08:00
addAlgorithmClassAndParams({ algorithmClass: algorithmform.value, algorithmParamsList: algorithmData.value }).then((res: any) => {
console.log(res)
if (res.code == 0) {
algorithmible.value = false
2025-05-16 16:18:11 +08:00
ElMessage.success('更改成功')
2025-05-15 15:37:03 +08:00
gettreedata()
}
})
// if(algorithmform.value.id){
// }else{
// }
}
})
}
//左侧表格
const tableData = ref([]);
const total = ref()
const dialog = ref(false)
const algorithmId = ref('')
const queryParams = ref({
algorithmId: '',
current: 1,
size: 10,
});
function gatdata() {
dialog.value = true
queryParams.value.algorithmId = algorithmId.value
getAlgorithmClassComponentPage(queryParams.value).then((res: any) => {
dialog.value = false
tableData.value = res.data.records
total.value = res.data.total
queryParams.value.size = res.data.size
queryParams.value.current = res.data.current
})
}
//选择主设备
const masterble = ref(false)
const masterdata = ref([])
const mastertotal = ref()
const masterLoading = ref(false)
const masterform: any = ref({
size: 20,
current: 1
})
const multipleTableRef = ref()
function addMaster() {
title.value = '选择主设备'
masterble.value = true
getbybay()
}
function handleClose1() {
masterble.value = false
}
function replace() {
meterdata.value.forEach((item: any) => {
2025-05-16 16:18:11 +08:00
item.componentId = componentId.value
2025-05-15 15:37:03 +08:00
})
batchAddAlgorithmDevice(meterdata.value).then((res: any) => {
if (res.code == 0) {
mainble.value = false
ElMessage.success('关联成功')
}
})
}
function handleClose2() {
mainble.value = false
}
const multipleSelection = ref()
function handleSelectionChange(val: any) {
multipleSelection.value = val;
}
function getbybay() {
masterLoading.value = true
masterform.value.algorithmId = algorithmId.value
getComponentPage(masterform.value).then((res: any) => {
masterLoading.value = false
masterdata.value = res.data.records
masterform.value.size = res.data.size
masterform.value.current = res.data.current
mastertotal.value = res.data.total
})
}
function addmasteras() {
multipleSelection.value.forEach((item: any) => {
item.algorithmId = algorithmId.value
})
batchAddAlgorithmClassComponent(multipleSelection.value).then((res: any) => {
if (res.code == 0) {
getbybay()
ElMessage({
type: 'success',
message: '添加成功'
})
masterble.value = false
gatdata()
}
})
}
const bayList: any = ref([])
function getcomponent() {
getSubstationBayByArea({ stationCode: userStore.stationCode, areaId: masterform.value.areaId }).then((res: any) => {
bayList.value = res.data
getbybay()
})
}
const mainList: any = ref([])
function getmainDevice() {
getbybay()
getSubstationMaindeviceList({ bayId: masterform.value.bayId }).then((res: any) => {
mainList.value = res.data
})
}
function cleraareaId() {
masterform.value.bayId = ''
masterform.value.mainDeviceId = ''
}
function cleramainId() {
masterform.value.mainDeviceId = ''
}
function delmain(row: any) {
ElMessageBox.confirm("确定删除此主设备吗?", "删除提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteAlgorithmClassComponent({ id: row.id }).then((res: any) => {
if (res.code == 0) {
gatdata()
ElMessage({
type: 'success',
message: '删除成功',
})
}
})
})
}
const mainble = ref()
function editmain(row: any) {
mainble.value = true
meterloding.value = true
2025-05-17 14:51:04 +08:00
componentId.value = row.componentId
getAlgorithmParamsList({ algorithmId: row.algorithmId, componentId: componentId.value }).then((res: any) => {
2025-05-15 15:37:03 +08:00
meterdata.value = res.data
meterloding.value = false
})
}
//关联参数
const meterdata = ref([])
const meterloding = ref(false)
const selectble = ref(false)
const sourceType = ref(1)
const cnshuId = ref('')
const tableref = ref()
const deviceId = ref('')
2025-05-16 16:18:11 +08:00
const componentId = ref('')
2025-05-15 15:37:03 +08:00
function selentDevide(row: any) {
2025-05-17 14:51:04 +08:00
cnshuId.value = row.paramId
2025-05-15 15:37:03 +08:00
if (row.deviceId) {
deviceId.value = row.deviceId
}
selectble.value = true
sourceType.value = 1
typeChange(1)
notification()
}
function selectbleClose() {
selectble.value = false
deviceIdList.value = null
sourceType.value = 0
devicedata.value.length = 0
}
function suredevice() {
selectble.value = false
devicedata.value.length = 0
meterdata.value.forEach((item: any) => {
2025-05-17 14:51:04 +08:00
if (item.paramId == cnshuId.value) {
2025-05-15 15:37:03 +08:00
if (sourceType.value == 1) {
item.deviceId = deviceIdList.value.deviceId
item.deviceName = deviceIdList.value.deviceName
2025-05-16 16:18:11 +08:00
item.paramValue = deviceIdList.value.deviceName
2025-05-15 15:37:03 +08:00
} else if (sourceType.value == 2) {
item.deviceId = deviceIdList.value.signalId
item.deviceName = deviceIdList.value.signalName
2025-05-16 16:18:11 +08:00
item.paramValue = deviceIdList.value.signalName
2025-05-15 15:37:03 +08:00
}
item.sourceType = sourceType.value
2025-05-17 14:51:04 +08:00
2025-05-15 15:37:03 +08:00
}
})
2025-05-17 14:51:04 +08:00
console.log(meterdata.value)
2025-05-15 15:37:03 +08:00
}
function typeChange(val: any) {
sourceType.value = val
2025-05-16 16:18:11 +08:00
getdevicedata1()
2025-05-15 15:37:03 +08:00
}
//////
const bayId = ref('')
const devicedataloading = ref(false)
const devicetaotal = ref()
const devicedata = ref([])
const paramstable: any = ref({
size: 10,
current: 1,
deviceName: '',
componentId: ''
})
function getdevicedata1() {
2025-05-17 14:51:04 +08:00
2025-05-15 15:37:03 +08:00
if (sourceType.value == 1) {
paramstable.value.bayId = bayId.value
2025-05-16 16:18:11 +08:00
paramstable.value.componentId = componentId.value
2025-05-15 15:37:03 +08:00
getdevicedata(paramstable.value).then((res: any) => {
devicedata.value = res.data.records
devicetaotal.value = res.data.total
paramstable.value.size = res.data.size
paramstable.value.current = res.data.current
devicedataloading.value = false
nextTick(() => {
if (deviceId.value) {
2025-05-17 14:51:04 +08:00
const foundObj = devicedata.value.find((item: any) => item.deviceId == deviceId.value);
2025-05-15 15:37:03 +08:00
tableref.value!.setCurrentRow(foundObj)
}
});
})
} else if (sourceType.value == 2) {
2025-05-16 16:18:11 +08:00
paramstable.value.mainComponentId = componentId.value
2025-05-15 15:37:03 +08:00
queryDeviceSignal(paramstable.value).then((res: any) => {
devicedata.value = res.data.records
devicetaotal.value = res.data.total
paramstable.value.size = res.data.size
paramstable.value.current = res.data.current
devicedataloading.value = false
nextTick(() => {
if (deviceId.value) {
2025-05-17 14:51:04 +08:00
const foundObj = devicedata.value.find((item: any) => item.signalId == deviceId.value);
2025-05-15 15:37:03 +08:00
tableref.value!.setCurrentRow(foundObj)
}
});
})
}
devicedataloading.value = true
}
function resetting() {
paramstable.value = {
size: 10,
current: 1,
deviceName: '',
mainDeviceId: '',
componentId: ''
}
getdevicedata1()
}
const deviceInfos: any = ref([])
function handleSelectionChange1(val: any) {
deviceInfos.value = val
}
//间隔下所属部件
const getacaTypeBayId = ref()
// 主设备类型
const EquipmentType = ref()
//点位分类
const DeviceClass: any = ref([])
const Metertype = ref([])
const mainEquipment: any = ref([])
// 获取弹窗所需数据
function notification() {
// 所属主设备
const params = {
bayId: bayId.value
}
getMainEquipment(params).then((res: any) => {
mainEquipment.value = res.data
});
//间隔下所属部件
const paramsbayId = {
bayId: bayId.value
}
getBayType(paramsbayId).then((res: any) => {
getacaTypeBayId.value = res.data
})
// 表计类型
getDeviceByType({ dictcode: 'MeterType' }).then((res: any) => {
Metertype.value = res.data
})
//点位分类
getDeviceByType({ dictcode: 'DeviceClass' }).then((res: any) => {
DeviceClass.value = res.data
})
//主设备类型
getDeviceByType({ dictcode: 'EquipmentType' }).then((res: any) => {
EquipmentType.value = res.data
})
}
//////
/////
const typeoptions: any = ref([])
function isykyttype(val: any) {
let name: any = ''
for (let i = 0; i < typeoptions.value.length; i++) {
if (typeoptions.value[i].itemcode === val) {
name = typeoptions.value[i].dictname
break
}
}
return name
}
const deviceIdList: any = ref()
function rowClick(row: any) {
deviceIdList.value = row
}
/////
//表格多选样式
const tableRowClassName = ({
row,
rowIndex,
}: {
row: any
rowIndex: number
}) => {
if (rowIndex % 2 === 0) {
return 'warning-row'
} else if (rowIndex % 2 === 1) {
return 'success-row'
}
return ''
}
function currency(list: any, itemcode: any) {
let dictname = ''
list.forEach((element: any) => {
if (element.itemcode == itemcode) {
dictname = element.dictname
}
})
return dictname
}
onMounted(() => {
gettreedata();
gettype();
});
</script>
<template>
<div class="faulttemplate-box">
<aside id="silderLeft">
<div class="left_title">
<div class="left_title_text">
<img src="@/assets/navigation/ty_bq.png" alt="">
<div>算法分类</div>
</div>
<div class="left_title_txt" @click="addAlgorithm()">
<img src="@/assets/navigation/u126.svg" alt="" title="新增算法">
</div>
</div>
<el-input v-model="algorithmClassName" clearable placeholder="请输入名称" @change="gettreedata"
style="width:100%;margin-top: 10px;" class="videomonitor-input">
<template #suffix>
<img src="@/assets/videoimg/u2937.png" style="cursor:pointer ;" @click="gettreedata">
</template>
</el-input>
<el-tree ref="treeRef" node-key="id" :data="treedata" :current-node-key="currentNodeKey"
:highlight-current="true" :props="defaultProps" v-loading="treeloading" @node-click="handleNodeClick"
style="height: calc(80vh); overflow: auto;margin-top: 10px;">
<template #default="{ node, data }">
<div class="custom_tree_node">
<span>{{ node.label }}</span>
<div class="tree_node_img">
<img src="@/assets/newimg/ht_xg.png" alt="" title="修改算法" @click="editAlgorithm(data)"
style="cursor: pointer;">
<img src="@/assets/newimg/ht_sc.png" alt="" title="删除算法" @click="delAlgorithm(data)"
style="cursor: pointer;">
</div>
</div>
</template>
</el-tree>
</aside>
<section class="silderRight">
<el-button class="searchButton" type="primary" @click="addMaster()"
style="margin-bottom: 15px;">选择主设备</el-button>
<el-table :data="tableData" style="width: 100%;margin-bottom: 20px;height: calc(77vh);
overflow: auto;" row-key="componentId" default-expand-all :v-loading="dialog"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="areaName" label="区域" align="center"></el-table-column>
<el-table-column prop="bayName" label="间隔" align="center"></el-table-column>
<el-table-column prop="mainDeviceName" label="主设备" align="center"></el-table-column>
<el-table-column prop="componentName" label="部件" align="center"></el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="60">
<template #default="scope">
<span
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
2025-05-16 16:18:11 +08:00
<img src="@/assets/newimg/ht_xg.png" alt="" title="关联" @click="editmain(scope.row)"
2025-05-15 15:37:03 +08:00
style="cursor: pointer;">
<img src="@/assets/newimg/ht_sc.png" alt="" title="删除" @click="delmain(scope.row)"
style="cursor: pointer;">
</span>
</template>
</el-table-column>
</el-table>
<Page :total="total" v-model:size="queryParams.size" v-model:current="queryParams.current"
@pagination="gatdata()">
</Page>
</section>
<!--弹框-->
2025-05-17 14:51:04 +08:00
<Eldialog v-if="algorithmible" :title="title" :zIndex="2000" :width="'1150px'" @before-close="handleClose">
2025-05-15 15:37:03 +08:00
<template v-slot:PopFrameContent>
<el-form ref="ruleFormRef" style="padding: 15px 0px 0px;" :model="algorithmform" :rules="moderules"
label-width="auto">
<div class="form_box">
<el-form-item label="算法编号" prop="algorithmClassCode" style="width: 49%;">
<el-input v-model="algorithmform.algorithmClassCode" />
</el-form-item>
<el-form-item label="算法名称" prop="algorithmClassName" style="width: 49%;">
<el-input v-model="algorithmform.algorithmClassName" />
</el-form-item>
</div>
<div class="form_box">
<el-form-item label="服务地址" prop="serviceAddress" style="width: 49%;">
<el-input v-model="algorithmform.serviceAddress" />
</el-form-item>
<el-form-item label="算法描述" style="width: 49%;">
<el-input v-model="algorithmform.description" />
</el-form-item>
</div>
</el-form>
<el-table :data="algorithmData" style="width: 100%;margin-bottom: 20px;height: calc(65vh);
overflow: auto;" default-expand-all :v-loading="algorithmDialog"
:row-class-name="tableRowClassName"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="paramName" label="参数名称" width="100" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-input v-if="scope.row.algor" v-model="scope.row.paramName" style="width: 100%"
clearable />
<div v-else style="line-height: 35px;">{{ scope.row.paramName }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="paramDesc" label="中文描述" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-input v-if="scope.row.algor" v-model="scope.row.paramDesc" style="width: 100%"
clearable />
<div v-else style="line-height: 35px;">{{ scope.row.paramDesc }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="paramType" label="类型" width="130" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-select v-if="scope.row.algor" v-model="scope.row.paramType" placeholder=" ">
<el-option v-for="item in paramType" :key="item.id" :label="item.dictname"
:value="item.itemcode" />
</el-select>
<div v-else style="line-height: 35px;">{{ currency(paramType, scope.row.paramType) }}
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="paramUnit" label="单位" width="100" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-input v-if="scope.row.algor" v-model="scope.row.paramUnit" style="width: 100%"
clearable />
<div v-else style="line-height: 35px;">{{ scope.row.paramUnit }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="paramRange" label="范围" width="100" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-input v-if="scope.row.algor" v-model="scope.row.paramRange" style="width: 100%"
clearable />
<div v-else style="line-height: 35px;">{{ scope.row.paramRange }}</div>
</div>
</template>
</el-table-column>
<el-table-column prop="defaultValues" label="默认值" width="100" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-input v-if="scope.row.algor" v-model="scope.row.defaultValues" style="width: 100%"
clearable />
<div v-else style="line-height: 35px;">{{ scope.row.defaultValues }}</div>
</div>
</template>
</el-table-column>
2025-05-16 16:18:11 +08:00
<el-table-column prop="paramFixed" label="是否固定参数" width="100" align="center">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<el-select v-if="scope.row.algor" v-model="scope.row.paramFixed" placeholder=" ">
<el-option v-for="item in dataarr" :key="item.itemcode" :label="item.dictname"
:value="item.itemcode">
</el-option>
</el-select>
<div v-else style="line-height: 35px;">{{ currency(dataarr, scope.row.paramFixed) }}
</div>
</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="60" align="center">
<template #header>
<div class="table_header">
<div>操作</div>
<img src="@/assets/navigation/u331.svg" alt="" title="增加算法" @click="addAlgorithmsan">
</div>
</template>
<template #default="scope">
<span
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
<img src="@/assets/newimg/ht_xg.png" alt="" title="修改" @click="saveAlgor(scope.row)"
style="cursor: pointer;">
<img src="@/assets/newimg/ht_sc.png" alt="" title="删除" @click="delAlgor(scope)"
style="cursor: pointer;">
</span>
</template>
</el-table-column>
</el-table>
<span class="dialog-footer"
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;">
<div class="details-button" @click="handleClose">取消</div>
<div class="details-button" @click="confirmClick(ruleFormRef)">确定</div>
</span>
</template>
</Eldialog>
2025-05-17 14:51:04 +08:00
<Eldialog v-if="masterble" :title="title" :zIndex="2000" :width="'1150px'" @before-close="handleClose1">
2025-05-15 15:37:03 +08:00
<template v-slot:PopFrameContent>
<div
style="width: 100%;display: flex;justify-content: space-between;align-items: center;margin-top: 10px;">
<div style="width: 100%;display: flex;align-items: center;">
<el-input v-model="masterform.componentName" placeholder="请输入部件名称" clearable
@change="getbybay()" style="width: 220px;margin-right: 10px;" />
<el-select v-model="masterform.areaId" placeholder="区域 " @change="getcomponent()"
style="width: 220px;margin-right: 10px;" @clear="cleraareaId()" clearable>
<el-option v-for="item in areaList" :key="item.areaId" :label="item.areaName"
:value="item.areaId" />
</el-select>
<el-select v-model="masterform.bayId" placeholder="间隔" :disabled="!masterform.areaId"
@change="getmainDevice()" style="width: 220px;margin-right: 10px;" clearable
@clear="cleramainId()">
<el-option v-for="item in bayList" :key="item.bayId" :label="item.bayName"
:value="item.bayId" />
</el-select>
<el-select v-model="masterform.mainDeviceId" placeholder="主设备" :disabled="!masterform.bayId"
@change="getbybay()" style="width: 220px;margin-right: 10px;" clearable>
<el-option v-for="item in mainList" :key="item.mainDeviceId" :label="item.mainDeviceName"
:value="item.mainDeviceId" />
</el-select>
<el-button class="searchButton" type="primary" @change="getbybay()">搜索</el-button>
</div>
<el-button class="searchButton" type="primary" @click="addmasteras()">确定</el-button>
</div>
<el-table ref="multipleTableRef" row-key="componentId" :data="masterdata" style="width: 100%;margin: 20px 0px;height: calc(65vh);
overflow: auto;" default-expand-all v-loading="masterLoading" :row-class-name="tableRowClassName"
@selection-change="handleSelectionChange"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="selection" width="50" align="center" />
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="areaName" label="区域" align="center"></el-table-column>
<el-table-column prop="bayName" label="间隔" align="center"></el-table-column>
<el-table-column prop="mainDeviceName" label="主设备" align="center"></el-table-column>
<el-table-column prop="componentName" label="部件" align="center"></el-table-column>
</el-table>
<Page :total="mastertotal" v-model:size="masterform.size" v-model:current="masterform.current"
@pagination="getbybay()"></Page>
</template>
</Eldialog>
<Eldialog v-if="mainble" :title="'关联参数'" :zIndex="2000" :width="'900px'" @before-close="handleClose2">
<template v-slot:PopFrameContent>
<el-table :data="meterdata" style="width: 100%;margin: 20px 0px;height: calc(65vh);
overflow: auto;" default-expand-all :v-loading="meterloding" :row-class-name="tableRowClassName"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="index" label="序号" width="50" align="center" />
<el-table-column prop="paramName" label="参数名称" width="160" align="center"></el-table-column>
<el-table-column prop="paramDesc" label="中文描述" align="center"></el-table-column>
<el-table-column prop="paramType" label="类型" width="130" align="center">
<template #default="scope">
<div style="height:35px;padding: 2px 0px;">
<div style="line-height: 35px;">{{ currency(paramType, scope.row.paramType) }}
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="paramRange" label="范围" width="70" align="center"></el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column prop="paramValue" label="参数值" align="center">
2025-05-15 15:37:03 +08:00
<template #default="scope">
2025-05-16 16:18:11 +08:00
<div style="padding: 2px 0px;">
<el-input v-if="scope.row.paramFixed == 1" v-model="scope.row.paramValue"
2025-05-15 15:37:03 +08:00
style="width: 100%" clearable />
2025-05-16 16:18:11 +08:00
<span v-else-if="scope.row.paramFixed == 0">{{ scope.row.paramValue }}</span>
2025-05-15 15:37:03 +08:00
</div>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="80" align="center">
<template #default="scope">
<span
style="display: flex;display: -webkit-flex;justify-content: space-around;-webkit-justify-content: space-around; ">
<!-- 0 1 -->
<el-button size="small" class="searchButton" type="primary"
2025-05-16 16:18:11 +08:00
:disabled="scope.row.paramFixed == 1"
2025-05-15 15:37:03 +08:00
@click="selentDevide(scope.row)">选择点位</el-button>
</span>
</template>
</el-table-column>
</el-table>
<span class="dialog-footer"
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;">
<div class="details-button" @click="handleClose2">取消</div>
<div class="details-button" @click="replace">确定</div>
</span>
</template>
</Eldialog>
<Eldialog v-if="selectble" :title="'选择点位'" :zIndex="2000" :width="'80%'" @before-close="selectbleClose">
<template v-slot:PopFrameContent>
<div class="device_box">
<div class="box_tabs">
<div :class="sourceType == 1 ? 'bianhua' : ''" @click="typeChange(1)">关联点位</div>
<div :class="sourceType == 2 ? 'bianhua' : ''" @click="typeChange(2)">关联信号</div>
</div>
<div class="faulttemplate-box1">
2025-05-17 14:51:04 +08:00
2025-05-15 15:37:03 +08:00
<div class="silderRight1">
<div
style="display: flex;display: -webkit-flex; justify-content: space-between; -webkit-justify-content: space-between; margin:15px 0px">
<div style="display: flex;display: -webkit-flex; align-items: center;">
<el-input v-if="sourceType == 1" v-model="paramstable.deviceName"
placeholder="请输入巡视点位名称" @clear="getdevicedata1()" @change="getdevicedata1()"
style="margin-right:15px ;width: 185px;" clearable />
<el-input v-if="sourceType == 2" v-model="paramstable.signalName"
placeholder="请输入信号名称" @clear="getdevicedata1()" @change="getdevicedata1()"
style="margin-right:15px ;width: 185px;" clearable />
<el-button class="searchButton" type="primary"
@click="getdevicedata1()">搜索</el-button>
<el-button class="searchButton" @click="resetting()">重置</el-button>
</div>
</div>
<el-table v-loading="devicedataloading" :data="devicedata" ref="tableref"
style="width: 100%;height: calc(50vh); overflow: auto;margin-bottom: 15px;"
row-key="deviceId" class="PatrolMonitoring" highlight-current-row default-expand-all
:row-class-name="tableRowClassName" @row-click="rowClick"
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
<el-table-column type="index" label="序号" width="50px" align="center" />
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="巡视点位编号" prop="deviceCode" align="center"
2025-05-15 15:37:03 +08:00
width="140"></el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="巡视点位名称" align="center"
2025-05-15 15:37:03 +08:00
prop="deviceName"></el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="所属主设备" prop="mainDeviceName"
align="center" width="120"></el-table-column>
<el-table-column v-if="sourceType == 1" label="主设备类型" prop="deviceType" align="center"
width="120">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<span>{{ currency(EquipmentType, scope.row.deviceType) }}</span>
</template>
</el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="所属部件" align="center" prop="componentName"
2025-05-15 15:37:03 +08:00
width="160"></el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="表计类型" align="center" prop="meterType"
width="100">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<span>{{ currency(Metertype, scope.row.meterType) }}</span>
</template>
</el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 1" label="点位分类" align="center" width="100">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<span>{{ currency(DeviceClass, scope.row.deviceClass) }}</span>
</template>
</el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 2" label="信号编号" align="center" prop="signalCode"
width="100" />
<el-table-column v-if="sourceType == 2" label="信号名称" align="center" prop="signalName"
2025-05-15 15:37:03 +08:00
min-width="140" />
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 2" label="信号单位" align="center" prop="signalUnit"
width="80" />
<el-table-column v-if="sourceType == 2" label="遥控遥调类型" align="center" prop="ykytType"
width="150">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<span>{{ isykyttype(scope.row.ykytType) }}</span>
</template>
</el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 2" label="是否告警信号" align="center" prop="signalType"
width="100">
2025-05-15 15:37:03 +08:00
<template #default="scope">
<span v-if="scope.row.signalType === '1'"></span>
<span v-else></span>
</template>
</el-table-column>
2025-05-17 14:51:04 +08:00
<el-table-column v-if="sourceType == 2" label="遥信地址(yx)" align="center" prop="yxAddr" />
<el-table-column v-if="sourceType == 2" label="遥测地址(yc)" align="center" prop="ycAddr" />
<el-table-column v-if="sourceType == 2" label="遥控地址(yk)" align="center" prop="ykAddr" />
<el-table-column v-if="sourceType == 2" label="遥调地址(yt)" align="center" prop="ytAddr" />
2025-05-15 15:37:03 +08:00
</el-table>
<Page :total="devicetaotal" v-model:size="paramstable.size"
v-model:current="paramstable.current" @pagination="getdevicedata1()"></Page>
</div>
</div>
<span class="dialog-footer"
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: center;-webkit-justify-content: center;">
<div class="details-button" @click="selectbleClose">取消</div>
<div class="details-button" @click="suredevice">确定</div>
</span>
</div>
</template>
</Eldialog>
</div>
</template>
<style scoped lang="scss">
.faulttemplate-box {
height: 100%;
display: flex;
display: -webkit-flex;
background-color: #f2f4f900;
padding: 15px 15px 0px 15px;
}
.faulttemplate-box1 {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f2f4f900;
padding: 15px;
.silderLeft1 {
width: 300px;
height: calc(65vh);
box-sizing: border-box;
background: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
padding: 10px;
.displayflex {
display: flex;
align-items: center;
.line {
width: 5px;
height: 14px;
background: #0099ff;
margin-right: 10px;
}
.title {
text-decoration: none !important;
font-family: "阿里妈妈数黑体 Bold";
font-weight: 700;
font-style: normal;
font-size: 16px !important;
color: rgb(255, 255, 255);
line-height: 12px;
}
}
}
.silderRight1 {
flex: 1;
width: 100%;
height: calc(65vh);
overflow: auto;
padding: 15px;
box-sizing: border-box;
margin-left: 15px;
background: url(@/assets/navigation/ty_1614x988.png);
background-size: 100% 100%;
}
}
#silderLeft {
width: 300px;
padding: 10px;
box-sizing: border-box;
border-radius: 3px;
position: relative;
background: url(@/assets/navigation/ty_260x988.png);
background-size: 100% 100%;
&:hover {
.moveBtn {
opacity: 1;
}
}
.left_title {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.left_title_text {
display: flex;
align-items: center;
color: #fff;
img {
margin-right: 10px;
font-size: 16px;
font-weight: bold;
}
}
.left_title_txt {
cursor: pointer;
}
}
.custom_tree_node {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.tree_node_img {
display: flex;
align-items: center;
img {
margin-left: 5px;
}
}
}
}
.silderRight {
flex: 1;
width: 100%;
height: calc(100vh - 160px);
overflow: auto;
background-color: rgba(255, 255, 255, 0);
border-radius: 3px;
padding: 15px;
padding-bottom: 0px;
box-sizing: border-box;
margin-left: 15px;
background: url(@/assets/newimg/cjrw_1890.png);
background-size: 100% 100%;
}
.form_box {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
.table_header {
display: flex;
align-items: center;
justify-content: center;
img {
margin-left: 3px;
cursor: pointer;
}
}
.device_box {
width: 100%;
.box_tabs {
width: 100%;
display: flex;
align-items: center;
border-bottom: 1px solid #0099ff;
border-radius: 5px 0px 0px 0px;
box-sizing: border-box;
margin-bottom: 20px;
div {
padding: 10px 20px 10px 24px;
box-sizing: border-box;
color: #fff;
font-size: 16px;
font-weight: bold;
cursor: pointer;
}
.bianhua {
padding: 10px 20px 10px 20px !important;
border-bottom: 4px solid #0099ff;
color: #0099ff;
}
}
}
.PatrolMonitoring {
:deep(.el-table__body tr.current-row td) {
border: 1px solid #009bff !important;
border-right: 0px solid transparent !important;
border-left: 0px solid transparent !important;
}
:deep(.current-row.el-table__row td) {
border-right: 1px solid #009bff;
}
:deep(.current-row.el-table__row td:first-child) {
border-left: 1px solid #009bff !important;
}
:deep(.current-row.el-table__row td:last-child) {
border-right: 1px solid #009bff !important;
}
:deep(.current-row.el-table__row :last-child td) {
border-bottom: 1px solid #009bff !important;
}
}
</style>