Refactoring google maps api

This commit is contained in:
2025-07-30 15:15:22 +02:00
committed by GiuseppeS
parent bea182eea9
commit 5a0cfd160f
23 changed files with 678 additions and 418 deletions

View File

@@ -1,44 +0,0 @@
package it.integry.ems.controller;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.MapService;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.types.LatLng;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@RestController
@Scope("request")
public class MapController {
private final Logger logger = LogManager.getLogger();
@Autowired
private MapService mapService;
@RequestMapping(value = EmsRestConstants.PATH_MAP_GETCOORDINATE_BY_CITY, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse getCoordinateByCity(HttpServletRequest request,
@RequestParam String cityName) {
ServiceRestResponse resp;
try {
LatLng coordinates = mapService.getCoordinateByCity(cityName);
resp = ServiceRestResponse.createPositiveResponse(coordinates);
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
resp = ServiceRestResponse.createNegativeResponse();
}
return resp;
}
}

View File

@@ -1,110 +0,0 @@
package it.integry.ems.service;
import com.google.maps.GeoApiContext;
import com.google.maps.GeocodingApi;
import com.google.maps.model.AddressComponent;
import com.google.maps.model.AddressComponentType;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.Geometry;
import it.integry.ems_model.types.LatLng;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
@Service
public class MapService {
@Autowired
private KeyManagerService keyManagerService;
public LatLng getCoordinateByCity(String cityName) throws Exception {
GeoApiContext context = new GeoApiContext.Builder()
.apiKey(getApiKey())
.build();
GeocodingResult[] results = GeocodingApi.geocode(context, cityName).await();
if (results != null && results.length > 0) {
Geometry geometry = results[0].geometry;
LatLng latLngIntegry = new LatLng();
latLngIntegry.set(new BigDecimal(geometry.location.lat), new BigDecimal(geometry.location.lng));
return latLngIntegry;
}
return null;
}
public IndirizzoDTO geocode(String address) throws Exception {
GeoApiContext gtx = new GeoApiContext.Builder().apiKey(getApiKey()).build();
GeocodingResult[] results = GeocodingApi.geocode(gtx, address).await();
return geocodeToDto(results);
}
/**
* @param results
* @return
* @throws Exception
*/
public IndirizzoDTO geocodeToDto(GeocodingResult[] results) throws Exception {
if (results.length > 0) {
IndirizzoDTO indirizzoDTO = new IndirizzoDTO();
for (AddressComponent component : results[0].addressComponents) {
List<AddressComponentType> types = Arrays.asList(component.types);
if (types.contains(AddressComponentType.ROUTE)) {
indirizzoDTO.setVia(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.STREET_NUMBER)) {
indirizzoDTO.setNumeroCivico(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.COUNTRY)) {
indirizzoDTO.setNazione(component.shortName.toUpperCase());
} else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_2)) {
indirizzoDTO.setProv(component.shortName.toUpperCase());
} else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_3) || types.contains(AddressComponentType.LOCALITY)) { // LOCALITY
indirizzoDTO.setCitta(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.POSTAL_CODE)) {
indirizzoDTO.setCap(component.longName.toUpperCase());
}
}
if (indirizzoDTO.getVia() != null) {
String indirizzo = indirizzoDTO.getVia();
if (indirizzoDTO.getNumeroCivico() != null) {
indirizzo += ", " + indirizzoDTO.getNumeroCivico();
}
indirizzoDTO.setIndirizzo(indirizzo);
}
indirizzoDTO.setLat(BigDecimal.valueOf(results[0].geometry.location.lat));
indirizzoDTO.setLng(BigDecimal.valueOf(results[0].geometry.location.lng));
// String address = (results[0].formattedAddress);
return indirizzoDTO;
}
return null;
}
/**
* @param lat
* @param lng
* @return
* @throws Exception
*/
public IndirizzoDTO reverseGeocode(double lat, double lng) throws Exception {
GeoApiContext gtx = new GeoApiContext.Builder().apiKey(getApiKey()).build();
com.google.maps.model.LatLng coords = new com.google.maps.model.LatLng();
coords.lat = lat;
coords.lng = lng;
GeocodingResult[] results = GeocodingApi.reverseGeocode(gtx, coords).await();
return geocodeToDto(results);
}
private String getApiKey() throws Exception {
return keyManagerService.getGmapsApiKey();
}
}

View File

@@ -0,0 +1,62 @@
package it.integry.ems.service.comuni.controller;
import it.integry.common.var.CommonConstants;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.comuni.base.CapCittaProv;
import it.integry.ems.service.comuni.dto.SavePositionRequestDTO;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems.service.comuni.service.ComuniService;
import it.integry.ems_model.utility.UtilityString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@Scope("request")
public class ComuniController {
@Autowired
private ComuniService comuniService;
@PostMapping(value = "savePosition")
public ServiceRestResponse savePosition(@RequestParam(CommonConstants.PROFILE_DB) String config,
@RequestBody SavePositionRequestDTO request) throws Exception {
return ServiceRestResponse.createPositiveResponse(comuniService.savePosition(request));
}
@PostMapping(value = "infoComuni")
public ServiceRestResponse getInfoComuni(@RequestParam(required = false) String nome,
@RequestParam(required = false) String cap,
@RequestParam(required = false) String codiceCatastale,
@RequestParam(required = false) String indirizzo,
@RequestParam(required = false) String prov,
@RequestParam(required = false) String regione) throws ComuniException {
List<Comune> filteredComuni = comuniService.filterComuni(nome, codiceCatastale, prov, regione);
if (!UtilityString.isNullOrEmpty(indirizzo) || !UtilityString.isNullOrEmpty(cap)) {
filteredComuni = comuniService.filterIndirizzo(filteredComuni, cap, indirizzo);
}
return ServiceRestResponse.createPositiveResponse(filteredComuni);
}
@PostMapping(value = "capCittaProv")
public ServiceRestResponse getCapCittaProv(@RequestParam(required = false) String nome,
@RequestParam(required = false) String cap,
@RequestParam(required = false) String prov) throws Exception {
return ServiceRestResponse.createPositiveResponse(comuniService.getCapCittaProv(nome, cap, prov));
}
@PostMapping(value = "searchComuni")
public ServiceRestResponse searchComuni(@RequestParam() String q,
@RequestParam(required = false) Integer limit) {
return ServiceRestResponse.createPositiveResponse(comuniService.searchComuni(q, limit));
}
}

View File

@@ -0,0 +1,86 @@
package it.integry.ems.service.comuni.dto;
public class SavePositionRequestDTO {
private String descrizione;
private String citta;
private String indirizzo;
private String cap;
private String prov;
private String nazione;
private double lat;
private double lng;
public String getDescrizione() {
return descrizione;
}
public SavePositionRequestDTO setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public String getCitta() {
return citta;
}
public SavePositionRequestDTO setCitta(String citta) {
this.citta = citta;
return this;
}
public String getIndirizzo() {
return indirizzo;
}
public SavePositionRequestDTO setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
return this;
}
public String getCap() {
return cap;
}
public SavePositionRequestDTO setCap(String cap) {
this.cap = cap;
return this;
}
public String getProv() {
return prov;
}
public SavePositionRequestDTO setProv(String prov) {
this.prov = prov;
return this;
}
public String getNazione() {
return nazione;
}
public SavePositionRequestDTO setNazione(String nazione) {
this.nazione = nazione;
return this;
}
public double getLat() {
return lat;
}
public SavePositionRequestDTO setLat(double lat) {
this.lat = lat;
return this;
}
public double getLng() {
return lng;
}
public SavePositionRequestDTO setLng(double lng) {
this.lng = lng;
return this;
}
}

View File

@@ -1,43 +1,68 @@
package it.integry.ems.service.comuni.service;
import it.integry.ems.service.MapService;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.comuni.dto.SavePositionRequestDTO;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbPosizioni;
import it.integry.ems_model.types.OperationType;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.service.comuni.base.CapCittaProv;
import it.integry.ems.service.comuni.base.ComuniSearchableFields;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems_model.utility.UtilityString;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Scope("request")
public class ComuniService {
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
@Autowired
private UnitaTerritorialiService unitaTerritorialiService;
private Logger logger = LogManager.getLogger();
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
public List<Comune> getComuni() {
return unitaTerritorialiService.getComuni();
}
public StbPosizioni savePosition(SavePositionRequestDTO savePositionRequestDTO) throws Exception {
StbPosizioni position = new StbPosizioni()
.setCitta(savePositionRequestDTO.getCitta())
.setIndirizzo(savePositionRequestDTO.getIndirizzo())
.setProv(savePositionRequestDTO.getProv())
.setCap(savePositionRequestDTO.getCap())
.setNazione(savePositionRequestDTO.getNazione())
.setLat(BigDecimal.valueOf(savePositionRequestDTO.getLat()))
.setLng(BigDecimal.valueOf(savePositionRequestDTO.getLng()));
position.setOperation(OperationType.INSERT);
entityProcessor.processEntity(position, multiDBTransactionManager);
position.setOperation(OperationType.SELECT_OBJECT);
return position;
}
/**
* Metodo che filtra l'intera lista dei comuni corrispondenti ai parametri specificati
*
* @param nome Nome del comune
* @param cap Codice Avviamento Postale
* @param codiceCatastale Codice Catastale
* @param prov Provincia
* @param regione Regione
@@ -48,7 +73,6 @@ public class ComuniService {
List<Comune> comuni = unitaTerritorialiService.getComuni();
comuni = this.filterComuniByAttribute(ComuniSearchableFields.NOME, nome, comuni);
// comuni = this.filterComuniByAttribute(ComuniSearchableFields.CAP, cap, comuni);
comuni = this.filterComuniByAttribute(ComuniSearchableFields.CODICE_CATASTALE, codiceCatastale, comuni);
comuni = this.filterComuniByAttribute(ComuniSearchableFields.PROVINCIA, prov, comuni);
comuni = this.filterComuniByAttribute(ComuniSearchableFields.REGIONE, regione, comuni);
@@ -64,7 +88,16 @@ public class ComuniService {
}
}
/**/
/**
* Metodo che restituisce un oggetto {@link CapCittaProv} contenente le informazioni di CAP, Città e Provincia
* filtrando i comuni in base ai parametri specificati.
*
* @param nome Nome del comune
* @param cap Codice di Avviamento Postale
* @param prov Sigla della provincia
* @return Un oggetto {@link CapCittaProv} con le informazioni richieste
* @throws Exception se si verifica un errore durante il recupero dei dati
*/
public CapCittaProv getCapCittaProv(String nome, String cap, String prov) throws Exception {
CapCittaProv comune = new CapCittaProv();
@@ -87,7 +120,7 @@ public class ComuniService {
for (Comune result : resultList) {
provFound = result.getSigla();
cittaFound = result.getNome();
if (result.getCap().size() != 0){
if (!result.getCap().isEmpty()){
capFound = result.getCap().get(0);
}
comune.setProv(provFound);
@@ -103,10 +136,10 @@ public class ComuniService {
}
public List<Comune> filterIndirizzo(List<Comune> comuni, String cap, String indirizzo) throws ComuniException {
List<Comune> result = new ArrayList<Comune>();
List<Comune> result = new ArrayList<>();
try {
if (!UtilityString.isNullOrEmpty(cap)) {
IndirizzoDTO indirizzoDTO = mapService.geocode(cap);
IndirizzoDTO indirizzoDTO = geocodingService.geocode(cap);
if (indirizzoDTO == null) {
comuni.clear();
@@ -130,7 +163,7 @@ public class ComuniService {
String _nome = UtilityString.blankIfNull(comune.getNome());
String _prov = UtilityString.blankIfNull(comune.getSigla());
String rawAddress = indirizzo + " " + _nome + " " + _prov;
IndirizzoDTO indirizzoDTO = mapService.geocode(rawAddress);
IndirizzoDTO indirizzoDTO = geocodingService.geocode(rawAddress);
if (indirizzoDTO != null) {
String _cap = indirizzoDTO.getCap();
if (_cap != null) {
@@ -210,7 +243,7 @@ public class ComuniService {
* @return Lista dei comuni corrispondenti
*/
public List<Comune> searchComuni(String qs, Integer limit) {
List<Comune> result = new ArrayList<Comune>();
List<Comune> result = new ArrayList<>();
if (!UtilityString.isNullOrEmpty(qs)) {
List<Comune> listComuni = unitaTerritorialiService.getComuni();

View File

@@ -428,8 +428,6 @@ public class EmsRestConstants {
public static final String PATH_UPDATE_MTB_MOVI_NUM_MOV = PATH + "updateMtbMoviNumMov";
public static final String PATH_SET_COORDINATE_GEO_CLIE = PATH + "setCoodinateGeoClie";
public static final String PATH_MIGRATE_GEOLOCATION_FOR_RLAVR = PATH + "migrateGeolocationForRlavr";
public static final String PATH_REVERSE_GEOCODE = PATH + "reverseGeocode";
public static final String PATH_GET_POSITION_FROM_COORDS = PATH + "getPositionFromCoords";
public static final String PATH_GET_RICORRENZE = PATH + "getRicorrenze";
public static final String PATH_IMPORT_PRESENZE = PATH + "importPresenze";
public static final String PATH_SAVE_TRANSACTION_FARMMES = PATH + "saveTransactionFarmmes";
@@ -497,7 +495,6 @@ public class EmsRestConstants {
public static final String PATH_EXPORT_FATTURE_FPX = PATH + "exportFattureFpx";
public static final String PATH_EXPORT_EMAIL_FPX = PATH + "exportEmailFpx";
public static final String PATH_READ_FPX_INBOX = PATH + "readFpxInbox";
public static final String PATH_GEOCODE = PATH + "geocode";
public static final String PATH_GIACENZA_ISTANTANEA = PATH + "giacenzaIstantanea";
public static final String PATH_GIACENZA_ARTICOLI_DA_BANCALE = PATH + "giacenzaArticoliBancale";
public static final String PATH_RETTIFICA_INV_MAG = PATH + "rettificaInvMag";
@@ -517,11 +514,6 @@ public class EmsRestConstants {
public static final String PATH_LOG_SOAP_SERVICES = PATH + "logSoapServices";
//MAP
public static final String PATH_EXPORT_LAYER_MAP = PATH + "exportLayerMap";
public static final String PATH_MAP_GETCOORDINATE_BY_ADDRESS = PATH + "map/getCoordinatesByAddress";
public static final String PATH_MAP_GETCOORDINATE_BY_CITY = PATH + "map/getCoordinatesByCity";
//WMS SERVICES
public static final String PATH_EXPORT_ART_DIALOGO = PATH + "exportArtDialogo";
private static final String USERNAME_LOGIN = "ADMINREST";

View File

@@ -0,0 +1,47 @@
package it.integry.googleCloudApi.controller;
import it.integry.common.var.CommonConstants;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.googleCloudApi.service.GeocodingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
@RestController
@Scope("request")
public class GeocodingController {
@Autowired
private GeocodingService geocodingService;
@GetMapping(value = "geocode")
public ServiceRestResponse geocode(@RequestParam("address") String address) throws Exception {
return ServiceRestResponse.createPositiveResponse(geocodingService.geocode(address));
}
@GetMapping(value = "reverseGeocode")
public ServiceRestResponse reverseGeocode(@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam BigDecimal lat,
@RequestParam BigDecimal lng) throws Exception {
return ServiceRestResponse.createPositiveResponse(geocodingService.reverseGeocode(lat.doubleValue(), lng.doubleValue()));
}
@GetMapping(value = "getPositionFromCoords")
public ServiceRestResponse getPositionFromCoords(@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam BigDecimal lat,
@RequestParam BigDecimal lng) throws Exception {
return ServiceRestResponse.createPositiveResponse(geocodingService.getPositionFromCoords(lat, lng));
}
@GetMapping(value = "map/getCoordinatesByCity")
public ServiceRestResponse getCoordinateByCity(@RequestParam String cityName) throws Exception {
return ServiceRestResponse.createPositiveResponse(geocodingService.getCoordinateByCity(cityName));
}
}

View File

@@ -0,0 +1,34 @@
package it.integry.googleCloudApi.controller;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.googleCloudApi.service.PlacesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Scope("request")
@RequestMapping("/google/places")
public class PlacesController {
@Autowired
private PlacesService placesService;
@GetMapping(value = "autoCompleteAddress")
public ServiceRestResponse autoCompleteAddress(@RequestParam String address,
@RequestParam String language,
@RequestParam String uuid) throws Exception {
return ServiceRestResponse.createPositiveResponse(placesService.autoCompleteAddress(address, language, uuid));
}
@GetMapping(value = "placeDetails")
public ServiceRestResponse placeDetails(@RequestParam String placeId,
@RequestParam String uuid) throws Exception {
return ServiceRestResponse.createPositiveResponse(placesService.placeDetails(placeId, uuid));
}
}

View File

@@ -0,0 +1,25 @@
package it.integry.googleCloudApi.dto;
public class AutoCompleteAddressDTO {
private String description;
private String placeId;
public String getDescription() {
return description;
}
public AutoCompleteAddressDTO setDescription(String description) {
this.description = description;
return this;
}
public String getPlaceId() {
return placeId;
}
public AutoCompleteAddressDTO setPlaceId(String placeId) {
this.placeId = placeId;
return this;
}
}

View File

@@ -1,18 +1,18 @@
package it.integry.ems_model.utility.dto;
package it.integry.googleCloudApi.dto;
import java.math.BigDecimal;
public class IndirizzoDTO {
public Long idPosizione;
public String via;
public String numeroCivico;
public String indirizzo; // (via + numeroCivico)
public String cap;
public String citta;
public String prov;
public String nazione;
public BigDecimal lat;
public BigDecimal lng;
private Long idPosizione;
private String via;
private String numeroCivico;
private String indirizzo; // (via + numeroCivico)
private String cap;
private String citta;
private String prov;
private String nazione;
private BigDecimal lat;
private BigDecimal lng;
public Long getIdPosizione() {
return idPosizione;
@@ -27,71 +27,80 @@ public class IndirizzoDTO {
return via;
}
public void setVia(String via) {
public IndirizzoDTO setVia(String via) {
this.via = via;
return this;
}
public String getNumeroCivico() {
return numeroCivico;
}
public void setNumeroCivico(String numeroCivico) {
public IndirizzoDTO setNumeroCivico(String numeroCivico) {
this.numeroCivico = numeroCivico;
return this;
}
public String getIndirizzo() {
return indirizzo;
}
public void setIndirizzo(String indirizzo) {
public IndirizzoDTO setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
return this;
}
public String getCap() {
return cap;
}
public void setCap(String cap) {
public IndirizzoDTO setCap(String cap) {
this.cap = cap;
return this;
}
public String getCitta() {
return citta;
}
public void setCitta(String citta) {
public IndirizzoDTO setCitta(String citta) {
this.citta = citta;
}
public String getNazione() {
return nazione;
}
public void setNazione(String nazione) {
this.nazione = nazione;
return this;
}
public String getProv() {
return prov;
}
public void setProv(String prov) {
public IndirizzoDTO setProv(String prov) {
this.prov = prov;
return this;
}
public String getNazione() {
return nazione;
}
public IndirizzoDTO setNazione(String nazione) {
this.nazione = nazione;
return this;
}
public BigDecimal getLat() {
return lat;
}
public void setLat(BigDecimal lat) {
public IndirizzoDTO setLat(BigDecimal lat) {
this.lat = lat;
return this;
}
public BigDecimal getLng() {
return lng;
}
public void setLng(BigDecimal lng) {
public IndirizzoDTO setLng(BigDecimal lng) {
this.lng = lng;
return this;
}
}

View File

@@ -0,0 +1,115 @@
package it.integry.googleCloudApi.service;
import com.google.maps.GeocodingApi;
import com.google.maps.model.*;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.KeyManagerService;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbPosizioni;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.LatLng;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.utility.GoogleApiUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
@Service
@Scope("request")
public class GeocodingService {
@Autowired
private KeyManagerService keyManagerService;
@Autowired
public EntityProcessor entityProcessor;
@Autowired
public MultiDBTransactionManager multiDBTransactionManager;
@Autowired
public SetupGest setupGest;
public IndirizzoDTO geocode(String address) throws Exception {
GeocodingResult[] results = GeocodingApi.geocode(GoogleApiUtility.getGeoApiContext(keyManagerService), address).await();
return GoogleApiUtility.buildIndirizzoDTO(results);
}
public IndirizzoDTO reverseGeocode(double lat, double lng) throws Exception {
com.google.maps.model.LatLng location = new com.google.maps.model.LatLng(lat, lng);
GeocodingResult[] results = GeocodingApi.reverseGeocode(GoogleApiUtility.getGeoApiContext(keyManagerService), location).await();
return GoogleApiUtility.buildIndirizzoDTO(results);
}
public IndirizzoDTO getPositionFromCoords(BigDecimal lat, BigDecimal lng) throws Exception {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
IndirizzoDTO indirizzo;
double formattedLat = lat.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
double formattedLng = lng.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
int distance = setupGest.getSetupInteger(conn, "MAPS", "SETUP", "GEOCODE_PRECISION", 50);
String nearbyPointQuery = "SELECT * from ( " +
" SELECT *,(6371392.896 * acos(cos(radians(" + formattedLat + ")) * cos(radians(lat)) * " +
" cos(radians(lng) - radians(" + formattedLng + ")) + " +
" sin(radians(" + formattedLat + ")) * sin(radians(lat)))) AS distance " +
" FROM stb_posizioni " +
" ) distance_points " +
"where distance < " + distance +
" ORDER BY distance";
StbPosizioni stbPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, nearbyPointQuery, StbPosizioni.class);
if (stbPosizioni != null) {
indirizzo = new IndirizzoDTO()
.setIdPosizione(stbPosizioni.getId())
.setCap(stbPosizioni.getCap())
.setCitta(stbPosizioni.getCitta())
.setLat(stbPosizioni.getLat())
.setLng(stbPosizioni.getLng())
.setNazione(stbPosizioni.getNazione())
.setVia(stbPosizioni.getIndirizzo())
.setProv(stbPosizioni.getProv())
.setIndirizzo(stbPosizioni.getIndirizzo());
} else {
indirizzo = reverseGeocode(lat.doubleValue(), lng.doubleValue());
stbPosizioni = new StbPosizioni()
.setLat(lat)
.setLng(lng)
.setCap(indirizzo.getCap())
.setCitta(indirizzo.getCitta())
.setIndirizzo(indirizzo.getIndirizzo())
.setNazione(indirizzo.getNazione())
.setProv(indirizzo.getProv());
stbPosizioni.setOperation(OperationType.INSERT);
entityProcessor.processEntity(stbPosizioni, multiDBTransactionManager);
indirizzo.setIdPosizione(stbPosizioni.getId());
}
return indirizzo;
}
public LatLng getCoordinateByCity(String cityName) throws Exception {
GeocodingResult[] results = GeocodingApi.geocode(GoogleApiUtility.getGeoApiContext(keyManagerService), cityName).await();
if (results != null && results.length > 0) {
Geometry geometry = results[0].geometry;
return new LatLng()
.set(new BigDecimal(geometry.location.lat), new BigDecimal(geometry.location.lng));
}
return null;
}
}

View File

@@ -0,0 +1,82 @@
package it.integry.googleCloudApi.service;
import com.google.maps.PlacesApi;
import com.google.maps.model.AutocompletePrediction;
import com.google.maps.model.PlaceDetails;
import it.integry.ems.service.KeyManagerService;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.AutoCompleteAddressDTO;
import it.integry.googleCloudApi.utility.GoogleApiUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class PlacesService {
@Autowired
private KeyManagerService keyManagerService;
/**
* Autocompletes an address based on the input string and returns a list of suggestions.
* <p>
* This method uses a session token to group user interactions within a single session,
* improving the billing model and the accuracy of prediction ranking, as recommended
* by the Google Places API documentation.<p/>
*
* <p><b>Session Token Best Practices (from Google):</b></p>
* <ul>
* <li>A session token is used to group Autocomplete and Place Details requests.</li>
* <li>Generate a new UUID when a user starts typing in a search field.</li>
* <li>Reuse the same token for all autocomplete requests and the final place details request during the session.</li>
* <li>Do not reuse a session token across different user interactions.</li>
* <li>Each session should last no longer than a few minutes.</li>
* </ul>
*
* @param address The address string to autocomplete.
* @param language The language for the autocomplete results.
* @param uuid A UUID string representing the session token for the autocomplete request.
* @return A list of AutoCompleteAddressDTO containing address suggestions.
* @throws Exception If there is an error during the API call.
*/
public List<AutoCompleteAddressDTO> autoCompleteAddress(String address, String language, String uuid) throws Exception {
AutocompletePrediction[] predictions = PlacesApi.placeAutocomplete(
GoogleApiUtility.getGeoApiContext(keyManagerService),
address,
GoogleApiUtility.getSessionToken(uuid)
).language(language).await();
return Arrays.stream(predictions)
.map(x ->
new AutoCompleteAddressDTO().setDescription(x.description).setPlaceId(x.placeId)
).collect(Collectors.toList());
}
/**
* Retrieves detailed information about a place using its Place ID.
*
* <p>This method uses the same session token used during the autocomplete session,
* which allows Google to link the details request to the user's prior autocomplete queries.
* This results in more relevant results and a more efficient billing structure.<p/>
*
* <p>See: <a href="https://developers.google.com/maps/documentation/places/web-service/session-tokens">Google documentation</a></p>
*
* @param placeId The unique identifier for the place.
* @param uuid The same session token used in the autocomplete request (as a UUID string).
* @return An IndirizzoDTO containing detailed address information, or null if not found.
* @throws Exception If there is an error during the API call.
*/
public IndirizzoDTO placeDetails(String placeId, String uuid) throws Exception {
PlaceDetails details = PlacesApi.placeDetails(
GoogleApiUtility.getGeoApiContext(keyManagerService),
placeId,
GoogleApiUtility.getSessionToken(uuid)
).await();
if (details != null) return GoogleApiUtility.buildIndirizzoDTO(details);
return null;
}
}

View File

@@ -0,0 +1,99 @@
package it.integry.googleCloudApi.utility;
import com.google.maps.GeoApiContext;
import com.google.maps.PlaceAutocompleteRequest;
import com.google.maps.model.AddressComponent;
import com.google.maps.model.AddressComponentType;
import com.google.maps.model.GeocodingResult;
import com.google.maps.model.PlaceDetails;
import it.integry.ems.service.KeyManagerService;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public class GoogleApiUtility {
/**
* Creates a GeoApiContext using the API key from KeyManagerService.
*
* @param keyManagerService The service to retrieve the Google Maps API key.
* @return A configured GeoApiContext instance.
* @throws Exception if there is an issue retrieving the API key or building the context.
*/
public static GeoApiContext getGeoApiContext(KeyManagerService keyManagerService) throws Exception {
return new GeoApiContext.Builder().apiKey(keyManagerService.getGmapsApiKey()).build();
}
/**
* Creates a session token for PlaceAutocompleteRequest using a UUID.
*
* @param uuid The UUID string to create the session token.
* @return A PlaceAutocompleteRequest.SessionToken instance.
*/
public static PlaceAutocompleteRequest.SessionToken getSessionToken(String uuid) {
UUID uuidObj = UUID.fromString(uuid);
return new PlaceAutocompleteRequest.SessionToken(uuidObj);
}
/**
* Builds an IndirizzoDTO from a GeocodingResult or PlaceDetails object.
*
* @param obj The object containing address information, either GeocodingResult[] or PlaceDetails.
* @return An IndirizzoDTO populated with the address details.
* @throws IllegalArgumentException if the object type is unsupported.
*/
public static <T> IndirizzoDTO buildIndirizzoDTO(T obj) {
if (obj instanceof GeocodingResult[]) {
GeocodingResult[] results = (GeocodingResult[]) obj;
if (results.length == 0) return null;
GeocodingResult result = results[0];
return addressComponentsToDto(result.addressComponents)
.setLat(BigDecimal.valueOf(result.geometry.location.lat))
.setLng(BigDecimal.valueOf(result.geometry.location.lng));
} else if (obj instanceof PlaceDetails) {
PlaceDetails result = (PlaceDetails) obj;
return addressComponentsToDto(result.addressComponents)
.setLat(BigDecimal.valueOf(result.geometry.location.lat))
.setLng(BigDecimal.valueOf(result.geometry.location.lng));
} else {
throw new IllegalArgumentException("Unsupported type: " + obj.getClass().getName());
}
}
private static IndirizzoDTO addressComponentsToDto(AddressComponent[] addressComponents) {
IndirizzoDTO indirizzoDTO = new IndirizzoDTO();
for (AddressComponent component : addressComponents) {
List<AddressComponentType> types = Arrays.asList(component.types);
if (types.contains(AddressComponentType.ROUTE)) {
indirizzoDTO.setVia(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.STREET_NUMBER)) {
indirizzoDTO.setNumeroCivico(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.COUNTRY)) {
indirizzoDTO.setNazione(component.shortName.toUpperCase());
} else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_2)) {
indirizzoDTO.setProv(component.shortName.toUpperCase());
} else if (types.contains(AddressComponentType.ADMINISTRATIVE_AREA_LEVEL_3) || types.contains(AddressComponentType.LOCALITY)) { // LOCALITY
indirizzoDTO.setCitta(component.longName.toUpperCase());
} else if (types.contains(AddressComponentType.POSTAL_CODE)) {
indirizzoDTO.setCap(component.longName.toUpperCase());
}
}
if (indirizzoDTO.getVia() != null) {
String indirizzo = indirizzoDTO.getVia();
if (indirizzoDTO.getNumeroCivico() != null) {
indirizzo += ", " + indirizzoDTO.getNumeroCivico();
}
indirizzoDTO.setIndirizzo(indirizzo);
}
return indirizzoDTO;
}
}

View File

@@ -7,6 +7,7 @@ import it.integry.ems.activity.dto.UserWorkHoursClockOutRequestDTO;
import it.integry.ems.activity.dto.UserWorkHoursStatusDTO;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.system.service.SystemService;
import it.integry.ems.user.dto.UserDTO;
@@ -22,7 +23,7 @@ import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityDate;
import it.integry.ems_model.utility.UtilityLocalDate;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.firebase.dto.MessageDTO;
import it.integry.firebase.dto.NotificationDTO;
import it.integry.firebase.dto.android.AndroidConfigDTO;
@@ -69,6 +70,9 @@ public class UserWorkHoursService {
@Autowired
private UserService userService;
@Autowired
private GeocodingService geocodingService;
public void clockIn(String username, UserWorkHoursClockInRequestDTO userWorkHoursClockInRequestDTO) throws Exception {
if (!userWorkHoursClockInRequestDTO.isValidPosition())
throw new Exception("Posizione di ingresso non valida");
@@ -92,7 +96,7 @@ public class UserWorkHoursService {
jtbRLavt.setOperation(OperationType.INSERT_OR_UPDATE);
final IndirizzoDTO positionFromCoords =
utilityService.getPositionFromCoords(userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude());
geocodingService.getPositionFromCoords(userWorkHoursClockInRequestDTO.getPositionLatitude(), userWorkHoursClockInRequestDTO.getPositionLongitude());
JtbRLavr jtbRLavr = new JtbRLavr()
.setDaOra(userWorkHoursClockInRequestDTO.getTimestamp() != null ?
@@ -136,7 +140,7 @@ public class UserWorkHoursService {
jtbRLavt.setFlagTrasferta("S");
final IndirizzoDTO positionFromCoords =
utilityService.getPositionFromCoords(userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude());
geocodingService.getPositionFromCoords(userWorkHoursClockOutRequestDTO.getPositionLatitude(), userWorkHoursClockOutRequestDTO.getPositionLongitude());
JtbRLavr jtbRLavr = new JtbRLavr()
.setCodJcom(userWorkHoursClockOutRequestDTO.getCodJcom())

View File

@@ -13,11 +13,7 @@ import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.response.EsitoType;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.response.StatusResponse;
import it.integry.ems.rules.businessLogic.AccountingBusinessLogic;
import it.integry.ems.service.comuni.base.CapCittaProv;
import it.integry.ems.service.comuni.entities.Comune;
import it.integry.ems.service.comuni.exceptions.ComuniException;
import it.integry.ems.service.comuni.service.ComuniService;
import it.integry.ems.status.ServiceChecker;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.config.EmsRestConstants;
@@ -32,7 +28,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.soap.SOAPFaultException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -45,22 +40,28 @@ public class ContabilController {
@Autowired
private ServiceChecker serviceChecker;
@Autowired
private ContabilService contabilService;
@Autowired
private AutofatturaService autofatturaService;
@Autowired
private ScadenzeService scadenzeService;
@Autowired
private PassaggioAnno passaggioAnno;
@Autowired
private RegCorrispettivoService regCorrispettivoService;
@Autowired
private ComuniService comuniService;
@Autowired
private RequestDataDTO requestDataDTO;
@Autowired
private AmmortamentiService ammortamentiService;
@Autowired
private SEPAService SEPAService;
@@ -198,41 +199,6 @@ public class ContabilController {
return ServiceRestResponse.createPositiveResponse(contabilService.checkIban(iban));
}
@RequestMapping(value = "/infoComuni", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse getInfoComuni(HttpServletRequest request, @RequestParam(required = false) String nome,
@RequestParam(required = false) String cap,
@RequestParam(required = false) String codiceCatastale,
@RequestParam(required = false) String indirizzo,
@RequestParam(required = false) String prov,
@RequestParam(required = false) String regione) throws ComuniException {
List<Comune> filteredComuni = comuniService.filterComuni(nome, codiceCatastale, prov, regione);
if (!UtilityString.isNullOrEmpty(indirizzo) || !UtilityString.isNullOrEmpty(cap)) {
filteredComuni = comuniService.filterIndirizzo(filteredComuni, cap, indirizzo);
}
return ServiceRestResponse.createPositiveResponse(filteredComuni);
}
@RequestMapping(value = "/capCittaProv", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse getCapCittaProv(HttpServletRequest request, @RequestParam(required = false) String nome,
@RequestParam(required = false) String cap,
@RequestParam(required = false) String prov) throws Exception {
CapCittaProv comune = comuniService.getCapCittaProv(nome, cap, prov);
return ServiceRestResponse.createPositiveResponse(comune);
}
@RequestMapping(value = "/searchComuni", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse searchComuni(HttpServletRequest request,
@RequestParam() String q,
@RequestParam(required = false) Integer limit) throws Exception {
List<Comune> results = comuniService.searchComuni(q, limit);
return ServiceRestResponse.createPositiveResponse(results);
}
@ExceptionHandler(SOAPFaultException.class)
public @ResponseBody
ServiceRestResponse handleSOAPException(HttpServletRequest request, HttpServletResponse response, SOAPFaultException ex) {

View File

@@ -4,7 +4,6 @@ import com.annimon.stream.Stream;
import it.integry.common.var.CommonConstants;
import it.integry.ems.contabil.dto.DettaglioIncassoTitoliDTO;
import it.integry.ems.contabil.dto.DistintaEffettiDTO;
import it.integry.ems.contabil.dto.DistinteIncassiDTO;
import it.integry.ems.contabil.dto.IncassoTitoloDTO;
import it.integry.ems.contabil.iban.base.IbanBase;
import it.integry.ems.contabil.iban.exceptions.IbanException;
@@ -16,19 +15,18 @@ import it.integry.ems.contabil.partitaIva.services.CheckVatService;
import it.integry.ems.rules.businessLogic.AccountingBusinessLogic;
import it.integry.ems.rules.businessLogic.enums.TipoPartita;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MapService;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.db.ResultSetMapper;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.exception.EntityException;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -58,7 +56,7 @@ public class ContabilService {
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
private void updateDataExport(Date dataDist, Integer rifDist) throws Exception {
VtbDist vtbDist = new VtbDist()
@@ -154,7 +152,7 @@ public class ContabilService {
if (address.value != null) {
IndirizzoDTO indirizzoDTO = null;
try {
indirizzoDTO = mapService.geocode(address.value);
indirizzoDTO = geocodingService.geocode(address.value);
} catch (Exception e) {
logger.error("checkVat", e);
}

View File

@@ -66,9 +66,8 @@ import it.integry.ems.response.EsitoType;
import it.integry.ems.response.FileItem;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MapService;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.VtbDist;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
@@ -109,7 +108,7 @@ public class SEPAService {
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
public ServiceRestResponse getSepaXml(Date dataDist, Integer rifDist) throws Exception {
ServiceRestResponse resp = new ServiceRestResponse();

View File

@@ -9,7 +9,7 @@ import it.integry.ems.rules.completing.QueryRules;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MailService;
import it.integry.ems.service.MailTemplateService;
import it.integry.ems.service.MapService;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.service.dto.GenericComunicationMailTemplateDataDTO;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
@@ -59,7 +59,7 @@ public class OrdiniImportService {
@Autowired
private MailService mailService;
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
public EntityBase importOrdineDialogo(DialogoJsonDTO dialogoJsonDTO, String type, String format) throws Exception {

View File

@@ -6,16 +6,16 @@ import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.production.agribook.model.*;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityFile;
import it.integry.ems.utility.service.UtilityService;
import it.integry.ems_model.entity.MtbDepo;
import it.integry.ems_model.entity.MtbDepoPosizioni;
import it.integry.ems_model.entity.MtbPartitaMag;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityString;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,7 +36,6 @@ public class AgribookOrderController {
private final Logger logger = LogManager.getLogger();
@Autowired
private AgribookOrderService agribookOrderService;
@@ -173,7 +172,7 @@ public class AgribookOrderController {
MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class);
EntityProcessor entityProcessor = ApplicationContextProvider.getApplicationContext().getBean(EntityProcessor.class);
UtilityService utilityService = ContextLoader.getCurrentWebApplicationContext().getBean(UtilityService.class);
GeocodingService geocodingService = ContextLoader.getCurrentWebApplicationContext().getBean(GeocodingService.class);
List<MtbDepoPosizioni> mtbDepoPosizioni =
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), "SELECT * FROM mtb_depo_posizioni", MtbDepoPosizioni.class);
@@ -195,8 +194,8 @@ public class AgribookOrderController {
BigDecimal lat = x.getValue().get(0).getLat();
BigDecimal lng = x.getValue().get(0).getLng();
// //Creazione posizione con coords
IndirizzoDTO indirizzoDTO = utilityService.getPositionFromCoords(lat, lng);
//Creazione posizione con coords
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(lat, lng);
MtbDepoPosizioni matchPosizione = Stream.of(mtbDepoPosizioni)

View File

@@ -6,16 +6,16 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import it.integry.ems.production.agribook.model.*;
import it.integry.ems.service.EntityProcessor;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems.utility.service.UtilityService;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import it.integry.ems_model.utility.dto.PaginatedDTO;
import org.apache.commons.text.StringSubstitutor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -1322,7 +1322,7 @@ public class AgribookOrderService {
throw new Exception("Nessun dato da salvare.");
}
UtilityService utilityService = ContextLoader.getCurrentWebApplicationContext().getBean(UtilityService.class);
GeocodingService geocodingService = ContextLoader.getCurrentWebApplicationContext().getBean(GeocodingService.class);
List<MtbDepoPosizioni> mtbDepoPosizioni =
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), "SELECT * FROM mtb_depo_posizioni", MtbDepoPosizioni.class);
@@ -1335,7 +1335,7 @@ public class AgribookOrderService {
for (AgribookSaveCoordsDTO saveCoordsDTO : agribookSaveCoordsDTOS) {
// Creazione posizione con coords
IndirizzoDTO indirizzoDTO = utilityService.getPositionFromCoords(saveCoordsDTO.getLat(), saveCoordsDTO.getLng());
IndirizzoDTO indirizzoDTO = geocodingService.getPositionFromCoords(saveCoordsDTO.getLat(), saveCoordsDTO.getLng());
String codMdep = saveCoordsDTO.getCodMdep();

View File

@@ -5,7 +5,7 @@ import com.annimon.stream.Stream;
import it.integry.ems.Import.dto.AnomalieDTO;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MailService;
import it.integry.ems.service.MapService;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.annotation.SqlField;
@@ -19,7 +19,7 @@ import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityBigDecimal;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityString;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -51,7 +51,7 @@ public class AnagImportService {
private SetupGest setupGest;
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
@Autowired
private MailService mailService;
@@ -106,7 +106,7 @@ public class AnagImportService {
String codVdes = (String) cliente.get("cod_vdes");
String indirizzo = (String) cliente.get("indirizzo");
IndirizzoDTO indirizzoDTO = mapService.geocode(indirizzo);
IndirizzoDTO indirizzoDTO = geocodingService.geocode(indirizzo);
BigDecimal lat = null;
BigDecimal lng = null;

View File

@@ -1,12 +1,10 @@
package it.integry.ems.utility.controller;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import it.integry.common.var.CommonConstants;
import it.integry.ems.response.EsitoType;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.response.StatusResponse;
import it.integry.ems.service.HttpRestWrapper;
import it.integry.ems.status.ServiceChecker;
import it.integry.ems.utility.dto.C2EArgDTO;
import it.integry.ems.utility.dto.PdfDTO;
@@ -30,12 +28,10 @@ import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.List;
@RestController
@Scope(value = "request")
public class UtilityController {
private final Logger logger = LogManager.getLogger();
@@ -72,15 +68,6 @@ public class UtilityController {
return utilityService.splitPDF(pdfList);
}
@RequestMapping(value = EmsRestConstants.PATH_GEOCODE, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse geocode(HttpServletRequest request,
@RequestParam("address") String address) throws Exception {
return utilityService.geocode(address);
}
@RequestMapping(value = EmsRestConstants.PATH_CMD_2_EXPORT, method = RequestMethod.POST)
public @ResponseBody
Object cmd2Export(HttpServletRequest request,
@@ -134,7 +121,7 @@ public class UtilityController {
public @ResponseBody ServiceRestResponse readRemoteFile(@RequestBody JsonNode body) {
ServiceRestResponse response;
try {
if(body.has("url")) {
if (body.has("url")) {
String url = body.get("url").asText();
response = ServiceRestResponse.createPositiveResponse(UtilityService.readRemoteFile(url));
} else {
@@ -149,48 +136,10 @@ public class UtilityController {
@RequestMapping(value = EmsRestConstants.PATH_MIGRATE_GEOLOCATION_FOR_RLAVR, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse setGeolocationFromCoordinate(HttpServletRequest request, @RequestParam(CommonConstants.PROFILE_DB) String configuration) {
ServiceRestResponse setGeolocationFromCoordinate(@RequestParam(CommonConstants.PROFILE_DB) String configuration) throws Exception {
ServiceRestResponse response = new ServiceRestResponse();
try {
utilityService.migrateLocalizationForRlavr();
return response;
//UtilityEntity.toServiceRestResponse(entities).get(0);
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
response = new ServiceRestResponse(EsitoType.KO, configuration, e);
}
return response;
}
@RequestMapping(value = EmsRestConstants.PATH_REVERSE_GEOCODE, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse reverseGeocode(
HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam BigDecimal lat,
@RequestParam BigDecimal lng
) {
ServiceRestResponse response;
try {
response = utilityService.reverseGeocode(lat, lng);
return response;
} catch (Exception e) {
logger.error(request.getRequestURI(), e);
response = new ServiceRestResponse(EsitoType.KO, configuration, e);
}
return response;
}
@RequestMapping(value = EmsRestConstants.PATH_GET_POSITION_FROM_COORDS, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse getPositionFromCoords(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam BigDecimal lat,
@RequestParam BigDecimal lng) throws Exception {
return ServiceRestResponse.createPositiveResponse(utilityService.getPositionFromCoords(lat, lng));
utilityService.migrateLocalizationForRlavr();
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = EmsRestConstants.PATH_GET_RICORRENZE, method = RequestMethod.GET)
@@ -204,7 +153,7 @@ public class UtilityController {
@RequestMapping(value = EmsRestConstants.PATH_EXTRACT_SSCC, method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse extractSSCC(HttpServletRequest request,
@RequestParam("barcode") String barcode) throws Exception {
@RequestParam("barcode") String barcode) throws Exception {
return ServiceRestResponse.createPositiveResponse(UtilityBarcode.extractSSCC(barcode));
}
}

View File

@@ -10,7 +10,7 @@ import it.integry.ems.report.dto.PairsDTO;
import it.integry.ems.response.EsitoType;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MapService;
import it.integry.googleCloudApi.service.GeocodingService;
import it.integry.ems.service.ReportProcessor;
import it.integry.ems.service.exception.EmptyReportException;
import it.integry.ems.sync.MultiDBTransaction.Connection;
@@ -23,11 +23,9 @@ import it.integry.ems_model.db.ResultSetMapper;
import it.integry.ems_model.entity.JtbRLavr;
import it.integry.ems_model.entity.JtbRLavt;
import it.integry.ems_model.entity.JtbRicorrenze;
import it.integry.ems_model.entity.StbPosizioni;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.googleCloudApi.dto.IndirizzoDTO;
import org.apache.commons.codec.binary.Base64;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -42,7 +40,6 @@ import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
import java.sql.Date;
import java.sql.*;
@@ -61,14 +58,11 @@ public class UtilityService {
private ReportProcessor reportProcessor;
@Autowired
private MapService mapService;
private GeocodingService geocodingService;
@Autowired
public EntityProcessor entityProcessor;
@Autowired
private SetupGest setupGest;
private Logger logger = LogManager.getLogger();
@@ -278,20 +272,6 @@ public class UtilityService {
return response;
}
public ServiceRestResponse geocode(String address) throws Exception {
ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK);
IndirizzoDTO indirizzo = mapService.geocode(address);
response.setJsonObject(indirizzo);
return response;
}
public ServiceRestResponse reverseGeocode(BigDecimal lat, BigDecimal lng) throws Exception {
ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK);
IndirizzoDTO indirizzo = mapService.reverseGeocode(lat.doubleValue(), lng.doubleValue());
response.setJsonObject(indirizzo);
return response;
}
public ServiceRestResponse cmd2Export(C2EArgDTO arguments) throws Exception {
ServiceRestResponse response = new ServiceRestResponse(EsitoType.OK);
@@ -663,7 +643,7 @@ public class UtilityService {
try {
double lat = rs.getDouble("lat");
double lng = rs.getDouble("lng");
IndirizzoDTO address = getPositionFromCoords(BigDecimal.valueOf(lat), BigDecimal.valueOf(lng));
IndirizzoDTO address = geocodingService.getPositionFromCoords(BigDecimal.valueOf(lat), BigDecimal.valueOf(lng));
if (address == null) {
logger.debug("nessun indirizzo trovato per le coordinate : [ " + lat + " , " + lng + " ]");
continue;
@@ -703,71 +683,6 @@ public class UtilityService {
entityProcessor.processEntityList(testate, false);
}
private Long getAddressPositionId(IndirizzoDTO address) throws Exception {
String query = " SELECT top 1 id from stb_posizioni where " +
" ISNULL(citta,'') = ISNULL(" + UtilityDB.valueToString(address.getCitta()) + ",'') AND " +
" ISNULL(indirizzo,'') = ISNULL(" + UtilityDB.valueToString(address.getIndirizzo()) + ",'') AND " +
" ISNULL(cap,'') = ISNULL(" + UtilityDB.valueToString(address.getCap()) + ",'') AND " +
" ISNULL(prov,'') = ISNULL(" + UtilityDB.valueToString(address.getProv()) + ",'') AND " +
" ISNULL(nazione,'') = ISNULL(" + UtilityDB.valueToString(address.getNazione()) + ",'')";
Connection connection = multiDBTransactionManager.getPrimaryConnection();
PreparedStatement ps = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
return rs.getLong("id");
}
return null;
}
public IndirizzoDTO getPositionFromCoords(BigDecimal lat, BigDecimal lng) throws Exception {
double formattedLat = lat.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
double formattedLng = lng.setScale(5, RoundingMode.HALF_EVEN).doubleValue();
int distance = setupGest.getSetupInteger(multiDBTransactionManager.getPrimaryConnection(), "MAPS", "SETUP", "GEOCODE_PRECISION", 50);
String nearbyPointQuery = "SELECT * from ( " +
" SELECT *,(6371392.896 * acos(cos(radians(" + formattedLat + ")) * cos(radians(lat)) * " +
" cos(radians(lng) - radians(" + formattedLng + ")) + " +
" sin(radians(" + formattedLat + ")) * sin(radians(lat)))) AS distance " +
" FROM stb_posizioni " +
" ) distance_points " +
"where distance < " + distance +
" ORDER BY distance";
final HashMap<String, Object> nearbyPoints = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), nearbyPointQuery);
IndirizzoDTO dto;
if (nearbyPoints != null) {
dto = new IndirizzoDTO();
dto.setIdPosizione(UtilityHashMap.getValueIfExists(nearbyPoints, "id"));
dto.setCap(UtilityHashMap.getValueIfExists(nearbyPoints, "cap"));
dto.setCitta(UtilityHashMap.getValueIfExists(nearbyPoints, "citta"));
dto.setLat(UtilityHashMap.getValueIfExists(nearbyPoints, "lat"));
dto.setLng(UtilityHashMap.getValueIfExists(nearbyPoints, "lng"));
dto.setNazione(UtilityHashMap.getValueIfExists(nearbyPoints, "nazione"));
dto.setVia(UtilityHashMap.getValueIfExists(nearbyPoints, "indirizzo"));
dto.setProv(UtilityHashMap.getValueIfExists(nearbyPoints, "prov"));
dto.setIndirizzo(UtilityHashMap.getValueIfExists(nearbyPoints, "indirizzo"));
} else {
dto = mapService.reverseGeocode(lat.doubleValue(), lng.doubleValue());
StbPosizioni stbPosizioni = new StbPosizioni();
stbPosizioni.setOperation(OperationType.INSERT);
stbPosizioni.setLat(lat);
stbPosizioni.setLng(lng);
stbPosizioni.setCap(dto.getCap());
stbPosizioni.setCitta(dto.getCitta());
stbPosizioni.setIndirizzo(dto.getIndirizzo());
stbPosizioni.setNazione(dto.getNazione());
stbPosizioni.setProv(dto.getProv());
entityProcessor.processEntity(stbPosizioni, multiDBTransactionManager);
dto.setIdPosizione(stbPosizioni.getId());
}
return dto;
}
public List<JtbRicorrenze> getRicorrenze(String anno) throws Exception {
String sql = "SELECT *, CAST(0 AS BIT) AS isCompleanno\n" +
"FROM jtb_ricorrenze\n" +