diff --git a/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/ReportLogic.cs b/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/ReportLogic.cs index 3657c5d..c8f5d0c 100644 --- a/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/ReportLogic.cs +++ b/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/ReportLogic.cs @@ -77,7 +77,7 @@ namespace ServiceStationBusinessLogic.BusinessLogic { }; foreach (var work in works) { - var task = _taskStorage.GetElement(new TaskSearchModel { Id = work.TaskId }) ?? throw new Exception("Ошибка получения данных"); + var task = _taskStorage.GetElement(new TaskSearchModel { Id = work.TaskByWorkId }) ?? throw new Exception("Ошибка получения данных"); record.WorkTask.Add(new(work.Id, work.Date.ToShortDateString(), work.Price, task.Id, task.Name)); record.TotalCount++; } diff --git a/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/WorkLogic.cs b/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/WorkLogic.cs index 0cdfb3e..375f64e 100644 --- a/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/WorkLogic.cs +++ b/ServiceStation/ServiceStationBusinessLogic/BusinessLogic/WorkLogic.cs @@ -92,13 +92,13 @@ namespace ServiceStationBusinessLogic.BusinessLogic if (string.IsNullOrEmpty(model.ExecutorId.ToString())) { throw new ArgumentNullException("Нет номера исполнителя", nameof(model.ExecutorId)); } - if (string.IsNullOrEmpty(model.TaskId.ToString())) { - throw new ArgumentNullException("Нет номера задачи", nameof(model.TaskId)); + if (string.IsNullOrEmpty(model.TaskByWorkId.ToString())) { + throw new ArgumentNullException("Нет номера задачи", nameof(model.TaskByWorkId)); } if (model.ClientList.Count <= 0) { throw new ArgumentException("Работа не может быть без клиента", nameof(model.ClientList)); } - _logger.LogInformation($"Work.Id:{model.Id}.Date:{model.Date}.Price:{model.Price}.ExecutorId:{model.ExecutorId}.TaskId:{model.TaskId}." + + _logger.LogInformation($"Work.Id:{model.Id}.Date:{model.Date}.Price:{model.Price}.ExecutorId:{model.ExecutorId}.TaskId:{model.TaskByWorkId}." + $"ClientList.Count:{model.ClientList.Count}"); } } diff --git a/ServiceStation/ServiceStationContracts/BindingModels/WorkBindingModel.cs b/ServiceStation/ServiceStationContracts/BindingModels/WorkBindingModel.cs index ffb0e1a..56bae18 100644 --- a/ServiceStation/ServiceStationContracts/BindingModels/WorkBindingModel.cs +++ b/ServiceStation/ServiceStationContracts/BindingModels/WorkBindingModel.cs @@ -8,7 +8,7 @@ namespace ServiceStationContracts.BindingModels public DateTime Date { get; set; } = DateTime.Now; public double Price { get; set; } public int ExecutorId { get; set; } - public int TaskId { get; set; } + public int TaskByWorkId { get; set; } public Dictionary ClientList { get; set; } = new(); } diff --git a/ServiceStation/ServiceStationContracts/ViewModels/ClientViewModel.cs b/ServiceStation/ServiceStationContracts/ViewModels/ClientViewModel.cs index c5937b0..c38513e 100644 --- a/ServiceStation/ServiceStationContracts/ViewModels/ClientViewModel.cs +++ b/ServiceStation/ServiceStationContracts/ViewModels/ClientViewModel.cs @@ -3,7 +3,7 @@ using System.ComponentModel; namespace ServiceStationContracts.ViewModels { - public class ClientViewModel : IClientModel + public class ClientViewModel : IClientModel, IEquatable { public int Id { get; set; } @@ -12,5 +12,15 @@ namespace ServiceStationContracts.ViewModels [DisplayName("Всего баллов")] public int TotalPoints { get; set; } + + public bool Equals(ClientViewModel? other) { + if (other is null) { + return false; + } + return this.Id == other.Id && this.FIO == other.FIO; + } + + public override bool Equals(object obj) => Equals(obj as ClientViewModel); + public override int GetHashCode() => (Id, FIO).GetHashCode(); } } diff --git a/ServiceStation/ServiceStationContracts/ViewModels/WorkViewModel.cs b/ServiceStation/ServiceStationContracts/ViewModels/WorkViewModel.cs index 26d7106..8509fcc 100644 --- a/ServiceStation/ServiceStationContracts/ViewModels/WorkViewModel.cs +++ b/ServiceStation/ServiceStationContracts/ViewModels/WorkViewModel.cs @@ -16,7 +16,7 @@ namespace ServiceStationContracts.ViewModels public int ExecutorId { get; set; } - public int TaskId { get; set; } + public int TaskByWorkId { get; set; } [DisplayName("Задача")] public string TaskName { get; set; } = string.Empty; diff --git a/ServiceStation/ServiceStationDataModels/Models/IWorkModel.cs b/ServiceStation/ServiceStationDataModels/Models/IWorkModel.cs index 622b45b..16a08c8 100644 --- a/ServiceStation/ServiceStationDataModels/Models/IWorkModel.cs +++ b/ServiceStation/ServiceStationDataModels/Models/IWorkModel.cs @@ -12,7 +12,7 @@ namespace ServiceStationDataModels.Models DateTime Date { get; } double Price { get; } int ExecutorId { get; } - int TaskId { get; } + int TaskByWorkId { get; } // ClientId, ClientModel Dictionary ClientList { get; } diff --git a/ServiceStation/ServiceStationExecutorApp/Controllers/HomeController.cs b/ServiceStation/ServiceStationExecutorApp/Controllers/HomeController.cs index 7837748..bbe1316 100644 --- a/ServiceStation/ServiceStationExecutorApp/Controllers/HomeController.cs +++ b/ServiceStation/ServiceStationExecutorApp/Controllers/HomeController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Formatters; +using Newtonsoft.Json; using ServiceSourceClientApp.Models; using ServiceSourceExecutorApp; using ServiceStationContracts.BindingModels; @@ -115,10 +116,82 @@ namespace ServiceSourceClientApp.Controllers { }); } + [HttpGet] + public IActionResult EditWork(int Id) { + if (Id == 0) { + return RedirectToAction("Index"); + } + var work_info = APIClient.GetRequest>>($"api/Main/GetWork?_workId={Id}") + ?? throw new Exception(" "); + + ViewBag.Tasks = APIClient.GetRequest>($"api/Main/GetTasks?"); + + int task_load_id = JsonConvert.DeserializeObject(work_info[0][0]); + var task_load = APIClient.GetRequest($"api/Main/GetTask?_taskId={task_load_id}") + ?? throw new Exception(" "); + if (ViewBag.Tasks[0].Name != task_load.Name) { + int index = 0; + for (int i = 0; i < ViewBag.Tasks.Count; i++) { + if (ViewBag.Tasks[i].Name == task_load.Name) { + index = i; + break; + } + } + + var tmp = ViewBag.Tasks[0]; + ViewBag.Tasks[0] = task_load; + ViewBag.Tasks[index] = tmp; + } + + List clients_list = new(); + + + foreach (var rec in work_info[1]) { + var client = JsonConvert.DeserializeObject(rec) ?? throw new Exception(" "); + clients_list.Add(client); + } + + var clients = APIClient.GetRequest>($"api/Main/GetClients?") + ?? throw new Exception(" "); + IEnumerable result = clients.Except(clients_list); + + List new_client = new(); + foreach (var client in result) { + new_client.Add(client); + } + + (int, List, List) tuple = (Id, clients_list, new_client); + return View(tuple); + } + + [HttpPost] + public void EditWork(int[] ids, int task, int id) { + if (APIClient.executor == null) { + Response.Redirect("~/Home/Enter"); + return; + } + + APIClient.PostRequest("api/Main/UpdateWork", new WorkFromWebBindingModel { + Id = id, + Price = Calc(task, ids.Length), + ExecutorId = APIClient.executor.Id, + TaskId = task, + client_ids = ids + }); + } + [HttpPost] public double Calc(int task, int count) { var task_info = APIClient.GetRequest($"api/Main/GetTask?_taskId={task}") ?? throw new Exception(" "); return task_info.Price + 700 * count; } + + [HttpGet] + public IActionResult DeleteWork(int id) { + APIClient.PostRequest("api/Main/DeleteWork", new WorkBindingModel { + Id = id, + }); + return RedirectToAction("Index"); + } } } diff --git a/ServiceStation/ServiceStationExecutorApp/Views/Home/CreateWork.cshtml b/ServiceStation/ServiceStationExecutorApp/Views/Home/CreateWork.cshtml index 77d8c7c..45ba4c4 100644 --- a/ServiceStation/ServiceStationExecutorApp/Views/Home/CreateWork.cshtml +++ b/ServiceStation/ServiceStationExecutorApp/Views/Home/CreateWork.cshtml @@ -135,10 +135,10 @@ url: '/Home/CreateWork', data: {'ids':val, 'task': task}, success: function () { - + window.location.href = "Index"; }, error: function () { - + window.location.href = "Index"; } }) }); diff --git a/ServiceStation/ServiceStationExecutorApp/Views/Home/EditWork.cshtml b/ServiceStation/ServiceStationExecutorApp/Views/Home/EditWork.cshtml new file mode 100644 index 0000000..cf73877 --- /dev/null +++ b/ServiceStation/ServiceStationExecutorApp/Views/Home/EditWork.cshtml @@ -0,0 +1,221 @@ +@using ServiceStationContracts.ViewModels +@{ + ViewData["Title"] = "EditWork"; +} + +@model (int, List, List) + + + +
+

Редактировать работу №:@Model.Item1

+
+ +
+
+
Задача:
+
+ +
+
+
+
Стоимость:
+
+ +
+
+
+ +
+

Клиенты в работе

+
+ +
+ @{ + if (Model.Item2 == null) { +

Авторизируйтесь

+ return; + } +
+ +
+ + + + + + + + + + @foreach (var item in Model.Item2) { + + + + + + } + +
+ Номер клиента + + ФИО клиента + + Выбрать все +
+ @Html.DisplayFor(modelItem => item.Id) + + @Html.DisplayFor(modelItem => item.FIO) + + +
+ } +
+ +
+

Добавить новых клиентов

+
+ +
+ @{ + if (Model.Item3 == null) { +

Авторизируйтесь

+ return; + } + + + + + + + + + + @foreach (var item in Model.Item3) { + + + + + + } + +
+ Номер клиента + + ФИО клиента + + Выбрать все +
+ @Html.DisplayFor(modelItem => item.Id) + + @Html.DisplayFor(modelItem => item.FIO) + + +
+ } +
+ + \ No newline at end of file diff --git a/ServiceStation/ServiceStationExecutorApp/Views/Home/Index.cshtml b/ServiceStation/ServiceStationExecutorApp/Views/Home/Index.cshtml index 43266bf..8b9b5ea 100644 --- a/ServiceStation/ServiceStationExecutorApp/Views/Home/Index.cshtml +++ b/ServiceStation/ServiceStationExecutorApp/Views/Home/Index.cshtml @@ -35,7 +35,7 @@ Номер задания - Задания + Задание @@ -52,11 +52,15 @@ @Html.DisplayFor(modelItem => item.Price) - @Html.DisplayFor(modelItem => item.TaskId) + @Html.DisplayFor(modelItem => item.TaskByWorkId) @Html.DisplayFor(modelItem => item.TaskName) + + Изменить + Удалить + } diff --git a/ServiceStation/ServiceStationRestAPI/Controllers/MainController.cs b/ServiceStation/ServiceStationRestAPI/Controllers/MainController.cs index a07cea8..6fb7227 100644 --- a/ServiceStation/ServiceStationRestAPI/Controllers/MainController.cs +++ b/ServiceStation/ServiceStationRestAPI/Controllers/MainController.cs @@ -6,6 +6,7 @@ using ServiceStationContracts.BusinessLogic; using ServiceStationContracts.SearchModels; using ServiceStationContracts.StorageContracts; using ServiceStationContracts.ViewModels; +using Newtonsoft.Json; namespace ServiceStationRestAPI.Controllers { @@ -78,7 +79,7 @@ namespace ServiceStationRestAPI.Controllers { Date = model.Date, Price = model.Price, ExecutorId = model.ExecutorId, - TaskId = model.TaskId, + TaskByWorkId = model.TaskId, ClientList = new() }; @@ -137,9 +138,24 @@ namespace ServiceStationRestAPI.Controllers { } [HttpGet] - public WorkViewModel? GetWork(int _workId) { + public List> GetWork(int _workId) { try { - return _workLogic.ReadElement(new WorkSearchModel { Id = _workId }); + var list = new List>(); + var work_info = _workLogic.ReadElement(new WorkSearchModel { Id = _workId }) ?? throw new Exception("Ошибка получения данных"); + list.Add(new List { work_info.TaskByWorkId.ToString() }); + + List client_list = new(); + foreach (var client in work_info.ClientList) { + var record = new ClientViewModel { + Id = client.Key, + FIO = client.Value.FIO, + TotalPoints = client.Value.TotalPoints, + }; + string jsRec = JsonConvert.SerializeObject(record); + client_list.Add(jsRec); + } + list.Add(client_list); + return list; } catch (Exception ex) { _logger.LogError(ex, $"Ошибка получения работы || work_id = {_workId}"); diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Implements/WorkStorage.cs b/ServiceStation/ServiceStationsDataBaseImplement/Implements/WorkStorage.cs index 2044e7c..159822c 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Implements/WorkStorage.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Implements/WorkStorage.cs @@ -67,25 +67,22 @@ namespace ServiceStationsDataBaseImplement.Implements using var context = new Database(); if (model.Id.HasValue) { return context.Works - .Include(x => x._task) - .Include(x => x.WorkClients) - .ThenInclude(x => x._work) + .Include(x => x.WorkClients) + .ThenInclude(x => x._client) .FirstOrDefault(x => x.Id == model.Id) ?.GetViewModel; } else if (model.ExecutorId.HasValue) { return context.Works - .Include(x => x._task) .Include(x => x.WorkClients) - .ThenInclude(x => x._work) + .ThenInclude(x => x._client) .FirstOrDefault(x => x.ExecutorId == model.ExecutorId) ?.GetViewModel; } return context.Works - .Include(x => x._task) .Include(x => x.WorkClients) - .ThenInclude(x => x._work) - .FirstOrDefault(x => x.TaskId == model.TaskId) + .ThenInclude(x => x._client) + .FirstOrDefault(x => x.TaskByWorkId == model.TaskId) ?.GetViewModel; } @@ -94,7 +91,6 @@ namespace ServiceStationsDataBaseImplement.Implements using var context = new Database(); if (model.DateFrom.HasValue && model.DateTo.HasValue) { return context.Works - .Include(x => x._task) .Include(x => x.WorkClients) .ThenInclude(x => x._client) .Where(x => x.Date >= model.DateFrom && x.Date <= model.DateTo) @@ -102,20 +98,16 @@ namespace ServiceStationsDataBaseImplement.Implements .ToList(); } else if (model.ExecutorId.HasValue) { - return context.Works - .Include(x => x._task) - .Include(x => x.WorkClients) - .ThenInclude(x => x._client) + return context.Works .Where(x => x.ExecutorId == model.ExecutorId) - .ToList() - .Select(x => x.GetViewModel) + .Include(x => x._task) + .Select(x => x.GetViewModel) .ToList(); } return context.Works - .Include(x => x._task) .Include(x => x.WorkClients) .ThenInclude(x => x._client) - .Where(x => x.TaskId == model.TaskId) + .Where(x => x.TaskByWorkId == model.TaskId) .Select(x => x.GetViewModel) .ToList(); } @@ -124,7 +116,6 @@ namespace ServiceStationsDataBaseImplement.Implements { using var context = new Database(); return context.Works - .Include(x => x._task) .Include(x => x.WorkClients) .ThenInclude(x => x._client) .Select(x => x.GetViewModel) diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.cs deleted file mode 100644 index 1a09bae..0000000 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ServiceStationsDataBaseImplement.Migrations -{ - /// - public partial class Migration03 : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Login", - table: "Clients"); - - migrationBuilder.DropColumn( - name: "Password", - table: "Clients"); - - migrationBuilder.AddColumn( - name: "Price", - table: "Tasks", - type: "float", - nullable: false, - defaultValue: 0.0); - - migrationBuilder.AddColumn( - name: "TotalPoints", - table: "Clients", - type: "int", - nullable: false, - defaultValue: 0); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "Price", - table: "Tasks"); - - migrationBuilder.DropColumn( - name: "TotalPoints", - table: "Clients"); - - migrationBuilder.AddColumn( - name: "Login", - table: "Clients", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - - migrationBuilder.AddColumn( - name: "Password", - table: "Clients", - type: "nvarchar(max)", - nullable: false, - defaultValue: ""); - } - } -} diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.Designer.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.Designer.cs similarity index 94% rename from ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.Designer.cs rename to ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.Designer.cs index f80b52b..c46bb64 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822081747_Migration03.Designer.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.Designer.cs @@ -12,8 +12,8 @@ using ServiceStationsDataBaseImplement; namespace ServiceStationsDataBaseImplement.Migrations { [DbContext(typeof(Database))] - [Migration("20240822081747_Migration03")] - partial class Migration03 + [Migration("20240823061523_InitMigration")] + partial class InitMigration { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -107,17 +107,14 @@ namespace ServiceStationsDataBaseImplement.Migrations b.Property("Price") .HasColumnType("float"); - b.Property("TaskId") - .HasColumnType("int"); - - b.Property("_taskId") + b.Property("TaskByWorkId") .HasColumnType("int"); b.HasKey("Id"); b.HasIndex("ExecutorId"); - b.HasIndex("_taskId"); + b.HasIndex("TaskByWorkId"); b.ToTable("Works"); }); @@ -150,7 +147,7 @@ namespace ServiceStationsDataBaseImplement.Migrations modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => { - b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", null) + b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", "_executor") .WithMany("Works") .HasForeignKey("ExecutorId") .OnDelete(DeleteBehavior.Cascade) @@ -158,7 +155,11 @@ namespace ServiceStationsDataBaseImplement.Migrations b.HasOne("ServiceStationsDataBaseImplement.Models.TaskByWork", "_task") .WithMany() - .HasForeignKey("_taskId"); + .HasForeignKey("TaskByWorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("_executor"); b.Navigation("_task"); }); diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.cs similarity index 87% rename from ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.cs rename to ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.cs index a53ccd6..092f3c7 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061523_InitMigration.cs @@ -18,8 +18,7 @@ namespace ServiceStationsDataBaseImplement.Migrations Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), FIO = table.Column(type: "nvarchar(max)", nullable: false), - Password = table.Column(type: "nvarchar(max)", nullable: false), - Login = table.Column(type: "nvarchar(max)", nullable: false) + TotalPoints = table.Column(type: "int", nullable: false) }, constraints: table => { @@ -47,7 +46,8 @@ namespace ServiceStationsDataBaseImplement.Migrations { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), - Name = table.Column(type: "nvarchar(max)", nullable: false) + Name = table.Column(type: "nvarchar(max)", nullable: false), + Price = table.Column(type: "float", nullable: false) }, constraints: table => { @@ -63,7 +63,7 @@ namespace ServiceStationsDataBaseImplement.Migrations Date = table.Column(type: "datetime2", nullable: false), Price = table.Column(type: "float", nullable: false), ExecutorId = table.Column(type: "int", nullable: false), - TaskId = table.Column(type: "int", nullable: false) + TaskByWorkId = table.Column(type: "int", nullable: false) }, constraints: table => { @@ -74,6 +74,12 @@ namespace ServiceStationsDataBaseImplement.Migrations principalTable: "Executors", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Works_Tasks_TaskByWorkId", + column: x => x.TaskByWorkId, + principalTable: "Tasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -108,6 +114,11 @@ namespace ServiceStationsDataBaseImplement.Migrations table: "Works", column: "ExecutorId"); + migrationBuilder.CreateIndex( + name: "IX_Works_TaskByWorkId", + table: "Works", + column: "TaskByWorkId"); + migrationBuilder.CreateIndex( name: "IX_WorksClients_ClientId", table: "WorksClients", @@ -122,9 +133,6 @@ namespace ServiceStationsDataBaseImplement.Migrations /// protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.DropTable( - name: "Tasks"); - migrationBuilder.DropTable( name: "WorksClients"); @@ -136,6 +144,9 @@ namespace ServiceStationsDataBaseImplement.Migrations migrationBuilder.DropTable( name: "Executors"); + + migrationBuilder.DropTable( + name: "Tasks"); } } } diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.Designer.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.Designer.cs similarity index 93% rename from ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.Designer.cs rename to ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.Designer.cs index aabcd2e..99e63ea 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240820063305_InitMigration.Designer.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.Designer.cs @@ -12,8 +12,8 @@ using ServiceStationsDataBaseImplement; namespace ServiceStationsDataBaseImplement.Migrations { [DbContext(typeof(Database))] - [Migration("20240820063305_InitMigration")] - partial class InitMigration + [Migration("20240823061703_Migration02")] + partial class Migration02 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -37,13 +37,8 @@ namespace ServiceStationsDataBaseImplement.Migrations .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("Login") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); + b.Property("TotalPoints") + .HasColumnType("int"); b.HasKey("Id"); @@ -87,6 +82,9 @@ namespace ServiceStationsDataBaseImplement.Migrations .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("Price") + .HasColumnType("float"); + b.HasKey("Id"); b.ToTable("Tasks"); @@ -109,7 +107,7 @@ namespace ServiceStationsDataBaseImplement.Migrations b.Property("Price") .HasColumnType("float"); - b.Property("TaskId") + b.Property("TaskByWorkId") .HasColumnType("int"); b.HasKey("Id"); @@ -147,11 +145,13 @@ namespace ServiceStationsDataBaseImplement.Migrations modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => { - b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", null) + b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", "_executor") .WithMany("Works") .HasForeignKey("ExecutorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + + b.Navigation("_executor"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.cs similarity index 58% rename from ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.cs rename to ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.cs index d4cbb66..4d03333 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823061703_Migration02.cs @@ -10,39 +10,30 @@ namespace ServiceStationsDataBaseImplement.Migrations /// protected override void Up(MigrationBuilder migrationBuilder) { - migrationBuilder.AddColumn( - name: "_taskId", - table: "Works", - type: "int", - nullable: true); + migrationBuilder.DropForeignKey( + name: "FK_Works_Tasks_TaskByWorkId", + table: "Works"); - migrationBuilder.CreateIndex( - name: "IX_Works__taskId", - table: "Works", - column: "_taskId"); - - migrationBuilder.AddForeignKey( - name: "FK_Works_Tasks__taskId", - table: "Works", - column: "_taskId", - principalTable: "Tasks", - principalColumn: "Id"); + migrationBuilder.DropIndex( + name: "IX_Works_TaskByWorkId", + table: "Works"); } /// protected override void Down(MigrationBuilder migrationBuilder) { - migrationBuilder.DropForeignKey( - name: "FK_Works_Tasks__taskId", - table: "Works"); + migrationBuilder.CreateIndex( + name: "IX_Works_TaskByWorkId", + table: "Works", + column: "TaskByWorkId"); - migrationBuilder.DropIndex( - name: "IX_Works__taskId", - table: "Works"); - - migrationBuilder.DropColumn( - name: "_taskId", - table: "Works"); + migrationBuilder.AddForeignKey( + name: "FK_Works_Tasks_TaskByWorkId", + table: "Works", + column: "TaskByWorkId", + principalTable: "Tasks", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); } } } diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.Designer.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.Designer.cs similarity index 90% rename from ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.Designer.cs rename to ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.Designer.cs index b81cf55..1279a4d 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240822072626_Migration02.Designer.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.Designer.cs @@ -12,8 +12,8 @@ using ServiceStationsDataBaseImplement; namespace ServiceStationsDataBaseImplement.Migrations { [DbContext(typeof(Database))] - [Migration("20240822072626_Migration02")] - partial class Migration02 + [Migration("20240823062623_Migration03")] + partial class Migration03 { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -37,13 +37,8 @@ namespace ServiceStationsDataBaseImplement.Migrations .IsRequired() .HasColumnType("nvarchar(max)"); - b.Property("Login") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); + b.Property("TotalPoints") + .HasColumnType("int"); b.HasKey("Id"); @@ -87,8 +82,16 @@ namespace ServiceStationsDataBaseImplement.Migrations .IsRequired() .HasColumnType("nvarchar(max)"); + b.Property("Price") + .HasColumnType("float"); + + b.Property("TaskByWorkId") + .HasColumnType("int"); + b.HasKey("Id"); + b.HasIndex("TaskByWorkId"); + b.ToTable("Tasks"); }); @@ -109,18 +112,13 @@ namespace ServiceStationsDataBaseImplement.Migrations b.Property("Price") .HasColumnType("float"); - b.Property("TaskId") - .HasColumnType("int"); - - b.Property("_taskId") + b.Property("TaskByWorkId") .HasColumnType("int"); b.HasKey("Id"); b.HasIndex("ExecutorId"); - b.HasIndex("_taskId"); - b.ToTable("Works"); }); @@ -150,6 +148,15 @@ namespace ServiceStationsDataBaseImplement.Migrations b.ToTable("WorksClients"); }); + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.TaskByWork", b => + { + b.HasOne("ServiceStationsDataBaseImplement.Models.Work", "work") + .WithMany() + .HasForeignKey("TaskByWorkId"); + + b.Navigation("work"); + }); + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => { b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", null) @@ -157,12 +164,6 @@ namespace ServiceStationsDataBaseImplement.Migrations .HasForeignKey("ExecutorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - - b.HasOne("ServiceStationsDataBaseImplement.Models.TaskByWork", "_task") - .WithMany() - .HasForeignKey("_taskId"); - - b.Navigation("_task"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.cs new file mode 100644 index 0000000..b8850c6 --- /dev/null +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823062623_Migration03.cs @@ -0,0 +1,48 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ServiceStationsDataBaseImplement.Migrations +{ + /// + public partial class Migration03 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "TaskByWorkId", + table: "Tasks", + type: "int", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks", + column: "TaskByWorkId"); + + migrationBuilder.AddForeignKey( + name: "FK_Tasks_Works_TaskByWorkId", + table: "Tasks", + column: "TaskByWorkId", + principalTable: "Works", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Tasks_Works_TaskByWorkId", + table: "Tasks"); + + migrationBuilder.DropIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks"); + + migrationBuilder.DropColumn( + name: "TaskByWorkId", + table: "Tasks"); + } + } +} diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.Designer.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.Designer.cs new file mode 100644 index 0000000..2a94d2e --- /dev/null +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.Designer.cs @@ -0,0 +1,209 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ServiceStationsDataBaseImplement; + +#nullable disable + +namespace ServiceStationsDataBaseImplement.Migrations +{ + [DbContext(typeof(Database))] + [Migration("20240823064037_Migration04")] + partial class Migration04 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.18") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("FIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TotalPoints") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Executor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("FIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Executors"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.TaskByWork", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("TaskByWorkId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("TaskByWorkId") + .IsUnique() + .HasFilter("[TaskByWorkId] IS NOT NULL"); + + b.ToTable("Tasks"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("ExecutorId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("TaskByWorkId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ExecutorId"); + + b.ToTable("Works"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("PointCount") + .HasColumnType("int"); + + b.Property("WorkId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("WorkId"); + + b.ToTable("WorksClients"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.TaskByWork", b => + { + b.HasOne("ServiceStationsDataBaseImplement.Models.Work", "work") + .WithOne("_task") + .HasForeignKey("ServiceStationsDataBaseImplement.Models.TaskByWork", "TaskByWorkId"); + + b.Navigation("work"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => + { + b.HasOne("ServiceStationsDataBaseImplement.Models.Executor", null) + .WithMany("Works") + .HasForeignKey("ExecutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => + { + b.HasOne("ServiceStationsDataBaseImplement.Models.Client", "_client") + .WithMany("WorkClients") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ServiceStationsDataBaseImplement.Models.Work", "_work") + .WithMany("WorkClients") + .HasForeignKey("WorkId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("_client"); + + b.Navigation("_work"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Client", b => + { + b.Navigation("WorkClients"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Executor", b => + { + b.Navigation("Works"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => + { + b.Navigation("WorkClients"); + + b.Navigation("_task"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.cs new file mode 100644 index 0000000..1b58cab --- /dev/null +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/20240823064037_Migration04.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ServiceStationsDataBaseImplement.Migrations +{ + /// + public partial class Migration04 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks"); + + migrationBuilder.CreateIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks", + column: "TaskByWorkId", + unique: true, + filter: "[TaskByWorkId] IS NOT NULL"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks"); + + migrationBuilder.CreateIndex( + name: "IX_Tasks_TaskByWorkId", + table: "Tasks", + column: "TaskByWorkId"); + } + } +} diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/DatabaseModelSnapshot.cs b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/DatabaseModelSnapshot.cs index 35c86fd..cf32f47 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Migrations/DatabaseModelSnapshot.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Migrations/DatabaseModelSnapshot.cs @@ -39,7 +39,7 @@ namespace ServiceStationsDataBaseImplement.Migrations b.HasKey("Id"); - b.ToTable("Clients", (string)null); + b.ToTable("Clients"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Executor", b => @@ -64,7 +64,7 @@ namespace ServiceStationsDataBaseImplement.Migrations b.HasKey("Id"); - b.ToTable("Executors", (string)null); + b.ToTable("Executors"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.TaskByWork", b => @@ -82,9 +82,16 @@ namespace ServiceStationsDataBaseImplement.Migrations b.Property("Price") .HasColumnType("float"); + b.Property("TaskByWorkId") + .HasColumnType("int"); + b.HasKey("Id"); - b.ToTable("Tasks", (string)null); + b.HasIndex("TaskByWorkId") + .IsUnique() + .HasFilter("[TaskByWorkId] IS NOT NULL"); + + b.ToTable("Tasks"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => @@ -104,19 +111,14 @@ namespace ServiceStationsDataBaseImplement.Migrations b.Property("Price") .HasColumnType("float"); - b.Property("TaskId") - .HasColumnType("int"); - - b.Property("_taskId") + b.Property("TaskByWorkId") .HasColumnType("int"); b.HasKey("Id"); b.HasIndex("ExecutorId"); - b.HasIndex("_taskId"); - - b.ToTable("Works", (string)null); + b.ToTable("Works"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => @@ -142,7 +144,16 @@ namespace ServiceStationsDataBaseImplement.Migrations b.HasIndex("WorkId"); - b.ToTable("WorksClients", (string)null); + b.ToTable("WorksClients"); + }); + + modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.TaskByWork", b => + { + b.HasOne("ServiceStationsDataBaseImplement.Models.Work", "work") + .WithOne("_task") + .HasForeignKey("ServiceStationsDataBaseImplement.Models.TaskByWork", "TaskByWorkId"); + + b.Navigation("work"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => @@ -152,12 +163,6 @@ namespace ServiceStationsDataBaseImplement.Migrations .HasForeignKey("ExecutorId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - - b.HasOne("ServiceStationsDataBaseImplement.Models.TaskByWork", "_task") - .WithMany() - .HasForeignKey("_taskId"); - - b.Navigation("_task"); }); modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.WorkClient", b => @@ -192,6 +197,8 @@ namespace ServiceStationsDataBaseImplement.Migrations modelBuilder.Entity("ServiceStationsDataBaseImplement.Models.Work", b => { b.Navigation("WorkClients"); + + b.Navigation("_task"); }); #pragma warning restore 612, 618 } diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Models/Executor.cs b/ServiceStation/ServiceStationsDataBaseImplement/Models/Executor.cs index e627103..4c8e19b 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Models/Executor.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Models/Executor.cs @@ -26,7 +26,7 @@ namespace ServiceStationsDataBaseImplement.Models public string FIO { get; set; } = string.Empty; [ForeignKey("ExecutorId")] - public virtual List Works { get; set; } = new(); + public virtual List? Works { get; set; } public static Executor? Create(ExecutorBindingModel? model) { if (model == null) { @@ -38,7 +38,6 @@ namespace ServiceStationsDataBaseImplement.Models Password = model.Password, FIO = model.FIO }; - } public void Update(ExecutorBindingModel? model) { diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Models/TaskByWork.cs b/ServiceStation/ServiceStationsDataBaseImplement/Models/TaskByWork.cs index 47d7da6..53b3664 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Models/TaskByWork.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Models/TaskByWork.cs @@ -4,6 +4,7 @@ using ServiceStationDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; @@ -18,6 +19,9 @@ namespace ServiceStationsDataBaseImplement.Models { [Required] public double Price { get; set; } + [ForeignKey("TaskByWorkId")] + public virtual Work? work { get; set; } + public static TaskByWork? Create(TaskBindingModel? model) { if (model == null) { return null; diff --git a/ServiceStation/ServiceStationsDataBaseImplement/Models/Work.cs b/ServiceStation/ServiceStationsDataBaseImplement/Models/Work.cs index c353555..71d3067 100644 --- a/ServiceStation/ServiceStationsDataBaseImplement/Models/Work.cs +++ b/ServiceStation/ServiceStationsDataBaseImplement/Models/Work.cs @@ -21,18 +21,17 @@ namespace ServiceStationsDataBaseImplement.Models [Required] public double Price { get; set; } - [ForeignKey("ExecutorId")] public int ExecutorId { get; set; } - [ForeignKey("TaskId")] - public int TaskId { get; set; } + public int TaskByWorkId { get; set; } + [ForeignKey("TaskByWorkId")] public virtual TaskByWork? _task { get; set; } + [ForeignKey("WorkId")] public virtual List WorkClients { get; set; } = new(); - public Dictionary? _clientList = null; [NotMapped] @@ -54,7 +53,7 @@ namespace ServiceStationsDataBaseImplement.Models Date = model.Date, Price = model.Price, ExecutorId = model.ExecutorId, - TaskId = model.TaskId, + TaskByWorkId = model.TaskByWorkId, WorkClients = model.ClientList.Select(x => new WorkClient { _client = context.Clients.First(y => y.Id == x.Key), PointCount = 0 @@ -74,16 +73,16 @@ namespace ServiceStationsDataBaseImplement.Models Date = Date, Price = Price, ExecutorId = ExecutorId, - TaskId = TaskId, + TaskByWorkId = TaskByWorkId, ClientList = ClientList, - TaskName = _task?.Name ?? string.Empty + TaskName = _task?.Name ?? string.Empty, }; public void UpdateClients(Database context, WorkBindingModel model) { - var worckClients = context.WorksClients.Where(rec => rec.WorkId == model.Id).ToList(); - if (worckClients != null && worckClients.Count > 0) { + var _worckClients = context.WorksClients.Where(rec => rec.WorkId == model.Id).ToList(); + if (_worckClients != null && _worckClients.Count > 0) { // Нужно удалить те записи, которых нет в модели - context.WorksClients.RemoveRange(worckClients.Where(rec => !model.ClientList.ContainsKey(rec.ClientId))); + context.WorksClients.RemoveRange(_worckClients); context.SaveChanges(); } // получаем работу, добавляем новые записи @@ -97,6 +96,5 @@ namespace ServiceStationsDataBaseImplement.Models } _clientList = null; } - } }