联调二级评估

This commit is contained in:
wr
2025-08-26 11:07:11 +08:00
parent e277fd01a3
commit 1fb833c6ad
10 changed files with 1372 additions and 320 deletions

View File

@@ -1,5 +1,5 @@
import createAxios from '@/utils/request' import createAxios from '@/utils/request'
import { useAdminInfo } from '@/stores/adminInfo'
//获取变电站下面的母线列表 //获取变电站下面的母线列表
export function getBusBarSelect(params: any) { export function getBusBarSelect(params: any) {
return createAxios({ return createAxios({
@@ -104,7 +104,14 @@ export function transformerDelete(data: any) {
data data
}) })
} }
//获取冲击负荷字典
export function loadList(data: any) {
return createAxios({
url: '/advance-boot/assessDicShockLoad/list',
method: 'Post',
data
})
}
//新增冲击负荷字典 //新增冲击负荷字典
export function loadAdd(data: any) { export function loadAdd(data: any) {
return createAxios({ return createAxios({
@@ -137,6 +144,14 @@ export function userAdd(data: any) {
data data
}) })
} }
//修改评估用户
export function userEdit(data: any) {
return createAxios({
url: '/advance-boot/assessUser/edit',
method: 'Post',
data
})
}
//删除评估用户 //删除评估用户
export function batchDel(data: any) { export function batchDel(data: any) {
return createAxios({ return createAxios({
@@ -323,4 +338,46 @@ export function shockDelete(data: any) {
data data
}) })
} }
//获取评估树
export function getTree(data: any) {
const adminInfo = useAdminInfo()
return createAxios({
url: '/advance-boot/secondaryEvaluation/evaluationTree?deptId=' + adminInfo.deptIndex,
method: 'post',
data
})
}
//获取评估结果
export function getResult(data: any, assessId?: string | number) {
return createAxios({
url: `/advance-boot/secondaryEvaluation/assessResult${assessId ? `?assessId=${assessId}` : ''}`,
method: 'post',
data
});
}
//导出评估结果
export function exportResult(data: any, assessId?: string | number) {
return createAxios({
url: `/advance-boot/secondaryEvaluation/downAssessResult${assessId ? `?assessId=${assessId}` : ''}`,
method: 'get',
responseType: 'blob'
});
}
//评估
export const evaluation = (assessId: string, file: File) => {
const formData = new FormData()
formData.append('assessId', assessId)
formData.append('file', file)
return createAxios({
url: '/advance-boot/secondaryEvaluation/evaluation',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
})
}

View File

@@ -14,6 +14,10 @@ import { useDictData } from '@/stores/dictData'
import { getTerminalTreeForFive } from '@/api/device-boot/terminalTree' import { getTerminalTreeForFive } from '@/api/device-boot/terminalTree'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import { defineProps } from 'vue' import { defineProps } from 'vue'
import {
getTree
} from '@/api/advance-boot/assess'
defineOptions({ defineOptions({
name: 'pms/pointTree' name: 'pms/pointTree'
}) })
@@ -41,6 +45,26 @@ const formData = ref({
statisticalType: classificationData[0].id, statisticalType: classificationData[0].id,
scale: null scale: null
}) })
// 添加数据转换函数
const transformTreeData = (data: any[]) => {
if (!data || !Array.isArray(data)) return [];
return data.map(item => {
// 创建新对象,确保不修改原始数据
const newItem: any = {
name: item.treeName ,
id: item.treeId ,
children: []
};
// 递归处理子节点
if (item.children && Array.isArray(item.children)) {
newItem.children = transformTreeData(item.children);
}
return newItem;
});
};
const loadData = () => { const loadData = () => {
let obj = classificationData.find(function (i) { let obj = classificationData.find(function (i) {
return i.id === formData.value.statisticalType return i.id === formData.value.statisticalType
@@ -48,38 +72,24 @@ const loadData = () => {
let form = JSON.parse(JSON.stringify(formData.value)) let form = JSON.parse(JSON.stringify(formData.value))
form.statisticalType = classificationData.find((item: any) => item.id == form.statisticalType) form.statisticalType = classificationData.find((item: any) => item.id == form.statisticalType)
let nodeKey = '' let nodeKey = ''
getTerminalTreeForFive(form).then(res => { getTree({}).then(res => {
console.log(res) // 转换数据结构为指定格式
const transformedData = transformTreeData(res.data);
// 确保有数据再进行处理
if (transformedData && transformedData.length > 0 &&
transformedData[0].children && transformedData[0].children.length > 0) {
nodeKey = transformedData[0].children[0].id
emit('init', transformedData[0].children[0])
res.data = [ tree.value = transformedData
{
name: '张家口供电公司', if (nodeKey) {
level: -1, nextTick(() => {
id: 0, treeRef.value.treeRef.setCurrentKey(nodeKey)
children: [ })
{
name: '特种钢厂',
level: 1,
id: 2
},
{
name: '体育中心',
level: 1,
id: 3
}
]
} }
]
nodeKey = res.data[0].children[0]
emit('init', res.data[0].children[0])
tree.value = res.data
if (nodeKey) {
nextTick(() => {
treeRef.value.treeRef.setCurrentKey(nodeKey)
// treeRef.value.treeRef.setExpandedKeys(nodeKey)
})
} }
}) })
} }

View File

@@ -6,21 +6,46 @@
:default-expand-all="false" :default-expand-all="false"
@node-click="handleNodeClick" @node-click="handleNodeClick"
@init="handleNodeClick" @init="handleNodeClick"
ref="assessTreeRef"
:current-node-key="currentTreeKey"
></AssessTree> ></AssessTree>
</pane> </pane>
<pane style="background: #fff"> <pane style="background: #fff">
<div class="actionButtons mb10"> <div class="actionButtons mb10">
<el-button type="primary" icon="el-icon-Upload">导入数据背景</el-button> <el-button type="primary" icon="el-icon-Upload" @click="handleImportClick">导入数据背景</el-button>
<el-button type="primary" icon="el-icon-Memo" @click="assess">评估</el-button> <el-upload
<el-button type="primary" icon="el-icon-Download">导出报告</el-button> ref="uploadRef"
class="import-data-upload"
action="#"
:auto-upload="false"
:show-file-list="false"
:on-change="handleFileChange"
:accept="'.xlsx,.xls,.csv'"
style="display: none"
>
</el-upload>
<el-button type="primary" icon="el-icon-Memo" class="ml10" @click="assess">评估</el-button>
<el-button type="primary" icon="el-icon-Download" @click="exportReport">导出报告</el-button>
</div> </div>
<div :style="collapseHeight" style="overflow-y: auto"> <div :style="collapseHeight" style="overflow-y: auto">
<el-collapse v-model="collapseName" class="pl10 pr10"> <el-collapse v-model="collapseName" class="pl10 pr10">
<el-collapse-item title="基本信息" :name="1"> <el-collapse-item title="基本信息" :name="1">
<information /> <div class="loading-container">
<div v-if="infoLoading" class="loading-wrapper">
<el-icon class="is-loading"><Loading /></el-icon>
<span class="loading-text">加载中...</span>
</div>
<information v-show="!infoLoading" :node-id="currentNodeId" @data-loaded="() => infoLoading = false" />
</div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="评估结果信息" :name="2"> <el-collapse-item title="评估结果信息" :name="2">
<Outcome /> <div class="loading-container">
<div v-if="outcomeLoading" class="loading-wrapper">
<el-icon class="is-loading"><Loading /></el-icon>
<span class="loading-text">加载中...</span>
</div>
<Outcome v-show="!outcomeLoading" :node-id="currentNodeId" @data-status="handleDataStatus" @data-loaded="() => outcomeLoading = false" />
</div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</div> </div>
@@ -30,7 +55,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, provide } from 'vue' import { ElMessage, ElLoading } from 'element-plus'
import { onMounted, ref, provide ,nextTick } from 'vue'
import 'splitpanes/dist/splitpanes.css' import 'splitpanes/dist/splitpanes.css'
import { Splitpanes, Pane } from 'splitpanes' import { Splitpanes, Pane } from 'splitpanes'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
@@ -39,6 +65,8 @@ import TableHeader from '@/components/table/header/index.vue'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import information from './information.vue' import information from './information.vue'
import Outcome from './outcome.vue' import Outcome from './outcome.vue'
import {exportResult,evaluation} from '@/api/advance-boot/assess'
import { Loading } from '@element-plus/icons-vue'
defineOptions({ defineOptions({
// name: 'harmonic-boot/report/word' // name: 'harmonic-boot/report/word'
@@ -48,6 +76,10 @@ const height = mainHeight(80)
const collapseHeight = mainHeight(125) const collapseHeight = mainHeight(125)
const size = ref(0) const size = ref(0)
const dotList: any = ref({}) const dotList: any = ref({})
const infoLoading = ref(false)
const outcomeLoading = ref(false)
// 添加当前节点 ID 的响应式变量
const currentNodeId = ref<string | number | null>(null)
const tableStore = new TableStore({ const tableStore = new TableStore({
url: '', url: '',
@@ -57,14 +89,131 @@ const tableStore = new TableStore({
loadCallback: () => {} loadCallback: () => {}
}) })
provide('tableStore', tableStore) provide('tableStore', tableStore)
// 评估
const assess = () => { //有无评估结果
collapseName.value = [2] const result = ref(true)
const handleDataStatus = (hasData: boolean) => {
if (!hasData) {
result.value = false
} else {
result.value = true
}
} }
const exportReport = () => {
if (!result.value){
ElMessage.warning('请先评估!')
return
}
// 显示导出中提示
const loading = ElLoading.service({
lock: true,
text: '导出中...',
background: 'rgba(0, 0, 0, 0.7)'
})
exportResult({}, currentNodeId.value).then((res: any) => {
let blob = new Blob([res], { // 注意使用 res.data 而不是 res
type: 'application/vnd.ms-excel'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = '评估结果.xls' // 建议添加文件扩展名
document.body.appendChild(link)
link.click()
link.remove()
window.URL.revokeObjectURL(url)
// 关闭加载提示并显示成功消息
loading.close()
ElMessage.success('导出成功!')
}).catch(error => {
// 处理导出失败情况
loading.close()
ElMessage.error('导出失败,请重试!')
})
}
// 添加文件上传相关引用
const uploadRef = ref()
const selectedFile = ref<File | null>(null)
const handleImportClick = () => {
// 手动触发文件选择
const inputElement = uploadRef.value.$el.querySelector('input[type="file"]')
if (inputElement) {
inputElement.click()
}
}
const handleFileChange = (file: any) => {
const selectedFileObj = file.raw
if (selectedFileObj) {
selectedFile.value = selectedFileObj
ElMessage.success(`已选择文件: ${selectedFileObj.name}`)
}
}
// 评估功能
const assess = async () => {
// 检查是否已选择文件
if (!selectedFile.value) {
ElMessage.warning('请先导入数据背景文件!')
return
}
// 检查是否已选择节点
if (!currentNodeId.value) {
ElMessage.warning('请选择评估节点!')
return
}
try {
ElMessage.info('评估中...')
// 调用后端评估接口
const formData = new FormData()
formData.append('assessId', currentNodeId.value.toString())
formData.append('file', selectedFile.value)
// 假设你有一个调用评估接口的方法,如 evaluation
// 你需要在 API 文件中实现这个方法
const response = await evaluation(currentNodeId.value.toString(), selectedFile.value)
//loading.close()
selectedFile.value = null
if (response.data) {
ElMessage.success('评估成功!')
// 展开评估结果
collapseName.value = [2]
// 更新评估状态
result.value = true
// ✅ 强制更新 nodeId触发子组件的 watch
// 可以通过修改 currentNodeId 的值,或者重新赋值来触发 watch
const tempId = currentNodeId.value
currentNodeId.value = null // 先置空
setTimeout(() => {
currentNodeId.value = tempId // 再恢复,触发 watch
}, 0)
} else {
ElMessage.error('评估失败!')
result.value = false
}
} catch (error) {
ElMessage.error('评估失败,请重试!')
result.value = false
}
}
onMounted(() => { onMounted(() => {
const dom = document.getElementById('navigation-splitpanes') const dom = document.getElementById('navigation-splitpanes')
setTimeout(() => { setTimeout(() => {
if (dom) { if (dom) {
size.value = Math.round((180 / dom.offsetHeight) * 100) size.value = Math.round((180 / dom.offsetHeight) * 100)
@@ -72,8 +221,35 @@ onMounted(() => {
}, 100) }, 100)
}) })
// 添加树组件的引用
const assessTreeRef = ref<any>(null)
// 控制树组件当前高亮的节点key
const currentTreeKey = ref<string | number | null>(null)
// 保存上一次真正有效的节点key子节点
const lastValidNodeKey = ref<string | number | null>(null)
const handleNodeClick = (data: any, node: any) => { const handleNodeClick = (data: any, node: any) => {
dotList.value = data // 阻止点击父节点的逻辑处理
if (!data ||
(node && !node.isLeaf) ||
(data.children && data.children.length > 0) ||
(node && node.childNodes && node.childNodes.length > 0)) {
// 点击父节点时,保持树的高亮状态为上一次有效的子节点
currentTreeKey.value = lastValidNodeKey.value
return
}
// 点击的是子节点,更新高亮状态
lastValidNodeKey.value = data?.id || null
currentTreeKey.value = lastValidNodeKey.value
dotList.value = data
currentNodeId.value = data?.id || null
// ✅ 开启两个 loading
infoLoading.value = true
outcomeLoading.value = true
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -96,4 +272,39 @@ const handleNodeClick = (data: any, node: any) => {
display: flex; display: flex;
justify-content: end; justify-content: end;
} }
.loading-container {
position: relative;
min-height: 100px; /* 防止空白时高度塌陷 */
}
.loading-wrapper {
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.loading-text {
margin-left: 8px;
color: #606266;
}
.is-loading {
animation: rotating 2s linear infinite;
}
@keyframes rotating {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.ml10 {
margin-left: 10px;
}
</style> </style>

View File

@@ -4,34 +4,32 @@
<el-collapse v-model="activeNames"> <el-collapse v-model="activeNames">
<el-collapse-item title="用户参数维护" :name="1"> <el-collapse-item title="用户参数维护" :name="1">
<el-descriptions :column="4" border> <el-descriptions :column="4" border>
<el-descriptions-item label="所在地市">张家口</el-descriptions-item> <el-descriptions-item label="所在地市">{{ form.deptName }}</el-descriptions-item>
<el-descriptions-item label="用户名称">名称1</el-descriptions-item> <el-descriptions-item label="用户名称">{{ form.assessName }}</el-descriptions-item>
<el-descriptions-item label="用户协议容量(MVA)">100</el-descriptions-item> <el-descriptions-item label="用户协议容量(MVA)">{{ form.agreedCapacity }}</el-descriptions-item>
<el-descriptions-item label="是否包含电容器"></el-descriptions-item> <el-descriptions-item label="是否包含电容器">{{ form.withCapacitor }}</el-descriptions-item>
<el-descriptions-item label="风电场装机容量"></el-descriptions-item> <el-descriptions-item :label=windfarmCapacityLabel>{{ form.windfarmCapacity }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="系统参数维护" :name="2"> <el-collapse-item title="系统参数维护" :name="2">
<el-descriptions :column="4" border> <el-descriptions :column="4" border>
<el-descriptions-item label="接入变电站">变电站1</el-descriptions-item> <el-descriptions-item label="接入变电站">{{ form.powerstationName }}</el-descriptions-item>
<el-descriptions-item label="变电站电压等级">220V</el-descriptions-item> <el-descriptions-item label="变电站电压等级">{{ form.powerstationScale }}</el-descriptions-item>
<el-descriptions-item label="接入母线">母线1</el-descriptions-item> <el-descriptions-item label="接入母线">{{ form.busName }}</el-descriptions-item>
<el-descriptions-item label="母线电压等级">220V</el-descriptions-item> <el-descriptions-item label="母线电压等级">{{ form.busScale }}</el-descriptions-item>
<el-descriptions-item label="供电设备容量(MVA)">100</el-descriptions-item> <el-descriptions-item label="供电设备容量(MVA)">{{ form.powersupplyCapacity }}</el-descriptions-item>
<el-descriptions-item label="最小短路容量(MVA)">10</el-descriptions-item> <el-descriptions-item label="最小短路容量(MVA)">{{ form.minshortcircuitCapacity }}</el-descriptions-item>
<el-descriptions-item label="PCC点名称">名称1</el-descriptions-item> <el-descriptions-item label="PCC点名称">{{ form.lineName }}</el-descriptions-item>
<el-descriptions-item label="PCC点电网电阻">20</el-descriptions-item> <el-descriptions-item label="PCC点电网电阻">{{ form.lineGridreactance }}</el-descriptions-item>
<el-descriptions-item label="长度">30</el-descriptions-item> <el-descriptions-item label="长度">{{ form.lineLen }}</el-descriptions-item>
<el-descriptions-item label="回路数">2</el-descriptions-item> <el-descriptions-item label="回路数">{{ form.lineNum }}</el-descriptions-item>
<el-descriptions-item label="导线类型"></el-descriptions-item> <el-descriptions-item label="导线类型">{{ form.linetypeId }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-collapse-item> </el-collapse-item>
<el-collapse-item :title="item.name" v-for="(item, index) in column" :name="index + 3"> <el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3">
<div style="height: 200px"> <div style="height: 200px">
<vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute"> <vxe-table height="auto" :data="form[item.key]" v-bind="defaultAttribute" v-loading="item.loading">
<vxe-column type="seq" title="序号" width="80px"></vxe-column> <vxe-column type="seq" title="序号" width="80px"></vxe-column>
<vxe-column <vxe-column
v-for="(k, index) in item.child" v-for="(k, index) in item.child"
:key="index" :key="index"
@@ -48,205 +46,390 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { userGetInfo ,
cableList,
assessTransformerParamList,
transformerList,
capacitorList,
windPowerList,
loadParamList,
loadList,
shockList,
characteristicList
} from '@/api/advance-boot/assess'
import { useDictData } from '@/stores/dictData'
const dictData = useDictData()
// 定义 props
const props = defineProps({
nodeId: {
type: [String, Number],
default: null
}
})
const activeNames = ref([1, 2, 3, 4, 5, 6, 7]) const activeNames = ref([1, 2, 3, 4, 5, 6, 7])
const form: any = ref({ const form: any = ref({
city: '', deptName: '', // 所在地市
windFarms: '', assessName: '', // 用户名称
transformer: [ agreedCapacity: '', // 用户协议容量(MVA)
{ withCapacitor: '', // 是否包含电容器
name: '变压器1', windFarms: '', // 风电场装机容量
name1: '变压器型号1', powerstationName: '', // 接入变电站
name2: '100' powerstationScale: '', // 变电站电压等级
}, busName: '', // 接入母线
{ busScale: '', // 母线电压等级
name: '变压器2', powersupplyCapacity: '', // 供电设备容量(MVA)
name1: '变压器型号2', minshortcircuitCapacity: '', // 最小短路容量(MVA)
name2: '100' lineName: '', // PCC点名称
} lineGridreactance: '', // PCC点电网电阻
], //变压器 lineLen: '', // 长度
capacitor: [ lineNum: '', // 回路数
{ linetypeId: '', // 导线类型
name: '电容器1', transformer: [], //变压器
name1: '20', capacitor: [], //电容器
name2: '100', windPower: [], //风电
name3: '72.73',
name4: '400V'
},
{
name: '电容器2',
name1: '20',
name2: '100',
name3: '72.73',
name4: '400V'
}
], //电容器
windPower: [
{
name: '风机1',
name1: '0.1',
name2: '100'
},
{
name: '风机2',
name1: '0.1',
name2: '100'
}
], //风电
load: [], //用户负荷 load: [], //用户负荷
impact: [] //冲击性负荷 impact: [] //冲击性负荷
}) })
const column: any = ref([ const column: any = ref([
{ {
loading: false,
name: '变压器参数维护', name: '变压器参数维护',
key: 'transformer', key: 'transformer',
child: [ child: [
{ {
title: '用户变压器名称', title: '用户变压器名称',
field: 'name' field: 'transName'
}, },
{ {
title: '变压器型号', title: '变压器型号',
field: 'name1' field: 'transtypeId'
}, },
{ {
title: '变压器台数', title: '变压器台数',
field: 'name2' field: 'transNum'
} }
] ]
}, },
{ {
loading: false,
name: '电容器组参数维护', name: '电容器组参数维护',
key: 'capacitor', key: 'capacitor',
child: [ child: [
{ {
title: '用户电容器名称', title: '用户电容器名称',
field: 'name' field: 'capacitorName'
}, },
{ {
title: '电容器组数量', title: '电容器组数量',
field: 'name1' field: 'capacitorNum'
}, },
{ {
title: '单组容量(kVar)', title: '单组容量(kVar)',
field: 'name2' field: 'capacitorCapacity'
}, },
{ {
title: '电抗率(%)', title: '电抗率(%)',
field: 'name3' field: 'capacitorReactance'
}, },
{ {
title: '电压等级', title: '电压等级',
field: 'name4' field: 'capacitorScale'
} }
] ]
}, },
{ {
loading: false,
name: '风电参数', name: '风电参数',
key: 'windPower', key: 'windPower',
child: [ child: [
{ {
title: '风机名称', title: '风机名称',
field: 'name' field: 'windgeneratorName'
}, },
{ {
title: '风机闪变系数', title: '风机闪变系数',
field: 'name1' field: 'flickerCoeff'
}, },
{ {
title: '风机额定视在功率', title: '风机额定视在功率',
field: 'name2' field: 's'
} }
] ]
}, },
{ {
loading: false,
name: '用户负荷', name: '用户负荷',
key: 'load', key: 'load',
child: [ child: [
{ {
title: '配电窒名称', title: '配电窒名称',
field: 'name' field: 'loadName'
}, },
{ {
title: '进线电压', title: '进线电压',
field: 'name1' field: 'linevoltageScale'
}, },
{ {
title: '配变容量(kVA)', title: '配变容量(kVA)',
field: 'name2' field: 'transhighCapacity'
}, },
{ {
title: '配电变压器阻抗(%)', title: '配电变压器阻抗(%)',
field: 'name3' field: 'transImpedance'
}, },
{ {
title: '谐波源特性', title: '谐波源特性',
field: 'name4' field: 'harmId'
}, },
{ {
title: '配变低压侧电压', title: '配变低压侧电压',
field: 'name5' field: 'translowScale'
}, },
{ {
title: '非线性负荷功率(kW)', title: '非线性负荷功率(kW)',
field: 'name6' field: 'nonlinearloadPower'
}, },
{ {
title: '功率因素', title: '功率因素',
field: 'name7' field: 'powerFactor'
} }
] ]
}, },
{ {
loading: false,
name: '冲击性负荷', name: '冲击性负荷',
key: 'impact', key: 'impact',
child: [ child: [
{ {
title: '冲击负荷类型', title: '冲击负荷类型',
field: 'name' field: 'inpactloadtypeId'
},
{
title: '冲击负荷功率(MVA)',
field: 'name1'
}, },
{ {
title: '数量', title: '数量',
field: 'name2' field: 'inpactloadNum'
},
{
title: '启动方式',
field: 'name3'
}, },
{ {
title: '启动容量倍数', title: '启动容量倍数',
field: 'name4' field: 'inpactloadPower'
}, },
{ {
title: '冲击负荷高压侧电压', title: '高压侧电压',
field: 'name5' field: 'inpactloadhighScale'
}, },
{ {
title: '有无隔离变', title: '有无隔离变',
field: 'name6' field: 'isIsolationtrans'
}, },
{ {
title: '隔离变阻抗(%)', title: '隔离变阻抗(%)',
field: 'name7' field: 'isolationtransImpedance'
}, },
{ {
title: '低压侧电压', title: '低压侧电压',
field: 'name8' field: 'inpactloadlowScale'
}, },
{ {
title: '负荷频度选择', title: '负荷频度选择',
field: 'name9' field: 'inpactloadFreq'
}, },
{ {
title: '闪变叠加系数', title: '闪变叠加系数',
field: 'name10' field: 'flickerCoeff'
} }
] ]
} }
]) ])
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
// 创建计算属性来动态生成标签文本
const windfarmCapacityLabel = computed(() => {
if (form.value.isWindfarm === '01') {
return '风电场装机容量'
} else {
return '用户有功功率'
}
})
const filteredColumn = computed(() => {
// const windfarmValue = form.value.isWindfarm;
// if (windfarmValue === '01') {
// // 如果是风电场,显示除冲击负荷外的所有项
// return column.value.filter((item: any) => item.key !== 'impact')
// } else {
// // 如果不是风电场,显示除风电参数外的所有项
// return column.value.filter((item: any) => item.key !== 'windPower')
// }
})
const emit = defineEmits(['data-loaded'])
// 监听 nodeId 变化并执行相应操作
watch(() => props.nodeId, async (newId) => {
// 先清空表单数据
form.value = {
deptName: '', // 所在地市
assessName: '', // 用户名称
agreedCapacity: '', // 用户协议容量(MVA)
withCapacitor: '', // 是否包含电容器
windFarms: '', // 风电场装机容量
powerstationName: '', // 接入变电站
powerstationScale: '', // 变电站电压等级
busName: '', // 接入母线
busScale: '', // 母线电压等级
powersupplyCapacity: '', // 供电设备容量(MVA)
minshortcircuitCapacity: '', // 最小短路容量(MVA)
lineName: '', // PCC点名称
lineGridreactance: '', // PCC点电网电阻
lineLen: '', // 长度
lineNum: '', // 回路数
linetypeId: '', // 导线类型
transformer: [], // 变压器
capacitor: [], // 电容器
windPower: [], // 风电
load: [], // 用户负荷
impact: [] // 冲击性负荷
};
if (newId) {
userGetInfo({ assessId: newId }).then(async (res: any) => {
form.value = res.data
// 转换 withCapacitor 字段
if (form.value.withCapacitor === '00') {
form.value.withCapacitor = '否'
} else if (form.value.withCapacitor === '01') {
form.value.withCapacitor = '是'
}
//变电站电压等级
const voltageLevel = voltageleveloption.find(item => item.id === form.value.powerstationScale);
form.value.powerstationScale= voltageLevel?.name
//母线电压等级
const busScale = voltageleveloption.find(item => item.id === form.value.busScale);
form.value.busScale = busScale?.name
//导线类型
await cableList({}).then(res => {
form.value.linetypeId = res.data.find((item: any) => item.linetypeId === form.value.linetypeId)?.linetypeName
})
// 变压器参数维护
await assessTransformerParamList({ assessId: props.nodeId}).then(res => {
form.value.transformer = res.data
// 获取变压器类型字典数据
transformerList({}).then((res: any) => {
// 使用 map 方法创建新数组
form.value.transformer = form.value.transformer.map((transformerItem: any) => {
const found = res.data.find((item: any) => item.transtypeId == transformerItem.transtypeId)
if (found) {
return {
...transformerItem,
transtypeId: found.transtypeName
}
}
return transformerItem
})
})
})
// 电容器参数维护
await capacitorList({ assessId: props.nodeId }).then(res => {
form.value.capacitor = res.data
form.value.capacitor = form.value.capacitor.map((capacitorItem: any) => {
const voltageLevel = voltageleveloption.find(item => item.id === capacitorItem.capacitorScale);
if (voltageLevel) {
return {
...capacitorItem,
capacitorScale: voltageLevel.name
}
}
return capacitorItem
})
})
// 风电参数
await windPowerList({ assessId: props.nodeId }).then(res => {
form.value.windPower = res.data
})
// 用户负荷参数
await loadParamList({ assessId: props.nodeId }).then(res => {
form.value.load = res.data
// 谐波源特特性
characteristicList({}).then((res: any) => {
form.value.load = form.value.load.map((transformerItem: any) => {
const found = res.data.find((item: any) => item.harmId == transformerItem.harmId)
if (found) {
return {
...transformerItem,
harmId: found.harmName
}
}
return transformerItem
})
})
form.value.load = form.value.load.map((loadItem: any) => {
// 处理进线电压
const lineVoltage = voltageleveloption.find(item => item.id === loadItem.linevoltageScale);
// 处理配变低压侧电压
const transLowVoltage = voltageleveloption.find(item => item.id === loadItem.translowScale)
return {
...loadItem,
linevoltageScale: lineVoltage?.name || loadItem.linevoltageScale,
translowScale: transLowVoltage?.name || loadItem.translowScale
}
})
})
// 冲击性负荷
const startupOptions = ref<Array<{ label: string; value: string }>>([])
await shockList({ assessId: props.nodeId }).then(async (res: { data: never[] }) => {
form.value.impact = res.data
// 冲击负荷类型
const loadRes = await loadList({})
// 处理冲击负荷类型名称
form.value.impact = form.value.impact.map((impactItem: any) => {
const found = loadRes.data.find((item: any) => item.inpactloadtypeId == impactItem.inpactloadtypeId)
if (found) {
return {
...impactItem,
inpactloadtypeId: found.inpactloadtypeName
}
}
return impactItem
})
form.value.impact = form.value.impact.map((loadItem: any) => {
// 处理高压侧电压
const HeightVoltage = voltageleveloption.find(item => item.id === loadItem.inpactloadhighScale);
// 处理低压侧电压
const LowVoltage = voltageleveloption.find(item => item.id === loadItem.inpactloadlowScale)
return {
...loadItem,
inpactloadhighScale: HeightVoltage?.name || loadItem.inpactloadhighScale,
inpactloadlowScale: LowVoltage?.name || loadItem.inpactloadlowScale
}
})
})
}
)
}
// 等待 DOM 更新后延迟触发
await nextTick()
setTimeout(() => {
emit('data-loaded')
}, 1000) // 3秒延迟
}, { immediate: true })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.el-collapse-item__header) { :deep(.el-collapse-item__header) {

View File

@@ -9,16 +9,16 @@
height="110px" height="110px"
v-bind="defaultAttribute" v-bind="defaultAttribute"
:cell-class-name="getCellClassName" :cell-class-name="getCellClassName"
style="width: 60%" style="width: 50%"
> >
<vxe-column title="估算方式" field="name" /> <vxe-column title="冲击负荷数量" field="inPactLoadNum" />
<vxe-column title="冲击负荷数量" field="name1" /> <vxe-column title="电压波动" field="data" />
<vxe-column title="电压波动" field="name2" /> <vxe-column title="国标限值" field="limitData" />
<vxe-column title="国标限值" field="name3" />
<vxe-column title="判断"> <vxe-column title="判断">
<template #default="{ row }"> <template #default="{ row }">
<el-tag v-if="row.name2 > row.name3" type="warning">不合格</el-tag> <span v-if="!row.data || row.data === ''"></span>
<el-tag v-else type="success">合格</el-tag> <el-tag v-else-if="row.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
@@ -27,17 +27,16 @@
height="110px" height="110px"
v-bind="defaultAttribute" v-bind="defaultAttribute"
:cell-class-name="getCellClassName" :cell-class-name="getCellClassName"
style="width: 40%" style="width: 50%"
> >
<vxe-column title="冲击负荷数量" field="name1" /> <vxe-column title="冲击负荷数量" field="inPactLoadNum" />
<vxe-column title="闪变" field="name2" /> <vxe-column title="闪变" field="data" />
<vxe-column title="国标限值" field="name3" /> <vxe-column title="国标限值" field="limitData" />
<vxe-column title="判断"> <vxe-column title="判断">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.name2 == null"></span> <span v-if="!row.limitData || row.limitData === ''"></span>
<el-tag v-else-if="row.name2 > row.name3" type="warning">合格</el-tag> <el-tag v-else-if="row.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
<el-tag v-else type="success">合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
@@ -49,6 +48,7 @@
height="330px" height="330px"
:merge-cells="mergeCells" :merge-cells="mergeCells"
v-bind="defaultAttribute" v-bind="defaultAttribute"
:cell-class-name="getCellClassName2"
style="width: 100%" style="width: 100%"
> >
<vxe-column field="name" width="80px"> <vxe-column field="name" width="80px">
@@ -60,24 +60,28 @@
<vxe-column field="name1" title="用户项目负载/出力(%)" min-width="160px" /> <vxe-column field="name1" title="用户项目负载/出力(%)" min-width="160px" />
</vxe-colgroup> </vxe-colgroup>
<vxe-colgroup title="用户无功设备不运行"> <vxe-colgroup title="用户无功设备不运行">
<vxe-column field="name2" title="百分比(%)" min-width="90px" /> <vxe-column field="capOff.percent" title="百分比(%)" min-width="90px" />
<vxe-column field="name3" title="有名值(%)" min-width="90px" /> <vxe-column field="capOff.voltagePercent" title="有名值(%)" min-width="90px" />
<vxe-column field="name4" title="上限值(%)" min-width="90px" /> <vxe-column field="capOff.capUP" title="上限值(%)" min-width="90px" />
<vxe-column field="name5" title="下限值(%)" min-width="90px" /> <vxe-column field="capOff.capDown" title="下限值(%)" min-width="90px" />
<vxe-column title="判断" min-width="80px"> <vxe-column title="判断" min-width="80px">
<template #default="{ row }"> <template #default="{ row }">
<el-tag type="success">合格</el-tag> <span v-if="!row.capOff || !row.capOff.percent"></span>
<el-tag v-else-if="row.capOff.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-colgroup> </vxe-colgroup>
<vxe-colgroup title="用户无功设备全部运行"> <vxe-colgroup title="用户无功设备全部运行">
<vxe-column field="name6" title="百分比(%)" min-width="90px" /> <vxe-column field="capOn.percent" title="百分比(%)" min-width="90px" />
<vxe-column field="name7" title="有名值(%)" min-width="90px" /> <vxe-column field="capOn.voltagePercent" title="有名值(%)" min-width="90px" />
<vxe-column field="name8" title="上限值(%)" min-width="90px" /> <vxe-column field="capOn.capUP" title="上限值(%)" min-width="90px" />
<vxe-column field="name9" title="下限值(%)" min-width="90px" /> <vxe-column field="capOn.capDown" title="下限值(%)" min-width="90px" />
<vxe-column title="判断" min-width="80px"> <vxe-column title="判断" min-width="80px">
<template #default="{ row }"> <template #default="{ row }">
<el-tag type="success">合格</el-tag> <span v-if="!row.capOff || !row.capOff.percent"></span>
<el-tag v-else-if="row.capOn.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-colgroup> </vxe-colgroup>
@@ -92,56 +96,56 @@
style="width: 100%" style="width: 100%"
> >
<vxe-column title="估算方式" field="name" /> <vxe-column title="估算方式" field="name" />
<vxe-column title="负序电压不平衡度(%)" field="name2" /> <vxe-column title="负序电压不平衡度(%)" field="data" />
<vxe-column title="国标限值(%)" field="name3" /> <vxe-column title="国标限值(%)" field="limitData" />
<vxe-column title="判断"> <vxe-column title="判断">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="!row.data || row.data === ''"></span>
<el-tag v-if="row.name2 > row.name3" type="warning">合格</el-tag> <el-tag v-else-if="row.isQualified" type="success">合格</el-tag>
<el-tag v-else type="success">合格</el-tag> <el-tag v-else type="warning">合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="谐波电/电评估结果" :name="4"> <el-collapse-item title="谐波电/电评估结果" :name="4">
<div class="flickerWaves" style="height: 520px"> <div class="flickerWaves" style="height: 520px">
<vxe-table :data="harmonicCurrents" height="520px" v-bind="defaultAttribute" :cell-class-name="getCellClassName3" style="width: 50%">
<vxe-column title="谐波次数" field="name" />
<vxe-colgroup title="电容器谐波电流评估值(A)">
<vxe-column field="notInvested" title="未投入" min-width="160px" />
<vxe-column field="hasInvested" title="已投入" min-width="160px" />
</vxe-colgroup>
<vxe-column title="国标限值(%)" field="limitData" />
<vxe-column title="判断">
<template #default="{ row }">
<span v-if="!row.limitData || row.limitData === ''"></span>
<el-tag v-else-if="row.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
</template>
</vxe-column>
</vxe-table>
<vxe-table <vxe-table
:data="harmonicVoltage" :data="harmonicVoltage"
height="520px" height="520px"
v-bind="defaultAttribute" v-bind="defaultAttribute"
:cell-class-name="getCellClassName" :cell-class-name="getCellClassName3"
style="width: 50%" style="width: 50%"
> >
<vxe-column title="谐波次数" field="name" />
<vxe-colgroup title="电容器谐波电流评估值(A)">
<vxe-column field="name1" title="未投入" min-width="160px" />
<vxe-column field="name2" title="已投入" min-width="160px" />
</vxe-colgroup>
<vxe-column title="国标限值(A)" field="name3" />
<vxe-column title="判断">
<template #default="{ row }">
<!-- <span v-if="row.name2 == null"></span>
<el-tag v-if="row.name2 > row.name3" type="warning">不合格</el-tag>
<el-tag v-else type="success">合格</el-tag> -->
</template>
</vxe-column>
</vxe-table>
<vxe-table :data="harmonicCurrents" height="520px" v-bind="defaultAttribute" style="width: 50%">
<vxe-column title="谐波次数" field="name" /> <vxe-column title="谐波次数" field="name" />
<vxe-colgroup title="电容器谐波电压评估值(%)"> <vxe-colgroup title="电容器谐波电压评估值(%)">
<vxe-column field="name1" title="未投入" min-width="160px" /> <vxe-column field="notInvested" title="未投入" min-width="160px" />
<vxe-column field="name2" title="已投入" min-width="160px" /> <vxe-column field="hasInvested" title="已投入" min-width="160px" />
</vxe-colgroup> </vxe-colgroup>
<vxe-column title="国标限值(%)" field="name3" /> <vxe-column title="国标限值(A)" field="limitData" />
<vxe-column title="判断"> <vxe-column title="判断">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.name2 == null"></span> <span v-if="!row.limitData || row.limitData === ''"></span>
<el-tag v-else-if="row.name2 > row.name3" type="warning">合格</el-tag> <el-tag v-else-if="row.isQualified" type="success">合格</el-tag>
<el-tag v-else type="warning">不合格</el-tag>
<el-tag v-else type="success">合格</el-tag>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
@@ -151,117 +155,82 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import {getResult} from '@/api/advance-boot/assess'
// 定义 props
const props = defineProps({
nodeId: {
type: [String, Number],
default: null
}
})
const activeNames = ref([1, 2, 3, 4, 5, 6, 7]) const activeNames = ref([1, 2, 3, 4, 5, 6, 7])
// 波动 // 波动
const undulation = ref([ const undulation = ref([
{ {
name: '近似计算', inPactLoadNum:'',
name1: '1', data:'',
name2: '6.94', limitData:'',
name3: '3.00'
},
{
name: '精确估算',
name1: '1',
name2: '6.94',
name3: '3.00'
} }
]) ])
// 闪变 // 闪变
const flicker = ref([ const flicker = ref([
{ {
name1: '1', inPactLoadNum:'',
name2: '1.1', data:'',
name3: '0.8' limitData:'',
}, }
{}
]) ])
// 电压偏差 // 电压偏差
const voltageDeviation = ref([ const voltageDeviation = ref([
{ {
name: '电网高峰负荷', name: '电网高峰负荷',
name1: '100', name1: '100',
name2: '2.14', capOff: {}, // 不投入状态数据
name3: '107.65', capOn: {} // 全部投入状态数据
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
}, },
{ {
name: '电网高峰负荷', name: '电网高峰负荷',
name1: '100', name1: '60',
name2: '2.14', capOff: {}, // 不投入状态数据
name3: '107.65', capOn: {} // 全部投入状态数据
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
}, },
{ {
name: '电网高峰负荷', name: '电网高峰负荷',
name1: '100', name1: '0',
name2: '2.14', capOff: {},
name3: '107.65', capOn: {}
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
}, },
{ {
name: '电网低谷负荷', name: '电网低谷负荷',
name1: '100', name1: '100',
name2: '2.14', capOff: {},
name3: '107.65', capOn: {}
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
}, },
{ {
name: '电网低谷负荷', name: '电网低谷负荷',
name1: '100', name1: '60',
name2: '2.14', capOff: {},
name3: '107.65', capOn: {}
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
}, },
{ {
name: '电网低谷负荷', name: '电网低谷负荷',
name1: '100', name1: '0',
name2: '2.14', capOff: {},
name3: '107.65', capOn: {}
name4: '10.00',
name5: '-10.00',
name6: '2.14',
name7: '107.65',
name8: '10.00',
name9: '-10.00'
} }
]) ])
// 三相电压 // 三相电压
const imbalance = ref([ const imbalance = ref([
{ {
name: '近似计算', name: '严格估算',
name2: '2.1', data: '',
name3: '1.3' limitData: ''
}, },
{ {
name: '精确估算', name: '一般估算',
name2: '1.6', data: '',
name3: '1.3' limitData: ''
} }
]) ])
// 谐波电压 // 谐波电压
@@ -274,23 +243,303 @@ const mergeCells = ref([
{ row: 3, col: 0, rowspan: 3, colspan: 1 } { row: 3, col: 0, rowspan: 3, colspan: 1 }
]) ])
// 添加单元格class // 添加单元格class
const getCellClassName = ({ row, columnIndex }) => { const getCellClassName = ({ row, columnIndex }: { row: any; columnIndex: number }) => {
if (row.name2 > row.name3 && columnIndex == 2) { if (row.isQualified === false && columnIndex == 1) {
return 'custom-cell-bg' // 为 Alice 的单元格添加背景 return 'custom-cell-bg' // 为 Alice 的单元格添加背景
} }
return '' return ''
} }
onMounted(() => {
for (let i = 2; i < 51; i++) { //谐波判判合格
harmonicVoltage.value.push({ const getCellClassName3 = ({ row, column, columnIndex }: { row: any; column: any; columnIndex: number }) => {
name: i if (column.field === 'notInvested') {
if (row.isNotQualified == false && columnIndex == 0) {
}) return 'custom-cell-bg' // 为 Alice 的单元格添加背景
harmonicCurrents.value.push({ }
name: i
})
} }
})
if (row.isHasQualified == false&& columnIndex == 1) {
return 'custom-cell-bg' // 为 Alice 的单元格添加背景
}
return ''
}
//电压偏差判合格
const getCellClassName2 = ({ row, column, columnIndex }: { row: any; column: any; columnIndex: number }) => {
// 用户无功设备不运行 - 百分比列
if (column.field === 'capOff.percent') {
if (row.capOff && row.capOff.isQualified === false) {
return 'custom-cell-bg';
}
}
// 用户无功设备全部运行 - 百分比列
if (column.field === 'capOn.percent') {
if (row.capOn && row.capOn.isQualified === false) {
return 'custom-cell-bg';
}
}
return ''
}
const emit = defineEmits<{
(e: 'data-status', status: boolean): void
(e: 'data-loaded'): void
}>()
// 监听 nodeId 变化并执行相应操作
watch(() => props.nodeId, async (newId) => {
if (newId) {
// 重置电压偏差数据到初始状态
resetVoltageDeviationData();
// 重置三相电压不平衡数据到初始状态
resetImbalanceData();
// 重置谐波数据
initializeHarmonicVoltage();
initializeHarmonicCurrents();
// 确保谐波次数已初始化
if (harmonicVoltage.value.length === 0) {
for (let i = 2; i <= 50; i++) {
harmonicVoltage.value.push({
name: i
});
}
}
if (harmonicCurrents.value.length === 0) {
for (let i = 2; i <= 50; i++) {
harmonicCurrents.value.push({
name: i
});
}
}
getResult({}, newId).then(res => {
if(res.data == null){
emit('data-status', false);// 通知父组件无数据
resetAllTableData();
return
}
emit('data-status', true);
// 处理电压波动数据 - 确保是数组
if (res?.data?.fluc) {
if (Array.isArray(res.data.fluc)) {
undulation.value = res.data.fluc;
} else {
// 如果是单个对象,包装成数组
undulation.value = [res.data.fluc];
}
} else {
// 提供默认值
undulation.value = [{
inPactLoadNum: '',
data: '',
limitData: ''
}];
}
// 处理闪变数据
if (res?.data?.plt) {
flicker.value = Array.isArray(res.data.plt) ? res.data.plt : [res.data.plt];
} else {
flicker.value = [{
inPactLoadNum: '',
data: '',
limitData: ''
}];
}
// 处理电压偏差数据
if (res?.data?.capOff || res?.data?.capOn) {
let capOffData: string|any[] = [];
let capOnData: string|any[] = [];
if (res.data.capOff) {
capOffData = Array.isArray(res.data.capOff) ? res.data.capOff : [res.data.capOff];
}
if (res.data.capOn) {
capOnData = Array.isArray(res.data.capOn) ? res.data.capOn : [res.data.capOn];
}
// 合并数据并保持原有结构
voltageDeviation.value = voltageDeviation.value.map((item, index) => {
const capOffItem = capOffData[index] || {};
const capOnItem = capOnData[index] || {};
return {
...item,
capOff: capOffItem,
capOn: capOnItem
};
});
// 动态调整合并单元格
const totalDataLength = Math.max(capOffData.length, capOnData.length);
updateMergeCellsConfiguration(totalDataLength);
}
/// 处理三相电压不平衡数据
if (res?.data?.unblance) {
const unbalanceData = Array.isArray(res.data.unblance) ? res.data.unblance : [res.data.unblance];
// 保持预定义结构,合并新数据
imbalance.value = imbalance.value.map((item, index) => ({
...item,
...(unbalanceData[index] || {})
}));
}
// 处理谐波数据
if (res?.data?.harmV) {
const harmVData = Array.isArray(res.data.harmV) ? res.data.harmV : [res.data.harmV];
// 按索引将API数据与已有的谐波次数合并
harmonicVoltage.value = harmonicVoltage.value.map((item, index) => {
const apiData = harmVData[index];
return apiData ? { ...item, ...apiData } : item;
});
}
if (res?.data?.harmI) { const harmIData = Array.isArray(res.data.harmI) ? res.data.harmI : [res.data.harmI];
// 按索引将API数据与已有的谐波次数合并
harmonicCurrents.value = harmonicCurrents.value.map((item, index) => {
const apiData = harmIData[index];
return apiData ? { ...item, ...apiData } : item;
});
}
})
// 等待 DOM 更新后延迟触发
await nextTick()
setTimeout(() => {
emit('data-loaded')
}, 1000) // 3秒延迟
}
}, { immediate: true });
// 添加重置所有表格数据的函数
function resetAllTableData() {
// 重置电压波动数据
undulation.value = [];
// 重置闪变数据
flicker.value = [];
// 重置电压偏差数据到初始状态
voltageDeviation.value = []
// 重置三相电压不平衡数据到初始状态
imbalance.value = []
// 重置谐波数据
harmonicVoltage.value = [];
harmonicCurrents.value = [];
}
// 重置电压偏差数据到初始状态
function resetVoltageDeviationData() {
voltageDeviation.value = [
{
name: '电网高峰负荷',
name1: '100',
capOff: {}, // 不投入状态数据
capOn: {} // 全部投入状态数据
},
{
name: '电网高峰负荷',
name1: '60',
capOff: {}, // 不投入状态数据
capOn: {} // 全部投入状态数据
},
{
name: '电网高峰负荷',
name1: '0',
capOff: {},
capOn: {}
},
{
name: '电网低谷负荷',
name1: '100',
capOff: {},
capOn: {}
},
{
name: '电网低谷负荷',
name1: '60',
capOff: {},
capOn: {}
},
{
name: '电网低谷负荷',
name1: '0',
capOff: {},
capOn: {}
}
];
updateMergeCellsConfiguration(6); // 固定为6条数据
}
// 重置三相电压不平衡数据到初始状态
function resetImbalanceData() {
imbalance.value = [
{
name: '严格估算',
data: '',
limitData: ''
},
{
name: '一般估算',
data: '',
limitData: ''
}
];
}
// 初始化谐波电压数据
function initializeHarmonicVoltage() {
harmonicVoltage.value = [];
for (let i = 2; i <= 50; i++) {
harmonicVoltage.value.push({
name: i
});
}
}
// 初始化谐波电流数据
function initializeHarmonicCurrents() {
harmonicCurrents.value = [];
for (let i = 2; i <= 50; i++) {
harmonicCurrents.value.push({
name: i
});
}
}
// 添加更新合并单元格配置的函数
function updateMergeCellsConfiguration(dataLength) {
// 根据实际数据长度动态计算合并策略
const newMergeCells = [];
if (dataLength >= 6) {
// 如果数据足够按原来的方式合并前3行和后3行
newMergeCells.push({ row: 0, col: 0, rowspan: 3, colspan: 1 });
newMergeCells.push({ row: 3, col: 0, rowspan: 3, colspan: 1 });
} else if (dataLength >= 4) {
// 如果只有4条数据前2行和后2行分别合并
newMergeCells.push({ row: 0, col: 0, rowspan: 2, colspan: 1 });
newMergeCells.push({ row: 2, col: 0, rowspan: 2, colspan: 1 });
} else if (dataLength >= 2) {
// 如果只有2条数据每行单独合并
newMergeCells.push({ row: 0, col: 0, rowspan: 1, colspan: 1 });
newMergeCells.push({ row: 1, col: 0, rowspan: 1, colspan: 1 });
}
mergeCells.value = newMergeCells;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.el-collapse-item__header) { :deep(.el-collapse-item__header) {
@@ -298,8 +547,6 @@ onMounted(() => {
font-size: 16px !important; font-size: 16px !important;
&::before { &::before {
content: '' !important; /* 添加星号 */ content: '' !important; /* 添加星号 */
} }
} }

View File

@@ -149,6 +149,7 @@ const del = () => {
} }
} }
onMounted(() => { onMounted(() => {
tableStore.index() tableStore.index()
}) })
</script> </script>

View File

@@ -18,6 +18,7 @@
:value="item.transtypeId" :value="item.transtypeId"
></el-option> ></el-option>
</el-select> </el-select>
<!-- 用户负荷参数维护 -->
<el-select <el-select
v-else-if="item.field == 'harmId'" v-else-if="item.field == 'harmId'"
v-model="form[item.field]" v-model="form[item.field]"
@@ -32,6 +33,96 @@
:value="item.harmId" :value="item.harmId"
></el-option> ></el-option>
</el-select> </el-select>
<!-- 冲击负荷参数维护 -->
<el-select
v-else-if="item.field == 'inpactloadtypeId'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择冲击负荷类型"
@change="handleImpactLoadTypeChange"
>
<el-option
v-for="item in shockList"
:key="item.inpactloadtypeId"
:label="item.inpactloadtypeName"
:value="item.inpactloadtypeId"
></el-option>
</el-select>
<el-select
v-else-if="item.field == 'inpactloadStartup'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择启动方式"
@change="handleStartupChange"
>
<el-option
v-for="startup in startupOptions"
:key="startup.value"
:label="startup.label"
:value="startup.value"
/>
</el-select>
<el-select
v-else-if="item.field == 'inpactloadFreq'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择负荷频度"
>
<el-option label="N≤4次/d" value="01"></el-option>
<el-option label="N>4次/d且N≤2次/h" value="02"></el-option>
<el-option label="2次/h<N≤10次/h" value="03"></el-option>
</el-select>
<el-select
v-else-if="item.field == 'isIsolationtrans'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择是否隔离变"
>
<el-option label="是" value="01" />
<el-option label="否" value="00" />
</el-select>
<el-select
v-else-if="item.field == 'inpactloadhighScale'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择高压侧电压"
>
<el-option
v-for="item in voltageleveloption"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
<el-select
v-else-if="item.field == 'inpactloadlowScale'"
v-model="form[item.field]"
filterable
clearable
placeholder="请选择低压侧电压"
>
<el-option
v-for="item in voltageleveloption"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
<el-input-number
v-else-if="item.field == 'powerFactor'"
v-model="form[item.field]"
:min="0"
:max="1"
:step="0.1"
:precision="1"
placeholder="请输入功率因数"
/>
<el-input-number <el-input-number
v-else-if=" v-else-if="
@@ -43,8 +134,8 @@
item.field == 's'|| item.field == 's'||
item.field == 'transhighCapacity'|| item.field == 'transhighCapacity'||
item.field == 'transImpedance'|| item.field == 'transImpedance'||
item.field == 'nonlinearloadPower'|| item.field == 'nonlinearloadPower'
item.field == 'powerFactor'
" "
style="width: 100%" style="width: 100%"
v-model="form[item.field]" v-model="form[item.field]"
@@ -70,7 +161,9 @@
:value="item.id" :value="item.id"
></el-option> ></el-option>
</el-select> </el-select>
<el-input v-else v-model.trim="form[item.field]" placeholder="请输入内容" />
<el-input v-else v-model.trim="form[item.field]" placeholder="请输入内容" :disabled= "item.field == 'inpactloadPower'"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
@@ -99,13 +192,15 @@ import {
loadParamAdd, loadParamAdd,
loadParamEdit, loadParamEdit,
shockAdd, shockAdd,
shockEdit shockEdit,
loadList
} from '@/api/advance-boot/assess' } from '@/api/advance-boot/assess'
import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus' import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
const emits = defineEmits(['init']) const emits = defineEmits(['init'])
const child: any = ref([]) const child: any = ref([])
const transformer: any = ref([]) const transformer: any = ref([])
const characteristic: any = ref([]) const characteristic: any = ref([])
const shockList: any = ref([])
const form: any = ref({}) const form: any = ref({})
const dictData = useDictData() const dictData = useDictData()
//字典获取电压等级 //字典获取电压等级
@@ -120,7 +215,7 @@ const rules = {
capacitorReactance: [{ required: true, message: '请输入电抗率', trigger: 'blur' }], capacitorReactance: [{ required: true, message: '请输入电抗率', trigger: 'blur' }],
capacitorScale: [{ required: true, message: '请选择电压等级', trigger: 'change' }], capacitorScale: [{ required: true, message: '请选择电压等级', trigger: 'change' }],
windgeneratorName: [{ required: true, message: '请输入风机名称', trigger: 'blur' }], windgeneratorName: [{ required: true, message: '请输入风机名称', trigger: 'blur' }],
flickerCoeff: [{ required: true, message: '请输入风机闪变系数', trigger: 'blur' }], flickerCoeff: [{ required: true, message: '请输入闪变叠加系数', trigger: 'blur' }],
s: [{ required: true, message: '请输入风机额定视在功率', trigger: 'blur' }], s: [{ required: true, message: '请输入风机额定视在功率', trigger: 'blur' }],
loadName: [{ required: true, message: '请输入负荷名称', trigger: 'blur' }], loadName: [{ required: true, message: '请输入负荷名称', trigger: 'blur' }],
transhighCapacity: [{ required: true, message: '请输入配变容量', trigger: 'blur' }], transhighCapacity: [{ required: true, message: '请输入配变容量', trigger: 'blur' }],
@@ -130,16 +225,26 @@ const rules = {
linevoltageScale: [{ required: true, message: '请选择进线电压', trigger: 'change' }], linevoltageScale: [{ required: true, message: '请选择进线电压', trigger: 'change' }],
harmId: [{ required: true, message: '请选择谐波源特性', trigger: 'change' }], harmId: [{ required: true, message: '请选择谐波源特性', trigger: 'change' }],
translowScale: [{ required: true, message: '请选择配变低压侧电压', trigger: 'change' }], translowScale: [{ required: true, message: '请选择配变低压侧电压', trigger: 'change' }],
inpactloadtypeId: [{ required: true, message: '请选择冲击负荷类型', trigger: 'change' }],
inpactloadStartup: [{ required: true, message: '请选择启动方式', trigger: 'change' }],
inpactloadNum:[{ required: true, message: '请输入数量', trigger: 'blur' }],
inpactloadPower:[{ required: true, message: '请输入容量率', trigger: 'blur' }],
isIsolationtrans:[{ required: true, message: '请选择是否隔离变', trigger: 'change' }],
isolationtransImpedance:[{ required: true, message: '请输入隔离变阻抗', trigger: 'blur' }],
inpactloadhighScale:[{ required: true, message: '请选择高压侧电压', trigger: 'change' }],
inpactloadlowScale:[{ required: true, message: '请选择低压侧电压', trigger: 'change' }],
inpactloadFreq:[{ required: true, message: '请选择负荷频度', trigger: 'change' }],
} }
const formRef = ref() const formRef = ref()
const dialogVisible = ref(false) const dialogVisible = ref(false)
const title = ref('') const title = ref('')
const open = (row: any) => { const open = (row: any) => {
console.log('🚀 ~ open ~ row:', row)
info() info()
title.value = row.title + `_${row.item.name}` title.value = row.title + `_${row.item.name}`
child.value = row.item.child child.value = row.item.child
if (row.title == '新增') { if (row.title == '新增') {
row.item.child.forEach((item: any) => { row.item.child.forEach((item: any) => {
form.value[item.field] = '' form.value[item.field] = ''
@@ -149,6 +254,32 @@ const open = (row: any) => {
row.item.child.forEach((item: any) => { row.item.child.forEach((item: any) => {
form.value = JSON.parse(JSON.stringify(row.row)) form.value = JSON.parse(JSON.stringify(row.row))
}) })
// 如果是冲击负荷类型,需要设置启动方式下拉选项
if (form.value.inpactloadtypeId) {
// 根据选中的冲击负荷类型ID筛选数据
currentImpactLoadOptions.value = shockList.value.filter(
(item: any) => item.inpactloadtypeId === form.value.inpactloadtypeId
)
console.log('🚀 ~ open ~ currentImpactLoadOptions:', currentImpactLoadOptions.value)
// 构建启动方式选项
const uniqueStartups = new Map()
currentImpactLoadOptions.value.forEach((item: any) => {
uniqueStartups.set(item.inpactloadStartup, {
label: item.inpactloadStartup,
value: item.inpactloadStartup
})
})
startupOptions.value = Array.from(uniqueStartups.values())
// 如果有选项,默认选择第一个
if (startupOptions.value.length > 0) {
form.value.inpactloadStartup = startupOptions.value[0].value
} else {
form.value.inpactloadStartup = ''
}
}
} }
dialogVisible.value = true dialogVisible.value = true
@@ -162,6 +293,72 @@ const info = async () => {
characteristicList({}).then((res: any) => { characteristicList({}).then((res: any) => {
characteristic.value = res.data characteristic.value = res.data
}) })
loadList({}).then((res: any) => {
shockList.value = res.data
})
}
// 添加启动方式选项数据
const startupOptions = ref<Array<{ label: string; value: string }>>([])
// 存储当前冲击负荷类型的选项
const currentImpactLoadOptions = ref([])
// 处理冲击负荷类型变化
const handleImpactLoadTypeChange = (value: any) => {
if (value) {
// 直接根据选中的冲击负荷类型ID筛选数据
currentImpactLoadOptions.value = shockList.value.filter(
(item: any) => item.inpactloadtypeId === value
)
// 构建启动方式选项
const uniqueStartups = new Map()
currentImpactLoadOptions.value.forEach((item: any) => {
uniqueStartups.set(item.inpactloadStartup, {
label: item.inpactloadStartup,
value: item.inpactloadStartup
})
})
startupOptions.value = Array.from(uniqueStartups.values())
// 如果有选项,默认选择第一个
if (startupOptions.value.length > 0) {
form.value.inpactloadStartup = startupOptions.value[0].value
} else {
form.value.inpactloadStartup = ''
}
// 清空之前选择的容量
form.value.inpactloadPower = null
// 触发启动方式变化事件,自动设置对应的容量
if (startupOptions.value.length > 0) {
handleStartupChange(startupOptions.value[0].value)
}
} else {
startupOptions.value = []
currentImpactLoadOptions.value = []
form.value.inpactloadStartup = ''
form.value.inpactloadPower = null
}
}
// 处理启动方式变化
const handleStartupChange = (value: any) => {
if (value && currentImpactLoadOptions.value.length > 0) {
// 根据启动方式查找对应的容量倍数
const selectedOption = currentImpactLoadOptions.value.find(
(item: any) => item.inpactloadStartup === value
)
if (selectedOption) {
// 设置容量为倍数,实际应用中可能需要根据其他参数计算具体容量值
form.value.inpactloadPower = selectedOption.inpactloadMultiple
} else {
form.value.inpactloadPower = null
}
} else {
form.value.inpactloadPower = null
}
} }
const submit = async () => { const submit = async () => {
formRef.value.validate(async (valid: any) => { formRef.value.validate(async (valid: any) => {

View File

@@ -1,8 +1,9 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<div class="actionButtons"> <div class="actionButtons">
<el-button type="primary" icon="el-icon-Check" class="md8" @click="onsubmit">保存</el-button> <el-button type="primary" icon="el-icon-Check" class="md8" @click="onsubmit" v-if="showSaveButton">保存</el-button>
<back-component style="margin: 8px" /> <back-component style="margin: 8px" />
</div> </div>
<div :style="pageHeight" style="overflow-y: auto"> <div :style="pageHeight" style="overflow-y: auto">
<el-collapse v-model="activeNames" class="pl10 pr10"> <el-collapse v-model="activeNames" class="pl10 pr10">
@@ -14,6 +15,7 @@
class="form-four" class="form-four"
:rules="rules" :rules="rules"
label-width="auto" label-width="auto"
:disabled="formDisabled"
> >
<el-form-item label="所在地市" prop="deptId"> <el-form-item label="所在地市" prop="deptId">
<!-- <el-select v-model="form.deptId" clearable placeholder="请选择所在地市"> <!-- <el-select v-model="form.deptId" clearable placeholder="请选择所在地市">
@@ -30,7 +32,7 @@
<el-input v-model="form.assessName" placeholder="用户名称" clearable /> <el-input v-model="form.assessName" placeholder="用户名称" clearable />
</el-form-item> </el-form-item>
<el-form-item label="电压等级" prop="userScale"> <el-form-item label="电压等级" prop="userScale">
<el-select v-model="form.userScale" clearable placeholder="请选择变电站"> <el-select v-model="form.userScale" clearable placeholder="请选择电压等级">
<el-option <el-option
v-for="item in voltageleveloption" v-for="item in voltageleveloption"
:key="item.id" :key="item.id"
@@ -60,7 +62,7 @@
<el-option label="其他" value="03"></el-option> <el-option label="其他" value="03"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="用户有功功率(MW)" prop="windfarmCapacity"> <el-form-item :label="windfarmCapacityLabel" prop="windfarmCapacity">
<el-input-number <el-input-number
style="width: 100%" style="width: 100%"
v-model="form.windfarmCapacity" v-model="form.windfarmCapacity"
@@ -84,6 +86,7 @@
class="form-four" class="form-four"
:rules="rules" :rules="rules"
label-width="auto" label-width="auto"
:disabled="formDisabled"
> >
<el-form-item label="接入变电站" prop="powerstationId"> <el-form-item label="接入变电站" prop="powerstationId">
<el-select <el-select
@@ -204,7 +207,7 @@
</el-form> </el-form>
</el-collapse-item> </el-collapse-item>
<div v-if="form.assessId"> <div v-if="form.assessId">
<tabFrom :assessId="form.assessId" /> <tabFrom :assessId="form.assessId" :isWindfarm="form.isWindfarm" :isWithCapacitor="form.withCapacitor" :disabled="formDisabled"/>
</div> </div>
</el-collapse> </el-collapse>
</div> </div>
@@ -216,17 +219,17 @@ import BackComponent from '@/components/icon/back/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import Area from '@/components/form/area/index.vue' import Area from '@/components/form/area/index.vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus' import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { getSubstationSelect } from '@/api/device-boot/line' import { getSubstationSelect } from '@/api/device-boot/line'
import tabFrom from './tabFrom.vue' import tabFrom from './tabFrom.vue'
import { cableList, getBusBarSelect, getMonitorSelect, userAdd, userGetInfo } from '@/api/advance-boot/assess' import { cableList, getBusBarSelect, getMonitorSelect, userAdd, userGetInfo ,userEdit} from '@/api/advance-boot/assess'
const activeNames = ref([1, 2, 3, 4, 5, 6, 7]) const activeNames = ref([1, 2, 3, 4, 5, 6, 7])
const dictData = useDictData() const dictData = useDictData()
const pageHeight = mainHeight(70) const pageHeight = mainHeight(70)
const areaOptionList = dictData.getBasicData('jibei_area') const areaOptionList = dictData.getBasicData('jibei_area')
const { query } = useRoute() // 查询参数 const { query} = useRoute() // 查询参数
//字典获取电压等级 //字典获取电压等级
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const powerstationList: any = ref([]) //变电站列表 const powerstationList: any = ref([]) //变电站列表
@@ -234,6 +237,17 @@ const busList: any = ref([]) //generatrix列表
const linetypeList: any = ref([]) //线路类型 const linetypeList: any = ref([]) //线路类型
const pccList: any = ref([]) //pcc列表 const pccList: any = ref([]) //pcc列表
const route = useRoute()
const isViewMode = ref(route.query.mode === 'view')
// 根据 isViewMode 控制表单的禁用状态
const formDisabled = ref(isViewMode.value)
// 或者在保存按钮上根据模式控制显示
const showSaveButton = !isViewMode.value
const form: any = ref({ const form: any = ref({
assessId: '', assessId: '',
deptId: dictData.state.area[0].id, deptId: dictData.state.area[0].id,
@@ -284,17 +298,41 @@ const rules = {
lineGridresistance: [{ required: true, message: '请输入PCC点电网电抗', trigger: 'blur' }] lineGridresistance: [{ required: true, message: '请输入PCC点电网电抗', trigger: 'blur' }]
} }
const windfarmCapacityLabel = computed(() => {
if (form.value.isWindfarm === '01') {
return '风电场装机容量(MW)'
} else {
return '用户有功功率(MW)'
}
})
const form1 = ref() const form1 = ref()
const form2 = ref() const form2 = ref()
// 保存 // 保存
const onsubmit = () => { const onsubmit = () => {
form1.value.validate((valid: any) => { form1.value.validate((valid: any) => {
if (valid) { if (valid) {
form2.value.validate((valid2: any) => { form2.value.validate((valid2: any) => {
if (valid2) { if (valid2) {
userAdd(form.value).then((res: any) => { if(form.value.assessId){
userEdit(form.value).then((res: any) => {
form.value.assessId = res.data
ElMessage({
type: 'success',
message: '编辑成功!'
})
})
}else{
userAdd(form.value).then((res: any) => {
form.value.assessId = res.data form.value.assessId = res.data
}) ElMessage({
type: 'success',
message: '新增成功!'
})
})
}
} }
}) })
} }
@@ -330,7 +368,7 @@ const changePowerstation = (e: any, flag: boolean = true) => {
form.value.lineName = '' form.value.lineName = ''
} }
let data = powerstationList.value.filter((item: any) => item.id == e)[0] let data = powerstationList.value.filter((item: any) => item.id == e)[0]
form.value.powerstationName = data.voltageName form.value.powerstationName = data.name
form.value.powerstationScale = data.voltageLevel form.value.powerstationScale = data.voltageLevel
getBusBarSelect({ stationId: data.id }).then(res => { getBusBarSelect({ stationId: data.id }).then(res => {
busList.value = res.data busList.value = res.data
@@ -342,7 +380,7 @@ const changePowerstation = (e: any, flag: boolean = true) => {
// 点击母线 // 点击母线
const changeBus = (e: any) => { const changeBus = (e: any) => {
let data = busList.value.filter((item: any) => item.id == e)[0] let data = busList.value.filter((item: any) => item.id == e)[0]
form.value.busName = data.voltageName form.value.busName = data.name
form.value.busScale = data.voltageLevel form.value.busScale = data.voltageLevel
} }
// 点击pcc // 点击pcc
@@ -351,10 +389,12 @@ const LineChange = (e: any) => {
form.value.lineName = data.name form.value.lineName = data.name
} }
onMounted(() => { onMounted(() => {
console.log(123, query?.id)
info(query?.id) info(query?.id)
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.actionButtons { .actionButtons {
@@ -395,3 +435,5 @@ onMounted(() => {
min-width: 120px; min-width: 120px;
} }
</style> </style>

View File

@@ -99,6 +99,8 @@ import { useDictData } from '@/stores/dictData'
import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus' import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
import { cableList, batchDel } from '@/api/advance-boot/assess' import { cableList, batchDel } from '@/api/advance-boot/assess'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import Form from './form.vue'
defineOptions({ defineOptions({
name: 'runManage/addUser' name: 'runManage/addUser'
}) })
@@ -167,7 +169,7 @@ const tableStore: any = new TableStore({
return row.cellValue == '01' ? '风电场' : row.cellValue == '02' ? '光伏' : '其他' return row.cellValue == '01' ? '风电场' : row.cellValue == '02' ? '光伏' : '其他'
} }
}, },
{ field: 'windfarmCapacity', title: '用户有功功率(MW)', minWidth: 180 }, { field: 'windfarmCapacity', title: '风电场装机容量(MW)', minWidth: 180 },
{ {
field: 'singleLoad', field: 'singleLoad',
title: '是否单相负荷', title: '是否单相负荷',
@@ -205,17 +207,25 @@ const tableStore: any = new TableStore({
type: 'primary', type: 'primary',
icon: 'el-icon-EditPen', icon: 'el-icon-EditPen',
render: 'basicButton', render: 'basicButton',
click: async row => {
click: async row => {} push({
path: 'addUser',
query: {
id: row.assessId,
mode: 'view'
}
})
}
} }
] ]
} }
], ],
beforeSearchFun: () => { beforeSearchFun: () => {
// tableStore.table.params.deptId = tableStore.table.params.deptIndex // tableStore.table.params.deptId = tableStore.table.params.deptIndex
}, },
loadCallback: () => {} loadCallback: () => { }
}) })
tableStore.table.params.assessName = '' tableStore.table.params.assessName = ''
tableStore.table.params.deptId = '' tableStore.table.params.deptId = ''
@@ -225,6 +235,17 @@ tableStore.table.params.isWindfarm = ''
tableStore.table.params.powerstationScaleList = [] tableStore.table.params.powerstationScaleList = []
provide('tableStore', tableStore) provide('tableStore', tableStore)
const route = useRoute()
// 监听路由变化
watch(
() => route.query,
(newQuery) => {
tableStore.index()
},
{ immediate: true }
)
// 新增评估用户页面 // 新增评估用户页面
const addForm = () => { const addForm = () => {
push({ push({
@@ -263,4 +284,7 @@ onMounted(() => {
tableStore.index() tableStore.index()
Info() Info()
}) })
</script> </script>

View File

@@ -1,11 +1,23 @@
<template> <template>
<el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3"> <el-collapse-item :title="item.name" v-for="(item, index) in column" :key="index" :name="index + 3" >
<div class="mb10"> <div class="mb10">
<el-button type="primary" size="small" icon="el-icon-Plus" @click="addFform(item)">新增</el-button> <el-button
<el-button type="primary" size="small" icon="el-icon-Delete" @click="deleteFform(item, index)"> type="primary"
size="small"
icon="el-icon-Plus"
@click="addFform(item)"
:disabled="item.key === 'capacitorList' && props.isWithCapacitor === '00' || props.disabled"
>
新增</el-button>
<el-button
type="primary"
size="small"
icon="el-icon-Delete"
@click="deleteFform(item, index)"
:disabled="item.key === 'capacitorList' && props.isWithCapacitor === '00' || props.disabled"
>
删除 删除
</el-button> </el-button>
<!-- <el-button type="primary" size="small" icon="el-icon-Download">导出</el-button> -->
</div> </div>
<div style="height: 250px"> <div style="height: 250px">
<vxe-table <vxe-table
@@ -24,10 +36,16 @@
:field="k.field" :field="k.field"
:title="k.title" :title="k.title"
:formatter="formatter" :formatter="formatter"
></vxe-column> ></vxe-column>
<vxe-column title="操作" width="150px"> <vxe-column title="操作" width="150px">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="text" @click="edit(item, row)">编辑</el-button> <el-button
type="text"
@click="edit(item, row)"
:disabled="item.key === 'capacitorList' && props.isWithCapacitor === '00' || props.disabled"
>
编辑</el-button>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
@@ -52,18 +70,36 @@ import {
loadParamList, loadParamList,
loadParamDelete, loadParamDelete,
shockList, shockList,
shockDelete shockDelete,
loadList
} from '@/api/advance-boot/assess' } from '@/api/advance-boot/assess'
import { defaultAttribute } from '@/components/table/defaultAttribute' import { defaultAttribute } from '@/components/table/defaultAttribute'
import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus' import { ElMessage, ElMessageBox, ElDatePicker } from 'element-plus'
const props = defineProps({ const props = defineProps({
assessId: { type: String, required: true } assessId: {
type: String,
required: true
},
isWindfarm: {
type: String,
default: ''
},
isWithCapacitor:{
type: String,
default: ''
},
disabled: { // 定义 disabled prop
type: Boolean,
required: false,
default: false
}
}) })
const dictData = useDictData() const dictData = useDictData()
//字典获取电压等级 //字典获取电压等级
const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand') const voltageleveloption = dictData.getBasicData('Dev_Voltage_Stand')
const transformer: any = ref([]) const transformer: any = ref([])
const characteristic: any = ref([]) const characteristic: any = ref([])
const shockRef: any = ref([])
const addformRef = ref() const addformRef = ref()
const xTableRef = ref() const xTableRef = ref()
@@ -75,6 +111,7 @@ const column: any = ref([
key: 'transformerList', key: 'transformerList',
child: [ child: [
{ {
title: '用户变压器名称', title: '用户变压器名称',
field: 'transName' field: 'transName'
}, },
@@ -90,7 +127,6 @@ const column: any = ref([
}, },
{ {
loading: false, loading: false,
name: '电容器组参数维护', name: '电容器组参数维护',
key: 'capacitorList', key: 'capacitorList',
child: [ child: [
@@ -186,6 +222,11 @@ const column: any = ref([
title: '冲击负荷类型', title: '冲击负荷类型',
field: 'inpactloadtypeId' field: 'inpactloadtypeId'
}, },
{
title: '启动方式',
field: 'inpactloadStartup',
},
{ {
title: '数量', title: '数量',
@@ -214,7 +255,8 @@ const column: any = ref([
}, },
{ {
title: '负荷频度', title: '负荷频度',
field: 'inpactloadFreq' field: 'inpactloadFreq',
}, },
{ {
title: '闪变叠加系数', title: '闪变叠加系数',
@@ -223,6 +265,18 @@ const column: any = ref([
] ]
} }
]) ])
const filteredColumn = computed(() => {
// const windfarmValue = props.isWindfarm;
// if (windfarmValue === '01') {
// // 如果是风电场,显示除冲击负荷外的所有项
// return column.value.filter((item: any) => item.key !== 'impactList')
// } else {
// // 如果不是风电场,显示除风电参数外的所有项
// return column.value.filter((item: any) => item.key !== 'windPowerList')
// }
})
const dataList = ref({ const dataList = ref({
transformerList: [], //变压器参数维护 transformerList: [], //变压器参数维护
capacitorList: [], //电容器 capacitorList: [], //电容器
@@ -304,8 +358,7 @@ const edit = (item: any, row: any) => {
} }
const info = async (i: number) => { const info = async (i: number) => {
column.value[i].loading = true //column.value[i].loading = true
if (i == 0) { if (i == 0) {
// 变压器参数维护 // 变压器参数维护
await assessTransformerParamList({ assessId: props.assessId }).then(res => { await assessTransformerParamList({ assessId: props.assessId }).then(res => {
@@ -328,18 +381,40 @@ const info = async (i: number) => {
}) })
} else if (i == 4) { } else if (i == 4) {
// 冲击性负荷 // 冲击性负荷
await shockList({ assessId: props.assessId }).then(res => { await shockList({ assessId: props.assessId }).then((res: { data: never[] }) => {
dataList.value.impactList = res.data dataList.value.impactList = res.data
}) })
} }
column.value[i].loading = false column.value[i].loading = false
} }
const typeId = ref(null)
// 过滤数据 // 过滤数据
const formatter = (row: any) => { const formatter = (row: any) => {
if (row.column.field == 'transtypeId') { if (row.column.field == 'transtypeId') {
const found = transformer.value.find((item: any) => item.transtypeId == row.cellValue) const found = transformer.value.find((item: any) => item.transtypeId == row.cellValue)
return found.transtypeName || '' // 使用可选链并提供默认值 return found.transtypeName || '' // 使用可选链并提供默认值
} else if (row.column.field == 'harmId') { }else if(row.column.field =='inpactloadtypeId'){
const found = shockRef.value.find((item: any) => item.inpactloadtypeId == row.cellValue)
typeId.value = found.inpactloadtypeId
return found.inpactloadtypeName|| '' // 使用可选链并提供默认值
}else if(row.column.field =='inpactloadStartup'){
const found = shockRef.value.find((item: any) => item.inpactloadtypeId == typeId.value)
return found.inpactloadStartup
}
else if(row.column.field == 'isIsolationtrans'){
return row.cellValue == '01' ? '是' : '否'
}else if(row.column.field =='inpactloadFreq'){
if(row.cellValue == '01'){
return 'N≤4次/d'
}else if(row.cellValue == '02'){
return 'N>4次/d且N≤2次/h'
}else{
return '2次/h<N≤10次/h'
}
}
else if (row.column.field == 'harmId') {
const found = characteristic.value.find((item: any) => item.harmId == row.cellValue) const found = characteristic.value.find((item: any) => item.harmId == row.cellValue)
return found.harmName || '' // 使用可选链并提供默认值 return found.harmName || '' // 使用可选链并提供默认值
} else if ( } else if (
@@ -364,6 +439,11 @@ const dictionary = () => {
characteristicList({}).then((res: any) => { characteristicList({}).then((res: any) => {
characteristic.value = res.data characteristic.value = res.data
}) })
//冲击负荷类型
loadList({}).then((res: any) => {
shockRef.value = res.data
})
} }
onMounted(async () => { onMounted(async () => {
await dictionary() await dictionary()