You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.8 KiB
171 lines
4.8 KiB
|
3 weeks ago
|
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}`)
|
||
|
|
}
|