SmartSubstationPlatform/riis-web/src/views/basedata/algorithm/index.vue
2025-05-17 14:51:04 +08:00

1123 lines
45 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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) {
if (row.algor) {
if (!(row.paramName && row.paramType && row.paramFixed)) {
ElMessage.warning('请填写参数名称,类型和是否固定参数')
return
} else {
row.algor = !row.algor
}
} else {
row.algor = !row.algor
}
}
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
})
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
}
}
addAlgorithmClassAndParams({ algorithmClass: algorithmform.value, algorithmParamsList: algorithmData.value }).then((res: any) => {
console.log(res)
if (res.code == 0) {
algorithmible.value = false
ElMessage.success('更改成功')
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) => {
item.componentId = componentId.value
})
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
componentId.value = row.componentId
getAlgorithmParamsList({ algorithmId: row.algorithmId, componentId: componentId.value }).then((res: any) => {
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('')
const componentId = ref('')
function selentDevide(row: any) {
cnshuId.value = row.paramId
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) => {
if (item.paramId == cnshuId.value) {
if (sourceType.value == 1) {
item.deviceId = deviceIdList.value.deviceId
item.deviceName = deviceIdList.value.deviceName
item.paramValue = deviceIdList.value.deviceName
} else if (sourceType.value == 2) {
item.deviceId = deviceIdList.value.signalId
item.deviceName = deviceIdList.value.signalName
item.paramValue = deviceIdList.value.signalName
}
item.sourceType = sourceType.value
}
})
console.log(meterdata.value)
}
function typeChange(val: any) {
sourceType.value = val
getdevicedata1()
}
//////
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() {
if (sourceType.value == 1) {
paramstable.value.bayId = bayId.value
paramstable.value.componentId = componentId.value
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) {
const foundObj = devicedata.value.find((item: any) => item.deviceId == deviceId.value);
tableref.value!.setCurrentRow(foundObj)
}
});
})
} else if (sourceType.value == 2) {
paramstable.value.mainComponentId = componentId.value
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) {
const foundObj = devicedata.value.find((item: any) => item.signalId == deviceId.value);
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; ">
<img src="@/assets/newimg/ht_xg.png" alt="" title="关联" @click="editmain(scope.row)"
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>
<!--弹框-->
<Eldialog v-if="algorithmible" :title="title" :zIndex="2000" :width="'1150px'" @before-close="handleClose">
<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>
<el-table-column prop="paramFixed" label="是否固定参数" width="100" align="center">
<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>
<Eldialog v-if="masterble" :title="title" :zIndex="2000" :width="'1150px'" @before-close="handleClose1">
<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>
<el-table-column prop="paramValue" label="参数值" align="center">
<template #default="scope">
<div style="padding: 2px 0px;">
<el-input v-if="scope.row.paramFixed == 1" v-model="scope.row.paramValue"
style="width: 100%" clearable />
<span v-else-if="scope.row.paramFixed == 0">{{ scope.row.paramValue }}</span>
</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"
:disabled="scope.row.paramFixed == 1"
@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">
<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" />
<el-table-column v-if="sourceType == 1" label="巡视点位编号" prop="deviceCode" align="center"
width="140"></el-table-column>
<el-table-column v-if="sourceType == 1" label="巡视点位名称" align="center"
prop="deviceName"></el-table-column>
<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">
<template #default="scope">
<span>{{ currency(EquipmentType, scope.row.deviceType) }}</span>
</template>
</el-table-column>
<el-table-column v-if="sourceType == 1" label="所属部件" align="center" prop="componentName"
width="160"></el-table-column>
<el-table-column v-if="sourceType == 1" label="表计类型" align="center" prop="meterType"
width="100">
<template #default="scope">
<span>{{ currency(Metertype, scope.row.meterType) }}</span>
</template>
</el-table-column>
<el-table-column v-if="sourceType == 1" label="点位分类" align="center" width="100">
<template #default="scope">
<span>{{ currency(DeviceClass, scope.row.deviceClass) }}</span>
</template>
</el-table-column>
<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"
min-width="140" />
<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">
<template #default="scope">
<span>{{ isykyttype(scope.row.ykytType) }}</span>
</template>
</el-table-column>
<el-table-column v-if="sourceType == 2" label="是否告警信号" align="center" prop="signalType"
width="100">
<template #default="scope">
<span v-if="scope.row.signalType === '1'">是</span>
<span v-else>否</span>
</template>
</el-table-column>
<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" />
</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>