Files

171 lines
4.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}`)
}