/*@Param Integer value of book id *@return An object view model for Book and Stock * A method which will pass back the correct stock * for the desired book and a BookStockViewModel */ private BookStockViewModel GetStockCount(int bookId) { var Query = (from p in db.Stocks where p.BookID == bookId select p.StockCount).FirstOrDefault(); BookStockViewModel objReturn = new BookStockViewModel(); objReturn.stock.StockCount = Query; return(objReturn); }
public async Task <bool> DecrementStocks(BookStockViewModel bookStockViewModel) { var books = bookStockViewModel.StockViewModels.GroupBy(s => s.Sn) .Select(g => new { Sn = g.Key, Count = g.Sum(s => s.Count) }) .ToList(); var sns = books.Select(b => b.Sn).ToList(); //var lockKey = string.Join(",", sns); // using var distributedLock = await distributedLockProvider.Acquire(lockKey); var stocks = await bookContext.BookStocks .Where(s => sns.Contains(s.Sn)) .ToListAsync(); await Task.Delay(500); var errors = new List <string>(); foreach (var book in books) { var stock = stocks.Find(s => s.Sn == book.Sn); if (stock == null) { errors.Add($"book {book.Sn} doesn't exist in stocks"); continue; } if (stock.StockCount < book.Count) { errors.Add($"book {book.Sn} doesn't have enough stocks"); continue; } stock.StockCount -= book.Count; stock.FreezeStock -= book.Count; bookContext.OrderStocks .Add(new OrderStock { OrderId = bookStockViewModel.OrderId, Sn = book.Sn, Count = book.Count }); } if (errors.Any()) { throw new DomainException(string.Join(",", errors)); } await bookContext.SaveChangesAsync(); return(true); }
// GET: Books/Details/5 public ActionResult Details(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } Book book = db.Books.Find(id); BookStockViewModel books = new BookStockViewModel(); books.book = book; if (book == null) { return(HttpNotFound()); } return(View(books)); }
public async Task <bool> IncrementStocks(BookStockViewModel bookStockViewModel) { var books = bookStockViewModel.StockViewModels.GroupBy(s => s.Sn) .Select(g => new { Sn = g.Key, Count = g.Sum(s => s.Count) }) .ToList(); var sns = books.Select(b => b.Sn).ToList(); var stocks = await bookContext.BookStocks .Where(s => sns.Contains(s.Sn)) .ToListAsync(); foreach (var book in books) { var stock = stocks.Find(s => s.Sn == book.Sn); if (stock == null) { stock = new BookStock { Sn = book.Sn, StockCount = 0 }; bookContext.BookStocks.Add(stock); } if (stock.StockCount < 0 || stock.FreezeStock > stock.StockCount) { logger.LogError("detected data {Id} run into concurrent conflict state! freeze {freezeCount}, stock {stockCount}", stock.Id, stock.FreezeStock, stock.StockCount); continue; } //test //stock.StockCount += book.Count; stock.StockCount = 30; stock.FreezeStock = 0; } await bookContext.SaveChangesAsync(); return(true); }
public PartialViewResult GetStock(int bookId) { BookStockViewModel objReturnStock = GetStockCount(bookId); return(PartialView("~/Views/Shared/_StockForBooks.cshtml", objReturnStock)); }