比对检测计划

This commit is contained in:
sjl
2025-07-21 13:47:56 +08:00
parent c8f3b4eddc
commit e29f25653e
31 changed files with 1174 additions and 673 deletions

View File

@@ -12,13 +12,12 @@
<el-input v-model='formContent.name' placeholder="请输入设备名称" :disabled="scene === '1' || formContent.importFlag == 1" maxlength="32" show-word-limit />
</el-form-item>
<el-form-item label='设备类型' prop='devType'>
<el-select v-model="formContent.devType" filterable clearable placeholder="请选择设备类型" @change="handleDevTypeChange" :disabled="formContent.importFlag == 1">
<el-select v-model="formContent.devType" filterable clearable placeholder="请选择设备类型" @change="handleDevTypeChange" :disabled="formContent.importFlag == 1">
<el-option
v-for="item in devTypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
@@ -39,7 +38,6 @@
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
@@ -51,12 +49,25 @@
:disabled="formContent.importFlag == 1"
/>
</el-form-item>
<el-form-item label="固件版本" prop="hardwareVersion" v-if="scene === '0'">
<el-input v-model="formContent.hardwareVersion" placeholder="请输入固件版本"/>
<el-select v-model="formContent.hardwareVersion" clearable placeholder="请选择固件版本" filterable allow-create>
<el-option
v-for="item in selectOptions['hardwareVersion']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="软件版本" prop="softwareVersion" v-if="scene === '0'">
<el-input v-model="formContent.softwareVersion" placeholder="请输入软件版本"/>
<el-select v-model="formContent.softwareVersion" clearable placeholder="请选择软件版本" filterable allow-create>
<el-option
v-for="item in selectOptions['softwareVersion']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label='定检日期' prop='inspectDate' v-if="MonIsShow">
<el-date-picker
@@ -135,14 +146,35 @@
/>
</el-select>
</el-form-item>
<el-form-item label='所属地市' prop='cityName' clearable placeholder="请输入所属地市" v-if="MonIsShow">
<el-input v-model='formContent.cityName' :disabled="formContent.importFlag == 1"/>
<el-form-item label="所属地市" prop="cityName" v-if="MonIsShow">
<el-select v-model="formContent.cityName" clearable placeholder="请选择所属地市" :disabled="formContent.importFlag == 1" filterable allow-create>
<el-option
v-for="item in selectOptions['cityName']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label='所属供电公司' prop='gdName' clearable placeholder="请输入所属供电公司" v-if="MonIsShow">
<el-input v-model='formContent.gdName' :disabled="formContent.importFlag == 1"/>
<el-form-item label="所属供电公司" prop="gdName" v-if="MonIsShow">
<el-select v-model="formContent.gdName" clearable placeholder="请选择所属供电公司" :disabled="formContent.importFlag == 1" filterable allow-create>
<el-option
v-for="item in selectOptions['gdName']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label='所属电站' prop='subName' clearable placeholder="请输入所属电站" v-if="MonIsShow">
<el-input v-model='formContent.subName' :disabled="formContent.importFlag == 1"/>
<el-form-item label="所属电站" prop="subName" v-if="MonIsShow">
<el-select v-model="formContent.subName" clearable placeholder="请选择所属电站" :disabled="formContent.importFlag == 1" filterable allow-create>
<el-option
v-for="item in selectOptions['subName']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-auth.device="'factorFlag'" label="是否支持系数校准" prop='factorFlag' v-if="scene === '1'">
<el-radio-group v-model="formContent.factorFlag">
@@ -155,7 +187,7 @@
</el-tab-pane>
<el-tab-pane label="监测点台账信息" v-if="MonIsShow">
<!-- 监测点台账信息 tab pane -->
<MonitorTable @getParameter="getParameter" :DevFormContent = "formContent" :tableHeight="monitorTableHeight"></MonitorTable>
<MonitorTable @getParameter="getParameter" :DevFormContent = "formContent" :tableHeight="monitorTableHeight" :selectOptions = "selectOptions"></MonitorTable>
</el-tab-pane>
</el-tabs>
<template #footer>
@@ -171,7 +203,7 @@
import {dialogBig} from '@/utils/elementBind'
import {type Device} from '@/api/device/interface/device'
import {ElMessage, type FormItemRule} from 'element-plus'
import {addPqDev, updatePqDev} from '@/api/device/device'
import {addPqDev, updatePqDev,getSelectOptions} from '@/api/device/device'
import {computed, reactive, type Ref, ref, watchEffect, nextTick} from 'vue'
import {useDictStore} from '@/stores/modules/dict'
import {CirclePlus, Delete, EditPen} from '@element-plus/icons-vue'
@@ -198,6 +230,11 @@ const dialogFormRef = ref()
const createDateTitle = ref('')
const activeTab = ref('0') // '0' 对应第一个 tab
const monitorTableHeight = ref(375) // 默认高度
const selectOptions = ref<Record<string, Device.SelectOption[]>>({})
const pqChannelArray = ref([
{
value: '1',
@@ -348,8 +385,8 @@ const rules = computed(() => {
}
if (scene.value !== '0') {
dynamicRules.name = [{required: true, message: '设备名称必填!', trigger: 'blur'}];
dynamicRules.hardwareVersion = [{required: true, message: '固件版本必', trigger: 'blur'}];
dynamicRules.softwareVersion = [{required: true, message: '软件版本必', trigger: 'blur'}];
dynamicRules.hardwareVersion = [{required: true, message: '固件版本必', trigger: 'change'}];
dynamicRules.softwareVersion = [{required: true, message: '软件版本必', trigger: 'change'}];
dynamicRules.manufacturer = [{required: true, message: '生产厂家必选!', trigger: 'change'}];
}
@@ -361,9 +398,9 @@ const rules = computed(() => {
if(mode.value === '比对式'){
dynamicRules.inspectDate = [{required: true, message: '定检日期必填!', trigger: 'blur'}];
dynamicRules.cityName = [{required: true, message: '所属地市必', trigger: 'blur'}];
dynamicRules.gdName = [{required: true, message: '所属供电公司必', trigger: 'blur'}];
dynamicRules.subName = [{required: true, message: '所属电站必', trigger: 'blur'}];
dynamicRules.cityName = [{required: true, message: '所属地市必', trigger: 'change'}];
dynamicRules.gdName = [{required: true, message: '所属供电公司必', trigger: 'change'}];
dynamicRules.subName = [{required: true, message: '所属电站必', trigger: 'change'}];
}
@@ -473,6 +510,21 @@ const open = async (sign: string, data: Device.ResPqDev, currentMode: string, cu
activeTab.value = '0' // 强制回到第一个 tab
if (currentMode === '比对式') {
const patternItem = dictStore.getDictData('Pattern').find(item => item.name === currentMode)
if (patternItem) {
const { data } = await getSelectOptions({ pattern: patternItem.id }) as { data: Record<string, any[]> }
// 遍历 data 的所有字段并映射为 { label, value }
for (const key in data) {
if (Array.isArray(data[key])) {
selectOptions.value[key] = data[key].map((value: string) => ({
label: value,
value: value
}))
}
}
}
createDateTitle.value = '投运日期'
DevIsShow.value = false
MonIsShow.value = true
@@ -555,9 +607,9 @@ const handleDevTypeChange = (value: string) => {
const handleInput = (value: string) => {
// 在这里处理选中事件的逻辑
if (scene.value === '1') {
//if (scene.value === '1') {
formContent.name = value
}
//}
}

View File

@@ -16,15 +16,36 @@
/>
</el-select>
</el-form-item>
<el-form-item label="所属母线" prop="busbar" placeholder="请输入所属母线" >
<el-input v-model="formContent.busbar" />
</el-form-item>
<el-form-item label="PT变比" prop="pt" placeholder="请输入PT变比" >
<el-input v-model="formContent.pt" />
</el-form-item>
<el-form-item label="CT变比" prop="ct" placeholder="请输入CT变比" >
<el-input v-model="formContent.ct" />
</el-form-item>
<el-form-item label="所属母线" prop="busbar">
<el-select v-model="formContent.busbar" clearable placeholder="请选择所属母线" filterable allow-create>
<el-option
v-for="item in selectOptions['busbar']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="PT变比" prop="pt">
<el-select v-model="formContent.pt" clearable placeholder="请选择PT变比" filterable allow-create>
<el-option
v-for="item in selectOptions['pt']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="CT变比" prop="ct">
<el-select v-model="formContent.ct" clearable placeholder="请选择CT变比" filterable allow-create>
<el-option
v-for="item in selectOptions['ct']"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label='接线方式' prop='connection' >
<el-select v-model="formContent.connection" clearable placeholder="请选择接线方式">
<el-option
@@ -36,7 +57,7 @@
</el-select>
</el-form-item>
<el-form-item label='统计间隔' prop='statInterval' >
<el-select v-model="formContent.statInterval" clearable placeholder="请选择统计间隔">
<el-select v-model="formContent.statInterval" clearable placeholder="请选择统计间隔" >
<el-option
v-for="item in dictStore.getDictData('Dev_Chns')"
:key="item.id"
@@ -76,6 +97,7 @@
const lineNum = ref<{ id: number; name: string }[]>([])
const originalNum = ref<number | null>(null) // 存储编辑前的 num 值
const monitorTable = ref<any[]>()
const selectOptions = ref<Record<string, Device.SelectOption[]>>({})
// 定义弹出组件元信息
const dialogFormRef = ref()
function useMetaInfo() {
@@ -131,15 +153,15 @@ const resetFormContent = () => {
name : [{ required: true, message: '监测点名称必填!', trigger: 'blur' }],
num:[ { required: true, message: '线路号必选', trigger: 'change' }],
pt: [
{ required: true, message: 'PT变比必', trigger: 'blur' },
{ pattern: /^[1-9]\d*:[1-9]\d*$/, message: 'PT变比格式应为 n:n 形式,例如 1:1', trigger: 'blur' }
{ required: true, message: 'PT变比必', trigger: 'blur' },
{ pattern: /^[1-9]\d*:[1-9]\d*$/, message: 'PT变比格式应为 n:n 形式,例如 1:1', trigger: 'change' }
],
ct: [
{ required: true, message: 'CT变比必', trigger: 'blur' },
{ pattern: /^[1-9]\d*:[1-9]\d*$/, message: 'CT变比格式应为 n:n 形式,例如 1:1', trigger: 'blur' }
{ required: true, message: 'CT变比必', trigger: 'blur' },
{ pattern: /^[1-9]\d*:[1-9]\d*$/, message: 'CT变比格式应为 n:n 形式,例如 1:1', trigger: 'change' }
],
connection: [{ required: true, message: '接线方式必选!', trigger: 'change' }],
busbar : [{ required: true, message: '所属母线必', trigger: 'blur' }],
busbar : [{ required: true, message: '所属母线必', trigger: 'change' }],
harmSysId : [{ required: true, message: '谐波系统检测点id必填', trigger: 'blur' }],
})
@@ -176,9 +198,10 @@ const resetFormContent = () => {
// 打开弹窗,可能是新增,也可能是编辑
const open = async (sign: string, data: Monitor.ResPqMon,device: Device.ResPqDev,table: any[]) => {
const open = async (sign: string, data: Monitor.ResPqMon,device: Device.ResPqDev,table: any[],options: any) => {
// 重置表单
//dialogFormRef.value?.resetFields()
selectOptions.value = options
titleType.value = sign
dialogVisible.value = true
monitorTable.value = table|| []
@@ -236,4 +259,8 @@ const resetFormContent = () => {
// 对外映射
defineExpose({ open })
</script>
</script>
<style scoped>
</style>

View File

@@ -34,7 +34,6 @@
import { ref, defineProps, reactive, watch } from 'vue';
import ProTable from '@/components/ProTable/index.vue'; // 假设 ProTable 是自定义组件
import { CirclePlus, Delete, EditPen, MessageBox } from '@element-plus/icons-vue';
import MonitorPopup from '@/views/machine/device/components/monitorPopup.vue'
import { ProTableInstance, type ColumnProps } from '@/components/ProTable/interface'
import { type Monitor } from '@/api/device/interface/monitor'
@@ -46,7 +45,8 @@
// 定义 props
const props = defineProps<{
DevFormContent:Device.ResPqDev,
tableHeight?: number // 接收外部传入的高度
tableHeight?: number, // 接收外部传入的高度
selectOptions: Record<string, Device.SelectOption[]>,
}>();
// ProTable 实例
@@ -139,7 +139,7 @@ const getParameter = (data: Monitor.ResPqMon) => {
return
}
title_Type.value = titleType
monitorPopup.value?.open(titleType, row,props.DevFormContent,tableData.value)
monitorPopup.value?.open(titleType, row,props.DevFormContent,tableData.value,props.selectOptions)
}