From fea063f5c7fdf79d56ada2dd2b8045a44ca2db44 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 08 八月 2025 15:17:55 +0800
Subject: [PATCH] feat: 任务

---
 src/hooks/dic.ts |  276 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 237 insertions(+), 39 deletions(-)

diff --git a/src/hooks/dic.ts b/src/hooks/dic.ts
index e256f01..bd004f1 100644
--- a/src/hooks/dic.ts
+++ b/src/hooks/dic.ts
@@ -1,54 +1,252 @@
-import * as searchSettingServices from '@/services/api/SearchSetting';
-import { useQuery } from '@tanstack/vue-query';
-import { useQueryClient } from '@tanstack/vue-query';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
+import * as dictionaryServices from '@/services/api/dictionary';
+import { formatAreaListToTree } from '@/utils';
+import { CascaderProps } from 'element-plus';
 
-type UseSearchSettingTypeOptions = {
-  searchType: number;
-  belongType?: number;
-  onSuccess?: (data: API.GetTypeSearchSettingList[]) => any;
-};
-
-export function useSearchSettingType({
-  searchType,
-  belongType = null,
-  onSuccess,
-}: UseSearchSettingTypeOptions) {
-  const { data, refetch } = useQuery({
-    queryKey: ['searchSettingServices/getTypeSearchSettingList', { searchType, belongType }],
+export function useGetDictionaryCategorySelect() {
+  const { data: dictionaryCategoryList, refetch } = useQuery({
+    queryKey: ['dictionaryServices/getDictionaryCategorySelect'],
     queryFn: async () => {
-      return await searchSettingServices.getTypeSearchSettingList(
-        {
-          searchType: searchType,
-          belongType: belongType,
-        },
-        { showLoading: false }
-      );
+      let res = await dictionaryServices.getDictionaryCategorySelect({}, { showLoading: false });
+      return res.map((x) => ({
+        ...x,
+        fieldNamesMap: x.data.fieldNames ? JSON.parse(x.data.fieldNames) : {},
+      }));
     },
-    placeholderData: () => [] as API.GetTypeSearchSettingList[],
-    onSuccess(data) {
-      onSuccess?.(data);
-    },
+    placeholderData: () => [] as API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[],
   });
 
   const queryClient = useQueryClient();
 
-  async function ensureSearchSettingType() {
-    return await queryClient.ensureQueryData({
-      queryKey: [
-        'searchSettingServices/getTypeSearchSettingList',
-        { searchType: searchType, belongType: belongType },
-      ],
+  function ensureQueryData() {
+    return queryClient.ensureQueryData<
+      API.SelectOptionGuidGetDictionaryCategorySelectQueryOption[]
+    >({
+      queryKey: ['dictionaryServices/getDictionaryCategorySelect'],
     });
   }
 
-  function getSearchSettingTypeNameById(id: string) {
-    return data.value.find((x) => x.id === id)?.name ?? '';
+  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 {
-    searchSettingTypeList: data,
-    ensureSearchSettingType,
-    refetchSearchSettingType: refetch,
-    getSearchSettingTypeNameById,
+    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: '',
+    areaName: item.label,
+    layer: Number(item.data?.field4),
+    sort: item.data?.sort,
+    id: item.data?.id,
+  } as API.AreaTreeNode;
+}
+
+/**
+ *
+ * @description 鏆傛椂鏃犳硶浣跨敤
+ */
+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,
+  }));
+}

--
Gitblit v1.9.1