|  |  |  | 
|---|
|  |  |  | 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({ | 
|---|
|  |  |  | 
|---|
|  |  |  | fieldNamesMap: x.data.fieldNames ? JSON.parse(x.data.fieldNames) : {}, | 
|---|
|  |  |  | })); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | placeholderData: () => | 
|---|
|  |  |  | [] as API.SelectQueryResultOptionGuidGetDictionaryCategorySelectQueryOption[], | 
|---|
|  |  |  | placeholderData: () => [] as API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[], | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const queryClient = useQueryClient(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function ensureQueryData() { | 
|---|
|  |  |  | return queryClient.ensureQueryData< | 
|---|
|  |  |  | API.SelectQueryResultOptionGuidGetDictionaryCategorySelectQueryOption[] | 
|---|
|  |  |  | API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[] | 
|---|
|  |  |  | >({ | 
|---|
|  |  |  | queryKey: ['dictionaryServices/getDictionaryCategorySelect'], | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryCategoryById(id: string) { | 
|---|
|  |  |  | return dictionaryCategoryList.value.find((x) => x.value === id); | 
|---|
|  |  |  | return dictionaryCategoryList.value.find((x) => x.data?.id === id); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryCategoryByCode(code: string) { | 
|---|
|  |  |  | return dictionaryCategoryList.value.find((x) => x.code === code); | 
|---|
|  |  |  | return dictionaryCategoryList.value.find((x) => x.data?.code === code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryCategoryNameByCode(code: string) { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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', categoryId, categoryCode], | 
|---|
|  |  |  | queryKey: ['dictionaryServices/getDictionaryDataSelect', params], | 
|---|
|  |  |  | queryFn: async () => { | 
|---|
|  |  |  | let res = await dictionaryServices.getDictionaryDataSelect( | 
|---|
|  |  |  | { | 
|---|
|  |  |  | categoryId: unref(categoryId), | 
|---|
|  |  |  | categoryCode: unref(categoryCode), | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | { showLoading: false } | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | let res = await dictionaryServices.getDictionaryDataSelect(params.value, { | 
|---|
|  |  |  | showLoading: false, | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | return res.map((x) => ({ | 
|---|
|  |  |  | ...x, | 
|---|
|  |  |  | code: x.data?.code ?? '', | 
|---|
|  |  |  | })); | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | placeholderData: () => | 
|---|
|  |  |  | [] as API.SelectQueryResultOptionGuidGetDictionaryDataSelectQueryResultOption[], | 
|---|
|  |  |  | placeholderData: () => [] as API.SelectOptionStringGetDictionaryDataSelectQueryResultOption[], | 
|---|
|  |  |  | staleTime, | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryDataNameById(id: string) { | 
|---|
|  |  |  | return dictionaryDataList.value?.find((x) => x.value === id)?.label; | 
|---|
|  |  |  | return dictionaryDataList.value?.find((x) => x.data?.id === id)?.label; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryDataByCode(code: string) { | 
|---|
|  |  |  | return dictionaryDataList.value?.find((x) => x.code === code); | 
|---|
|  |  |  | return dictionaryDataList.value?.find((x) => x.data?.code === code); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function getDictionaryDataNameByCode(code: string) { | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function ensureQueryData() { | 
|---|
|  |  |  | return queryClient.ensureQueryData< | 
|---|
|  |  |  | API.SelectQueryResultOptionGuidGetDictionaryDataSelectQueryResultOption[] | 
|---|
|  |  |  | API.SelectOptionStringGetDictionaryDataSelectQueryResultOption[] | 
|---|
|  |  |  | >({ | 
|---|
|  |  |  | queryKey: ['dictionaryServices/getDictionaryDataSelect'], | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function updateDictionaryDataSelect() { | 
|---|
|  |  |  | function updateDictionaryDataSelect(categoryId?: string) { | 
|---|
|  |  |  | queryClient.invalidateQueries({ | 
|---|
|  |  |  | queryKey: ['dictionaryServices/getDictionaryDataSelect'], | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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, | 
|---|
|  |  |  | })); | 
|---|
|  |  |  | } | 
|---|