public (Money, int) CurrentConsumption()
        {
            var amtConsumption = Consumptions.Aggregate(Money.Euro(0), (s, i) => s + i.ConsumedAmount);
            var qtConsumption  = Consumptions.Aggregate(0, (s, i) => s + i.ConsumedQuantity);

            return(amtConsumption, qtConsumption);
        }
        public void CalculateAverage()
        {
            float distance = Consumptions.Sum(c => c.Distance);
            float fuel     = Consumptions.Sum(c => c.Fuel);
            float average  = 0.0f;

            if (distance > 0.0f)
            {
                average = (fuel * 100) / distance;
            }
            Average = (float)Math.Round(average, 2);
        }
 public void Add(float distance, float fuel)
 {
     if (distance > 0 && fuel > 0)
     {
         Consumption consumption = new Consumption()
         {
             Distance = distance,
             Fuel     = fuel
         };
         Consumptions.Add(consumption);
         CalculateAverage();
     }
 }
        /// <summary>
        /// 次卡消费
        /// </summary>
        /// <param name="timesCardProduct">次卡对象</param>
        /// <param name="tutor">教师</param>
        /// <returns>消费记录</returns>
        public Consumption Consume(Tutor tutor)
        {
            if (Remainder <= 0)
            {
                throw new BalanceNotEnoughException("余额不足!");
            }
            Remainder--;

            Consumption consumption = new Consumption()
            {
                MemberCard   = this,
                MemberCardId = this.Id,
                Tutor        = tutor,
                TutorId      = tutor.Id,
                ConsumeDate  = DateTime.Now
            };

            Consumptions.Add(consumption);

            return(consumption);
        }
        /// <summary>
        /// 课时消费
        /// </summary>
        /// <param name="lectureProduct">课程对象</param>
        /// <param name="tutor">教师</param>
        /// <param name="lectureDescription">授课内容</param>
        /// <returns>消费记录</returns>
        public Consumption Learn(Tutor tutor, string lectureDescription)
        {
            if (Remainder <= 0)
            {
                throw new BalanceNotEnoughException("余额不足!");
            }
            Remainder--;

            Session session = new Session()
            {
                MemberCard   = this,
                MemberCardId = this.Id,
                Tutor        = tutor,
                TutorId      = tutor.Id,
                Description  = lectureDescription,
                ConsumeDate  = DateTime.Now
            };

            Consumptions.Add(session);

            return(session);
        }
        public async Task <ActionResult <Orders> > StartProduction(int id, int warehouseId)
        {
            var order = await _context.Orders
                        .Where(o => o.OrderId == id)
                        .Include(o => o.FurnitureOrderRows)
                        .ThenInclude(r => r.Furniture)
                        .ThenInclude(f => f.DetailsInFurnitures)
                        .ThenInclude(r => r.AdditionalDetailsOrdered)
                        .ThenInclude(a => a.DetailInFurniture)
                        .FirstOrDefaultAsync();

            if (order == null)
            {
                return(NotFound());
            }

            foreach (var row in order.FurnitureOrderRows)
            {
                //check if enough details
                var furnitureDetails = row.Furniture.DetailsInFurnitures
                                       .Select(d => new { d.DetailId, Count = d.Count * row.Count })
                                       .ToDictionary(k => k.DetailId);
                var additionalDetails = row.AdditionalDetailsOrdered
                                        .Select(d => new { d.DetailInFurniture.DetailId, Count = d.Count * row.Count })
                                        .ToDictionary(k => k.DetailId);
                var neededDetails = furnitureDetails.Concat(additionalDetails).GroupBy(d => d.Key)
                                    .ToDictionary(d => d.Key,
                                                  d => new
                {
                    d.First().Value.DetailId,
                    Count = d.Sum(d => d.Value.Count) as int?
                });

                var warehouseDetails = await _context.WarehouseDetails
                                       .Where(w => w.WarehouseId == warehouseId)
                                       .Select(wd => new { wd.DetailId, wd.Count })
                                       .ToDictionaryAsync(k => k.DetailId as int?);

                var missingDetails = new Dictionary <int, int>();

                foreach (var detail in neededDetails)
                {
                    if (!warehouseDetails.ContainsKey(detail.Key) ||
                        warehouseDetails[detail.Key].Count < detail.Value.Count)
                    {
                        //not enough
                        missingDetails.Add((int)detail.Key,
                                           (int)(detail.Value.Count - warehouseDetails[detail.Key].Count));
                    }
                    warehouseDetails[detail.Key] = new
                    {
                        DetailId = (int)detail.Value.DetailId,
                        Count    = warehouseDetails[detail.Key].Count - detail.Value.Count
                    };

                    //remove used details from warehouse
                    var wd = await _context.WarehouseDetails
                             .Where(wd => wd.DetailId == detail.Value.DetailId)
                             .FirstOrDefaultAsync();

                    wd.Count = warehouseDetails[detail.Key].Count;
                    _context.WarehouseDetails.Update(wd);
                }

                if (missingDetails.Any())
                {
                    return(BadRequest(missingDetails));
                }

                //add production
                var production = new Productions()
                {
                    WarehouseId         = warehouseId,
                    StartedDate         = DateTime.Now,
                    FurnitureOrderRowId = row.FurnitureOrderRowId,
                };

                //add consumptions
                foreach (var detail in neededDetails)
                {
                    var consumption = new Consumptions()
                    {
                        Date            = DateTime.Now,
                        WarehouseDetail = await _context.WarehouseDetails
                                          .Where(wd => wd.DetailId == detail.Value.DetailId)
                                          .FirstOrDefaultAsync(),
                        Count = (int)detail.Value.Count
                    };
                    production.Consumptions.Add(consumption);
                }

                _context.Productions.Add(production);
            }

            //change order status
            order.Status = OrderStatus.InProduction;
            _context.Orders.Update(order);

            await _context.SaveChangesAsync();

            return(order);
        }
 public int Update(Consumptions t)
 {
     throw new NotImplementedException();
 }
        /// <summary>
        /// 添加消费记录
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public int Add(Consumptions t)
        {
            var result = iConsumptions_DAL.Add(t);

            return(result);
        }
 public void ReserveLimitsFor(string caseNumber, Guid serviceId, DateTime consumptionDate, Money consumedAmount, int consumedQuantity)
 {
     Consumptions.Add(new Consumption(this, caseNumber, serviceId, consumptionDate, consumedAmount, consumedQuantity));
 }
 public void Delete(Consumption consumption)
 {
     Consumptions.Remove(consumption);
     CalculateAverage();
 }