Implementata scansione barcode su Elenco ordini uscita

This commit is contained in:
Giuseppe Scorrano 2021-02-17 10:22:45 +01:00
parent 6dbc0c5894
commit 8fba80c764
8 changed files with 263 additions and 4 deletions

View File

@ -0,0 +1,12 @@
package it.integry.integrywmsnative.core.exception;
import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.utility.UtilityResources;
public class NoOrderFoundException extends Exception {
public NoOrderFoundException() {
super(UtilityResources.getString(R.string.no_orders_found_message));
}
}

View File

@ -24,10 +24,13 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.MainApplication;
import it.integry.integrywmsnative.R; import it.integry.integrywmsnative.R;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeCallbackDTO;
import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager; import it.integry.integrywmsnative.core.barcode_reader.BarcodeManager;
import it.integry.integrywmsnative.core.di.BindableBoolean; import it.integry.integrywmsnative.core.di.BindableBoolean;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.IFilterableFragment; import it.integry.integrywmsnative.core.interfaces.IFilterableFragment;
import it.integry.integrywmsnative.core.interfaces.ILifecycleFragment; import it.integry.integrywmsnative.core.interfaces.ILifecycleFragment;
import it.integry.integrywmsnative.core.interfaces.IScrollableFragment; import it.integry.integrywmsnative.core.interfaces.IScrollableFragment;
@ -115,6 +118,7 @@ public class OrdiniUscitaElencoFragment extends Fragment implements ITitledFragm
mBindings.setViewmodel(mViewModel); mBindings.setViewmodel(mViewModel);
this.initRecyclerView(); this.initRecyclerView();
this.initBarcodeReader();
return mBindings.getRoot(); return mBindings.getRoot();
} }
@ -170,6 +174,24 @@ public class OrdiniUscitaElencoFragment extends Fragment implements ITitledFragm
mToolbar.setRecyclerView(this.mBindings.venditaMainList); mToolbar.setRecyclerView(this.mBindings.venditaMainList);
} }
private void initBarcodeReader() {
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(getActivity(), ex, false)));
BarcodeManager.enable();
}
private final RunnableArgs<BarcodeScanDTO> onScanSuccessful = data -> {
BarcodeManager.disable();
this.openProgress();
this.mViewModel.processBarcodeDTO(data, () -> {
BarcodeManager.enable();
this.closeProgress();
});
};
private void refreshList(List<OrdiniUscitaElencoDTO> orderList) { private void refreshList(List<OrdiniUscitaElencoDTO> orderList) {
this.mOrdiniInevasiMutableData.clear(); this.mOrdiniInevasiMutableData.clear();
this.mOrdiniInevasiMutableData.addAll(convertDataModelToListModel(orderList)); this.mOrdiniInevasiMutableData.addAll(convertDataModelToListModel(orderList));
@ -235,7 +257,6 @@ public class OrdiniUscitaElencoFragment extends Fragment implements ITitledFragm
public void dispatchOrders() { public void dispatchOrders() {
List<OrdiniUscitaElencoDTO> selectedOrders = Stream.of(this.mOrdiniInevasiMutableData) List<OrdiniUscitaElencoDTO> selectedOrders = Stream.of(this.mOrdiniInevasiMutableData)
.filter(x -> x.getSelectedObservable().get()) .filter(x -> x.getSelectedObservable().get())
.map(OrdiniUscitaElencoListModel::getOriginalModel) .map(OrdiniUscitaElencoListModel::getOriginalModel)
@ -282,6 +303,12 @@ public class OrdiniUscitaElencoFragment extends Fragment implements ITitledFragm
BarcodeManager.enable(); BarcodeManager.enable();
} }
@Override
public void onOrderFiltered(List<OrdiniUscitaElencoDTO> filteredOrders) {
// FBToast.infoToast(getActivity(), "Trovati: " + filteredOrders.size() + " ordini", Toast.LENGTH_LONG);
refreshList(filteredOrders);
}
@Override @Override
public void onOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts) { public void onOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts) {
List<String> codMarts = Stream.of(sitArts) List<String> codMarts = Stream.of(sitArts)

View File

@ -1,15 +1,26 @@
package it.integry.integrywmsnative.gest.ordini_uscita_elenco; package it.integry.integrywmsnative.gest.ordini_uscita_elenco;
import javax.inject.Singleton;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer;
import it.integry.integrywmsnative.gest.ordini_uscita_elenco.rest.OrdiniUscitaElencoRESTConsumer;
@Module(subcomponents = OrdiniUscitaElencoComponent.class) @Module(subcomponents = OrdiniUscitaElencoComponent.class)
public class OrdiniUscitaElencoModule { public class OrdiniUscitaElencoModule {
@Singleton
@Provides @Provides
OrdiniUscitaElencoViewModel providesProdOrdineLavorazioneElencoViewModel(OrdiniRESTConsumer ordiniRESTConsumer) { OrdiniUscitaElencoRESTConsumer providesOrdiniUscitaElencoRESTConsumer() {
return new OrdiniUscitaElencoViewModel(ordiniRESTConsumer); return new OrdiniUscitaElencoRESTConsumer();
}
@Provides
OrdiniUscitaElencoViewModel providesProdOrdineLavorazioneElencoViewModel(OrdiniRESTConsumer ordiniRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, BarcodeRESTConsumer barcodeRESTConsumer, OrdiniUscitaElencoRESTConsumer ordiniUscitaElencoRESTConsumer) {
return new OrdiniUscitaElencoViewModel(ordiniRESTConsumer, colliMagazzinoRESTConsumer, barcodeRESTConsumer, ordiniUscitaElencoRESTConsumer);
} }
} }

View File

@ -4,25 +4,42 @@ import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.exception.InvalidLUGestioneException;
import it.integry.integrywmsnative.core.exception.InvalidLUMultiCodMdepException; import it.integry.integrywmsnative.core.exception.InvalidLUMultiCodMdepException;
import it.integry.integrywmsnative.core.exception.InvalidLUMultiGestioneException; import it.integry.integrywmsnative.core.exception.InvalidLUMultiGestioneException;
import it.integry.integrywmsnative.core.exception.NoLUFoundException;
import it.integry.integrywmsnative.core.exception.NoOrderFoundException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.DtbOrdt;
import it.integry.integrywmsnative.core.model.MtbColt; import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.OrdineInevasoDTO; import it.integry.integrywmsnative.core.model.OrdineInevasoDTO;
import it.integry.integrywmsnative.core.model.secondary.GestioneEnum; import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.rest.consumers.BarcodeRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.ColliMagazzinoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer; import it.integry.integrywmsnative.core.rest.consumers.OrdiniRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO; import it.integry.integrywmsnative.core.rest.model.OrdineUscitaInevasoDTO;
import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO; import it.integry.integrywmsnative.core.rest.model.SitArtOrdDTO;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.ordini_uscita_elenco.rest.OrdiniUscitaElencoRESTConsumer;
public class OrdiniUscitaElencoViewModel { public class OrdiniUscitaElencoViewModel {
private final MutableLiveData<List<OrdiniUscitaElencoDTO>> mOrderList = new MutableLiveData<>(); private final MutableLiveData<List<OrdiniUscitaElencoDTO>> mOrderList = new MutableLiveData<>();
private final OrdiniRESTConsumer mOrdiniRESTConsumer; private final OrdiniRESTConsumer mOrdiniRESTConsumer;
private final ColliMagazzinoRESTConsumer mColliMagazzinoRESTConsumer;
private final BarcodeRESTConsumer mBarcodeRESTConsumer;
private final OrdiniUscitaElencoRESTConsumer mOrdiniUscitaElencoRESTConsumer;
private Listener mListener; private Listener mListener;
private String mCurrentCodMdep; private String mCurrentCodMdep;
private GestioneEnum mCurrentGestioneOrd; private GestioneEnum mCurrentGestioneOrd;
@ -30,8 +47,11 @@ public class OrdiniUscitaElencoViewModel {
private int mCurrentSegnoCol; private int mCurrentSegnoCol;
@Inject @Inject
public OrdiniUscitaElencoViewModel(OrdiniRESTConsumer ordiniRESTConsumer) { public OrdiniUscitaElencoViewModel(OrdiniRESTConsumer ordiniRESTConsumer, ColliMagazzinoRESTConsumer colliMagazzinoRESTConsumer, BarcodeRESTConsumer barcodeRESTConsumer, OrdiniUscitaElencoRESTConsumer ordiniUscitaElencoRESTConsumer) {
this.mOrdiniRESTConsumer = ordiniRESTConsumer; this.mOrdiniRESTConsumer = ordiniRESTConsumer;
this.mColliMagazzinoRESTConsumer = colliMagazzinoRESTConsumer;
this.mBarcodeRESTConsumer = barcodeRESTConsumer;
this.mOrdiniUscitaElencoRESTConsumer = ordiniUscitaElencoRESTConsumer;
} }
@ -121,6 +141,118 @@ public class OrdiniUscitaElencoViewModel {
} }
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO, Runnable onComplete) {
RunnableArgs<List<OrdiniUscitaElencoDTO>> onBarcodeScanComplete = orderList -> {
onComplete.run();
this.sendOnOrderFiltered(orderList);
};
if(UtilityBarcode.isBarcodeOrdineV(barcodeScanDTO)) {
this.executeEtichettaOrdineV(barcodeScanDTO.getStringValue(), onBarcodeScanComplete);
} else if(UtilityBarcode.isEtichettaAnonima(barcodeScanDTO)) {
this.executeEtichettaLU(barcodeScanDTO.getStringValue(), onBarcodeScanComplete);
} else if(UtilityBarcode.isEtichetta128(barcodeScanDTO)){
this.executeEtichettaEan128(barcodeScanDTO, onBarcodeScanComplete);
} else {
onComplete.run();
}
}
private void executeEtichettaOrdineV(String barcode, RunnableArgs<List<OrdiniUscitaElencoDTO>> onComplete) {
String gestione = "";
char c = barcode.charAt(0);
if (c == '1')
gestione = "A";
else if (c == '2')
gestione = "L";
else if (c == '3')
gestione = "V";
int numOrd = Integer.parseInt(UtilityString.mid(barcode, 10));
Date date = null;
try {
date = new SimpleDateFormat("ddMMyyyy")
.parse(UtilityString.mid(barcode, 2, 8));
} catch (ParseException ex) {
this.sendError(ex);
return;
}
final String finalGestione = gestione;
final Date finalDate = date;
List<OrdiniUscitaElencoDTO> filteredOrders = Stream.of(mOrderList.getValue())
.filter(x -> x.getNumOrd() == numOrd && x.getGestione().equalsIgnoreCase(finalGestione) && x.getDataOrdD().equals(finalDate)).toList();
onComplete.run(filteredOrders);
}
private void executeEtichettaLU(String SSCC, RunnableArgs<List<OrdiniUscitaElencoDTO>> onComplete) {
this.mColliMagazzinoRESTConsumer.getBySSCC(SSCC, true, false, mtbColt -> {
if(mtbColt != null && mtbColt.getMtbColr() != null && mtbColt.getMtbColr().size() > 0) {
if(mtbColt.getGestioneEnum() == GestioneEnum.ACQUISTO || mtbColt.getGestioneEnum() == GestioneEnum.LAVORAZIONE) {
//GET BY COMMESSA COLLO
this.mOrdiniUscitaElencoRESTConsumer.getOrdiniFromCommessaCollo(mCurrentCodMdep, mtbColt, orderList -> {
if(orderList != null && orderList.size() > 0) {
List<Integer> numOrds = Stream.of(orderList)
.map(DtbOrdt::getNumOrd)
.toList();
List<OrdiniUscitaElencoDTO> filteredOrders = Stream.of(mOrderList.getValue())
.filter(x -> numOrds.contains(x.getNumOrd())).toList();
onComplete.run(filteredOrders);
} else {
this.sendError(new NoOrderFoundException());
}
}, this::sendError);
} else {
this.sendError(new InvalidLUGestioneException(GestioneEnum.VENDITA));
}
} else {
this.sendError(new NoLUFoundException());
}
}, this::sendError);
}
private void executeEtichettaEan128(BarcodeScanDTO barcodeScanDTO, RunnableArgs<List<OrdiniUscitaElencoDTO>> onComplete) {
this.mBarcodeRESTConsumer.decodeEan128(barcodeScanDTO, ean128Model -> {
String barcodeProd = null;
if(!UtilityString.isNullOrEmpty(ean128Model.Sscc)) barcodeProd = ean128Model.Sscc;
if(!UtilityString.isNullOrEmpty(ean128Model.Gtin)) barcodeProd = ean128Model.Gtin;
if(!UtilityString.isNullOrEmpty(ean128Model.Content)) barcodeProd = ean128Model.Content;
if(!UtilityString.isNullOrEmpty(barcodeProd)) {
if(!UtilityString.isNullOrEmpty(ean128Model.Sscc)){
this.executeEtichettaLU(ean128Model.Sscc, onComplete);
} else {
this.sendError(new NoLUFoundException());
}
} else {
//EAN 128 non completo o comunque mancano i riferimenti al prodotto
this.sendError(new NoLUFoundException());
}
}, this::sendError);
}
public MutableLiveData<List<OrdiniUscitaElencoDTO>> getOrderList() { public MutableLiveData<List<OrdiniUscitaElencoDTO>> getOrderList() {
return mOrderList; return mOrderList;
} }
@ -142,6 +274,10 @@ public class OrdiniUscitaElencoViewModel {
if (this.mListener != null) mListener.onError(ex); if (this.mListener != null) mListener.onError(ex);
} }
private void sendOnOrderFiltered(List<OrdiniUscitaElencoDTO> filteredOrders) {
if (this.mListener != null) mListener.onOrderFiltered(filteredOrders);
}
private void sendOnOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts) { private void sendOnOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts) {
if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts, alreadyRegisteredMtbColts); if (this.mListener != null) mListener.onOrdersDispatched(orders, sitArts, alreadyRegisteredMtbColts);
} }
@ -153,6 +289,8 @@ public class OrdiniUscitaElencoViewModel {
void onError(Exception ex); void onError(Exception ex);
void onOrderFiltered(List<OrdiniUscitaElencoDTO> filteredOrders);
void onOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts); void onOrdersDispatched(List<OrdineUscitaInevasoDTO> orders, List<SitArtOrdDTO> sitArts, List<MtbColt> alreadyRegisteredMtbColts);
} }

View File

@ -0,0 +1,45 @@
package it.integry.integrywmsnative.gest.ordini_uscita_elenco.rest;
import java.util.List;
import javax.inject.Singleton;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.model.DtbOrdt;
import it.integry.integrywmsnative.core.model.MtbColt;
import it.integry.integrywmsnative.core.model.secondary.GestioneEnum;
import it.integry.integrywmsnative.core.rest.RESTBuilder;
import it.integry.integrywmsnative.core.rest.consumers._BaseRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@Singleton
public class OrdiniUscitaElencoRESTConsumer extends _BaseRESTConsumer {
public void getOrdiniFromCommessaCollo(String codMdep, MtbColt testataCollo, RunnableArgs<List<DtbOrdt>> onComplete, RunnableArgs<Exception> onFailed) {
OrdiniUscitaElencoRESTConsumerService service = RESTBuilder.getService(OrdiniUscitaElencoRESTConsumerService.class);
service.getOrdiniInCommessaCollo(
testataCollo.getDataColloS(),
testataCollo.getNumCollo(),
testataCollo.getSerCollo(),
testataCollo.getGestione(),
GestioneEnum.VENDITA.getText(),
codMdep)
.enqueue(new Callback<ServiceRESTResponse<List<DtbOrdt>>>() {
@Override
public void onResponse(Call<ServiceRESTResponse<List<DtbOrdt>>> call, Response<ServiceRESTResponse<List<DtbOrdt>>> response) {
analyzeAnswer(response, "getOrdiniFromCommessaCollo", (m) -> {
onComplete.run(response.body().getEntity());
}, onFailed);
}
@Override
public void onFailure(Call<ServiceRESTResponse<List<DtbOrdt>>> call, Throwable t) {
onFailed.run(new Exception(t));
}
});
}
}

View File

@ -0,0 +1,16 @@
package it.integry.integrywmsnative.gest.ordini_uscita_elenco.rest;
import java.util.List;
import it.integry.integrywmsnative.core.model.DtbOrdt;
import it.integry.integrywmsnative.core.rest.model.ServiceRESTResponse;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface OrdiniUscitaElencoRESTConsumerService {
@GET("getOrdiniInCommCollo")
Call<ServiceRESTResponse<List<DtbOrdt>>> getOrdiniInCommessaCollo(@Query("dataCollo") String dataCollo, @Query("numCollo") Integer numCollo, @Query("serCollo") String serCollo, @Query("gestioneCollo") String gestioneCollo, @Query("gestioneOrdine") String gestioneOrdine, @Query("codMdep") String codMdep);
}

View File

@ -225,6 +225,8 @@ public class SpedizioneActivity extends BaseActivity implements SpedizioneViewMo
barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO() barcodeScannerIstanceID = BarcodeManager.addCallback(new BarcodeCallbackDTO()
.setOnScanSuccessfull(onScanSuccessful) .setOnScanSuccessfull(onScanSuccessful)
.setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false))); .setOnScanFailed(ex -> UtilityExceptions.defaultException(this, ex, false)));
BarcodeManager.enable();
} }
private void initRecyclerView() { private void initRecyclerView() {

View File

@ -6,6 +6,7 @@ import it.integry.integrywmsnative.gest.accettazione.MainAccettazioneFragment;
import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment; import it.integry.integrywmsnative.gest.ordini_uscita_elenco.OrdiniUscitaElencoFragment;
import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment; import it.integry.integrywmsnative.gest.picking_libero.PickingLiberoFragment;
import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoFragment; import it.integry.integrywmsnative.gest.prod_accettazione_ord_produzione.ProdOrdineProduzioneElencoFragment;
import it.integry.integrywmsnative.gest.prod_fabbisogno_linee_prod.ProdFabbisognoLineeProdFragment;
import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment; import it.integry.integrywmsnative.gest.rettifica_giacenze.RettificaGiacenzeFragment;
import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment; import it.integry.integrywmsnative.gest.ultime_consegne_cliente.UltimeConsegneClienteFragment;
import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment; import it.integry.integrywmsnative.gest.ultimi_arrivi_fornitore.UltimiArriviFornitoreFragment;
@ -87,6 +88,13 @@ public class MenuConfigurationGRAMM extends BaseMenuConfiguration {
.setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_libero) .setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_picking_libero)
.setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner) .setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_barcode_scanner)
.setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.LAVORAZIONE))) .setFragmentFactory(() -> PickingLiberoFragment.newInstance(GestioneEnum.LAVORAZIONE)))
.addItem(new MenuItem()
.setID(it.integry.integrywmsnative.R.id.nav_prod_posizionamento_da_ord)
.setTitleText(it.integry.integrywmsnative.R.string.versamento_merce_fragment_title)
.setTitleIcon(it.integry.integrywmsnative.R.drawable.ic_dashboard_prod_versamento_merce)
.setDrawerIcon(it.integry.integrywmsnative.R.drawable.ic_black_load_shelf)
.setFragmentFactory(ProdFabbisognoLineeProdFragment::newInstance))
).addGroup( ).addGroup(
new MenuGroup() new MenuGroup()
.setGroupText(it.integry.integrywmsnative.R.string.internal_handling) .setGroupText(it.integry.integrywmsnative.R.string.internal_handling)