diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Connectors/Connector.cs b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Connectors/Connector.cs index 292ef25..ccd1143 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Connectors/Connector.cs +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Connectors/Connector.cs @@ -85,6 +85,11 @@ public static XmlDocument CalculateOrder(Settings settings, string orderXml, Ord try { + if (createOrder) + { + OrderHandler.SetCurrentlyProcessingOrder(order); + } + Diagnostics.ExecutionTable.Current.Add("DynamicwebLiveIntegration.Connector.CalculateOrder START"); // only retry if is not create order, for create order schedule task will send later document = Communicate(settings, orderXml, $"CalculateOrder (ID: {order.Id}, CreateOrder: {createOrder})", logger, submitType, !createOrder, true, order); @@ -96,6 +101,13 @@ public static XmlDocument CalculateOrder(Settings settings, string orderXml, Ord $"Error CalculateOrder Order Id:'{order.Id}' CreateOrder:'{createOrder}' Message:'{ex.Message}'."); error = ex; } + finally + { + if (createOrder) + { + OrderHandler.RemoveCurrentlyProcessingOrder(order); + } + } if (EnableThrowExceptions && error != null) { diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Dynamicweb.Ecommerce.DynamicwebLiveIntegration.csproj b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Dynamicweb.Ecommerce.DynamicwebLiveIntegration.csproj index a449c14..03d9be6 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Dynamicweb.Ecommerce.DynamicwebLiveIntegration.csproj +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/Dynamicweb.Ecommerce.DynamicwebLiveIntegration.csproj @@ -1,6 +1,6 @@  - 10.4.29 + 10.4.30 1.0.0.0 Live Integration Live Integration diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/OrderHandler.cs b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/OrderHandler.cs index c6b4887..f1ab29e 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/OrderHandler.cs +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/OrderHandler.cs @@ -1,4 +1,5 @@ -using Dynamicweb.Core; +using Dynamicweb.Caching; +using Dynamicweb.Core; using Dynamicweb.Ecommerce.DynamicwebLiveIntegration.Cache; using Dynamicweb.Ecommerce.DynamicwebLiveIntegration.Configuration; using Dynamicweb.Ecommerce.DynamicwebLiveIntegration.Connectors; @@ -1374,5 +1375,24 @@ private static void SaveOrderHash(Settings settings, string hashValue) } #endregion Hash helper methods + + private static string OrderCacheKey(Order order) => $"OrderHandlerSentOrder{order.Id}"; + + internal static void SetCurrentlyProcessingOrder(Order order) + { + string key = OrderCacheKey(order); + if (!Caching.Cache.Current.Contains(key)) + { + Caching.Cache.Current.Set(key, key, new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromMinutes(30) }); + } + } + + internal static bool IsOrderCurrentlyProcessing(Order order) => Caching.Cache.Current.Contains(OrderCacheKey(order)); + + internal static void RemoveCurrentlyProcessingOrder(Order order) + { + string key = $"OrderHandlerSentOrder{order.Id}"; + Caching.Cache.Current.Remove(key); + } } } \ No newline at end of file diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/CaptureOrdersScheduledTask.cs b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/CaptureOrdersScheduledTask.cs index fd1bf37..5910166 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/CaptureOrdersScheduledTask.cs +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/CaptureOrdersScheduledTask.cs @@ -347,6 +347,12 @@ private void ProcessOrders(List ordersToSync) foreach (var order in ordersToSync) { + if (OrderHandler.IsOrderCurrentlyProcessing(order)) + { + Logger.Log($"Skipping order: {order.Id} as it is currently processing"); + continue; + } + Settings orderSettings = shopSettings; if (orderSettings == null) { diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/QueuedOrdersSyncScheduledTask.cs b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/QueuedOrdersSyncScheduledTask.cs index 3325f7e..10c9fa9 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/QueuedOrdersSyncScheduledTask.cs +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/QueuedOrdersSyncScheduledTask.cs @@ -142,6 +142,11 @@ public override bool Run() Settings shopSettings = SettingsManager.GetSettingsByShop(ShopId); foreach (var order in ordersToSync.GetResultOrders()) { + if (OrderHandler.IsOrderCurrentlyProcessing(order)) + { + Logger.Log($"Skipping order: {order.Id} as it is currently processing"); + continue; + } Settings settings = shopSettings; if (settings == null) { diff --git a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/UpdateOrdersScheduledTask.cs b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/UpdateOrdersScheduledTask.cs index ff22a35..117d657 100644 --- a/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/UpdateOrdersScheduledTask.cs +++ b/src/Dynamicweb.Ecommerce.DynamicwebLiveIntegration/ScheduledTasks/UpdateOrdersScheduledTask.cs @@ -277,6 +277,12 @@ private void ProcessOrders(List ordersToSync) foreach (var order in ordersToSync) { + if (OrderHandler.IsOrderCurrentlyProcessing(order)) + { + Logger.Log($"Skipping order: {order.Id} as it is currently processing"); + continue; + } + var erpUpdated = SendToErp(order); if (!SkipCustomFieldUpdateOnErpFailure || erpUpdated) UpdateOrderCustomField(order);