Aggiunto filtro posizione in riposizionamento da prod

This commit is contained in:
Marco Elefante 2024-02-07 10:07:31 +01:00
parent 6a84828506
commit 725372befe
8 changed files with 333 additions and 73 deletions

View File

@ -2,5 +2,26 @@
<project version="4">
<component name="AppInsightsSettings">
<option name="selectedTabId" value="Android Vitals" />
<option name="tabSettings">
<map>
<entry key="Firebase Crashlytics">
<value>
<InsightsFilterSettings>
<option name="connection">
<ConnectionSetting>
<option name="appId" value="it.integry.integrywmsnative" />
<option name="mobileSdkAppId" value="1:963231271247:android:6d73ab369f33c450" />
<option name="projectId" value="wmsfirebaseproject-64854" />
<option name="projectNumber" value="963231271247" />
</ConnectionSetting>
</option>
<option name="signal" value="SIGNAL_UNSPECIFIED" />
<option name="timeIntervalDays" value="THIRTY_DAYS" />
<option name="visibilityType" value="ALL" />
</InsightsFilterSettings>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -0,0 +1,19 @@
package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
import java.util.HashMap;
import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterPosizioneLayoutView;
import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO;
public class ProdRiposizionamentoDaProdBindings {
public static final int POSITIONS_FILTER_ID = 0;
public static final HashMap<Integer, FilterChipDTO> AVAILABLE_FILTERS = new HashMap<>() {{
put(POSITIONS_FILTER_ID, new FilterChipDTO()
.setID(POSITIONS_FILTER_ID)
.setFilterChipText("Posizione")
.setFilterLayoutView(new FilterPosizioneLayoutView()));
}};
}

View File

@ -3,7 +3,6 @@ package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -12,10 +11,10 @@ import androidx.appcompat.widget.AppCompatTextView;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import com.annimon.stream.Stream;
import com.ravikoradiya.liveadapter.LiveAdapter;
import com.ravikoradiya.liveadapter.Type;
import java.lang.reflect.Constructor;
import java.util.List;
import java.util.Objects;
@ -28,6 +27,7 @@ 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.expansion.BaseFragment;
import it.integry.integrywmsnative.core.expansion.OnGeneralChangedCallback;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.ITitledFragment;
import it.integry.integrywmsnative.core.model.MtbColt;
@ -36,14 +36,15 @@ import it.integry.integrywmsnative.core.model.MvwSitArtUdcDetInventario;
import it.integry.integrywmsnative.core.utility.UtilityExceptions;
import it.integry.integrywmsnative.databinding.FragmentProdRiposizionamentoDaProdBinding;
import it.integry.integrywmsnative.databinding.ProdRiposizionamentoDaProdListItemBinding;
import it.integry.integrywmsnative.gest.accettazione_ordini_picking.filters.FilterPosizioneLayoutView;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dialogs.info_giacenza.DialogInfoGiacenzaView;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
import it.integry.integrywmsnative.view.dialogs.DialogAskLivelloPosizione;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.filter.ProdRiposizionamentoDaProdFilterViewModel;
import it.integry.integrywmsnative.ui.filter_chips.FilterChipDTO;
import it.integry.integrywmsnative.ui.filter_chips.FilterChipView;
import it.integry.integrywmsnative.ui.filter_chips.filters.FilterNumeroOrdineLayoutView;
import it.integry.integrywmsnative.view.dialogs.DialogConsts;
import it.integry.integrywmsnative.view.dialogs.ask_position_of_lu.DialogAskPositionOfLUView;
import it.integry.integrywmsnative.view.dialogs.base.DialogSimpleMessageView;
import it.integry.integrywmsnative.view.dialogs.info_aggiuntive_lu.DialogInfoAggiuntiveLUView;
import okhttp3.internal.http2.Header;
public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements ITitledFragment, ProdRiposizionamentoDaProdViewModel.Listener {
@ -52,11 +53,10 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
private FragmentProdRiposizionamentoDaProdBinding mBindings;
private final ObservableArrayList<ArtsInGiacenzaDTO> mItemsInventario = new ObservableArrayList<>();
private ProdRiposizionamentoDaProdFilterViewModel mFilterViewModel = new ProdRiposizionamentoDaProdFilterViewModel();
private final Handler mHandler = new Handler();
private final int mInterval = 120 * 1000; //2 minuti
private int barcodeScannerIstanceID = -1;
private MtbColt scanedMtbColt;
public ProdRiposizionamentoDaProdFragment() {
@ -94,18 +94,37 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
});
mHandler.postDelayed(mRunnable, mInterval);
this.initBarcodeReader();
this.initBarcodeReader();
this.initRecyclerView();
this.initFilters();
return mBindings.getRoot();
}
public void refreshList(List<ArtsInGiacenzaDTO> filteredList) {
List<ArtsInGiacenzaDTO> tmpList;
if (filteredList != null) {
tmpList = filteredList;
} else if (mFilterViewModel != null) {
mFilterViewModel.applyAllTests();
tmpList = mFilterViewModel.getCurrentList().getValue();
} else {
tmpList = mViewModel.getItemsInventario().getValue();
}
this.mItemsInventario.clear();
if (tmpList != null) {
this.mItemsInventario.addAll(tmpList);
}
}
private void initRecyclerView() {
mViewModel.getItemsInventario().observe(getViewLifecycleOwner(), data -> {
mBindings.emptyView.setVisibility(data == null || data.isEmpty() ? View.VISIBLE : View.GONE);
this.mItemsInventario.clear();
this.mItemsInventario.addAll(data);
mFilterViewModel.init(mViewModel.getItemsInventario().getValue());
this.refreshList(null);
});
var itemType = new Type<ArtsInGiacenzaDTO, ProdRiposizionamentoDaProdListItemBinding>(R.layout.prod_riposizionamento_da_prod__list_item, BR.item);
@ -120,6 +139,76 @@ public class ProdRiposizionamentoDaProdFragment extends BaseFragment implements
.into(this.mBindings.inventarioList);
}
private void initFilters() {
var onPredicateChanged = new OnGeneralChangedCallback() {
@Override
public void run() {
refreshList(null);
}
};
mFilterViewModel.getCurrentPositionPredicate().addOnPropertyChangedCallback(onPredicateChanged);
for (var filterChipDTO : ProdRiposizionamentoDaProdBindings.AVAILABLE_FILTERS.entrySet()) {
FilterChipView filterChipView = new FilterChipView(
requireActivity(),
filterChipDTO.getValue().getFilterChipText(),
v -> initBottomSheetDialogFilter(filterChipDTO.getValue()));
if (filterChipDTO.getKey() == ProdRiposizionamentoDaProdBindings.POSITIONS_FILTER_ID) {
mFilterViewModel.getCurrentPositionPredicate().addOnPropertyChangedCallback(new OnGeneralChangedCallback() {
@Override
public void run() {
if (mFilterViewModel.getCurrentPositionPredicate().get() == null) {
filterChipView.disableCloseIcon();
mBindings.filterChipsGroup.removeView(filterChipView);
mBindings.filterChipsGroup.addView(filterChipView);
mBindings.filterChips.smoothScrollTo(0, 0);
} else {
filterChipView.enableCloseIcon();
mBindings.filterChipsGroup.removeView(filterChipView);
mBindings.filterChipsGroup.addView(filterChipView, 0);
mBindings.filterChips.smoothScrollTo(0, 0);
}
}
});
filterChipView.setOnResetClicked(() -> mFilterViewModel.getCurrentPositionPredicate().set(null));
}
this.mBindings.filterChipsGroup.addView(filterChipView);
}
}
private void initBottomSheetDialogFilter(FilterChipDTO filterChipDTO) {
filterChipDTO
.getFilterLayoutView()
.setFilterName(filterChipDTO.getFilterChipText())
.setContext(requireActivity());
var filterLayoutView = filterChipDTO
.getFilterLayoutView();
if (filterChipDTO.getID() == ProdRiposizionamentoDaProdBindings.POSITIONS_FILTER_ID) {
((FilterPosizioneLayoutView) filterLayoutView)
.setAll(mFilterViewModel.getAllPosition())
.setAvailable(mFilterViewModel.getAvailablePosition())
.setOnFilterApplied(mFilterViewModel::setPositionFilter)
.setPreselected(
Stream.of(Objects.requireNonNull(mViewModel.getItemsInventario().getValue()))
.filter(mFilterViewModel.getCurrentPositionPredicate().get() == null ?
x -> false : Objects.requireNonNull(mFilterViewModel.getCurrentPositionPredicate().get()))
.map(ArtsInGiacenzaDTO::getPosizione)
.toList()
);
}
if (!filterLayoutView.isAdded())
filterLayoutView.show(requireActivity().getSupportFragmentManager(), "TAG");
}
public void onInfoClick(List<MvwSitArtUdcDetInventario> item) {
try {
DialogInfoGiacenzaView.newInstance(item).show(getChildFragmentManager(), DialogInfoGiacenzaView.class.getName());

View File

@ -1,13 +1,11 @@
package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod;
import androidx.databinding.ObservableArrayList;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Optional;
import com.annimon.stream.Stream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
@ -16,30 +14,19 @@ import java.util.Objects;
import java.util.stream.Collectors;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.core.exception.AlreadyAttachedDocumentToLUException;
import it.integry.integrywmsnative.core.exception.InvalidCodMdepException;
import it.integry.integrywmsnative.core.exception.InvalidLUGestioneException;
import it.integry.integrywmsnative.core.exception.NoArtsInLUException;
import it.integry.integrywmsnative.core.exception.NoLUFoundException;
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.interfaces.viewmodel_listeners.ILoadingListener;
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.model.MvwSitArtUdcDetInventario;
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.GiacenzaRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.MagazzinoAutomaticoRESTConsumer;
import it.integry.integrywmsnative.core.rest.consumers.PosizioniRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.magazzino_automatico.MagazzinoAutomaticoPutItemsRequestDTO;
import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.core.utility.UtilityPosizione;
import it.integry.integrywmsnative.core.utility.UtilityString;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
@ -162,8 +149,8 @@ public class ProdRiposizionamentoDaProdViewModel {
.map(entry -> {
List<MvwSitArtUdcDetInventario> dtoList = entry.getValue();
BigDecimal totalQtaCnf = dtoList.stream()
.map(MvwSitArtUdcDetInventario::getQtaCnf)
BigDecimal totalNumCnf = dtoList.stream()
.map(MvwSitArtUdcDetInventario::getNumCnf)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return new ArtsInGiacenzaDTO()
@ -171,7 +158,8 @@ public class ProdRiposizionamentoDaProdViewModel {
.setPartitaMag(dtoList.get(0).getPartitaMag())
.setPosizione(dtoList.get(0).getPosizione())
.setDescrizione(dtoList.get(0).getDescrizioneEstesa())
.setQtaCnf(totalQtaCnf)
.setNumOrd(dtoList.get(0).getNumOrd())
.setNumCnf(totalNumCnf)
.setCount(dtoList.size())
.setMvwSitArtUdcDetInventarioDTO(dtoList);
})

View File

@ -11,7 +11,7 @@ public class ArtsInGiacenzaDTO {
private String partitaMag;
private String descrizione;
private String posizione;
private BigDecimal qtaCnf;
private BigDecimal numCnf;
private Integer numOrd;
private Integer count;
private List<MvwSitArtUdcDetInventario> mvwSitArtUdcDetInventarioDTO;
@ -43,12 +43,12 @@ public class ArtsInGiacenzaDTO {
return this;
}
public BigDecimal getQtaCnf() {
return qtaCnf;
public BigDecimal getNumCnf() {
return numCnf;
}
public ArtsInGiacenzaDTO setQtaCnf(BigDecimal qtaCnf) {
this.qtaCnf = qtaCnf;
public ArtsInGiacenzaDTO setNumCnf(BigDecimal numCnf) {
this.numCnf = numCnf;
return this;
}

View File

@ -0,0 +1,73 @@
package it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.filter;
import androidx.databinding.ObservableField;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Stream;
import com.annimon.stream.function.Predicate;
import java.util.List;
import java.util.Objects;
import it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO;
public class ProdRiposizionamentoDaProdFilterViewModel {
private final ObservableField<Predicate<ArtsInGiacenzaDTO>> currentPositionPredicate = new ObservableField<>();
private List<ArtsInGiacenzaDTO> initialList;
private final MutableLiveData<List<ArtsInGiacenzaDTO>> currentList = new MutableLiveData<>();
public void init(List<ArtsInGiacenzaDTO> initialList){
this.initialList = initialList;
this.currentList.setValue(this.initialList);
}
public MutableLiveData<List<ArtsInGiacenzaDTO>> getCurrentList() {
return currentList;
}
public void setPositionFilter(List<String> positions){
if (positions == null || positions.isEmpty()) currentPositionPredicate.set(null);
else{
currentPositionPredicate.set(x -> positions.contains(x.getPosizione()));
}
}
public void applyAllTests(){
List<ArtsInGiacenzaDTO> returnList = null;
if (currentPositionPredicate.get() == null){
returnList = this.initialList;
}else {
Stream<ArtsInGiacenzaDTO> tmpStream = Stream.of(this.initialList)
.filter(x -> (currentPositionPredicate.get() == null || (Objects.requireNonNull(currentPositionPredicate.get()).test(x))));
returnList = tmpStream.toList();
}
this.currentList.setValue(returnList);
}
public ObservableField<Predicate<ArtsInGiacenzaDTO>> getCurrentPositionPredicate() {
return currentPositionPredicate;
}
public List<String> getAllPosition(){
return Stream
.of(initialList)
.filter(x -> x.getPosizione() != null)
.sortBy(ArtsInGiacenzaDTO::getPosizione)
.map(ArtsInGiacenzaDTO::getPosizione)
.distinct()
.toList();
}
public List<String> getAvailablePosition(){
if (currentPositionPredicate.get() == null) return getAllPosition();
else {
return Stream.of(this.initialList)
.map(ArtsInGiacenzaDTO::getPosizione)
.distinct()
.toList();
}
}
}

View File

@ -15,6 +15,10 @@
<import type="it.integry.integrywmsnative.core.utility.UtilityString" />
<import type="java.math.BigDecimal" />
<import type="it.integry.integrywmsnative.core.utility.UtilityNumber" />
<variable
name="item"
type="it.integry.integrywmsnative.gest.prod_riposizionamento_da_prod.dto.ArtsInGiacenzaDTO" />
@ -93,10 +97,12 @@
android:textStyle="bold"
tools:text="PartitaMag" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:layout_marginTop="2dp"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
@ -122,6 +128,60 @@
android:textStyle="bold"
tools:text="ped" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/AppTheme.NewMaterial.Text.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="("
android:textColor="@android:color/black"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="SmallSp"
tools:text="(" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/AppTheme.NewMaterial.Text.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{UtilityNumber.decimalToString(item.getNumCnf(), 0)}"
android:textColor="@android:color/black"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="SmallSp"
tools:text="QTA" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/AppTheme.NewMaterial.Text.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="4dp"
android:text="COL"
android:textAllCaps="true"
android:textColor="@android:color/black"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="SmallSp"
tools:text="col" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/AppTheme.NewMaterial.Text.Medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=")"
android:textColor="@android:color/black"
android:textSize="12sp"
android:textStyle="bold"
tools:ignore="SmallSp"
tools:text=")" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/info_row"
android:layout_width="22sp"
@ -144,7 +204,7 @@
style="@style/AppTheme.NewMaterial.Text.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginTop="2dp"
android:text="@{item.getDescrizione()}"
android:textColor="@android:color/black"
android:textSize="16sp"
@ -154,23 +214,31 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:paddingLeft="6dp"
android:paddingTop="2dp"
android:paddingRight="6dp"
android:paddingBottom="2dp"
style="@style/AppTheme.NewMaterial.Layout.Badge">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ordine:"
tools:text="Ordine:" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/badge4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="NumOrd"
android:background="@drawable/badge_round_corner"
android:backgroundTint="@color/red_300"
android:textColor="@android:color/white"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:layout_marginStart="8dp"
android:textStyle="bold"
android:layout_alignParentEnd="true"
android:text="@{item.getNumOrdS()}"
style="@style/AppTheme.NewMaterial.Text.Small" />
android:layout_marginStart="4dp"
tools:text="12345" />
</LinearLayout>
</RelativeLayout>

View File

@ -68,15 +68,17 @@
<item name="android:textColor">@drawable/material_text_color</item>
<item name="android:textSize">18sp</item>
</style>
<style name="AppTheme.NewMaterial.Text.Badge" parent = "AppTheme.NewMaterial">
<item name="android:fontFamily">@font/google_sans_regular</item>
<item name="android:textStyle">normal</item>
<style name="AppTheme.NewMaterial.Layout.Badge" parent = "AppTheme.NewMaterial">
<item name="android:background">@drawable/gray_detail_background_round4</item>
<item name="android:paddingStart">8dp</item>
<item name="android:paddingEnd">8dp</item>
<item name="android:paddingTop">2dp</item>
<item name="android:paddingBottom">2dp</item>
</style>
<style name="AppTheme.NewMaterial.Text.Badge" parent = "AppTheme.NewMaterial.Layout.Badge">
<item name="android:fontFamily">@font/google_sans_regular</item>
<item name="android:textStyle">normal</item>
</style>
<style name="AppTheme.NewMaterial.Text.ToolbarTitle" parent="AppTheme.NewMaterial.Text">
<item name="android:textSize">20sp</item>