feat(energyManagement): 添加水电气树接口

This commit is contained in:
2025-08-27 20:44:00 +08:00
parent e8d2650f9a
commit 8e61d61fdd
3 changed files with 38 additions and 26 deletions

View File

@@ -1,10 +1,9 @@
import type { MeterInfoVO, MeterInfoForm, MeterInfoQuery } from './model'; import type { MeterInfoVO, MeterInfoForm, MeterInfoQuery } from './model'
import type { ID, IDS } from '#/api/common'; import type { ID, IDS, PageResult, TreeNode } from '#/api/common';
import type { PageResult } from '#/api/common';
import { commonExport } from '#/api/helper'; import { commonExport } from '#/api/helper'
import { requestClient } from '#/api/request'; import { requestClient } from '#/api/request'
/** /**
* 查询水电气列表 * 查询水电气列表
@@ -12,7 +11,7 @@ import { requestClient } from '#/api/request';
* @returns 水电气列表 * @returns 水电气列表
*/ */
export function meterInfoList(params?: MeterInfoQuery) { export function meterInfoList(params?: MeterInfoQuery) {
return requestClient.get<PageResult<MeterInfoVO>>('/property/meterInfo/list', { params }); return requestClient.get<PageResult<MeterInfoVO>>('/property/meterInfo/list', { params })
} }
/** /**
@@ -21,7 +20,7 @@ export function meterInfoList(params?: MeterInfoQuery) {
* @returns 水电气列表 * @returns 水电气列表
*/ */
export function meterInfoExport(params?: MeterInfoQuery) { export function meterInfoExport(params?: MeterInfoQuery) {
return commonExport('/property/meterInfo/export', params ?? {}); return commonExport('/property/meterInfo/export', params ?? {})
} }
/** /**
@@ -30,7 +29,7 @@ export function meterInfoExport(params?: MeterInfoQuery) {
* @returns 水电气详情 * @returns 水电气详情
*/ */
export function meterInfoInfo(id: ID) { export function meterInfoInfo(id: ID) {
return requestClient.get<MeterInfoVO>(`/property/meterInfo/${id}`); return requestClient.get<MeterInfoVO>(`/property/meterInfo/${id}`)
} }
/** /**
@@ -39,7 +38,7 @@ export function meterInfoInfo(id: ID) {
* @returns void * @returns void
*/ */
export function meterInfoAdd(data: MeterInfoForm) { export function meterInfoAdd(data: MeterInfoForm) {
return requestClient.postWithMsg<void>('/property/meterInfo', data); return requestClient.postWithMsg<void>('/property/meterInfo', data)
} }
/** /**
@@ -48,7 +47,7 @@ export function meterInfoAdd(data: MeterInfoForm) {
* @returns void * @returns void
*/ */
export function meterInfoUpdate(data: MeterInfoForm) { export function meterInfoUpdate(data: MeterInfoForm) {
return requestClient.putWithMsg<void>('/property/meterInfo', data); return requestClient.putWithMsg<void>('/property/meterInfo', data)
} }
/** /**
@@ -57,5 +56,14 @@ export function meterInfoUpdate(data: MeterInfoForm) {
* @returns void * @returns void
*/ */
export function meterInfoRemove(id: ID | IDS) { export function meterInfoRemove(id: ID | IDS) {
return requestClient.deleteWithMsg<void>(`/property/meterInfo/${id}`); return requestClient.deleteWithMsg<void>(`/property/meterInfo/${id}`)
} }
/**
* 查询水电气树
* @param level
* @returns 水电气树
*/
export function queryTree(meterType: number | string) {
return requestClient.get<TreeNode<Number>[]>(`/property/meterInfo/tree/${meterType}`)
}

View File

@@ -4,8 +4,8 @@ import type { PropType } from 'vue'
import { onMounted, ref } from 'vue' import { onMounted, ref } from 'vue'
import { handleNode } from '@vben/utils' import { handleNode } from '@vben/utils'
import { Empty, Skeleton, Tree } from 'ant-design-vue' import { Empty, Skeleton, Tree } from 'ant-design-vue'
import { communityTree } from "#/api/property/community" import { queryTree } from "#/api/property/energyManagement/meterInfo"
import type { CommunityVO } from "#/api/property/community/model" import type { TreeNode } from '#/api/common'
defineOptions({ inheritAttrs: false }) defineOptions({ inheritAttrs: false })
@@ -31,26 +31,31 @@ const searchValue = defineModel('searchValue', {
default: '', default: '',
}) })
type TreeArray = CommunityVO[] const treeArray = ref<TreeNode[]>([])
const treeArray = ref<TreeArray>([])
/** 骨架屏加载 */ /** 骨架屏加载 */
const showTreeSkeleton = ref<boolean>(true) const showTreeSkeleton = ref<boolean>(true)
async function loadTree() { async function loadTree() {
showTreeSkeleton.value = true showTreeSkeleton.value = true
searchValue.value = '' searchValue.value = ''
selectFloorId.value = [] const ret = await queryTree(1)
const ret = await communityTree(3) handleNode(ret, 3)
const splitStr = '/'
handleNode(ret, 'label', splitStr, function (node: any) {
if (node.level != 3) {
node.disabled = true
}
})
treeArray.value = ret treeArray.value = ret
showTreeSkeleton.value = false showTreeSkeleton.value = false
} }
function handleNode(nodes: any[], level: number) {
nodes.forEach((node) => {
node.key = node.id
if (node.level < level) {
node.disabled = true
}
if (node.children) {
handleNode(node.children, level)
}
})
}
onMounted(loadTree); onMounted(loadTree);
</script> </script>
@@ -59,8 +64,7 @@ onMounted(loadTree);
<Skeleton :loading="showTreeSkeleton" :paragraph="{ rows: 8 }" active class="p-[8px] flex-1 min-h-0"> <Skeleton :loading="showTreeSkeleton" :paragraph="{ rows: 8 }" active class="p-[8px] flex-1 min-h-0">
<div class="bg-background flex h-full flex-col overflow-y-auto rounded-lg"> <div class="bg-background flex h-full flex-col overflow-y-auto rounded-lg">
<div class="h-full overflow-x-hidden px-[8px]"> <div class="h-full overflow-x-hidden px-[8px]">
<Tree v-bind="$attrs" v-if="treeArray.length > 0" v-model:selected-keys="selectFloorId" <Tree v-bind="$attrs" v-if="treeArray.length > 0" :show-line="{ showLeafIcon: false }" :tree-data="treeArray"
:field-names="{ title: 'label', key: 'id' }" :show-line="{ showLeafIcon: false }" :tree-data="treeArray"
:virtual="false" default-expand-all @select="$emit('select')"> :virtual="false" default-expand-all @select="$emit('select')">
<template #title="{ label }"> <template #title="{ label }">
<span v-if="label.indexOf(searchValue) > -1"> <span v-if="label.indexOf(searchValue) > -1">

View File

@@ -257,7 +257,7 @@ function handleSelectFloor() {
<template> <template>
<Page :auto-content-height="true"> <Page :auto-content-height="true">
<div class="flex h-full gap-[8px]"> <div class="flex h-full gap-[8px]">
<FloorTree class="w-[260px]" @select="handleSelectFloor" v-model:select-floor-id="selectFloorId"></FloorTree> <FloorTree class="w-[260px]"></FloorTree>
<div class="flex-1 overflow-hidden"> <div class="flex-1 overflow-hidden">
<div class="row"> <div class="row">
<div class="comparison-section-container"> <div class="comparison-section-container">