联调二级评估
This commit is contained in:
@@ -6,21 +6,46 @@
|
||||
:default-expand-all="false"
|
||||
@node-click="handleNodeClick"
|
||||
@init="handleNodeClick"
|
||||
ref="assessTreeRef"
|
||||
:current-node-key="currentTreeKey"
|
||||
></AssessTree>
|
||||
</pane>
|
||||
<pane style="background: #fff">
|
||||
<div class="actionButtons mb10">
|
||||
<el-button type="primary" icon="el-icon-Upload">导入数据背景</el-button>
|
||||
<el-button type="primary" icon="el-icon-Memo" @click="assess">评估</el-button>
|
||||
<el-button type="primary" icon="el-icon-Download">导出报告</el-button>
|
||||
<el-button type="primary" icon="el-icon-Upload" @click="handleImportClick">导入数据背景</el-button>
|
||||
<el-upload
|
||||
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 :style="collapseHeight" style="overflow-y: auto">
|
||||
<el-collapse v-model="collapseName" class="pl10 pr10">
|
||||
<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 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>
|
||||
</div>
|
||||
@@ -30,7 +55,8 @@
|
||||
</template>
|
||||
|
||||
<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, Pane } from 'splitpanes'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
@@ -39,6 +65,8 @@ import TableHeader from '@/components/table/header/index.vue'
|
||||
import { mainHeight } from '@/utils/layout'
|
||||
import information from './information.vue'
|
||||
import Outcome from './outcome.vue'
|
||||
import {exportResult,evaluation} from '@/api/advance-boot/assess'
|
||||
import { Loading } from '@element-plus/icons-vue'
|
||||
|
||||
defineOptions({
|
||||
// name: 'harmonic-boot/report/word'
|
||||
@@ -48,6 +76,10 @@ const height = mainHeight(80)
|
||||
const collapseHeight = mainHeight(125)
|
||||
const size = ref(0)
|
||||
const dotList: any = ref({})
|
||||
const infoLoading = ref(false)
|
||||
const outcomeLoading = ref(false)
|
||||
// 添加当前节点 ID 的响应式变量
|
||||
const currentNodeId = ref<string | number | null>(null)
|
||||
|
||||
const tableStore = new TableStore({
|
||||
url: '',
|
||||
@@ -57,14 +89,131 @@ const tableStore = new TableStore({
|
||||
loadCallback: () => {}
|
||||
})
|
||||
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(() => {
|
||||
const dom = document.getElementById('navigation-splitpanes')
|
||||
|
||||
setTimeout(() => {
|
||||
if (dom) {
|
||||
size.value = Math.round((180 / dom.offsetHeight) * 100)
|
||||
@@ -72,8 +221,35 @@ onMounted(() => {
|
||||
}, 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) => {
|
||||
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>
|
||||
<style lang="scss" scoped>
|
||||
@@ -96,4 +272,39 @@ const handleNodeClick = (data: any, node: any) => {
|
||||
display: flex;
|
||||
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>
|
||||
|
||||
@@ -4,34 +4,32 @@
|
||||
<el-collapse v-model="activeNames">
|
||||
<el-collapse-item title="用户参数维护" :name="1">
|
||||
<el-descriptions :column="4" border>
|
||||
<el-descriptions-item label="所在地市">张家口</el-descriptions-item>
|
||||
<el-descriptions-item label="用户名称">名称1</el-descriptions-item>
|
||||
<el-descriptions-item label="用户协议容量(MVA)">100</el-descriptions-item>
|
||||
<el-descriptions-item label="是否包含电容器">否</el-descriptions-item>
|
||||
<el-descriptions-item label="风电场装机容量"></el-descriptions-item>
|
||||
<el-descriptions-item label="所在地市">{{ form.deptName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="用户名称">{{ form.assessName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="用户协议容量(MVA)">{{ form.agreedCapacity }}</el-descriptions-item>
|
||||
<el-descriptions-item label="是否包含电容器">{{ form.withCapacitor }}</el-descriptions-item>
|
||||
<el-descriptions-item :label=windfarmCapacityLabel>{{ form.windfarmCapacity }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</el-collapse-item>
|
||||
<el-collapse-item title="系统参数维护" :name="2">
|
||||
<el-descriptions :column="4" border>
|
||||
<el-descriptions-item label="接入变电站">变电站1</el-descriptions-item>
|
||||
<el-descriptions-item label="变电站电压等级">220V</el-descriptions-item>
|
||||
<el-descriptions-item label="接入母线">母线1</el-descriptions-item>
|
||||
<el-descriptions-item label="母线电压等级">220V</el-descriptions-item>
|
||||
<el-descriptions-item label="供电设备容量(MVA)">100</el-descriptions-item>
|
||||
<el-descriptions-item label="最小短路容量(MVA)">10</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点名称">名称1</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点电网电阻">20</el-descriptions-item>
|
||||
<el-descriptions-item label="长度">30</el-descriptions-item>
|
||||
<el-descriptions-item label="回路数">2</el-descriptions-item>
|
||||
<el-descriptions-item label="导线类型"></el-descriptions-item>
|
||||
<el-descriptions-item label="接入变电站">{{ form.powerstationName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="变电站电压等级">{{ form.powerstationScale }}</el-descriptions-item>
|
||||
<el-descriptions-item label="接入母线">{{ form.busName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="母线电压等级">{{ form.busScale }}</el-descriptions-item>
|
||||
<el-descriptions-item label="供电设备容量(MVA)">{{ form.powersupplyCapacity }}</el-descriptions-item>
|
||||
<el-descriptions-item label="最小短路容量(MVA)">{{ form.minshortcircuitCapacity }}</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点名称">{{ form.lineName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="PCC点电网电阻">{{ form.lineGridreactance }}</el-descriptions-item>
|
||||
<el-descriptions-item label="长度">{{ form.lineLen }}</el-descriptions-item>
|
||||
<el-descriptions-item label="回路数">{{ form.lineNum }}</el-descriptions-item>
|
||||
<el-descriptions-item label="导线类型">{{ form.linetypeId }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</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">
|
||||
<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
|
||||
v-for="(k, index) in item.child"
|
||||
:key="index"
|
||||
@@ -48,205 +46,390 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from 'vue'
|
||||
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 form: any = ref({
|
||||
city: '',
|
||||
windFarms: '',
|
||||
transformer: [
|
||||
{
|
||||
name: '变压器1',
|
||||
name1: '变压器型号1',
|
||||
name2: '100'
|
||||
},
|
||||
{
|
||||
name: '变压器2',
|
||||
name1: '变压器型号2',
|
||||
name2: '100'
|
||||
}
|
||||
], //变压器
|
||||
capacitor: [
|
||||
{
|
||||
name: '电容器1',
|
||||
name1: '20',
|
||||
name2: '100',
|
||||
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'
|
||||
}
|
||||
], //风电
|
||||
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: [] //冲击性负荷
|
||||
})
|
||||
const column: any = ref([
|
||||
{
|
||||
loading: false,
|
||||
name: '变压器参数维护',
|
||||
key: 'transformer',
|
||||
child: [
|
||||
{
|
||||
title: '用户变压器名称',
|
||||
field: 'name'
|
||||
field: 'transName'
|
||||
},
|
||||
{
|
||||
title: '变压器型号',
|
||||
field: 'name1'
|
||||
field: 'transtypeId'
|
||||
},
|
||||
{
|
||||
title: '变压器台数',
|
||||
field: 'name2'
|
||||
field: 'transNum'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
{
|
||||
loading: false,
|
||||
name: '电容器组参数维护',
|
||||
key: 'capacitor',
|
||||
child: [
|
||||
{
|
||||
title: '用户电容器名称',
|
||||
field: 'name'
|
||||
field: 'capacitorName'
|
||||
},
|
||||
{
|
||||
title: '电容器组数量',
|
||||
field: 'name1'
|
||||
field: 'capacitorNum'
|
||||
},
|
||||
{
|
||||
title: '单组容量(kVar)',
|
||||
field: 'name2'
|
||||
field: 'capacitorCapacity'
|
||||
},
|
||||
{
|
||||
title: '电抗率(%)',
|
||||
field: 'name3'
|
||||
field: 'capacitorReactance'
|
||||
},
|
||||
{
|
||||
title: '电压等级',
|
||||
field: 'name4'
|
||||
field: 'capacitorScale'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
loading: false,
|
||||
name: '风电参数',
|
||||
key: 'windPower',
|
||||
child: [
|
||||
{
|
||||
title: '风机名称',
|
||||
field: 'name'
|
||||
field: 'windgeneratorName'
|
||||
},
|
||||
{
|
||||
title: '风机闪变系数',
|
||||
field: 'name1'
|
||||
field: 'flickerCoeff'
|
||||
},
|
||||
{
|
||||
title: '风机额定视在功率',
|
||||
field: 'name2'
|
||||
field: 's'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
loading: false,
|
||||
name: '用户负荷',
|
||||
key: 'load',
|
||||
child: [
|
||||
{
|
||||
title: '配电窒名称',
|
||||
field: 'name'
|
||||
field: 'loadName'
|
||||
},
|
||||
{
|
||||
title: '进线电压',
|
||||
field: 'name1'
|
||||
field: 'linevoltageScale'
|
||||
},
|
||||
{
|
||||
title: '配变容量(kVA)',
|
||||
field: 'name2'
|
||||
field: 'transhighCapacity'
|
||||
},
|
||||
{
|
||||
title: '配电变压器阻抗(%)',
|
||||
field: 'name3'
|
||||
field: 'transImpedance'
|
||||
},
|
||||
{
|
||||
title: '谐波源特性',
|
||||
field: 'name4'
|
||||
field: 'harmId'
|
||||
},
|
||||
{
|
||||
title: '配变低压侧电压',
|
||||
field: 'name5'
|
||||
field: 'translowScale'
|
||||
},
|
||||
{
|
||||
title: '非线性负荷功率(kW)',
|
||||
field: 'name6'
|
||||
field: 'nonlinearloadPower'
|
||||
},
|
||||
{
|
||||
title: '功率因素',
|
||||
field: 'name7'
|
||||
field: 'powerFactor'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
loading: false,
|
||||
name: '冲击性负荷',
|
||||
key: 'impact',
|
||||
child: [
|
||||
{
|
||||
title: '冲击负荷类型',
|
||||
field: 'name'
|
||||
},
|
||||
{
|
||||
title: '冲击负荷功率(MVA)',
|
||||
field: 'name1'
|
||||
field: 'inpactloadtypeId'
|
||||
},
|
||||
{
|
||||
title: '数量',
|
||||
field: 'name2'
|
||||
},
|
||||
{
|
||||
title: '启动方式',
|
||||
field: 'name3'
|
||||
field: 'inpactloadNum'
|
||||
},
|
||||
|
||||
{
|
||||
title: '启动容量倍数',
|
||||
field: 'name4'
|
||||
field: 'inpactloadPower'
|
||||
},
|
||||
{
|
||||
title: '冲击负荷高压侧电压',
|
||||
field: 'name5'
|
||||
title: '高压侧电压',
|
||||
field: 'inpactloadhighScale'
|
||||
},
|
||||
{
|
||||
title: '有无隔离变',
|
||||
field: 'name6'
|
||||
field: 'isIsolationtrans'
|
||||
},
|
||||
{
|
||||
title: '隔离变阻抗(%)',
|
||||
field: 'name7'
|
||||
field: 'isolationtransImpedance'
|
||||
},
|
||||
{
|
||||
title: '低压侧电压',
|
||||
field: 'name8'
|
||||
field: 'inpactloadlowScale'
|
||||
},
|
||||
{
|
||||
title: '负荷频度选择',
|
||||
field: 'name9'
|
||||
field: 'inpactloadFreq'
|
||||
},
|
||||
{
|
||||
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>
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-collapse-item__header) {
|
||||
|
||||
@@ -9,16 +9,16 @@
|
||||
height="110px"
|
||||
v-bind="defaultAttribute"
|
||||
:cell-class-name="getCellClassName"
|
||||
style="width: 60%"
|
||||
style="width: 50%"
|
||||
>
|
||||
<vxe-column title="估算方式" field="name" />
|
||||
<vxe-column title="冲击负荷数量" field="name1" />
|
||||
<vxe-column title="电压波动" field="name2" />
|
||||
<vxe-column title="国标限值" field="name3" />
|
||||
<vxe-column title="冲击负荷数量" field="inPactLoadNum" />
|
||||
<vxe-column title="电压波动" field="data" />
|
||||
<vxe-column title="国标限值" field="limitData" />
|
||||
<vxe-column title="判断">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.name2 > row.name3" type="warning">不合格</el-tag>
|
||||
<el-tag v-else type="success">合格</el-tag>
|
||||
<span v-if="!row.data || row.data === ''"></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>
|
||||
@@ -27,17 +27,16 @@
|
||||
height="110px"
|
||||
v-bind="defaultAttribute"
|
||||
:cell-class-name="getCellClassName"
|
||||
style="width: 40%"
|
||||
style="width: 50%"
|
||||
>
|
||||
<vxe-column title="冲击负荷数量" field="name1" />
|
||||
<vxe-column title="闪变" field="name2" />
|
||||
<vxe-column title="国标限值" field="name3" />
|
||||
<vxe-column title="冲击负荷数量" field="inPactLoadNum" />
|
||||
<vxe-column title="闪变" field="data" />
|
||||
<vxe-column title="国标限值" field="limitData" />
|
||||
<vxe-column title="判断">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.name2 == null"></span>
|
||||
<el-tag v-else-if="row.name2 > row.name3" type="warning">不合格</el-tag>
|
||||
|
||||
<el-tag v-else type="success">合格</el-tag>
|
||||
<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>
|
||||
@@ -49,6 +48,7 @@
|
||||
height="330px"
|
||||
:merge-cells="mergeCells"
|
||||
v-bind="defaultAttribute"
|
||||
:cell-class-name="getCellClassName2"
|
||||
style="width: 100%"
|
||||
>
|
||||
<vxe-column field="name" width="80px">
|
||||
@@ -60,24 +60,28 @@
|
||||
<vxe-column field="name1" title="用户项目负载/出力(%)" min-width="160px" />
|
||||
</vxe-colgroup>
|
||||
<vxe-colgroup title="用户无功设备不运行">
|
||||
<vxe-column field="name2" title="百分比(%)" min-width="90px" />
|
||||
<vxe-column field="name3" title="有名值(%)" min-width="90px" />
|
||||
<vxe-column field="name4" title="上限值(%)" min-width="90px" />
|
||||
<vxe-column field="name5" title="下限值(%)" min-width="90px" />
|
||||
<vxe-column field="capOff.percent" title="百分比(%)" min-width="90px" />
|
||||
<vxe-column field="capOff.voltagePercent" title="有名值(%)" min-width="90px" />
|
||||
<vxe-column field="capOff.capUP" title="上限值(%)" min-width="90px" />
|
||||
<vxe-column field="capOff.capDown" title="下限值(%)" min-width="90px" />
|
||||
<vxe-column title="判断" min-width="80px">
|
||||
<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>
|
||||
</vxe-column>
|
||||
</vxe-colgroup>
|
||||
<vxe-colgroup title="用户无功设备全部运行">
|
||||
<vxe-column field="name6" title="百分比(%)" min-width="90px" />
|
||||
<vxe-column field="name7" title="有名值(%)" min-width="90px" />
|
||||
<vxe-column field="name8" title="上限值(%)" min-width="90px" />
|
||||
<vxe-column field="name9" title="下限值(%)" min-width="90px" />
|
||||
<vxe-column field="capOn.percent" title="百分比(%)" min-width="90px" />
|
||||
<vxe-column field="capOn.voltagePercent" title="有名值(%)" min-width="90px" />
|
||||
<vxe-column field="capOn.capUP" title="上限值(%)" min-width="90px" />
|
||||
<vxe-column field="capOn.capDown" title="下限值(%)" min-width="90px" />
|
||||
<vxe-column title="判断" min-width="80px">
|
||||
<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>
|
||||
</vxe-column>
|
||||
</vxe-colgroup>
|
||||
@@ -92,56 +96,56 @@
|
||||
style="width: 100%"
|
||||
>
|
||||
<vxe-column title="估算方式" field="name" />
|
||||
<vxe-column title="负序电压不平衡度(%)" field="name2" />
|
||||
<vxe-column title="国标限值(%)" field="name3" />
|
||||
<vxe-column title="负序电压不平衡度(%)" field="data" />
|
||||
<vxe-column title="国标限值(%)" field="limitData" />
|
||||
<vxe-column title="判断">
|
||||
<template #default="{ row }">
|
||||
|
||||
<el-tag v-if="row.name2 > row.name3" type="warning">不合格</el-tag>
|
||||
<el-tag v-else type="success">合格</el-tag>
|
||||
<span v-if="!row.data || row.data === ''"></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>
|
||||
</el-collapse-item>
|
||||
<el-collapse-item title="谐波电压/电流评估结果" :name="4">
|
||||
<el-collapse-item title="谐波电流/电压评估结果" :name="4">
|
||||
<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
|
||||
:data="harmonicVoltage"
|
||||
height="520px"
|
||||
v-bind="defaultAttribute"
|
||||
:cell-class-name="getCellClassName"
|
||||
:cell-class-name="getCellClassName3"
|
||||
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-colgroup title="电容器谐波电压评估值(%)">
|
||||
<vxe-column field="name1" title="未投入" min-width="160px" />
|
||||
<vxe-column field="name2" title="已投入" min-width="160px" />
|
||||
<vxe-column field="notInvested" title="未投入" min-width="160px" />
|
||||
<vxe-column field="hasInvested" title="已投入" min-width="160px" />
|
||||
</vxe-colgroup>
|
||||
<vxe-column title="国标限值(%)" field="name3" />
|
||||
<vxe-column title="国标限值(A)" field="limitData" />
|
||||
<vxe-column title="判断">
|
||||
<template #default="{ row }">
|
||||
<span v-if="row.name2 == null"></span>
|
||||
<el-tag v-else-if="row.name2 > row.name3" type="warning">不合格</el-tag>
|
||||
|
||||
<el-tag v-else type="success">合格</el-tag>
|
||||
<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>
|
||||
|
||||
</div>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
@@ -151,117 +155,82 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
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 undulation = ref([
|
||||
{
|
||||
name: '近似计算',
|
||||
name1: '1',
|
||||
name2: '6.94',
|
||||
name3: '3.00'
|
||||
},
|
||||
{
|
||||
name: '精确估算',
|
||||
name1: '1',
|
||||
name2: '6.94',
|
||||
name3: '3.00'
|
||||
inPactLoadNum:'',
|
||||
data:'',
|
||||
limitData:'',
|
||||
}
|
||||
])
|
||||
// 闪变
|
||||
const flicker = ref([
|
||||
{
|
||||
name1: '1',
|
||||
name2: '1.1',
|
||||
name3: '0.8'
|
||||
},
|
||||
{}
|
||||
inPactLoadNum:'',
|
||||
data:'',
|
||||
limitData:'',
|
||||
}
|
||||
])
|
||||
// 电压偏差
|
||||
const voltageDeviation = ref([
|
||||
{
|
||||
name: '电网高峰负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
capOff: {}, // 不投入状态数据
|
||||
capOn: {} // 全部投入状态数据
|
||||
},
|
||||
{
|
||||
name: '电网高峰负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
name1: '60',
|
||||
capOff: {}, // 不投入状态数据
|
||||
capOn: {} // 全部投入状态数据
|
||||
},
|
||||
{
|
||||
name: '电网高峰负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
name1: '0',
|
||||
capOff: {},
|
||||
capOn: {}
|
||||
},
|
||||
{
|
||||
name: '电网低谷负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
capOff: {},
|
||||
capOn: {}
|
||||
},
|
||||
{
|
||||
name: '电网低谷负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
name1: '60',
|
||||
capOff: {},
|
||||
capOn: {}
|
||||
},
|
||||
{
|
||||
name: '电网低谷负荷',
|
||||
name1: '100',
|
||||
name2: '2.14',
|
||||
name3: '107.65',
|
||||
name4: '10.00',
|
||||
name5: '-10.00',
|
||||
name6: '2.14',
|
||||
name7: '107.65',
|
||||
name8: '10.00',
|
||||
name9: '-10.00'
|
||||
name1: '0',
|
||||
capOff: {},
|
||||
capOn: {}
|
||||
}
|
||||
])
|
||||
// 三相电压
|
||||
const imbalance = ref([
|
||||
{
|
||||
name: '近似计算',
|
||||
name2: '2.1',
|
||||
name3: '1.3'
|
||||
name: '严格估算',
|
||||
data: '',
|
||||
limitData: ''
|
||||
},
|
||||
{
|
||||
name: '精确估算',
|
||||
name2: '1.6',
|
||||
name3: '1.3'
|
||||
name: '一般估算',
|
||||
data: '',
|
||||
limitData: ''
|
||||
}
|
||||
])
|
||||
// 谐波电压
|
||||
@@ -274,23 +243,303 @@ const mergeCells = ref([
|
||||
{ row: 3, col: 0, rowspan: 3, colspan: 1 }
|
||||
])
|
||||
// 添加单元格class
|
||||
const getCellClassName = ({ row, columnIndex }) => {
|
||||
if (row.name2 > row.name3 && columnIndex == 2) {
|
||||
const getCellClassName = ({ row, columnIndex }: { row: any; columnIndex: number }) => {
|
||||
if (row.isQualified === false && columnIndex == 1) {
|
||||
return 'custom-cell-bg' // 为 Alice 的单元格添加背景
|
||||
}
|
||||
return ''
|
||||
}
|
||||
onMounted(() => {
|
||||
for (let i = 2; i < 51; i++) {
|
||||
harmonicVoltage.value.push({
|
||||
name: i
|
||||
|
||||
})
|
||||
harmonicCurrents.value.push({
|
||||
name: i
|
||||
})
|
||||
|
||||
//谐波判判合格
|
||||
const getCellClassName3 = ({ row, column, columnIndex }: { row: any; column: any; columnIndex: number }) => {
|
||||
if (column.field === 'notInvested') {
|
||||
if (row.isNotQualified == false && columnIndex == 0) {
|
||||
return 'custom-cell-bg' // 为 Alice 的单元格添加背景
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
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>
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-collapse-item__header) {
|
||||
@@ -298,8 +547,6 @@ onMounted(() => {
|
||||
font-size: 16px !important;
|
||||
&::before {
|
||||
content: '' !important; /* 添加星号 */
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user