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);
            }
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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);
            }
        }