Estou fazendo uma consulta para buscar a cidade selecionada e o bairro selecionado pelo usuario. Podem ocorrer duas situações:
Buscar apenas um bairro, que seria o local de entrega
Buscar dois bairros, que seria o local de entrega e o local de cobrança
Quando faço apenas uma busca, os dados retornados são os esperados.
Quando as cidades são diferentes a query retorna os dados esperados.
Porém se eu tenho duas buscas (cobrança e entrega) na mesma cidade não retorna o esperado.
A seguir o código que verifico se tenho o endereço de entrega e cobrança e faço as consultas no BD
// se tiver o endereço de cobrança
if(viewSearchShipping.getIdBilling()>0){
// procuro o endereco do cliente no BD
AddressBook addressBook = addressBookService.findById(viewSearchShipping.getIdBilling());
//procuro no BD a cidade e bairros que a empresa atende
CityShipping cityShipping = cityShippingService.findByName(addressBook.getCity());
// aqui removo os bairros que não importam para cotar o frete, ou seja deixo apenas o bairro que o cliente selecionou
cityShipping.getDistrictShipping().removeIf(disct -> !disct.getName().equalsIgnoreCase(addressBook.getDistrict()));
// e adiciono numa lista que sera o retorno no final do codigo para poder cotar o frete total
shippingList.add(cityShipping);
}
// endereço de entrega
if(viewSearchShipping.getIdShipping()>0){
AddressBook addressBook = addressBookService.findById(viewSearchShipping.getIdShipping());
CityShipping cityShipping = cityShippingService.findByName2(addressBook.getCity());
cityShipping.getDistrictShipping().removeIf(disct -> !disct.getName().equalsIgnoreCase(addressBook.getDistrict()));
shippingList.add(cityShipping);
}
OBS.: Como sou novo no forum só posso postar uma foto, então uni as duas fotos em uma.
Na imagem 1 demonstro o que retorna na primeira consulta (retorna o esperado)
O bairro procurado era “Costa e Silva”. No método shippingList.add(cityShipping); o retornado seria a cidade e o bairro “Costa e Silva”.
Na imagem 2 demonstro o que retorna na segunda consulta
E aqui que acontece o estranho, deveria retornar igual a imagem 1, a cidade com seus 3 bairros atendidos porém retorna o bairro “Costa e Silva”. Isso que não entendo do por que o retorno do bairro Costa e silva se executo a mesma query com a mesma cidade.
@RoinujNosde Desconfio disso também, mas não entendi a sua solução, você diz em dentro da minha classe CityShipping aonde faço o getDistrictShipping() retornar uma nova List ?
public List<DistrictShipping> getDistrictShipping() {
return this.districtShipping;
}
Então, quando a consulta retorna a cidade e os bairros atendidos quero remover o bairro que não for igual ao selecionado no front, por isso faço um removeIf dos bairros que tem o nome diferente daquele selecionado. Após a remoção retorno os dados para o front para fazer a soma dos valores do bairros para ter o total da entrega. O código completo é:
@PostMapping("findShipping/")
public ResponseEntity<?> findShipping (@RequestBody ViewSearchShipping viewSearchShipping, BindingResult bindingResult) {
AjaxResponse result = new AjaxResponse();
//lista para retorno
List<CityShipping> shippingList = new ArrayList<CityShipping>();
if(viewSearchShipping.getIdCustomer()>0) {
//endereço de cobrança
if(viewSearchShipping.getIdBilling()>0){
AddressBook addressBook = addressBookService.findById(viewSearchShipping.getIdBilling());
CityShipping cityShipping = cityShippingService.findByName(addressBook.getCity());
//removo os bairros e deixo apenas o selecionado no front
cityShipping.getDistrictShipping().removeIf(disct -> !disct.getName().equalsIgnoreCase(addressBook.getDistrict()));
shippingList.add(cityShipping);
}
//endereço de entrega
if(viewSearchShipping.getIdShipping()>0){
AddressBook addressBook = addressBookService.findById(viewSearchShipping.getIdShipping());
CityShipping cityShipping = cityShippingService.findByName(addressBook.getCity());
//removo os bairros e deixo apenas o selecionado no front
cityShipping.getDistrictShipping().removeIf(disct -> !disct.getName().equalsIgnoreCase(addressBook.getDistrict()));
shippingList.add(cityShipping);
}
}
if(shippingList.size()>0){
return ResponseEntity.ok(shippingList);
}else{
result.setMsg("Não encontramos um frete para esta região");
return ResponseEntity.badRequest().body(result);
}
}