2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* Area类,用于处理地区相关信息
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
export default class Area {
|
2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 构造函数
|
|
|
|
|
|
* @param {string} code 地区编码
|
|
|
|
|
|
* @param {Object} hash 哈希表
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
constructor(code, hash = {}) {
|
|
|
|
|
|
this.id = code
|
|
|
|
|
|
this.level = Area.getLevelByAreaId(code)
|
|
|
|
|
|
this.areaMap = Object.values(this.getAreaInfo(code))
|
|
|
|
|
|
if (Object.keys(hash).length > 0) {
|
|
|
|
|
|
this.getName(this.areaMap.map(id => hash[id]))
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取地区的行政等级
|
2023-03-23 18:19:52 +08:00
|
|
|
|
* @param {string} code 地区编码
|
2022-11-29 18:27:14 +08:00
|
|
|
|
* @returns {number}
|
|
|
|
|
|
*/
|
|
|
|
|
|
static getLevelByAreaId(code) {
|
|
|
|
|
|
if (code) {
|
|
|
|
|
|
if (code.length === 2 || /0{10}$/.test(code)) return 0;
|
|
|
|
|
|
else if (/0{8}$/.test(code)) return 1;
|
|
|
|
|
|
else if (/0{6}$/.test(code)) return 2;
|
|
|
|
|
|
else if (/0{3}$/.test(code)) return 3;
|
|
|
|
|
|
else return 4
|
|
|
|
|
|
} else return -1
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 根据地区编码获取指定等级的地区编码
|
2023-03-23 18:19:52 +08:00
|
|
|
|
* @param {string} value 地区编码
|
|
|
|
|
|
* @param {number} level 指定等级
|
2022-11-29 18:27:14 +08:00
|
|
|
|
* @returns {string|null|*}
|
|
|
|
|
|
*/
|
|
|
|
|
|
static getAreaCodeByLevel(value, level) {
|
|
|
|
|
|
if (value) {
|
|
|
|
|
|
const areaNumber = value.toString();
|
|
|
|
|
|
switch (level) {
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
return areaNumber.substring(0, 2) + '0000000000';
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
return areaNumber.substring(0, 4) + '00000000';
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
return areaNumber.substring(0, 6) + '000000';
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
return areaNumber.substring(0, 9) + '000';
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
return areaNumber
|
|
|
|
|
|
}
|
|
|
|
|
|
} else return null
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 根据地区id获取所有父级地区id
|
|
|
|
|
|
* @param {string} areaId 地区id
|
|
|
|
|
|
* @param {Object} ins 请求实例
|
|
|
|
|
|
* @param {string} action 请求地址
|
|
|
|
|
|
* @returns {Promise<Array>} 所有父级地区id
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
static createByAction(areaId, ins = request, action = "/admin/area/getAllParentAreaId") {
|
|
|
|
|
|
return ins.post(action, null, {params: {areaId}, withoutToken: 1}).then(res => res?.data?.reverse() || [])
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取地区信息
|
|
|
|
|
|
* @param {string} id 地区id
|
|
|
|
|
|
* @returns {Object} 地区信息
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
getAreaInfo(id) {
|
|
|
|
|
|
let info = {}
|
|
|
|
|
|
const currentLevel = Area.getLevelByAreaId(id);
|
|
|
|
|
|
for (let i = 0; i <= currentLevel; i++) {
|
|
|
|
|
|
info[i] = Area.getAreaCodeByLevel(id, i);
|
|
|
|
|
|
}
|
|
|
|
|
|
return info
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 异步获取地区名称
|
|
|
|
|
|
* @returns {Promise<void>}
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
async getAreaName() {
|
|
|
|
|
|
const names = await Area.createByAction(this.id);
|
|
|
|
|
|
this.getName(names)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-03-23 18:19:52 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 获取地区名称
|
|
|
|
|
|
* @param {Array} names 地区名称数组
|
|
|
|
|
|
*/
|
2022-11-29 18:27:14 +08:00
|
|
|
|
getName(names) {
|
|
|
|
|
|
this.meta = names
|
2023-03-23 18:19:52 +08:00
|
|
|
|
this.nameMap = names?.map(e => e?.name) || []
|
2022-11-29 18:27:14 +08:00
|
|
|
|
this.name = names?.slice(-1)?.[0]?.name
|
|
|
|
|
|
this.fullname = this.nameMap.join('')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 异步从数据库中获取地区信息
|
2023-03-23 18:19:52 +08:00
|
|
|
|
* @param {string} code 地区编码
|
|
|
|
|
|
* @returns {Promise<Area>} Area实例
|
2022-11-29 18:27:14 +08:00
|
|
|
|
*/
|
|
|
|
|
|
static async init(code) {
|
|
|
|
|
|
const names = await Area.createByAction(code),
|
|
|
|
|
|
area = new Area(code)
|
|
|
|
|
|
area.getName(names)
|
|
|
|
|
|
return area
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|