Files
admin-govern/src/views/govern/sensitiveLoadMange/component/bindForm.vue

242 lines
8.3 KiB
Vue
Raw Normal View History

2026-06-17 09:23:35 +08:00
<template>
<el-dialog class="cn-operate-dialog" draggable width="500px" v-model="dialogVisible" :title="title">
<el-form :model="form" class="form-one" label-width="auto" ref="formRef" :rules="rules">
<el-form-item label="治理点名称" prop="governName">
<el-input maxlength="32" show-word-limit clearable v-model.trim="form.governName"
placeholder="请输入治理点名称" />
</el-form-item>
<el-form-item label="治理类型" prop="governType">
<el-select v-model="form.governType" placeholder="请选择治理类型" style="width: 100%">
<el-option label="稳态" value="harmonic" />
<el-option label="暂态" value="transient" />
</el-select>
</el-form-item>
<el-form-item label="治理方法" prop="governMethod">
<el-input maxlength="32" show-word-limit clearable v-model="form.governMethod"
placeholder="例: 250A APF 或 100kVar SVG" />
</el-form-item>
<el-form-item label="治理前-监测点">
<el-tree-select v-model="form.governBefore" :data="lineTreeData" clearable :props="treeProps" filterable
:filter-node-method="filterNode" check-strictly default-expand-all placeholder="请选择监测点"
style="width: 100%">
<template #default="{ data }">
<span>{{ data.name }}{{ getBoundSuffix(data) }}</span>
</template>
</el-tree-select>
</el-form-item>
<el-form-item label="治理后-监测点">
<el-tree-select v-model="form.governAfter" :data="lineTreeData" clearable :props="treeProps" filterable
:filter-node-method="filterNode" check-strictly default-expand-all placeholder="请选择监测点"
style="width: 100%">
<template #default="{ data }">
<span>{{ data.name }}{{ getBoundSuffix(data) }}</span>
</template>
</el-tree-select>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input-number style="width: 100%" :min="0" v-model.number="form.sort" placeholder="请输入排序" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, inject, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import { isLineTreeLeaf } from '@/components/tree/govern/lineTreeUtils'
import { createTreeFilterNode } from '@/components/tree/govern/treeFilterUtils'
import { getLineTree } from '@/api/cs-device-boot/csLedger'
import { saveGovernPlan, updateGovernPlan } from '@/api/cs-device-boot/sensitiveLoadMange'
const props = defineProps<{
pid: string | number
}>()
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
const dialogVisible = ref(false)
const title = ref('新增')
const lineTreeData = ref<any[]>([])
const filterNode = createTreeFilterNode()
const treeProps = {
value: 'id',
label: 'name',
children: 'children',
disabled: 'disabled'
}
const form = reactive<any>({
id: null,
pid: null,
governName: '',
governMethod: '',
governType: '',
governBefore: '',
governAfter: '',
sort: 100
})
const isEmptyPoint = (val: any) => val === '' || val === null || val === undefined
const getGovernPointError = (): string => {
const beforeEmpty = isEmptyPoint(form.governBefore)
const afterEmpty = isEmptyPoint(form.governAfter)
if (beforeEmpty && afterEmpty) return ''
if (beforeEmpty) return '已选择治理后监测点,请同时选择治理前监测点'
if (afterEmpty) return '已选择治理前监测点,请同时选择治理后监测点'
if (form.governBefore === form.governAfter) return '治理前与治理后监测点不能相同'
return ''
}
const rules = {
governName: [{ required: true, message: '请输入治理点名称', trigger: 'blur' }],
governMethod: [{ required: true, message: '请输入治理方法', trigger: 'blur' }],
governType: [{ required: true, message: '请选择治理类型', trigger: 'change' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
}
const getBoundSuffix = (node: any) => {
if (node?.sensitiveUserName) {
return `(已绑_${node.sensitiveUserName}_${node.governPlanName || ''})`
}
return ''
}
const findTreeNodeById = (nodes: any[], id: any): any => {
for (const node of nodes) {
if (node.id === id) return node
if (node.children?.length) {
const found = findTreeNodeById(node.children, id)
if (found) return found
}
}
return null
}
/** 监测点是否已被其他方案绑定(编辑时排除当前方案) */
const isPointBoundConflict = (node: any) => {
if (!node?.sensitiveUserName) return false
if (form.id && (node.governPlanId === form.id || node.governPlanName === form.governName)) {
return false
}
return true
}
const getBoundPointError = (): string => {
const messages: string[] = []
if (!isEmptyPoint(form.governBefore)) {
const node = findTreeNodeById(lineTreeData.value, form.governBefore)
if (node && isPointBoundConflict(node)) {
messages.push(`治理前监测点「${node.name}${getBoundSuffix(node)}`)
}
}
if (!isEmptyPoint(form.governAfter)) {
const node = findTreeNodeById(lineTreeData.value, form.governAfter)
if (node && isPointBoundConflict(node)) {
messages.push(`治理后监测点「${node.name}${getBoundSuffix(node)}`)
}
}
return messages.length ? `${messages.join('')},请选择未绑定的监测点` : ''
}
const markNonLeafDisabled = (nodes: any[] = []) => {
nodes.forEach(node => {
node.disabled = !isLineTreeLeaf(node)
if (node.children?.length) {
markNonLeafDisabled(node.children)
}
})
}
const loadLineTree = () => {
getLineTree({ type: 'engineering' }).then(res => {
const data = JSON.parse(JSON.stringify(res.data || []))
markNonLeafDisabled(data)
lineTreeData.value = data
})
}
const resetForm = () => {
form.id = null
form.pid = props.pid
form.governName = ''
form.governMethod = ''
form.governType = ''
form.governBefore = ''
form.governAfter = ''
form.sort = 100
}
const open = (text: string, data?: anyObj) => {
loadLineTree()
formRef.value?.resetFields()
title.value = text
dialogVisible.value = true
resetForm()
if (data) {
form.id = data.id
form.governName = data.governName ?? ''
form.governMethod = data.governMethod ?? ''
form.governType = data.governType ?? ''
form.governBefore = data.governBeforeId ?? data.governBefore ?? ''
form.governAfter = data.governAfterId ?? data.governAfter ?? ''
form.sort = data.sort ?? 100
}
}
const submit = () => {
const pointError = getGovernPointError()
if (pointError) {
ElMessage.warning(pointError)
return
}
const boundError = getBoundPointError()
if (boundError) {
ElMessage.warning(boundError)
return
}
formRef.value.validate(async (valid: boolean) => {
if (!valid) return
const payload = {
id: form.id,
pid: props.pid,
governName: form.governName,
governMethod: form.governMethod,
governType: form.governType,
governBefore: form.governBefore,
governAfter: form.governAfter,
sort: form.sort
}
if (form.id) {
await updateGovernPlan(payload)
} else {
await saveGovernPlan(payload)
}
ElMessage.success('操作成功')
tableStore.index()
dialogVisible.value = false
})
}
onMounted(() => {
})
defineExpose({ open })
</script>