/** * @author wuweiru * @date 2020/12/07 */ import { Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; import { InjectModel } from '@nestjs/mongoose'; import { GeoMapData } from '../model/map'; import { BaseService } from '../../../base/base.service'; import { MongoDBCollection } from '../../../constant'; import { MapPoiSearchResponseType, MapRecodingResponseType } from '../type/map.type'; @Injectable() export class GeoMapDataService extends BaseService { constructor( @InjectModel(MongoDBCollection.GeoMapData) protected readonly model: Model ) { super(model); } async getRecodingData(params: { location: string; radius: string; }): Promise { const geoMapDataList = await this.model.find({ location: { $near: params.location.split(','), $maxDistance: parseInt(params.radius, 10) } }); const recodingData: MapRecodingResponseType[] = []; geoMapDataList.forEach(item => { recodingData.push({ location: item.location, direction: item.direction, businessArea: item.businessArea, distance: item.distance, name: item.name, address: item.address, phone: item.phone, city: item.city, province: item.province }); }); return recodingData; } async getPointOfInterestData(params: { keywords: string; city: string; offset: string; page: string; }): Promise { const regex = new RegExp(params.keywords, 'i'); const filter = { city: params.city, $or: [{ name: { $regex: regex } }, { address: { $regex: regex } }] }; const geoMapDataList = await this.findPageList({ filter, order: { updatedAt: -1 }, skip: parseInt(params.offset, 10) * parseInt(params.page, 10), limit: parseInt(params.offset, 10) }); const poiSearchData: MapPoiSearchResponseType[] = []; geoMapDataList.forEach(item => { poiSearchData.push({ name: item.name, direction: item.direction, typeCode: item.typeCode, address: item.address, location: item.location, phone: item.phone, postCode: item.postCode, distance: item.distance, cityCode: item.cityCode, city: item.city, province: item.province }); }); return poiSearchData; } async insertMapRecoding(params: MapRecodingResponseType[]): Promise { params.forEach(item => { this.model .create({ ...item, location: [ parseFloat(item.location[0].toString()), parseFloat(item.location[1].toString()) ] }) .catch(() => {}); }); } async insertMapPoiSearch(params: MapPoiSearchResponseType[]): Promise { params.forEach(item => { this.model .create({ ...item, location: [ parseFloat(item.location[0].toString()), parseFloat(item.location[1].toString()) ] }) .catch(() => {}); }); } }