public JsonResult AddReservationPeriod(ReservationPeriod model)
        {
            if (model.PlaceId == Guid.Empty)
            {
                return(Json("预约活动室不能为空"));
            }

            if (model.PeriodTitle.IsNullOrWhiteSpace())
            {
                return(Json("预约时间段不能为空"));
            }

            if (!_reservationPlaceHelper.Exist(p => p.PlaceId == model.PlaceId))
            {
                return(Json("活动室不存在"));
            }

            using (var redLock = RedisManager.GetRedLockClient($"reservation_{model.PlaceId:N}_periods"))
            {
                if (redLock.TryLock())
                {
                    if (_reservationPeriodHelper.Any(builder => builder
                                                     .IgnoreQueryFilters()
                                                     .WithPredict(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId)
                                                     )
                        )
                    {
                        return(Json("排序重复,请修改"));
                    }

                    model.PeriodId   = Guid.NewGuid();
                    model.CreateBy   = UserName;
                    model.CreateTime = DateTime.UtcNow;
                    model.UpdateBy   = UserName;
                    model.UpdateTime = DateTime.UtcNow;

                    var result = _reservationPeriodHelper.Insert(model);
                    if (result > 0)
                    {
                        OperLogHelper.AddOperLog($"创建预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, UserName);
                    }
                    return(Json(result > 0 ? "" : "创建预约时间段失败"));
                }
                else
                {
                    return(Json("系统繁忙,请稍后重试"));
                }
            }
        }
        public JsonResult UpdateReservationPeriod(ReservationPeriod model)
        {
            if (model.PeriodId == Guid.Empty)
            {
                return(Json("预约时间段不能为空"));
            }
            if (model.PlaceId == Guid.Empty)
            {
                return(Json("预约地点不能为空"));
            }

            if (model.PeriodTitle.IsNullOrWhiteSpace())
            {
                return(Json("预约时间段标题不能为空"));
            }

            if (!_reservationPeriodHelper.Exist(_ => _.PeriodId == model.PeriodId))
            {
                return(Json("预约时间段不存在"));
            }

            // 不修改排序
            //if (_reservationPeriodHelper.Exist(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId))
            //{
            //    return Json("排序重复,请修改");
            //}

            model.UpdateBy   = Username;
            model.UpdateTime = DateTime.Now;

            var result = _reservationPeriodHelper.Update(model, new[] { "PeriodTitle", "PeriodDescription", "UpdateBy", "UpdateTime" });

            if (result > 0)
            {
                OperLogHelper.AddOperLog($"更新预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, Username);
            }
            return(Json(result > 0 ? "" : "更新预约时间段信息失败"));
        }
        public JsonResult AddReservationPeriod(ReservationPeriod model)
        {
            if (model.PlaceId == Guid.Empty)
            {
                return(Json("预约活动室不能为空"));
            }

            if (model.PeriodTitle.IsNullOrWhiteSpace())
            {
                return(Json("预约时间段不能为空"));
            }

            if (!_reservationPlaceHelper.Exist(p => p.PlaceId == model.PlaceId))
            {
                return(Json("活动室不存在"));
            }

            if (_reservationPeriodHelper.Exist(p => p.PeriodIndex == model.PeriodIndex && p.PlaceId == model.PlaceId && p.PeriodId != model.PeriodId))
            {
                return(Json("排序重复,请修改"));
            }

            model.PeriodId   = Guid.NewGuid();
            model.CreateBy   = Username;
            model.CreateTime = DateTime.Now;
            model.UpdateBy   = Username;
            model.UpdateTime = DateTime.Now;

            var result = _reservationPeriodHelper.Insert(model);

            if (result > 0)
            {
                OperLogHelper.AddOperLog($"创建预约时间段{model.PeriodId:N},{model.PeriodTitle}", OperLogModule.ReservationPlace, Username);
            }
            return(Json(result > 0 ? "" : "创建预约时间段失败"));
        }
Пример #4
0
        private IEnumerable <string> GetReservationStrings(string apartmentName, int year, int month)
        {
            var reservationStrings = new List <string>();
            var probeDateFirstDay  = new DateTime(year, month, 1, 0, 0, 0);
            var probeDateLastDay   = new DateTime(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59);
            var fullMonthSelected  = false;
            var reservations       =
                Umbraco.TypedContentAtRoot()
                .First(c => c.DocumentTypeAlias == "Rezerwacje")
                ?.Children.Where(c => c.DocumentTypeAlias == "Rezerwacja")
                ?.Where(c => c.GetPropertyValue <string>("apartament") == apartmentName)
                ?.Where(c => c.GetPropertyValue <string>("status") == "zaakceptowana")
                ?.Select(
                    c =>
            {
                var period = new ReservationPeriod
                {
                    Arrival   = c.GetPropertyValue <DateTime>("dataPrzyjazdu"),
                    Departure = c.GetPropertyValue <DateTime>("dataWyjazdu")
                };
                if (period.Arrival < probeDateFirstDay && period.Departure > probeDateLastDay)
                {
                    fullMonthSelected = true;
                }
                return(period);
            })
                ?.Where(
                    d =>
                    (d.Arrival.Year == year && d.Arrival.Month == month) ||
                    (d.Departure.Year == year && d.Departure.Month == month))
                ?.OrderBy(d => d.Arrival).ToList();

            if (reservations == null)
            {
                return(reservationStrings);
            }
            if (fullMonthSelected)
            {
                var daysInMonth = DateTime.DaysInMonth(year, month);
                for (var i = 1; i <= daysInMonth; i++)
                {
                    reservationStrings.Add($"\"{i}\": [0, 24]");
                }
            }
            else
            {
                // Unite reservations which have overlapping days.
                var i = 0;
                while (i < reservations.Count - 1)
                {
                    if (reservations[i].Departure.Date == reservations[i + 1].Arrival.Date)
                    {
                        reservations[i].Departure = reservations[i + 1].Departure;
                        reservations.RemoveAt(i + 1);
                    }
                    else
                    {
                        i++;
                    }
                }

                foreach (var reservation in reservations)
                {
                    var firstDay = reservation.Arrival.Month == month ? reservation.Arrival.Day : 1;
                    var lastDay  = reservation.Departure.Month == month
                        ? reservation.Departure.Day
                        : DateTime.DaysInMonth(year, month);
                    var isBorderedLeft  = reservation.Arrival.Month != month;
                    var isBorderedRight = reservation.Departure.Month != month;
                    if (firstDay > lastDay)
                    {
                        continue;
                    }
                    if (firstDay == lastDay)
                    {
                        if (reservation.Arrival.Hour > reservation.Departure.Hour)
                        {
                            continue;
                        }
                        reservationStrings.Add($"\"{firstDay}\": [12, 12]");
                    }
                    else
                    {
                        if (isBorderedLeft)
                        {
                            reservationStrings.Add($"\"{firstDay}\": [0, 24]");
                        }
                        else
                        {
                            reservationStrings.Add($"\"{firstDay}\": [12, 24]");
                        }
                        for (i = firstDay + 1; i < lastDay; i++)
                        {
                            reservationStrings.Add($"\"{i}\": [0, 24]");
                        }
                        if (isBorderedRight)
                        {
                            reservationStrings.Add($"\"{lastDay}\": [0, 24]");
                        }
                        else
                        {
                            reservationStrings.Add($"\"{lastDay}\": [0, 12]");
                        }
                    }
                }
            }
            return(reservationStrings);
        }
        public async Task <JsonResult> DeleteReservationPeriod()
        {
            string emailAddress = HttpContext.User.Identity.Name;

            var restaurant = await _context.Restaurant
                             .Where(rest => rest.EmailAddress.Equals(emailAddress))
                             .FirstOrDefaultAsync();

            string headerTableId = Request.Headers["tableId"];
            int    tId           = int.Parse(headerTableId);

            string startTime = Request.Headers["startTime"];
            string endTime   = Request.Headers["endTime"];
            string rpDate    = Request.Headers["dateReservation"];

            var table = await _context.Table
                        .Where(t => t.Id == tId)
                        .FirstOrDefaultAsync();

            // check if reservation Period exists in database
            if (!ReservationPeriodExistsInRest(restaurant.Id, table.Id))
            {
                // reservation Period not found
                HttpContext.Response.StatusCode = 400;
                return(new JsonResult("Reservation Period for table with id " + table.Id + " doesn't exist"));
            }

            ReservationPeriod reservationPeriodToDelete = null;

            var restaurantReservationPeriods = await _context.ReservationPeriod
                                               .Where(rp => rp.RestaurantId == restaurant.Id)
                                               .ToListAsync();

            foreach (ReservationPeriod reservationPeriod in restaurantReservationPeriods)
            {
                long   restId      = reservationPeriod.RestaurantId;
                long   tableId     = reservationPeriod.TableId;
                string dbStartTime = reservationPeriod.StartTime.ToString("HH:mm");
                string dbEndTime   = reservationPeriod.EndTime.ToString("HH:mm");
                string date        = reservationPeriod.Date.ToString();

                if (restaurant.Id == restId && table.Id == tableId && startTime.Equals(dbStartTime) && endTime.Equals(dbEndTime) && date.Equals(rpDate))
                {
                    // reservation period found!
                    reservationPeriodToDelete = reservationPeriod;
                    break;
                }
            }

            if (reservationPeriodToDelete == null)
            {
                // reservation Period data incorrect
                HttpContext.Response.StatusCode = 400;
                return(new JsonResult("Start or End Time not correct"));
            }

            _context.ReservationPeriod.Remove(reservationPeriodToDelete);
            await _context.SaveChangesAsync();

            HttpContext.Response.StatusCode = 200;
            return(new JsonResult("Reservation Period successfully deleted"));
        }
        public async Task <IActionResult> Create(long id, [FromForm] ReservationPeriod reservationPeriod)
        {
            // provjeri je li datum u prošlosti
            CultureInfo us     = new CultureInfo("en-US");
            string      format = "yyyy-MM-dd";
            DateTime    dt1    = DateTime.ParseExact(reservationPeriod.Date, format, us);

            if (dt1 < DateTime.Now)
            {
                //date is in the past, return bad date request
                return(RedirectToAction(nameof(DateInPastRequest), new
                {
                    id = id,
                    date = reservationPeriod.Date
                }));
            }

            string pom;

            pom = reservationPeriod.Date;

            int year  = int.Parse(pom.Substring(0, 4));
            int month = int.Parse(pom.Substring(5, 2));
            int day   = int.Parse(pom.Substring(8, 2));


            string str_day   = day.ToString("D2");
            string str_month = month.ToString("D2");
            string str_year  = year.ToString("D4");

            // formatiraj datum dd/MM/yyyy
            reservationPeriod.Date = str_day + "/" + str_month + "/" + str_year;

            // provjeri je li start time veci od end time-a

            pom = reservationPeriod.StartTime.ToString("HH:mm");
            int NewPeriodMinuteStart = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));

            pom = reservationPeriod.EndTime.ToString("HH:mm");
            int    NewPeriodMinuteEnd = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));
            string description        = reservationPeriod.TableDescription;

            if (NewPeriodMinuteStart > NewPeriodMinuteEnd)
            {
                // odi na bad time request view i posalji potrebne parametre
                return(RedirectToAction(nameof(InvalidStartEndTimeRequest), new
                {
                    id = id,
                    startTime = reservationPeriod.StartTime,
                    endTime = reservationPeriod.EndTime
                }));
            }

            // zahtjev ispravan, provjeri postoji li u bazi rezervacija za taj datum i vrijeme
            int counter = 0;

            var restaurant = await _context.Restaurant
                             .FirstOrDefaultAsync(m => m.Id == id);

            List <Table> tables = _context.Table
                                  .Where(t => t.RestaurantId == id)
                                  .Where(t => t.Description.Equals(description))
                                  .ToList();

            int[] reservedTables = new int[tables.Count];

            List <ReservationPeriod> reservationPeriods = _context.ReservationPeriod
                                                          .Where(rp => rp.RestaurantId == id)
                                                          .Where(rp => rp.TableDescription.Equals(reservationPeriod.TableDescription))
                                                          .Where(rp => rp.Date.Equals(reservationPeriod.Date))
                                                          .ToList();

            foreach (ReservationPeriod period in reservationPeriods)
            {
                string reservationPeriodDate = reservationPeriod.Date;
                // get database reservation Period info
                string dbReservatinPeriodDate = period.Date;
                int    dbYear  = int.Parse(dbReservatinPeriodDate.Substring(6, 4));
                int    dbMonth = int.Parse(dbReservatinPeriodDate.Substring(3, 2));
                int    dbDay   = int.Parse(dbReservatinPeriodDate.Substring(0, 2));

                int rpYear  = int.Parse(reservationPeriodDate.Substring(6, 4));
                int rpMonth = int.Parse(reservationPeriodDate.Substring(3, 2));
                int rpDay   = int.Parse(reservationPeriodDate.Substring(0, 2));

                bool sameDay = (dbYear == rpYear && dbMonth == rpMonth && dbDay == rpDay);
                //if (NewPeriodMinuteStart >= NewPeriodMinuteEnd) break;

                // datum su jednaki, usporedi vremena
                if (sameDay)
                {
                    pom = period.StartTime.ToString("HH:mm");
                    int DbPeriodMinuteStart = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));
                    pom = period.EndTime.ToString("HH:mm");
                    int DbPeriodMinuteEnd = int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));

                    if ((NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteStart <= DbPeriodMinuteEnd) ||
                        (NewPeriodMinuteEnd >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd) ||
                        (NewPeriodMinuteStart <= DbPeriodMinuteStart && NewPeriodMinuteEnd >= DbPeriodMinuteEnd) ||
                        (NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd))
                    {
                        // preklapa se sa postojecim terminom
                        reservedTables[counter++] = (int)period.TableId;
                        continue;
                    }
                    else
                    {
                        // termin se ne preklapa za novu rezervaciju
                        continue;
                    }
                }

                // rezervacija u bazi nije na taj datum, nastavi
            }

            if (counter >= tables.Count)
            {
                // odi na bad request view i posalji potrebne paramtre
                return(RedirectToAction(nameof(BadTimeRequest), new
                {
                    id = id,
                    date = reservationPeriod.Date,
                    startTime = reservationPeriod.StartTime,
                    endTime = reservationPeriod.EndTime
                }));
            }

            foreach (Table table in tables)
            {
                if (reservedTables.Contains((int)table.Id))
                {
                    continue;
                }
                // found table that is free, reserve it
                reservationPeriod.TableId = table.Id;
                break;
            }

            /*
             *          List<Table> tables =  _context.Table
             *                  .Where(t => t.RestaurantId == id)
             *                  .Where(t => t.Description.Equals(description))
             *                  .ToList();
             *
             *          List<long> tableIds = tables.Select(t => t.Id).ToList();
             *
             *          List<long> reservationPeriodTablesIds = _context.ReservationPeriod
             *                                  .Where(rp => rp.RestaurantId == id)
             *                                  .Where(rp => rp.TableDescription.Equals(reservationPeriod.TableDescription))
             *                                  .Select(rp => rp.TableId)
             *                                  .Distinct()
             *                                  .ToList();*/

            /*            // TODO : implement reservation logic
             *          bool found = false;
             *           foreach (var table in tables) {
             *              if (reservationPeriodTablesIds.Contains(table.Id))
             *              {
             *                  // vec postoji rezervacija za stol sa id-om table.Id, provjeri jel se moze napraviti nova rez.
             *                  List<ReservationPeriod> reservationPeriods = _context.ReservationPeriod
             *                                              .Where(rp => rp.RestaurantId == id)
             *                                              .Where(rp => rp.TableId == table.Id)
             *                                              .ToList();
             *
             *                  foreach (ReservationPeriod period in reservationPeriods)
             *                  {
             *
             *                      string reservationPeriodDate = reservationPeriod.Date;
             *                      // get database reservation Period info
             *                      string dbReservatinPeriodDate = period.Date;
             *                      int dbYear = int.Parse(dbReservatinPeriodDate.Substring(6, 4));
             *                      int dbMonth = int.Parse(dbReservatinPeriodDate.Substring(3, 2));
             *                      int dbDay = int.Parse(dbReservatinPeriodDate.Substring(0, 2));
             *
             *                      int rpYear = int.Parse(reservationPeriodDate.Substring(6, 4));
             *                      int rpMonth = int.Parse(reservationPeriodDate.Substring(3, 2));
             *                      int rpDay = int.Parse(reservationPeriodDate.Substring(0, 2));
             *
             *                      bool sameDay = (dbYear == rpYear && dbMonth == rpMonth && dbDay == rpDay);
             *                      //if (NewPeriodMinuteStart >= NewPeriodMinuteEnd) break;
             *
             *                      // datum su jednaki, usporedi vremena
             *                      if (sameDay)
             *                      {
             *                          pom = period.StartTime.ToString("HH:mm");
             *                          int DbPeriodMinuteStart= int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));
             *                          pom = period.EndTime.ToString("HH:mm");
             *                          int DbPeriodMinuteEnd= int.Parse(pom.Substring(0, 2)) * 60 + int.Parse(pom.Substring(3, 2));
             *
             *                          if ((NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteStart <= DbPeriodMinuteEnd) ||
             *                              (NewPeriodMinuteEnd >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd) ||
             *                              (NewPeriodMinuteStart <= DbPeriodMinuteStart && NewPeriodMinuteEnd >= DbPeriodMinuteEnd) ||
             *                              (NewPeriodMinuteStart >= DbPeriodMinuteStart && NewPeriodMinuteEnd <= DbPeriodMinuteEnd))
             *                          {
             *                              // preklapa se sa postojecim terminom
             *                              continue;
             *                          } else
             *                          {
             *                              // termin je slobodan za stol
             *                              found = true;
             *                              reservationPeriod.TableId = table.Id;
             *                              break;
             *                          }
             *                      }
             *
             *                      // rezervacija u bazi nije na taj datum, nastavi
             *
             *
             *                  }
             *                  // ako si rezervirao termin , izadi
             *                  if (found == true)
             *                  {
             *                      break;
             *                  }
             *              } else
             *              {
             *                  // uopce ne postoji rezervation period za ovaj stol, odmah rezerviraj stol
             *
             *                  pom = reservationPeriod.Date;
             *
             *                  int yearToSave = int.Parse(reservationPeriod.Date.Substring(6, 4));
             *                  int monthToSave = int.Parse(reservationPeriod.Date.Substring(3, 2));
             *                  int dayToSave = int.Parse(reservationPeriod.Date.Substring(0, 2));
             *
             *                  string str_dayToSave = day.ToString("D2");
             *                  string str_monthToSave = month.ToString("D2");
             *                  string str_yearToSave = year.ToString("D4");
             *
             *                  // formatiraj datum dd/MM/yyyy
             *
             *                  reservationPeriod.Date = str_day + "/" + str_month + "/" + str_year;
             *
             *                  reservationPeriod.TableId = table.Id;
             *                  found = true;
             *                  break;
             *              }
             *           }*/

            reservationPeriod.RestaurantId = id;

            if (ModelState.IsValid)
            {
                _context.Add(reservationPeriod);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index), new { id = id }));
            }
            return(View(reservationPeriod));
        }