Rimosso da VerificaGiacenze il carcamento di tutta la gacenza dopo aver scansionato il deposito

This commit is contained in:
Marco Elefante 2025-12-10 13:33:44 +01:00
parent 9924165362
commit 8e2d110792
6 changed files with 92 additions and 144 deletions

View File

@ -276,8 +276,8 @@ public class MainApplicationModule {
@Provides
@Singleton
GiacenzaPvRESTConsumer provideGiacenzaPvRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
return new GiacenzaPvRESTConsumer(restBuilder, executorService);
GiacenzaPvRESTConsumer provideGiacenzaPvRESTConsumer(RESTBuilder restBuilder) {
return new GiacenzaPvRESTConsumer(restBuilder);
}
@Provides

View File

@ -13,23 +13,17 @@ import it.integry.integrywmsnative.core.rest.model.pv.UpdateRowVerificaRequestDT
public class GiacenzaPvRESTConsumer extends _BaseRESTConsumer {
private final RESTBuilder restBuilder;
private final ExecutorService executorService;
public GiacenzaPvRESTConsumer(RESTBuilder restBuilder, ExecutorService executorService) {
public GiacenzaPvRESTConsumer(RESTBuilder restBuilder) {
this.restBuilder = restBuilder;
this.executorService = executorService;
}
public List<GiacenzaPvDTO> retrieveGiacenzeSynchronized(String codMdep) throws Exception {
public List<GiacenzaPvDTO> retrieveGiacenzeSynchronized(String codMdep, String codMart) throws Exception {
GiacenzaPvRESTConsumerService giacenzaPvRESTConsumerService = restBuilder.getService(GiacenzaPvRESTConsumerService.class, 120);
var response = giacenzaPvRESTConsumerService.retrieve(codMdep)
.execute();
var response = giacenzaPvRESTConsumerService.retrieve(codMdep, codMart).execute();
var giacenzeList = analyzeAnswer(response, "retrieve-giacenze-pv");
return giacenzeList != null ? giacenzeList : new ArrayList<>();
}
@ -64,5 +58,4 @@ public class GiacenzaPvRESTConsumer extends _BaseRESTConsumer {
analyzeAnswer(response, "close-verifica-pv");
}
}

View File

@ -17,8 +17,7 @@ import retrofit2.http.Query;
public interface GiacenzaPvRESTConsumerService {
@GET("wms/pv/verifica_giacenze/retrieve")
Call<ServiceRESTResponse<List<GiacenzaPvDTO>>> retrieve(@Query("codMdep") String codMdep);
Call<ServiceRESTResponse<List<GiacenzaPvDTO>>> retrieve(@Query("codMdep") String codMdep, @Query("codMart") String codMart);
@POST("wms/pv/verifica_giacenze/save_new_row")
Call<ServiceRESTResponse<Void>> saveNewRowVerifica(@Body SaveNewRowVerificaRequestDTO saveNewRowVerificaRequest);

View File

@ -13,6 +13,7 @@ import com.ravikoradiya.liveadapter.Type;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
@ -38,6 +39,7 @@ import it.integry.integrywmsnative.view.bottom_sheet__item_edit.BottomSheetItemD
import it.integry.integrywmsnative.view.bottom_sheet__item_edit.BottomSheetItemEditView;
import it.integry.integrywmsnative.view.dialogs.DialogConsts;
import it.integry.integrywmsnative.view.dialogs.ask_deposito.DialogAskDepositoView;
import it.integry.integrywmsnative.view.dialogs.choose_art_from_lista_arts.DialogChooseArtFromListaArtsView;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2DTO;
import it.integry.integrywmsnative.view.dialogs.input_quantity_v2.DialogInputQuantityV2View;
import it.integry.integrywmsnative.view.dialogs.yes_no.DialogYesNoView;
@ -91,7 +93,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
}
private void init() {
executorService.execute(() -> {
boolean recoveredSession = false;
@ -129,7 +130,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
try {
this.onLoadingStarted();
mViewModel.loadDeposito(codMdep);
if (!recoveredSession) mViewModel.createNew(codMdep);
@ -162,7 +162,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
CountDownLatch countDownLatch = new CountDownLatch(1);
AtomicReference<String> codMdepAtomic = new AtomicReference<>();
DialogAskDepositoView.newInstance(codMdep -> {
codMdepAtomic.set(codMdep);
countDownLatch.countDown();
@ -173,7 +172,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
return codMdepAtomic.get();
}
private void initRecyclerView() {
var itemType = new Type<VerificaGiacenzeRowEntity, ListaVerificaGiacenzePickedItemListModelBinding>(R.layout.lista_verifica_giacenze_picked_item_list_model, BR.item);
@ -213,13 +211,12 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
this.mViewModel.processBarcodeDTO(data);
} catch (Exception e) {
this.onError(e);
} finally {
handler.post(this::onLoadingEnded);
}
});
this.onLoadingEnded();
};
private void openItemAction(VerificaGiacenzeRowEntity item) {
var anagrafica = mViewModel.searchAnagraficaByCodMart(item.getCodMart());
@ -261,7 +258,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
});
}
public PickedQuantityDTO onItemDispatched(MtbAart mtbAart,
BigDecimal initialNumCnf,
BigDecimal initialQtaCnf,
@ -338,7 +334,6 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
});
}
@Override
public void onDestroy() {
super.onDestroy();
@ -350,4 +345,10 @@ public class VerificaGiacenzeFragment extends BaseFragment implements ITitledFra
public void onCreateActionBar(AppCompatTextView titleText, Context context) {
titleText.setText(R.string.verifica_giacenze_menu);
}
@Override
public void onChooseArtRequest(List<MtbAart> artsList, RunnableArgs<MtbAart> onComplete) {
DialogChooseArtFromListaArtsView.newInstance(true, artsList, onComplete)
.show(requireActivity().getSupportFragmentManager(), "dialog-choose-art");
}
}

View File

@ -16,8 +16,8 @@ import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
public class VerificaGiacenzeModule {
@Provides
VerificaGiacenzeViewModel providesVerificaGiacenzeViewModel(ExecutorService executorService, Handler handler, VerificaGiacenzeRowMapper verificaGiacenzeRowMapper, VerificaGiacenzeRepository verificaGiacenzeRepository, VerificaGiacenzeRowRepository verificaGiacenzeRowRepository, GiacenzaPvRESTConsumer giacenzaPvRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
return new VerificaGiacenzeViewModel(executorService, handler, verificaGiacenzeRowMapper, giacenzaPvRESTConsumer, verificaGiacenzeRepository, verificaGiacenzeRowRepository, articoloRESTConsumer);
VerificaGiacenzeViewModel providesVerificaGiacenzeViewModel(Handler handler, VerificaGiacenzeRowMapper verificaGiacenzeRowMapper, VerificaGiacenzeRepository verificaGiacenzeRepository, VerificaGiacenzeRowRepository verificaGiacenzeRowRepository, GiacenzaPvRESTConsumer giacenzaPvRESTConsumer, ArticoloRESTConsumer articoloRESTConsumer) {
return new VerificaGiacenzeViewModel(handler, verificaGiacenzeRowMapper, giacenzaPvRESTConsumer, verificaGiacenzeRepository, verificaGiacenzeRowRepository, articoloRESTConsumer);
}
}

View File

@ -11,8 +11,8 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Inject;
@ -22,8 +22,8 @@ import it.integry.integrywmsnative.core.data_store.db.entity.VerificaGiacenzeRow
import it.integry.integrywmsnative.core.data_store.db.respository_new.VerificaGiacenzeRepository;
import it.integry.integrywmsnative.core.data_store.db.respository_new.VerificaGiacenzeRowRepository;
import it.integry.integrywmsnative.core.exception.NoArtsFoundException;
import it.integry.integrywmsnative.core.expansion.RunnableArgs;
import it.integry.integrywmsnative.core.interfaces.viewmodel_listeners.ILoadingListener;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeMapper;
import it.integry.integrywmsnative.core.mapper.VerificaGiacenzeRowMapper;
import it.integry.integrywmsnative.core.model.MtbAart;
import it.integry.integrywmsnative.core.rest.consumers.ArticoloRESTConsumer;
@ -31,7 +31,6 @@ import it.integry.integrywmsnative.core.rest.consumers.GiacenzaPvRESTConsumer;
import it.integry.integrywmsnative.core.rest.model.Ean13PesoModel;
import it.integry.integrywmsnative.core.rest.model.pv.CloseVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.DeleteRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.GiacenzaPvDTO;
import it.integry.integrywmsnative.core.rest.model.pv.SaveNewRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.rest.model.pv.UpdateRowVerificaRequestDTO;
import it.integry.integrywmsnative.core.utility.UtilityBarcode;
@ -39,8 +38,6 @@ import it.integry.integrywmsnative.core.utility.UtilityBigDecimal;
import it.integry.integrywmsnative.gest.spedizione.model.PickedQuantityDTO;
public class VerificaGiacenzeViewModel {
private final ExecutorService executorService;
private final Handler handler;
private final VerificaGiacenzeRowMapper verificaGiacenzeRowMapper;
private final GiacenzaPvRESTConsumer giacenzaPvRESTConsumer;
@ -50,21 +47,17 @@ public class VerificaGiacenzeViewModel {
private Listener listener;
private MutableLiveData<VerificaGiacenzeEntity> currentVerifica = new MutableLiveData<>();
private final MutableLiveData<VerificaGiacenzeEntity> currentVerifica = new MutableLiveData<>();
private final MutableLiveData<List<VerificaGiacenzeRowEntity>> currentVerificaRows = new MutableLiveData<>(new ArrayList<>());
private List<GiacenzaPvDTO> currentLoadedGiacenza = null;
private List<MtbAart> currentLoadedAnagrafiche = null;
private List<MtbAart> currentLoadedAnagrafiche = new ArrayList<>();
@Inject
public VerificaGiacenzeViewModel(ExecutorService executorService,
Handler handler,
public VerificaGiacenzeViewModel(Handler handler,
VerificaGiacenzeRowMapper verificaGiacenzeRowMapper,
GiacenzaPvRESTConsumer giacenzaPvRESTConsumer,
VerificaGiacenzeRepository verificaGiacenzeRepository,
VerificaGiacenzeRowRepository verificaGiacenzeRowRepository,
ArticoloRESTConsumer articoloRESTConsumer) {
this.executorService = executorService;
this.handler = handler;
this.verificaGiacenzeRowMapper = verificaGiacenzeRowMapper;
this.giacenzaPvRESTConsumer = giacenzaPvRESTConsumer;
@ -87,8 +80,7 @@ public class VerificaGiacenzeViewModel {
currentVerifica.postValue(null);
currentVerificaRows.postValue(new ArrayList<>());
currentLoadedGiacenza = null;
currentLoadedAnagrafiche = null;
currentLoadedAnagrafiche = new ArrayList<>();
}
public LiveData<VerificaGiacenzeEntity> getCurrentVerifica() {
@ -99,60 +91,6 @@ public class VerificaGiacenzeViewModel {
return currentVerificaRows;
}
public void loadDeposito(String codMdep) throws Exception {
currentLoadedGiacenza = this.giacenzaPvRESTConsumer.retrieveGiacenzeSynchronized(codMdep);
if (currentLoadedGiacenza == null) {
throw new Exception("Errore nel recupero delle giacenze");
}
var codMartsToRetrieve = currentLoadedGiacenza.parallelStream()
.map(GiacenzaPvDTO::getCodMart)
.collect(Collectors.toUnmodifiableList());
currentLoadedAnagrafiche = this.articoloRESTConsumer.getByCodMartsSynchronized(codMartsToRetrieve);
if (currentLoadedAnagrafiche == null) {
throw new Exception("Errore nel recupero delle anagrafiche");
}
currentLoadedAnagrafiche.forEach(x -> x.setFlagTracciabilita("N"));
}
public void randomizeElements(int elementsCount) {
for (int i = 0; i < elementsCount; i++) {
var randomIndex = (int) (Math.random() * currentLoadedAnagrafiche.size());
var randomAnagrafica = currentLoadedAnagrafiche.get(randomIndex);
var foundGiacenza = currentLoadedGiacenza.parallelStream()
.filter(x -> x.getCodMart().equalsIgnoreCase(randomAnagrafica.getCodMart()))
.findFirst()
.orElse(null);
var qtaGiacenza = foundGiacenza != null ? foundGiacenza.getQtaInv() : BigDecimal.ZERO;
var rowToInsert = new VerificaGiacenzeRowEntity();
rowToInsert.setParentId(currentVerifica.getValue().getId());
rowToInsert.setCodMart(randomAnagrafica.getCodMart());
rowToInsert.setDescrizione(randomAnagrafica.getDescrizione());
rowToInsert.setScanCodBarre(randomAnagrafica.getBarCode());
rowToInsert.setNumConf(BigDecimal.valueOf((int) (Math.random() * 100)));
rowToInsert.setQtaConf(randomAnagrafica.getQtaCnf());
rowToInsert.setQta(UtilityBigDecimal.multiply(rowToInsert.getNumConf(), randomAnagrafica.getQtaCnf()));
rowToInsert.setQtaInGiacenza(qtaGiacenza);
insertRow(rowToInsert);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public void createNew(String codMdep) {
var verificaGiacenzeEntity = new VerificaGiacenzeEntity();
verificaGiacenzeEntity.setCodMdep(codMdep);
@ -172,7 +110,7 @@ public class VerificaGiacenzeViewModel {
}
public void close() throws Exception {
if (currentVerificaRows.getValue().isEmpty()) {
if (currentVerificaRows.getValue() == null || currentVerificaRows.getValue().isEmpty()) {
delete();
return;
}
@ -187,32 +125,52 @@ public class VerificaGiacenzeViewModel {
}
public void processBarcodeDTO(BarcodeScanDTO barcodeScanDTO) throws Exception {
if (UtilityBarcode.isEanPeso(barcodeScanDTO)) {
var ean13 = Ean13PesoModel.fromBarcode(barcodeScanDTO.getStringValue());
this.loadArticolo(ean13.getPrecode());
} else {
this.loadArticolo(barcodeScanDTO.getStringValue());
}
}
private void loadArticolo(String barcodeProd) throws Exception {
var mtbAartList = this.articoloRESTConsumer.searchByBarcodeSynchronized(barcodeProd);
private void loadArticolo(String barcodeProd) throws NoArtsFoundException, CloneNotSupportedException {
var foundMtbAart = searchAnagraficaByBarcode(barcodeProd);
if (mtbAartList != null && !mtbAartList.isEmpty()) {
MtbAart loadedArticolo;
if (foundMtbAart == null)
throw new NoArtsFoundException();
if (mtbAartList.size() == 1) loadedArticolo = mtbAartList.get(0);
else loadedArticolo = this.sendChooseArtRequest(mtbAartList);
loadArticolo(foundMtbAart);
if (loadedArticolo == null) return;
loadedArticolo.setFlagTracciabilita("N");
this.updateCurrentAnagrafiche(loadedArticolo);
this.loadArticolo(loadedArticolo);
} else throw new NoArtsFoundException();
}
public void loadArticolo(MtbAart mtbAart) throws NoArtsFoundException, CloneNotSupportedException {
var foundGiacenza = currentLoadedGiacenza.parallelStream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()))
private void updateCurrentAnagrafiche(MtbAart loadedArticolo) {
MtbAart mtbAart = currentLoadedAnagrafiche.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(loadedArticolo.getCodMart()))
.findFirst()
.orElse(null);
if (mtbAart != null) currentLoadedAnagrafiche.remove(mtbAart);
currentLoadedAnagrafiche.add(loadedArticolo);
}
public void loadArticolo(MtbAart mtbAart) throws Exception {
var foundGiacenzaList = giacenzaPvRESTConsumer.retrieveGiacenzeSynchronized(
Objects.requireNonNull(currentVerifica.getValue()).getCodMdep(),
mtbAart.getCodMart()
);
if (foundGiacenzaList == null || foundGiacenzaList.isEmpty() || foundGiacenzaList.stream().count() > 1)
throw new Exception("Errore nel recupero delle giacenze");
var foundGiacenza = foundGiacenzaList.get(0);
var numCnfGiacenza = foundGiacenza != null ? UtilityBigDecimal.divide(foundGiacenza.getQtaInv(), mtbAart.getQtaCnf()) : BigDecimal.ZERO;
var qtaCnfGiacenza = mtbAart.getQtaCnf();
var qtaGiacenza = foundGiacenza != null ? foundGiacenza.getQtaInv() : BigDecimal.ZERO;
@ -226,7 +184,7 @@ public class VerificaGiacenzeViewModel {
boolean isNewRow = false;
var rowToSave = currentVerificaRows.getValue().parallelStream()
var rowToSave = Objects.requireNonNull(currentVerificaRows.getValue()).parallelStream()
.filter(x -> x.getCodMart().equalsIgnoreCase(mtbAart.getCodMart()))
.findFirst()
.orElse(null);
@ -235,7 +193,7 @@ public class VerificaGiacenzeViewModel {
isNewRow = true;
rowToSave = new VerificaGiacenzeRowEntity();
rowToSave.setParentId(currentVerifica.getValue().getId());
rowToSave.setParentId(Objects.requireNonNull(currentVerifica.getValue()).getId());
rowToSave.setCodMart(mtbAart.getCodMart());
rowToSave.setPartitaMag(null);
rowToSave.setDescrizione(mtbAart.getDescrizione());
@ -246,21 +204,18 @@ public class VerificaGiacenzeViewModel {
initialQtaTot = rowToSave.getQta();
}
var pickedQuantity = this.sendOnItemDispatched(mtbAart,
var pickedQuantity = this.sendOnItemDispatched(
mtbAart,
initialNumCnf,
qtaCnfGiacenza,
initialQtaTot,
numCnfGiacenza,
qtaGiacenza,
incomingNumCnf,
incomingQta,
null,
null
incomingQta
);
if (pickedQuantity == null)
return;
if (pickedQuantity == null) return;
rowToSave.setNumConf(pickedQuantity.getNumCnf());
rowToSave.setQtaConf(pickedQuantity.getQtaCnf());
@ -272,7 +227,6 @@ public class VerificaGiacenzeViewModel {
} else {
updateRow(rowToSave);
}
}
public MtbAart searchAnagraficaByCodMart(String codMart) {
@ -282,24 +236,6 @@ public class VerificaGiacenzeViewModel {
.orElse(null);
}
public MtbAart searchAnagraficaByBarcode(String barcode) {
MtbAart mtbAart = currentLoadedAnagrafiche.parallelStream()
.filter(x -> barcode.equals(x.getBarCode()))
.findFirst()
.orElse(null);
if (mtbAart == null) {
mtbAart = currentLoadedAnagrafiche.parallelStream()
.filter(x -> x.getMtbAartBarCode() != null &&
x.getMtbAartBarCode().stream()
.anyMatch(y -> barcode.equals(y.getCodBarre())))
.findFirst()
.orElse(null);
}
return mtbAart;
}
public void insertRow(VerificaGiacenzeRowEntity rowEntity) {
this.sendOnLoadingStarted();
@ -316,7 +252,7 @@ public class VerificaGiacenzeViewModel {
verificaGiacenzeRowRepository.insert(rowEntity, insertedData -> {
handler.post(() -> {
currentVerificaRows.getValue().add(insertedData);
Objects.requireNonNull(currentVerificaRows.getValue()).add(insertedData);
notifyRowChanged();
});
}, this::sendError);
@ -339,7 +275,7 @@ public class VerificaGiacenzeViewModel {
var indexInList = -1;
List<VerificaGiacenzeRowEntity> value = currentVerificaRows.getValue();
for (int i = 0; i < value.size(); i++) {
for (int i = 0; i < Objects.requireNonNull(value).size(); i++) {
VerificaGiacenzeRowEntity entity = value.get(i);
if (Objects.equals(entity.getId(), rowEntity.getId())) {
@ -374,7 +310,7 @@ public class VerificaGiacenzeViewModel {
verificaGiacenzeRowRepository.delete(rowEntity, () -> {
handler.post(() -> {
currentVerificaRows.getValue().remove(rowEntity);
Objects.requireNonNull(currentVerificaRows.getValue()).remove(rowEntity);
notifyRowChanged();
});
@ -386,6 +322,25 @@ public class VerificaGiacenzeViewModel {
this.sendOnLoadingEnded();
}
private MtbAart sendChooseArtRequest(List<MtbAart> mtbAarts) {
final CountDownLatch latch = new CountDownLatch(1);
AtomicReference<MtbAart> result = new AtomicReference<>();
listener.onChooseArtRequest(mtbAarts, data -> {
result.set(data);
latch.countDown();
});
try {
latch.await();
return result.get();
} catch (InterruptedException e) {
this.sendError(e);
}
return null;
}
private PickedQuantityDTO sendOnItemDispatched(MtbAart mtbAart,
BigDecimal initialNumCnf,
BigDecimal initialQtaCnf,
@ -393,15 +348,13 @@ public class VerificaGiacenzeViewModel {
BigDecimal inWarehouseNumCnf,
BigDecimal inWarehouseQtaTot,
BigDecimal incomingNumCnf,
BigDecimal incomingQtaTot,
String partitaMag,
LocalDate dataScad) {
BigDecimal incomingQtaTot) {
if (listener != null)
return this.listener.onItemDispatched(mtbAart,
initialNumCnf, initialQtaCnf, initialQtaTot,
inWarehouseNumCnf, inWarehouseQtaTot,
incomingNumCnf, incomingQtaTot,
partitaMag, dataScad);
return this.listener.onItemDispatched(
mtbAart, initialNumCnf, initialQtaCnf,
initialQtaTot, inWarehouseNumCnf, inWarehouseQtaTot,
incomingNumCnf, incomingQtaTot, null, null
);
return null;
}
@ -435,5 +388,7 @@ public class VerificaGiacenzeViewModel {
LocalDate dataScad);
void onError(Exception ex);
void onChooseArtRequest(List<MtbAart> artsList, RunnableArgs<MtbAart> onComplete);
}
}