Migliorie su servizio di riproporzionamento scarichi produzione
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
2025-06-13 16:46:24 +02:00
parent 715e1fc6c3
commit 5576834083
7 changed files with 363 additions and 121 deletions

View File

@@ -217,6 +217,16 @@ public class MtbColt extends EntityBase implements EquatableEntityInterface<MtbC
this.numCollo = numCollo; this.numCollo = numCollo;
} }
public MtbColtKey getKey() {
return UtilityString.isNullOrEmpty(gestione) ||
UtilityString.isNullOrEmpty(dataCollo) ||
dataCollo == null ||
numCollo == null ?
null :
new MtbColtKey(gestione, serCollo, getDataCollo(), numCollo);
}
public String getGestione() { public String getGestione() {
return gestione; return gestione;
} }
@@ -705,21 +715,32 @@ public class MtbColt extends EntityBase implements EquatableEntityInterface<MtbC
@Override @Override
public void execStoredProcedure() throws Exception { public void execStoredProcedure() throws Exception {
if (this.getOperation() != OperationType.DELETE && dataCollo != null) { if (this.getOperation() != OperationType.DELETE &&
getOperation() != OperationType.SELECT_OBJECT &&
getOperation() != OperationType.SELECT &&
getKey() != null) {
if (this.getCalcPeso()) { if (this.getCalcPeso()) {
String updateSql = Query.format("UPDATE mtb_colt\n" + String updateSql = Query.format("UPDATE mtb_colt\n" +
"SET peso_kg = ISNULL(SUM(mtb_colr.peso_lordo_kg), 0),\n" + "SET peso_kg = ISNULL(mtb_colr.peso_lordo_kg, 0),\n" +
" peso_netto_kg = ISNULL(SUM(mtb_colr.peso_netto_kg), 0)\n" + " peso_netto_kg = ISNULL(mtb_colr.peso_netto_kg, 0)\n" +
"FROM mtb_colt\n" + "FROM mtb_colt\n" +
" INNER JOIN mtb_colr ON mtb_colt.gestione = mtb_colr.gestione AND\n" + " INNER JOIN (SELECT gestione,\n" +
" data_collo,\n" +
" ser_collo,\n" +
" num_collo,\n" +
" SUM(mtb_colr.peso_lordo_kg) AS peso_lordo_kg,\n" +
" SUM(mtb_colr.peso_netto_kg) AS peso_netto_kg\n" +
" FROM mtb_colr\n" +
" GROUP BY gestione, data_collo, ser_collo, num_collo) mtb_colr ON\n" +
" mtb_colt.gestione = mtb_colr.gestione AND\n" +
" mtb_colt.ser_collo = mtb_colr.ser_collo AND\n" + " mtb_colt.ser_collo = mtb_colr.ser_collo AND\n" +
" mtb_colt.num_collo = mtb_colr.num_collo AND\n" + " mtb_colt.num_collo = mtb_colr.num_collo AND\n" +
" mtb_colt.data_collo = mtb_colr.data_collo\n" + " mtb_colt.data_collo = mtb_colr.data_collo\n" +
" WHERE mtb_colt.gestione = %s\n" + " WHERE mtb_colt.gestione = %s\n" +
" AND data_collo > %s\n" + " AND mtb_colt.data_collo = %s\n" +
" AND ser_collo = %s\n" + " AND mtb_colt.ser_collo = %s\n" +
" AND num_collo = %s", " AND mtb_colt.num_collo = %s",
getGestione(), getDataCollo(), getSerCollo(), getNumCollo()); getGestione(), getDataCollo(), getSerCollo(), getNumCollo());
UtilityDB.executeSimpleUpdate(connection, updateSql); UtilityDB.executeSimpleUpdate(connection, updateSql);

View File

@@ -40,7 +40,7 @@ public class MtbColtKey {
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || (getClass() != o.getClass() && !getClass().isAssignableFrom(o.getClass()))) return false;
MtbColtKey that = (MtbColtKey) o; MtbColtKey that = (MtbColtKey) o;
return Objects.equals(dataCollo, that.dataCollo) && return Objects.equals(dataCollo, that.dataCollo) &&
Objects.equals(gestione, that.gestione) && Objects.equals(gestione, that.gestione) &&

View File

@@ -1,7 +1,10 @@
package it.integry.ems_model.utility; package it.integry.ems_model.utility;
import it.integry.ems_model.base.EntityInterface;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
public class UtilityList { public class UtilityList {
@@ -15,4 +18,20 @@ public class UtilityList {
return defaultValue; return defaultValue;
return listToCheck; return listToCheck;
} }
public static <T extends EntityInterface> List<T> clone(List<T> listToClone) {
if (listToClone == null) {
return null;
}
return new ArrayList<>(listToClone.stream()
.map(x -> {
try {
return (T) x.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList()));
}
} }

View File

@@ -2939,8 +2939,8 @@ public class DocumentProdService {
documentiCarico.add(generaDocumentiCaricoDaTeorico(dto)); documentiCarico.add(generaDocumentiCaricoDaTeorico(dto));
} }
if (dto.isSalvaDocumenti()){ if (dto.isSalvaDocumenti()) {
entityProcessor.processEntityList(documentiCarico,multiDBTransactionManager,true); entityProcessor.processEntityList(documentiCarico, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(documentiCarico); UtilityEntity.throwEntitiesException(documentiCarico);
} }
return documentiCarico; return documentiCarico;
@@ -2951,8 +2951,8 @@ public class DocumentProdService {
ScaricoLavorazioneDTO dtoScarico = dto.getScaricoLavorazioneDTO(); ScaricoLavorazioneDTO dtoScarico = dto.getScaricoLavorazioneDTO();
if (dtoScarico.isScaricoDaCollo()) { if (dtoScarico.isScaricoDaCollo()) {
List<DtbDoct> scarichiDaCollo = generaDocumentiScaricoOrdineDaColli(dto); List<DtbDoct> scarichiDaCollo = generaDocumentiScaricoOrdineDaColli(dto);
if (dto.isSalvaDocumenti()){ if (dto.isSalvaDocumenti()) {
entityProcessor.processEntityList(scarichiDaCollo,multiDBTransactionManager,true); entityProcessor.processEntityList(scarichiDaCollo, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(scarichiDaCollo); UtilityEntity.throwEntitiesException(scarichiDaCollo);
} }
documentiScarico.addAll(scarichiDaCollo); documentiScarico.addAll(scarichiDaCollo);
@@ -2963,8 +2963,8 @@ public class DocumentProdService {
// dei carichi/scarichi deve essere fatta utilizzando la data dei colli di versamento o carico"> // dei carichi/scarichi deve essere fatta utilizzando la data dei colli di versamento o carico">
for (ArticoloProdottoDTO produzione : dto.getProduzioniOrdine()) { for (ArticoloProdottoDTO produzione : dto.getProduzioniOrdine()) {
List<DtbDoct> scarichi = generaDocumentiScaricoMateriali(dto, produzione); List<DtbDoct> scarichi = generaDocumentiScaricoMateriali(dto, produzione);
if (dto.isSalvaDocumenti()){ if (dto.isSalvaDocumenti()) {
entityProcessor.processEntityList(scarichi,multiDBTransactionManager,true); entityProcessor.processEntityList(scarichi, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(scarichi); UtilityEntity.throwEntitiesException(scarichi);
} }
documentiScarico.addAll(scarichi); documentiScarico.addAll(scarichi);
@@ -2980,8 +2980,7 @@ public class DocumentProdService {
} }
/** /**
* * @param ordine ordine da controllare
* @param ordine ordine da controllare
* @param separaPerData separa le produzioni per data collo * @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 * @return Recupera tutte le produzioni senza documento dell'ordine suddivise per articolo, partita e (se necessario) data di produzione
* @throws Exception * @throws Exception
@@ -3006,12 +3005,10 @@ public class DocumentProdService {
} }
BigDecimal qtaProdotta = produzioni.stream().map(ArticoloProdottoDTO::getQuantita).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal qtaProdotta = produzioni.stream().map(ArticoloProdottoDTO::getQuantita).reduce(BigDecimal.ZERO, BigDecimal::add);
produzioni.forEach(x -> produzioni.forEach(x -> {
{ x.setPesoProduzione(BigDecimal.valueOf(100).multiply(x.getQuantita()).divide(qtaProdotta, 3, RoundingMode.HALF_EVEN));
x.setPesoProduzione(BigDecimal.valueOf(100).multiply(x.getQuantita()).divide(qtaProdotta, 3, RoundingMode.HALF_EVEN)); x.setOrdine(ordine);
x.setOrdine(ordine); });
}
);
return produzioni; return produzioni;
} }
@@ -3244,7 +3241,8 @@ public class DocumentProdService {
"SELECT DISTINCT mtb_colt.gestione, " + "SELECT DISTINCT mtb_colt.gestione, " +
" mtb_colt.data_collo, " + " mtb_colt.data_collo, " +
" mtb_colt.ser_collo, " + " mtb_colt.ser_collo, " +
" mtb_colt.num_collo " + " mtb_colt.num_collo, " +
" mtb_colt.segno " +
" FROM mtb_colt, " + " FROM mtb_colt, " +
" mtb_colr " + " mtb_colr " +
" WHERE mtb_colr.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " + " WHERE mtb_colr.gestione = " + UtilityDB.valueToString(ordine.getGestione()) + " AND " +

View File

@@ -2,9 +2,9 @@ package it.integry.ems.retail.wms.Utility;
import com.annimon.stream.Optional; import com.annimon.stream.Optional;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import groovy.lang.Tuple2;
import it.integry.ems._context.ApplicationContextProvider; import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.exception.MissingDataException; import it.integry.ems.exception.MissingDataException;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.retail.wms.dto.InsertUDCRowRequestDTO; import it.integry.ems.retail.wms.dto.InsertUDCRowRequestDTO;
import it.integry.ems.retail.wms.dto.InsertUDCRowResponseDTO; import it.integry.ems.retail.wms.dto.InsertUDCRowResponseDTO;
@@ -24,7 +24,6 @@ import it.integry.ems_model.utility.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.SQLException; import java.sql.SQLException;
import java.time.LocalDate; import java.time.LocalDate;
@@ -239,6 +238,122 @@ public class WMSUtility {
entityProcessor.processEntity(mtbColt, true, multiDBTransactionManager); entityProcessor.processEntity(mtbColt, true, multiDBTransactionManager);
} }
public static Tuple2<ArrayList<MtbColr>, ArrayList<MtbColr>> generateSpostaArtsTraUlMovements(MtbColt sourceMtbColt, MtbColt destinationMtbColt, boolean flagForceUseRefs, RequestDataDTO requestDataDTO) throws Exception {
String destinationBarcodeUl = destinationMtbColt.getBarcodeUl();
String destinationCodMdep = destinationMtbColt.getCodMdep();
String destinationPosizione = destinationMtbColt.getPosizione();
String destinationGestione = destinationMtbColt.getGestione();
if (UtilityString.isNullOrEmpty(destinationBarcodeUl))
throw new MissingDataException("SSCC di destinazione non presente");
if (UtilityString.isNullOrEmpty(destinationGestione))
throw new MissingDataException("Gestione UL di destinazione non presente");
List<MtbColr> mtbColrsToMove = sourceMtbColt.getMtbColr();
if (mtbColrsToMove != null && !mtbColrsToMove.isEmpty()) {
ArrayList<MtbColr> mtbColrSourceList = new ArrayList<>();
ArrayList<MtbColr> mtbColrDestList = new ArrayList<>();
for (MtbColr mtbColr : mtbColrsToMove) {
MtbColr cloneMtbColr = (MtbColr) mtbColr.clone();
boolean destroyMtbColrReferences = false;
//Se la sorgente è un collo di scarico allora faccio lo storno sulla sorgente e aggiungo le qta a quella di destinazione
if (!flagForceUseRefs &&
(sourceMtbColt.getSegno() == -1 && UtilityString.equalsIgnoreCase(destinationGestione, "L"))) {
destroyMtbColrReferences = true;
MtbColr stornoSourceMtbColr = (MtbColr) mtbColr.clone();
stornoSourceMtbColr
.setGestione(null)
.setNumCollo(null)
.setSerCollo(null)
.setDataCollo(null)
.setRiga(null)
.setGestioneRif(cloneMtbColr.getGestioneRif())
.setNumColloRif(cloneMtbColr.getNumColloRif())
.setSerColloRif(cloneMtbColr.getSerColloRif())
.setDataColloRif(cloneMtbColr.getDataColloRif())
.setCausale(MtbColr.Causale.VERSAMENTO)
.setUtente(requestDataDTO.getUsername())
.setQtaCol(stornoSourceMtbColr.getQtaCol().multiply(new BigDecimal(-1)))
.setNumCnf(stornoSourceMtbColr.getNumCnf().multiply(new BigDecimal(-1)))
//Lavoro al contrario per compatibilità
.setBarcodeUlOut(cloneMtbColr.getBarcodeUlIn())
.setCodMdepOut(cloneMtbColr.getCodMdepOut())
.setPosizioneOut(cloneMtbColr.getPosizioneOut())
.setBarcodeUlIn(destinationBarcodeUl)
.setCodMdepIn(destinationCodMdep)
.setPosizioneIn(destinationPosizione)
.setOperation(OperationType.UPDATE);
mtbColrSourceList.add(stornoSourceMtbColr);
}
if (!destroyMtbColrReferences) {
//Copio i campi gestione, num_collo, ser_collo e data_collo in rif perché dopo verranno azzerati
cloneMtbColr
.setGestioneRif(cloneMtbColr.getGestione())
.setSerColloRif(cloneMtbColr.getSerCollo())
.setNumColloRif(cloneMtbColr.getNumCollo())
.setDataColloRif(cloneMtbColr.getDataCollo());
cloneMtbColr
.setBarcodeUlOut(cloneMtbColr.getBarcodeUlIn())
.setBarcodeUlIn(destinationBarcodeUl)
.setPosizioneOut(cloneMtbColr.getPosizioneIn())
.setPosizioneIn(destinationPosizione)
.setCodMdepOut(cloneMtbColr.getCodMdepIn())
.setCodMdepOut(destinationCodMdep);
}
if (sourceMtbColt.getGestione().equalsIgnoreCase("V") && sourceMtbColt.getSegno() == +1) {
cloneMtbColr.setCodJcom(null);
}
cloneMtbColr
.setGestione(null)
.setSerCollo(null)
.setNumCollo(null)
.setDataCollo(null)
.setRiga(null)
.setBarcodeUlIn(destinationBarcodeUl)
.setCodMdepIn(destinationCodMdep)
.setPosizioneIn(destinationPosizione)
.setUtente(requestDataDTO.getUsername())
.setOperation(OperationType.INSERT_OR_UPDATE);
if (!StringUtils.equalsIgnoreCase(destinationGestione, "V")) {
cloneMtbColr
.setCausale(MtbColr.Causale.VERSAMENTO);
}
mtbColrDestList.add(cloneMtbColr);
}
// sourceMtbColt.setMtbColr(mtbColrSourceList);
// destinationMtbColt.setMtbColr(mtbColrDestList);
if (destinationMtbColt.getMtbCols().stream().noneMatch(x -> x.getOperation() == OperationType.INSERT || x.getOperation() == OperationType.INSERT_OR_UPDATE)) {
destinationMtbColt.setMtbCols(new ArrayList<>());
PackagesRules.insertMtbCols(destinationMtbColt, MtbCols.Causale.VERSAMENTO);
}
return new Tuple2<>(mtbColrSourceList, mtbColrDestList);
}
return new Tuple2<>(new ArrayList<>(), new ArrayList<>());
}
public static SpostaArtsTraULResponseDTO spostaArtsTraUL(Connection connection, MtbColt sourceMtbColt, String destinationSscc, boolean flagForceUseRefs, EntityProcessor entityProcessor, RequestDataDTO requestDataDTO) throws Exception { public static SpostaArtsTraULResponseDTO spostaArtsTraUL(Connection connection, MtbColt sourceMtbColt, String destinationSscc, boolean flagForceUseRefs, EntityProcessor entityProcessor, RequestDataDTO requestDataDTO) throws Exception {
String destinationMtbColtQuery = Query.format("SELECT * " + String destinationMtbColtQuery = Query.format("SELECT * " +
"FROM " + MtbColt.ENTITY + " " + "FROM " + MtbColt.ENTITY + " " +
@@ -571,7 +686,7 @@ public class WMSUtility {
} }
public static List<String> retrieveBarcodesInPosizione(Connection connection, String posizione) throws SQLException, IOException, PrimaryDatabaseNotPresentException { public static List<String> retrieveBarcodesInPosizione(Connection connection, String posizione) throws SQLException {
String sql = "SELECT * FROM (" + String sql = "SELECT * FROM (" +
"SELECT barcode_ul FROM mtb_colt WHERE posizione = " + UtilityDB.valueToString(posizione) + "SELECT barcode_ul FROM mtb_colt WHERE posizione = " + UtilityDB.valueToString(posizione) +
" UNION " + " UNION " +
@@ -597,7 +712,7 @@ public class WMSUtility {
public static MtbDepoPosizioni getPosizioneFromName(Connection conn, String posizione) throws Exception { public static MtbDepoPosizioni getPosizioneFromName(Connection conn, String posizione) throws Exception {
MtbDepoPosizioni mtbDepoPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn,Query.format("SELECT * from "+MtbDepoPosizioni.ENTITY+" where posizione = {}",posizione),MtbDepoPosizioni.class); MtbDepoPosizioni mtbDepoPosizioni = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, Query.format("SELECT * from " + MtbDepoPosizioni.ENTITY + " where posizione = {}", posizione), MtbDepoPosizioni.class);
return mtbDepoPosizioni; return mtbDepoPosizioni;
} }
} }

View File

@@ -15,7 +15,6 @@ import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor; import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.base.EntityBase; import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.DtbDoct; import it.integry.ems_model.entity.DtbDoct;
import it.integry.ems_model.entity.MtbColr; import it.integry.ems_model.entity.MtbColr;
import it.integry.ems_model.entity.MtbColt; import it.integry.ems_model.entity.MtbColt;
@@ -29,7 +28,10 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service

View File

@@ -1,8 +1,8 @@
package it.integry.ems.retail.wms.lavorazione.service; package it.integry.ems.retail.wms.lavorazione.service;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import groovy.lang.Tuple2;
import it.integry.ems.document.dto.ArticoloProdottoDTO; import it.integry.ems.document.dto.ArticoloProdottoDTO;
import it.integry.ems.document.dto.ScarichiMateriaPrimaDTO;
import it.integry.ems.javabeans.RequestDataDTO; import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.logistic.dto.sm2.FiltroDistribuzioneColloDTO; import it.integry.ems.logistic.dto.sm2.FiltroDistribuzioneColloDTO;
import it.integry.ems.product.importaz.service.ProductServices; import it.integry.ems.product.importaz.service.ProductServices;
@@ -13,10 +13,10 @@ import it.integry.ems.retail.wms.exceptions.InvalidArticoloException;
import it.integry.ems.retail.wms.exceptions.InvalidUDSQuantityException; import it.integry.ems.retail.wms.exceptions.InvalidUDSQuantityException;
import it.integry.ems.retail.wms.exceptions.UDSQuantityOverflowException; import it.integry.ems.retail.wms.exceptions.UDSQuantityOverflowException;
import it.integry.ems.retail.wms.generic.dto.MvwSitArtUdcDetInventarioDTO; import it.integry.ems.retail.wms.generic.dto.MvwSitArtUdcDetInventarioDTO;
import it.integry.ems.retail.wms.generic.dto.SpostaArtsTraULResponseDTO;
import it.integry.ems.retail.wms.generic.service.WMSGiacenzaULService; import it.integry.ems.retail.wms.generic.service.WMSGiacenzaULService;
import it.integry.ems.rules.businessLogic.LoadColliService; import it.integry.ems.rules.businessLogic.LoadColliService;
import it.integry.ems.rules.businessLogic.dto.LoadColliDTO; import it.integry.ems.rules.businessLogic.dto.LoadColliDTO;
import it.integry.ems.rules.completing.PackagesRules;
import it.integry.ems.service.AziendaService; import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor; import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.dto.production.OrdineLavorazioneDTO; import it.integry.ems.service.dto.production.OrdineLavorazioneDTO;
@@ -78,6 +78,17 @@ public class WMSLavorazioneService {
private AziendaService aziendaService; private AziendaService aziendaService;
public MtbColt createUDS(CreateUDSRequestDTO createUDSRequestDTO) throws Exception { public MtbColt createUDS(CreateUDSRequestDTO createUDSRequestDTO) throws Exception {
MtbColt generatedMtbColt = createUDSMovement(createUDSRequestDTO);
generatedMtbColt.setOperation(OperationType.INSERT);
entityProcessor.processEntity(generatedMtbColt, true, multiDBTransactionManager);
generatedMtbColt.setOnlyPkMaster(false);
return generatedMtbColt;
}
public MtbColt createUDSMovement(CreateUDSRequestDTO createUDSRequestDTO) throws Exception {
if (!userSession.isAttivo()) { if (!userSession.isAttivo()) {
throw new UsernameNotFoundException("Utente " + userSession.getUsername() + " non riconosciuto!"); throw new UsernameNotFoundException("Utente " + userSession.getUsername() + " non riconosciuto!");
@@ -95,9 +106,10 @@ public class WMSLavorazioneService {
} }
} }
MtbColt udsMtbColt = new MtbColt() MtbColt udsMtbColt = new MtbColt()
.setGestione(GestioneEnum.LAVORAZIONE.getText()) .setGestione(GestioneEnum.LAVORAZIONE.getText())
.setDataCollo(createUDSRequestDTO.getDataCollo()) .setDataCollo(createUDSRequestDTO.getDataCollo() != null ? createUDSRequestDTO.getDataCollo() : UtilityLocalDate.getNow())
.setNumCollo(createUDSRequestDTO.getNumCollo()) .setNumCollo(createUDSRequestDTO.getNumCollo())
.setSerCollo(createUDSRequestDTO.getSerCollo()) .setSerCollo(createUDSRequestDTO.getSerCollo())
.setCodMdep(createUDSRequestDTO.getCodMdep()) .setCodMdep(createUDSRequestDTO.getCodMdep())
@@ -130,6 +142,26 @@ public class WMSLavorazioneService {
break; break;
} }
if (UtilityString.isNullOrEmpty(udsMtbColt.getSerCollo())) {
udsMtbColt.setSerCollo(PackagesRules.getSerCollo(
multiDBTransactionManager.getPrimaryConnection(),
createUDSRequestDTO.getCodMdep()));
}
if (udsMtbColt.getNumCollo() == null) {
int numCollo = PackagesRules.completeNumCollo(multiDBTransactionManager.getPrimaryConnection(),
udsMtbColt.getSerCollo(),
udsMtbColt.getDataCollo(),
udsMtbColt.getGestione());
udsMtbColt.setNumCollo(numCollo);
}
String barcodeUl = PackagesRules.completeBarcodeUl(multiDBTransactionManager.getPrimaryConnection(),
udsMtbColt.getGestione(),
udsMtbColt.getDataCollo(),
udsMtbColt.getSerCollo(),
udsMtbColt.getNumCollo(), udsMtbColt.getCodJfas());
udsMtbColt.setBarcodeUl(barcodeUl);
if (foundDtbOrdts.size() == 1) { if (foundDtbOrdts.size() == 1) {
DtbOrdt foundDtbOrdt = foundDtbOrdts.get(0); DtbOrdt foundDtbOrdt = foundDtbOrdts.get(0);
@@ -186,11 +218,6 @@ public class WMSLavorazioneService {
} }
} }
udsMtbColt.setOperation(OperationType.INSERT);
entityProcessor.processEntity(udsMtbColt, true, multiDBTransactionManager);
udsMtbColt.setOnlyPkMaster(false);
return udsMtbColt; return udsMtbColt;
} }
@@ -816,17 +843,24 @@ public class WMSLavorazioneService {
} }
public void riproporzionaScarichiLavorazione(List<ArticoloProdottoDTO> articoliProdotti, List<MtbColt> scarichi) throws Exception { public void riproporzionaScarichiLavorazione(List<ArticoloProdottoDTO> articoliProdotti, List<MtbColt> udsMateriaPrima) throws Exception {
if (UtilityList.isNullOrEmpty(articoliProdotti) || UtilityList.isNullOrEmpty(scarichi)) { if (UtilityList.isNullOrEmpty(articoliProdotti) || UtilityList.isNullOrEmpty(udsMateriaPrima)) {
return;
}
if (articoliProdotti.size() == 1) {
articoliProdotti.get(0).setScarichiProduzione(scarichi);
return; return;
} }
String sqlSelectMtbColrRows = "SELECT * FROM " + MtbColr.ENTITY + " WHERE "; if (articoliProdotti.size() == 1) {
sqlSelectMtbColrRows += UtilityQuery.concatFieldListInWhereCond(scarichi.stream() articoliProdotti.get(0).setScarichiProduzione(udsMateriaPrima);
return;
}
udsMateriaPrima.forEach(x -> {
x.setCalcPeso(false);
x.setOperation(OperationType.UPDATE);
});
String sqlSelectMtbColrRows = "SELECT *\n" +
" FROM " + MtbColr.ENTITY + " WHERE ";
sqlSelectMtbColrRows += UtilityQuery.concatFieldListInWhereCond(udsMateriaPrima.stream()
.map(scarico -> new HashMap<String, Object>() {{ .map(scarico -> new HashMap<String, Object>() {{
put("gestione", scarico.getGestione()); put("gestione", scarico.getGestione());
put("data_collo", scarico.getDataCollo()); put("data_collo", scarico.getDataCollo());
@@ -835,119 +869,172 @@ public class WMSLavorazioneService {
}}) }})
.collect(Collectors.toList())); .collect(Collectors.toList()));
List<MtbColr> allScaricoRows = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlSelectMtbColrRows, MtbColr.class); List<MtbColr> udsMateriaPrimaRows = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlSelectMtbColrRows, MtbColr.class);
if (allScaricoRows == null || allScaricoRows.isEmpty()) { if (udsMateriaPrimaRows == null || udsMateriaPrimaRows.isEmpty()) {
return; return;
} }
HashMap<String, ScarichiMateriaPrimaDTO> scarichiMateriaPrima = new HashMap<>(); udsMateriaPrimaRows.forEach(x -> x.setOperation(OperationType.NO_OP));
for (MtbColt scarico : scarichi) {
allScaricoRows.stream()
.filter(x -> x.getGestione().equals(scarico.getGestione()) &&
x.getDataCollo().equals(scarico.getDataCollo()) &&
x.getSerCollo().equals(scarico.getSerCollo()) &&
x.getNumCollo().equals(scarico.getNumCollo()))
.forEach(row -> {
ScarichiMateriaPrimaDTO dtoScarico = scarichiMateriaPrima.get(row.getCodMart());
if (dtoScarico == null) {
dtoScarico = new ScarichiMateriaPrimaDTO();
dtoScarico.setCodMart(row.getCodMart())
.setQtaScaricata(BigDecimal.ZERO)
.setScarichi(new ArrayList<>());
}
dtoScarico.setQtaScaricata(dtoScarico.getQtaScaricata().add(row.getQtaCol())); // List<MtbColt> originalUdsMateriaPrima = UtilityList.clone(udsMateriaPrima);
dtoScarico.getScarichi().add(row); // originalUdsMateriaPrima
scarichiMateriaPrima.put(row.getCodMart(), dtoScarico); // .forEach(mtbColt -> mtbColt.setMtbColr(udsMateriaPrimaRows.stream()
}); // .filter(mtbColr -> mtbColt.getKey().equals(mtbColr.getKey()))
// .map(x -> (MtbColr) x.clone())
// .collect(Collectors.toList())));
}
Iterator<ArticoloProdottoDTO> iteratorProduzioni = articoliProdotti.iterator(); final List<MtbColt> newUdsToSave = new ArrayList<>();
final List<String> codMarts = new ArrayList<>(scarichiMateriaPrima.keySet()); final List<String> codMarts = udsMateriaPrimaRows.stream()
.map(MtbColr::getCodMart)
.distinct().collect(Collectors.toList());
final HashMap<String, MtbAart> mtbAarts = WMSUtility.getArticoliByCodMartsAsMap(codMarts, multiDBTransactionManager.getPrimaryConnection()); final HashMap<String, MtbAart> mtbAarts = WMSUtility.getArticoliByCodMartsAsMap(codMarts, multiDBTransactionManager.getPrimaryConnection());
while (iteratorProduzioni.hasNext()) { final Map<String, BigDecimal> totalQtaScaricataByCodMart = udsMateriaPrimaRows.stream()
ArticoloProdottoDTO produzione = iteratorProduzioni.next(); .collect(Collectors.groupingBy(MtbColr::getCodMart,
boolean isLastProduzione = !iteratorProduzioni.hasNext(); Collectors.reducing(BigDecimal.ZERO, MtbColr::getQtaCol, BigDecimal::add)));
if (UtilityBigDecimal.isNullOrZero(produzione.getPesoProduzione()))
continue;
DtbOrdt ordine = produzione.getOrdine();
//<editor-fold desc="Creazione UDS">
//Riproporzionamento degli scarichi
for (ArticoloProdottoDTO articoloProdotto : articoliProdotti) {
BigDecimal pesoProduzione = articoloProdotto.getPesoProduzione() != null ? articoloProdotto.getPesoProduzione() : BigDecimal.ZERO;
if (pesoProduzione.intValue() == 0)
continue;
//Per ogni lotto prodotto creo una UDS dedicata
CreateUDSRequestDTO createUdsRequestDTO = new CreateUDSRequestDTO() CreateUDSRequestDTO createUdsRequestDTO = new CreateUDSRequestDTO()
.setCodMdep(ordine.getCodMdep()) .setCodMdep(articoloProdotto.getOrdine().getCodMdep())
.setCausaleCollo(CreateUDSRequestDTO.Causale.SCARICO) .setCausaleCollo(CreateUDSRequestDTO.Causale.SCARICO)
.setDataCollo(articoloProdotto.getDataProd())
.setSegno(-1) .setSegno(-1)
.setOrders(Collections.singletonList(new CreateUDSRequestOrderDTO() .setOrders(Collections.singletonList(new CreateUDSRequestOrderDTO()
.setNumOrd(ordine.getNumOrd()) .setNumOrd(articoloProdotto.getOrdine().getNumOrd())
.setDataOrd(UtilityLocalDate.localDateFromDate(ordine.getDataOrd())) .setDataOrd(UtilityLocalDate.localDateFromDate(articoloProdotto.getOrdine().getDataOrd()))
.setGestione(ordine.getGestione()))); .setGestione(articoloProdotto.getOrdine().getGestione())));
if (produzione.getDataProd() != null) {
createUdsRequestDTO.setDataCollo(produzione.getDataProd());
}
MtbColt uds = createUDS(createUdsRequestDTO); MtbColt newUds = createUDSMovement(createUdsRequestDTO);
//</editor-fold> newUds.setOperation(OperationType.INSERT);
//<editor-fold desc="per ogni articolo ripartisco gli scarichi"> newUdsToSave.add(newUds);
for (ScarichiMateriaPrimaDTO scarichiMp : scarichiMateriaPrima.values()) { articoloProdotto.setScarichiProduzione(Collections.singletonList(newUds));
String codMart = scarichiMp.getCodMart();
MtbAart mtbAart = mtbAarts.getOrDefault(codMart, null);
if (mtbAart == null || UtilityList.isNullOrEmpty(mtbAart.getMtbUntMis())) {
throw new InvalidArticoloException(codMart);
}
for (MtbAart mtbAart : mtbAarts.values()) {
BigDecimal cifreDecPrimaUntMis = mtbAart.getMtbUntMis().get(0).getCifreDec(); BigDecimal cifreDecPrimaUntMis = mtbAart.getMtbUntMis().get(0).getCifreDec();
BigDecimal qtaDaScaricare = UtilityBigDecimal.calculatePercentage(scarichiMp.getQtaScaricata(), produzione.getPesoProduzione().doubleValue(), cifreDecPrimaUntMis.intValue()); List<MtbColr> allScarichiByCodMart = udsMateriaPrimaRows.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()) &&
UtilityBigDecimal.greaterThan(x.getQtaCol(), BigDecimal.ZERO))
.sorted(Comparator.comparing(MtbColr::getDatetimeRow))
.collect(Collectors.toList());
if (UtilityBigDecimal.equalsTo(qtaDaScaricare, BigDecimal.ZERO)) { BigDecimal totalQtaScaricata = totalQtaScaricataByCodMart.get(mtbAart.getCodMart());
BigDecimal totalQtaDaScaricare = UtilityBigDecimal.calculatePercentage(totalQtaScaricata,
articoloProdotto.getPesoProduzione().doubleValue(), cifreDecPrimaUntMis.intValue());
if (UtilityBigDecimal.equalsTo(totalQtaDaScaricare, BigDecimal.ZERO)) {
continue; continue;
} }
scarichiMp.getScarichi() BigDecimal totalQtaRiproporzionata = BigDecimal.ZERO;
.sort(Comparator.comparing(MtbColr::getDatetimeRow));
Iterator<MtbColr> rowsIterator = scarichiMp.getScarichi().iterator(); for (int i = 0; i < allScarichiByCodMart.size() && UtilityBigDecimal.lowerThan(totalQtaRiproporzionata, totalQtaDaScaricare); i++) {
do {
MtbColr nextScar = rowsIterator.next(); BigDecimal qtaDaRiproporzionare = totalQtaDaScaricare.subtract(totalQtaRiproporzionata);
MtbColr mtbColrToMove = (MtbColr) nextScar.clone();
if (UtilityBigDecimal.equalsTo(mtbColrToMove.getQtaCol(), BigDecimal.ZERO)) MtbColr oldScarico = allScarichiByCodMart.get(i);
BigDecimal qtaDaScaricare = UtilityBigDecimal.getLowerBetween(oldScarico.getQtaCol(), qtaDaRiproporzionare);
if (!UtilityBigDecimal.greaterThan(qtaDaScaricare, BigDecimal.ZERO))
continue; continue;
MtbColt mtbColtToMove = new MtbColt(mtbColrToMove.getKey()); MtbColr oldScaricoClone = (MtbColr) oldScarico.clone();
mtbColtToMove.setOperation(OperationType.SELECT_OBJECT); oldScaricoClone
entityProcessor.processEntity(mtbColtToMove, true, multiDBTransactionManager); .setQtaCol(qtaDaScaricare)
mtbColtToMove.getMtbColr().add(mtbColrToMove); .setNumCnf(UtilityBigDecimal.multiply(qtaDaScaricare, oldScaricoClone.getQtaCnf()));
//Movements here
MtbColt udsMtbColtClone = (MtbColt) udsMateriaPrima.stream()
.filter(x -> x.getKey().equals(oldScaricoClone.getKey()))
.findFirst()
.get()
.clone();
udsMtbColtClone.setMtbColr(Collections.singletonList(oldScaricoClone));
final Tuple2<ArrayList<MtbColr>, ArrayList<MtbColr>> generatedMovements = WMSUtility.generateSpostaArtsTraUlMovements(udsMtbColtClone, newUds, false, requestDataDTO);
//List<MtbColr> generatedMovementsInOriginalUds = generatedMovements.getFirst();
List<MtbColr> generatedMovementsInNewUds = generatedMovements.getSecond();
//generatedMovementsInOriginalUds.forEach(x -> x.setOperation(OperationType.INSERT));
generatedMovementsInNewUds.forEach(x -> x.setOperation(OperationType.INSERT));
oldScarico.setQtaCol(oldScarico.getQtaCol().subtract(qtaDaScaricare));
oldScarico.setNumCnf(UtilityBigDecimal.multiply(oldScarico.getQtaCol(), oldScarico.getQtaCnf()));
oldScarico.setOperation(OperationType.UPDATE);
udsMateriaPrima.stream()
.filter(x -> x.getKey().equals(oldScarico.getKey()))
.findFirst()
.ifPresent(x -> {
if (x.getMtbColr().stream().noneMatch(y -> y.getKey().equals(x.getKey()))) {
x.getMtbColr().add(oldScarico);
}
});
newUds.getMtbColr().addAll(generatedMovementsInNewUds);
BigDecimal qtaPrelevata = isLastProduzione ? mtbColrToMove.getQtaCol() : UtilityBigDecimal.getLowerBetween(mtbColrToMove.getQtaCol(), qtaDaScaricare); totalQtaRiproporzionata = totalQtaRiproporzionata.add(qtaDaScaricare);
mtbColrToMove.setQtaCol(qtaPrelevata);
final SpostaArtsTraULResponseDTO spostaArtsTraULResponseDTO = WMSUtility.spostaArtsTraUL(multiDBTransactionManager.getPrimaryConnection(),
mtbColtToMove, uds.getBarcodeUl(), false, entityProcessor, requestDataDTO);
qtaDaScaricare = qtaDaScaricare.subtract(qtaPrelevata);
nextScar.setQtaCol(mtbColrToMove.getQtaCol().subtract(qtaPrelevata));
uds.getMtbColr()
.addAll(spostaArtsTraULResponseDTO.getGeneratedMtbColr());
} }
while ((UtilityBigDecimal.greaterThan(qtaDaScaricare, BigDecimal.ZERO) || isLastProduzione) && rowsIterator.hasNext());
} }
produzione.getScarichiProduzione().add(uds);
//</editor-fold>
} }
for (MtbColt originalScarico : scarichi) {
//Elaboro anche eventuali residui (frutto di calcoli con i decimali)
final List<MtbColr> notProcessedRows = udsMateriaPrimaRows.stream()
.filter(x -> UtilityBigDecimal.greaterThan(x.getQtaCol(), BigDecimal.ZERO))
.collect(Collectors.toList());
if (!notProcessedRows.isEmpty()) {
for (MtbColr notProcessedRow : notProcessedRows) {
MtbColt udsMtbColtClone = (MtbColt) udsMateriaPrima.stream()
.filter(x -> x.getKey().equals(notProcessedRow.getKey()))
.findFirst()
.get()
.clone();
udsMtbColtClone.setMtbColr(Collections.singletonList(notProcessedRow));
MtbColt latestUdsGenerated = newUdsToSave.get(newUdsToSave.size() - 1);
final Tuple2<ArrayList<MtbColr>, ArrayList<MtbColr>> generatedMovements =
WMSUtility.generateSpostaArtsTraUlMovements(udsMtbColtClone, latestUdsGenerated, false, requestDataDTO);
notProcessedRow.setQtaCol(notProcessedRow.getQtaCol().subtract(notProcessedRow.getQtaCol()));
notProcessedRow.setNumCnf(UtilityBigDecimal.multiply(notProcessedRow.getQtaCol(), notProcessedRow.getQtaCnf()));
notProcessedRow.setOperation(OperationType.UPDATE);
latestUdsGenerated.getMtbColr().addAll(generatedMovements.getSecond());
}
}
entityProcessor.processEntityList(udsMateriaPrima, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(udsMateriaPrima);
entityProcessor.processEntityList(newUdsToSave, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(newUdsToSave);
for (MtbColt originalScarico : udsMateriaPrima) {
if (!WMSUtility.canULBeDeleted(originalScarico, multiDBTransactionManager)) if (!WMSUtility.canULBeDeleted(originalScarico, multiDBTransactionManager))
throw new Exception("Impossibile eliminare lo scarico " + originalScarico.getSerCollo() + " " + originalScarico.getNumCollo() + " " + originalScarico.getDataCollo() + " in quanto è stato utilizzato per la ripartizione della produzione!"); throw new Exception("Impossibile eliminare lo scarico " + originalScarico.getSerCollo() + " " + originalScarico.getNumCollo() + " " + originalScarico.getDataCollo() + " in quanto ci sono ancora residui da ripartizionare!");
WMSUtility.deleteUL(originalScarico, entityProcessor, multiDBTransactionManager); WMSUtility.deleteUL(originalScarico, entityProcessor, multiDBTransactionManager);
} }
} }