Merge remote-tracking branch 'origin/feature/RefactoringGestioneColli' into feature/RefactoringGestioneColli
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
2025-07-11 10:02:09 +02:00
10 changed files with 355 additions and 178 deletions

View File

@@ -207,7 +207,7 @@ public class MtbColr extends EntityBase implements EquatableEntityInterface<MtbC
public MtbColrKey getKey() {
return new MtbColrKey(gestione, serCollo, getDataCollo(), numCollo, riga);
return new MtbColrKey(gestione, serCollo, dataCollo, numCollo, riga);
}

View File

@@ -4,6 +4,7 @@ import it.integry.common.var.CommonConstants;
import it.integry.ems.document.dto.CreateULFromDocumentsDTO;
import it.integry.ems.document.service.DocumentiDirettiService;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.DtbDoct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -15,16 +16,25 @@ import javax.servlet.http.HttpServletRequest;
@Scope("request")
@RequestMapping("documenti-diretti")
public class DocumentiDirettiController {
@Autowired
private DocumentiDirettiService documentiDirettiService;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@RequestMapping(value = "insert", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse insert(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestBody DtbDoct dtbDoct) throws Exception {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.save(dtbDoct, true));
try {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.save(dtbDoct, true));
} catch (Exception e) {
multiDBTransactionManager.rollbackAll();
throw e;
}
}
@RequestMapping(value = "update", method = RequestMethod.POST)
@@ -33,7 +43,12 @@ public class DocumentiDirettiController {
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestBody DtbDoct dtbDoct) throws Exception {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.save(dtbDoct, false));
try {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.save(dtbDoct, false));
} catch (Exception e) {
multiDBTransactionManager.rollbackAll();
throw e;
}
}
@RequestMapping(value = "delete", method = RequestMethod.POST)
@@ -42,7 +57,12 @@ public class DocumentiDirettiController {
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestBody DtbDoct dtbDoct) throws Exception {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.delete(dtbDoct));
try {
return ServiceRestResponse.createPositiveResponse(documentiDirettiService.delete(dtbDoct));
} catch (Exception e) {
multiDBTransactionManager.rollbackAll();
throw e;
}
}
@RequestMapping(value = "createULFromDocument", method = RequestMethod.POST)

View File

@@ -20,6 +20,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.config.EmsRestConstants;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
@@ -85,14 +86,17 @@ public class DocumentiDirettiService {
if (gestione.equalsIgnoreCase("V") &&
TipoEmissione.valueOf(UtilityHashMap.getValueIfExists(datiTipoDoc, "tipo_emissione")) == TipoEmissione.DIRETTA &&
!dtbDoct.getDtbDocImb().isEmpty() && salvaImballiAttiva) {
saveDocImballi(dtbDoct, entityList, isInsert);
saveDocImballi(dtbDoct, entityList, isInsert);
}
//controllo packingList documento per eventuali trasferimenti
if (gestione.equalsIgnoreCase("V")) {
checkUDSForTransfer(dtbDoct, entityList, isInsert);
}
//TODO: Aggiungere versamento in nuova UDC per pedane mezze
if (UtilityString.equalsIgnoreCase((String) datiTipoDoc.get("gestione"), "A")) {
if (!isInsert && dtbDoct.getOldPk() != null) {
HashMap<String, Object> oldPkDoc = getOldPkDoc(dtbDoct);
@@ -134,10 +138,8 @@ public class DocumentiDirettiService {
}
}
}
multiDBTransactionManager.commitAll();
UtilityEntity.throwEntitiesException(entityRet);
return entityRet;
}
@@ -145,42 +147,106 @@ public class DocumentiDirettiService {
private List<MtbColt> checkUDSForTransfer(DtbDoct dtbDoct, List<EntityBase> entityList, boolean isNewDoc) throws Exception {
if (dtbDoct.getMtbColt().isEmpty() && isNewDoc)
return null;
//<editor-fold desc="Prendo tutti i colli, con le quantità associate che devono essere trasferite">
String whereCondColli = StringUtils.join(dtbDoct.getMtbColt().stream().filter(x -> x.getOperation() == null || !x.getOperation().equals(OperationType.DELETE)).map(ul -> {
try {
return String.format("(%s)", ul.getPkWhereCond());
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList()), " OR ");
List<MtbColt> ulsToTransfer;
if (UtilityString.isNullOrEmpty(whereCondColli)) {
return null;
}
ulsToTransfer = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), Query.format(
"SELECT gestione,data_collo,ser_collo,num_collo,barcode_ul,cod_mdep from mvw_sitart_udc_det_inventario where cod_mdep <> {} and (" + whereCondColli + ")", dtbDoct.getCodMdep()
), MtbColt.class);
if (UtilityList.isNullOrEmpty(dtbDoct.getMtbColt())) return null;
//<editor-fold desc="Prendo tutti i colli, con le quantità associate che devono essere trasferite">
List<MtbColt> ulsToTransfer = dtbDoct.getMtbColt().stream()
.filter(x -> x.getOperation() == null || !x.getOperation().equals(OperationType.DELETE))
.map(x -> (MtbColt) x.clone())
.peek(x -> x.setOperation(OperationType.SELECT_OBJECT))
.collect(Collectors.toList());
if (UtilityList.isNullOrEmpty(ulsToTransfer)) return null;
entityProcessor.processEntityList(ulsToTransfer, multiDBTransactionManager, true);
String selectMtbColrs = "SELECT * FROM " + MtbColr.ENTITY + " " +
"WHERE " + UtilityQuery.concatFieldListInWhereCond(ulsToTransfer.stream()
.map(x -> new HashMap<String, Object>() {{
put("gestione", x.getGestione());
put("ser_collo", x.getSerCollo());
put("data_collo", x.getDataCollo());
put("num_collo", x.getNumCollo());
}})
.collect(Collectors.toList()));
final List<MtbColr> mtbColrsToTransfer = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), selectMtbColrs, MtbColr.class);
ulsToTransfer.forEach(mtbColt -> {
mtbColt.setMtbColr(mtbColrsToTransfer.stream()
.filter(mtbColr -> mtbColt.getKey().equals(mtbColr.getKey()))
.map(x -> (MtbColr) x.clone())
.collect(Collectors.toList()));
});
//</editor-fold>
List<String> depositiPartenza = ulsToTransfer.stream().map(MtbColt::getCodMdep).distinct().collect(Collectors.toList());
List<String> depositiPartenza = ulsToTransfer.stream()
.map(MtbColt::getCodMdep)
.distinct()
.collect(Collectors.toList());
for (String codMdep : depositiPartenza) {
SpostaUlRequestDTO transferRequest = new SpostaUlRequestDTO();
transferRequest
.setCodMdep(dtbDoct.getCodMdep())
.setCreateDocAutomatically(true)
.setAnnotazioni(String.format("Trasferimento per ordine di vendita n.%d del %s", dtbDoct.getNumOrd(), UtilityDate.formatDate(dtbDoct.getDataOrd(), CommonConstants.DATE_FORMAT_DMY)))
.setBarcodeUlList(ulsToTransfer.stream()
.filter(u -> u.getCodMdep().equals(codMdep))
.map(MtbColt::getBarcodeUl)
.collect(Collectors.toList()));
wmsGenericService.spostaUL(transferRequest);
List<MtbColr> mtbColrsGroupedByDepoToTransfer = mtbColrsToTransfer.stream()
.filter(x -> x.getCodMdepOut().equals(codMdep))
.peek(x -> x.setNumCollo(null)
.setDataCollo(null)
.setSerCollo(null)
.setGestione(null)
.setRiga(null)
.setBarcodeUlIn(x.getBarcodeUlOut())
.setPosizioneIn(null)
.setCodMdepIn(dtbDoct.getCodMdep())
.setGestioneRif(null)
.setDataColloRif(null)
.setNumColloRif(null)
.setSerColloRif(null)
.setOperation(OperationType.INSERT))
.collect(Collectors.toList());
MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), dtbDoct.getCodMdep(), requestDataDTO.getUsername());
internalMovement.setBarcodeUl(EmsRestConstants.NULL);
internalMovement.setMtbColr(mtbColrsGroupedByDepoToTransfer);
entityProcessor.processEntity(internalMovement, multiDBTransactionManager);
DtbDoct transferDocument =
WMSUtility.createTransferDocumentAndAttachToMovement(multiDBTransactionManager, setupGest,
internalMovement, null, codMdep, dtbDoct.getCodMdep(), null,
requestDataDTO.getUsername(), false, SpostaUlRequestDTO.TransferGroupPolicy.NONE);
entityProcessor.processEntity(transferDocument, multiDBTransactionManager);
List<MtbColt> udsGroupedByDepo = ulsToTransfer.stream()
.filter(x -> x.getCodMdep().equals(codMdep))
.peek(x -> {
x.setCodMdep(dtbDoct.getCodMdep());
x.setOperation(OperationType.INSERT_OR_UPDATE);
x.getMtbColr().forEach(mtbColr -> {
mtbColr.setOperation(OperationType.UPDATE);
mtbColr
.setCodMdepIn(EmsRestConstants.NULL)
.setCodMdepOut(dtbDoct.getCodMdep())
.setPosizioneOut(EmsRestConstants.NULL)
.setGestioneRif(null)
.setDataColloRif(null)
.setNumColloRif(null)
.setSerColloRif(null);
});
})
.collect(Collectors.toList());
entityProcessor.processEntityList(udsGroupedByDepo, multiDBTransactionManager, true);
UtilityEntity.throwEntitiesException(udsGroupedByDepo);
}
return dtbDoct.getMtbColt();
}

View File

@@ -6,14 +6,17 @@ import groovy.lang.Tuple2;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.exception.MissingDataException;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.retail.wms.dto.CreateUDCWithRowsRequestDTO;
import it.integry.ems.retail.wms.dto.CreateUDCRequestDTO;
import it.integry.ems.retail.wms.dto.CreateUDCWithRowsRequestDTO;
import it.integry.ems.retail.wms.dto.InsertUDCRowRequestDTO;
import it.integry.ems.retail.wms.dto.InsertUDCRowResponseDTO;
import it.integry.ems.retail.wms.exceptions.InvalidArticoloException;
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.dto.SpostaUlRequestDTO;
import it.integry.ems.retail.wms.generic.service.WMSGiacenzaULService;
import it.integry.ems.rules.businessLogic.LoadColliService;
import it.integry.ems.rules.businessLogic.dto.LoadColliDTO;
import it.integry.ems.rules.businessLogic.enums.FlagSezione;
import it.integry.ems.rules.completing.PackagesRules;
import it.integry.ems.service.EntityProcessor;
@@ -21,13 +24,18 @@ import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.entity.*;
import it.integry.ems_model.exception.ConverterNotConfiguredException;
import it.integry.ems_model.exception.RulesNotCompiledException;
import it.integry.ems_model.rulescompleting.DroolsDataCompleting;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.BarcodeEan128.Ean128Model;
import it.integry.ems_model.utility.BarcodeEan128.UtilityBarcodeEan128;
import it.integry.ems_model.utility.*;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.time.LocalDate;
@@ -39,15 +47,14 @@ import java.util.stream.Collectors;
public class WMSUtility {
public static boolean isGestisciColli(MtbDepo mtbDepo,
EntityProcessor entityProcessor,
MultiDBTransactionManager multiDBTransactionManager) throws Exception {
public static boolean isGestisciColli(String codMdep,
Connection connection) throws Exception {
MtbDepoTipi mtbDepoTipi = new MtbDepoTipi();
mtbDepoTipi.setCodTipoDepo(mtbDepo.getFlagTipoNegozio())
.setOperation(OperationType.SELECT_OBJECT);
String selectSql = Query.format("SELECT " + MtbDepoTipi.ENTITY + ".* FROM mtb_depo " +
" INNER JOIN " + MtbDepoTipi.ENTITY + " ON mtb_depo.flag_tipo_negozio = mtb_depo_tipi.cod_tipo_depo " +
"WHERE cod_mdep = {}", codMdep);
entityProcessor.processEntity(mtbDepoTipi, true, multiDBTransactionManager);
final MtbDepoTipi mtbDepoTipi = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, selectSql, MtbDepoTipi.class);
return mtbDepoTipi.getGestisciColli() == null || mtbDepoTipi.getGestisciColli();
}
@@ -98,13 +105,13 @@ public class WMSUtility {
dtbDoct.getDtbDocr().add(docr);
}
docr.setQtaDoc(docr.getQtaDoc().add(UtilityBigDecimal.isNull(imballaggio.getNumPezzi(),BigDecimal.ONE)));
docr.setQtaDoc(docr.getQtaDoc().add(UtilityBigDecimal.isNull(imballaggio.getNumPezzi(), BigDecimal.ONE)));
}
//</editor-fold>
}
public static HashMap<String, MtbTcol> getListaTipiColloByBarcodeUls(List<String> barcodeUls, MultiDBTransactionManager multiDBTransactionManager) throws Exception {
@NotNull List<HashMap<String, Object>> barcodesWithCodTcol = UtilityDB.executeSimpleQuery(multiDBTransactionManager.getPrimaryConnection(),
public static HashMap<String, MtbTcol> getListaTipiColloByBarcodeUls(List<String> barcodeUls, Connection connection) throws Exception {
@NotNull List<HashMap<String, Object>> barcodesWithCodTcol = UtilityDB.executeSimpleQuery(connection,
"SELECT DISTINCT barcode_ul, cod_tcol FROM mtb_colt WHERE barcode_ul IN (" + UtilityQuery.concatStringFieldsWithSeparator(barcodeUls, ",") + ")");
if (UtilityList.isNullOrEmpty(barcodesWithCodTcol)) return new HashMap<>();
@@ -116,7 +123,7 @@ public class WMSUtility {
if (codTcolList.isEmpty()) return new HashMap<>();
final List<MtbTcol> mtbTcolList = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), String.format(
final List<MtbTcol> mtbTcolList = UtilityDB.executeSimpleQueryDTO(connection, String.format(
"SELECT cod_tcol, " +
"cod_mart " +
"FROM mtb_tcol " +
@@ -124,7 +131,7 @@ public class WMSUtility {
UtilityQuery.concatStringFieldsWithSeparator(codTcolList, ",")
), MtbTcol.class);
if (UtilityList.isNullOrEmpty(mtbTcolList)) return new HashMap<>();
if (UtilityList.isNullOrEmpty(mtbTcolList)) return new HashMap<>();
HashMap<String, MtbTcol> mtbColtMap = new HashMap<>();
@@ -451,7 +458,7 @@ public class WMSUtility {
.setNote(insertUDCRowRequestDTO.getDescrizione());
}
if(insertUDCRowRequestDTO.getDocumentReso() != null) {
if (insertUDCRowRequestDTO.getDocumentReso() != null) {
targetMtbColr.setCodAnagDoc(insertUDCRowRequestDTO.getDocumentReso().getCodAnag())
.setCodDtipDoc(insertUDCRowRequestDTO.getDocumentReso().getCodDtip())
.setSerDoc(insertUDCRowRequestDTO.getDocumentReso().getSerDoc())
@@ -575,11 +582,129 @@ public class WMSUtility {
return barCodeList != null ? barCodeList : new ArrayList<>();
}
public static MtbColt createInternalMovement(String codMdep) {
return createInternalMovement(codMdep, null);
public static DtbDoct createTransferDocumentAndAttachToMovement(MultiDBTransactionManager multiDBTransactionManager, SetupGest setupGest, MtbColt movementToAttach,
LocalDate dataTrasf, String codMdepPartenza, String codMdepArrivo,
String annotazioni, String username,
boolean groupDailyTransfer, SpostaUlRequestDTO.TransferGroupPolicy groupingPolicy) throws Exception {
Connection connection = multiDBTransactionManager.getPrimaryConnection();
String codDtipToUse = setupGest.getSetupDepo(connection, "PICKING", "LOGISTICA", "COD_DTIP_DOC_TRASF_INTERNI", codMdepArrivo);
if (UtilityString.isNullOrEmpty(codDtipToUse))
throw new Exception("La configurazione della setup gest non è completa per gestire gli spostamenti tra depositi");
String sql = Query.format(
"SELECT segno_qta_car - segno_qta_scar FROM dtb_tipi WHERE cod_dtip = %s",
codDtipToUse
);
short segno = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(connection, sql);
String codMdepDoc;
String codAnag;
String codVdes;
if (segno > 0) {
codMdepDoc = codMdepArrivo;
MtbDepo mtbDepoPartenza = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection,
Query.format("SELECT * FROM mtb_depo WHERE cod_mdep = {}", codMdepPartenza), MtbDepo.class);
codAnag = mtbDepoPartenza.getCodAnag();
codVdes = mtbDepoPartenza.getCodVdes();
} else {
codMdepDoc = codMdepPartenza;
MtbDepo mtbDepoArrivo = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection,
Query.format("SELECT * FROM mtb_depo WHERE cod_mdep = {}", codMdepArrivo), MtbDepo.class);
codAnag = mtbDepoArrivo.getCodAnag();
codVdes = mtbDepoArrivo.getCodVdes();
}
LocalDate dataDoc = UtilityLocalDate.isNull(dataTrasf, UtilityLocalDate.getNow());
LoadColliDTO docTrasfRequest = new LoadColliDTO();
docTrasfRequest
.setDataDoc(UtilityLocalDate.localDateToDate(dataDoc))
.setCodDtip(codDtipToUse)
.setCodMdep(codMdepDoc)
.setCodAnag(codAnag)
.setCodVdes(codVdes)
.setNote(annotazioni);
if (groupDailyTransfer) {
String queryDoc = Query.format("select cod_dtip, cod_anag, data_doc, ser_doc, num_doc\n" +
"from dtb_doct\n" +
"where cod_dtip = {}\n" +
" and data_doc = {}\n" +
" and cod_mdep = {}\n" +
" and cod_anag = {}\n" +
" and cod_vdes = {}", codDtipToUse, dataDoc, codMdepDoc, codAnag, codVdes);
switch (groupingPolicy) {
case BY_USER:
queryDoc = UtilityDB.addwhereCond(queryDoc, Query.format("user_name = {}", username), true);
break;
case NONE:
default:
break;
}
DtbDoct existingDoc = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, queryDoc, DtbDoct.class);
if (existingDoc != null) {
docTrasfRequest
.setDataDoc(existingDoc.getDataDoc())
.setSerDoc(existingDoc.getSerDoc())
.setNumDoc(existingDoc.getNumDoc())
.setCodDtip(existingDoc.getCodDtip())
.setCodAnag(existingDoc.getCodAnag());
}
}
docTrasfRequest.setColli(Collections.singletonList(movementToAttach));
LoadColliService loadColliService = ApplicationContextProvider.getApplicationContext().getBean(LoadColliService.class);
DtbDoct docTrasf = loadColliService.createDocFromColli(multiDBTransactionManager, docTrasfRequest, false);
docTrasf.getDtbDocr().forEach(docr -> docr.setOperation(OperationType.INSERT_OR_UPDATE));
HashMap<String, MtbTcol> listaPedane = WMSUtility.getListaTipiColloByBarcodeUls(Collections.singletonList(movementToAttach.getBarcodeUl()), connection);
HashMap<String, MtbTcol> listaImballi = WMSUtility.getListaTipiImballoByBarcodeUls(Collections.singletonList(movementToAttach.getBarcodeUl()), connection);
//<editor-fold desc="Trasferimento pallet">
for (MtbColr rowMovimento : movementToAttach.getMtbColr()) {
if (listaPedane.getOrDefault(rowMovimento.getBarcodeUlOut(), null) != null) {
WMSUtility.trasferisciImballi(listaPedane.get(rowMovimento.getBarcodeUlOut()), docTrasf);
//rimuovo il barcode dalla lista di pallet da spostare per evitare che righe di moviemento create in più mtbColr moltiplichino il numero di pallet spostati
listaPedane.remove(rowMovimento.getBarcodeUlOut());
}
if (listaImballi.getOrDefault(rowMovimento.getBarcodeUlOut(), null) != null) {
WMSUtility.trasferisciImballi(listaImballi.get(rowMovimento.getBarcodeUlOut()), docTrasf);
//rimuovo il barcode dalla lista di pallet da spostare per evitare che righe di moviemento create in più mtbColr moltiplichino il numero di pallet spostati
listaImballi.remove(rowMovimento.getBarcodeUlOut());
}
}
//</editor-fold>
if (!UtilityString.isNullOrEmpty(annotazioni)) {
DtbDocr dtbDocr = new DtbDocr()
.setDescrizione(UtilityString.substring(annotazioni, 0, 40))
.setDescrizioneEstesa(annotazioni);
dtbDocr.setOperation(OperationType.INSERT);
docTrasf.getDtbDocr().add(dtbDocr);
}
return docTrasf;
}
public static MtbColt createInternalMovement(String codMdep, LocalDate dataCollo) {
public static MtbColt createInternalMovement(Connection connection, String codMdep, String username) throws RulesNotCompiledException, SQLException, IOException, IllegalAccessException, ConverterNotConfiguredException {
return createInternalMovement(connection, codMdep, null, username);
}
public static MtbColt createInternalMovement(Connection connection, String codMdep, LocalDate dataCollo, String username) throws RulesNotCompiledException, SQLException, IOException, IllegalAccessException, ConverterNotConfiguredException {
MtbColt mtbColt = new MtbColt()
.setGestione("L")
.setSegno(1)
@@ -588,6 +713,9 @@ public class WMSUtility {
mtbColt.setOperation(OperationType.INSERT);
final DroolsDataCompleting dataCompleting = ApplicationContextProvider.getApplicationContext().getBean(DroolsDataCompleting.class);
dataCompleting.complete(mtbColt, connection, username);
return mtbColt;
}
@@ -659,8 +787,8 @@ public class WMSUtility {
}
public static HashMap<String, MtbTcol> getListaTipiImballoByBarcodeUls(List<String> barcodeUls, MultiDBTransactionManager multiDBTransactionManager) throws Exception {
@NotNull List<HashMap<String, Object>> barcodesWithCodTcol = UtilityDB.executeSimpleQuery(multiDBTransactionManager.getPrimaryConnection(),
public static HashMap<String, MtbTcol> getListaTipiImballoByBarcodeUls(List<String> barcodeUls, Connection connection) throws Exception {
@NotNull List<HashMap<String, Object>> barcodesWithCodTcol = UtilityDB.executeSimpleQuery(connection,
"select barcode_ul, mtb_aart.cod_tcol_UI as cod_tcol\n" +
"from mtb_colt\n" +
" inner join mtb_colr on mtb_colt.gestione = mtb_colr.gestione and mtb_colt.data_collo = mtb_colr.data_collo and\n" +
@@ -678,7 +806,7 @@ public class WMSUtility {
if (codTcolList.isEmpty()) return new HashMap<>();
final List<MtbTcol> mtbTcolList = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), String.format(
final List<MtbTcol> mtbTcolList = UtilityDB.executeSimpleQueryDTO(connection, String.format(
"SELECT cod_tcol, " +
"cod_mart " +
"FROM mtb_tcol " +

View File

@@ -5,6 +5,8 @@ import it.integry.ems.retail.wms.generic.dto.SaveTrasferimentoRequestDTO;
import it.integry.ems.retail.wms.generic.service.WMSTrasferimentoService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.MtbColt;
import it.integry.ems_model.entity.key.DtbDoctKey;
import it.integry.ems_model.types.OperationType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
@Scope("request")
@RequestMapping("wms/trasferimento")
public class WMSTrasferimentoController {
private final Logger logger = LogManager.getLogger();
@Autowired
@@ -24,14 +27,23 @@ public class WMSTrasferimentoController {
private MultiDBTransactionManager multiDBTransactionManager;
@PostMapping(value = "save")
public @ResponseBody
ServiceRestResponse save(@RequestBody SaveTrasferimentoRequestDTO requestData) throws Exception {
MtbColt generatedMovement = wmsTrasferimentoService.saveTrasferimento(multiDBTransactionManager.getPrimaryConnection(), requestData.getCodMdepDest(), requestData.getBarcodeUlList());
generatedMovement.setOperation(OperationType.SELECT_OBJECT);
return ServiceRestResponse.createPositiveResponse(generatedMovement);
}
@PostMapping(value = "print-document")
public @ResponseBody
ServiceRestResponse save(@RequestParam String printerName,
@RequestBody DtbDoctKey documentToPrint) throws Exception {
wmsTrasferimentoService.printDocument(multiDBTransactionManager.getPrimaryConnection(), documentToPrint, printerName);
return ServiceRestResponse.createPositiveResponse();
}
}

View File

@@ -30,7 +30,6 @@ import it.integry.ems.retail.wms.generic.dto.picking_list.SitArtOrdAccettazioneD
import it.integry.ems.retail.wms.generic.dto.picking_list.SitArtOrdDTO;
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.PackagesRules;
import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor;
@@ -2075,13 +2074,7 @@ public class WMSGenericService {
throw new Exception("Le UL selezionate provengono da depositi differenti");
}
MtbDepo mtbDepoArrivo = new MtbDepo();
mtbDepoArrivo.setCodMdep(requestDTO.getCodMdep())
.setOperation(OperationType.SELECT_OBJECT);
entityProcessor.processEntity(mtbDepoArrivo, true, multiDBTransactionManager);
boolean gestisciColli = WMSUtility.isGestisciColli(mtbDepoArrivo, entityProcessor, multiDBTransactionManager);
boolean gestisciColli = WMSUtility.isGestisciColli(requestDTO.getCodMdep(), multiDBTransactionManager.getPrimaryConnection());
if (!UtilityString.isNullOrEmpty(requestDTO.getPosizione())) {
MtbDepoPosizioni mtbDepoPosizioni = new MtbDepoPosizioni()
@@ -2096,93 +2089,15 @@ public class WMSGenericService {
}
}
String codMdepPartenza = codMdeps.get(0);
String codMdepDoc = codMdepPartenza;
LoadColliDTO docTrasfRequest = null;
//</editor-fold>
//<editor-fold desc="inizializzazione eventuale documento di trasferimento">
if (requestDTO.isCreateDocAutomatically() && !UtilityString.equalsIgnoreCase(codMdepPartenza, requestDTO.getCodMdep())) {
String codDtipToUse = setupGest.getSetupDepo(multiDBTransactionManager.getPrimaryConnection(), "PICKING", "LOGISTICA", "COD_DTIP_DOC_TRASF_INTERNI", requestDTO.getCodMdep());
if (UtilityString.isNullOrEmpty(codDtipToUse))
throw new Exception("La configurazione della setup gest non è completa per gestire gli spostamenti tra depositi");
String codAnag = mtbDepoArrivo.getCodAnag();
String codVdes = mtbDepoArrivo.getCodVdes();
String sql = Query.format(
"SELECT segno_qta_car - segno_qta_scar FROM dtb_tipi WHERE cod_dtip = %s",
codDtipToUse
);
short segno = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
if (segno > 0) {
codMdepDoc = mtbDepoArrivo.getCodMdep();
MtbDepo mtbDepoPartenza = new MtbDepo();
mtbDepoPartenza.setCodMdep(codMdepPartenza)
.setOperation(OperationType.SELECT_OBJECT);
entityProcessor.processEntity(mtbDepoPartenza, true, multiDBTransactionManager);
codAnag = mtbDepoPartenza.getCodAnag();
codVdes = mtbDepoPartenza.getCodVdes();
}
LocalDate dataDoc = UtilityLocalDate.isNull(requestDTO.getDataTrasf(), UtilityLocalDate.getNowTime()).toLocalDate();
docTrasfRequest = new LoadColliDTO();
docTrasfRequest
.setDataDoc(UtilityLocalDate.localDateToDate(dataDoc))
.setCodDtip(codDtipToUse)
.setCodMdep(codMdepDoc)
.setCodAnag(codAnag)
.setCodVdes(codVdes)
.setNote(requestDTO.getAnnotazioni());
if (requestDTO.isGroupDailyTransfers()) {
String queryDoc = Query.format("select cod_dtip, cod_anag, data_doc, ser_doc, num_doc\n" +
"from dtb_doct\n" +
"where cod_dtip = {}\n" +
" and data_doc = {}\n" +
" and cod_mdep = {}\n" +
" and cod_anag = {}\n" +
" and cod_vdes = {}", codDtipToUse, dataDoc, codMdepDoc, codAnag, codVdes);
switch (requestDTO.getGroupingPolicy()) {
case BY_USER:
queryDoc = UtilityDB.addwhereCond(queryDoc, Query.format("user_name = {}", requestDataDTO.getUsername()), true);
break;
case NONE:
default:
break;
}
DtbDoct existingDoc = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), queryDoc, DtbDoct.class);
if (existingDoc != null) {
docTrasfRequest
.setDataDoc(existingDoc.getDataDoc())
.setSerDoc(existingDoc.getSerDoc())
.setNumDoc(existingDoc.getNumDoc())
.setCodDtip(existingDoc.getCodDtip())
.setCodAnag(existingDoc.getCodAnag());
}
}
}
String codMdepArrivo = requestDTO.getCodMdep();
//</editor-fold>
//<editor-fold desc="Trasferimento UL">
MtbColt movimento;
HashMap<String, MtbTcol> listaPedane = WMSUtility.getListaTipiColloByBarcodeUls(ulToMove, multiDBTransactionManager);
HashMap<String, MtbTcol> listaImballi = WMSUtility.getListaTipiImballoByBarcodeUls(ulToMove, multiDBTransactionManager);
//<editor-fold desc="Creazione movimento di magazzino">
if (gestisciColli) {
movimento = WMSUtility.createInternalMovement(codMdepDoc, requestDTO.getDataTrasf() != null ? requestDTO.getDataTrasf().toLocalDate() : null);
movimento = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), codMdepPartenza, requestDTO.getDataTrasf() != null ? requestDTO.getDataTrasf().toLocalDate() : null, requestDataDTO.getUsername());
final List<MtbColr> cambiaPosizioneUlMovements =
WMSUtility.createCambiaPosizioneUlMovements(multiDBTransactionManager.getPrimaryConnection(),
@@ -2196,7 +2111,7 @@ public class WMSGenericService {
.getMtbColr().addAll(cambiaPosizioneUlMovements);
} else { //se non gestisco i colli sul deposito creo il movimento di solo scarico
CreateUDSRequestDTO createUDSRequest = new CreateUDSRequestDTO();
createUDSRequest.setCodMdep(codMdepDoc)
createUDSRequest.setCodMdep(codMdepPartenza)
.setCausaleCollo(CreateUDSRequestDTO.Causale.SCARICO);
if (requestDTO.getDataTrasf() != null) {
@@ -2225,40 +2140,19 @@ public class WMSGenericService {
}
entityProcessor.processEntity(movimento, true, multiDBTransactionManager);
//</editor-fold>
//<editor-fold desc="Creazione documento di trasferimento se necessario">
if (docTrasfRequest != null) {
docTrasfRequest.setColli(Collections.singletonList(movimento));
DtbDoct docTrasf = loadColliService.createDocFromColli(multiDBTransactionManager, docTrasfRequest, false);
docTrasf.getDtbDocr().forEach(docr -> docr.setOperation(OperationType.INSERT_OR_UPDATE));
if (requestDTO.isCreateDocAutomatically() && !UtilityString.equalsIgnoreCase(codMdepPartenza, codMdepArrivo)) {
DtbDoct transferDocument =
WMSUtility.createTransferDocumentAndAttachToMovement(multiDBTransactionManager, setupGest, movimento, requestDTO.getDataTrasf() != null ? requestDTO.getDataTrasf().toLocalDate() : null,
codMdepPartenza, codMdepArrivo, requestDTO.getAnnotazioni(), requestDataDTO.getUsername(), requestDTO.isGroupDailyTransfers(), requestDTO.getGroupingPolicy());
//<editor-fold desc="Trasferimento pallet">
for (MtbColr rowMovimento : movimento.getMtbColr()) {
if (listaPedane.getOrDefault(rowMovimento.getBarcodeUlOut(), null) != null) {
WMSUtility.trasferisciImballi(listaPedane.get(rowMovimento.getBarcodeUlOut()), docTrasf);
//rimuovo il barcode dalla lista di pallet da spostare per evitare che righe di moviemento create in più mtbColr moltiplichino il numero di pallet spostati
listaPedane.remove(rowMovimento.getBarcodeUlOut());
}
if (listaImballi.getOrDefault(rowMovimento.getBarcodeUlOut(), null) != null) {
WMSUtility.trasferisciImballi(listaImballi.get(rowMovimento.getBarcodeUlOut()), docTrasf);
//rimuovo il barcode dalla lista di pallet da spostare per evitare che righe di moviemento create in più mtbColr moltiplichino il numero di pallet spostati
listaImballi.remove(rowMovimento.getBarcodeUlOut());
}
}
//</editor-fold>
if (!UtilityString.isNullOrEmpty(requestDTO.getAnnotazioni())) {
DtbDocr dtbDocr = new DtbDocr()
.setDescrizione(UtilityString.substring(requestDTO.getAnnotazioni(), 0, 40))
.setDescrizioneEstesa(requestDTO.getAnnotazioni());
dtbDocr.setOperation(OperationType.INSERT);
docTrasf.getDtbDocr().add(dtbDocr);
}
entityProcessor.processEntity(docTrasf, true, multiDBTransactionManager);
entityProcessor.processEntity(transferDocument, true, multiDBTransactionManager);
}
//</editor-fold>
//</editor-fold>
// UtilityEntity.throwEntitiesException(entitiesToSave);
@@ -2886,7 +2780,7 @@ public class WMSGenericService {
}
}
mtbColt = WMSUtility.createInternalMovement(codMdep, dataCollo)
mtbColt = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), codMdep, dataCollo, requestDataDTO.getUsername())
.setDataOrd(order != null ? UtilityLocalDate.localDateFromDate(order.getDataOrd()) : null)
.setNumOrd(order != null ? order.getNumOrd() : null)
.setCodJfas(order != null ? order.getCodJfas() : null)
@@ -3080,7 +2974,7 @@ public class WMSGenericService {
updatePosizioneULRequestDTO.getPosizione());
MtbDepoPosizioni posizione = WMSUtility.getPosizioneFromName(multiDBTransactionManager.getPrimaryConnection(), updatePosizioneULRequestDTO.getPosizione());
MtbColt internalMovement = WMSUtility.createInternalMovement(posizione.getCodMdep());
MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), posizione.getCodMdep(), requestDataDTO.getUsername());
internalMovement.setMtbColr(cambiaPosizioneUlMovements);
entityProcessor.processEntity(internalMovement, true, multiDBTransactionManager);

View File

@@ -1,12 +1,24 @@
package it.integry.ems.retail.wms.generic.service;
import it.integry.common.var.CommonConstants;
import it.integry.ems.report.dto.JasperDTO;
import it.integry.ems.report.dto.PairsDTO;
import it.integry.ems.retail.wms.generic.dto.SpostaUlRequestDTO;
import it.integry.ems.service.PrinterService;
import it.integry.ems.service.ReportProcessor;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems_model.entity.MtbColt;
import it.integry.ems_model.entity.key.DtbDoctKey;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import org.apache.pdfbox.printing.Orientation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
@Service
@@ -16,6 +28,12 @@ public class WMSTrasferimentoService {
@Autowired
private WMSGenericService wmsGenericService;
@Autowired
private ReportProcessor reportProcessor;
@Autowired
private PrinterService printerService;
public MtbColt saveTrasferimento(Connection primaryConnection, String codMdepDest, List<String> barcodeUlList) throws Exception {
return wmsGenericService.spostaUL(new SpostaUlRequestDTO() {{
setCodMdep(codMdepDest);
@@ -24,4 +42,39 @@ public class WMSTrasferimentoService {
setGroupDailyTransfers(false);
}});
}
public void printDocument(Connection primaryConnection, DtbDoctKey documentToPrint, String printerName) throws Exception {
String sql = Query.format("SELECT wtb_jrept.id\n" +
"FROM dtb_tipi\n" +
" INNER JOIN dtb_mod_stampa ON mod_stamp = mod_stampa\n" +
" INNER JOIN wtb_jrept ON id = report_id\n" +
"WHERE cod_dtip = %s", documentToPrint.getCodDtip());
Long reportId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(primaryConnection, sql);
if (reportId == null) {
throw new Exception("Nessun report associato al tipo documento " + documentToPrint.getCodDtip());
}
List<PairsDTO> documentReportData = new ArrayList<PairsDTO>() {{
add(new PairsDTO("cod_dtip", documentToPrint.getCodDtip()));
add(new PairsDTO("cod_anag", documentToPrint.getCodAnag()));
add(new PairsDTO("num_doc", String.valueOf(documentToPrint.getNumDoc())));
add(new PairsDTO("ser_doc", documentToPrint.getSerDoc()));
add(new PairsDTO("data_doc", CommonConstants.DATE_YMD_DASHED_FORMATTER.format(documentToPrint.getDataDoc())));
}};
final byte[] documentReportResult = reportProcessor.processReport(new JasperDTO() {{
setReportId(reportId);
setParams(documentReportData);
}});
if(documentReportResult == null || documentReportResult.length == 0) {
throw new Exception("Impossibile generare la stampa del documento " + documentToPrint.getCodDtip() + " " + documentToPrint.getNumDoc());
}
ByteArrayInputStream bais = new ByteArrayInputStream(documentReportResult);
printerService.print(printerName, bais, MediaType.APPLICATION_PDF_VALUE, Orientation.AUTO);
bais.close();
}
}

View File

@@ -1,5 +1,6 @@
package it.integry.ems.retail.wms.lavorazione.service;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.production.service.MesProductionServiceV2;
import it.integry.ems.retail.wms.Utility.WMSUtility;
import it.integry.ems.retail.wms.exceptions.InvalidArticoloException;
@@ -54,6 +55,8 @@ public class WMSMaterialiService {
private UserSession userSession;
private final Logger logger = LogManager.getLogger();
@Autowired
private RequestDataDTO requestDataDTO;
public VersaMaterialiResponseDTO versa(VersaMaterialiRequestDTO request) throws Exception {
final boolean versamentoDirettoEnabled = setupGest.getSetupBoolean(multiDBTransactionManager.getPrimaryConnection(), "PICKING", "PRODUZIONE", "FLAG_VERSAMENTO_DIRETTO");
@@ -102,7 +105,7 @@ public class WMSMaterialiService {
if (posizioneVersamento == null)
throw new Exception("Posizione di versamento non trovata (" + request.getPosizioneVersamento() + ")");
MtbColt internalMovement = WMSUtility.createInternalMovement(itemDaVersare.getCodMdep())
MtbColt internalMovement = WMSUtility.createInternalMovement(multiDBTransactionManager.getPrimaryConnection(), itemDaVersare.getCodMdep(), requestDataDTO.getUsername())
.setSegno(-1)
.setPosizione(posizioneVersamento.getPosizione());

View File

@@ -39,7 +39,7 @@ public class WMSResiClientiController {
@GetMapping(value = "retrieve-ultime-consegne")
public @ResponseBody
ServiceRestResponse retrieveUltimeConsegne(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestParam String codMdep,
@RequestParam(required = false) String codMdep,
@RequestParam(required = false) String codAnag,
@RequestParam(required = false) String codMart,
@RequestParam(required = false) Integer limitConsegnePerCli,

View File

@@ -1163,7 +1163,8 @@ public class SystemController {
} else {
PrinterService.Type[] types = PrinterService.Type.values();
for (PrinterService.Type type : types) {
printers.add(printerService.getPrinterNameByDepo(multiDBTransactionManager.getPrimaryConnection(), codMdep, null, type));
final String printerNameByDepo = printerService.getPrinterNameByDepo(multiDBTransactionManager.getPrimaryConnection(), codMdep, null, type);
if(printerNameByDepo != null) printers.add(printerNameByDepo);
}
}