134 lines
3.5 KiB
TypeScript
134 lines
3.5 KiB
TypeScript
interface Tree {
|
|
label: string;
|
|
value: number;
|
|
type: string;
|
|
children?: Tree[];
|
|
}
|
|
|
|
/**
|
|
* 楼栋/单元/房屋 转 Tree 结构(跳过楼层)
|
|
* @param buildings 原始楼栋数组
|
|
* @returns Tree[]
|
|
*/
|
|
export function convertBuildingToTree(buildings: any[]): Tree[] {
|
|
if (!buildings || !Array.isArray(buildings)) return [];
|
|
|
|
return buildings.map((building) => {
|
|
// 1. 楼栋
|
|
const buildingTree: Tree = {
|
|
label: building.buildingName || '未知楼栋',
|
|
type: 'buildingId',
|
|
value: building.buildingId,
|
|
children: []
|
|
};
|
|
|
|
// 2. 单元
|
|
const units = building.units || [];
|
|
const unitTrees = units.map((unit: any) => {
|
|
const unitTree: Tree = {
|
|
label: unit.unitNoName,
|
|
value: unit.unitNoId,
|
|
type: 'unitNoId',
|
|
children: []
|
|
};
|
|
|
|
// ====================== 关键修改 ======================
|
|
// 直接从 floors 里把所有 house 全部抽出来,跳过 floor 层级
|
|
const allHouses: any[] = [];
|
|
const floors = unit.floors || [];
|
|
|
|
floors.forEach((floor: any) => {
|
|
const houses = floor.houses || [];
|
|
allHouses.push(...houses); // 把所有房屋合并到一个数组
|
|
});
|
|
|
|
// 房屋直接挂在单元下
|
|
unitTree.children = allHouses.map((house: any) => ({
|
|
label: house.houseNo || '未知房屋',
|
|
value: house.houseId,
|
|
type: 'houseId'
|
|
}));
|
|
// ======================================================
|
|
|
|
return unitTree;
|
|
});
|
|
|
|
buildingTree.children = unitTrees;
|
|
return buildingTree;
|
|
});
|
|
}
|
|
|
|
interface Tree {
|
|
label: string;
|
|
value: number;
|
|
type: string;
|
|
children?: Tree[];
|
|
}
|
|
// 只允许 字符串/数字 类型的 key
|
|
type ValidTreeKey = {
|
|
[K in keyof Tree]: Tree[K] extends string | number ? K : never;
|
|
}[keyof Tree];
|
|
|
|
/**
|
|
* 根据 houseId 查找完整路径(楼栋 > 单元 > 楼层 > 房屋)
|
|
* @param treeData 转换后的树形数据
|
|
* @param houseId 目标房屋ID
|
|
* @returns string[] 路径数组,如 ['1号楼', '1单元', '3层', '301']
|
|
*/
|
|
export function getHousePathById(treeData: Tree[], houseId: string | number, response: ValidTreeKey = 'value'): (string | number)[] {
|
|
const path: (string | number)[] = [];
|
|
|
|
// 递归查找
|
|
function findNode(nodes: Tree[]): boolean {
|
|
for (const node of nodes) {
|
|
path.push(node[response]); // 把当前节点加入路径
|
|
|
|
// 找到目标房屋
|
|
if (node.type === 'houseId' && node.value === houseId) {
|
|
return true;
|
|
}
|
|
|
|
// 递归子节点
|
|
if (node.children && node.children.length > 0) {
|
|
if (findNode(node.children)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
path.pop(); // 回溯,移除当前节点
|
|
}
|
|
return false;
|
|
}
|
|
|
|
findNode(treeData);
|
|
return path;
|
|
}
|
|
|
|
// 对字符串 图片地址,处理
|
|
export function splitStringUrl(str: string, splitLabel: string = ',') {
|
|
const list = str.split(splitLabel);
|
|
const newlist = list
|
|
.map((item) => {
|
|
return {
|
|
name: item.split('/').pop(),
|
|
url: item
|
|
};
|
|
})
|
|
.filter((item) => item.name && item.url);
|
|
return newlist;
|
|
}
|
|
/**
|
|
* 判断 FormData 是否有数据
|
|
* @param formData 要判断的 FormData 对象
|
|
* @returns {boolean} true 有数据 false 没有数据
|
|
*/
|
|
export function hasFormData(formData: FormData): boolean {
|
|
if (!formData || !(formData instanceof FormData)) return false;
|
|
|
|
// 遍历一次,只要有一个字段就返回 true
|
|
for (const entry of formData.entries()) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|