Distribuzione materiali su ordini presenti nel lotto di lavorazione
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<EntityBase> 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<DtbDocr> 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<MerceDaRipartireDTO> 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<RigheLottLavDTO> righeLottLav = UtilityDB.executeSimpleQueryDTO(conn, sql, RigheLottLavDTO.class);
|
||||
|
||||
if (righeLottLav == null) return null;
|
||||
|
||||
List<RigheLottLavDTO> 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<RigheLottLavDTO> righeLottLavDTOList) {
|
||||
return righeLottLavDTOList.stream()
|
||||
.map(RigheLottLavDTO::getQta_ord)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user