From 44cc11ce1572db72ed19f04963d8175a2b7eb9fe Mon Sep 17 00:00:00 2001 From: MinaR Date: Fri, 9 May 2025 09:47:21 +0200 Subject: [PATCH 1/5] creazione colli da lavorazioni --- .../integry/ems/document/service/DocumentiDirettiService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java index 43a908a3e4..aa0c78f792 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java +++ b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java @@ -660,7 +660,7 @@ public class DocumentiDirettiService { createULFromDocument.getCodAnag(), createULFromDocument.getCodVdes()); codMdepTrasf = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); - if(UtilityString.isNullOrEmpty(codMdepTrasf)) isTrasferimento = true; + if(!UtilityString.isNullOrEmpty(codMdepTrasf)) isTrasferimento = true; } if (isTrasferimento) { From 4fdd5b86cb75bfa4f29321324e3d1367c2be27ce Mon Sep 17 00:00:00 2001 From: MinaR Date: Fri, 9 May 2025 10:42:34 +0200 Subject: [PATCH 2/5] inserimento promozioni --- .../ems/rules/completing/SalesRules.java | 4 +-- .../integry/ems_model/entity/VtbListData.java | 2 +- .../controller/ListiniVenditaController.java | 1 - .../product/dto/InsertPromoRequestDTO.java | 33 +++++++++++++++++++ .../service/ListiniVenditaServices.java | 15 +++++---- 5 files changed, 45 insertions(+), 10 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems/rules/completing/SalesRules.java b/ems-core/src/main/java/it/integry/ems/rules/completing/SalesRules.java index 702216d0f0..bd801d79df 100644 --- a/ems-core/src/main/java/it/integry/ems/rules/completing/SalesRules.java +++ b/ems-core/src/main/java/it/integry/ems/rules/completing/SalesRules.java @@ -850,8 +850,8 @@ public class SalesRules extends QueryRules { return campi; } - public static Boolean checkArtEquiLisv(VtbListData vtbListData) throws Exception { - boolean bloccaDiff = setupGest.getSetupBoolean("vtb_list", "ART_EQUIVALENTI", "LOCK_DIFF"); + public static Boolean checkArtEquiLisv(Connection connection, VtbListData vtbListData) throws Exception { + boolean bloccaDiff = setupGest.getSetupBoolean(connection, "vtb_list", "ART_EQUIVALENTI", "LOCK_DIFF"); if (!bloccaDiff) return false; diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/VtbListData.java b/ems-core/src/main/java/it/integry/ems_model/entity/VtbListData.java index 54dae4e651..ffa835a0e2 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/VtbListData.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/VtbListData.java @@ -343,7 +343,7 @@ public class VtbListData extends EntityBase { @Override public void checkPreSave() throws Exception { - SalesRules.checkArtEquiLisv(this); + SalesRules.checkArtEquiLisv(connection, this); } public VtbList getVtbList() { diff --git a/ems-engine/src/main/java/it/integry/ems/product/controller/ListiniVenditaController.java b/ems-engine/src/main/java/it/integry/ems/product/controller/ListiniVenditaController.java index 7fe5d88f24..2dc6818ca5 100644 --- a/ems-engine/src/main/java/it/integry/ems/product/controller/ListiniVenditaController.java +++ b/ems-engine/src/main/java/it/integry/ems/product/controller/ListiniVenditaController.java @@ -5,7 +5,6 @@ import it.integry.ems.product.dto.DuplicaListinoDTO; import it.integry.ems.product.dto.InsertPromoRequestDTO; import it.integry.ems.product.dto.InsertPromoResponseDTO; import it.integry.ems.product.service.ListiniVenditaServices; -import it.integry.ems.response.EsitoType; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.response.StatusResponse; import it.integry.ems.status.ServiceChecker; diff --git a/ems-engine/src/main/java/it/integry/ems/product/dto/InsertPromoRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/product/dto/InsertPromoRequestDTO.java index af2ad5b3d4..5dc015156e 100644 --- a/ems-engine/src/main/java/it/integry/ems/product/dto/InsertPromoRequestDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/product/dto/InsertPromoRequestDTO.java @@ -95,8 +95,14 @@ public class InsertPromoRequestDTO { public static class Articolo{ @JsonProperty("codmart") private String codMart; + @JsonProperty("descrizione") + private String descrizione; @JsonProperty("przvendiva") private BigDecimal przVendIva; + @JsonProperty("note") + private String note; + @JsonProperty("giacenza") + private BigDecimal giacenza; public String getCodMart() { return codMart; @@ -107,6 +113,15 @@ public class InsertPromoRequestDTO { return this; } + public String getDescrizione() { + return descrizione; + } + + public Articolo setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + public BigDecimal getPrzVendIva() { return przVendIva; } @@ -115,5 +130,23 @@ public class InsertPromoRequestDTO { this.przVendIva = przVendIva; return this; } + + public String getNote() { + return note; + } + + public Articolo setNote(String note) { + this.note = note; + return this; + } + + public BigDecimal getGiacenza() { + return giacenza; + } + + public Articolo setGiacenza(BigDecimal giacenza) { + this.giacenza = giacenza; + return this; + } } } diff --git a/ems-engine/src/main/java/it/integry/ems/product/service/ListiniVenditaServices.java b/ems-engine/src/main/java/it/integry/ems/product/service/ListiniVenditaServices.java index 3d13df3ca4..40a2b75d84 100644 --- a/ems-engine/src/main/java/it/integry/ems/product/service/ListiniVenditaServices.java +++ b/ems-engine/src/main/java/it/integry/ems/product/service/ListiniVenditaServices.java @@ -869,9 +869,11 @@ public class ListiniVenditaServices { vtbListData.setOperation(OperationType.INSERT); for (InsertPromoRequestDTO.Articolo articolo : insertPromoRequest.getArticoli()) { - MtbLisvData mtbLisvData = new MtbLisvData(); - mtbLisvData.setCodMart(articolo.getCodMart()); - mtbLisvData.setPrzVendIva(articolo.getPrzVendIva()); + MtbLisvData mtbLisvData = new MtbLisvData() + .setCodMart(articolo.getCodMart()) + .setPrzVendIva(articolo.getPrzVendIva()) + .setNote(articolo.getNote()) + .setGiacenza(articolo.getGiacenza()); mtbLisvData.setOperation(OperationType.INSERT); vtbListData.getMtbLisvData().add(mtbLisvData); } @@ -879,7 +881,7 @@ public class ListiniVenditaServices { entityToProcess.add(vtbListData); } - List> calls = new ArrayList<>(); + /*List> calls = new ArrayList<>(); for (EntityBase entity : entityToProcess) { Callable callable = () -> { @@ -890,10 +892,11 @@ public class ListiniVenditaServices { } }; calls.add(callable); - } + }*/ try { - List entityRet = taskExecutorService.executeTasks(calls); + //List entityRet = taskExecutorService.executeTasks(calls); + List entityRet = entityProcessor.processEntityList(entityToProcess, true); UtilityEntity.throwEntitiesException(entityRet); InsertPromoResponse.setEntityBases(entityRet); } catch (Exception e) { From 0dc0f444933cc0fb8edc2ce4dfcfc07f58a7d3b6 Mon Sep 17 00:00:00 2001 From: Valerio Castellana Date: Fri, 9 May 2025 13:18:54 +0200 Subject: [PATCH 3/5] [ROSSOGARGANO] - nuova chiusura ordine con riproporzionamento --- .../model/Migration_20250508101354.java | 22 + .../integry/ems/service/AziendaService.java | 7 + .../ems_model/utility/UtilityBigDecimal.java | 7 + .../ems_model/utility/UtilityString.java | 4 + .../service/LicorProductionService.java | 2 - .../controller/DocumentProdController.java | 3 +- .../document/dto/CaricoLavorazioneDTO.java | 9 - .../document/dto/ChiusuraLavorazioneDTO.java | 31 +- .../ems/document/dto/ProduzioneOrdineDTO.java | 102 +++++ .../ems/document/dto/ScarichiArticoloDTO.java | 39 ++ .../document/dto/ScaricoLavorazioneDTO.java | 9 - .../document/service/DocumentProdService.java | 432 +++++++++++++----- .../controller/MesProductionControllerV2.java | 23 + .../ems/production/dto/MesStopOrdineDTO.java | 126 +++++ .../service/MesProductionServiceV2.java | 17 +- .../ProductionOrdersLifecycleService.java | 196 ++++++++ .../production/service/ProductionService.java | 72 +-- .../retail/wms/dto/CreateUDSRequestDTO.java | 11 + .../service/WMSLavorazioneService.java | 120 ++++- 19 files changed, 1047 insertions(+), 185 deletions(-) create mode 100644 ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250508101354.java create mode 100644 ems-engine/src/main/java/it/integry/ems/document/dto/ProduzioneOrdineDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/document/dto/ScarichiArticoloDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/production/dto/MesStopOrdineDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/production/service/ProductionOrdersLifecycleService.java diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250508101354.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250508101354.java new file mode 100644 index 0000000000..fec3b1dfde --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250508101354.java @@ -0,0 +1,22 @@ +package it.integry.ems.migration.model; + +import it.integry.ems.migration._base.BaseMigration; +import it.integry.ems.migration._base.IntegryCustomerDB; +import it.integry.ems.migration._base.MigrationModelInterface; + +public class Migration_20250508101354 extends BaseMigration implements MigrationModelInterface { + + @Override + public void up() throws Exception { + if (isHistoryDB()) + return; + if (isCustomerDb(IntegryCustomerDB.RossoGargano_RossoGargano)) + return; + + createSetup("PVM","CONTROLLO_GIACENZE","TIPOLOGIA_COMMESSE_DA_INCLUDERE",null,"Indicare le tipologie di commesse (separate da |) che devono essere selezionabili, in Giacenze per UL e Posizione, nell'attribuzione di una commessa ad una pedana, oltre alle commesse legate ad ordini di vendita",null); + } + + @Override + public void down() throws Exception { + } +} \ No newline at end of file diff --git a/ems-core/src/main/java/it/integry/ems/service/AziendaService.java b/ems-core/src/main/java/it/integry/ems/service/AziendaService.java index a2cd910533..2d2062c55e 100644 --- a/ems-core/src/main/java/it/integry/ems/service/AziendaService.java +++ b/ems-core/src/main/java/it/integry/ems/service/AziendaService.java @@ -30,4 +30,11 @@ public class AziendaService { return UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), internalCodAnagsQuery); } + + public String retrieveInternalPartIva() throws Exception { + String internalCodAnagsQuery = "SELECT part_iva\n" + + "FROM azienda"; + + return UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), internalCodAnagsQuery); + } } diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java index ecf9f7515c..a354562a76 100644 --- a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java +++ b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java @@ -121,5 +121,12 @@ public class UtilityBigDecimal { return input.setScale(5, RoundingMode.HALF_EVEN); } + public static BigDecimal calculatePercentage(BigDecimal base, double percentValue) { + return calculatePercentage(base,percentValue,5); + } + public static BigDecimal calculatePercentage(BigDecimal base, double percentValue, int scale) { + BigDecimal percent = new BigDecimal(percentValue).divide(new BigDecimal("100"), scale, RoundingMode.HALF_UP); + return base.multiply(percent); + } } diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityString.java b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityString.java index d53e912226..11943ecb6b 100644 --- a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityString.java +++ b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityString.java @@ -218,6 +218,10 @@ public class UtilityString { return string == null || "".equals(string) || string.equals(EmsRestConstants.NULL); } + public static boolean hasContent(Object string) { + return !isNullOrEmpty(string); + } + public static String identifyLineDelimiter(String str) { if (str.matches("(?s).*(\\r\\n).*")) { //Windows //$NON-NLS-1$ return "\r\n"; //$NON-NLS-1$ diff --git a/ems-engine/src/main/java/it/integry/ems/customizations/production/service/LicorProductionService.java b/ems-engine/src/main/java/it/integry/ems/customizations/production/service/LicorProductionService.java index cc270b963c..6af75b43be 100644 --- a/ems-engine/src/main/java/it/integry/ems/customizations/production/service/LicorProductionService.java +++ b/ems-engine/src/main/java/it/integry/ems/customizations/production/service/LicorProductionService.java @@ -236,7 +236,6 @@ public class LicorProductionService { CaricoLavorazioneDTO dtoCarico = new CaricoLavorazioneDTO(); dtoCarico.setCodDtip(datiCarico.getCodDtip()) - .setDataDoc(datiCarico.getDataDoc()) .setDataReg(datiCarico.getDataReg()) .setSerDoc(datiCarico.getSerDoc()) .setNumDoc(datiCarico.getNumDoc()) @@ -249,7 +248,6 @@ public class LicorProductionService { dtoScarico.setCodDtip(datiScarico.getCodDtip()) .setCodMdep(datiScarico.getCodMdep()) .setCodAnag(chiusuraLavorazioneDTO.getOrdine().getCodAnag()) - .setDataDoc(new Date()) .setQtaProd(chiusuraLavorazioneDTO.getQtaProd()); diff --git a/ems-engine/src/main/java/it/integry/ems/document/controller/DocumentProdController.java b/ems-engine/src/main/java/it/integry/ems/document/controller/DocumentProdController.java index 1493b64536..e766777b91 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/controller/DocumentProdController.java +++ b/ems-engine/src/main/java/it/integry/ems/document/controller/DocumentProdController.java @@ -41,6 +41,7 @@ public class DocumentProdController { private ManutenzioneProduzioniService manutenzioneProduzioniService; @RequestMapping(value = EmsRestConstants.PATH_CARICO_PROD_FIN, method = RequestMethod.POST) + @Deprecated public @ResponseBody ServiceRestResponse generateCaricoProdFinLav(HttpServletRequest request, @RequestParam(CommonConstants.PROFILE_DB) String configuration, @@ -95,8 +96,8 @@ public class DocumentProdController { return response; } - @RequestMapping(value = EmsRestConstants.PATH_GENERA_DOCUMENTI_CLAV, method = RequestMethod.POST) + @Deprecated public @ResponseBody ServiceRestResponse generateDocumentiCLAV(HttpServletRequest request, @RequestParam(CommonConstants.PROFILE_DB) String configuration, diff --git a/ems-engine/src/main/java/it/integry/ems/document/dto/CaricoLavorazioneDTO.java b/ems-engine/src/main/java/it/integry/ems/document/dto/CaricoLavorazioneDTO.java index fce8452846..910a05a4bb 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/dto/CaricoLavorazioneDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/document/dto/CaricoLavorazioneDTO.java @@ -9,7 +9,6 @@ public class CaricoLavorazioneDTO { private String codDtip; private String codMdep; private String serDoc; - private Date dataDoc; private Date dataReg; private Date dataIns; private String codAnag; @@ -48,14 +47,6 @@ public class CaricoLavorazioneDTO { return this; } - public Date getDataDoc() { - return dataDoc; - } - - public CaricoLavorazioneDTO setDataDoc(Date dataDoc) { - this.dataDoc = dataDoc; - return this; - } public String getCodAnag() { return codAnag; diff --git a/ems-engine/src/main/java/it/integry/ems/document/dto/ChiusuraLavorazioneDTO.java b/ems-engine/src/main/java/it/integry/ems/document/dto/ChiusuraLavorazioneDTO.java index c4bb05352c..2126777989 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/dto/ChiusuraLavorazioneDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/document/dto/ChiusuraLavorazioneDTO.java @@ -4,6 +4,10 @@ package it.integry.ems.document.dto; import it.integry.ems_model.entity.DtbOrdt; import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; public class ChiusuraLavorazioneDTO { @@ -13,15 +17,16 @@ public class ChiusuraLavorazioneDTO { private String partitaMag; private String untMisProd; private BigDecimal rapConvProd; + private Date dataDoc; private String codJfas; private String note; private String rifOrd; - private CaricoLavorazioneDTO caricoLavorazioneDTO; - private ScaricoLavorazioneDTO scaricoLavorazioneDTO; - private RientroLavorazioneDTO rientroLavorazioneDTO; + private CaricoLavorazioneDTO caricoLavorazioneDTO = new CaricoLavorazioneDTO(); + private ScaricoLavorazioneDTO scaricoLavorazioneDTO = new ScaricoLavorazioneDTO(); + private RientroLavorazioneDTO rientroLavorazioneDTO = new RientroLavorazioneDTO(); private boolean effettuaCarico = true; private boolean effettuaScarico = true; @@ -30,6 +35,8 @@ public class ChiusuraLavorazioneDTO { private boolean terminaLavorazioneLinea = false; private boolean salvaDocumenti = true; + private List produzioniOrdine = new ArrayList<>(); + public DtbOrdt getOrdine() { return ordine; } @@ -192,4 +199,22 @@ public class ChiusuraLavorazioneDTO { this.rifOrd = rifOrd; return this; } + + public List getProduzioniOrdine() { + return produzioniOrdine; + } + + public ChiusuraLavorazioneDTO setProduzioniOrdine(List produzioniOrdine) { + this.produzioniOrdine = produzioniOrdine; + return this; + } + + public Date getDataDoc() { + return dataDoc; + } + + public ChiusuraLavorazioneDTO setDataDoc(Date dataDoc) { + this.dataDoc = dataDoc; + return this; + } } diff --git a/ems-engine/src/main/java/it/integry/ems/document/dto/ProduzioneOrdineDTO.java b/ems-engine/src/main/java/it/integry/ems/document/dto/ProduzioneOrdineDTO.java new file mode 100644 index 0000000000..4f376ea0c2 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/document/dto/ProduzioneOrdineDTO.java @@ -0,0 +1,102 @@ +package it.integry.ems.document.dto; + +import it.integry.ems_model.annotation.SqlField; +import it.integry.ems_model.entity.DtbOrdt; +import it.integry.ems_model.entity.MtbColt; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class ProduzioneOrdineDTO { + @SqlField("cod_mart") + private String codMart; + @SqlField("partita_mag") + private String partitaMag; + @SqlField("data_prod") + private LocalDate dataProd; + @SqlField("quantita") + private BigDecimal quantita; + + private DtbOrdt ordine; + + @SqlField("peso_produzione") + private BigDecimal pesoProduzione; + + + private List scarichiProduzione = new ArrayList<>(); + + public String getCodMart() { + return codMart; + } + + public ProduzioneOrdineDTO() {} + public ProduzioneOrdineDTO(String codMart, String partitaMag, BigDecimal quantita, DtbOrdt ordine) { + this.codMart = codMart; + this.partitaMag = partitaMag; + this.quantita = quantita; + this.ordine = ordine; + } + + + public ProduzioneOrdineDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getPartitaMag() { + return partitaMag; + } + + public ProduzioneOrdineDTO setPartitaMag(String partitaMag) { + this.partitaMag = partitaMag; + return this; + } + + public LocalDate getDataProd() { + return dataProd; + } + + public ProduzioneOrdineDTO setDataProd(LocalDate dataProd) { + this.dataProd = dataProd; + return this; + } + + public BigDecimal getQuantita() { + return quantita; + } + + public ProduzioneOrdineDTO setQuantita(BigDecimal quantita) { + this.quantita = quantita; + return this; + } + + public BigDecimal getPesoProduzione() { + return pesoProduzione; + } + + public ProduzioneOrdineDTO setPesoProduzione(BigDecimal pesoProduzione) { + this.pesoProduzione = pesoProduzione; + return this; + } + + public List getScarichiProduzione() { + return scarichiProduzione; + } + + public ProduzioneOrdineDTO setScarichiProduzione(List scarichiProduzione) { + this.scarichiProduzione = scarichiProduzione; + return this; + } + + public DtbOrdt getOrdine() { + return ordine; + } + + public ProduzioneOrdineDTO setOrdine(DtbOrdt ordine) { + this.ordine = ordine; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/document/dto/ScarichiArticoloDTO.java b/ems-engine/src/main/java/it/integry/ems/document/dto/ScarichiArticoloDTO.java new file mode 100644 index 0000000000..144e58c592 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/document/dto/ScarichiArticoloDTO.java @@ -0,0 +1,39 @@ +package it.integry.ems.document.dto; + +import it.integry.ems_model.entity.MtbColr; + +import java.math.BigDecimal; +import java.util.List; + +public class ScarichiArticoloDTO { + private String codMart; + private BigDecimal qtaScaricata; + private List scarichi; + + public String getCodMart() { + return codMart; + } + + public ScarichiArticoloDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public BigDecimal getQtaScaricata() { + return qtaScaricata; + } + + public ScarichiArticoloDTO setQtaScaricata(BigDecimal qtaScaricata) { + this.qtaScaricata = qtaScaricata; + return this; + } + + public List getScarichi() { + return scarichi; + } + + public ScarichiArticoloDTO setScarichi(List scarichi) { + this.scarichi = scarichi; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/document/dto/ScaricoLavorazioneDTO.java b/ems-engine/src/main/java/it/integry/ems/document/dto/ScaricoLavorazioneDTO.java index d2c033b606..3e2e86dade 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/dto/ScaricoLavorazioneDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/document/dto/ScaricoLavorazioneDTO.java @@ -10,7 +10,6 @@ public class ScaricoLavorazioneDTO { private String codMdep; private String serDoc; - private Date dataDoc; private String codAnag; private Integer numDoc; private String activityId; @@ -47,14 +46,6 @@ public class ScaricoLavorazioneDTO { return this; } - public Date getDataDoc() { - return dataDoc; - } - - public ScaricoLavorazioneDTO setDataDoc(Date dataDoc) { - this.dataDoc = dataDoc; - return this; - } public String getCodAnag() { return codAnag; diff --git a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java index 9a20befaee..e607c30f6c 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java +++ b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java @@ -8,6 +8,7 @@ import it.integry.ems.document.Import.service.DocumentiLavDaDist; import it.integry.ems.document.dto.*; import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.response.ServiceRestResponse; +import it.integry.ems.retail.wms.lavorazione.service.WMSLavorazioneService; import it.integry.ems.rules.businessLogic.LoadColliService; import it.integry.ems.rules.businessLogic.dto.LoadColliDTO; import it.integry.ems.rules.completing.ConfigActivityRules; @@ -64,6 +65,8 @@ public class DocumentProdService { private LoadColliService loadColliService; @Autowired private DocumentiLavDaDist documentiLavDaDist; + @Autowired + private WMSLavorazioneService wmsLavorazioneService; private final Logger logger = LogManager.getLogger(); @@ -647,6 +650,8 @@ public class DocumentProdService { return entitiesReturn; } + @Deprecated + //Use ProductionService::chiudiOrdineLavorazione public void caricoProdFinLav(CaricoProdFinLavDTO carico) throws Exception { boolean fermaCreaDocsEnabled = setupGest.getSetupBoolean(multiDBTransactionManager.getPrimaryConnection(), "CARICO_SCARICO_PF", "SETUP", "FERMA_CREA_DOCS"); @@ -2298,6 +2303,7 @@ public class DocumentProdService { return arrayEntity; } + @Deprecated public List generaDocumentiCLAV(Date dataLav, String codMdep) throws Exception { String sql = "SELECT cod_anag FROM mtb_depo WHERE cod_mdep = " + UtilityDB.valueToString(codMdep); @@ -2782,7 +2788,7 @@ public class DocumentProdService { CaricoLavorazioneDTO caricoDto = dtoChiusura.getCaricoLavorazioneDTO(); ScaricoLavorazioneDTO scaricoDto = dtoChiusura.getScaricoLavorazioneDTO(); - + dtoChiusura.setProduzioniOrdine(getProduzioniOrdine(dtoChiusura.getOrdine(), dtoChiusura.getDataDoc() == null)); // Verifica se è attiva l'opzione di creazione ID_ACTIVITY su carichi e scarichi HashMap setupCaricoScariPF = setupGest.getSetupSection(multiDBTransactionManager.getPrimaryConnection(), "CARICO_SCARICO_PF", "SETUP"); @@ -2803,7 +2809,7 @@ public class DocumentProdService { caricoDto.setCodMdep(ordine.getCodMdep()); } if (caricoDto.getSerDoc() == null) { - caricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), caricoDto.getCodDtip(), caricoDto.getCodMdep(), caricoDto.getDataDoc())); + caricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), caricoDto.getCodDtip(), caricoDto.getCodMdep(), dtoChiusura.getDataDoc())); } caricoDto.setActivityId(activityId); listDocs.addAll(generaDocCaricoDaOrdineLav(dtoChiusura)); @@ -2817,7 +2823,7 @@ public class DocumentProdService { } if (scaricoDto.getSerDoc() == null) { - scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), scaricoDto.getDataDoc())); + scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), dtoChiusura.getDataDoc())); } scaricoDto.setActivityId(activityId); @@ -2862,7 +2868,7 @@ public class DocumentProdService { CaricoLavorazioneDTO caricoDto = dtoChiusura.getCaricoLavorazioneDTO(); if (caricoDto.getSerDoc() == null) { - caricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), caricoDto.getCodDtip(), caricoDto.getCodMdep(), caricoDto.getDataDoc())); + caricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), caricoDto.getCodDtip(), caricoDto.getCodMdep(), dtoChiusura.getDataDoc())); } caricoDto.setActivityId(activityId); @@ -2873,7 +2879,7 @@ public class DocumentProdService { ScaricoLavorazioneDTO scaricoDto = dtoChiusura.getScaricoLavorazioneDTO(); if (scaricoDto.getSerDoc() == null) { - scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), scaricoDto.getDataDoc())); + scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), dtoChiusura.getDataDoc())); } scaricoDto.setActivityId(activityId); @@ -2942,19 +2948,64 @@ public class DocumentProdService { documentiScarico.addAll(generaDocumentiScaricoOrdineDaColli(dto)); } - /*Genera scarico materiali: se c'è stato uno scarico da collo di versamento allora scarica solo eventuali materiali restanti*/ - /*Se la data del documento non viene passata da fuori allora vuole dire che la generazione dei carichi/scarichi deve essere fatta - * utilizzando la data dei colli di versamento o carico*/ - if (dtoScarico.getDataDoc() == null) { - documentiScarico.addAll(generaDocumentiScaricoMaterialiDaDataCollo(dto)); - } else { - documentiScarico.addAll(generaDocumentiScaricoMateriali(dto, null)); + // + for (ProduzioneOrdineDTO produzione : dto.getProduzioniOrdine()){ + documentiScarico.addAll(generaDocumentiScaricoMateriali(dto, produzione)); } +// if (dto.getDataDoc() == null) { +// documentiScarico.addAll(generaDocumentiScaricoMaterialiDaDataCollo(dto)); +// } else { +// documentiScarico.addAll(generaDocumentiScaricoMateriali(dto, null)); +// } + // return documentiScarico; } + /** + * + * @param ordine ordine da controllare + * @param separaPerData separa le produzioni per data collo + * @return Recupera tutte le produzioni senza documento dell'ordine suddivise per articolo, partita e (se necessario) data di produzione + * @throws Exception + */ + private List getProduzioniOrdine(DtbOrdt ordine, boolean separaPerData) throws Exception { + List produzioni = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), + it.integry.ems_model.utility.Query.format("SELECT mtb_colr.cod_mart, mtb_colr.partita_mag," + (separaPerData ? "mtb_colr.data_collo as data_prod," : "") + "SUM(mtb_colr.qta_col) as quantita\n" + + "from mtb_colr\n" + + " inner join mtb_colt on mtb_colr.gestione = mtb_colt.gestione and mtb_colr.data_collo = mtb_colt.data_collo and\n" + + " mtb_colr.ser_collo = mtb_colt.ser_collo and mtb_colr.num_collo = mtb_colt.num_collo\n" + + " inner join dtb_ordt on dtb_ordt.data_ord = mtb_colt.data_ord and mtb_colt.num_ord = dtb_ordt.num_ord \n" + + " and mtb_colr.cod_mart = dtb_ordt.cod_prod\n" + + "where mtb_colt.gestione = 'L'\n" + + " and mtb_colt.segno = 1 \n" + + " and mtb_colt.cod_dtip IS NULL \n" + + "and dtb_ordt.data_ord = {}\n" + + "and dtb_ordt.num_ord = {}\n" + + "group by mtb_colr.cod_mart, mtb_colr.partita_mag" + (separaPerData ? ",mtb_colr.data_collo" : ""), ordine.getDataOrd(), ordine.getNumOrd()), + ProduzioneOrdineDTO.class); + if (UtilityList.isNullOrEmpty(produzioni)) { + return produzioni; + } + + BigDecimal qtaProdotta = produzioni.stream().map(ProduzioneOrdineDTO::getQuantita).reduce(BigDecimal.ZERO,BigDecimal::add); + produzioni.forEach(x -> + { + x.setPesoProduzione(BigDecimal.valueOf(100).multiply(x.getQuantita()).divide(qtaProdotta, 3, RoundingMode.HALF_EVEN)); + x.setOrdine(ordine); + } + ); + return produzioni; + } + public DtbDoct generaTestataDocDaOrdineLav(DtbOrdt ordineLav, String codDtip, Date dataDoc, String serDoc, String codAnag, Integer numDoc, String codMdep) throws Exception { + return generaTestataDocDaOrdineLav(ordineLav, codDtip, dataDoc, serDoc, codAnag, numDoc, codMdep, ordineLav.getPartitaMag()); + + } + public DtbDoct generaTestataDocDaOrdineLav(DtbOrdt ordineLav, String codDtip, Date dataDoc, String serDoc, String codAnag, Integer numDoc, String codMdep, String partitaMag) throws Exception { + DtbDoct docT = new DtbDoct(); if (codDtip == null) { throw new Exception("Tipo documento non configurato!"); @@ -2977,7 +3028,7 @@ public class DocumentProdService { docT.setCodJcom(ordineLav.getCodJcom()); docT.setCodMdep(codMdep != null ? codMdep : ordineLav.getCodMdep()); docT.setCodProd(ordineLav.getCodProd()); - docT.setPartitaMag(ordineLav.getPartitaMag()); + docT.setPartitaMag(partitaMag); docT.setNumOrd(ordineLav.getNumOrd()); docT.setDataOrd(ordineLav.getDataOrd()); docT.setUntMisProd(ordineLav.getUntMisProd()); @@ -2997,7 +3048,7 @@ public class DocumentProdService { throw new Exception("I dati per la generazione del documento di carico sono incompleti"); } if (chiusuraLavorazioneDTO.isChiudiOrdine()) { - if (caricoLavorazioneDTO.getCodJfas() != null) { + if (UtilityString.hasContent(caricoLavorazioneDTO.getCodJfas())) { condFase = "mtb_colt.cod_jfas = " + UtilityDB.valueToString(caricoLavorazioneDTO.getCodJfas()); } } @@ -3007,7 +3058,7 @@ public class DocumentProdService { /*Se la data del documento non è stata passata da fuori allora la data documento dovrà essere quella del collo */ List results = new ArrayList<>(); - if (caricoLavorazioneDTO.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { String sql = "SELECT DISTINCT mtb_colt.data_collo as data_doc_from_collo, sum(mtb_colr.qta_col) as qta_col_for_date " + " FROM mtb_colt LEFT OUTER JOIN dtb_ordt ON mtb_colt.gestione = dtb_ordt.gestione AND" + @@ -3033,7 +3084,7 @@ public class DocumentProdService { } } else { DataDocFromCollo dataDocFromCollo = new DataDocFromCollo(); - dataDocFromCollo.setDataDocFromCollo(caricoLavorazioneDTO.getDataDoc()); + dataDocFromCollo.setDataDocFromCollo(chiusuraLavorazioneDTO.getDataDoc()); dataDocFromCollo.setQtaColForDate(caricoLavorazioneDTO.getQtaProd()); /*UM magazzino*/ results.add(dataDocFromCollo); } @@ -3051,7 +3102,7 @@ public class DocumentProdService { .setNumOrd(ordine.getNumOrd()); String condDataCollo = ""; - if (caricoLavorazioneDTO.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { condDataCollo = "mtb_colt.data_collo = " + UtilityDB.valueDateToString(dto.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD); } @@ -3105,24 +3156,27 @@ public class DocumentProdService { // Acquisizione dati configurazione e passati dall'esterno CaricoLavorazioneDTO dtoCarico = chiusuraLavorazioneDTO.getCaricoLavorazioneDTO(); - if (dtoCarico.getDataDoc() == null) { - dtoCarico.setDataDoc(new Date()); + if (chiusuraLavorazioneDTO.getDataDoc() == null) { + chiusuraLavorazioneDTO.setDataDoc(new Date()); } DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); - // Acquisizione dati prodotto dall'estetno + + // // todo: al momento abbiamo dato per scontato che da fuori arrvi solo e sempre il prodotto/partita associata all'ordine passato, perchè le logiche di più partite o imballi differenti è una logiaca utilizzata solo da ex-PERILFLOR BigDecimal qtaProdUMMag = dtoCarico.getQtaProd(); BigDecimal qtaProd = qtaProdUMMag.divide(ordine.getRapConvProd(), 2, RoundingMode.HALF_UP); + // - // Verifica esistenza partita magazzino + // if (ordine.getPartitaMag() == null) { throw new Exception("L'ordine di lavorazione n." + UtilityDB.valueToString(ordine.getNumOrd()) + " del " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " non ha la specifica del lotto di produzione."); } + // - // Geenera testata documento di carico - DtbDoct docT = generaTestataDocDaOrdineLav(ordine, dtoCarico.getCodDtip(), dtoCarico.getDataDoc(), dtoCarico.getSerDoc(), dtoCarico.getCodAnag(), dtoCarico.getNumDoc(), dtoCarico.getCodMdep()); + // + DtbDoct docT = generaTestataDocDaOrdineLav(ordine, dtoCarico.getCodDtip(), chiusuraLavorazioneDTO.getDataDoc(), dtoCarico.getSerDoc(), dtoCarico.getCodAnag(), dtoCarico.getNumDoc(), dtoCarico.getCodMdep()); docT.setOperation(OperationType.INSERT); @@ -3133,6 +3187,7 @@ public class DocumentProdService { if (dtoCarico.getDataReg() != null) { docT.setDataReg(dtoCarico.getDataReg()); } + // // Geenera righe documento di carico @@ -3153,102 +3208,67 @@ public class DocumentProdService { private List generaDocumentiScaricoOrdineDaColli(@NotNull ChiusuraLavorazioneDTO chiusuraLavorazioneDTO) throws Exception { List documents = new ArrayList<>(); - String condFase = null; + String condFase = (!chiusuraLavorazioneDTO.isChiudiOrdine() && UtilityString.hasContent(chiusuraLavorazioneDTO.getCodJfas())) ? "mtb_colt.cod_jfas = " + UtilityDB.valueToString(chiusuraLavorazioneDTO.getCodJfas()) : null; - - if (!chiusuraLavorazioneDTO.isChiudiOrdine()) { - if (chiusuraLavorazioneDTO.getCodJfas() != null) { - condFase = "mtb_colt.cod_jfas = " + UtilityDB.valueToString(chiusuraLavorazioneDTO.getCodJfas()); - } - } DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); ScaricoLavorazioneDTO datiScarico = chiusuraLavorazioneDTO.getScaricoLavorazioneDTO(); - /*Se la data del documento non è stata passata da fuori allora la data documento dovrà essere quella del collo */ - List results = new ArrayList<>(); - if (datiScarico.getDataDoc() == null) { - String sql = - " SELECT distinct mtb_colt.data_collo as data_doc_from_collo, " + - " ISNULL(carichi.qta_col_for_date , 0) as qta_col_for_date " + - " FROM mtb_colt left outer join (SELECT mtb_colt.data_collo , " + - " sum(qta_col) as qta_col_for_date " + - " FROM mtb_colt , mtb_colr " + - " WHERE mtb_colt.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + - " mtb_colt.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + - " mtb_colt.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()) + " AND " + - " mtb_colt.cod_dtip IS NULL AND " + - " mtb_colt.segno = 1 AND " + - " mtb_colt.gestione = mtb_colr.gestione AND " + - " mtb_colt.data_collo = mtb_colr.data_collo AND " + - " mtb_colt.ser_collo = mtb_colr.ser_collo AND " + - " mtb_colt.num_collo = mtb_colr.num_collo " + - "GROUP BY mtb_colt.data_collo )carichi ON mtb_colt.data_collo = carichi.data_collo " + - " WHERE mtb_colt.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + - " mtb_colt.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + - " mtb_colt.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()) + " AND " + - " mtb_colt.cod_dtip IS NULL AND " + - " mtb_colt.segno = -1 " + - "ORDER BY 1 "; + // - sql = UtilityDB.addwhereCond(sql, condFase, false); - results = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DataDocFromCollo.class); - if (results == null) { - results = new ArrayList<>(); - } - } else { - DataDocFromCollo dataDocFromCollo = new DataDocFromCollo(); - dataDocFromCollo.setDataDocFromCollo(datiScarico.getDataDoc()); - dataDocFromCollo.setQtaColForDate(chiusuraLavorazioneDTO.getScaricoLavorazioneDTO().getQtaProd()); /*UM magazzino*/ - results.add(dataDocFromCollo); + if (UtilityList.isNullOrEmpty(chiusuraLavorazioneDTO.getProduzioniOrdine())) { + //se la lista delle produzioni è vuota (non ci sono colli di produzione agganciati ne aggiungo uno preso dall'ordine ) + chiusuraLavorazioneDTO.setProduzioniOrdine(Collections.singletonList(new ProduzioneOrdineDTO(ordine.getCodProd(), ordine.getPartitaMag(), chiusuraLavorazioneDTO.getScaricoLavorazioneDTO().getQtaProd(), ordine))); + chiusuraLavorazioneDTO.setOrdine(ordine); } + // - for (DataDocFromCollo ddfc : results) { + // + String sql = + "SELECT DISTINCT mtb_colt.gestione, " + + " mtb_colt.data_collo, " + + " mtb_colt.ser_collo, " + + " mtb_colt.num_collo " + + " FROM mtb_colt, " + + " mtb_colr " + + " WHERE mtb_colr.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + + " mtb_colr.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " mtb_colr.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()) + " AND " + + " mtb_colt.cod_dtip IS NULL AND " + + " mtb_colt.segno = -1 AND " + + " mtb_colt.gestione = mtb_colr.gestione AND " + + " mtb_colt.data_collo = mtb_colr.data_collo AND " + + " mtb_colt.ser_collo = mtb_colr.ser_collo AND " + + " mtb_colt.num_collo = mtb_colr.num_collo " + + "ORDER BY 1, 2, 3, 4 "; + + sql = UtilityDB.addwhereCond(sql, condFase, false); + List scarichi = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbColt.class); + List produzioni = wmsLavorazioneService.riproporzionaScarichiLavorazione(chiusuraLavorazioneDTO.getProduzioniOrdine(), scarichi); + // + for (ProduzioneOrdineDTO produzione : produzioni) { + if (UtilityList.isNullOrEmpty(produzione.getScarichiProduzione())) + continue; + Date dataDoc = UtilityDate.isNull(UtilityLocalDate.localDateToDate(produzione.getDataProd()), chiusuraLavorazioneDTO.getDataDoc()); LoadColliDTO loadColli = new LoadColliDTO() .setCodAnag(datiScarico.getCodAnag()) .setCodDtip(datiScarico.getCodDtip()) - .setDataDoc(ddfc.getDataDocFromCollo()) + .setDataDoc(dataDoc) .setSerDoc(datiScarico.getSerDoc()) .setCodMdep(datiScarico.getCodMdep()) .setDataOrd(ordine.getDataOrd()) .setNumOrd(ordine.getNumOrd()); - String condDataCollo = ""; - if (datiScarico.getDataDoc() == null) { - condDataCollo = "mtb_colt.data_collo = " + UtilityDB.valueDateToString(ddfc.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD); - } - // Acquisizione colli di scarico intestati all'ordine di lavorazione - String sql = - "SELECT DISTINCT mtb_colt.gestione, " + - " mtb_colt.data_collo, " + - " mtb_colt.ser_collo, " + - " mtb_colt.num_collo " + - " FROM mtb_colt, " + - " mtb_colr " + - " WHERE mtb_colr.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + - " mtb_colr.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + - " mtb_colr.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()) + " AND " + - " mtb_colt.cod_dtip IS NULL AND " + - " mtb_colt.segno = -1 AND " + - " mtb_colt.gestione = mtb_colr.gestione AND " + - " mtb_colt.data_collo = mtb_colr.data_collo AND " + - " mtb_colt.ser_collo = mtb_colr.ser_collo AND " + - " mtb_colt.num_collo = mtb_colr.num_collo " + - "ORDER BY 1, 2, 3, 4 "; - - sql = UtilityDB.addwhereCond(sql, condFase, false); - sql = UtilityDB.addwhereCond(sql, condDataCollo, false); - - List mtbColts = new ResultSetMapper().mapQuerySetToList(multiDBTransactionManager.getPrimaryConnection(), sql, MtbColt.class); + List mtbColts = produzione.getScarichiProduzione(); loadColli.setColli(mtbColts); if (loadColli.getColli() != null && !loadColli.getColli().isEmpty()) { DtbDoct docT = loadColliService.createDocFromColli(multiDBTransactionManager, loadColli); - BigDecimal qtaProdUMMag = ddfc.getQtaColForDate(); + BigDecimal qtaProdUMMag = produzione.getQuantita(); BigDecimal qtaProd = qtaProdUMMag.divide(ordine.getRapConvProd(), 2, RoundingMode.HALF_UP); - docT.setCodProd(ordine.getCodProd()) - .setPartitaMag(ordine.getPartitaMag()) + docT.setCodProd(produzione.getCodMart()) + .setPartitaMag(produzione.getPartitaMag()) .setUntMisProd(ordine.getUntMisProd()) .setRapConvProd(ordine.getRapConvProd()) .setQtaProd(qtaProd) @@ -3259,11 +3279,16 @@ public class DocumentProdService { } documents.add(docT); } + + //TODO: gestione rientri + } + return documents; } + @Deprecated private List generaDocumentiScaricoMaterialiDaDataCollo(@NotNull ChiusuraLavorazioneDTO chiusuraLavorazioneDTO) throws Exception { List docsList = new ArrayList<>(); @@ -3304,7 +3329,7 @@ public class DocumentProdService { if (results == null) { results = new ArrayList<>(); DataDocFromCollo ddfc = new DataDocFromCollo(); - ddfc.setDataDocFromCollo(datiScarico.getDataDoc()); + ddfc.setDataDocFromCollo(chiusuraLavorazioneDTO.getDataDoc()); ddfc.setQtaColForDate(datiScarico.getQtaProd()); results.add(ddfc); } @@ -3318,17 +3343,13 @@ public class DocumentProdService { return docsList; } - private List generaDocumentiScaricoMateriali(@NotNull ChiusuraLavorazioneDTO chiusuraLavorazioneDTO, DataDocFromCollo dataDocFromCollo) throws Exception { + private List generaDocumentiScaricoMateriali(@NotNull ChiusuraLavorazioneDTO chiusuraLavorazioneDTO, ProduzioneOrdineDTO produzioneOrdine) throws Exception { List docsList = new ArrayList<>(); - // Acquisizione dati configurazione e passati dall'esterno Connection conn = multiDBTransactionManager.getPrimaryConnection(); boolean scaricoUnico = "S".equalsIgnoreCase(setupGest.getSetup(conn, "CARICO_SCARICO_PF", "SETUP", "SCARICO_UNICO")); - - DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); ScaricoLavorazioneDTO datiScarico = chiusuraLavorazioneDTO.getScaricoLavorazioneDTO(); - // Acquisizione dati prodotto finito per riproporzionare i materiali String sql = " SELECT DISTINCT ordL.cod_prod, " + @@ -3362,12 +3383,12 @@ public class DocumentProdService { } // Acquisizione dati prodotto dall'esterno - BigDecimal qtaProdUMMag = dataDocFromCollo == null ? datiScarico.getQtaProd() : dataDocFromCollo.getQtaColForDate(); + BigDecimal qtaProdUMMag = produzioneOrdine.getQuantita(); BigDecimal qtaProd = qtaProdUMMag.divide(ordine.getRapConvProd(), 5, RoundingMode.HALF_UP); // Verifica esistenza partita magazzino - if (ordine.getPartitaMag() == null) { + if (produzioneOrdine.getPartitaMag() == null) { throw new Exception("L'ordine di lavorazione n." + UtilityDB.valueToString(ordine.getNumOrd()) + " del " + UtilityDB.valueToString(ordine.getDataOrd()) + " non ha la specifica del lotto di produzione."); } @@ -3381,9 +3402,12 @@ public class DocumentProdService { " FROM dtb_doct " + " WHERE dtb_doct.cod_anag = " + UtilityDB.valueToString(datiScarico.getCodAnag()) + " AND " + " dtb_doct.cod_dtip = " + UtilityDB.valueToString(datiScarico.getCodDtip()) + " AND " + - " dtb_doct.data_doc = " + UtilityDB.valueDateToString(datiScarico.getDataDoc(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " dtb_doct.data_doc = " + UtilityDB.valueDateToString(chiusuraLavorazioneDTO.getDataDoc(), CommonConstants.DATE_FORMAT_YMD) + " AND " + " dtb_doct.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + " dtb_doct.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()); + if (UtilityString.hasContent(produzioneOrdine.getPartitaMag())) { + UtilityDB.addwhereCond(sql, it.integry.ems_model.utility.Query.format("partita_mag = {}",produzioneOrdine.getPartitaMag()),true); + } docT = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, DtbDoct.class); if (docT != null) { @@ -3392,7 +3416,7 @@ public class DocumentProdService { } } if (docT == null) { - docT = generaTestataDocDaOrdineLav(ordine, datiScarico.getCodDtip(), datiScarico.getDataDoc(), datiScarico.getSerDoc(), datiScarico.getCodAnag(), null, datiScarico.getCodMdep()); + docT = generaTestataDocDaOrdineLav(ordine, datiScarico.getCodDtip(), chiusuraLavorazioneDTO.getDataDoc(), datiScarico.getSerDoc(), datiScarico.getCodAnag(), null, datiScarico.getCodMdep(), produzioneOrdine.getPartitaMag()); docT.setOperation(OperationType.INSERT); if (datiScarico.getDataVersamento() != null) { docT.setDataIns(datiScarico.getDataVersamento()); @@ -3475,7 +3499,179 @@ public class DocumentProdService { if (listMateriali == null || listMateriali.isEmpty()) { return docsList; } - List righeScarico = getRigheScaricoDocumento(chiusuraLavorazioneDTO, listMateriali, dettaglioScaricoDTO, dataDocFromCollo); + List righeScarico = getRigheScaricoDocumento(chiusuraLavorazioneDTO, listMateriali, dettaglioScaricoDTO, UtilityLocalDate.localDateToDate(produzioneOrdine.getDataProd()), produzioneOrdine.getQuantita()); + + + if (!righeScarico.isEmpty()) { + docT.setOperation(OperationType.INSERT_OR_UPDATE); + docT.getDtbDocr().addAll(righeScarico); + docsList.add(docT); + } + + + return docsList; + } + + @Deprecated + private List generaDocumentiScaricoMateriali(@NotNull ChiusuraLavorazioneDTO chiusuraLavorazioneDTO, DataDocFromCollo dataDocFromCollo) throws Exception { + List docsList = new ArrayList<>(); + // Acquisizione dati configurazione e passati dall'esterno + Connection conn = multiDBTransactionManager.getPrimaryConnection(); + boolean scaricoUnico = "S".equalsIgnoreCase(setupGest.getSetup(conn, "CARICO_SCARICO_PF", "SETUP", "SCARICO_UNICO")); + + + DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); + ScaricoLavorazioneDTO datiScarico = chiusuraLavorazioneDTO.getScaricoLavorazioneDTO(); + + + // Acquisizione dati prodotto finito per riproporzionare i materiali + String sql = + " SELECT DISTINCT ordL.cod_prod, " + + " ordL.unt_mis_prod, " + + " ordL.rap_conv_prod, " + + " ordL.partita_mag, " + + " isnull(ordL.cod_jfas, jtb_cicl.cod_jfas) as cod_jfas, " + + " ordL.cod_jcom, " + + " jtb_lotr.id_lotto, " + + " jtb_lotr.cod_jfas as cod_jfas_lotto, " + + " dtb_ordr.num_cnf " + + " FROM dtb_ordt ordL LEFT OUTER JOIN jtb_lotr ON ordL.gestione = jtb_lotr.gestione AND " + + " ordL.data_ord = jtb_lotr.data_ord AND " + + " ordL.num_ord = jtb_lotr.num_ord " + + " LEFT OUTER JOIN dtb_ordr ON ordL.gestione_rif = dtb_ordr.gestione AND " + + " ordL.data_ord_rif = dtb_ordr.data_ord AND " + + " ordL.num_ord_rif = dtb_ordr.num_ord AND " + + " ordL.riga_ord_rif = dtb_ordr.riga_ord, " + + " mtb_aart, " + + " jtb_cicl " + + " WHERE ordL.cod_prod = jtb_cicl.cod_prod AND " + + " ordL.cod_prod = mtb_aart.cod_mart AND " + + " ordL.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + + " ordL.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " ordL.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()); + + DettaglioScaricoDTO dettaglioScaricoDTO = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, DettaglioScaricoDTO.class); + + if (dettaglioScaricoDTO == null) { + throw new Exception("L'ordine di lavorazione n." + UtilityDB.valueToString(ordine.getNumOrd()) + " del " + UtilityDB.valueToString(ordine.getDataOrd()) + " e/o la distinta corrispondente presentano delle anomalie."); + } + + // Acquisizione dati prodotto dall'esterno + BigDecimal qtaProdUMMag = dataDocFromCollo == null ? datiScarico.getQtaProd() : dataDocFromCollo.getQtaColForDate(); + BigDecimal qtaProd = qtaProdUMMag.divide(ordine.getRapConvProd(), 5, RoundingMode.HALF_UP); + + + // Verifica esistenza partita magazzino + if (ordine.getPartitaMag() == null) { + throw new Exception("L'ordine di lavorazione n." + UtilityDB.valueToString(ordine.getNumOrd()) + " del " + UtilityDB.valueToString(ordine.getDataOrd()) + " non ha la specifica del lotto di produzione."); + } + + // Se è attiva l'opzione scarico unico allora lo scarico degli imballaggi e delle materie prime deve essere + // fatto sempre sullo stesso documento nella giornata + BigDecimal qtaProdScaricoPrec = BigDecimal.ZERO; + DtbDoct docT = null; + if (scaricoUnico) { + sql = + " SELECT dtb_doct.* " + + " FROM dtb_doct " + + " WHERE dtb_doct.cod_anag = " + UtilityDB.valueToString(datiScarico.getCodAnag()) + " AND " + + " dtb_doct.cod_dtip = " + UtilityDB.valueToString(datiScarico.getCodDtip()) + " AND " + + " dtb_doct.data_doc = " + UtilityDB.valueDateToString(chiusuraLavorazioneDTO.getDataDoc(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " dtb_doct.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " dtb_doct.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()); + + docT = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, DtbDoct.class); + if (docT != null) { + docT.setOperation(OperationType.UPDATE); + qtaProdScaricoPrec = docT.getQtaProd(); + } + } + if (docT == null) { + docT = generaTestataDocDaOrdineLav(ordine, datiScarico.getCodDtip(), chiusuraLavorazioneDTO.getDataDoc(), datiScarico.getSerDoc(), datiScarico.getCodAnag(), null, datiScarico.getCodMdep()); + docT.setOperation(OperationType.INSERT); + if (datiScarico.getDataVersamento() != null) { + docT.setDataIns(datiScarico.getDataVersamento()); + } + } + + // Creazione testata documento di scarico (Imballaggi e materiali se presenti) + + + if (!UtilityString.isNullOrEmpty(datiScarico.getActivityId())) { + docT.setActivityId(datiScarico.getActivityId()); + } + + docT.setQtaProd(qtaProd.add(qtaProdScaricoPrec)); + + // Creazione riga commento + if (scaricoUnico) { + DtbDocr docR = new DtbDocr(); + docR.setOperation(OperationType.INSERT); + docR.setDescrizione("PRODUZIONE DELLE " + new SimpleDateFormat(CommonConstants.DATETIME_FORMAT_DMY).format(new Date())); + docT.getDtbDocr().add(docR); + } + + // Creo condizione che esclude eventuali materiali già presenti in colli di versamento + String tableMPScarDaCollo = "", condMPScarDaCollo = ""; + if (datiScarico.isScaricoDaCollo()) { + condMPScarDaCollo = "righeOrdScar.num_ord is null"; + tableMPScarDaCollo = "LEFT OUTER JOIN ( select distinct mtb_colt.gestione, mtb_colr.data_ord, mtb_colr.num_ord, mtb_colr.riga_ord " + + " from mtb_colt, mtb_colr " + + " where mtb_colt.gestione = mtb_colr.gestione and " + + " mtb_colt.data_collo = mtb_colr.data_collo and " + + " mtb_colt.ser_collo = mtb_colr.ser_collo and " + + " mtb_colt.num_collo = mtb_colr.num_collo and " + + " mtb_colt.gestione = 'L' and " + + " mtb_colt.segno = -1 and " + + " mtb_colr.riga_ord <> 0)righeOrdScar ON dtb_ordr.gestione = righeOrdScar.gestione and " + + " dtb_ordr.data_ord = righeOrdScar.data_ord and " + + " dtb_ordr.num_ord = righeOrdScar.num_ord and " + + " dtb_ordr.riga_ord = righeOrdScar.riga_ord"; + } + + // Acquisizione righe materiali da scaricare: vengono scaricate solo le righe di ordine che non risultano scaricate + // con un'altro sistema (system_note = USED) e che non sono presenti in un collo di scarico + sql = + " SELECT dtb_ordr.cod_mart, " + + " dtb_ordr.descrizione, " + + " dtb_ordr.descrizione_estesa, " + + " dtb_ordr.unt_ord, " + + " mtb_unt_mis.flag_dig, " + + " mtb_unt_mis.cifre_dec, " + + " dtb_ordr.rap_conv, " + + " dtb_ordr.riga_ord, " + + " dtb_ordr.qta_ord as qta_mate, " + + " mtb_aart.flag_tracciabilita, " + + " ISNULL(dtb_ordr.partita_mag, '') as partita_mag, " + + " dtb_ordr.flag_evaso, " + + " dtb_ordr.qta_evasa, " + + " round(dtb_ordt.qta_prod * dtb_ordt.rap_conv_prod, 5) as qta_prod_ord, " + + " ISNULL(dtb_ordr.system_note,'') as system_note, " + + " dtb_ordr.num_fase, " + + " round(dtb_ordt.qta_evasa_prod * dtb_ordt.rap_conv_prod, 5) as qta_evasa_prod, " + + " dbo.f_getTipoGruppoMP(dtb_ordr.cod_mart) as gruppo_conto_mp " + + " FROM dtb_ordt, " + + " mtb_aart, " + + " dtb_ordr " + + " LEFT OUTER JOIN mtb_unt_mis on mtb_unt_mis.unt_mis = dtb_ordr.unt_ord " + + tableMPScarDaCollo + + " WHERE dtb_ordr.cod_mart = mtb_aart.cod_mart AND " + + " dtb_ordt.gestione = dtb_ordr.gestione AND " + + " dtb_ordt.data_ord = dtb_ordr.data_ord AND " + + " dtb_ordt.num_ord = dtb_ordr.num_ord AND " + + " dtb_ordr.flag_evaso_forzato = 'N' AND " + + " dtb_ordr.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + + " dtb_ordr.data_ord = " + UtilityDB.valueDateToString(ordine.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + + " dtb_ordr.num_ord = " + UtilityDB.valueToString(ordine.getNumOrd()); + + sql = UtilityDB.addwhereCond(sql, condMPScarDaCollo, true); + + List listMateriali = UtilityDB.executeSimpleQueryDTO(conn, sql, MaterialeScaricoDTO.class); + if (listMateriali == null || listMateriali.isEmpty()) { + return docsList; + } + Date dataDoc = dataDocFromCollo != null ? dataDocFromCollo.getDataDocFromCollo() : null; + List righeScarico = getRigheScaricoDocumento(chiusuraLavorazioneDTO, listMateriali, dettaglioScaricoDTO,dataDoc , dataDocFromCollo.getQtaColForDate()); if (!righeScarico.isEmpty()) { @@ -3520,7 +3716,7 @@ public class DocumentProdService { /*Se la data del documento non è stata passata da fuori allora la data documento dovrà essere quella del collo */ List results = new ArrayList<>(); - if (caricoLavorazioneDTO.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { String sql = it.integry.ems_model.utility.Query.format( "SELECT DISTINCT mtb_colt.data_collo AS data_doc_from_collo, SUM(mtb_colr.qta_col) AS qta_col_for_date\n" + "FROM mtb_colt\n" + @@ -3547,7 +3743,7 @@ public class DocumentProdService { } } else { DataDocFromCollo dataDocFromCollo = new DataDocFromCollo(); - dataDocFromCollo.setDataDocFromCollo(caricoLavorazioneDTO.getDataDoc()); + dataDocFromCollo.setDataDocFromCollo(chiusuraLavorazioneDTO.getDataDoc()); dataDocFromCollo.setQtaColForDate(caricoLavorazioneDTO.getQtaProd()); /*UM magazzino*/ results.add(dataDocFromCollo); } @@ -3564,7 +3760,7 @@ public class DocumentProdService { .setCodJfas(chiusuraLavorazioneDTO.getCodJfas()); String condDataCollo = ""; - if (caricoLavorazioneDTO.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { condDataCollo = "mtb_colt.data_collo = " + UtilityDB.valueDateToString(dto.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD); } @@ -3647,7 +3843,7 @@ public class DocumentProdService { /*Se la data del documento non è stata passata da fuori allora la data documento dovrà essere quella del collo */ List results = new ArrayList<>(); - if (datiScarico.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { String sql = " SELECT distinct mtb_colt.data_collo as data_doc_from_collo, " + " ISNULL(carichi.qta_col_for_date , 0) as qta_col_for_date " + @@ -3674,7 +3870,7 @@ public class DocumentProdService { } } else { DataDocFromCollo dataDocFromCollo = new DataDocFromCollo(); - dataDocFromCollo.setDataDocFromCollo(datiScarico.getDataDoc()); + dataDocFromCollo.setDataDocFromCollo(chiusuraLavorazioneDTO.getDataDoc()); dataDocFromCollo.setQtaColForDate(chiusuraLavorazioneDTO.getScaricoLavorazioneDTO().getQtaProd()); /*UM magazzino*/ results.add(dataDocFromCollo); } @@ -3689,7 +3885,7 @@ public class DocumentProdService { .setCodMdep(datiScarico.getCodMdep()); String condDataCollo = ""; - if (datiScarico.getDataDoc() == null) { + if (chiusuraLavorazioneDTO.getDataDoc() == null) { condDataCollo = "mtb_colt.data_collo = " + UtilityDB.valueDateToString(ddfc.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD); } @@ -3845,14 +4041,12 @@ public class DocumentProdService { return documents; } - private List getRigheScaricoDocumento(ChiusuraLavorazioneDTO chiusuraLavorazioneDTO, List listMateriali, DettaglioScaricoDTO dettaglioScaricoDTO, DataDocFromCollo dataDocFromCollo) throws Exception { + private List getRigheScaricoDocumento(ChiusuraLavorazioneDTO chiusuraLavorazioneDTO, List listMateriali, DettaglioScaricoDTO dettaglioScaricoDTO, Date dataDoc, BigDecimal qtaProdUMMag) throws Exception { List rows = new ArrayList<>(); List materialiProcessati = new ArrayList<>(); ScaricoLavorazioneDTO datiScarico = chiusuraLavorazioneDTO.getScaricoLavorazioneDTO(); DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); - BigDecimal qtaProdUMMag = dataDocFromCollo == null ? datiScarico.getQtaProd() : dataDocFromCollo.getQtaColForDate(); - for (MaterialeScaricoDTO materiale : listMateriali) { List righeScarichi = new ArrayList<>(); // Se systemNote = USED vuol dire che un programma esterno ha già utilizzato la materia prima per lo scarico, @@ -4028,7 +4222,7 @@ public class DocumentProdService { sql = " select ISNULL(sum(qta),0) " + - " from dbo.getQtaXPartitaMag(" + UtilityDB.valueToString(datiScarico.getCodMdep()) + ", " + UtilityDB.valueToString(materiale.getCodMart()) + ", " + UtilityDB.valueToString(tipoMetodo) + "," + UtilityDB.valueToString(materiale.getQtaMate()) + ", 0, " + UtilityDB.valueToString(materiale.getSystemNote()) + ", " + UtilityDB.valueDateToString(dataDocFromCollo.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD) + ", " + UtilityDB.valueDateToString(dataDocFromCollo.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD) + ")"; + " from dbo.getQtaXPartitaMag(" + UtilityDB.valueToString(datiScarico.getCodMdep()) + ", " + UtilityDB.valueToString(materiale.getCodMart()) + ", " + UtilityDB.valueToString(tipoMetodo) + "," + UtilityDB.valueToString(materiale.getQtaMate()) + ", 0, " + UtilityDB.valueToString(materiale.getSystemNote()) + ", " + UtilityDB.valueDateToString(dataDoc, CommonConstants.DATE_FORMAT_YMD) + ", " + UtilityDB.valueDateToString(dataDoc, CommonConstants.DATE_FORMAT_YMD) + ")"; BigDecimal qtaTot = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); @@ -4049,7 +4243,7 @@ public class DocumentProdService { " select partita_mag, " + " qta as qta_inevasa, " + UtilityDB.valueToString(materiale.getRigaOrd()) + " as riga_ord " + - " from dbo.getQtaXPartitaMag(" + UtilityDB.valueToString(datiScarico.getCodMdep()) + ", " + UtilityDB.valueToString(materiale.getCodMart()) + ", " + UtilityDB.valueToString(tipoMetodo) + "," + UtilityDB.valueToString(materiale.getQtaMate()) + ",0, " + UtilityDB.valueToString(materiale.getSystemNote()) + ", " + UtilityDB.valueDateToString(dataDocFromCollo.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD) + ", " + UtilityDB.valueDateToString(dataDocFromCollo.getDataDocFromCollo(), CommonConstants.DATE_FORMAT_YMD) + ")"; + " from dbo.getQtaXPartitaMag(" + UtilityDB.valueToString(datiScarico.getCodMdep()) + ", " + UtilityDB.valueToString(materiale.getCodMart()) + ", " + UtilityDB.valueToString(tipoMetodo) + "," + UtilityDB.valueToString(materiale.getQtaMate()) + ",0, " + UtilityDB.valueToString(materiale.getSystemNote()) + ", " + UtilityDB.valueDateToString(dataDoc, CommonConstants.DATE_FORMAT_YMD) + ", " + UtilityDB.valueDateToString(dataDoc, CommonConstants.DATE_FORMAT_YMD) + ")"; } else { // Se la partita non c'è e non è tracciabile allora non verrà fatta alcuna assegnazione di partita diff --git a/ems-engine/src/main/java/it/integry/ems/production/controller/MesProductionControllerV2.java b/ems-engine/src/main/java/it/integry/ems/production/controller/MesProductionControllerV2.java index 33f902988c..73b65efd99 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/controller/MesProductionControllerV2.java +++ b/ems-engine/src/main/java/it/integry/ems/production/controller/MesProductionControllerV2.java @@ -7,12 +7,14 @@ import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.production.dto.*; import it.integry.ems.production.service.MesProductionServiceV2; import it.integry.ems.production.service.ProductionLineService; +import it.integry.ems.production.service.ProductionOrdersLifecycleService; import it.integry.ems.service.dto.production.OrdineLavorazioneDTO; import it.integry.ems.service.production.ProductionOrderDataHandlerService; import it.integry.ems.response.EsitoType; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.response.StatusResponse; import it.integry.ems.status.ServiceChecker; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems_model.config.EmsRestConstants; import it.integry.ems_model.entity.MtbColt; import it.integry.ems_model.utility.UtilityDate; @@ -50,6 +52,12 @@ public class MesProductionControllerV2 { @Autowired private RequestDataDTO requestDataDTO; + @Autowired + private ProductionOrdersLifecycleService productionOrdersLifecycleService; + + @Autowired + public MultiDBTransactionManager multiDBTransactionManager; + @RequestMapping(value = "/status", method = RequestMethod.GET) public @ResponseBody @@ -450,4 +458,19 @@ public class MesProductionControllerV2 { mesProductionService.duplicaOrdiniGiornoDopo(codJfas); return ServiceRestResponse.createPositiveResponse(); } + + @RequestMapping(value = "ordine/stop", method = RequestMethod.POST) + public @ResponseBody + ServiceRestResponse stopOrdineLav(HttpServletRequest request, + @RequestParam(CommonConstants.PROFILE_DB) String profileDB, + @RequestBody() ChiusuraLavorazioneDTO dto) throws Exception { + + try{ + productionOrdersLifecycleService.stopOrdineLav(dto); + }catch (Exception e){ + multiDBTransactionManager.rollbackAll(); + throw e; + } + return ServiceRestResponse.createPositiveResponse(); + } } diff --git a/ems-engine/src/main/java/it/integry/ems/production/dto/MesStopOrdineDTO.java b/ems-engine/src/main/java/it/integry/ems/production/dto/MesStopOrdineDTO.java new file mode 100644 index 0000000000..cc3d89b279 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/production/dto/MesStopOrdineDTO.java @@ -0,0 +1,126 @@ +package it.integry.ems.production.dto; + +import it.integry.ems_model.entity.DtbOrdt; + +public class MesStopOrdineDTO { + private String codJfas; + private DtbOrdt ordLav; + private boolean effettuaCaricoProdotto; + private boolean effettuaSCaricoMateriali; + private boolean terminaLavorazione; + private boolean $terminaLavorazioneLinea; + private String codDtipCar; + private String codDtipScar; + private String codMdep; + private String codMdepScar; + private boolean creaCaricoDaCollo; + private boolean creaScaricoDaCollo; + + public String getCodJfas() { + return codJfas; + } + + public MesStopOrdineDTO setCodJfas(String codJfas) { + this.codJfas = codJfas; + return this; + } + + public DtbOrdt getOrdLav() { + return ordLav; + } + + public MesStopOrdineDTO setOrdLav(DtbOrdt ordLav) { + this.ordLav = ordLav; + return this; + } + + public boolean isEffettuaCaricoProdotto() { + return effettuaCaricoProdotto; + } + + public MesStopOrdineDTO setEffettuaCaricoProdotto(boolean effettuaCaricoProdotto) { + this.effettuaCaricoProdotto = effettuaCaricoProdotto; + return this; + } + + public boolean isEffettuaSCaricoMateriali() { + return effettuaSCaricoMateriali; + } + + public MesStopOrdineDTO setEffettuaSCaricoMateriali(boolean effettuaSCaricoMateriali) { + this.effettuaSCaricoMateriali = effettuaSCaricoMateriali; + return this; + } + + public boolean isTerminaLavorazione() { + return terminaLavorazione; + } + + public MesStopOrdineDTO setTerminaLavorazione(boolean terminaLavorazione) { + this.terminaLavorazione = terminaLavorazione; + return this; + } + + public boolean is$terminaLavorazioneLinea() { + return $terminaLavorazioneLinea; + } + + public MesStopOrdineDTO set$terminaLavorazioneLinea(boolean $terminaLavorazioneLinea) { + this.$terminaLavorazioneLinea = $terminaLavorazioneLinea; + return this; + } + + public String getCodDtipCar() { + return codDtipCar; + } + + public MesStopOrdineDTO setCodDtipCar(String codDtipCar) { + this.codDtipCar = codDtipCar; + return this; + } + + public String getCodDtipScar() { + return codDtipScar; + } + + public MesStopOrdineDTO setCodDtipScar(String codDtipScar) { + this.codDtipScar = codDtipScar; + return this; + } + + public String getCodMdep() { + return codMdep; + } + + public MesStopOrdineDTO setCodMdep(String codMdep) { + this.codMdep = codMdep; + return this; + } + + public String getCodMdepScar() { + return codMdepScar; + } + + public MesStopOrdineDTO setCodMdepScar(String codMdepScar) { + this.codMdepScar = codMdepScar; + return this; + } + + public boolean isCreaCaricoDaCollo() { + return creaCaricoDaCollo; + } + + public MesStopOrdineDTO setCreaCaricoDaCollo(boolean creaCaricoDaCollo) { + this.creaCaricoDaCollo = creaCaricoDaCollo; + return this; + } + + public boolean isCreaScaricoDaCollo() { + return creaScaricoDaCollo; + } + + public MesStopOrdineDTO setCreaScaricoDaCollo(boolean creaScaricoDaCollo) { + this.creaScaricoDaCollo = creaScaricoDaCollo; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/production/service/MesProductionServiceV2.java b/ems-engine/src/main/java/it/integry/ems/production/service/MesProductionServiceV2.java index aaadd220b0..34b13b5e15 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/service/MesProductionServiceV2.java +++ b/ems-engine/src/main/java/it/integry/ems/production/service/MesProductionServiceV2.java @@ -906,12 +906,8 @@ public class MesProductionServiceV2 { } private RegisterSupervisorDTO getSupervisorPanelData(String codJfas) throws Exception { - String gestName = "MES"; - String section = "HMI"; - String key = codJfas; - if (!UtilityString.isNullOrEmpty(codJfas)) { - String setup = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), gestName, section, key); + String setup = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), "MES", "HMI", codJfas); if (!UtilityString.isNullOrEmpty(setup)) { ObjectMapper mapper = new ObjectMapper(); @@ -924,6 +920,15 @@ public class MesProductionServiceV2 { } + public boolean hasSupervisorPanel(String codJfas) throws Exception { + RegisterSupervisorDTO supervisorPanelData = getSupervisorPanelData(codJfas); + if (supervisorPanelData == null) { + return false; + } + + return UtilityString.hasContent(supervisorPanelData.getSupervisorServiceIp()); + } + public List getOrdiniLavorazioneInCorsoPerMateriale(String codJfas, String idMateriale) throws Exception { String query = "select " + @@ -2066,7 +2071,7 @@ public class MesProductionServiceV2 { } if (scaricoDto.getSerDoc() == null) { - scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), scaricoDto.getDataDoc())); + scaricoDto.setSerDoc(DocumentRules.getSerDoc(multiDBTransactionManager.getPrimaryConnection(), scaricoDto.getCodDtip(), scaricoDto.getCodMdep(), dtoChiusura.getDataDoc())); } List listDocs = documentProdService.generaDocScaricoDaColliIdLotto(dtoChiusura); diff --git a/ems-engine/src/main/java/it/integry/ems/production/service/ProductionOrdersLifecycleService.java b/ems-engine/src/main/java/it/integry/ems/production/service/ProductionOrdersLifecycleService.java new file mode 100644 index 0000000000..6639adb363 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/production/service/ProductionOrdersLifecycleService.java @@ -0,0 +1,196 @@ +package it.integry.ems.production.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import it.integry.common.var.CommonConstants; +import it.integry.ems.document.dto.CaricoLavorazioneDTO; +import it.integry.ems.document.dto.ChiusuraLavorazioneDTO; +import it.integry.ems.document.dto.RientroLavorazioneDTO; +import it.integry.ems.document.dto.ScaricoLavorazioneDTO; +import it.integry.ems.javabeans.RequestDataDTO; +import it.integry.ems.production.dto.MesStopOrdineDTO; +import it.integry.ems.service.AziendaService; +import it.integry.ems.service.EntityProcessor; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; +import it.integry.ems.utility.UtilityDebug; +import it.integry.ems_model.entity.DtbOrdt; +import it.integry.ems_model.service.SetupGest; +import it.integry.ems_model.types.OperationType; +import it.integry.ems_model.utility.*; +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.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; + +@Service +@Scope("request") +public class ProductionOrdersLifecycleService { + + private final Logger logger = LogManager.getLogger(); + @Autowired + public MultiDBTransactionManager multiDBTransactionManager; + + @Autowired + public EntityProcessor entityProcessor; + + @Autowired + public SetupGest setupGest; + + @Autowired + private RequestDataDTO requestDataDTO; + + @Autowired + private ProductionService productionService; + + @Autowired + private AziendaService aziendaService; + + + @Autowired + private MesProductionServiceV2 mesProductionServiceV2; + + public void stopOrdineLav(ChiusuraLavorazioneDTO dto) throws Exception { + DtbOrdt dtbOrdt = dto.getOrdine(); + if (dtbOrdt == null) { + throw new Exception("Impossibile identificare l'ordine di lavorazione selezionato!"); + } + + // + boolean fermaCreaDocsEnabled = setupGest.getSetupBoolean(multiDBTransactionManager.getPrimaryConnection(), "CARICO_SCARICO_PF", "SETUP", "FERMA_CREA_DOCS"); + + if (fermaCreaDocsEnabled) { + if (!setupGest.getSetupUserBoolean(multiDBTransactionManager.getPrimaryConnection(), "CARICO_SCARICO_PF", "SETUP", "FERMA_CREA_DOCS", requestDataDTO.getUsername())) { + dtbOrdt.setDataConsProdMax(new Date()); + dtbOrdt.setOperation(OperationType.UPDATE); + entityProcessor.processEntity(dtbOrdt, multiDBTransactionManager); + + return; + } + } + // + + + // + dtbOrdt.setOperation(OperationType.SELECT_OBJECT); + entityProcessor.processEntity(dtbOrdt, multiDBTransactionManager); + boolean isCaricoScaricoimmediato = setupGest.getSetupDepoBoolean(multiDBTransactionManager.getPrimaryConnection(), "CARICO_SCARICO_PF", "SETUP", "GENERA_CARICO_SCARICO_IMMEDIATO", dtbOrdt.getCodMdep()); + dto.setTerminaLavorazioneLinea(true); + dto.setChiudiOrdine(true); + dto.setEffettuaCarico(!isCaricoScaricoimmediato); + dto.setEffettuaScarico(!isCaricoScaricoimmediato); + dto.setCodProd(dtbOrdt.getCodProd()); + dto.setPartitaMag(dtbOrdt.getPartitaMag()); + dto.setRapConvProd(dtbOrdt.getRapConvProd()); + dto.setUntMisProd(dtbOrdt.getUntMisProd()); + dto.setRifOrd(dtbOrdt.getRifOrd()); + String partIvaAzienda = aziendaService.retrieveInternalPartIva(); + String partIvaOrder = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), Query.format("SELECT part_iva from gtb_anag where cod_anag = {}", dtbOrdt.getCodAnag())); + boolean isOrdineInterno = partIvaAzienda.equalsIgnoreCase(partIvaOrder); + + String dataDocType = setupGest.getSetup("PVM", "MONITORAGGIO_LINEE_V2", "DATA_DOC_TYPE"); + Date dataDoc; + + switch (dataDocType) { + case "DATA_ODIERNA": + dataDoc = new Date(); + break; + + case "DATA_COLLO_MAX": + String sql = it.integry.ems_model.utility.Query.format( + "SELECT MAX(mtb_colt.data_collo) AS data_collo\n" + + "FROM mtb_colt \n" + + "WHERE mtb_colt.gestione = %s AND\n" + + " mtb_colt.data_ord = %s AND\n" + + " mtb_colt.num_ord = %s AND\n" + + " mtb_colt.segno = 1\n" + + "GROUP BY mtb_colt.gestione,\n" + + " mtb_colt.data_ord,\n" + + " mtb_colt.num_ord,\n" + + " mtb_colt.segno", + dtbOrdt.getGestione(), + dtbOrdt.getDataOrd(), + dtbOrdt.getNumOrd() + ); + + dataDoc = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); + + break; + case "DATA_COLLO": + default: + dataDoc = null; + break; + } + dto.setDataDoc(dataDoc); + + + // + CaricoLavorazioneDTO caricoLavorazioneDTO = dto.getCaricoLavorazioneDTO(); + String codDtipCar = productionService.getCodDtipCaricoLavorazione(isOrdineInterno); + if (UtilityString.isNullOrEmpty(caricoLavorazioneDTO.getCodDtip())) { + caricoLavorazioneDTO.setCodDtip(codDtipCar); + } + if (UtilityString.isNullOrEmpty(caricoLavorazioneDTO.getCodMdep())) { + caricoLavorazioneDTO.setCodMdep(dtbOrdt.getCodMdep()); + } + if (UtilityString.isNullOrEmpty(caricoLavorazioneDTO.getCodJfas())) { + caricoLavorazioneDTO.setCodJfas(dtbOrdt.getCodJfas()); + } + if (UtilityString.isNullOrEmpty(caricoLavorazioneDTO.getCodAnag())) { + caricoLavorazioneDTO.setCodAnag(dtbOrdt.getCodAnag()); + } + + // + // + ScaricoLavorazioneDTO scaricoLavorazioneDTO = dto.getScaricoLavorazioneDTO(); + if (UtilityString.isNullOrEmpty(scaricoLavorazioneDTO.getCodDtip())) { + String codDtipSca = productionService.getCodDtipScaricoLavorazione(isOrdineInterno); + scaricoLavorazioneDTO.setCodDtip(codDtipSca); + } + if (UtilityString.isNullOrEmpty(scaricoLavorazioneDTO.getCodMdep())) { + scaricoLavorazioneDTO.setCodMdep(dtbOrdt.getCodMdep()); + } + if (UtilityString.isNullOrEmpty(scaricoLavorazioneDTO.getCodAnag())) { + scaricoLavorazioneDTO.setCodAnag(dtbOrdt.getCodAnag()); + } + if (UtilityBigDecimal.isNullOrZero(scaricoLavorazioneDTO.getQtaProd())) { + + scaricoLavorazioneDTO.setQtaProd(dtbOrdt.getQtaProd()); + } + + // + + // + RientroLavorazioneDTO rientroLavorazioneDTO = dto.getRientroLavorazioneDTO(); + // + // + + + // + productionService.chiudiOrdineLavorazione(dto); + // + + if (mesProductionServiceV2.hasSupervisorPanel(dto.getCodJfas())) { + + HashMap body = new HashMap<>(); + + body.put("dataOrd", UtilityDate.formatDate(dtbOrdt.getDataOrd(), CommonConstants.DATETIME_FORMAT_DMY_SLASHED)); + body.put("numOrd", dtbOrdt.getNumOrd()); + body.put("gestione", dtbOrdt.getGestione()); + + ObjectMapper mapper = new ObjectMapper(); + try { + mesProductionServiceV2.sendCommand(dto.getCodJfas(), "order/stop", mapper.convertValue(body, JsonNode.class)); + } catch (Exception e) { + logger.error(e); + if ((!UtilityDebug.isDebugExecution() && !UtilityDebug.isIntegryServer())) { + throw e; + } + } + } + + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/production/service/ProductionService.java b/ems-engine/src/main/java/it/integry/ems/production/service/ProductionService.java index 5346cacd0f..b9d1083867 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/service/ProductionService.java +++ b/ems-engine/src/main/java/it/integry/ems/production/service/ProductionService.java @@ -35,6 +35,7 @@ import java.math.RoundingMode; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.ZoneId; @@ -779,36 +780,48 @@ public class ProductionService { public List chiudiOrdineLavorazione(ChiusuraLavorazioneDTO chiusuraLavorazioneDTO) throws Exception { List entityBaseList = new ArrayList<>(); - if (chiusuraLavorazioneDTO.getOrdine() == null) { + DtbOrdt ordine = chiusuraLavorazioneDTO.getOrdine(); + if (ordine == null) { throw new Exception("Impossibile identificare l'ordine di lavorazione selezionato!"); } - chiusuraLavorazioneDTO.getOrdine().setOperation(OperationType.SELECT_OBJECT); - entityProcessor.processEntity(chiusuraLavorazioneDTO.getOrdine(), multiDBTransactionManager); + ordine.setOperation(OperationType.SELECT_OBJECT); + entityProcessor.processEntity(ordine, multiDBTransactionManager); if (chiusuraLavorazioneDTO.isEffettuaCarico() || chiusuraLavorazioneDTO.isEffettuaScarico()) { - documentProdService.generaDocumentiLavorazione(chiusuraLavorazioneDTO); + entityBaseList.addAll(documentProdService.generaDocumentiLavorazione(chiusuraLavorazioneDTO)); } if (chiusuraLavorazioneDTO.isChiudiOrdine()) { - boolean generateLotto = "S".equalsIgnoreCase(setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), "W_PORDI_RC", "GENERA_LOTTO_PROD", "GENERA_LOTTO")); + boolean generateLotto = setupGest.getSetupBoolean(multiDBTransactionManager.getPrimaryConnection(), "W_PORDI_RC", "GENERA_LOTTO_PROD", "GENERA_LOTTO"); - entityBaseList.add(evadiOrdineLav(chiusuraLavorazioneDTO.getOrdine())); + entityBaseList.add(evadiOrdineLav(ordine)); if (generateLotto) { // Verifica chiusura lotto di produzione se tutti gli ordini ad esso associati sono evasi - Date dataDoc = chiusuraLavorazioneDTO.getCaricoLavorazioneDTO() != null && chiusuraLavorazioneDTO.getCaricoLavorazioneDTO().getDataDoc() != null ? chiusuraLavorazioneDTO.getCaricoLavorazioneDTO().getDataDoc() : new Date(); - JtbLott lot = checkChiusuraLotto(chiusuraLavorazioneDTO.getOrdine(), dataDoc); + Date dataDoc = chiusuraLavorazioneDTO.getCaricoLavorazioneDTO() != null && chiusuraLavorazioneDTO.getDataDoc() != null ? chiusuraLavorazioneDTO.getDataDoc() : new Date(); + JtbLott lot = checkChiusuraLotto(ordine, dataDoc); if (lot != null) { entityBaseList.add(lot); } } } else if (chiusuraLavorazioneDTO.isTerminaLavorazioneLinea()) { - entityBaseList.add(terminaLavorazioneLinea(chiusuraLavorazioneDTO.getOrdine(), chiusuraLavorazioneDTO.getCodJfas())); + entityBaseList.add(terminaLavorazioneLinea(ordine, chiusuraLavorazioneDTO.getCodJfas())); } if (chiusuraLavorazioneDTO.isSalvaDocumenti()) { entityProcessor.processEntityList(entityBaseList, true); + UtilityEntity.throwEntitiesException(entityBaseList); //distribuzioneMateriali(); } + String syncChiusuraOrdineLavorazione = String.format("SET NOCOUNT ON; EXEC MES_SyncChiusuraOrdineLavorazione %d, %s, %s; SET NOCOUNT OFF;", + ordine.getNumOrd(), + UtilityDB.valueToString(ordine.getDataOrd()), + ordine.getGestione() + ); + + try (Statement storedProcedure = multiDBTransactionManager.getPrimaryConnection().createStatement()) { + storedProcedure.execute(syncChiusuraOrdineLavorazione); + } + return entityBaseList; } @@ -832,11 +845,9 @@ public class ProductionService { Date dataDoc; - if (chiusuraLavorazioneDTO.getCaricoLavorazioneDTO() != null && chiusuraLavorazioneDTO.getCaricoLavorazioneDTO().getDataDoc() != null) { - dataDoc = chiusuraLavorazioneDTO.getCaricoLavorazioneDTO().getDataDoc(); - } else if (chiusuraLavorazioneDTO.getScaricoLavorazioneDTO() != null && chiusuraLavorazioneDTO.getScaricoLavorazioneDTO().getDataDoc() != null) { - dataDoc = chiusuraLavorazioneDTO.getScaricoLavorazioneDTO().getDataDoc(); - } else { + if (chiusuraLavorazioneDTO.getDataDoc() != null) { + dataDoc = chiusuraLavorazioneDTO.getDataDoc(); + } else { dataDoc = new Date(); } @@ -949,7 +960,8 @@ public class ProductionService { ordineLav.setOperation(OperationType.UPDATE); String sql = " select id_riga ," + - " max(id_step)" + + " max(id_step) as id_step," + + " 'N' as flag_step_attivo" + " from dtb_ord_steps " + " WHERE dtb_ord_steps.gestione = " + UtilityDB.valueToString(ordineLav.getGestione()) + " AND " + " dtb_ord_steps.data_ord = " + UtilityDB.valueDateToString(ordineLav.getDataOrd(), CommonConstants.DATE_FORMAT_YMD) + " AND " + @@ -957,19 +969,11 @@ public class ProductionService { " dtb_ord_steps.cod_jfas = " + UtilityDB.valueToString(codJfas) + " " + " group by id_riga "; - PreparedStatement info = conn.prepareStatement(sql); - ResultSet res = info.executeQuery(); + List steps = UtilityDB.executeSimpleQueryDTO(conn, sql, DtbOrdSteps.class); - while (res.next()) { - DtbOrdSteps ordSteps = new DtbOrdSteps(); - ordSteps.setOperation(OperationType.UPDATE); - ordSteps.setIdRiga(res.getInt(1)); - ordSteps.setIdStep(res.getInt(2)); - ordSteps.setFlagStepAttivo("N"); - ordineLav.getDtbOrdSteps().add(ordSteps); + if (!UtilityList.isNullOrEmpty(steps)){ + ordineLav.getDtbOrdSteps().addAll(steps.stream().peek(step -> step.setOperation(OperationType.UPDATE)).collect(Collectors.toList())); } - res.close(); - info.close(); return ordineLav; } @@ -1722,4 +1726,20 @@ public class ProductionService { return entityBaseList; } + + public String getCodDtipCaricoLavorazione(boolean isOrdineInterno)throws Exception { + if (isOrdineInterno){ + return setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(),"W_PORDI_RC","SETUP_DOCUMENTI","COD_DTIP_CAR"); + }else { + return setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(),"DATI_AZIENDA","CONTO_LAVORO","COD_DTIP_CLAV"); + } + } + + public String getCodDtipScaricoLavorazione(boolean isOrdineInterno)throws Exception { + if (isOrdineInterno){ + return setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(),"W_PORDI_RC","SETUP_DOCUMENTI","COD_DTIP_SCAR"); + }else { + return setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(),"DATI_AZIENDA","CONTO_LAVORO","COD_DTIP_SLAV"); + } + } } \ No newline at end of file diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/CreateUDSRequestDTO.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/CreateUDSRequestDTO.java index 6469d4b547..68e1bacb57 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/CreateUDSRequestDTO.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/dto/CreateUDSRequestDTO.java @@ -3,6 +3,7 @@ package it.integry.ems.retail.wms.dto; import com.fasterxml.jackson.annotation.JsonValue; import it.integry.ems_model.entity._enum.IBaseEnum; +import java.time.LocalDate; import java.util.List; public class CreateUDSRequestDTO { @@ -11,6 +12,7 @@ public class CreateUDSRequestDTO { private Integer segno; private String ragSoc; private Integer numCollo; + private LocalDate dataCollo; private String serCollo; private Causale causaleCollo; @@ -64,6 +66,15 @@ public class CreateUDSRequestDTO { return this; } + public LocalDate getDataCollo() { + return dataCollo; + } + + public CreateUDSRequestDTO setDataCollo(LocalDate dataCollo) { + this.dataCollo = dataCollo; + return this; + } + public String getSerCollo() { return serCollo; } diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java index 45db081103..eae7fbfd2e 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java @@ -1,6 +1,8 @@ package it.integry.ems.retail.wms.lavorazione.service; import com.annimon.stream.Stream; +import it.integry.ems.document.dto.ProduzioneOrdineDTO; +import it.integry.ems.document.dto.ScarichiArticoloDTO; import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.logistic.dto.sm2.FiltroDistribuzioneColloDTO; import it.integry.ems.product.importaz.service.ProductServices; @@ -21,23 +23,21 @@ import it.integry.ems.service.production.ProductionOrderDataHandlerService; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.user.UserSession; import it.integry.ems.utility.UtilityEntity; +import it.integry.ems_model.base.EntityBase; import it.integry.ems_model.entity.*; import it.integry.ems_model.entity._enum.GestioneEnum; import it.integry.ems_model.service.SetupGest; import it.integry.ems_model.types.OperationType; -import it.integry.ems_model.utility.MtbColtUtils; -import it.integry.ems_model.utility.UtilityBigDecimal; -import it.integry.ems_model.utility.UtilityLocalDate; -import it.integry.ems_model.utility.UtilityString; +import it.integry.ems_model.utility.*; +import net.sf.jasperreports.engine.export.oasis.Utility; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.time.ZoneId; +import java.util.*; import java.util.stream.Collectors; @Service @@ -263,10 +263,10 @@ public class WMSLavorazioneService { .setSerCollo(insertUDSRowRequestDTO.getTargetMtbColt().getSerCollo()) .setGestione(insertUDSRowRequestDTO.getTargetMtbColt().getGestione()); targetMtbColt.setOperation(OperationType.SELECT_OBJECT); - entityProcessor.processEntity(targetMtbColt,true, multiDBTransactionManager); + entityProcessor.processEntity(targetMtbColt, true, multiDBTransactionManager); - MtbAart mtbAart = WMSUtility.getArticoloByCodMart(insertUDSRowRequestDTO.getCodMart(),multiDBTransactionManager.getPrimaryConnection()); + MtbAart mtbAart = WMSUtility.getArticoloByCodMart(insertUDSRowRequestDTO.getCodMart(), multiDBTransactionManager.getPrimaryConnection()); if (mtbAart == null) throw new InvalidArticoloException(insertUDSRowRequestDTO.getCodMart()); @@ -743,8 +743,108 @@ public class WMSLavorazioneService { insertRowDto.setPartitaMag(dto.getPartitaMag()); insertRowDto.setFullName(userSession.getFullname()); - WMSUtility.insertUDCRow(insertRowDto,entityProcessor,multiDBTransactionManager); + WMSUtility.insertUDCRow(insertRowDto, entityProcessor, multiDBTransactionManager); return udc; } + + public List riproporzionaScarichiLavorazione(List produzioniOrdine, List scarichi) throws Exception { + if (UtilityList.isNullOrEmpty(produzioniOrdine) || UtilityList.isNullOrEmpty(scarichi)) { + return produzioniOrdine; + } + if (produzioniOrdine.size() == 1) { + produzioniOrdine.get(0).setScarichiProduzione(scarichi); + return produzioniOrdine; + } + List entititesToSave = new ArrayList<>(); + HashMap scarichiArticoli = new HashMap<>(); + for (MtbColt uds : scarichi) { + String sql = "SELECT * from mtb_colr where gestione = {} AND data_collo = {} and ser_collo = {} and num_collo = {}"; + List rows = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), Query.format(sql, uds.getGestione(), uds.getDataCollo(), uds.getSerCollo(), uds.getNumCollo()), MtbColr.class); + if (UtilityList.isNullOrEmpty(rows)) { + continue; + } + + for (MtbColr row : rows) { + ScarichiArticoloDTO dtoScarico = scarichiArticoli.get(row.getCodMart()); + if (dtoScarico == null) { + dtoScarico = new ScarichiArticoloDTO(); + dtoScarico.setCodMart(row.getCodMart()) + .setQtaScaricata(BigDecimal.ZERO) + .setScarichi(new ArrayList<>()); + } + + dtoScarico.setQtaScaricata(dtoScarico.getQtaScaricata().add(row.getQtaCol())); + dtoScarico.getScarichi().add(row); + scarichiArticoli.put(row.getCodMart(), dtoScarico); + } + uds.setOperation(OperationType.DELETE); + entititesToSave.add(uds); + } + + Iterator iteratorProduzioni = produzioniOrdine.iterator(); + + while (iteratorProduzioni.hasNext()) { + ProduzioneOrdineDTO produzione = iteratorProduzioni.next(); + boolean isLastProduzione = !iteratorProduzioni.hasNext(); + if (UtilityBigDecimal.isNullOrZero(produzione.getPesoProduzione())) + continue; + DtbOrdt ordine = produzione.getOrdine(); + // + List ordini = new ArrayList<>(); + CreateUDSRequestOrderDTO orderDTO = new CreateUDSRequestOrderDTO() + .setNumOrd(ordine.getNumOrd()) + .setDataOrd(UtilityLocalDate.localDateFromDate(ordine.getDataOrd())) + .setGestione(ordine.getGestione()); + ordini.add(orderDTO); + CreateUDSRequestDTO requestDTO = new CreateUDSRequestDTO() + .setCodMdep(ordine.getCodMdep()) + .setCausaleCollo(CreateUDSRequestDTO.Causale.SCARICO) + .setSegno(-1) + .setOrders(ordini); + + if (produzione.getDataProd() != null) { + requestDTO.setDataCollo(produzione.getDataProd()); + } + + MtbColt uds = createUDS(requestDTO); + // + // + for (ScarichiArticoloDTO scarichiMp : scarichiArticoli.values()) { + BigDecimal qtaDaScaricare = UtilityBigDecimal.calculatePercentage(scarichiMp.getQtaScaricata(), produzione.getPesoProduzione().doubleValue()); + if (UtilityBigDecimal.equalsTo(qtaDaScaricare, BigDecimal.ZERO)) { + continue; + } + scarichiMp.getScarichi().sort(Comparator.comparing(MtbColr::getDatetimeRow)); + Iterator rowsIterator = scarichiMp.getScarichi().iterator(); + do { + MtbColr nextScar = rowsIterator.next(); + if (UtilityBigDecimal.equalsTo(nextScar.getQtaCol(), BigDecimal.ZERO)) + continue; + MtbColr newRow = (MtbColr) nextScar.clone(); + newRow + .setDataCollo(null) + .setSerCollo(null) + .setNumCollo(null) + .setGestione(null) + .setRiga(null) + .setNumCnf(null) + .setOperation(OperationType.INSERT); + BigDecimal qtaPrelevata = isLastProduzione ? nextScar.getQtaCol() : UtilityBigDecimal.getLowerBetween(nextScar.getQtaCol(), qtaDaScaricare); + newRow.setQtaCol(qtaPrelevata); + qtaDaScaricare = qtaDaScaricare.subtract(qtaPrelevata); + nextScar.setQtaCol(nextScar.getQtaCol().subtract(qtaPrelevata)); + uds.getMtbColr().add(newRow); + } + while ((UtilityBigDecimal.greaterThan(qtaDaScaricare, BigDecimal.ZERO) || isLastProduzione) && rowsIterator.hasNext()); + } + entititesToSave.add(uds); + produzione.getScarichiProduzione().add(uds); + // + } + entityProcessor.processEntityList(entititesToSave, multiDBTransactionManager, true); + UtilityEntity.throwEntitiesException(entititesToSave); + + return produzioniOrdine; + } } From 015813db2b475df8f209f13c0d4be3fcc8ffa195 Mon Sep 17 00:00:00 2001 From: MinaR Date: Fri, 9 May 2025 15:10:39 +0200 Subject: [PATCH 4/5] aggiornamenti per licor --- .../it/integry/ems/service/EntityProcessor.java | 2 +- .../ems_model/business_logic/GeneraOrdLav.java | 6 +++--- ems-core/src/main/resources/rules/post_calc.drl | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems/service/EntityProcessor.java b/ems-core/src/main/java/it/integry/ems/service/EntityProcessor.java index 7ad469079a..a68f31b930 100644 --- a/ems-core/src/main/java/it/integry/ems/service/EntityProcessor.java +++ b/ems-core/src/main/java/it/integry/ems/service/EntityProcessor.java @@ -175,7 +175,7 @@ public class EntityProcessor { private void checkEntityChildsUsage(EntityInterface entityInterface, MultiDBTransactionManager multiDBTransactionManager, RequestDataDTO requestDataDTO) throws Exception { boolean isMaster = entityPropertyHolder.isEntityMaster(((EntityBase) entityInterface).getClass()); - ; + OperationType operationType = entityInterface.getOperation(); if (!isMaster && (operationType != OperationType.SELECT_OBJECT && operationType != OperationType.SELECT)) { diff --git a/ems-core/src/main/java/it/integry/ems_model/business_logic/GeneraOrdLav.java b/ems-core/src/main/java/it/integry/ems_model/business_logic/GeneraOrdLav.java index 3b71a0c87e..f070a3e1bb 100644 --- a/ems-core/src/main/java/it/integry/ems_model/business_logic/GeneraOrdLav.java +++ b/ems-core/src/main/java/it/integry/ems_model/business_logic/GeneraOrdLav.java @@ -1486,8 +1486,8 @@ public class GeneraOrdLav { List dtbOrdSteps = UtilityDB.executeSimpleQueryDTO(conn, sql, DtbOrdSteps.class); dtbOrdSteps.stream().forEach(x -> { - x.setDataIniz(UtilityDate.dateAdd(x.getDataIniz(), ggDiff)); - x.setDataFine(UtilityDate.dateAdd(x.getDataFine(), ggDiff)); + x.setDataIniz(x.getDataIniz()!=null?UtilityDate.dateAdd(x.getDataIniz(), ggDiff):null); + x.setDataFine(x.getDataFine() != null ?UtilityDate.dateAdd(x.getDataFine(), ggDiff):null); x.setOperation(OperationType.UPDATE); }); @@ -1571,7 +1571,7 @@ public class GeneraOrdLav { if (dtbOrds != null && !dtbOrds.isEmpty()) { dtbOrds.forEach(x -> { - x.setQta(x.getQta().multiply(moltiplicatore).setScale(2, RoundingMode.HALF_UP)).setValUnt(valUntProd).setImporto((x.getQta().multiply(moltiplicatore).setScale(2, RoundingMode.HALF_UP)).multiply(valUntProd)); + x.setQta(x.getQta().multiply(moltiplicatore).setScale(5, RoundingMode.HALF_UP)).setValUnt(valUntProd).setImporto((x.getQta().multiply(moltiplicatore).setScale(2, RoundingMode.HALF_UP)).multiply(valUntProd)); x.setOperation(OperationType.UPDATE); }); diff --git a/ems-core/src/main/resources/rules/post_calc.drl b/ems-core/src/main/resources/rules/post_calc.drl index a71b091c83..e448d4592a 100644 --- a/ems-core/src/main/resources/rules/post_calc.drl +++ b/ems-core/src/main/resources/rules/post_calc.drl @@ -37,14 +37,14 @@ end //ANNULLAMENTO RICALCOLO TOTALI ORDINI PRODUZIONE -rule "annullamentoCalcTotaliOrdP" -no-loop -when - eval(postRulesEnabled) - $ordT : DtbOrdt(executeRecalc == true && gestione == "A" && gestioneRif != null) -then - modify ( $ordT ) { setExecuteRecalc(false) } -end +//rule "annullamentoCalcTotaliOrdP" +//no-loop +//when +// eval(postRulesEnabled) +// $ordT : DtbOrdt(executeRecalc == true && gestione == "A" && gestioneRif != null) +//then +// modify ( $ordT ) { setExecuteRecalc(false) } +//end rule "completeCalcTotaliOrd" no-loop From c8233817f319cfa399143de5b7a9e4510c7e5490 Mon Sep 17 00:00:00 2001 From: Valerio Castellana Date: Fri, 9 May 2025 17:27:53 +0200 Subject: [PATCH 5/5] [ROSSOGARGANO] - correzioni in riproporzionamento materiali (decimali ) --- .../it/integry/ems_model/utility/UtilityBigDecimal.java | 4 ++-- .../integry/ems/document/service/DocumentProdService.java | 2 +- .../wms/lavorazione/service/WMSLavorazioneService.java | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java index a354562a76..42d771257e 100644 --- a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java +++ b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityBigDecimal.java @@ -125,8 +125,8 @@ public class UtilityBigDecimal { return calculatePercentage(base,percentValue,5); } public static BigDecimal calculatePercentage(BigDecimal base, double percentValue, int scale) { - BigDecimal percent = new BigDecimal(percentValue).divide(new BigDecimal("100"), scale, RoundingMode.HALF_UP); - return base.multiply(percent); + BigDecimal percent = new BigDecimal(percentValue).divide(new BigDecimal("100"), 5, RoundingMode.HALF_EVEN); + return base.multiply(percent).setScale(scale,RoundingMode.HALF_UP); } } diff --git a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java index e607c30f6c..89118cd4c3 100644 --- a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java +++ b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentProdService.java @@ -3416,7 +3416,7 @@ public class DocumentProdService { } } if (docT == null) { - docT = generaTestataDocDaOrdineLav(ordine, datiScarico.getCodDtip(), chiusuraLavorazioneDTO.getDataDoc(), datiScarico.getSerDoc(), datiScarico.getCodAnag(), null, datiScarico.getCodMdep(), produzioneOrdine.getPartitaMag()); + docT = generaTestataDocDaOrdineLav(ordine, datiScarico.getCodDtip(), UtilityLocalDate.localDateToDate(produzioneOrdine.getDataProd()), datiScarico.getSerDoc(), datiScarico.getCodAnag(), null, datiScarico.getCodMdep(), produzioneOrdine.getPartitaMag()); docT.setOperation(OperationType.INSERT); if (datiScarico.getDataVersamento() != null) { docT.setDataIns(datiScarico.getDataVersamento()); diff --git a/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java b/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java index eae7fbfd2e..bc223ff426 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/wms/lavorazione/service/WMSLavorazioneService.java @@ -811,7 +811,11 @@ public class WMSLavorazioneService { // // for (ScarichiArticoloDTO scarichiMp : scarichiArticoli.values()) { - BigDecimal qtaDaScaricare = UtilityBigDecimal.calculatePercentage(scarichiMp.getQtaScaricata(), produzione.getPesoProduzione().doubleValue()); + String codMart = scarichiMp.getCodMart(); + BigDecimal cifreDec = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn( multiDBTransactionManager.getPrimaryConnection(), + Query.format("select mtb_unt_mis.cifre_dec from mtb_unt_mis inner join mtb_aart on mtb_unt_mis.unt_mis = mtb_aart.unt_mis and cod_mart = {}", codMart) + ); + BigDecimal qtaDaScaricare = UtilityBigDecimal.calculatePercentage(scarichiMp.getQtaScaricata(), produzione.getPesoProduzione().doubleValue(),cifreDec.intValue()); if (UtilityBigDecimal.equalsTo(qtaDaScaricare, BigDecimal.ZERO)) { continue; }