From d840395ab6731ced8697f8e1204762c3085107d3 Mon Sep 17 00:00:00 2001 From: Kate Date: Wed, 21 Jun 2023 18:10:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BA?= =?UTF-8?q?=D1=80=D1=83=D0=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ExcursionController.cs | 51 +++++++++++++++++-- .../TravelCompanyClientApp/Program.cs | 4 +- .../Excursion/CreateGuideExcursion.cshtml | 41 +++++++++++++++ .../Excursion/CreateTravelExcursion.cshtml | 3 +- .../Views/Excursion/UpdateExcursion.cshtml | 12 +++++ .../Views/Place/CreatePlace.cshtml | 14 ++--- .../Views/Shared/_Layout.cshtml | 3 ++ .../ExcursionBindingModel.cs | 6 +++ .../TouristViewModels/ExcursionViewModel.cs | 6 +++ .../Models/TouristModels/IExcursionModel.cs | 2 + .../Implements/ExcursionStorage.cs | 30 ++++++----- .../Models/OperatorModels/Guide.cs | 1 - .../Models/TouristModel/Excursion.cs | 41 +++++++++++++-- .../Models/TouristModel/Travel.cs | 16 ------ 14 files changed, 181 insertions(+), 49 deletions(-) create mode 100644 TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateGuideExcursion.cshtml diff --git a/TravelCompany/TravelCompanyClientApp/Controllers/ExcursionController.cs b/TravelCompany/TravelCompanyClientApp/Controllers/ExcursionController.cs index 7e247f6..0896e59 100644 --- a/TravelCompany/TravelCompanyClientApp/Controllers/ExcursionController.cs +++ b/TravelCompany/TravelCompanyClientApp/Controllers/ExcursionController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc; using System.Diagnostics; using TravelCompanyClientApp.Models; using TravelCompanyContracts.BindingModels.TouristBindingModels; +using TravelCompanyContracts.BusinessLogicsContracts.OperatorBusinessLogicsContracts; using TravelCompanyContracts.BusinessLogicsContracts.TouristBusinessLogicsContracts; using TravelCompanyContracts.SearchModels.OperatorSearchModels; using TravelCompanyContracts.SearchModels.TouristSearchModels; @@ -20,13 +21,14 @@ namespace TravelCompanyClientApp.Controllers private readonly ILogger _logger; private readonly IExcursionLogic _logic; private readonly ITravelLogic _travelLogic; + private readonly IGuideLogic _guideLogic; - - public ExcursionController(ILogger logger, IExcursionLogic logic, ITravelLogic travelLogic) + public ExcursionController(ILogger logger, IExcursionLogic logic, ITravelLogic travelLogic, IGuideLogic guideLogic) { _logger = logger; _logic = logic; _travelLogic = travelLogic; + _guideLogic = guideLogic; } [HttpGet] public IActionResult Excursion() @@ -108,7 +110,7 @@ namespace TravelCompanyClientApp.Controllers Response.Redirect("/Excursion/Excursion"); } [HttpGet] - public IActionResult CreateTravelExcursion(int id) + public IActionResult CreateTravelExcursion() { if (APIClient.Tourist == null) { @@ -118,7 +120,7 @@ namespace TravelCompanyClientApp.Controllers ViewBag.Excursions = _logic.ReadList(new ExcursionSearchModel { TouristId = APIClient.Tourist.Id }); return View(); } - + [HttpPost] public void CreateTravelExcursion(int travelselect, List excursionselect) { if (APIClient.Tourist == null) @@ -144,7 +146,46 @@ namespace TravelCompanyClientApp.Controllers TourTravels=travel.TourTravels, ExcursionTravels = te }); - Response.Redirect("/Excursion/Excursion"); + Response.Redirect($"/Travel/UpdateTravel/{travel.Id}"); + return; + } + [HttpGet] + public IActionResult CreateGuideExcursion() + { + if (APIClient.Tourist == null) + { + return Redirect("~/Home/Enter"); + } + ViewBag.Guides = _guideLogic.ReadList(null); + ViewBag.Excursions = _logic.ReadList(new ExcursionSearchModel { TouristId = APIClient.Tourist.Id }); + return View(); + } + [HttpPost] + public void CreateGuideExcursion(int excursionselect, List guideselect) + { + if (APIClient.Tourist == null) + { + throw new Exception("Доступно только авторизованным пользователям"); + } + if (excursionselect <= 0 || guideselect == null) + { + throw new Exception("Неправильноо введенные данные"); + } + Dictionary te = new Dictionary(); + foreach (int exc in guideselect) + { + te.Add(exc, _guideLogic.ReadElement(new GuideSearchModel { Id = exc })); + } + var excursion = _logic.ReadElement(new ExcursionSearchModel { Id = excursionselect }); + _logic.Update(new ExcursionBindingModel + { + Id = excursion.Id, + ExcursionName= excursion.ExcursionName, + Duration = excursion.Duration, + ExcursionDescrition= excursion.ExcursionDescrition, + GuideExcursions = te + }); + Response.Redirect($"/Excursion/UpdateExcursion/{excursion.Id}"); return; } } diff --git a/TravelCompany/TravelCompanyClientApp/Program.cs b/TravelCompany/TravelCompanyClientApp/Program.cs index f1d3f35..cc4ae0d 100644 --- a/TravelCompany/TravelCompanyClientApp/Program.cs +++ b/TravelCompany/TravelCompanyClientApp/Program.cs @@ -17,14 +17,14 @@ builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); -builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); -builder.Services.AddTransient(); +builder.Services.AddTransient(); var app = builder.Build(); APIClient.Connect(builder.Configuration); diff --git a/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateGuideExcursion.cshtml b/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateGuideExcursion.cshtml new file mode 100644 index 0000000..0828c8b --- /dev/null +++ b/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateGuideExcursion.cshtml @@ -0,0 +1,41 @@ +@{ + ViewData["Title"] = "CreateGuideExcursion"; +} + +
+

Привязка гидов к экскурсиям

+
+ +
+
+
+
Экскурсия:
+
+ +
+
+ +
+
+
Гиды:
+
+ +
+
+ +
+
+
+
+
+
diff --git a/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateTravelExcursion.cshtml b/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateTravelExcursion.cshtml index 049bdf6..71ffd7a 100644 --- a/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateTravelExcursion.cshtml +++ b/TravelCompany/TravelCompanyClientApp/Views/Excursion/CreateTravelExcursion.cshtml @@ -27,8 +27,7 @@ diff --git a/TravelCompany/TravelCompanyClientApp/Views/Excursion/UpdateExcursion.cshtml b/TravelCompany/TravelCompanyClientApp/Views/Excursion/UpdateExcursion.cshtml index 348d88f..a045448 100644 --- a/TravelCompany/TravelCompanyClientApp/Views/Excursion/UpdateExcursion.cshtml +++ b/TravelCompany/TravelCompanyClientApp/Views/Excursion/UpdateExcursion.cshtml @@ -23,6 +23,18 @@
Описание:
+
+
+
Гиды:
+
+
    + @foreach (var exc in Model.GuideExcursions) + { +
  • @exc.Value.Surname @exc.Value.Name @exc.Value.Patronymic
  • + } +
+
+
diff --git a/TravelCompany/TravelCompanyClientApp/Views/Place/CreatePlace.cshtml b/TravelCompany/TravelCompanyClientApp/Views/Place/CreatePlace.cshtml index 3054463..3715179 100644 --- a/TravelCompany/TravelCompanyClientApp/Views/Place/CreatePlace.cshtml +++ b/TravelCompany/TravelCompanyClientApp/Views/Place/CreatePlace.cshtml @@ -5,13 +5,6 @@

Создание места

-
-
-
Экскурсия:
-
- -
-
Название:
@@ -26,5 +19,12 @@
+
+
+
Экскурсия:
+
+ +
+
diff --git a/TravelCompany/TravelCompanyClientApp/Views/Shared/_Layout.cshtml b/TravelCompany/TravelCompanyClientApp/Views/Shared/_Layout.cshtml index 6456df1..34fd0d1 100644 --- a/TravelCompany/TravelCompanyClientApp/Views/Shared/_Layout.cshtml +++ b/TravelCompany/TravelCompanyClientApp/Views/Shared/_Layout.cshtml @@ -31,6 +31,9 @@ + diff --git a/TravelCompany/TravelCompanyContracts/BindingModels/TouristBindingModels/ExcursionBindingModel.cs b/TravelCompany/TravelCompanyContracts/BindingModels/TouristBindingModels/ExcursionBindingModel.cs index 9e14a02..c9e2e03 100644 --- a/TravelCompany/TravelCompanyContracts/BindingModels/TouristBindingModels/ExcursionBindingModel.cs +++ b/TravelCompany/TravelCompanyContracts/BindingModels/TouristBindingModels/ExcursionBindingModel.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyDataModels.Models.OperatorModels; using TravelCompanyDataModels.Models.TouristModels; namespace TravelCompanyContracts.BindingModels.TouristBindingModels @@ -14,5 +15,10 @@ namespace TravelCompanyContracts.BindingModels.TouristBindingModels public string ExcursionDescrition { get; set; } = string.Empty; public int Duration { get; set; } public int TouristId { get; set; } + public Dictionary GuideExcursions + { + get; + set; + } = new(); } } diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/TouristViewModels/ExcursionViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/TouristViewModels/ExcursionViewModel.cs index 8c7f7a0..c33d346 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/TouristViewModels/ExcursionViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/TouristViewModels/ExcursionViewModel.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyDataModels.Models.OperatorModels; using TravelCompanyDataModels.Models.TouristModels; namespace TravelCompanyContracts.ViewModels.TouristViewModels @@ -18,5 +19,10 @@ namespace TravelCompanyContracts.ViewModels.TouristViewModels [DisplayName("Длительность экскурсии")] public int Duration { get; set; } public int TouristId { get; set; } + public Dictionary GuideExcursions + { + get; + set; + } = new(); } } diff --git a/TravelCompany/TravelCompanyDataModels/Models/TouristModels/IExcursionModel.cs b/TravelCompany/TravelCompanyDataModels/Models/TouristModels/IExcursionModel.cs index 0efc542..fff3d99 100644 --- a/TravelCompany/TravelCompanyDataModels/Models/TouristModels/IExcursionModel.cs +++ b/TravelCompany/TravelCompanyDataModels/Models/TouristModels/IExcursionModel.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyDataModels.Models.OperatorModels; namespace TravelCompanyDataModels.Models.TouristModels { @@ -11,5 +12,6 @@ namespace TravelCompanyDataModels.Models.TouristModels string ExcursionName { get; } string ExcursionDescrition { get; } int Duration { get; } + Dictionary GuideExcursions { get; } } } diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Implements/ExcursionStorage.cs b/TravelCompany/TravelCompanyDatabaseImplement/Implements/ExcursionStorage.cs index d709b4c..fe7deb0 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Implements/ExcursionStorage.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Implements/ExcursionStorage.cs @@ -18,8 +18,10 @@ namespace TravelCompanyDatabaseImplement.Implements { using var context = new TravelCompanyDatabase(); return context.Excursions - .Select(x => x.GetViewModel) - .ToList(); + .Include(x => x.Guides) + .ThenInclude(x => x.Guide) + .Select(x => x.GetViewModel) + .ToList(); } public List GetFilteredList(ExcursionSearchModel model) @@ -28,10 +30,12 @@ namespace TravelCompanyDatabaseImplement.Implements if (model.TouristId.HasValue) { return context.Excursions - .Where(x => x.TouristId == model.TouristId) - .Include(x => x.Tourist) - .Select(x => x.GetViewModel) - .ToList(); + .Where(x => x.TouristId == model.TouristId) + .Include(x => x.Tourist) + .Include(x => x.Guides) + .ThenInclude(x => x.Guide) + .Select(x => x.GetViewModel) + .ToList(); } else return new(); } @@ -43,11 +47,13 @@ namespace TravelCompanyDatabaseImplement.Implements } using var context = new TravelCompanyDatabase(); return context.Excursions - .FirstOrDefault(x => - !string.IsNullOrEmpty(model.ExcursionName) && x.ExcursionName == - model.ExcursionName || - model.Id.HasValue && x.Id == model.Id) - ?.GetViewModel; + .Include(x => x.Guides) + .ThenInclude(x => x.Guide) + .FirstOrDefault(x => + !string.IsNullOrEmpty(model.ExcursionName) && x.ExcursionName == + model.ExcursionName || + model.Id.HasValue && x.Id == model.Id) + ?.GetViewModel; } public ExcursionViewModel? Insert(ExcursionBindingModel model) { @@ -70,7 +76,7 @@ namespace TravelCompanyDatabaseImplement.Implements { return null; } - component.Update(model); + component.Update(context, model); context.SaveChanges(); return component.GetViewModel; } diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/OperatorModels/Guide.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/OperatorModels/Guide.cs index 13d0146..e818815 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/OperatorModels/Guide.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/OperatorModels/Guide.cs @@ -46,7 +46,6 @@ namespace TravelCompanyDatabaseImplement.Models.OperatorModels Name = Name, Patronymic = Patronymic, OperatorId = OperatorId, - OperatorLogin = Operator.Login }; } } \ No newline at end of file diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Excursion.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Excursion.cs index c4e5fcd..a8d4553 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Excursion.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Excursion.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using TravelCompanyDataModels.Models.TouristModels; using TravelCompanyContracts.BindingModels.TouristBindingModels; using TravelCompanyContracts.ViewModels.TouristViewModels; +using TravelCompanyDataModels.Models.OperatorModels; namespace TravelCompanyDatabaseImplement.Models.TouristModel { @@ -27,9 +28,21 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel public virtual List Places { get; set; } = new(); [ForeignKey("ExcursionId")] public virtual List ExcursionTravels { get; set; } = new(); + public Dictionary? _guideExcursions = null; + [NotMapped] + public Dictionary GuideExcursions + { + get + { + if (_guideExcursions == null) + { + _guideExcursions = Guides.ToDictionary(rec => rec.GuideId, rec => rec.Guide as IGuideModel); + } + return _guideExcursions; + } + } [ForeignKey("ExcursionId")] - public virtual List GuideExcursions { get; set; } = new(); - + public virtual List Guides { get; set; } = new(); public static Excursion? Create(ExcursionBindingModel model) { if (model == null) @@ -45,7 +58,7 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel TouristId = model.TouristId }; } - public void Update(ExcursionBindingModel model) + public void Update(TravelCompanyDatabase context, ExcursionBindingModel model) { if (model == null) { @@ -54,6 +67,25 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel ExcursionName = model.ExcursionName; ExcursionDescrition = model.ExcursionDescrition; Duration = model.Duration; + + var GuideExcursions = context.GuideExcursions.Where(rec => rec.ExcursionId == model.Id).ToList(); + if (GuideExcursions != null && GuideExcursions.Count > 0) + { + // удалили те, которых нет в модели + context.GuideExcursions.RemoveRange(GuideExcursions.Where(rec => model.Id == rec.Excursion.Id)); + context.SaveChanges(); + } + var Excursion = context.Excursions.First(x => x.Id == Id); + foreach (var rc in model.GuideExcursions) + { + context.GuideExcursions.Add(new GuideExcursion + { + Excursion = Excursion, + Guide = context.Guides.First(x => x.Id == rc.Key), + }); + context.SaveChanges(); + } + _guideExcursions = null; } public ExcursionViewModel GetViewModel => new() { @@ -61,7 +93,8 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel ExcursionName = ExcursionName, ExcursionDescrition = ExcursionDescrition, Duration = Duration, - TouristId = TouristId + TouristId = TouristId, + GuideExcursions=GuideExcursions }; } } \ No newline at end of file diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Travel.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Travel.cs index 5fb4b01..13f1e20 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Travel.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/TouristModel/Travel.cs @@ -33,9 +33,6 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel { if (_tourTravels == null) { - using var context = new TravelCompanyDatabase(); - //_tourTravels = Tours.ToDictionary(x => x.TourId, x => (context.Tours.FirstOrDefault(y => y.Id == x.TourId)! as ITourModel)); - _tourTravels = Tours.ToDictionary(rec => rec.TourId, rec => rec.Tour as ITourModel); } return _tourTravels; @@ -49,7 +46,6 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel { if (_excursionTravels == null) { - _excursionTravels = Excursions.ToDictionary(rec => rec.ExcursionId, rec => rec.Excursion as IExcursionModel); } @@ -82,17 +78,6 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel }).ToList() }; } - public static Travel Create(TravelBindingModel model) - { - return new Travel - { - Id = model.Id, - TravelName = model.TravelName, - DateStart = model.DateStart, - TouristId = model.TouristId, - TravelDescription = model.TravelDescription - }; - } public void Update(TravelCompanyDatabase context, TravelBindingModel model) { if (model == null) @@ -131,7 +116,6 @@ namespace TravelCompanyDatabaseImplement.Models.TouristModel _tourTravels = null; try { - var Excursion = context.Excursions.First(x => x.Id == Id); foreach (var rc in model.ExcursionTravels) { context.ExcursionTravels.Add(new ExcursionTravel