public SyncItems SyncPaymentMethods() { var response = new SyncItems(); _foccoWebFormaPagamentoRepository.ExecuteSqlCommand("UPDATE FoccoWebApiFormaPagamento SET Ativo = 0;"); var apiReq = new GetPaymentConditionsCommandRequest(); var apiResp = base._foccoErpApiCommands.GetPaymentConditionsCommand(apiReq); if (apiResp.Success && apiResp.GetPaymentConditionsResponse.Rows != null) { var rows = apiResp.GetPaymentConditionsResponse.Rows.DistinctBy(x => x.ID, null); foreach (var row in rows) { InsertUpdatePaymentMethods(row); response.TotalProcessedRows += 1; } base._unitOfWork.Commit(); response.TotalRowCount = apiResp.GetPaymentConditionsResponse.Rows.Count; } response.EndOfRecords = true; return(response); }
protected SyncEngine(SyncItems syncType, T service, bool fullSync = false, DateTime?offset = null, int limit = 100) { SyncType = syncType; Service = service; Limit = limit; SyncOffset = offset ?? DateTime.UtcNow; // щоб випадково не пропустити офсетний елемент - добавимо його в зворотню синхронізацію RestoreOffset = SyncOffset.AddTicks(10); FullSync = fullSync; using (StoreContext store = new StoreContext() { Trace = Trace }) { if (!fullSync) { // визначаємо, чи успішною була попередня синхронізація, та її офсет if (store.SyncStates.FirstOrDefault(s => s.Type == syncType)?.Restoring == false) { RestoreTo = GetSyncOffset(store); } } // перед початком синхронізації - відмічаємо в базі початок відновлення синхронізації // якщо синхронізація зупиниться до повного її відновлення - цей стан буде сигналізувати, про неповноту одержаних даних store.SyncStates.AddOrUpdate(new SyncState { Type = syncType, Restoring = true }); store.SaveChanges(); } }
protected void InitCommands() { CacheData = ReactiveCommand.CreateFromTask <Unit, IEnumerable <T> >(async(_) => { return(await LoadDataFromTable()); }); CacheData.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to CacheData: {ex.Message}"); }).DisposeWith(Disposables); SyncItems = ReactiveCommand.CreateFromTask <Unit, SyncStatus>(async(_) => { return(await PerformSync()); }); SyncItems.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to SyncItems: {ex.Message}"); }).DisposeWith(Disposables); IsSyncing = SyncItems.IsExecuting.StartWith(false).Publish().RefCount(); CacheCollection = ReactiveCommand.Create <IList <T>, IList <T> >(data => { UpdateCachedData(data); return(data); }); CacheCollection.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to CacheCollection: {ex.Message}"); }).DisposeWith(Disposables); AddItem = ReactiveCommand.CreateFromTask <T, T>(async item => { await Initialize(); await Table.InsertAsync(item); return(item); }); AddItem.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to AddItem: {ex.Message}"); }).DisposeWith(Disposables); UpdateItem = ReactiveCommand.CreateFromTask <T, T>(async item => { await Initialize(); await Table.UpdateAsync(item); return(item); }); UpdateItem.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to UpdateItem: {ex.Message}"); }).DisposeWith(Disposables); DeleteItem = ReactiveCommand.CreateFromTask <T, T>(async item => { await Initialize(); await Table.DeleteAsync(item); return(item); }); DeleteItem.ThrownExceptions.Subscribe(ex => { Debug.WriteLine($"Failed to DeleteItem: {ex.Message}"); }).DisposeWith(Disposables); Observable.Merge(AddItem, UpdateItem, DeleteItem) .Select(_ => Unit.Default) .Do(_ => Debug.WriteLine("Updating UI prior to syncing")) .SelectMany(async _ => await LoadDataFromTable()) .Do(UpdateCachedData) .Select(_ => Unit.Default) .Do(_ => Debug.WriteLine("Syncing after changing items")) .InvokeCommand(this, x => x.SyncItems) .DisposeWith(Disposables); SyncItems.Where(x => x == SyncStatus.Synchronized) .Select(_ => Unit.Default) .Do(_ => Debug.WriteLine("Caching sync'd items")) .InvokeCommand(this, x => x.CacheData) .DisposeWith(Disposables); }
public SyncItems SyncClientsProducts(int batchRecords, int skip, int clientCode, long cnpjCpf) { var response = new SyncItems(); if (skip == 0) { _clienteprodutoRepository.ExecuteSqlCommand("UPDATE FoccoWebApiClienteProduto SET Ativo = 0 WHERE CodigoCliente = " + clientCode + ";"); } var apiReq = new GetClientItemsCommandRequest() { GetClientItemsRequest = new GetClientItemsRequest() { Skip = skip, Take = 250, CodigoCliente = clientCode, CnpjCpf = cnpjCpf } }; while (true) { var apiResp = base._foccoErpApiCommands.GetClientItemsCommand(apiReq); if (apiResp.Success && apiResp.GetClientItemsResponse.ClientItems.Rows != null) { var rows = apiResp.GetClientItemsResponse.ClientItems.Rows.DistinctBy(x => x.ID, null); foreach (var row in rows) { InsertUpdateClientProduct(clientCode, row); response.TotalProcessedRows += 1; } base._unitOfWork.Commit(); response.TotalRowCount = apiResp.GetClientItemsResponse.ClientItems.TotalRowCount; } else { response.EndOfRecords = true; break; } var controller = (response.TotalProcessedRows + apiReq.GetClientItemsRequest.Take) - batchRecords; if (controller <= 0) { apiReq.GetClientItemsRequest.Skip += apiReq.GetClientItemsRequest.Take; } else { if (apiReq.GetClientItemsRequest.Take > controller) { apiReq.GetClientItemsRequest.Skip += (apiReq.GetClientItemsRequest.Take - controller); } else { break; } } } return(response); }
public SyncItems SyncProducts(int batchRecords, int skip) { var response = new SyncItems(); _produtoRepository.ExecuteSqlCommand("TRUNCATE TABLE FoccoWebApiProduto;"); var apiReq = new GetItemsCommandRequest() { GetItemsRequest = new GetItemsRequest() { Skip = skip, Take = 250 } }; while (true) { var apiResp = base._foccoErpApiCommands.GetItemsCommand(apiReq); if (apiResp.Success && apiResp.GetItemsResponse.Rows != null) { var rows = apiResp.GetItemsResponse.Rows.DistinctBy(x => x.ID, null); foreach (var row in rows) { InsertProduct(row); response.TotalProcessedRows += 1; } base._unitOfWork.Commit(); response.TotalRowCount = apiResp.GetItemsResponse.TotalRowCount; } //else if (!apiResp.Success) // throw apiResp.Exception; else { response.EndOfRecords = true; break; } var controller = (response.TotalProcessedRows + apiReq.GetItemsRequest.Take) - batchRecords; if (controller <= 0) { apiReq.GetItemsRequest.Skip += apiReq.GetItemsRequest.Take; } else { if (apiReq.GetItemsRequest.Take > controller) { apiReq.GetItemsRequest.Skip += (apiReq.GetItemsRequest.Take - controller); } else { break; } } } return(response); }