Example #1
0
        public async Task ValidateDayCountAsync(List <SubscriptionOrderAddViewModel> vms)
        {
            // dates
            var vmOrderDates         = vms.SelectMany(x => x.SubscriptionOrderDates).Select(x => x.Date).ToList();
            var vmModifiedBonusDates = vms.SelectMany(x => x.SubscriptionOrderModifiedBonusDates).Select(x => x.Date)
                                       .Distinct().ToList();
            var vmOrderAndModifiedDates = vmOrderDates.Concat(vmModifiedBonusDates).ToList();
            var vmBonusDateIds          = vms.SelectMany(x => x.SubscriptionOrderBonusDates)
                                          .Select(x => x.SubscriptionMonthPromotionBonusDateId).Distinct().ToList();
            var promotionBonusDateModels = await _subscriptionMonthPromotionBonusDateRepository.AllIncluding(x => x.SubscriptionMonthPromotionBonus)
                                           .Where(x => vmBonusDateIds.Contains(x.Id)).ToListAsync();

            var bonusDates = promotionBonusDateModels.Select(x => x.Date).ToList();
            var allDates   = vmOrderAndModifiedDates.Concat(bonusDates).Distinct().OrderBy(x => x).ToList();

            // products
            var todayStr = DateTime.Now.Date.ToString("yyyy-MM-dd");
            var todayProductSnapshots = await _subscriptionProductSnapshotRepository.All
                                        .Where(x => x.SubscriptionDay.Date == todayStr).ToListAsync();

            // db models
            var dbOrders = await _subscriptionOrderDateRepository.AllIncluding(x => x.SubscriptionOrder)
                           .Where(x => allDates.Contains(x.Date)).ToListAsync();

            var dbBonusOrders = await _subscriptionMonthPromotionBonusDateRepository.AllIncluding(x => x.SubscriptionMonthPromotionBonus)
                                .Where(x => allDates.Contains(x.Date)).ToListAsync();

            var dbModifiedBonusOrders = await _subscriptionOrderModifiedBonusDateRepository.All
                                        .Where(x => allDates.Contains(x.Date)).ToListAsync();

            // validation by date then by product
            foreach (var date in allDates)
            {
                var vmDateOrders = vms.SelectMany(x => x.SubscriptionOrderDates).Where(x => x.Date == date)
                                   .ToList();
                var dateOrderProductSnapshotIds = vms.Where(x => x.SubscriptionOrderDates.Any(y => y.Date == date))
                                                  .Select(x => x.SubscriptionProductSnapshotId).ToList();

                var dbDateOrders = dbOrders.Where(x => x.Date == date).ToList();
                var dbOrderProductSnapshotIds = dbDateOrders.Select(x => x.SubscriptionOrder.SubscriptionProductSnapshotId)
                                                .ToList();

                var dbDateBonusOrders = dbBonusOrders.Where(x => x.Date == date).ToList();
                // this is subscription for product id.
                var dbDateBonusOrderProductIds = dbDateBonusOrders
                                                 .Select(x => x.SubscriptionMonthPromotionBonus.ProductForSubscriptionId).ToList();

                var dbDateModifiedBonusOrders = dbModifiedBonusOrders.Where(x => x.Date == date).ToList();
                var dbDateModifiedBonusOrderProductISnaphostds =
                    dbDateModifiedBonusOrders.Select(x => x.SubscriptionProductSnapshotId).ToList();
            }
        }
        public async Task <IActionResult> Post([FromBody] JToken jObj)
        {
            var orderVms  = jObj["orders"].ToObject <List <SubscriptionOrderAddViewModel> >();
            var milkmanId = jObj["milkmanId"].ToObject <int>();

            if (!orderVms.Any())
            {
                return(BadRequest());
            }
            if (!TryValidateModel(orderVms))
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest(ModelState));
                }
            }
            var hasDayBeenConfirmed = await HasSubscriptionDayBeenConfirmed();

            var monthPromotionIds   = orderVms.Select(x => x.SubscriptionMonthPromotionId).Distinct().ToList();
            var promotionBonusDates = await _subscriptionMonthPromotionBonusDateRepository.AllIncluding(x => x.SubscriptionMonthPromotionBonus)
                                      .Where(x => monthPromotionIds.Contains(x.SubscriptionMonthPromotionBonus.SubscriptionMonthPromotion.Id)).ToListAsync();

            if (promotionBonusDates.Any())
            {
                var bonusDates = promotionBonusDates.Select(x => x.Date).ToList();
                _subscriptionOrderService.ValidateOrderBonusDates(bonusDates, Today, Tomorrow, hasDayBeenConfirmed);
                foreach (var orderVm in orderVms)
                {
                    if (orderVm.SubscriptionMonthPromotionId.HasValue)
                    {
                        orderVm.SubscriptionOrderBonusDates = promotionBonusDates.Where(x => x.SubscriptionMonthPromotionBonus.SubscriptionMonthPromotionId == orderVm.SubscriptionMonthPromotionId)
                                                              .Select(x => new SubscriptionOrderBonusDateViewModel {
                            SubscriptionMonthPromotionBonusDateId = x.Id
                        })
                                                              .ToList();
                    }
                }
            }

            _subscriptionOrderService.ValidateOrderDatesAndModifiedBonusDates(orderVms, Today, Tomorrow, hasDayBeenConfirmed);
            var invalidateDates = await _subscriptionOrderService.ValidateDayCountAsync(milkmanId, orderVms);

            if (invalidateDates.Any())
            {
                return(BadRequest(invalidateDates));
            }
            var createTime = _subscriptionOrderService.AddSubscriptionOrders(orderVms, UserName);

            if (!await UnitOfWork.SaveAsync())
            {
                return(StatusCode(500, "保存时出错"));
            }
            return(Ok(createTime));
        }
Example #3
0
        public async Task <List <SubscriptionOrderDayCountErrorViewModel> > ValidateDayCountAsync(int milkmanId, List <SubscriptionOrderAddViewModel> orderVms)
        {
            // dates
            foreach (var orderVm in orderVms)
            {
                foreach (var orderDate in orderVm.SubscriptionOrderDates)
                {
                    orderDate.Date = orderDate.Date.ToLocalTime();
                }
                foreach (var modifiedBonusDate in orderVm.SubscriptionOrderModifiedBonusDates)
                {
                    modifiedBonusDate.Date = modifiedBonusDate.Date.ToLocalTime();
                }
            }
            var vmOrderDates          = orderVms.SelectMany(x => x.SubscriptionOrderDates).Select(x => x.Date).ToList();
            var vmModifiedBonusOrders = orderVms.SelectMany(x => x.SubscriptionOrderModifiedBonusDates).ToList();
            var vmModifiedBonusDates  = vmModifiedBonusOrders.Select(x => x.Date)
                                        .Distinct().ToList();
            var vmOrderAndModifiedDates = vmOrderDates.Concat(vmModifiedBonusDates).ToList();
            var vmPromotionDateIds      = orderVms.SelectMany(x => x.SubscriptionOrderBonusDates)
                                          .Select(x => x.SubscriptionMonthPromotionBonusDateId).Distinct().ToList();
            var promotionOrdersForVm = await _subscriptionMonthPromotionBonusDateRepository.AllIncluding(x => x.SubscriptionMonthPromotionBonus)
                                       .Where(x => vmPromotionDateIds.Contains(x.Id)).ToListAsync();

            var vmPromotionDates = promotionOrdersForVm.Select(x => x.Date).ToList();
            var allDates         = vmOrderAndModifiedDates.Concat(vmPromotionDates).Distinct().OrderBy(x => x).ToList();

            // db models
            var dbOrders = await _subscriptionOrderDateRepository.AllIncluding(x => x.SubscriptionOrder)
                           .Where(x => x.SubscriptionOrder.MilkmanId == milkmanId && allDates.Contains(x.Date)).ToListAsync();

            var dbPromotionOrders = await _subscriptionOrderBonusDateRepository.GetWithGrandPromotionInformation(milkmanId, allDates);

            var dbModifiedBonusOrders = await _subscriptionOrderModifiedBonusDateRepository.All
                                        .Where(x => x.SubscriptionOrder.MilkmanId == milkmanId && allDates.Contains(x.Date)).ToListAsync();

            // products
            var vmOrderProductSnapshotIds = orderVms.Select(x => x.SubscriptionProductSnapshotId).Distinct().ToList();
            var vmPromotionProductIds     = promotionOrdersForVm
                                            .Select(x => x.SubscriptionMonthPromotionBonus.ProductForSubscriptionId).ToList();
            var vmModifiedBonusProductSnapshotIds = vmModifiedBonusOrders.Select(x => x.SubscriptionProductSnapshotId).ToList();

            var dbOrderProductSnapshotIds =
                dbOrders.Select(x => x.SubscriptionOrder.SubscriptionProductSnapshotId).ToList();
            var dbModifiedBonusProductSnapshotIds =
                dbModifiedBonusOrders.Select(x => x.SubscriptionProductSnapshotId).ToList();
            var dbPromotionProductIds = dbPromotionOrders
                                        .Select(x => x.SubscriptionMonthPromotionBonus.ProductForSubscriptionId).ToList();

            var productSnapshotIds = vmOrderProductSnapshotIds.Concat(vmModifiedBonusProductSnapshotIds)
                                     .Concat(dbOrderProductSnapshotIds).Concat(dbModifiedBonusProductSnapshotIds).Distinct().ToList();
            var productSnapshots = await _subscriptionProductSnapshotRepository.All
                                   .Where(x => productSnapshotIds.Contains(x.Id)).ToListAsync();

            var productIds    = vmPromotionProductIds.Concat(dbPromotionProductIds).Distinct().ToList();
            var allProductIds = productIds.Concat(productSnapshots.Select(x => x.ProductForSubscriptionId)).Distinct().ToList();
            var allProducts   = await _productForSubscriptionRepository.AllIncluding(x => x.Product).Where(x => allProductIds.Contains(x.Id))
                                .ToListAsync();

            var todayStr = DateTime.Now.Date.ToString("yyyy-MM-dd");
            var todayProductSnapshots = await _subscriptionProductSnapshotRepository.All
                                        .Where(x => x.SubscriptionDay.Date == todayStr).ToListAsync();

            // validation by date then by product
            var errors = new List <SubscriptionOrderDayCountErrorViewModel>();

            foreach (var date in allDates)
            {
                foreach (var productId in allProductIds)
                {
                    int count;
                    var vmDatePromotionOrders = promotionOrdersForVm.Where(x => x.Date == date && x.SubscriptionMonthPromotionBonus.ProductForSubscriptionId == productId).ToList();
                    var dbDatePromotionOrders = dbPromotionOrders.Where(x => x.Date == date && x.SubscriptionMonthPromotionBonus.ProductForSubscriptionId == productId).ToList();
                    count = vmDatePromotionOrders.Sum(x => x.DayBonusCount) +
                            dbDatePromotionOrders.Sum(x => x.DayBonusCount);

                    var todayProductSnapshot = todayProductSnapshots.SingleOrDefault(x => x.ProductForSubscriptionId == productId);
                    if (todayProductSnapshot != null) // 可能有order 和 modifiedBonusOrder
                    {
                        var todayProductSnapshotId = todayProductSnapshot.Id;
                        var vmDateOrders           = orderVms.Where(x => x.SubscriptionProductSnapshotId == todayProductSnapshotId)
                                                     .SelectMany(x => x.SubscriptionOrderDates).Where(x => x.Date == date).ToList();
                        foreach (var vmDateOrder in vmDateOrders)
                        {
                            var parentOrder = orderVms.Single(x => x.SubscriptionOrderDates.Contains(vmDateOrder));
                            count += parentOrder.PresetDayCount + parentOrder.PresetDayGift;
                        }
                        var vmDateModifiedOrders = vmModifiedBonusOrders.Where(x => x.Date == date && x.SubscriptionProductSnapshotId == todayProductSnapshotId).ToList();
                        count += vmDateModifiedOrders.Sum(x => x.DayCount);
                    }
                    var productSnapshotIdsForDb =
                        productSnapshots.Where(x => x.ProductForSubscriptionId == productId).Select(x => x.Id).ToList();
                    if (productSnapshotIdsForDb.Any())
                    {
                        var dbDateOrders = dbOrders.Where(x => x.Date == date && productSnapshotIdsForDb.Contains(x.SubscriptionOrder.SubscriptionProductSnapshotId)).ToList();
                        count += dbDateOrders.Sum(x => x.SubscriptionOrder.PresetDayCount + x.SubscriptionOrder.PresetDayGift);
                        var dbDateModifiedBonusOrders = dbModifiedBonusOrders.Where(x => x.Date == date && productSnapshotIdsForDb.Contains(x.SubscriptionProductSnapshotId)).ToList();
                        count += dbDateModifiedBonusOrders.Sum(x => x.DayCount);
                    }

                    if (count < 0)
                    {
                        var product = allProducts.Single(x => x.Id == productId);
                        errors.Add(new SubscriptionOrderDayCountErrorViewModel
                        {
                            Date     = date,
                            DayCount = count,
                            ProductForSubscriptionId = productId,
                            ProductName = product.Product.Name
                        });
                    }
                }
            }
            return(errors);
        }