PIbd-22. Shabunov O.A. Lab work 05 (Hard) #15

Closed
olshab wants to merge 31 commits from Lab5_Hard into Lab5
5 changed files with 287 additions and 71 deletions
Showing only changes of commit 1d24f91773 - Show all commits

View File

@ -106,60 +106,7 @@ namespace AutoWorkshopDatabaseImplement.Implements
Context.SaveChanges();
return Shop.GetViewModel;
}
public bool RestockingShops(SupplyBindingModel Model)
{
using var Context = new AutoWorkshopDatabase();
var Transaction = Context.Database.BeginTransaction();
var Shops = Context.Shops
.Include(x => x.Repairs)
.ThenInclude(x => x.Repair)
.ToList()
.Where(x => x.RepairsMaxCount > x.ShopRepairs
.Select(x => x.Value.Item2).Sum())
.ToList();
try
{
foreach (Shop Shop in Shops)
{
int Difference = Shop.RepairsMaxCount - Shop.ShopRepairs.Select(x => x.Value.Item2).Sum();
int Refill = Math.Min(Difference, Model.Count);
Model.Count -= Refill;
if (Shop.ShopRepairs.ContainsKey(Model.RepairId))
{
var DatePair = Shop.ShopRepairs[Model.RepairId];
DatePair.Item2 += Refill;
Shop.ShopRepairs[Model.RepairId] = DatePair;
}
else
{
var Repair = Context.Repairs.First(x => x.Id == Model.RepairId);
Shop.ShopRepairs.Add(Model.RepairId, (Repair, Refill));
}
Shop.RepairsDictionatyUpdate(Context);
if (Model.Count == 0)
{
Transaction.Commit();
return true;
}
}
Transaction.Rollback();
return false;
}
catch
{
Transaction.Rollback();
throw;
}
}
}
public bool Sell(SupplySearchModel Model)
{
@ -168,7 +115,7 @@ namespace AutoWorkshopDatabaseImplement.Implements
try
{
var Shops = Context.Shops
var ShopsWithDesiredRepair = Context.Shops
.Include(x => x.Repairs)
.ThenInclude(x => x.Repair)
.ToList()
@ -176,28 +123,29 @@ namespace AutoWorkshopDatabaseImplement.Implements
.OrderByDescending(x => x.ShopRepairs[Model.RepairId.Value].Item2)
.ToList();
foreach (var Shop in Shops)
foreach (var Shop in ShopsWithDesiredRepair)
{
int Residue = Model.Count.Value - Shop.ShopRepairs[Model.RepairId.Value].Item2;
int Slack = Model.Count.Value - Shop.ShopRepairs[Model.RepairId.Value].Item2;
if (Residue > 0)
if (Slack > 0)
{
Shop.ShopRepairs.Remove(Model.RepairId.Value);
Shop.ShopRepairs.Remove(Model.RepairId.Value);
Shop.RepairsDictionatyUpdate(Context);
Context.SaveChanges();
Model.Count = Residue;
Model.Count = Slack;
}
else
{
if (Residue == 0)
if (Slack == 0)
{
Shop.ShopRepairs.Remove(Model.RepairId.Value);
}
else
{
var DataPair = Shop.ShopRepairs[Model.RepairId.Value];
DataPair.Item2 = -Residue;
Shop.ShopRepairs[Model.RepairId.Value] = DataPair;
var RepairAndCount = Shop.ShopRepairs[Model.RepairId.Value];
RepairAndCount.Item2 = -Slack;
Shop.ShopRepairs[Model.RepairId.Value] = RepairAndCount;
}
Shop.RepairsDictionatyUpdate(Context);
@ -216,5 +164,58 @@ namespace AutoWorkshopDatabaseImplement.Implements
throw;
}
}
}
public bool RestockingShops(SupplyBindingModel Model)
{
using var Context = new AutoWorkshopDatabase();
var Transaction = Context.Database.BeginTransaction();
var Shops = Context.Shops
.Include(x => x.Repairs)
.ThenInclude(x => x.Repair)
.ToList()
.Where(x => x.RepairsMaxCount > x.ShopRepairs
.Select(x => x.Value.Item2).Sum())
.ToList();
try
{
foreach (Shop Shop in Shops)
{
int FreeSpaceNum = Shop.RepairsMaxCount - Shop.ShopRepairs.Select(x => x.Value.Item2).Sum();
int Refill = Math.Min(FreeSpaceNum, Model.Count);
Model.Count -= Refill;
if (Shop.ShopRepairs.ContainsKey(Model.RepairId))
{
var RepairAndCount = Shop.ShopRepairs[Model.RepairId];
RepairAndCount.Item2 += Refill;
Shop.ShopRepairs[Model.RepairId] = RepairAndCount;
}
else
{
var Repair = Context.Repairs.First(x => x.Id == Model.RepairId);
Shop.ShopRepairs.Add(Model.RepairId, (Repair, Refill));
}
Shop.RepairsDictionatyUpdate(Context);
if (Model.Count == 0)
{
Transaction.Commit();
return true;
}
}
Transaction.Rollback();
return false;
}
catch
{
Transaction.Rollback();
throw;
}
}
}
}

View File

@ -12,8 +12,8 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace AutoWorkshopDatabaseImplement.Migrations
{
[DbContext(typeof(AutoWorkshopDatabase))]
[Migration("20240402181656_InitialCreate")]
partial class InitialCreate
[Migration("20240417061857_Shops")]
partial class Shops
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -124,6 +124,59 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.ToTable("RepairComponents");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("OpeningDate")
.HasColumnType("timestamp without time zone");
b.Property<int>("RepairsMaxCount")
.HasColumnType("integer");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("integer");
b.Property<int>("RepairId")
.HasColumnType("integer");
b.Property<int>("ShopId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("RepairId");
b.HasIndex("ShopId");
b.ToTable("ShopRepairs");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b =>
{
b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair")
@ -154,6 +207,25 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.Navigation("Repair");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b =>
{
b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair")
.WithMany()
.HasForeignKey("RepairId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AutoWorkshopDatabaseImplement.Models.Shop", "Shop")
.WithMany("Repairs")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Repair");
b.Navigation("Shop");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b =>
{
b.Navigation("RepairComponents");
@ -165,6 +237,11 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.Navigation("Orders");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b =>
{
b.Navigation("Repairs");
});
#pragma warning restore 612, 618
}
}

View File

@ -7,7 +7,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace AutoWorkshopDatabaseImplement.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
public partial class Shops : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
@ -40,6 +40,22 @@ namespace AutoWorkshopDatabaseImplement.Migrations
table.PrimaryKey("PK_Repairs", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Shops",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ShopName = table.Column<string>(type: "text", nullable: false),
Address = table.Column<string>(type: "text", nullable: false),
OpeningDate = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
RepairsMaxCount = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Shops", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Orders",
columns: table => new
@ -91,6 +107,33 @@ namespace AutoWorkshopDatabaseImplement.Migrations
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "ShopRepairs",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
RepairId = table.Column<int>(type: "integer", nullable: false),
ShopId = table.Column<int>(type: "integer", nullable: false),
Count = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ShopRepairs", x => x.Id);
table.ForeignKey(
name: "FK_ShopRepairs_Repairs_RepairId",
column: x => x.RepairId,
principalTable: "Repairs",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_ShopRepairs_Shops_ShopId",
column: x => x.ShopId,
principalTable: "Shops",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Orders_RepairId",
table: "Orders",
@ -105,6 +148,16 @@ namespace AutoWorkshopDatabaseImplement.Migrations
name: "IX_RepairComponents_RepairId",
table: "RepairComponents",
column: "RepairId");
migrationBuilder.CreateIndex(
name: "IX_ShopRepairs_RepairId",
table: "ShopRepairs",
column: "RepairId");
migrationBuilder.CreateIndex(
name: "IX_ShopRepairs_ShopId",
table: "ShopRepairs",
column: "ShopId");
}
/// <inheritdoc />
@ -116,11 +169,17 @@ namespace AutoWorkshopDatabaseImplement.Migrations
migrationBuilder.DropTable(
name: "RepairComponents");
migrationBuilder.DropTable(
name: "ShopRepairs");
migrationBuilder.DropTable(
name: "Components");
migrationBuilder.DropTable(
name: "Repairs");
migrationBuilder.DropTable(
name: "Shops");
}
}
}

View File

@ -121,6 +121,59 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.ToTable("RepairComponents");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("OpeningDate")
.HasColumnType("timestamp without time zone");
b.Property<int>("RepairsMaxCount")
.HasColumnType("integer");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("integer");
b.Property<int>("RepairId")
.HasColumnType("integer");
b.Property<int>("ShopId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("RepairId");
b.HasIndex("ShopId");
b.ToTable("ShopRepairs");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Order", b =>
{
b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair")
@ -151,6 +204,25 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.Navigation("Repair");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.ShopRepair", b =>
{
b.HasOne("AutoWorkshopDatabaseImplement.Models.Repair", "Repair")
.WithMany()
.HasForeignKey("RepairId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AutoWorkshopDatabaseImplement.Models.Shop", "Shop")
.WithMany("Repairs")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Repair");
b.Navigation("Shop");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Component", b =>
{
b.Navigation("RepairComponents");
@ -162,6 +234,11 @@ namespace AutoWorkshopDatabaseImplement.Migrations
b.Navigation("Orders");
});
modelBuilder.Entity("AutoWorkshopDatabaseImplement.Models.Shop", b =>
{
b.Navigation("Repairs");
});
#pragma warning restore 612, 618
}
}

View File

@ -84,8 +84,10 @@ namespace AutoWorkshopDatabaseImplement.Models
{
Context.ShopRepairs.RemoveRange(ShopRepairs.Where(rec => !Model.ShopRepairs.ContainsKey(rec.RepairId)));
Context.SaveChanges();
foreach (var RepairToUpdate in ShopRepairs)
ShopRepairs = Context.ShopRepairs.Where(rec => rec.ShopId == Model.Id).ToList();
foreach (var RepairToUpdate in ShopRepairs)
{
RepairToUpdate.Count = Model.ShopRepairs[RepairToUpdate.RepairId].Item2;
Model.ShopRepairs.Remove(RepairToUpdate.RepairId);