diff --git a/ems-engine/src/main/java/it/integry/ems/production/controller/ProductionController.java b/ems-engine/src/main/java/it/integry/ems/production/controller/ProductionController.java index 36c170ff0e..ac36c389e4 100644 --- a/ems-engine/src/main/java/it/integry/ems/production/controller/ProductionController.java +++ b/ems-engine/src/main/java/it/integry/ems/production/controller/ProductionController.java @@ -12,14 +12,21 @@ import it.integry.ems.production.service.MrpService; import it.integry.ems.production.service.ProductionService; import it.integry.ems.response.ServiceRestResponse; import it.integry.ems.rules.businessLogic.dto.LoadColliDTO; +import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems_model.config.EmsRestConstants; +import it.integry.ems_model.entity.DtbDoct; import it.integry.ems_model.entity.DtbOrdt; +import it.integry.ems_model.utility.Query; +import it.integry.ems_model.utility.UtilityDB; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.web.bind.annotation.*; +import java.util.Date; +import java.util.List; + @RestController @Scope(value = "request") @RequestMapping("production") @@ -36,6 +43,9 @@ public class ProductionController { @Autowired private MrpDailyMaterialReqService mrpDailyMaterialReqService; + @Autowired + private MultiDBTransactionManager multiDBTransactionManager; + @Autowired private RequestDataDTO requestDataDTO; @@ -95,4 +105,25 @@ public class ProductionController { ServiceRestResponse creaColliEDoc(@RequestBody LoadColliDTO loadColliDTO) throws Exception { return ServiceRestResponse.createPositiveResponse(productionService.creaColliEDoc(loadColliDTO, requestDataDTO.getUsername())); } + + @RequestMapping(value = "/distribuzioneMateriali", method = RequestMethod.GET) + public @ResponseBody + ServiceRestResponse distribuzioneMateriali(@RequestParam String codAnag, + @RequestParam String codDtip, + @RequestParam Date dataDoc, + @RequestParam String serDoc, + @RequestParam Integer numDoc) throws Exception { + String sql = Query.format( + "SELECT * \n" + + "FROM dtb_doct WHERE dtb_doct.cod_anag = %s\n" + + " AND dtb_doct.cod_dtip = %s\n" + + " AND dtb_doct.data_doc = %s\n" + + " AND dtb_doct.ser_doc = %s\n" + + " AND dtb_doct.num_doc = %s", + codAnag, codDtip, dataDoc, serDoc, numDoc + ); + DtbDoct dtbDoct = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbDoct.class); + + return ServiceRestResponse.createPositiveResponse(productionService.distribuzioneMateriali(dtbDoct)); + } } diff --git a/ems-engine/src/main/java/it/integry/ems/production/dto/MerceDaRipartireDTO.java b/ems-engine/src/main/java/it/integry/ems/production/dto/MerceDaRipartireDTO.java new file mode 100644 index 0000000000..5d764b12c3 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/production/dto/MerceDaRipartireDTO.java @@ -0,0 +1,115 @@ +package it.integry.ems.production.dto; + +import it.integry.ems_model.annotation.SqlField; + +import java.math.BigDecimal; + +public class MerceDaRipartireDTO { + @SqlField(value = "cod_mart") + private String codMart; + + @SqlField(value = "descrizione") + private String descrizione; + + @SqlField(value = "descrizione_estesa") + private String descrizioneEstesa; + + @SqlField(value = "partita_mag") + private String partitaMag; + + @SqlField(value = "qta_doc") + private BigDecimal qtaDoc; + + @SqlField(value = "unt_doc") + private String untDoc; + + @SqlField(value = "id_lotto") + private Integer idLotto; + + @SqlField(value = "cod_jfas") + private String codJfas; + + @SqlField(value = "rientro") + private boolean rientro; + + public String getCodMart() { + return codMart; + } + + public MerceDaRipartireDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public String getDescrizione() { + return descrizione; + } + + public MerceDaRipartireDTO setDescrizione(String descrizione) { + this.descrizione = descrizione; + return this; + } + + public String getDescrizioneEstesa() { + return descrizioneEstesa; + } + + public MerceDaRipartireDTO setDescrizioneEstesa(String descrizioneEstesa) { + this.descrizioneEstesa = descrizioneEstesa; + return this; + } + + public String getPartitaMag() { + return partitaMag; + } + + public MerceDaRipartireDTO setPartitaMag(String partitaMag) { + this.partitaMag = partitaMag; + return this; + } + + public BigDecimal getQtaDoc() { + return qtaDoc; + } + + public MerceDaRipartireDTO setQtaDoc(BigDecimal qtaDoc) { + this.qtaDoc = qtaDoc; + return this; + } + + public String getUntDoc() { + return untDoc; + } + + public MerceDaRipartireDTO setUntDoc(String untDoc) { + this.untDoc = untDoc; + return this; + } + + public Integer getIdLotto() { + return idLotto; + } + + public MerceDaRipartireDTO setIdLotto(Integer idLotto) { + this.idLotto = idLotto; + return this; + } + + public String getCodJfas() { + return codJfas; + } + + public MerceDaRipartireDTO setCodJfas(String codJfas) { + this.codJfas = codJfas; + return this; + } + + public boolean isRientro() { + return rientro; + } + + public MerceDaRipartireDTO setRientro(boolean rientro) { + this.rientro = rientro; + return this; + } +} diff --git a/ems-engine/src/main/java/it/integry/ems/production/dto/RigheLottLavDTO.java b/ems-engine/src/main/java/it/integry/ems/production/dto/RigheLottLavDTO.java new file mode 100644 index 0000000000..c2fd4ed9a7 --- /dev/null +++ b/ems-engine/src/main/java/it/integry/ems/production/dto/RigheLottLavDTO.java @@ -0,0 +1,92 @@ +package it.integry.ems.production.dto; + +import it.integry.ems_model.annotation.SqlField; + +import java.math.BigDecimal; +import java.util.Date; + +public class RigheLottLavDTO { + @SqlField(value = "id_lotto") + private Integer idLotto; + + @SqlField(value = "cod_jfas") + private String codJfas; + + @SqlField(value = "data_ord") + private Date dataOrd; + + @SqlField(value = "num_ord") + private Integer numOrd; + + @SqlField(value = "riga_ord") + private Integer rigaOrd; + + @SqlField(value = "cod_mart") + private String codMart; + + @SqlField(value = "qta_ord") + private BigDecimal qta_ord; + + public Integer getIdLotto() { + return idLotto; + } + + public RigheLottLavDTO setIdLotto(Integer idLotto) { + this.idLotto = idLotto; + return this; + } + + public String getCodJfas() { + return codJfas; + } + + public RigheLottLavDTO setCodJfas(String codJfas) { + this.codJfas = codJfas; + return this; + } + + public Date getDataOrd() { + return dataOrd; + } + + public RigheLottLavDTO setDataOrd(Date dataOrd) { + this.dataOrd = dataOrd; + return this; + } + + public Integer getNumOrd() { + return numOrd; + } + + public RigheLottLavDTO setNumOrd(Integer numOrd) { + this.numOrd = numOrd; + return this; + } + + public Integer getRigaOrd() { + return rigaOrd; + } + + public RigheLottLavDTO setRigaOrd(Integer rigaOrd) { + this.rigaOrd = rigaOrd; + return this; + } + + public String getCodMart() { + return codMart; + } + + public RigheLottLavDTO setCodMart(String codMart) { + this.codMart = codMart; + return this; + } + + public BigDecimal getQta_ord() { + return qta_ord; + } + + public RigheLottLavDTO setQta_ord(BigDecimal qta_ord) { + this.qta_ord = qta_ord; + return this; + } +} 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 b7b52f7621..47d3f59f84 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 @@ -14,6 +14,7 @@ import it.integry.ems.service.EntityProcessor; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.utility.UtilityEntity; import it.integry.ems_model.base.EntityBase; +import it.integry.ems_model.db.ResultSetMapper; import it.integry.ems_model.entity.*; import it.integry.ems_model.exception.DataConverterNotFoundException; import it.integry.ems_model.service.SetupGest; @@ -33,6 +34,7 @@ import java.sql.SQLException; import java.time.LocalDate; import java.time.ZoneId; import java.util.*; +import java.util.stream.Collectors; @Service @Scope("request") @@ -797,6 +799,7 @@ public class ProductionService { if (chiusuraLavorazioneDTO.isSalvaDocumenti()) { entityProcessor.processEntityList(entityBaseList, true); + //distribuzioneMateriali(); } return entityBaseList; } @@ -1134,4 +1137,181 @@ public class ProductionService { return entities; } -} + + public List distribuzioneMateriali(DtbDoct dtbDoct) throws Exception { + Connection conn = multiDBTransactionManager.getPrimaryConnection(); + String sql = Query.format( + "SELECT * FROM dtb_docr WHERE cod_dtip = %s AND num_doc = %s AND data_doc = %s AND cod_anag = %s AND ser_doc = %s", + dtbDoct.getCodDtip(), dtbDoct.getNumDoc(), dtbDoct.getDataDoc(), dtbDoct.getCodAnag(), dtbDoct.getSerDoc() + ); + List dtbDocrList = new ResultSetMapper().mapQuerySetToList(conn, sql, DtbDocr.class, OperationType.DELETE); + dtbDoct.setDtbDocr(dtbDocrList); + + sql = Query.format( + "WITH doc_rientro AS (SELECT dtb_doct.id_lotto,\n" + + " dtb_doct.cod_jfas,\n" + + " dtb_docr.cod_mart,\n" + + " dtb_docr.descrizione,\n" + + " dtb_docr.descrizione_estesa,\n" + + " dtb_docr.partita_mag,\n" + + " SUM(dtb_docr.qta_doc) AS qta_doc,\n" + + " dtb_docr.unt_doc,\n" + + " MIN(id_riga) AS id_riga\n" + + " FROM dtb_doct\n" + + " INNER JOIN dtb_docr ON dtb_doct.cod_anag = dtb_docr.cod_anag AND\n" + + " dtb_doct.cod_dtip = dtb_docr.cod_dtip AND\n" + + " dtb_doct.data_doc = dtb_docr.data_doc AND\n" + + " dtb_doct.ser_doc = dtb_docr.ser_doc AND\n" + + " dtb_doct.num_doc = dtb_docr.num_doc\n" + + " INNER JOIN dtb_tipi ON dtb_doct.cod_dtip = dtb_tipi.cod_dtip\n" + + " WHERE dtb_tipi.tipo_emissione = 'diretta'\n" + + " AND (dtb_tipi.segno_qta_car > 0 OR dtb_tipi.segno_qta_scar < 0)\n" + + " AND dtb_doct.cod_dtip = (SELECT value\n" + + " FROM stb_gest_setup\n" + + " WHERE gest_name = 'W_PORDI_RC'\n" + + " AND section = 'SETUP_DOCUMENTI'\n" + + " AND key_section = 'COD_DTIP_RIEN')\n" + + " AND dtb_tipi.gestione = 'L'\n" + + " AND dtb_docr.cod_mart IS NOT NULL\n" + + " GROUP BY dtb_doct.id_lotto,\n" + + " dtb_doct.cod_jfas,\n" + + " dtb_docr.cod_mart,\n" + + " dtb_docr.partita_mag,\n" + + " dtb_docr.descrizione,\n" + + " descrizione_estesa,\n" + + " unt_doc),\n" + + " doc AS (SELECT mtb_colr.cod_mart,\n" + + " mtb_aart.descrizione,\n" + + " mtb_aart.descrizione_estesa,\n" + + " mtb_colr.partita_mag,\n" + + " mtb_colr.qta_col - ISNULL(doc_rientro.qta_doc, 0) AS qta_doc,\n" + + " mtb_aart.unt_mis AS unt_doc,\n" + + " dtb_doct.id_lotto,\n" + + " dtb_doct.cod_jfas,\n" + + " CAST(0 AS BIT) AS rientro,\n" + + " ROW_NUMBER() OVER (ORDER BY mtb_colt.gestione, mtb_colt.data_collo, mtb_colt.ser_collo, mtb_colt.num_collo, mtb_colr.riga) AS id_riga\n" + + " FROM dtb_doct\n" + + " INNER JOIN mtb_colt\n" + + " ON dtb_doct.cod_anag = mtb_colt.cod_anag AND dtb_doct.cod_dtip = mtb_colt.cod_dtip AND\n" + + " dtb_doct.data_doc = mtb_colt.data_doc AND dtb_doct.ser_doc = mtb_colt.ser_doc AND\n" + + " dtb_doct.num_doc = mtb_colt.num_doc\n" + + " INNER JOIN mtb_colr\n" + + " ON mtb_colt.gestione = mtb_colr.gestione AND mtb_colt.data_collo = mtb_colr.data_collo\n" + + " AND mtb_colt.num_collo = mtb_colr.num_collo AND\n" + + " mtb_colt.ser_collo = mtb_colr.ser_collo\n" + + " INNER JOIN mtb_aart ON mtb_colr.cod_mart = mtb_aart.cod_mart\n" + + " LEFT OUTER JOIN doc_rientro ON dtb_doct.id_lotto = doc_rientro.id_lotto AND\n" + + " dtb_doct.cod_jfas = doc_rientro.cod_jfas AND\n" + + " mtb_colr.cod_mart = doc_rientro.cod_mart\n" + + "\n" + + " WHERE dtb_doct.cod_dtip = %s\n" + + " AND dtb_doct.num_doc = %s\n" + + " AND dtb_doct.data_doc = %s\n" + + " AND dtb_doct.cod_anag = %s\n" + + " AND dtb_doct.ser_doc = %s\n" + + " UNION ALL\n" + + " SELECT doc_rientro.cod_mart,\n" + + " doc_rientro.descrizione,\n" + + " doc_rientro.descrizione_estesa,\n" + + " doc_rientro.partita_mag,\n" + + " doc_rientro.qta_doc,\n" + + " doc_rientro.unt_doc,\n" + + " doc_rientro.id_lotto,\n" + + " doc_rientro.cod_jfas,\n" + + " CAST(1 AS BIT) AS rientro,\n" + + " doc_rientro.id_riga\n" + + " FROM dtb_doct\n" + + "\n" + + " INNER JOIN doc_rientro ON dtb_doct.id_lotto = doc_rientro.id_lotto AND\n" + + " dtb_doct.cod_jfas = doc_rientro.cod_jfas\n" + + " WHERE dtb_doct.cod_dtip = %s\n" + + " AND dtb_doct.num_doc = %s\n" + + " AND dtb_doct.data_doc = %s\n" + + " AND dtb_doct.cod_anag = %s\n" + + " AND dtb_doct.ser_doc = %s)\n" + + "SELECT *\n" + + "FROM doc\n" + + "ORDER BY rientro, id_riga", + dtbDoct.getCodDtip(), dtbDoct.getNumDoc(), dtbDoct.getDataDoc(), dtbDoct.getCodAnag(), dtbDoct.getSerDoc(), + dtbDoct.getCodDtip(), dtbDoct.getNumDoc(), dtbDoct.getDataDoc(), dtbDoct.getCodAnag(), dtbDoct.getSerDoc() + ); + + List merceDaRipartireList = UtilityDB.executeSimpleQueryDTO(conn, sql, MerceDaRipartireDTO.class); + + if (merceDaRipartireList == null) return null; + + for (MerceDaRipartireDTO merceDaRipartire : merceDaRipartireList) { + DtbDocr dtbDocr = new DtbDocr() + .setCodMart(merceDaRipartire.getCodMart()) + .setDescrizione(merceDaRipartire.getDescrizione()) + .setDescrizioneEstesa(merceDaRipartire.getDescrizioneEstesa()) + .setPartitaMag(merceDaRipartire.getPartitaMag()) + .setQtaDoc(merceDaRipartire.getQtaDoc()) + .setUntDoc(merceDaRipartire.getUntDoc()) + .setCodJfas(merceDaRipartire.getCodJfas()); + + if (!UtilityString.isNullOrEmpty(merceDaRipartire.getCodMart()) && !merceDaRipartire.isRientro()) { + sql = Query.format( + "SELECT\n" + + " jtb_lotr.id_lotto,\n" + + " jtb_lotr.cod_jfas,\n" + + " dtb_ordt.data_ord,\n" + + " dtb_ordt.num_ord,\n" + + " dtb_ordr.riga_ord,\n" + + " dtb_ordr.cod_mart,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) AS qta_ord\n" + + "FROM jtb_lotr\n" + + " INNER JOIN dtb_ordt ON jtb_lotr.gestione = dtb_ordt.gestione AND\n" + + " jtb_lotr.data_ord = dtb_ordt.data_ord AND\n" + + " jtb_lotr.num_ord = dtb_ordt.num_ord\n" + + " LEFT OUTER JOIN dtb_ordr ON dtb_ordr.gestione = dtb_ordt.gestione AND\n" + + " dtb_ordr.data_ord = dtb_ordt.data_ord AND\n" + + " dtb_ordr.num_ord = dtb_ordt.num_ord\n" + + "WHERE jtb_lotr.id_lotto = %s\n" + + " AND jtb_lotr.cod_jfas = %s", + merceDaRipartire.getIdLotto(), merceDaRipartire.getCodJfas() + ); + + List righeLottLav = UtilityDB.executeSimpleQueryDTO(conn, sql, RigheLottLavDTO.class); + + if (righeLottLav == null) return null; + + List righeFiltrate = righeLottLav.stream() + .filter(riga -> Objects.equals(riga.getCodMart(), merceDaRipartire.getCodMart())) + .collect(Collectors.toList()); + + if (righeFiltrate.isEmpty()) { + righeFiltrate = righeLottLav; + } + + BigDecimal sumQtaOrd = sumQtaOrd(righeFiltrate); + + for (RigheLottLavDTO righe : righeFiltrate) { + BigDecimal qtaOrd = righe.getQta_ord(); + DtbDocr doc = (DtbDocr) dtbDocr.deepClone(); + + doc + .setQta(UtilityBigDecimal.multiply(UtilityBigDecimal.divide(qtaOrd, sumQtaOrd), merceDaRipartire.getQtaDoc())) + .setDataOrd(righe.getDataOrd()) + .setNumOrd(righe.getNumOrd()) + .setRigaOrd(righe.getRigaOrd()) + .setOperation(OperationType.INSERT); + dtbDoct.getDtbDocr().add(doc); + } + } else { + dtbDocr.setOperation(OperationType.INSERT); + dtbDoct.getDtbDocr().add(dtbDocr); + } + } + + dtbDoct.setOperation(OperationType.UPDATE); + + return entityProcessor.processEntity(dtbDoct, multiDBTransactionManager); + } + + public static BigDecimal sumQtaOrd(List righeLottLavDTOList) { + return righeLottLavDTOList.stream() + .map(RigheLottLavDTO::getQta_ord) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } +} \ No newline at end of file