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,
|
};
|
}
|