예제 #1
0
        /*@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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        // 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));
        }
예제 #4
0
        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);
        }
예제 #5
0
        public PartialViewResult GetStock(int bookId)
        {
            BookStockViewModel objReturnStock = GetStockCount(bookId);

            return(PartialView("~/Views/Shared/_StockForBooks.cshtml", objReturnStock));
        }