diff --git a/app/build.gradle b/app/build.gradle index 6f720ec3..c2c04bae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,6 +192,8 @@ dependencies { //Barcode generator implementation 'com.journeyapps:zxing-android-embedded:4.3.0' + + implementation("org.javatuples:javatuples:1.2") } repositories { diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java index 58c691a9..5cd9e95f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneActivity.java @@ -739,12 +739,12 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo public void addExtraItem() { handler.post(() -> { DialogScanArtView - .newInstance(!mEnableFakeGiacenza, (status, mtbAart, ean128Model, mtbColr) -> { + .newInstance(!mEnableFakeGiacenza, (status, mtbAart, ean128Model, mtbColt) -> { if (status == DialogConsts.Results.YES) { executorService.execute(() -> { try { - this.mViewmodel.dispatchExtraItem(mtbAart, ean128Model, mtbColr); + this.mViewmodel.dispatchExtraItem(mtbAart, ean128Model, mtbColt); } catch (Exception e) { onError(e); } diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java index 7a9efb12..1a86353c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/spedizione/SpedizioneViewModel.java @@ -1224,7 +1224,7 @@ public class SpedizioneViewModel { return !stati.isEmpty() ? stati.get(0) : null; } - public void dispatchExtraItem(MtbAart mtbAart, Ean128Model ean128Model, MtbColr mtbColrToUse) throws Exception { + public void dispatchExtraItem(MtbAart mtbAart, Ean128Model ean128Model, MtbColt refMtbColt) throws Exception { PickingObjectDTO pickingObjectDTO = new PickingObjectDTO().setMtbAart(mtbAart).setTempPickData(PickDataDTO.fromEan128(ean128Model)); @@ -1243,12 +1243,23 @@ public class SpedizioneViewModel { String partitaMag = null; LocalDate dataScad = null; - MtbColt refMtbColt = null; +// MtbColt refMtbColt = null; - if (mtbColrToUse != null) { - refMtbColt = new MtbColt().setDataCollo(mtbColrToUse.getDataColloD()).setSerCollo(mtbColrToUse.getSerCollo()).setNumCollo(mtbColrToUse.getNumCollo()).setGestione(mtbColrToUse.getGestione()).setMtbColr(new ObservableArrayList<>()); + if (refMtbColt != null && refMtbColt.getMtbColr() != null && !refMtbColt.getMtbColr().isEmpty()) { + MtbColr mtbColrToUse = refMtbColt.getMtbColr().get(0); - refMtbColt.getMtbColr().add(mtbColrToUse); + //Se il collo di riferimento non ha righe, lo creo al volo +// refMtbColt = new MtbColt() +// .setDataCollo(mtbColrToUse.getDataColloD()) +// .setSerCollo(mtbColrToUse.getSerCollo()) +// .setNumCollo(mtbColrToUse.getNumCollo()) +// .setGestione(mtbColrToUse.getGestione()) +//// .setCodMdep(mtbColrToUse.getCodMdepIn()) +//// .setPosizione(mtbColrToUse.getPosizioneIn()) +//// .setBarcodeUl(mtbColrToUse.getBarcodeUlIn()) +// .setMtbColr(new ObservableArrayList<>()); +// +// refMtbColt.getMtbColr().add(mtbColrToUse); pickingObjectDTO.setMtbAart(mtbColrToUse.getMtbAart()).setTempPickData(new PickDataDTO().setSourceMtbColt(refMtbColt)); diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java index 3a1a6f89..fe63725e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtView.java @@ -4,15 +4,19 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; +import android.os.Handler; import android.view.LayoutInflater; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.databinding.ObservableArrayList; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.javatuples.Quartet; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; @@ -27,6 +31,7 @@ import it.integry.integrywmsnative.core.expansion.RunnableArgs; import it.integry.integrywmsnative.core.expansion.RunnableArgssss; import it.integry.integrywmsnative.core.model.MtbAart; import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.MtbDepoPosizione; import it.integry.integrywmsnative.core.rest.model.Ean128Model; import it.integry.integrywmsnative.databinding.DialogScanArtBinding; @@ -38,6 +43,9 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA @Inject DialogScanArtViewModel mViewModel; + @Inject + Handler handler; + private Context mContext; private final boolean mForceOnlyUL; @@ -46,15 +54,15 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA private int mBarcodeScannerInstanceID; - private RunnableArgssss onPickingCompleted = null; + private RunnableArgssss onPickingCompleted = null; private RunnableArgs onMagazzinoAutomaticoPickingRequest = null; - public static DialogScanArtView newInstance(boolean forceOnlyUL, @NotNull RunnableArgssss onPickingCompleted, RunnableArgs onMagazzinoAutomaticoPickingRequest) { + public static DialogScanArtView newInstance(boolean forceOnlyUL, @NotNull RunnableArgssss onPickingCompleted, RunnableArgs onMagazzinoAutomaticoPickingRequest) { return new DialogScanArtView(forceOnlyUL, onPickingCompleted, onMagazzinoAutomaticoPickingRequest); } - private DialogScanArtView(boolean forceOnlyUL, RunnableArgssss onItemChoosed, RunnableArgs onMagazzinoAutomaticoPickingRequest) { + private DialogScanArtView(boolean forceOnlyUL, RunnableArgssss onItemChoosed, RunnableArgs onMagazzinoAutomaticoPickingRequest) { super(); mForceOnlyUL = forceOnlyUL; @@ -122,37 +130,60 @@ public class DialogScanArtView extends BaseDialogFragment implements DialogScanA private final RunnableArgs onScanSuccessfull = data -> { this.onLoadingStarted(); - this.mViewModel.processBarcodeDTO(data, (status, mtbAart, ean128Model, mtbColrList) -> { + executorService.execute(() -> { - var filteredMtbColrList = mtbColrList; + try { - if (mtbAart != null && filteredMtbColrList != null) { - filteredMtbColrList = filteredMtbColrList.stream() - .filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart())) - .collect(Collectors.toList()); + Quartet result = this.mViewModel.processBarcodeDTO(data, pickMagazzinoAutomaticoPosizione -> { + handler.post(() -> { + this.onMagazzinoAutomaticoPickingRequest.run(pickMagazzinoAutomaticoPosizione); + + this.onLoadingEnded(); + dismiss(); + }); + }); + + var status = result.getValue0(); + var mtbAart = result.getValue1(); + var ean128Model = result.getValue2(); + var mtbColt = result.getValue3(); + + List filteredMtbColrList = mtbColt.getMtbColr(); + + if (mtbAart != null && filteredMtbColrList != null) { + filteredMtbColrList = filteredMtbColrList.stream() + .filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart())) + .collect(Collectors.toList()); + } + + + List finalFilteredMtbColrList = filteredMtbColrList; + handler.post(() -> { + if (finalFilteredMtbColrList != null && finalFilteredMtbColrList.size() > 1) { + DialogChooseArtFromListaMtbColrView.make(getActivity(), finalFilteredMtbColrList, mtbColrChose -> { + + mtbColt.setMtbColr(new ObservableArrayList<>()); + mtbColt.getMtbColr().add(mtbColrChose); + onPickingCompleted.run(status, mtbAart, ean128Model, mtbColt); + }).show(); + + } else if (finalFilteredMtbColrList != null && finalFilteredMtbColrList.size() == 1) { + mtbColt.setMtbColr(new ObservableArrayList<>()); + mtbColt.getMtbColr().add(finalFilteredMtbColrList.get(0)); + onPickingCompleted.run(status, mtbAart, ean128Model, mtbColt); + + } else { + onPickingCompleted.run(status, mtbAart, ean128Model, null); + } + + + this.onLoadingEnded(); + + dismiss(); + }); + } catch (Exception ex) { + onError(ex); } - - if (filteredMtbColrList != null && filteredMtbColrList.size() > 1) { - DialogChooseArtFromListaMtbColrView.make(getActivity(), filteredMtbColrList, mtbColrChose -> { - onPickingCompleted.run(status, mtbAart, ean128Model, mtbColrChose); - }).show(); - - } else if (filteredMtbColrList != null && filteredMtbColrList.size() == 1) { - onPickingCompleted.run(status, mtbAart, ean128Model, filteredMtbColrList.get(0)); - - } else { - onPickingCompleted.run(status, mtbAart, ean128Model, null); - } - - - this.onLoadingEnded(); - - dismiss(); - }, pickMagazzinoAutomaticoPosizione -> { - this.onMagazzinoAutomaticoPickingRequest.run(pickMagazzinoAutomaticoPosizione); - - this.onLoadingEnded(); - dismiss(); }); }; } diff --git a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java index b196ffbb..54d7e612 100644 --- a/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/view/dialogs/scan_art/DialogScanArtViewModel.java @@ -1,22 +1,17 @@ package it.integry.integrywmsnative.view.dialogs.scan_art; -import com.annimon.stream.Stream; - +import org.javatuples.Quartet; import org.jetbrains.annotations.NotNull; -import java.util.List; - import it.integry.barcode_base_android_library.model.BarcodeScanDTO; -import it.integry.integrywmsnative.core.exception.EmptyLUException; import it.integry.integrywmsnative.core.exception.InvalidLUException; import it.integry.integrywmsnative.core.exception.NoLUFoundException; import it.integry.integrywmsnative.core.exception.NoResultFromBarcodeException; import it.integry.integrywmsnative.core.exception.ScannedPositionNotExistException; import it.integry.integrywmsnative.core.exception.TooManyLUFoundInMonoLUPositionException; import it.integry.integrywmsnative.core.expansion.RunnableArgs; -import it.integry.integrywmsnative.core.expansion.RunnableArgssss; import it.integry.integrywmsnative.core.model.MtbAart; -import it.integry.integrywmsnative.core.model.MtbColr; +import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.MtbDepoPosizione; import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer; @@ -62,23 +57,23 @@ public class DialogScanArtViewModel { return this; } - public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, RunnableArgssss> onPickingCompleted, RunnableArgs onMagazzinoAutomaticoPickingRequest) { + public Quartet processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, RunnableArgs onMagazzinoAutomaticoPickingRequest) throws Exception { if (UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) { //Cerco gli articoli presenti nell'ul dell'etichetta anonima - this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onPickingCompleted); + return this.executeEtichettaLU(barcodeScanDTO.getStringValue()); } else if (UtilityBarcode.isEtichettaPosizione(barcodeScanDTO)) { //Cerco l'UL presente all'interno della posizione - this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onPickingCompleted, onMagazzinoAutomaticoPickingRequest); + return this.executeEtichettaPosizione(barcodeScanDTO.getStringValue(), onMagazzinoAutomaticoPickingRequest); } else if (UtilityBarcode.isEtichetta128(barcodeScanDTO)) { - this.executeEtichettaEan128(barcodeScanDTO, onPickingCompleted); + return this.executeEtichettaEan128(barcodeScanDTO); } else if (UtilityBarcode.isEanPeso(barcodeScanDTO) && !mForceOnlyUL) { - this.executeEtichettaEanPeso(barcodeScanDTO, onPickingCompleted); + return this.executeEtichettaEanPeso(barcodeScanDTO); } else { - this.loadArticolo(barcodeScanDTO.getStringValue(), null, onPickingCompleted); + return this.loadArticolo(barcodeScanDTO.getStringValue(), null); } // else { @@ -87,123 +82,108 @@ public class DialogScanArtViewModel { } - - private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, RunnableArgssss> onComplete) { - this.mBarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> { - - String barcodeProd = null; - - if (ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc; - if (ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin; - if (ean128Model.Content != null) barcodeProd = ean128Model.Content; + private Quartet executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO) throws Exception { + var ean128Model = this.mBarcodeRESTConsumer.decodeEan128Synchronized(barcodeScanDTO); - if (!UtilityString.isNullOrEmpty(barcodeProd)) { - if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) { - this.executeEtichettaLU(ean128Model.Sscc, onComplete); - } else if (!mForceOnlyUL) { + String barcodeProd = null; + + if (ean128Model.Sscc != null) barcodeProd = ean128Model.Sscc; + if (ean128Model.Gtin != null) barcodeProd = ean128Model.Gtin; + if (ean128Model.Content != null) barcodeProd = ean128Model.Content; + + + if (!UtilityString.isNullOrEmpty(barcodeProd)) { + if (!UtilityString.isNullOrEmpty(ean128Model.Sscc)) { + return this.executeEtichettaLU(ean128Model.Sscc); + + } else if (!mForceOnlyUL) { + return this.loadArticolo(barcodeProd, ean128Model); - this.loadArticolo(barcodeProd, ean128Model, onComplete); - } else { - this.sendError(new Exception("Barcode non valido")); - } } else { - //EAN 128 non completo o comunque mancano i riferimenti al prodotto - this.sendError(new NoResultFromBarcodeException(barcodeProd)); + throw new Exception("Barcode non valido"); } - }, this::sendError); - } - - private void executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO, RunnableArgssss> onComplete) { - - try { - Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue()); - - this.loadArticolo(ean13PesoModel.getPrecode(), ean13PesoModel.toEan128(), onComplete); - } catch (Exception ex) { - this.sendError(ex); + } else { + //EAN 128 non completo o comunque mancano i riferimenti al prodotto + throw new NoResultFromBarcodeException(barcodeProd); } } + private Quartet executeEtichettaEanPeso(BarcodeScanDTO barcodeScanDTO) throws Exception { + Ean13PesoModel ean13PesoModel = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue()); - private void executeEtichettaLU(String SSCC, RunnableArgssss> onComplete) { - mColliMagazzinoRESTConsumer.getBySSCC(SSCC, true, false, mtbColt -> { - - if (mtbColt != null && mtbColt.getMtbColr() != null && !mtbColt.getMtbColr().isEmpty()) { - if (mtbColt.getSegno() != -1) { - onComplete.run(DialogConsts.Results.YES, null, null, mtbColt.getMtbColr()); - } else this.sendError(new InvalidLUException()); - } else { - this.sendError(new EmptyLUException()); - } - - }, this::sendError); + return this.loadArticolo(ean13PesoModel.getPrecode(), ean13PesoModel.toEan128()); } + private Quartet executeEtichettaLU(String SSCC) throws Exception { + var mtbColt = mColliMagazzinoRESTConsumer.getBySsccSynchronized(SSCC, true, false); - private void executeEtichettaPosizione(String stringValue, RunnableArgssss> onComplete, RunnableArgs onMagazzinoAutomaticoPickingRequest) { - MtbDepoPosizione foundPosizione = Stream.of(SettingsManager.iDB().getAvailablePosizioni()) + if (mtbColt == null || mtbColt.getMtbColr() == null || mtbColt.getMtbColr().isEmpty()) + throw new NoLUFoundException(); + + if (mtbColt.getSegno() == -1) throw new InvalidLUException(); + + return new Quartet<>(DialogConsts.Results.YES, null, null, mtbColt); + + } + + + private Quartet executeEtichettaPosizione(String stringValue, RunnableArgs onMagazzinoAutomaticoPickingRequest) throws Exception { + MtbDepoPosizione foundPosizione = SettingsManager.iDB().getAvailablePosizioni().stream() .filter(x -> x.getPosizione().equalsIgnoreCase(stringValue)) - .single(); + .findFirst() + .orElse(null); - if (foundPosizione == null) { + if (foundPosizione == null) //Nessuna posizione trovata con questo barcode - this.sendError(new ScannedPositionNotExistException()); - return; - } + throw new ScannedPositionNotExistException(); + if (foundPosizione.isMagazzinoAutomatico()) { //Eseguo picking da magazzino automatico onMagazzinoAutomaticoPickingRequest.run(foundPosizione); } else { - this.executePosizione(foundPosizione, null, onComplete); + return this.executePosizione(foundPosizione, null); } + + return null; } - private void executePosizione(MtbDepoPosizione posizione, MtbAart articolo, RunnableArgssss> onComplete) { - this.mPosizioniRESTConsumer.getBancaliInPosizione(posizione, mtbColtList -> { + private Quartet executePosizione(MtbDepoPosizione posizione, MtbAart articolo) throws Exception { + var mtbColtList = this.mPosizioniRESTConsumer.getBancaliInPosizioneSynchronized(posizione); - if (mtbColtList == null || mtbColtList.isEmpty()) { - this.sendError(new NoLUFoundException()); - } else if (mtbColtList.size() == 1) { - this.mColliMagazzinoRESTConsumer.getByTestata(mtbColtList.get(0), true, false, mtbColt -> { - onComplete.run(DialogConsts.Results.YES, articolo, null, mtbColt.getMtbColr()); - }, this::sendError); - } else { - this.sendError(new TooManyLUFoundInMonoLUPositionException()); - } + if (mtbColtList == null || mtbColtList.isEmpty()) + throw new NoLUFoundException(); - }, this::sendError); + if (mtbColtList.size() != 1) { + throw new TooManyLUFoundInMonoLUPositionException(); + } + + var mtbColt = this.mColliMagazzinoRESTConsumer.getByTestataSynchronized(mtbColtList.get(0), true, false); + return new Quartet<>(DialogConsts.Results.YES, articolo, null, mtbColt); } - private void loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model, RunnableArgssss> onComplete) { - this.mArticoloRESTConsumer.searchByBarcode(barcodeProd, mtbAartList -> { - if (mtbAartList != null && !mtbAartList.isEmpty()) { + private Quartet loadArticolo(@NotNull String barcodeProd, Ean128Model ean128Model) throws Exception { + var mtbAartList = this.mArticoloRESTConsumer.searchByBarcodeSynchronized(barcodeProd); - MtbAart firstArt = mtbAartList.get(0); - MtbDepoPosizione firstArtPosition = UtilityPosizione.getFromCache(firstArt.getPosizione()); + if (mtbAartList == null || mtbAartList.isEmpty()) + throw new NoResultFromBarcodeException(barcodeProd); - if (firstArtPosition != null && firstArtPosition.isFlagMonoCollo() && mForceOnlyUL) { - this.executePosizione(firstArtPosition, firstArt, onComplete); - } else if (!mForceOnlyUL) { - onComplete.run(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null); - } else { - this.sendError(new NoResultFromBarcodeException(barcodeProd)); - } + MtbAart firstArt = mtbAartList.get(0); + MtbDepoPosizione firstArtPosition = UtilityPosizione.getFromCache(firstArt.getPosizione()); - } else { - this.sendError(new NoResultFromBarcodeException(barcodeProd)); - } - }, this::sendError); + if (firstArtPosition != null && firstArtPosition.isFlagMonoCollo() && mForceOnlyUL) + return this.executePosizione(firstArtPosition, firstArt); + + if (!mForceOnlyUL) + return new Quartet<>(DialogConsts.Results.YES, mtbAartList.get(0), ean128Model, null); + + throw new NoResultFromBarcodeException(barcodeProd); } - private void sendError(Exception ex) { - if (this.mListener != null) mListener.onError(ex); - } - public void setListener(Listener listener) { this.mListener = listener; }