wupengfei
昨天 9e5a47d90455c4770815d32899f660b53fc27110
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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,
  };
}