import { toRaw } from 'vue' import { customizeHttp } from '@/api/http' import { CreateComponentType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { RequestGlobalConfigType, RequestDataPondItemType } from '@/store/modules/chartEditStore/chartEditStore.d' import { newFunctionHandle } from '@/utils' // 获取类型 type ChartEditStoreType = typeof useChartEditStore // 数据池存储的数据类型 type DataPondMapType = { updateCallback: (...args: any) => any filter?: string | undefined } // 数据池 Map 中请求对应 callback const mittDataPondMap = new Map() // 创建单个数据项轮询接口 const newPondItemInterval = ( requestGlobalConfig: RequestGlobalConfigType, requestDataPondItem: RequestDataPondItemType, dataPondMapItem?: DataPondMapType[] ) => { if (!dataPondMapItem) return // 请求 const fetchFn = async () => { try { const res = await customizeHttp(toRaw(requestDataPondItem.dataPondRequestConfig), toRaw(requestGlobalConfig)) if (res) { try { // 遍历更新回调函数 dataPondMapItem.forEach(item => { item.updateCallback(newFunctionHandle(res?.data, res, item.filter)) }) } catch (error) { console.error(error) return error } } } catch (error) { return error } } // 立即调用 fetchFn() } /** * 数据池接口处理 */ export const useChartDataPondFetch = () => { // 新增全局接口 const addGlobalDataInterface = ( targetComponent: CreateComponentType, useChartEditStore: ChartEditStoreType, updateCallback: (...args: any) => any ) => { const chartEditStore = useChartEditStore() const { requestDataPond } = chartEditStore.getRequestGlobalConfig // 组件对应的数据池 Id const requestDataPondId = '111' || (targetComponent.request.requestDataPondId as string) // 新增数据项 const mittPondIdArr = mittDataPondMap.get(requestDataPondId) || [] mittPondIdArr.push({ updateCallback: updateCallback, filter: targetComponent.filter }) mittDataPondMap.set(requestDataPondId, mittPondIdArr) } // 初始化数据池 const initDataPond = (requestGlobalConfig: RequestGlobalConfigType) => { const { requestDataPond } = requestGlobalConfig // 根据 mapId 查找对应的数据池配置 for (let pondKey of mittDataPondMap.keys()) { const requestDataPondItem = requestDataPond.find(item => item.dataPondId === pondKey) if (requestDataPondItem) { newPondItemInterval(requestGlobalConfig, requestDataPondItem, mittDataPondMap.get(pondKey)) } } } return { addGlobalDataInterface, initDataPond } }