import { store } from '@/store';
|
import { defineStore } from 'pinia';
|
import { formatAreaListToTree } from '@/utils';
|
import * as areaServices from '@/services/api/Area';
|
|
export interface AreaState {
|
/**
|
* 完整的地区数据树
|
*/
|
completeAreaTree: API.AreaTreeNode[];
|
/**
|
* 打平的完整的地区
|
*/
|
completeAreaList: API.AreaDto[];
|
completeAreaTreeDone: boolean;
|
/**
|
* 多个select分步获取地区数据
|
*/
|
provinceList: API.AreaDto[];
|
/**
|
* 储存areaCode下面的子集
|
*/
|
areaMap: Record<API.AreaDto['areaCode'], API.AreaDto[]>;
|
/**
|
* 根据areaCode储存单个area数据
|
*/
|
areaItemMap: Record<API.AreaDto['areaCode'], API.AreaDto>;
|
}
|
|
export const useAreaStore = defineStore({
|
id: 'area',
|
state: (): AreaState => ({
|
completeAreaTree: [],
|
completeAreaTreeDone: false,
|
completeAreaList: [],
|
//----------------------------------
|
provinceList: [],
|
areaMap: {},
|
areaItemMap: {},
|
}),
|
getters: {
|
getAreaFromCompleteAreaList(state) {
|
return (areaCode: number) => state.completeAreaList.find((x) => x.areaCode === areaCode);
|
},
|
getAreaByAreaCode(state) {
|
return (areaCode: number) => state.areaItemMap[areaCode];
|
},
|
getAreaNameByAreaCode() {
|
return (areaCode: number) => {
|
const area = this.getAreaByAreaCode(areaCode);
|
return area ? area.areaName : '';
|
};
|
},
|
getAreaNameByAreaCodeWithParentName() {
|
return (areaCode: number) => {
|
const area = this.getAreaByAreaCode(areaCode);
|
if (area?.parentCode) {
|
const parent = this.getAreaByAreaCode(area.parentCode);
|
return parent ? `${parent.areaName}${area.areaName}` : '';
|
} else {
|
return area ? area.areaName : '';
|
}
|
};
|
},
|
},
|
|
actions: {
|
async getCompleteAreaTree() {
|
try {
|
if (!this.completeAreaList.length) {
|
const res = await areaServices.getAreaList({
|
showLoading: false,
|
});
|
this.completeAreaTreeDone = true;
|
const completeAreaList = res;
|
this.completeAreaTree = formatAreaListToTree(completeAreaList, 0);
|
this.completeAreaList = completeAreaList;
|
this.provinceList = res.filter((x) => !x.parentCode);
|
this.setAreaMap(res);
|
}
|
return this.completeAreaList;
|
} catch (error) {
|
throw error;
|
}
|
},
|
|
setAreaMap(areaList: API.AreaDto[]) {
|
areaList.forEach((item) => {
|
this.areaItemMap[item.areaCode] = item;
|
});
|
},
|
},
|
});
|
|
export function useAreaStoreHook() {
|
return useAreaStore(store);
|
}
|