예제 #1
0
        public async Task Order(string system, object order)
        {
            //Десериализуем запрос
            var deOrder = WorkJson.DeserializeOrder(order);

            //Добавляем запись
            Order orderDb = new Order
            {
                SystemType  = system,
                OrderNumber = Int64.Parse(deOrder.OrderNumber),
                SourceOrder = order.ToString(),
                CreatedAt   = deOrder.CreatedAt
            };

            _context.Orders.Add(orderDb);
            //Сохраняем
            await _context.SaveChangesAsync();

            //Берем идшник
            var id = orderDb.Id;

            ////Создаем запись о новом заказе
            ////З.Ы. Более целесообразно статусы было бы запихнуть в таблицу Ордер, но
            ////я так понимаю что таблица должна быть именно такой как в тз,
            ////поэтому статусы к ней запихнул отдельно
            _context.Processings.Add(new Processing
            {
                OrderId = id,
                Status  = StatusOrder.New
            });
            await _context.SaveChangesAsync();
        }
예제 #2
0
        //Обработка новых заказов, самый фарш тут
        public async Task Invoke()
        {
            //Ищем новые заказы
            var status = _context.Processings
                         .AsNoTracking()
                         .Where(p => p.Status == "new")
                         .ToList();

            if (status.Count > 0)
            {
                //вытаскиваем словарь с системой и методом который должен быть вызван
                Process process    = new Process(_context);
                Type    type       = typeof(Process);
                var     dictionary = _context.Choices
                                     .AsNoTracking()
                                     .ToDictionary(c => c.Key, c => c.Value);

                //Находим в таблице ордеров записи по вытащенным идшникам
                foreach (var processing in status)
                {
                    var item = _context.Orders.AsNoTracking().FirstOrDefault(o => o.Id == processing.OrderId);
                    //Для каждой итерации смотрим название метода в словаре по ключу
                    //через рефлексию находим метод и вызываем его для каждой системы собственный
                    var        method = dictionary.FirstOrDefault(d => d.Key == item.SystemType);
                    MethodInfo info   = type.GetMethod(method.Value);

                    try
                    {
                        //Вызываем найденный метод с json
                        var    obj  = info?.Invoke(process, new object[] { item.SourceOrder });
                        string json = (string)obj;

                        item.ConvertedOrder = json;
                        processing.Status   = StatusOrder.Finish;
                        _context.Orders.Update(item);
                        _context.Processings.Update(processing);
                    }
                    catch (Exception ex)
                    {
                        //Делаем гарантированный запуск задачи в новом
                        //потоке чтобы не прерывал обработку заказов
                        //и передаем управление новой итерации
                        new Thread(async() => await
                                   ErrorService.AlarmaAhtungWarningErrorMethodAsync(ex.Message)).Start();
                        continue;
                    }
                }

                await _context.SaveChangesAsync();
            }
        }
        public async Task <ApiResponse <bool> > Subscribe(Subscription subscription)
        {
            _logger.ForContext <NewsletterService>().Information("Subscribe(subscription: {@Subscription})");
            var errorList = new ValidationErrorList();

            try
            {
                subscription.StartDate = DateTime.UtcNow;

                _db.Subscriptions.Add(subscription);
                await _db.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Unhandled Exception");
                errorList.AddError("form", "unknownError");
                return(new ApiResponse <bool>(false, errorList.Errors));
            }

            return(new ApiResponse <bool>(true, null));
        }