private async Task ProcessPendingConsoleAsync(RecordConsole console, IEnumerable <Entt_Console> rows) { var pendingItems = await SearchEventPendingAsync(console.ConsignmentNo); var tasks = from p in pendingItems select ProcessEventPendingItem(console, p); await Task.WhenAll(tasks); var consolePendingList = new List <string> { console.ConsignmentNo }; foreach (var item in rows) { var isConsole = IsConsole(item.ConsignmentNo); if (!isConsole) { continue; } if (consolePendingList.Contains(item.ConsignmentNo)) { continue; } consolePendingList.Add(item.ConsignmentNo); } }
private async Task InsertConsoleDuplicationErrorAndEventExceptionAsync(RecordConsole console) { Console.WriteLine("insert into console_duplicate_error"); // var error = new Entt_ConsoleDuplicateError { Id = GenerateId(20), Version = 0, DateTime = console.DateTime, CourierId = console.CourierId, CourierName = console.CourierName, OfficeName = console.OfficeName, OfficeNextCode = console.OfficeNextCode, OfficeNo = console.OfficeNo, BatchName = console.BatchName, BeatNo = console.BeatNo, ConsoleNo = console.ConsignmentNo, ItemConsignments = console.ItemConsignments, ConsoleType = console.ConsoleType, ConsoleTypeDesc = console.ConsoleTypeDesc, OtherConsoleType = console.OtherConsoleType, DestinationOffice = console.DestinationOffice, DestinationOfficeName = console.DestinationOfficeName, RoutingCode = console.RoutingCode, Comment = console.Comment, EventType = console.EventType, CreatedDate = console.CreatedDate }; var errorAdapter = new Entt_ConsoleDuplicateErrorAdapter(); await Policy.Handle <SqlException>(e => e.IsDeadlockOrTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync(() => errorAdapter.InsertAsync(error)); }
private async Task <bool> AddToConsoleDetailsAsync(RecordConsole console) { var adapter = new Entt_ConsoleDetailsAdapter(); var idPr = await Policy.Handle <SqlException>(e => e.IsTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync(() => adapter.ExecuteScalarAsync <string>($"SELECT TOP 1 [Id] FROM [Entt].[ConsoleDetails] WHERE [ConsoleNo] = '{console.ConsignmentNo}' ORDER BY [DateTime] DESC")); var id = idPr.Result; var consoleTagNotInConsoleDetails = string.IsNullOrWhiteSpace(id); if (consoleTagNotInConsoleDetails) { var map = new Bespoke.PosEntt.Integrations.Transforms.ReportConsoleToEnttConsoleDetails(); var row = await map.TransformAsync(console); var dpr = await Policy.Handle <SqlException>(e => e.IsTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync(() => adapter.ExecuteScalarAsync <int>($"SELECT COUNT(*) FROM [Entt].[ConsoleDetails] WHERE [ConsoleNo] ='{row.ConsoleNo}'")); if (dpr.Result == 0 && !string.IsNullOrWhiteSpace(row.ConsoleNo)) { var pr = Policy.Handle <SqlException>(e => e.IsDeadlockOrTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync(() => adapter.InsertAsync(row)); var result = await pr; if (result.FinalException != null) { throw result.FinalException; // Send to dead letter queue } System.Diagnostics.Debug.Assert(result.Result > 0, "Should be at least 1 row"); } return(true); } var detailsPolly = await Policy.Handle <SqlException>(e => e.IsTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync(async() => await adapter.LoadOneAsync(id)); if (null != detailsPolly.FinalException) { throw new Exception("Console Details Polly Error", detailsPolly.FinalException); } var details = detailsPolly.Result; if (details.CourierId == console.CourierId && details.OfficeNo == console.OfficeNo && (details.DateTime ?? DateTime.MinValue).AddHours(28) >= console.DateTime) { var notes = details.ItemConsignments.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries).ToList(); notes.AddRange(console.ItemConsignments.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries)); details.ItemConsignments = string.Join("\t", notes.OrderBy(x => x).Where(x => x.Length > 3 /* remove anything less*/).Distinct()); await adapter.UpdateAsync(details); return(true); } await InsertConsoleDuplicationErrorAndEventExceptionAsync(console); return(false); }
public async Task RunAsync(RecordConsole console) { var pendingConsoles = new List <string>(); var success = await AddToConsoleDetailsAsync(console); if (!success) { return; } var rows = new ConcurrentBag <Entt_Console>(); var map = new ReportConsoleToEnttConsole(); var row = await map.TransformAsync(console); rows.Add(row); rows.AddRange(await GetEventRowsAsync(row, pendingConsoles, console.ItemConsignments)); // await InsertConsoleAsync(rows); // if (pendingConsoles.Any()) { await InsertEventPendingConsoleAsync(row, pendingConsoles.ToArray()); } var consoleDetailsAdapter = new Entt_EventPendingConsoleAdapter(); var pendingCountPr = await Policy.Handle <SqlException>(e => e.IsTimeout()) .WaitAndRetryAsync(RetryCount, x => TimeSpan.FromMilliseconds(500 * Math.Pow(2, x))) .ExecuteAndCaptureAsync( () => consoleDetailsAdapter.ExecuteScalarAsync <int>( $"SELECT COUNT(*) FROM [Entt].[EventPendingConsole] WHERE [ConsoleNo] = '{console.ConsignmentNo}'")); var tagExistInPendingConsole = pendingCountPr.Result > 0; if (tagExistInPendingConsole) { await ProcessPendingConsoleAsync(console, rows); } }
private async Task ProcessEventPendingItem(RecordConsole console, Entt_EventPendingConsole pending) { var itemList = console.ItemConsignments.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries); var ok = false; switch (pending.EventName) { //case "pos.oal.DeliveryEventNew": // await ProcessDeliveryPendingItem(pending.event_id, itemList); // ok = true; // break; case "Sop": await ProcessSopPendingItem(pending.EventId, itemList); ok = true; break; case "Sip": await ProcessSipPendingItem(pending.EventId, itemList); ok = true; break; case "Hip": await ProcessHipPendingItem(pending.EventId, itemList); ok = true; break; case "Hop": await ProcessHopPendingItem(pending.EventId, itemList); ok = true; break; case "StatusCode": await ProcessStatPendingItem(pending.EventId, itemList); ok = true; break; case "Vasn": await ProcessVasnPendingItem(pending.EventId, itemList); ok = true; break; //case "pos.oal.NormalConsoleEventNew": // //ProcessNormPendingItem(item.console_no, item.event_id); // break; //case "pos.oal.MissortEventNew": // await ProcessMissPendingItem(pending.event_id, itemList); // ok = true; // break; //case "pos.oal.WwpEventNewLog": // await ProcessWwpPendingItem(pending.event_id, itemList); // ok = true; // break; //case "pos.oal.IpsImport": // await ProcessIpsPendingItem(pending.event_id, itemList); // ok = true; // break; } if (ok) { var pendingAdapter = new Entt_EventPendingConsoleAdapter(); await pendingAdapter.DeleteAsync(pending.Id); } }