UPDATE: 添加被检设备编辑监测点PT和CT值按照指定规则进行校验

This commit is contained in:
贾同学
2025-10-20 14:04:20 +08:00
parent af84524512
commit f1b76376c6

View File

@@ -32,22 +32,14 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="PT变比" required> <el-form-item label="PT变比" required>
<div class="ratio-input-group"> <div class="ratio-input-group">
<el-form-item prop="ptPrimary" class="ratio-form-item"> <el-form-item prop="ptPrimary" class="ratio-form-item">
<el-input <el-input v-model="ptPrimary" placeholder="一次侧" @input="handlePtInput" />
v-model="ptPrimary"
placeholder="一次侧"
@input="handlePtInput"
/>
</el-form-item> </el-form-item>
<span class="colon">:</span> <span class="colon">:</span>
<el-form-item prop="ptSecondary" class="ratio-form-item"> <el-form-item prop="ptSecondary" class="ratio-form-item">
<el-input <el-input v-model="ptSecondary" placeholder="二次侧" @input="handlePtInput" />
v-model="ptSecondary"
placeholder="二次侧"
@input="handlePtInput"
/>
</el-form-item> </el-form-item>
</div> </div>
</el-form-item> </el-form-item>
@@ -56,19 +48,11 @@
<el-form-item label="CT变比" required> <el-form-item label="CT变比" required>
<div class="ratio-input-group"> <div class="ratio-input-group">
<el-form-item prop="ctPrimary" class="ratio-form-item"> <el-form-item prop="ctPrimary" class="ratio-form-item">
<el-input <el-input v-model="ctPrimary" placeholder="一次侧" @input="handleCtInput" />
v-model="ctPrimary"
placeholder="一次侧"
@input="handleCtInput"
/>
</el-form-item> </el-form-item>
<span class="colon">:</span> <span class="colon">:</span>
<el-form-item prop="ctSecondary" class="ratio-form-item"> <el-form-item prop="ctSecondary" class="ratio-form-item">
<el-input <el-input v-model="ctSecondary" placeholder="二次侧" @input="handleCtInput" />
v-model="ctSecondary"
placeholder="二次侧"
@input="handleCtInput"
/>
</el-form-item> </el-form-item>
</div> </div>
</el-form-item> </el-form-item>
@@ -103,6 +87,12 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<el-alert
show-icon
title="注意PT和CT变比请输入正常值不可以缩小相同的倍数"
type="warning"
:closable="false"
></el-alert>
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="close()">取消</el-button> <el-button @click="close()">取消</el-button>
@@ -114,12 +104,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ElMessage, type FormItemRule } from 'element-plus' import { ElMessage, type FormItemRule } from 'element-plus'
import { computed, ref, Ref, watch } from 'vue' import { computed, ref, type Ref } from 'vue'
import { type Monitor } from '@/api/device/interface/monitor' import { type Monitor } from '@/api/device/interface/monitor'
import { dialogMiddle } from '@/utils/elementBind' import { dialogMiddle } from '@/utils/elementBind'
import { useDictStore } from '@/stores/modules/dict' import { useDictStore } from '@/stores/modules/dict'
import { generateUUID } from '@/utils' import { generateUUID } from '@/utils'
import { Device } from '@/api/device/interface/device' import { type Device } from '@/api/device/interface/device'
const dictStore = useDictStore() const dictStore = useDictStore()
const lineNum = ref<{ id: number; name: string }[]>([]) const lineNum = ref<{ id: number; name: string }[]>([])
@@ -211,25 +201,24 @@ const handleCtInput = () => {
} }
} }
// 添加一个用于手动验证的引用 // 添加一个用于手动验证的引用
const extraFormRules = ref({ const extraFormRules = ref({
ptPrimary: [ ptPrimary: [
{ required: true, message: 'PT变比一次侧必填', trigger: 'blur' }, { required: true, message: 'PT变比一次侧必填', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' } { pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' }
], ],
ptSecondary: [ ptSecondary: [
{ required: true, message: 'PT变比二次侧必填', trigger: 'blur' }, { required: true, message: 'PT变比二次侧必填', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' } { pattern: /^\d+(\.\d+)?$/, message: '请输入数', trigger: 'blur' }
], ],
ctPrimary: [ ctPrimary: [
{ required: true, message: 'CT变比一次侧必填', trigger: 'blur' }, { required: true, message: 'CT变比一次侧必填', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' } { pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' }
], ],
ctSecondary: [ ctSecondary: [
{ required: true, message: 'CT变比二次侧必填', trigger: 'blur' }, { required: true, message: 'CT变比二次侧必填', trigger: 'blur' },
{ pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' } { pattern: /^[1-9]\d*$/, message: '请输入正整数', trigger: 'blur' }
] ]
}) })
// 保存数据 // 保存数据
@@ -238,43 +227,91 @@ const save = () => {
dialogFormRef.value?.validate(async (valid: boolean) => { dialogFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
// 手动验证额外的字段 // 手动验证额外的字段
let extraValid = true; let extraValid = true
const fieldsToValidate = ['ptPrimary', 'ptSecondary', 'ctPrimary', 'ctSecondary']; const fieldsToValidate = ['ptPrimary', 'ptSecondary', 'ctPrimary', 'ctSecondary']
for (const field of fieldsToValidate) { for (const field of fieldsToValidate) {
const value = eval(field); // 获取对应字段的值 const value = eval(field) // 获取对应字段的值
const rules = extraFormRules.value[field]; const rules = extraFormRules.value[field]
for (const rule of rules) { for (const rule of rules) {
if (rule.required && !value.value) { if (rule.required && !value.value) {
ElMessage.error({ message: rule.message as string }); ElMessage.error({ message: rule.message as string })
extraValid = false; extraValid = false
break; break
}
if (rule.pattern && value.value && !rule.pattern.test(value.value)) {
ElMessage.error({ message: rule.message as string });
extraValid = false;
break;
}
} }
if (!extraValid) break; if (rule.pattern && value.value && !rule.pattern.test(value.value)) {
ElMessage.error({ message: rule.message as string })
extraValid = false
break
} }
}
if (!extraValid) { if (!extraValid) break
return; }
}
if (!extraValid) {
return
}
// 校验名称是否重复 // 校验名称是否重复
const isNameDuplicate = monitorTable.value.some( const isNameDuplicate = monitorTable.value?.some(
item => item.name === formContent.value.name && item.id !== formContent.value.id item => item.name === formContent.value.name && item.id !== formContent.value.id
) )
if (isNameDuplicate) { if (isNameDuplicate) {
ElMessage.error({ message: '监测点名称已存在,请重新输入!' }) ElMessage.error({ message: '监测点名称已存在,请重新输入!' })
return return
} }
// 添加PT CT逻辑
// PT 逻辑
let ptPrimaryValue = ptPrimary.value
let ptSecondaryValue = ptSecondary.value
let ptErrorTips = false
let ctErrorTips = false
const ptFinalValue = ['100', '380']
const ptFinalChangeValue = ['57.74', '220']
const ctFinalValue = ['1', '5']
// 若值都为 1 则改值为 380
if (ptPrimaryValue === '1' && ptSecondaryValue === '1') {
formContent.value.pt = `${ptFinalValue[1]}:${ptFinalValue[1]}`
} else {
// 若PT分母值不为 ['100', '380']
if (!ptFinalValue.includes(ptSecondaryValue)) {
// 若PT分母值不为 ['57.74', '220'],提示
if (ptFinalChangeValue.includes(ptSecondaryValue)) {
// 判断值为 57.74,则 57.74 => 100
if (ptSecondaryValue === ptFinalChangeValue[0]) {
ptSecondaryValue = ptFinalValue[0]
}
// 判断值为 220,则 220 => 380
if (ptSecondaryValue === ptFinalChangeValue[1]) {
ptSecondaryValue = ptFinalValue[1]
}
} else {
ptErrorTips = true
}
}
}
// CT 逻辑, CT 分母是否为 ['1', '5']
if (!ctFinalValue.includes(ctSecondary.value)) {
ctErrorTips = true
}
if (ptErrorTips && ctErrorTips) {
ElMessage.error({ message: '请确认PT和CT无误' })
return
} else {
if (ptErrorTips) {
ElMessage.error({ message: '请确认PT无误' })
return
}
if (ctErrorTips) {
ElMessage.error({ message: '请确认CT无误' })
return
}
}
formContent.value.pt = `${ptPrimaryValue}:${ptSecondaryValue}`
if (titleType.value != 'edit') { if (titleType.value != 'edit') {
formContent.value.id = generateUUID().replaceAll('-', '') formContent.value.id = generateUUID().replaceAll('-', '')
} }
@@ -364,18 +401,22 @@ defineExpose({ open })
<style scoped> <style scoped>
.ratio-input-group { .ratio-input-group {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
} }
.ratio-form-item { .ratio-form-item {
flex: 1; flex: 1;
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.colon { .colon {
font-size: 16px; font-size: 16px;
font-weight: bold; font-weight: bold;
}
.el-alert {
--el-alert-padding: 0px 12px !important;
--el-alert-title-font-size: 12px !important;
} }
</style> </style>