132 lines
4.6 KiB
TypeScript
132 lines
4.6 KiB
TypeScript
import { saveProductMetadata } from "@/api/device/product";
|
|
import { saveMetadata } from "@/api/device/instance";
|
|
import type { DeviceInstance } from "../../Instance/typings";
|
|
import type { DeviceMetadata, MetadataItem, MetadataType, ProductItem } from "../../Product/typings";
|
|
import { omit } from "lodash-es";
|
|
|
|
const filterProductMetadata = (data: any[], productMetaData: any[]) => {
|
|
const ids = productMetaData.map((item: any) => item.id)
|
|
const idsSet = new Set(ids)
|
|
return data.filter((a) => !idsSet.has(a.id))
|
|
}
|
|
/**
|
|
* 更新物模型
|
|
* @param type 物模型类型 "events" | "functions" | "properties" | "tags"
|
|
* @param item 物模型数据 【{a},{b},{c}】
|
|
// * @param target product、device
|
|
* @param data product 、device [{event:[1,2,3]]
|
|
* @param onEvent 数据更新回调:更新数据库、发送事件等操作
|
|
*
|
|
*/
|
|
export const updateMetadata = (
|
|
type: MetadataType,
|
|
item: MetadataItem[],
|
|
// target: 'product' | 'device',
|
|
data: ProductItem | DeviceInstance,
|
|
onEvent?: (item: string) => void,
|
|
): ProductItem | DeviceInstance => {
|
|
if (!data) return data;
|
|
const metadata = JSON.parse(data.metadata || '{}') as DeviceMetadata;
|
|
// let productMetaData
|
|
|
|
// if ((data as DeviceInstance).productMetadata) {
|
|
// productMetaData = JSON.parse((data as DeviceInstance).productMetadata)
|
|
// }
|
|
//
|
|
// if (productMetaData) {
|
|
// if (productMetaData.properties && productMetaData.properties.length) {
|
|
// metadata.properties = filterProductMetadata(item, productMetaData.properties)
|
|
// }
|
|
// if (productMetaData.functions && productMetaData.functions.length) {
|
|
// metadata.functions = filterProductMetadata(item, productMetaData.functions)
|
|
// }
|
|
// if (productMetaData.events && productMetaData.events.length) {
|
|
// metadata.events = filterProductMetadata(item, productMetaData.events)
|
|
// }
|
|
// if (productMetaData.tags && productMetaData.tags.length) {
|
|
// metadata.tags = filterProductMetadata(item, productMetaData.tags)
|
|
// }
|
|
// } else {
|
|
// metadata[type] = item as any
|
|
// }
|
|
// console.log(metadata, type)
|
|
metadata[type] = (item || []).sort((a, b) => b?.sortsIndex - a?.sortsIndex) as any[]
|
|
|
|
data.metadata = JSON.stringify(metadata);
|
|
onEvent?.(data.metadata)
|
|
|
|
return data;
|
|
};
|
|
|
|
/**
|
|
* 保存物模型数据到服务器
|
|
* @param type 类型
|
|
* @param data 数据
|
|
*/
|
|
export const asyncUpdateMetadata = (
|
|
type: 'product' | 'device',
|
|
data: ProductItem | DeviceInstance,
|
|
): Promise<any> => {
|
|
switch (type) {
|
|
case 'product':
|
|
return saveProductMetadata(data);
|
|
case 'device':
|
|
const metadata = JSON.parse(data.metadata || '{}')
|
|
const productMetaData = JSON.parse(data?.productMetadata || '{}')
|
|
const dealMetadata = JSON.parse(data.metadata || '{}')
|
|
// 筛选出产品的物模型 剔除不传递给接口保存
|
|
const productMetaDataMap = new Map()
|
|
|
|
Object.keys(productMetaData).forEach((key:any)=>{
|
|
console.log('asyncUpdateMetadata',productMetaData, key)
|
|
if(Array.isArray(productMetaData[key])){
|
|
const ids = productMetaData[key].map((item:any)=>{
|
|
return item.id
|
|
})
|
|
productMetaDataMap.set(key,ids)
|
|
}
|
|
})
|
|
Object.keys(metadata).forEach((key:any)=>{
|
|
if(Array.isArray(metadata[key])){
|
|
dealMetadata[key] = metadata[key].filter((item:any,index:number)=>{
|
|
//判断产品物模型是否有该id
|
|
return !(productMetaDataMap.get(key) && productMetaDataMap.get(key).includes(item.id))
|
|
})
|
|
}
|
|
})
|
|
|
|
const newMetadata = Object.keys(metadata).reduce((prev, key) => {
|
|
const productIds = new Set(productMetaData[key]?.map(item => item.id) || [])
|
|
console.log(metadata[key])
|
|
prev[key] = metadata[key].filter(item => !productIds.has(item.id))
|
|
return prev
|
|
}, { })
|
|
|
|
console.log(dealMetadata, newMetadata)
|
|
|
|
return saveMetadata(data.id, newMetadata);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 删除物模型数据
|
|
* @param type 物模型类型
|
|
* @param item 删除的数据
|
|
* @param data 设备/产品数据
|
|
* @param onEvent 回调
|
|
*/
|
|
export const removeMetadata = (
|
|
type: MetadataType,
|
|
item: MetadataItem[],
|
|
data: ProductItem | DeviceInstance,
|
|
onEvent?: (type: 'remove', item: MetadataItem) => void,
|
|
): ProductItem | DeviceInstance => {
|
|
const metadata = JSON.parse(data.metadata || '{}') as DeviceMetadata;
|
|
const config = (metadata[type] || []) as MetadataItem[];
|
|
// @ts-ignore
|
|
metadata[type] = config.filter((i) => !item.map((r) => r.id).includes(i.id));
|
|
onEvent?.('remove', item);
|
|
data.metadata = JSON.stringify(metadata);
|
|
return data;
|
|
};
|