| import { useQuery, useQueryClient } from '@tanstack/vue-query'; | 
| import * as dictionaryServices from '@/services/api/dictionary'; | 
| import { formatAreaListToTree } from '@/utils'; | 
| import { CascaderProps } from 'element-plus'; | 
|   | 
| export function useGetDictionaryCategorySelect() { | 
|   const { data: dictionaryCategoryList, refetch } = useQuery({ | 
|     queryKey: ['dictionaryServices/getDictionaryCategorySelect'], | 
|     queryFn: async () => { | 
|       let res = await dictionaryServices.getDictionaryCategorySelect({}, { showLoading: false }); | 
|       return res.map((x) => ({ | 
|         ...x, | 
|         fieldNamesMap: x.data.fieldNames ? JSON.parse(x.data.fieldNames) : {}, | 
|       })); | 
|     }, | 
|     placeholderData: () => [] as API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[], | 
|   }); | 
|   | 
|   const queryClient = useQueryClient(); | 
|   | 
|   function ensureQueryData() { | 
|     return queryClient.ensureQueryData< | 
|       API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[] | 
|     >({ | 
|       queryKey: ['dictionaryServices/getDictionaryCategorySelect'], | 
|     }); | 
|   } | 
|   | 
|   function updateDictionaryCategorySelect() { | 
|     queryClient.invalidateQueries({ | 
|       queryKey: ['dictionaryServices/getDictionaryCategorySelect'], | 
|     }); | 
|   } | 
|   | 
|   function getDictionaryCategoryById(id: string) { | 
|     return dictionaryCategoryList.value.find((x) => x.data?.id === id); | 
|   } | 
|   | 
|   function getDictionaryCategoryByCode(code: string) { | 
|     return dictionaryCategoryList.value.find((x) => x.data?.code === code); | 
|   } | 
|   | 
|   function getDictionaryCategoryNameByCode(code: string) { | 
|     return getDictionaryCategoryByCode(code)?.label ?? ''; | 
|   } | 
|   | 
|   return { | 
|     dictionaryCategoryList, | 
|     ensureQueryData, | 
|     getDictionaryCategoryById, | 
|     getDictionaryCategoryNameByCode, | 
|     getDictionaryCategoryByCode, | 
|     updateDictionaryCategorySelect, | 
|   }; | 
| } | 
|   | 
| type UseDictionaryDataSelectOptions = { | 
|   categoryId?: MaybeRef<string>; | 
|   categoryCode?: MaybeRef<CategoryCode>; | 
|   parentId?: MaybeRef<string>; | 
|   staleTime?: number; | 
|   /** 关键字 */ | 
|   keywords?: MaybeRef<string>; | 
|   /** 查询所有 */ | 
|   all?: MaybeRef<boolean>; | 
|   maxDeep?: number; | 
| }; | 
|   | 
| export function useDictionaryDataSelect({ | 
|   categoryId, | 
|   categoryCode, | 
|   parentId, | 
|   staleTime, | 
|   keywords, | 
|   all, | 
|   maxDeep, | 
| }: UseDictionaryDataSelectOptions) { | 
|   const params = computed(() => ({ | 
|     categoryId: unref(categoryId), | 
|     categoryCode: unref(categoryCode), | 
|     parentId: unref(parentId), | 
|     keywords: unref(keywords), | 
|     all: unref(all), | 
|     maxDeep: maxDeep, | 
|   })); | 
|   const { data: dictionaryDataList, refetch } = useQuery({ | 
|     queryKey: ['dictionaryServices/getDictionaryDataSelect', params], | 
|     queryFn: async () => { | 
|       let res = await dictionaryServices.getDictionaryDataSelect(params.value, { | 
|         showLoading: false, | 
|       }); | 
|       return res.map((x) => ({ | 
|         ...x, | 
|         code: x.data?.code ?? '', | 
|       })); | 
|     }, | 
|     placeholderData: () => [] as API.SelectOptionStringGetDictionaryDataSelectQueryResultOption[], | 
|     staleTime, | 
|   }); | 
|   | 
|   function getDictionaryDataNameById(id: string) { | 
|     return dictionaryDataList.value?.find((x) => x.data?.id === id)?.label; | 
|   } | 
|   | 
|   function getDictionaryDataByCode(code: string) { | 
|     return dictionaryDataList.value?.find((x) => x.data?.code === code); | 
|   } | 
|   | 
|   function getDictionaryDataNameByCode(code: string) { | 
|     return getDictionaryDataByCode(code)?.label ?? ''; | 
|   } | 
|   | 
|   const queryClient = useQueryClient(); | 
|   | 
|   function ensureQueryData() { | 
|     return queryClient.ensureQueryData< | 
|       API.SelectOptionStringGetDictionaryDataSelectQueryResultOption[] | 
|     >({ | 
|       queryKey: ['dictionaryServices/getDictionaryDataSelect'], | 
|     }); | 
|   } | 
|   | 
|   function updateDictionaryDataSelect(categoryId?: string) { | 
|     queryClient.invalidateQueries({ | 
|       queryKey: ['dictionaryServices/getDictionaryDataSelect'], | 
|     }); | 
|   } | 
|   | 
|   return { | 
|     dictionaryDataList, | 
|     ensureQueryData, | 
|     refetch, | 
|     getDictionaryDataNameById, | 
|     getDictionaryDataNameByCode, | 
|     getDictionaryDataByCode, | 
|     updateDictionaryDataSelect, | 
|   }; | 
| } | 
|   | 
| export function useArea() { | 
|   const queryClient = useQueryClient(); | 
|   | 
|   function getAreaList(parentId = '') { | 
|     const params = { | 
|       categoryCode: CategoryCode.Area, | 
|       parentId: parentId, | 
|     }; | 
|     return queryClient.fetchQuery({ | 
|       queryKey: ['dictionaryServices/getDictionaryDataSelect', params], | 
|       queryFn: async () => { | 
|         let res = await dictionaryServices.getDictionaryDataSelect(params, { showLoading: false }); | 
|         return res.map(convertDictionaryToAreaTreeNode); | 
|       }, | 
|       staleTime: Infinity, | 
|     }); | 
|   } | 
|   | 
|   return { getAreaList }; | 
| } | 
|   | 
| function convertDictionaryToAreaTreeNode( | 
|   item: API.SelectOptionStringGetDictionaryDataSelectQueryResultOption | 
| ) { | 
|   return { | 
|     children: [], | 
|     areaCode: item.data?.code, | 
|     parentCode: item.data?.parentCode, | 
|     areaName: item.label, | 
|     layer: Number(item.data?.field4), | 
|     quickQuery: item.data?.field2, | 
|     sort: item.data?.sort, | 
|     id: item.data?.id, | 
|   } as API.AreaTreeNode; | 
| } | 
|   | 
| export function useAllAreaList() { | 
|   const { dictionaryDataList } = useDictionaryDataSelect({ | 
|     categoryCode: CategoryCode.Area, | 
|     staleTime: Infinity, | 
|     all: true, | 
|     maxDeep: AreaType.Area, | 
|   }); | 
|   | 
|   const areaList = computed(() => dictionaryDataList.value.map(convertDictionaryToAreaTreeNode)); | 
|   | 
|   const areaTreeProps = { | 
|     children: 'children', | 
|     label: 'areaName', | 
|     value: 'areaCode', | 
|   }; | 
|   | 
|   const areaTree = computed(() => formatAreaListToTree(areaList.value)); | 
|   | 
|   const findAreaCodeFromName = (areaName: string) => { | 
|     const areaItem = areaList.value.find((x) => x.areaName === areaName); | 
|     return areaItem?.areaCode ?? ''; | 
|   }; | 
|   | 
|   const findAreaNameFromCode = (areaCode: string) => { | 
|     const areaItem = areaList.value.find((x) => x.areaCode === areaCode); | 
|     return areaItem?.areaName ?? ''; | 
|   }; | 
|   | 
|   const findAreaItemFromCode = (areaCode: string) => { | 
|     const areaItem = areaList.value.find((x) => x.areaCode === areaCode); | 
|     return areaItem; | 
|   }; | 
|   | 
|   return { | 
|     areaList, | 
|     areaTree, | 
|     areaTreeProps, | 
|     findAreaCodeFromName, | 
|     findAreaNameFromCode, | 
|     findAreaItemFromCode, | 
|   }; | 
| } | 
|   | 
| type UseAreaByCascaderOptions = { | 
|   layer?: AreaType; | 
| }; | 
|   | 
| /** | 
|  * @description 联级选择中使用 | 
|  */ | 
| export function useAreaByCascader(options: UseAreaByCascaderOptions = {}) { | 
|   const { layer = AreaType.Area } = options; | 
|   | 
|   const { getAreaList } = useArea(); | 
|   | 
|   return computed(() => ({ | 
|     props: { | 
|       label: 'areaName', | 
|       value: 'areaCode', | 
|       lazy: true, | 
|       async lazyLoad(node, resolve) { | 
|         const { level, data } = node; | 
|         const areas = (await getAreaList((data as API.AreaTreeNode).id)) as any[]; | 
|   | 
|         return resolve( | 
|           areas.map((x) => ({ | 
|             ...x, | 
|             leaf: x.layer >= layer, | 
|           })) | 
|         ); | 
|       }, | 
|     } as CascaderProps, | 
|   })); | 
| } |