/**
|
* ChinaLocations For WeApp
|
* @author Tevin
|
*/
|
|
import Taro from '@tarojs/taro';
|
import project from '@project';
|
import { $hostBoot } from '@components/bases/HostBoot';
|
import { Tools } from '@components/common/Tools';
|
|
let locationTreeLv3 = [];
|
let locationTreeLv4 = [];
|
let locationRes = {};
|
let readyCallbacks = [];
|
|
Taro.request({
|
url: $hostBoot.getHost() + project.host.assetsPath + '/datas/ChinaLocations.lv4.min.json',
|
header: {
|
'X-Requested-With': 'XMLHttpRequest',
|
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
'Ax-Rq-Type': 'separation',
|
},
|
credentials: 'same-origin',
|
dataType: 'json',
|
timeout: 30 * 1000,
|
method: 'GET',
|
success: response => {
|
locationRes = response.data;
|
readyCallbacks.forEach(callback => callback());
|
},
|
});
|
|
export class ChinaLocations {
|
|
onReady(callback) {
|
if (Tools.isEmptyObject(locationRes)) {
|
readyCallbacks.push(callback);
|
} else {
|
callback();
|
}
|
}
|
|
_createLocationTree(level) {
|
const treeDatas = [];
|
// lv1-省
|
Object.keys(locationRes).forEach((provinceCode) => {
|
const province = {
|
label: locationRes[provinceCode].name,
|
value: provinceCode,
|
children: [],
|
};
|
// lv2-市
|
const cityContainer = locationRes[provinceCode].children;
|
Object.keys(cityContainer).forEach((cityCode) => {
|
const city = {
|
value: cityCode,
|
area: cityContainer[cityCode].area, // 电话区码
|
children: [],
|
};
|
if (typeof cityContainer[cityCode] === 'string') {
|
city.label = cityContainer[cityCode];
|
} else {
|
city.label = cityContainer[cityCode].name;
|
// lv3-区
|
const distContainer = cityContainer[cityCode].children || {};
|
Object.keys(distContainer).forEach(distCode => {
|
const dist = {
|
value: distCode,
|
};
|
if (typeof distContainer[distCode] === 'string') {
|
dist.label = distContainer[distCode];
|
} else {
|
dist.label = distContainer[distCode].name;
|
// lv4-街
|
if (level === 4) {
|
dist.children = [];
|
const streetContainer = distContainer[distCode].children || {};
|
Object.keys(streetContainer).forEach(streetCode => {
|
const street = {
|
label: streetContainer[streetCode],
|
value: streetCode,
|
};
|
dist.children.push(street);
|
});
|
if (dist.children.length > 0) {
|
dist.children.unshift({
|
label: '( 不选 )',
|
value: '',
|
});
|
}
|
}
|
}
|
city.children.push(dist);
|
});
|
}
|
province.children.push(city);
|
});
|
treeDatas.push(province);
|
});
|
return treeDatas;
|
}
|
|
getLocationTree(level, callback) {
|
this.onReady(() => {
|
if (level === 3) {
|
if (locationTreeLv3.length === 0) {
|
locationTreeLv3 = this._createLocationTree(3);
|
}
|
callback(locationTreeLv3);
|
} else if (level === 4) {
|
if (locationTreeLv4.length === 0) {
|
locationTreeLv4 = this._createLocationTree(4);
|
}
|
callback(locationTreeLv4);
|
}
|
});
|
}
|
|
// 获取省市区拼合文本
|
getRegionText(regions, callback) {
|
this.getRegionNames(regions, address => {
|
callback(address.join(''));
|
});
|
}
|
|
// 省市区名称
|
getRegionNames(regions, callback) {
|
this.onReady(() => {
|
if (typeof regions === 'string') {
|
regions = regions.split(',');
|
}
|
if (!regions || regions.length === 0 || !regions[0]) {
|
callback([]);
|
}
|
let address = [];
|
let tempLocationData = locationRes;
|
regions.forEach((code) => {
|
if (!code || !tempLocationData[code]) {
|
address.push('');
|
tempLocationData = [];
|
} else {
|
if (typeof tempLocationData[code].name === 'string') {
|
address.push(tempLocationData[code].name);
|
} else {
|
address.push(tempLocationData[code]);
|
}
|
tempLocationData = tempLocationData[code].children;
|
}
|
});
|
callback(address);
|
});
|
}
|
|
// 省市区文本转code
|
getRegionCodes(regions, callback) {
|
this.onReady(() => {
|
if (typeof regions === 'string') {
|
regions = regions.split(',');
|
}
|
if (!regions || regions.length === 0 || !regions[0]) {
|
callback([]);
|
}
|
const codes = [];
|
// 省
|
for (let provinceCode in locationRes) {
|
if (locationRes.hasOwnProperty(provinceCode)) {
|
if (locationRes[provinceCode].name === regions[0]) {
|
codes[0] = provinceCode;
|
// 市
|
const provinceContainer = locationRes[provinceCode].children;
|
for (let cityCode in provinceContainer) {
|
if (provinceContainer.hasOwnProperty(cityCode)) {
|
if (provinceContainer[cityCode].name === regions[1]) {
|
codes[1] = cityCode;
|
// 区
|
const distContainer = provinceContainer[cityCode].children;
|
for (let distCode in distContainer) {
|
if (distContainer.hasOwnProperty(distCode)) {
|
if (distContainer[distCode] === regions[2]) {
|
codes[2] = distCode;
|
break;
|
}
|
if (distContainer[distCode].name === regions[2]) {
|
codes[2] = distCode;
|
// 如果存在街道,继续转街道
|
if (regions[3]) {
|
const streetContainer = distContainer[distCode].children;
|
Object.keys(streetContainer).forEach(streetCode => {
|
if (streetContainer[streetCode] === regions[3]) {
|
codes[3] = streetCode;
|
}
|
});
|
}
|
break;
|
}
|
}
|
}
|
break;
|
}
|
}
|
}
|
break;
|
}
|
}
|
}
|
callback(codes);
|
});
|
}
|
|
// 电话区码
|
getRegionsArea(regions, callback) {
|
this.onReady(() => {
|
if (typeof regions === 'string') {
|
regions = regions.split(',');
|
}
|
if (!regions || regions.length === 0 || !regions[0] || !regions[1]) {
|
callback('');
|
return;
|
}
|
// 中文转编码
|
if (!/^\d+$/.test(regions[0])) {
|
this.getRegionCodes(regions, regionsCode => {
|
this.getRegionsArea(regionsCode, callback);
|
});
|
return;
|
}
|
let area = '';
|
// 省
|
for (let provinceCode in locationRes) {
|
if (locationRes.hasOwnProperty(provinceCode)) {
|
if (provinceCode === regions[0]) {
|
// 市
|
const provinceChildren = locationRes[provinceCode].children;
|
for (let cityCode in provinceChildren) {
|
if (provinceChildren.hasOwnProperty(cityCode)) {
|
if (cityCode === regions[1]) {
|
area = provinceChildren[cityCode].area;
|
break;
|
}
|
}
|
}
|
break;
|
}
|
}
|
}
|
callback(area);
|
});
|
}
|
}
|
|
export const $locations = new ChinaLocations();
|