Finish v1.23.12(267)

This commit is contained in:
Giuseppe Scorrano 2022-03-02 18:29:20 +01:00
commit 0be1eac5fe
13 changed files with 677 additions and 53 deletions

558
.idea/dbnavigator.xml generated Normal file

File diff suppressed because one or more lines are too long

View File

@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services'
android { android {
def appVersionCode = 266 def appVersionCode = 267
def appVersionName = '1.23.11' def appVersionName = '1.23.12'
signingConfigs { signingConfigs {
release { release {

View File

@ -18,7 +18,7 @@ import it.integry.integrywmsnative.core.data_store.db.entity.Ordine;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColr; import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColr;
import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt; import it.integry.integrywmsnative.core.data_store.db.entity.SqlMtbColt;
@Database(entities = {ArticoloGriglia.class, Griglia.class, Ordine.class, ArticoloOrdine.class, SqlMtbColt.class, SqlMtbColr.class}, version = 7, exportSchema = false) @Database(entities = {ArticoloGriglia.class, Griglia.class, Ordine.class, ArticoloOrdine.class, SqlMtbColt.class, SqlMtbColr.class}, version = 8, exportSchema = false)
@TypeConverters({ @TypeConverters({
DateConverter.class DateConverter.class
}) })

View File

@ -4,7 +4,9 @@ import androidx.room.Dao;
import androidx.room.Delete; import androidx.room.Delete;
import androidx.room.Insert; import androidx.room.Insert;
import androidx.room.Query; import androidx.room.Query;
import androidx.room.RawQuery;
import androidx.room.Update; import androidx.room.Update;
import androidx.sqlite.db.SupportSQLiteQuery;
import java.util.List; import java.util.List;
@ -45,6 +47,9 @@ public interface ArticoloGrigliaDao {
@Query("SELECT articolo_griglia_id FROM articoli_griglia WHERE (cod_mart = :codMart AND bar_code =:barCode) AND id_griglia = :idGriglia LIMIT 1") @Query("SELECT articolo_griglia_id FROM articoli_griglia WHERE (cod_mart = :codMart AND bar_code =:barCode) AND id_griglia = :idGriglia LIMIT 1")
Integer getIdArticoloByGrigliaAndBarcodeAndCodMart(int idGriglia, String barCode, String codMart); Integer getIdArticoloByGrigliaAndBarcodeAndCodMart(int idGriglia, String barCode, String codMart);
@RawQuery(observedEntities = ArticoloGriglia.class)
List<ArticoloGriglia> getArticoli(SupportSQLiteQuery query);
@Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId") @Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId")
List<ArticoloGriglia> getArticoliFromGriglia(int grigliaId); List<ArticoloGriglia> getArticoliFromGriglia(int grigliaId);

View File

@ -27,7 +27,7 @@ import it.integry.integrywmsnative.core.utility.UtilityDate;
public class ArticoloGriglia { public class ArticoloGriglia {
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "articolo_griglia_id") @ColumnInfo(name = "articolo_griglia_id")
private int articoloGrigliaId; private Integer articoloGrigliaId;
@ColumnInfo(name = "cod_mart") @ColumnInfo(name = "cod_mart")
private String codMart; private String codMart;
@ -74,11 +74,11 @@ public class ArticoloGriglia {
@ColumnInfo(name = "new_no_promo") @ColumnInfo(name = "new_no_promo")
private boolean newNoPromo = false; private boolean newNoPromo = false;
public int getArticoloGrigliaId() { public Integer getArticoloGrigliaId() {
return articoloGrigliaId; return articoloGrigliaId;
} }
public void setArticoloGrigliaId(int articoloGrigliaId) { public void setArticoloGrigliaId(Integer articoloGrigliaId) {
this.articoloGrigliaId = articoloGrigliaId; this.articoloGrigliaId = articoloGrigliaId;
} }

View File

@ -5,7 +5,14 @@ import com.annimon.stream.Stream;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
@ -24,27 +31,21 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri
this.mArticoloGrigliaDao = articoloGrigliaDao; this.mArticoloGrigliaDao = articoloGrigliaDao;
} }
public void saveArticoliToGriglia(List<ArticoloGriglia> articoli, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) { public void saveArticoliToGriglia(List<ArticoloGriglia> updatedArts, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) {
execute(() -> { execute(() -> {
try { try {
List<ArticoloGriglia> toUpdate = new ArrayList<>(); var tmp = calcItemsToInsertAndUpdate(updatedArts);
List<ArticoloGriglia> toInsert = new ArrayList<>(); var toInsert = (List<ArticoloGriglia>) tmp.get("toInsert");
List<String> codMarts = new ArrayList<>(); var toUpdate = (List<ArticoloGriglia>) tmp.get("toUpdate");
for (ArticoloGriglia art : articoli) { var codMarts = (List<String>) tmp.get("codMarts");
Integer id = mArticoloGrigliaDao.getIdArticoloByGrigliaAndBarcodeAndCodMart(griglia.getGrigliaId(), art.getBarCode(), art.getCodMart());
codMarts.add(art.getCodMart());
if (id != null) {
art.setArticoloGrigliaId(id);
toUpdate.add(art);
} else {
toInsert.add(art);
}
}
mArticoloGrigliaDao.insertAll(toInsert); mArticoloGrigliaDao.insertAll(toInsert);
mArticoloGrigliaDao.updateAll(toUpdate); mArticoloGrigliaDao.updateAll(toUpdate);
List<ArticoloGriglia> articoliGriglia = mArticoloGrigliaDao.getArticoliFromGriglia(griglia.getGrigliaId()); List<ArticoloGriglia> articoliGriglia = mArticoloGrigliaDao.getArticoliFromGriglia(griglia.getGrigliaId());
List<ArticoloGriglia> toDelete = Stream.of(articoliGriglia).filter(articolo -> !codMarts.contains(articolo.getCodMart())).toList(); List<ArticoloGriglia> toDelete = Stream.of(articoliGriglia).filter(articolo -> !codMarts.contains(articolo.getCodMart())).toList();
mArticoloGrigliaDao.deleteList(toDelete); mArticoloGrigliaDao.deleteList(toDelete);
onSuccess.run(); onSuccess.run();
} catch (Exception e) { } catch (Exception e) {
onFail.run(e); onFail.run(e);
@ -52,6 +53,52 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri
}); });
} }
private HashMap<String, Object> calcItemsToInsertAndUpdate(List<ArticoloGriglia> updatedArts) throws InterruptedException, ExecutionException {
var toInsert = new ArrayList<ArticoloGriglia>();
var toUpdate = new ArrayList<ArticoloGriglia>();
var codMarts = new ArrayList<String>();
int cores = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(cores);
List<Callable<ArticoloGriglia>> calls = new ArrayList<>();
for (int i = 0; i < updatedArts.size(); i++) {
int finalI = i;
Callable<ArticoloGriglia> callableTask = () -> {
var updatedArt = updatedArts.get(finalI);
Integer id = mArticoloGrigliaDao.getIdArticoloByGrigliaAndBarcodeAndCodMart(updatedArt.getIdGriglia(), updatedArt.getBarCode(), updatedArt.getCodMart());
if (id != null) {
updatedArt.setArticoloGrigliaId(id);
}
return updatedArt;
};
calls.add(callableTask);
}
List<Future<ArticoloGriglia>> futures = executor.invokeAll(calls, Long.MAX_VALUE, TimeUnit.MILLISECONDS);
for (Future<ArticoloGriglia> future : futures) {
if (future.isDone()) {
codMarts.add(future.get().getCodMart());
if (future.get().getArticoloGrigliaId() == null) toInsert.add(future.get());
else toUpdate.add(future.get());
} else {
future.cancel(true);
}
}
var tmp = new HashMap<String, Object>();
tmp.put("toInsert", toInsert);
tmp.put("toUpdate", toUpdate);
tmp.put("codMarts", codMarts);
return tmp;
}
public void findArticoloByBarcodeAndGriglia(String barcode, int idGriglia, RunnableArgs<ArticoloGriglia> onSuccess, RunnableArgs<Exception> onFail) { public void findArticoloByBarcodeAndGriglia(String barcode, int idGriglia, RunnableArgs<ArticoloGriglia> onSuccess, RunnableArgs<Exception> onFail) {
execute(() -> { execute(() -> {
try { try {

View File

@ -1,28 +1,28 @@
package it.integry.integrywmsnative.core.expansion; package it.integry.integrywmsnative.core.expansion;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableList; import androidx.databinding.ObservableList;
import androidx.databinding.ObservableList.OnListChangedCallback;
public abstract class OnListGeneralChangedCallback extends ObservableList.OnListChangedCallback { public abstract class OnListGeneralChangedCallback<T> extends OnListChangedCallback<ObservableList<T>> {
@Override @Override
public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender); onChanged(sender);
} }
@Override @Override
public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender); onChanged(sender);
} }
@Override @Override
public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { public void onItemRangeMoved(ObservableList<T> sender, int fromPosition, int toPosition, int itemCount) {
onChanged(sender); onChanged(sender);
} }
@Override @Override
public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender); onChanged(sender);
} }

View File

@ -6,6 +6,7 @@ import com.annimon.stream.Stream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -41,32 +42,35 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer {
PVOrdiniAcquistoRESTConsumerService ordiniARestService = RESTBuilder.getService(PVOrdiniAcquistoRESTConsumerService.class); PVOrdiniAcquistoRESTConsumerService ordiniARestService = RESTBuilder.getService(PVOrdiniAcquistoRESTConsumerService.class);
ordiniARestService ordiniARestService
.getArticoliListino(codAlis) .getArticoliListino(codAlis)
.enqueue(new Callback<ServiceRESTResponse<GrigliaDTO>>() { .enqueue(new Callback<>() {
@Override @Override
public void onResponse(Call<ServiceRESTResponse<GrigliaDTO>> call, Response<ServiceRESTResponse<GrigliaDTO>> response) { public void onResponse(Call<ServiceRESTResponse<GrigliaDTO>> call, Response<ServiceRESTResponse<GrigliaDTO>> response) {
analyzeAnswer(response, "getArticoliListino", griglia -> { analyzeAnswer(response, "getArticoliListino", griglia -> {
UtilityThread.executeParallel(() -> { UtilityThread.executeParallel(() -> {
var startTime = new Date().getTime();
List<ArticoloDTO> listaArticoli = new ArrayList<>(); List<ArticoloDTO> listaArticoli = new ArrayList<>();
Stream.of(griglia.getGrigliaAcquistiChild()) Stream.of(griglia.getGrigliaAcquistiChild())
.map(ArticoloDTO::getCodMart) .groupBy(ArticoloDTO::getCodMart)
.distinct() .forEach(entry -> {
.withoutNulls()
.forEach(art -> { if(entry.getValue().size() == 1) {
List<ArticoloDTO> inList = Stream.of(griglia.getGrigliaAcquistiChild()) listaArticoli.add(entry.getValue().get(0));
.filter(x -> x.getCodMart().equalsIgnoreCase(art)) } else {
.toList(); for (ArticoloDTO articolo : entry.getValue()) {
if (inList.size() > 1) {
for (ArticoloDTO articolo : inList) {
if (!articolo.getBarCode().endsWith(articolo.getCodMart())) { if (!articolo.getBarCode().endsWith(articolo.getCodMart())) {
listaArticoli.add(articolo); listaArticoli.add(articolo);
} }
} }
} else {
listaArticoli.add(inList.get(0));
} }
}); });
griglia.setGrigliaAcquistiChild(listaArticoli); griglia.setGrigliaAcquistiChild(listaArticoli);
Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime));
onSuccess.run(griglia); onSuccess.run(griglia);
}, false); }, false);
}, onFailed); }, onFailed);

View File

@ -14,6 +14,7 @@ import androidx.databinding.ObservableArrayList;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import com.ravikoradiya.liveadapter.LiveAdapter;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@ -21,6 +22,7 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import it.integry.barcode_base_android_library.model.BarcodeScanDTO; import it.integry.barcode_base_android_library.model.BarcodeScanDTO;
import it.integry.integrywmsnative.BR;
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.BarcodeCallbackDTO;
@ -34,7 +36,6 @@ import it.integry.integrywmsnative.core.settings.SettingsManager;
import it.integry.integrywmsnative.core.utility.UtilityDate; import it.integry.integrywmsnative.core.utility.UtilityDate;
import it.integry.integrywmsnative.databinding.ActivityPvOrdineAcquistoEditBinding; import it.integry.integrywmsnative.databinding.ActivityPvOrdineAcquistoEditBinding;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloView; import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.dialog.DialogEditArticoloView;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListAdapter;
import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListModel; import it.integry.integrywmsnative.gest.pv_ordine_acquisto_edit.ui.OrdineAcquistoArtListModel;
import it.integry.integrywmsnative.ui.FabMenuCustomAnimations; import it.integry.integrywmsnative.ui.FabMenuCustomAnimations;
import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration;
@ -133,16 +134,20 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi
} }
private void initRecyclerView() { private void initRecyclerView() {
this.mViewModel.getArticoli().observe(this, updatedData -> { // this.mViewModel.getArticoli().observe(this, updatedData -> {
this.mArticoliMutableData.clear(); // this.mArticoliMutableData.clear();
this.mArticoliMutableData.addAll(convertDataModelToListModel(updatedData)); // this.mArticoliMutableData.addAll(convertDataModelToListModel(updatedData));
// this.noItemsToPick.set(!isThereAnyItemToPick(updatedData)); //// this.noItemsToPick.set(!isThereAnyItemToPick(updatedData));
}); // });
var mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoliMutableData) // var mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoliMutableData)
.setOnItemClicked(this::selectAction); // .setOnItemClicked(this::selectAction);
mBinding.articoliOrdineList.setAdapter(mAdapter); var liveAdapter = new LiveAdapter(this.mViewModel.getArticoli(), this, BR.articolo)
.map(ArticoloOrdine.class, R.layout.fragment_pv_articoli_ordine_acquisto__list_single_item)
.into(mBinding.articoliOrdineList);
// mBinding.articoliOrdineList.setAdapter(mAdapter);
mBinding.articoliOrdineList.setHasFixedSize(true); mBinding.articoliOrdineList.setHasFixedSize(true);
mBinding.articoliOrdineList.setLayoutManager(new LinearLayoutManager(this)); mBinding.articoliOrdineList.setLayoutManager(new LinearLayoutManager(this));

View File

@ -22,7 +22,6 @@ public class PVOrdineAcquistoEditModule {
} }
@Provides @Provides
@Singleton
PVOrdineAcquistoEditViewModel providesPvOrdineAcquistoEditViewModel(OrdineRepository ordineRepository, PVOrdineAcquistoEditViewModel providesPvOrdineAcquistoEditViewModel(OrdineRepository ordineRepository,
GrigliaRepository grigliaRepository, GrigliaRepository grigliaRepository,
ArticoliOrdineRepository articoliOrdineRepository, ArticoliOrdineRepository articoliOrdineRepository,

View File

@ -90,7 +90,7 @@ public class PVOrdineAcquistoEditViewModel {
var newList = this.mArticoli.getValue(); var newList = this.mArticoli.getValue();
var alreadySavedItem = Stream.of(newList) var alreadySavedItem = Stream.of(newList)
.filter(x -> Objects.equals(x.getArticoloOrdineId(), articolo.getArticoloOrdineId())) .filter(x -> Objects.equals(x.getCodMart(), articolo.getCodMart()))
.findFirst(); .findFirst();
if(alreadySavedItem.isPresent()) newList.remove(alreadySavedItem.get()); if(alreadySavedItem.isPresent()) newList.remove(alreadySavedItem.get());

View File

@ -40,7 +40,7 @@ public class OrdineAcquistoPvHelper {
updateGriglia(griglia, onSave, onFail); updateGriglia(griglia, onSave, onFail);
} }
public void updateGriglia(Griglia griglia, RunnableArgs<Griglia> onSave, RunnableArgs<Exception> onFail) { public void updateGriglia(Griglia griglia, RunnableArgs<Griglia> onSaved, RunnableArgs<Exception> onFail) {
PVOrdiniAcquistoRESTConsumer.getArticoliListinoStatic(griglia.getCodAlis(), dto -> { PVOrdiniAcquistoRESTConsumer.getArticoliListinoStatic(griglia.getCodAlis(), dto -> {
mContext.runOnUiThread(() -> { mContext.runOnUiThread(() -> {
if (dto.getGrigliaAcquistiChild().size() <= 0) { if (dto.getGrigliaAcquistiChild().size() <= 0) {
@ -50,7 +50,13 @@ public class OrdineAcquistoPvHelper {
griglia.setDescrLisa(dto.getDescrLisa()); griglia.setDescrLisa(dto.getDescrLisa());
griglia.setDescrDepo(dto.getDescrDepo()); griglia.setDescrDepo(dto.getDescrDepo());
griglia.setCountArticoli(dto.getGrigliaAcquistiChild().size()); griglia.setCountArticoli(dto.getGrigliaAcquistiChild().size());
mGrigliaRepository.saveGriglia(griglia, id -> saveLisAToGriglia(dto.getGrigliaAcquistiChild(), griglia, onSave, onFail), onFail);
mGrigliaRepository.saveGriglia(griglia, id -> {
saveLisAToGriglia(dto.getGrigliaAcquistiChild(), griglia, grigliaResult -> {
onSaved.run(grigliaResult);
}, onFail);
}, onFail);
}); });
}, onFail); }, onFail);
} }

View File

@ -155,7 +155,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="92dp"
android:paddingStart="2dp" android:paddingStart="2dp"
android:paddingEnd="2dp" android:paddingEnd="2dp"
android:clipToPadding="false" android:clipToPadding="false"
@ -163,7 +162,8 @@
android:scrollbars="vertical" android:scrollbars="vertical"
app:layout_constraintTop_toBottomOf="@id/header_content" app:layout_constraintTop_toBottomOf="@id/header_content"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/scan_art_spinner" android:id="@+id/scan_art_spinner"