Example #1
0
        private async Task ProcessPendingConsoleAsync(Decos.Domain.Deco deco, IEnumerable <Adapters.Oal.dbo_delivery_console_event_new> rows)
        {
            var pendingItems = await SearchEventPendingAsync(deco.ConsoleTag);

            var tasks = from p in pendingItems
                        select ProcessEventPendingItem(deco, p);

            await Task.WhenAll(tasks);

            var consolePendingList = new List <string> {
                deco.ConsoleTag
            };

            foreach (var item in rows)
            {
                var console = IsConsole(item.consignment_no);
                if (!console)
                {
                    continue;
                }
                if (consolePendingList.Contains(item.consignment_no))
                {
                    continue;
                }

                consolePendingList.Add(item.consignment_no);
            }
        }
Example #2
0
        private async Task <bool> AddToConsoleDetailsAsync(Decos.Domain.Deco deco)
        {
            var adapter = new Adapters.Oal.dbo_console_detailsAdapter();
            var id      = await adapter.ExecuteScalarAsync <string>($"SELECT [id] FROM dbo.console_details WHERE [console_no] = '{deco.ConsoleTag}'");

            var consoleTagNotInConsoleDetails = string.IsNullOrWhiteSpace(id);

            if (consoleTagNotInConsoleDetails)
            {
                var map = new Integrations.Transforms.RtsDecoOalConsoleDetails();
                var row = await map.TransformAsync(deco);

                // check for duplicate
                var dpr = await Policy.Handle <SqlException>(e => e.IsTimeout())
                          .WaitAndRetryAsync(RetryCount, WaitInterval)
                          .ExecuteAndCaptureAsync(() => adapter.ExecuteScalarAsync <int>($"SELECT COUNT(*) FROM dbo.console_details WHERE console_no ='{row.console_no}'"));

                if (dpr.Result == 0)
                {
                    var pr = Policy.Handle <SqlException>(e => e.IsDeadlockOrTimeout())
                             .WaitAndRetryAsync(RetryCount, WaitInterval)
                             .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, WaitInterval)
                               .ExecuteAndCaptureAsync(async() => await adapter.LoadOneAsync(id));

            if (null != detailsPolly.FinalException)
            {
                throw new Exception("Console Details Polly Error", detailsPolly.FinalException);
            }

            var details = detailsPolly.Result;

            var decoDateTime = deco.Date.AddHours(deco.Time.Hour).AddMinutes(deco.Time.Minute).AddSeconds(deco.Time.Second);

            if (details.courier_id == deco.CourierId && details.office_no == deco.LocationId && (details.date_field ?? DateTime.MinValue).AddHours(28) >= decoDateTime)
            {
                var notes = details.item_consignments.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries).ToList();
                notes.AddRange(deco.AllConsignmentnNotes.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries));
                details.item_consignments = string.Join("\t", notes.OrderBy(x => x).Where(x => x.Length > 3 /* remove anything less*/).Distinct());
                await adapter.UpdateAsync(details);

                return(true);
            }

            await InsertConsoleDuplicationErrorAndEventExceptionAsync(deco);

            return(false);
        }
Example #3
0
        private async Task InsertConsoleDuplicationErrorAndEventExceptionAsync(Decos.Domain.Deco deco)
        {
            Console.WriteLine("insert into console_duplicate_error & event_exception");

            //
            var map         = new Integrations.Transforms.RtsDecoOalConsoleDetails();
            var decoDetails = await map.TransformAsync(deco);

            var error = new Adapters.Oal.dbo_console_duplicate_error
            {
                item_consignments         = decoDetails.item_consignments,
                date_field                = decoDetails.date_field,
                courier_id                = decoDetails.courier_id,
                batch_name                = decoDetails.batch_name,
                beat_no                   = decoDetails.beat_no,
                console_no                = decoDetails.console_no,
                console_type              = null,
                console_type_desc         = null,
                courier_name              = decoDetails.courier_name,
                dt_created_oal_date_field = decoDetails.dt_created_oal_date_field,
                event_comment             = decoDetails.event_comment,
                id                 = GenerateId(20),
                event_type         = decoDetails.event_type,
                office_dest        = null,
                version            = 0,
                office_dest_name   = null,
                office_name        = decoDetails.office_name,
                office_next_code   = decoDetails.office_next_code,
                office_no          = decoDetails.office_no,
                other_console_type = null,
                routing_code       = null
            };
            var errorAdapter = new Adapters.Oal.dbo_console_duplicate_errorAdapter();
            await errorAdapter.InsertAsync(error);

            var exc = new Adapters.Oal.dbo_event_exception
            {
                consignment_no = error.console_no,
                date_field     = error.date_field,
                batch_name     = error.batch_name,
                office_no      = error.office_no,
                version        = error.version,
                id             = GenerateId(34),
                courier_id     = error.courier_id,
                event_class    = "pos.oal.DeliveryConsoleEventNew",
                event_id       = error.id
            };
            var excAdapter = new Adapters.Oal.dbo_event_exceptionAdapter();
            await excAdapter.InsertAsync(exc);
        }
Example #4
0
        public async Task RunAsync(Decos.Domain.Deco deco)
        {
            var pendingConsoles = new List <string>();
            var consoleList     = new List <string> {
                deco.ConsoleTag
            };

            //add to console_details first
            var success = await AddToConsoleDetailsAsync(deco);

            if (!success)
            {
                return;
            }

            var rows = new ConcurrentBag <Adapters.Oal.dbo_delivery_console_event_new>();
            var map  = new Integrations.Transforms.RtsDecoOalDeliveryConsoleEventNew();
            var row  = await map.TransformAsync(deco);

            rows.Add(row);
            rows.AddRange(await GetEventRowsAsync(row, pendingConsoles, consoleList, deco.AllConsignmentnNotes));

            //
            await InsertDeliveryConsoleEventNewAsync(rows);

            //
            if (pendingConsoles.Any())
            {
                await InsertEventPendingConsoleAsync(row, pendingConsoles.ToArray());
            }

            var consoleDetailsAdapter    = new Adapters.Oal.dbo_console_detailsAdapter();
            var tagExistInPendingConsole = (await consoleDetailsAdapter.ExecuteScalarAsync <int>($"SELECT COUNT(*) FROM dbo.event_pending_console WHERE [console_no] = '{deco.ConsoleTag}'")) > 0;

            if (tagExistInPendingConsole)
            {
                await ProcessPendingConsoleAsync(deco, rows);
            }
        }
Example #5
0
        private async Task ProcessEventPendingItem(Decos.Domain.Deco deco, Adapters.Oal.dbo_event_pending_console pending)
        {
            var itemList = deco.AllConsignmentnNotes.Split(new[] { ',', '\t' }, StringSplitOptions.RemoveEmptyEntries);
            var ok       = false;

            switch (pending.event_class)
            {
            case "pos.oal.DeliveryEventNew":
                await ProcessDeliveryPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.SopEventNew":
                await ProcessSopPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.SipEventNew":
                await ProcessSipPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.HipEventNew":
                await ProcessHipPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.HopEventNew":
                await ProcessHopPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.StatusEventNew":
                await ProcessStatPendingItem(pending.event_id, itemList);

                ok = true;
                break;

            case "pos.oal.VasnEventNew":
                await ProcessVasnPendingItem(pending.event_id, 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 Adapters.Oal.dbo_event_pending_consoleAdapter();
            await pendingAdapter.DeleteAsync(pending.id);

            //}
        }