Refactoring PVOrdiniAcquisto

This commit is contained in:
Giuseppe Scorrano 2022-03-02 18:28:27 +01:00
parent 62e69ad5bf
commit 37c3a1ec76
12 changed files with 675 additions and 51 deletions

558
.idea/dbnavigator.xml generated Normal file

File diff suppressed because one or more lines are too long

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.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
})

View File

@ -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<ArticoloGriglia> getArticoli(SupportSQLiteQuery query);
@Query("SELECT * FROM articoli_griglia WHERE id_griglia = :grigliaId")
List<ArticoloGriglia> getArticoliFromGriglia(int grigliaId);

View File

@ -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;
}

View File

@ -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<ArticoloGriglia> articoli, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) {
public void saveArticoliToGriglia(List<ArticoloGriglia> updatedArts, Griglia griglia, Runnable onSuccess, RunnableArgs<Exception> onFail) {
execute(() -> {
try {
List<ArticoloGriglia> toUpdate = new ArrayList<>();
List<ArticoloGriglia> toInsert = new ArrayList<>();
List<String> 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<ArticoloGriglia>) tmp.get("toInsert");
var toUpdate = (List<ArticoloGriglia>) tmp.get("toUpdate");
var codMarts = (List<String>) tmp.get("codMarts");
mArticoloGrigliaDao.insertAll(toInsert);
mArticoloGrigliaDao.updateAll(toUpdate);
List<ArticoloGriglia> articoliGriglia = mArticoloGrigliaDao.getArticoliFromGriglia(griglia.getGrigliaId());
List<ArticoloGriglia> 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<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) {
execute(() -> {
try {

View File

@ -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<T> extends OnListChangedCallback<ObservableList<T>> {
@Override
public void onItemRangeChanged(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}
@Override
public void onItemRangeInserted(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}
@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);
}
@Override
public void onItemRangeRemoved(ObservableList sender, int positionStart, int itemCount) {
public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
onChanged(sender);
}

View File

@ -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<ServiceRESTResponse<GrigliaDTO>>() {
.enqueue(new Callback<>() {
@Override
public void onResponse(Call<ServiceRESTResponse<GrigliaDTO>> call, Response<ServiceRESTResponse<GrigliaDTO>> response) {
analyzeAnswer(response, "getArticoliListino", griglia -> {
UtilityThread.executeParallel(() -> {
var startTime = new Date().getTime();
List<ArticoloDTO> listaArticoli = new ArrayList<>();
Stream.of(griglia.getGrigliaAcquistiChild())
.map(ArticoloDTO::getCodMart)
.distinct()
.withoutNulls()
.forEach(art -> {
List<ArticoloDTO> 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);

View File

@ -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));

View File

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

View File

@ -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());

View File

@ -40,7 +40,7 @@ public class OrdineAcquistoPvHelper {
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 -> {
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);
}

View File

@ -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"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/scan_art_spinner"