123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- 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}`)
- }
|