import { useQuery } from '@tanstack/vue-query'; 
 | 
import { computed } from 'vue'; 
 | 
import { useLifeRechargeContext, AreaInfo } from '@life-payment/core-vue'; 
 | 
// import { AreaType } from '@12333/constants'; 
 | 
  
 | 
export function flattenAreaTree(tree: AreaInfo[]) { 
 | 
  let result = [] as AreaInfo[]; 
 | 
  
 | 
  // 递归函数,用于遍历子节点 
 | 
  function flatten(node: AreaInfo) { 
 | 
    result.push(node); 
 | 
  
 | 
    if (node.children && node.children.length > 0) { 
 | 
      node.children.forEach(flatten); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  // 遍历树的根节点 
 | 
  tree.forEach(flatten); 
 | 
  
 | 
  return result; 
 | 
} 
 | 
  
 | 
export function useArea() { 
 | 
  const { blLifeRecharge } = useLifeRechargeContext(); 
 | 
  
 | 
  const { data: areaStore } = useQuery({ 
 | 
    queryKey: ['blLifeRecharge/getRegionalManagementList'], 
 | 
    queryFn: async () => { 
 | 
      return await blLifeRecharge.services.getRegionalManagementList({ showLoading: false }); 
 | 
    }, 
 | 
    placeholderData: () => [] as AreaInfo[], 
 | 
    staleTime: Infinity, 
 | 
    select(data) { 
 | 
      const areaItemMap: Record<AreaInfo['areaCode'], AreaInfo> = {}; 
 | 
      data.forEach((item) => { 
 | 
        areaItemMap[item.areaCode] = item; 
 | 
      }); 
 | 
      const completeAreaList = flattenAreaTree([...data]); 
 | 
      return { 
 | 
        completeAreaList: completeAreaList, 
 | 
        completeAreaTree: [...data], 
 | 
        // cityAreaTree: formatAreaListToTree(completeAreaList, 0, AreaType.City), 
 | 
        provinceList: [...data], 
 | 
        areaItemMap: areaItemMap, 
 | 
      }; 
 | 
    }, 
 | 
  }); 
 | 
  
 | 
  function getAreaFromCompleteAreaList(areaCode: number) { 
 | 
    return areaStore.value.completeAreaList.find((x) => x.areaCode === areaCode); 
 | 
  } 
 | 
  
 | 
  function getAreaByAreaCode(areaCode: number) { 
 | 
    return areaStore.value.areaItemMap[areaCode]; 
 | 
  } 
 | 
  
 | 
  return { 
 | 
    completeAreaList: computed(() => areaStore.value.completeAreaList), 
 | 
    completeAreaTree: computed(() => areaStore.value.completeAreaTree), 
 | 
    cityAreaTree: computed(() => 
 | 
      areaStore.value.completeAreaTree.map((x) => ({ 
 | 
        ...x, 
 | 
        children: x.children.map((y) => ({ 
 | 
          ...y, 
 | 
          children: undefined, 
 | 
        })), 
 | 
      })) 
 | 
    ), 
 | 
    provinceList: computed(() => areaStore.value.provinceList), 
 | 
    areaItemMap: computed(() => areaStore.value.areaItemMap), 
 | 
    getAreaFromCompleteAreaList, 
 | 
    getAreaByAreaCode, 
 | 
  }; 
 | 
} 
 | 
  
 | 
export function useAllAreaList() { 
 | 
  const { completeAreaTree, provinceList, completeAreaList, cityAreaTree } = useArea(); 
 | 
  
 | 
  const findAreaCodeFromName = (areaName: string) => { 
 | 
    const areaItem = completeAreaList.value.find((x) => x.areaName === areaName); 
 | 
    return areaItem?.areaCode ?? 0; 
 | 
  }; 
 | 
  
 | 
  const findAreaNameFromCode = (areaCode: number) => { 
 | 
    const areaItem = completeAreaList.value.find((x) => x.areaCode === areaCode); 
 | 
    return areaItem?.areaName ?? ''; 
 | 
  }; 
 | 
  
 | 
  const findAreaItemFromCode = (areaCode: number) => { 
 | 
    const areaItem = completeAreaList.value.find((x) => x.areaCode === areaCode); 
 | 
    return areaItem; 
 | 
  }; 
 | 
  
 | 
  return { 
 | 
    findAreaCodeFromName, 
 | 
    findAreaNameFromCode, 
 | 
    findAreaItemFromCode, 
 | 
    areaTreeList: completeAreaTree, 
 | 
    provinceList, 
 | 
    cityAreaTree, 
 | 
  }; 
 | 
} 
 |