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(); }
//Обработка новых заказов, самый фарш тут 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)); }