|
/*! UTF8 */ |
|
//Автор: mdemyanov |
|
//Дата создания: 27.03.2020 |
|
//Код: |
|
//Код модуля: dadataCleaner |
|
//Назначение: |
|
/** |
|
* Методы стандартизации через сервис DADATA |
|
* @method cleanAddress нормализует адрес, а также находит его координаты |
|
* @method cleanAddresses нормализует коллекцию адресов, а также находит их координаты |
|
* Вызывать в скриптах через обращение к модулю: modules.dadataCleaner.cleanAddress('Екатеринбург, Ленина 47') |
|
*/ |
|
//Версия: 4.8.* |
|
//Категория: |
|
//Параметры------------------------------------------------------ |
|
package ru.naumen.dadata.cleaner |
|
import java.lang.reflect.Type |
|
|
|
import groovyx.net.http.HTTPBuilder |
|
import org.apache.http.client.config.RequestConfig |
|
import org.apache.http.impl.client.HttpClients |
|
|
|
import static groovyx.net.http.Method.POST |
|
import static groovyx.net.http.ContentType.JSON |
|
import com.google.gson.Gson |
|
import com.google.gson.GsonBuilder |
|
import com.google.gson.FieldNamingPolicy |
|
import com.google.gson.reflect.TypeToken |
|
|
|
class Constants { |
|
static final Integer DEFAULT_TIMEOUT_IN_MILLISECONDS = 30000 |
|
static final String ROOT_HOST_CODE = 'cleanerURL' |
|
static final String ROOT_TOKEN_CODE = 'cleanerToken' |
|
static final String ROOT_SECRET_CODE = 'cleanerKey' |
|
} |
|
|
|
class CleanerApi { |
|
HTTPBuilder http |
|
Gson gson |
|
CleanerApi(String host, String token, String secret, Integer timeout) { |
|
http = new HTTPBuilder(host) |
|
http.client = HttpClients.custom().setDefaultRequestConfig( |
|
RequestConfig.custom() |
|
.setConnectionRequestTimeout(timeout) |
|
.setConnectTimeout(timeout) |
|
.setSocketTimeout(timeout) |
|
.build() |
|
).build() |
|
http.setHeaders([ |
|
'Authorization': 'Token ' + token, |
|
'X-Secret': secret |
|
]) |
|
gson = new GsonBuilder() |
|
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) |
|
.create() |
|
} |
|
def <T> T post(String path, def data, Type type) { |
|
T serverResponse |
|
http.request(POST, JSON) { req -> |
|
uri.path = path |
|
headers.Accept = JSON |
|
body = data |
|
|
|
response.success = { def resp, def reader -> |
|
serverResponse = gson.fromJson(gson.toJson(reader), type) |
|
} |
|
|
|
response.failure = { def resp, def reader -> |
|
throw new Exception(reader.inspect()) |
|
} |
|
} |
|
return serverResponse |
|
} |
|
} |
|
|
|
class Address { |
|
String source |
|
String result |
|
String geoLat |
|
String geoLon |
|
|
|
static List<Address> fromString(List<String> sourceAddresses, CleanerApi cleanerApi) { |
|
return cleanerApi.<List<Address>>post( |
|
'/api/v1/clean/address', |
|
sourceAddresses, |
|
new TypeToken<List<Address>>() {}.getType() |
|
) |
|
} |
|
} |
|
//Функции-------------------------------------------------------- |
|
/** |
|
* Получить экземпляр api для всзаимодействия с внешним сервисом |
|
* */ |
|
CleanerApi getCleanerApi() { |
|
def root = utils.get('root', [:]) |
|
return new CleanerApi( |
|
root[Constants.ROOT_HOST_CODE], |
|
root[Constants.ROOT_TOKEN_CODE], |
|
root[Constants.ROOT_SECRET_CODE], |
|
Constants.DEFAULT_TIMEOUT_IN_MILLISECONDS |
|
) |
|
} |
|
/** |
|
* Нормализовать адрес и получить координаты: |
|
* @param sourceAddress строка с исходным адресом |
|
* @result Address объект с параметрами |
|
* - source исходный адрес |
|
* - result нормализованный адрес |
|
* - lat широта |
|
* - lon долгота |
|
* */ |
|
Address cleanAddress(String sourceAddress, CleanerApi cleanerApi = cleanerApi) { |
|
return cleanAddresses([sourceAddress], cleanerApi)[0] |
|
} |
|
/** |
|
* Нормализовать адреса и получить их координаты: |
|
* @param sourceAddresses массив строк с исходными адресами |
|
* @result массив Address объектов с параметрами |
|
* - source исходный адрес |
|
* - result нормализованный адрес |
|
* - lat широта |
|
* - lon долгота |
|
* */ |
|
List<Address> cleanAddresses(List<String> sourceAddresses, CleanerApi cleanerApi = cleanerApi) { |
|
return Address.fromString(sourceAddresses, cleanerApi) |
|
} |
|
//Блок для проверки работосмособности в консоли> ---------------- |
|
return Address.fromString('Екатеринбург, Ленина 47', new CleanerApi( |
|
'https://cleaner.dadata.ru', |
|
'c2ab82ece9b9b6e81be6827eb4a7f849e5f7c2d4', |
|
'5444270950afcdfa89cf08e8c6bd24789b4b32db', |
|
3000 |
|
)).result |
|
|
|
def addresses = cleanAddresses(['Екатеринбург, Ленина 47', 'Екб, татищева 47а']) |
|
return addresses |
|
.collect { address -> |
|
"Адрес: ${address.result}, широта: ${address.geoLat}, долгота: ${address.geoLon}" |
|
}.join('<br/>') |