/** * Area类,用于处理地区相关信息 */ export default class Area { /** * 构造函数 * @param {string} code 地区编码 * @param {Object} hash 哈希表 */ 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])) } } /** * 获取地区的行政等级 * @param {string} code 地区编码 * @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 } /** * 根据地区编码获取指定等级的地区编码 * @param {string} value 地区编码 * @param {number} level 指定等级 * @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 } /** * 根据地区id获取所有父级地区id * @param {string} areaId 地区id * @param {Object} ins 请求实例 * @param {string} action 请求地址 * @returns {Promise} 所有父级地区id */ static createByAction(areaId, ins = request, action = "/admin/area/getAllParentAreaId") { return ins.post(action, null, {params: {areaId}, withoutToken: 1}).then(res => res?.data?.reverse() || []) } /** * 获取地区信息 * @param {string} id 地区id * @returns {Object} 地区信息 */ getAreaInfo(id) { let info = {} const currentLevel = Area.getLevelByAreaId(id); for (let i = 0; i <= currentLevel; i++) { info[i] = Area.getAreaCodeByLevel(id, i); } return info } /** * 异步获取地区名称 * @returns {Promise} */ async getAreaName() { const names = await Area.createByAction(this.id); this.getName(names) } /** * 获取地区名称 * @param {Array} names 地区名称数组 */ getName(names) { this.meta = names this.nameMap = names?.map(e => e?.name) || [] this.name = names?.slice(-1)?.[0]?.name this.fullname = this.nameMap.join('') } /** * 异步从数据库中获取地区信息 * @param {string} code 地区编码 * @returns {Promise} Area实例 */ static async init(code) { const names = await Area.createByAction(code), area = new Area(code) area.getName(names) return area } }