115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | ||
|  * 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<Array>} 所有父级地区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<void>}
 | ||
|      */
 | ||
|     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>} Area实例
 | ||
|      */
 | ||
|     static async init(code) {
 | ||
|         const names = await Area.createByAction(code),
 | ||
|             area = new Area(code)
 | ||
|         area.getName(names)
 | ||
|         return area
 | ||
|     }
 | ||
| }
 |