From b1f402d0444db0f208ce67dbc67efcead6a2f88e Mon Sep 17 00:00:00 2001 From: sgravina Date: Thu, 26 Sep 2024 11:06:18 +0200 Subject: [PATCH] feat(upgrade-massivo): gestione rollback inserimento massivo 20240926 --- .../QuestionarioCompilatoRepository.java | 7 ++ .../repository/ServizioSqlRepository.java | 31 +++++++ .../ServizioXCittadinoRepository.java | 6 ++ .../service/ImportMassivoCSVService.java | 86 ++++++++++++++++--- .../surveymgmt/service/ServizioService.java | 37 ++++++++ 5 files changed, 155 insertions(+), 12 deletions(-) diff --git a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/QuestionarioCompilatoRepository.java b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/QuestionarioCompilatoRepository.java index 73330a47d..04ce15d1e 100644 --- a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/QuestionarioCompilatoRepository.java +++ b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/QuestionarioCompilatoRepository.java @@ -54,4 +54,11 @@ void deleteQuestionarioCompilatoByIdServizioJPA( @Query(value = "SELECT qce FROM QuestionarioCompilatoEntity qce WHERE qce.idServizio = :idServizio ") List findByIdServizioJPA(@Param(value = "idServizio") Long idServizio); + + @Query(value = "SELECT qce.* FROM QuestionarioCompilatoEntity qce WHERE qce.codInserimento = :codInserimento ", nativeQuery = true) + List findByCodInserimento(String codInserimento); + + @Modifying + @Query(value = "DELETE FROM QuestionarioCompilatoEntity qce WHERE qce.codInserimento = :codInserimento ", nativeQuery = true) + void deleteAllByCodInserimento(String codInserimento); } \ No newline at end of file diff --git a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioSqlRepository.java b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioSqlRepository.java index 478df3c23..15567c5ea 100644 --- a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioSqlRepository.java +++ b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioSqlRepository.java @@ -324,4 +324,35 @@ boolean existsByIdAndIdEnteSedeProgettoFacilitatore(Long idServizio, Optional> findAllByDataServizioAndDurataServizioAndTipologiaServizioAndIdEnteSedeProgettoFacilitatore(Date dataServizio, String durataServizio, String tipologiaServizio, EnteSedeProgettoFacilitatoreKey enteSedeProgettoFacilitatoreKey); + + Optional> findAllByDataServizioAndDurataServizioAndTipologiaServizioAndIdEnteSedeProgettoFacilitatoreAndNome(Date dataServizio, + String durataServizio, String tipologiaServizio, EnteSedeProgettoFacilitatoreKey enteSedeProgettoFacilitatoreKey, String nome); + + Optional findById(Long idServizio); + + @Query(value = "SELECT s.*\n" + + "FROM servizio s\n" + + "JOIN servizio_x_cittadino sxc ON sxc.id_servizio = s.id \n" + + "WHERE 1=1\n" + + "AND sxc.id_cittadino = :idCittadino\n" + + "AND s.data_servizio = :dataServizio\n" + + "AND s.durata_servizio = :durataServizio\n" + + "AND s.tipologia_servizio = :tipologiaServizio\n" + + "AND s.id_ente = :idEnte\n" + + "AND s.id_progetto = :idProgetto\n" + + "AND s.id_sede = :idSede\n" + + "AND s.id_facilitatore = :idFacilitatore\n" + + "AND s.id <> :idServizio\n", nativeQuery = true) + Optional> findAllByDataServizioAndDurataServizioAndTipologiaServizioAndIdEnteSedeProgettoFacilitatoreAndIdCittadino( + String dataServizio, + String durataServizio, String tipologiaServizio, + Long idEnte, String idFacilitatore, Long idProgetto, Long idSede, Long idCittadino, Long idServizio); + + + @Query(value = "SELECT s.*\n" + + "FROM servizio s\n" + + "LEFT JOIN servizio_x_cittadino sxc ON sxc.id_servizio = s.id \n" + + "WHERE s.codInserimento = :codInserimento\n" + + "AND sxc.idServizio IS NULL\n", nativeQuery = true) + List findAllByCodInserimentoWithoutSXC(String codInserimento); } \ No newline at end of file diff --git a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioXCittadinoRepository.java b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioXCittadinoRepository.java index 1c6773ab7..25a67a1d6 100644 --- a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioXCittadinoRepository.java +++ b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/repository/ServizioXCittadinoRepository.java @@ -71,4 +71,10 @@ void deleteRelazioneByIdServizioAndIdCittadino( @Modifying @Query(value = "DELETE FROM ServizioXCittadinoEntity sxc WHERE sxc.id.idServizio = :idServizio") void deleteByIdServizioJPA(@Param("idServizio") Long idServizio); + + List findById_IdCittadino(@Param("idCittadino") Long idCittadino); + + @Modifying + @Query(value = "DELETE FROM ServizioXCittadinoEntity sxc WHERE sxc.codInserimento = :codInserimento", nativeQuery = true) + void deleteAllByCodInserimento(String codInserimento); } \ No newline at end of file diff --git a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ImportMassivoCSVService.java b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ImportMassivoCSVService.java index d8db93301..410284ef4 100644 --- a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ImportMassivoCSVService.java +++ b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ImportMassivoCSVService.java @@ -21,6 +21,7 @@ import it.pa.repdgt.surveymgmt.exception.ValidationException; import it.pa.repdgt.surveymgmt.model.ElaboratoCSVRequest; import it.pa.repdgt.surveymgmt.model.ElaboratoCSVResponse; +import it.pa.repdgt.surveymgmt.mongo.repository.QuestionarioCompilatoMongoRepository; import it.pa.repdgt.surveymgmt.mongo.repository.SezioneQ3Respository; import it.pa.repdgt.surveymgmt.repository.*; import it.pa.repdgt.surveymgmt.request.QuestionarioCompilatoRequest; @@ -72,9 +73,13 @@ public class ImportMassivoCSVService { @Autowired private QuestionarioCompilatoService questionarioCompilatoService; private static final String FILE_NAME = "%s_righe_scartate_%s_%s.csv"; - + @Autowired + private ProgettoService progettoService; + @Autowired + private QuestionarioCompilatoRepository questionarioCompilatoRepository; private DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH-mm", Locale.ITALIAN); + @Async public void process(ElaboratoCSVRequest csvRequest, String uuid) throws IOException { List serviziValidati = csvRequest.getServiziValidati(); @@ -103,22 +108,50 @@ public void process(ElaboratoCSVRequest csvRequest, String uuid) throws IOExcept try { uploadFile(response, registroAttivitaEntity.getId()); } catch (IOException e) { - log.error(e.getMessage()); - registroAttivitaEntity.setJobStatus(JobStatusEnum.FAIL_S3_UPLOAD); - registroAttivitaEntity.setNote("Upload del file su s3 Fallito"); - registroAttivitaEntity.setDataFineInserimento(new Date()); - registroAttivitaRepository.save(registroAttivitaEntity); - return; + log.info("-XXX- Errore durante il salvataggio del file scarti, id RegistroAttivitaEntity: {} -XXX", + registroAttivitaEntity.getId()); + e.printStackTrace(); + try { + rollbackCaricamentoMassivo(registroAttivitaEntity.getId()); + registroAttivitaEntity.setJobStatus(JobStatusEnum.FAIL_S3_UPLOAD); + registroAttivitaEntity.setNote("Upload del file su s3 Fallito"); + registroAttivitaEntity.setDataFineInserimento(new Date()); + registroAttivitaRepository.save(registroAttivitaEntity); + } catch (Exception e2) { + log.info( + "-XXX- Errore durante il rollback del caricamento massivo, id RegistroAttivitaEntity: {} -XXX", + registroAttivitaEntity.getId()); + e.printStackTrace(); + registroAttivitaEntity.setJobStatus(JobStatusEnum.FAIL_S3_UPLOAD); + registroAttivitaEntity.setNote("Upload del file su s3 Fallito, rollback fallito"); + registroAttivitaEntity.setDataFineInserimento(new Date()); + registroAttivitaRepository.save(registroAttivitaEntity); + } } aggiornaRegistroAttivita(totaleRighe, serviziScartati.size(), serviziValidati.size(), registroAttivitaEntity, response.getResponse(), response.getFileName()); } catch (Exception e) { - registroAttivitaEntity.setJobStatus(JobStatusEnum.GENERIC_FAIL); - registroAttivitaEntity.setDataFineInserimento(new Date()); - registroAttivitaRepository.save(registroAttivitaEntity); - log.info("-XXX- Errore generico durante l'elaborazione del file, id RegistroAttivitaEntity: {} -XXX-", registroAttivitaEntity.getId()); - e.printStackTrace(); + + log.info("-XXX- Errore generico durante l'elaborazione del file, id RegistroAttivitaEntity: {} -XXX-", + registroAttivitaEntity.getId()); + e.printStackTrace(); + try { + rollbackCaricamentoMassivo(registroAttivitaEntity.getId()); + registroAttivitaEntity.setJobStatus(JobStatusEnum.GENERIC_FAIL); + registroAttivitaEntity.setNote("Caricamento fallito"); + registroAttivitaEntity.setDataFineInserimento(new Date()); + registroAttivitaRepository.save(registroAttivitaEntity); + } catch (Exception e2) { + log.info("-XXX- Errore durante il rollback del caricamento massivo, id RegistroAttivitaEntity: {} -XXX", + registroAttivitaEntity.getId()); + e.printStackTrace(); + registroAttivitaEntity.setJobStatus(JobStatusEnum.GENERIC_FAIL); + registroAttivitaEntity.setNote("Caricamento fallito, rollback fallito"); + registroAttivitaEntity.setDataFineInserimento(new Date()); + registroAttivitaRepository.save(registroAttivitaEntity); + + } } } @@ -854,4 +887,33 @@ private List removeFromList(List lista, return listaresult; } + private void rollbackCaricamentoMassivo(Long idRegistroAttivita) throws Exception { + // prendo idRegistroAttività + // cancello tutti i servizio_x_cittadino per cod_caricamento uguale a idRegistroAttività + // cerco tutti i servizi tramite codInserimento e senza associazione su servizio_x_cittadino + // cerco tutti i questionari tramite codInserimento + + // cancello da mongoDb tutti i servizi con id trovati dalla lista (id di mongo) + // cancello da mongoDb tutti i questionari con id trovati dalla lista (id di mongo) + + // cancello tutti i questionario_compilato per cod_caricamento uguale a idRegistroAttività + // cancell tutti i tipologia_servizio per ogni servizio + // cancello tutti i servizi per cod_caricamento uguale a idRegistroAttivita + + // try catch + aggiornamento registro attivita + servizioXCittadinoRepository.deleteAllByCodInserimento(idRegistroAttivita.toString()); + + List listaServizi = servizioSqlRepository.findAllByCodInserimentoWithoutSXC(idRegistroAttivita.toString()); + List listaQuestionari = questionarioCompilatoRepository.findByCodInserimento(idRegistroAttivita.toString()); + + servizioService.eliminaQuestionariMongoByListaQuestionari(listaQuestionari); + servizioService.eliminaServiziMongoByListaServizi(listaServizi); + + questionarioCompilatoRepository.deleteAllByCodInserimento(idRegistroAttivita.toString()); + + servizioService.eliminaTipologiaServizioByListaServizi(listaServizi); + + servizioService.eliminaServiziByListaServizi(listaServizi); + + } } diff --git a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ServizioService.java b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ServizioService.java index 425537a7c..651882c32 100644 --- a/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ServizioService.java +++ b/ms-questionario-cittadino/src/main/java/it/pa/repdgt/surveymgmt/service/ServizioService.java @@ -586,4 +586,41 @@ public void eliminaServizioForce(@NotNull Long idServizio) { this.servizioSQLService.cancellaServivio(servizioEntity); } + + @LogMethod + @LogExecutionTime + @Transactional + public void eliminaQuestionariMongoByListaQuestionari(List listaQuestionari){ + + for(QuestionarioCompilatoEntity questionario : listaQuestionari){ + questionarioCompilatoMongoRepository + .deleteByIdQuestionarioTemplate(questionario.getId()); + } + + } + + @LogMethod + @LogExecutionTime + @Transactional + public void eliminaServiziMongoByListaServizi(List listaServizi){ + + for(ServizioEntity servizio : listaServizi){ + this.sezioneQ3Repository.deleteByIdSezioneQ3(servizio.getIdTemplateCompilatoQ3()); + } + } + + public void eliminaTipologiaServizioByListaServizi(List listaServizi){ + // Cancello tipologie servizio + for (ServizioEntity servizio : listaServizi) { + tipologiaServizioRepository.deleteByIdServizio(servizio.getId()); + } + } + + public void eliminaServiziByListaServizi(List listaServizi){ + + for(ServizioEntity servizio : listaServizi){ + servizioSqlRepository.delete(servizio); + } + + } } \ No newline at end of file