diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 00000000..7b943652 --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a34d8852..45e84b2f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ apply plugin: 'com.google.gms.google-services' android { - def appVersionCode = 266 - def appVersionName = '1.23.11' + def appVersionCode = 267 + def appVersionName = '1.23.12' signingConfigs { release { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/AppDatabase.java b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/AppDatabase.java index 89343310..950e296f 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/AppDatabase.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/AppDatabase.java @@ -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.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({ DateConverter.class }) diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/dao/ArticoloGrigliaDao.java b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/dao/ArticoloGrigliaDao.java index 7e5d5d74..9480717b 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/dao/ArticoloGrigliaDao.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/dao/ArticoloGrigliaDao.java @@ -4,7 +4,9 @@ import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; +import androidx.room.RawQuery; import androidx.room.Update; +import androidx.sqlite.db.SupportSQLiteQuery; 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") Integer getIdArticoloByGrigliaAndBarcodeAndCodMart(int idGriglia, String barCode, String codMart); + @RawQuery(observedEntities = ArticoloGriglia.class) + List getArticoli(SupportSQLiteQuery query); + @Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId") List getArticoliFromGriglia(int grigliaId); diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/entity/ArticoloGriglia.java b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/entity/ArticoloGriglia.java index f28a2434..2a109a0c 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/entity/ArticoloGriglia.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/entity/ArticoloGriglia.java @@ -27,7 +27,7 @@ import it.integry.integrywmsnative.core.utility.UtilityDate; public class ArticoloGriglia { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "articolo_griglia_id") - private int articoloGrigliaId; + private Integer articoloGrigliaId; @ColumnInfo(name = "cod_mart") private String codMart; @@ -74,11 +74,11 @@ public class ArticoloGriglia { @ColumnInfo(name = "new_no_promo") private boolean newNoPromo = false; - public int getArticoloGrigliaId() { + public Integer getArticoloGrigliaId() { return articoloGrigliaId; } - public void setArticoloGrigliaId(int articoloGrigliaId) { + public void setArticoloGrigliaId(Integer articoloGrigliaId) { this.articoloGrigliaId = articoloGrigliaId; } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/repository/implementations/ArticoliGrigliaDataSource.java b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/repository/implementations/ArticoliGrigliaDataSource.java index d47945ed..da7ecbeb 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/repository/implementations/ArticoliGrigliaDataSource.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/data_store/db/repository/implementations/ArticoliGrigliaDataSource.java @@ -5,7 +5,14 @@ import com.annimon.stream.Stream; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.HashMap; 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; @@ -24,27 +31,21 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri this.mArticoloGrigliaDao = articoloGrigliaDao; } - public void saveArticoliToGriglia(List articoli, Griglia griglia, Runnable onSuccess, RunnableArgs onFail) { + public void saveArticoliToGriglia(List updatedArts, Griglia griglia, Runnable onSuccess, RunnableArgs onFail) { execute(() -> { try { - List toUpdate = new ArrayList<>(); - List toInsert = new ArrayList<>(); - List codMarts = new ArrayList<>(); - for (ArticoloGriglia art : articoli) { - 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); - } - } + var tmp = calcItemsToInsertAndUpdate(updatedArts); + var toInsert = (List) tmp.get("toInsert"); + var toUpdate = (List) tmp.get("toUpdate"); + var codMarts = (List) tmp.get("codMarts"); + mArticoloGrigliaDao.insertAll(toInsert); mArticoloGrigliaDao.updateAll(toUpdate); + List articoliGriglia = mArticoloGrigliaDao.getArticoliFromGriglia(griglia.getGrigliaId()); List toDelete = Stream.of(articoliGriglia).filter(articolo -> !codMarts.contains(articolo.getCodMart())).toList(); mArticoloGrigliaDao.deleteList(toDelete); + onSuccess.run(); } catch (Exception e) { onFail.run(e); @@ -52,6 +53,52 @@ public class ArticoliGrigliaDataSource extends Repository implements ArticoloGri }); } + private HashMap calcItemsToInsertAndUpdate(List updatedArts) throws InterruptedException, ExecutionException { + var toInsert = new ArrayList(); + var toUpdate = new ArrayList(); + var codMarts = new ArrayList(); + + int cores = Runtime.getRuntime().availableProcessors(); + ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(cores); + List> calls = new ArrayList<>(); + + for (int i = 0; i < updatedArts.size(); i++) { + int finalI = i; + Callable 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> futures = executor.invokeAll(calls, Long.MAX_VALUE, TimeUnit.MILLISECONDS); + + for (Future 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(); + + tmp.put("toInsert", toInsert); + tmp.put("toUpdate", toUpdate); + tmp.put("codMarts", codMarts); + + return tmp; + } + public void findArticoloByBarcodeAndGriglia(String barcode, int idGriglia, RunnableArgs onSuccess, RunnableArgs onFail) { execute(() -> { try { diff --git a/app/src/main/java/it/integry/integrywmsnative/core/expansion/OnListGeneralChangedCallback.java b/app/src/main/java/it/integry/integrywmsnative/core/expansion/OnListGeneralChangedCallback.java index b8d387b1..014be5be 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/expansion/OnListGeneralChangedCallback.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/expansion/OnListGeneralChangedCallback.java @@ -1,28 +1,28 @@ package it.integry.integrywmsnative.core.expansion; -import androidx.databinding.ObservableArrayList; import androidx.databinding.ObservableList; +import androidx.databinding.ObservableList.OnListChangedCallback; -public abstract class OnListGeneralChangedCallback extends ObservableList.OnListChangedCallback { +public abstract class OnListGeneralChangedCallback extends OnListChangedCallback> { @Override - public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { + public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) { onChanged(sender); } @Override - public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { + public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) { onChanged(sender); } @Override - public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { + public void onItemRangeMoved(ObservableList sender, int fromPosition, int toPosition, int itemCount) { onChanged(sender); } @Override - public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { + public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) { onChanged(sender); } diff --git a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java index 41f2105c..c335508e 100644 --- a/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java +++ b/app/src/main/java/it/integry/integrywmsnative/core/rest/consumers/PVOrdiniAcquistoRESTConsumer.java @@ -6,6 +6,7 @@ import com.annimon.stream.Stream; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import java.util.List; import javax.inject.Singleton; @@ -41,32 +42,35 @@ public class PVOrdiniAcquistoRESTConsumer extends _BaseRESTConsumer { PVOrdiniAcquistoRESTConsumerService ordiniARestService = RESTBuilder.getService(PVOrdiniAcquistoRESTConsumerService.class); ordiniARestService .getArticoliListino(codAlis) - .enqueue(new Callback>() { + .enqueue(new Callback<>() { @Override public void onResponse(Call> call, Response> response) { analyzeAnswer(response, "getArticoliListino", griglia -> { UtilityThread.executeParallel(() -> { + var startTime = new Date().getTime(); + List listaArticoli = new ArrayList<>(); + Stream.of(griglia.getGrigliaAcquistiChild()) - .map(ArticoloDTO::getCodMart) - .distinct() - .withoutNulls() - .forEach(art -> { - List inList = Stream.of(griglia.getGrigliaAcquistiChild()) - .filter(x -> x.getCodMart().equalsIgnoreCase(art)) - .toList(); - if (inList.size() > 1) { - for (ArticoloDTO articolo : inList) { + .groupBy(ArticoloDTO::getCodMart) + .forEach(entry -> { + + if(entry.getValue().size() == 1) { + listaArticoli.add(entry.getValue().get(0)); + } else { + for (ArticoloDTO articolo : entry.getValue()) { if (!articolo.getBarCode().endsWith(articolo.getCodMart())) { listaArticoli.add(articolo); } } - } else { - listaArticoli.add(inList.get(0)); } + }); + griglia.setGrigliaAcquistiChild(listaArticoli); + + Log.d("LOADING TIME 1", "MS: " + (new Date().getTime() - startTime)); onSuccess.run(griglia); }, false); }, onFailed); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java index e5c792f3..24a065d6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditActivity.java @@ -14,6 +14,7 @@ import androidx.databinding.ObservableArrayList; import androidx.recyclerview.widget.LinearLayoutManager; import com.annimon.stream.Stream; +import com.ravikoradiya.liveadapter.LiveAdapter; import java.math.BigDecimal; import java.util.List; @@ -21,6 +22,7 @@ import java.util.List; import javax.inject.Inject; import it.integry.barcode_base_android_library.model.BarcodeScanDTO; +import it.integry.integrywmsnative.BR; import it.integry.integrywmsnative.MainApplication; import it.integry.integrywmsnative.R; 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.databinding.ActivityPvOrdineAcquistoEditBinding; 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.ui.FabMenuCustomAnimations; import it.integry.integrywmsnative.ui.SimpleDividerItemDecoration; @@ -133,16 +134,20 @@ public class PVOrdineAcquistoEditActivity extends BaseActivity implements PVOrdi } private void initRecyclerView() { - this.mViewModel.getArticoli().observe(this, updatedData -> { - this.mArticoliMutableData.clear(); - this.mArticoliMutableData.addAll(convertDataModelToListModel(updatedData)); -// this.noItemsToPick.set(!isThereAnyItemToPick(updatedData)); - }); +// this.mViewModel.getArticoli().observe(this, updatedData -> { +// this.mArticoliMutableData.clear(); +// this.mArticoliMutableData.addAll(convertDataModelToListModel(updatedData)); +//// this.noItemsToPick.set(!isThereAnyItemToPick(updatedData)); +// }); - var mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoliMutableData) - .setOnItemClicked(this::selectAction); +// var mAdapter = new OrdineAcquistoArtListAdapter(this, mArticoliMutableData) +// .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.setLayoutManager(new LinearLayoutManager(this)); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditModule.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditModule.java index cc5271e0..d81cd2f6 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditModule.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditModule.java @@ -22,7 +22,6 @@ public class PVOrdineAcquistoEditModule { } @Provides - @Singleton PVOrdineAcquistoEditViewModel providesPvOrdineAcquistoEditViewModel(OrdineRepository ordineRepository, GrigliaRepository grigliaRepository, ArticoliOrdineRepository articoliOrdineRepository, diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditViewModel.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditViewModel.java index 51b25773..027e94ca 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditViewModel.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordine_acquisto_edit/PVOrdineAcquistoEditViewModel.java @@ -90,7 +90,7 @@ public class PVOrdineAcquistoEditViewModel { var newList = this.mArticoli.getValue(); var alreadySavedItem = Stream.of(newList) - .filter(x -> Objects.equals(x.getArticoloOrdineId(), articolo.getArticoloOrdineId())) + .filter(x -> Objects.equals(x.getCodMart(), articolo.getCodMart())) .findFirst(); if(alreadySavedItem.isPresent()) newList.remove(alreadySavedItem.get()); diff --git a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/helper/OrdineAcquistoPvHelper.java b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/helper/OrdineAcquistoPvHelper.java index 051bd880..5c6e5aff 100644 --- a/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/helper/OrdineAcquistoPvHelper.java +++ b/app/src/main/java/it/integry/integrywmsnative/gest/pv_ordini_acquisto/helper/OrdineAcquistoPvHelper.java @@ -40,7 +40,7 @@ public class OrdineAcquistoPvHelper { updateGriglia(griglia, onSave, onFail); } - public void updateGriglia(Griglia griglia, RunnableArgs onSave, RunnableArgs onFail) { + public void updateGriglia(Griglia griglia, RunnableArgs onSaved, RunnableArgs onFail) { PVOrdiniAcquistoRESTConsumer.getArticoliListinoStatic(griglia.getCodAlis(), dto -> { mContext.runOnUiThread(() -> { if (dto.getGrigliaAcquistiChild().size() <= 0) { @@ -50,7 +50,13 @@ public class OrdineAcquistoPvHelper { griglia.setDescrLisa(dto.getDescrLisa()); griglia.setDescrDepo(dto.getDescrDepo()); 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); } diff --git a/app/src/main/res/layout/activity_pv_ordine_acquisto_edit.xml b/app/src/main/res/layout/activity_pv_ordine_acquisto_edit.xml index c637ec46..0eafc37c 100644 --- a/app/src/main/res/layout/activity_pv_ordine_acquisto_edit.xml +++ b/app/src/main/res/layout/activity_pv_ordine_acquisto_edit.xml @@ -155,7 +155,6 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="16dp" - android:layout_marginBottom="92dp" android:paddingStart="2dp" android:paddingEnd="2dp" android:clipToPadding="false" @@ -163,7 +162,8 @@ android:scrollbars="vertical" app:layout_constraintTop_toBottomOf="@id/header_content" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/>