china-division
Version:
中华人民共和国行政区划:省份、城市、区县、乡镇(街道)、村(居)委会
171 lines (149 loc) • 4.88 kB
JavaScript
const _ = require('lodash')
const { Province, City, Area, Street } = require('./sqlite')
const cField = ['code', 'name']
const fField = cField.concat('children')
/**
* 获取省市二级联动数据
* @author https://github.com/modood
* @datetime 2018-02-01 22:08
*/
exports.getAddressPC = async () => {
const res = await Province.findAll({
include: [{ model: City,
include: [{ model: Area }] }] })
const count = res.length
let index = 0
// 特殊处理:出于实用性考虑,过滤没有太大用处的二级名称,
// 并使用其第三级(县级)补进
const f = ['市辖区', '县', '省直辖县级行政区划', '自治区直辖县级行政区划']
const r = {}
const rC = _.map(res, p => {
index++
const pd = p.dataValues
const { code, name } = pd
log(index, count, code, name, 2)
const arr = []
pd.children = _.map(_.filter(p.cities, c => {
const { dataValues: { name }, areas } = c
if (f.includes(name)) {
arr.push(..._.map(areas, a => _.pick(a.dataValues, cField)))
return false
}
return true
}), c => _.pick(c.dataValues, cField))
pd.children.push(...arr)
r[pd.name] = pd.children.map(c => c.name)
return _.pick(pd, fField)
})
return [r, rC]
}
/**
* 获取省市区三级联动数据
* @author https://github.com/modood
* @datetime 2018-02-01 22:13
*/
exports.getAddressPCA = async () => {
const res = await Province.findAll({
include: [{ model: City,
include: [{ model: Area }] }] })
// 特殊处理:中山市、东莞市、儋州市和嘉峪关市没有第三级(县级),
// 嘉峪关市有第三级,但是有且只有一个(市辖区:620201),
// 出于实用性考虑,使用第四级(乡级)补进
const f = ['4419', '4420', '4604', '6202']
const streets = await Promise.all(
_.map(f, cityCode => Street.findAll({ where: { cityCode } })))
const count = res.length
let index = 0
const r = {}
const rC = _.map(res, p => {
index++
const pd = p.dataValues
const { code, name } = pd
r[pd.name] = {}
log(index, count, code, name, 3)
pd.children = _.map(p.cities, c => {
const cd = c.dataValues
const { code, name } = cd
log(index, count, code, name, 3)
const idx = f.indexOf(code)
if (idx !== -1) {
cd.children = _.map(streets[idx], s => {
// 特殊处理:第四级(乡级)过滤掉“办事处”后缀
const sd = s.dataValues
sd.name = sd.name.replace('办事处', '')
return _.pick(sd, cField)
})
} else {
cd.children = _.map(c.areas, a =>
_.pick(a.dataValues, cField))
}
r[pd.name][cd.name] = _.map(cd.children, i => i.name)
return _.pick(cd, fField)
})
return _.pick(pd, fField)
})
return [r, rC]
}
/**
* 获取省市区镇四级联动数据
* @author https://github.com/modood
* @datetime 2018-02-02 09:51
*/
exports.getAddressPCAS = async () => {
const res = await Province.findAll({
include: [{ model: City,
include: [{ model: Area,
include: [{ model: Street }] }] }] })
const count = res.length
let index = 0
const r = {}
const rC = _.map(res, p => {
index++
const pd = p.dataValues
const { code, name } = pd
r[pd.name] = {}
log(index, count, code, name, 4)
pd.children = _.map(p.cities, c => {
const cd = c.dataValues
const { code, name } = cd
r[pd.name][cd.name] = {}
log(index, count, code, name, 4)
cd.children = _.map(c.areas, a => {
const ad = a.dataValues
const { code, name } = ad
log(index, count, code, name, 4)
ad.children = _.map(a.streets, s => {
// 特殊处理:第四级(乡级)过滤掉“办事处”后缀
const sd = s.dataValues
sd.name = sd.name.replace('办事处', '')
return _.pick(sd, cField)
})
r[pd.name][cd.name][ad.name] = _.map(ad.children, s => s.name)
return _.pick(ad, fField)
})
return _.pick(cd, fField)
})
return _.pick(pd, fField)
})
return [r, rC]
}
function log (index, total, code, name, type) {
if (index >= 0 && index <= 9) index = `0${index}`
const clen = code.length
if ((type === 3 && clen === 2) ||
(type === 4 && clen === 4)) code = `${code} `
else if (type === 4 && clen === 2) code = `${code} `
let text = ''
switch (type) {
case 2:
text = '正在格式化省市二级联动数据'
break
case 3:
text = '正在格式化省市区三级联动数据,请耐心等候'
break
case 4:
text = '正在格式化省市区镇四级联动数据,该步骤比较耗时,请耐心等候'
break
}
console.log(`[${index}/${total}]${text} ${code} ${name}`)
}