сдавать скоро ура

This commit is contained in:
devil_1nc 2023-08-20 18:07:51 +04:00
parent f1233bdbcc
commit 36af1cab06
10 changed files with 360 additions and 24 deletions

View File

@ -6,6 +6,5 @@
}
},
"AllowedHosts": "*",
"IPAddress": "http://localhost:5208/"
}

View File

@ -28,6 +28,7 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
{
Id = clientId
});
Console.WriteLine($"{clientId}, {subject}, {text}, {client}, {client?.Email}");
if (client == null)
{
throw new ArgumentNullException($"Клиент с Id:{clientId} не найден.");
@ -51,11 +52,7 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
}
if (model.PackageId < 0)
{
throw new ArgumentNullException("Некорректный идентификатор у пакета", nameof(model.PackageId));
}
if (model.ClientId < 0)
{
throw new ArgumentNullException("Некорректный идентификатор у клиента", nameof(model.ClientId));
throw new ArgumentNullException("Некорректный идентификатор документа", nameof(model.PackageId));
}
if (model.Count <= 0)
{
@ -65,7 +62,7 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
{
throw new ArgumentNullException("Сумма заказа должна быть больше 0", nameof(model.Sum));
}
_logger.LogInformation("Order. OrderID:{Id}. Sum:{ Sum}. PackageId: { PackageId}. ClientId: { ClientId}", model.Id, model.Sum, model.PackageId, model.ClientId);
_logger.LogInformation("Order. OrderID:{Id}.Sum:{ Sum}. PackageId: { PackageId}", model.Id, model.Sum, model.PackageId);
}
public List<OrderViewModel>? ReadList(OrderSearchModel? model)
@ -102,7 +99,11 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
}
public bool StatusUpdate(OrderBindingModel rawModel, OrderStatus _newStatus)
{
var viewModel = _orderStorage.GetElement(new OrderSearchModel { Id = rawModel.Id });
var viewModel = _orderStorage.GetElement(new OrderSearchModel
{
Id = rawModel.Id
});
if (viewModel == null)
{
_logger.LogWarning("Order model not found");
@ -125,6 +126,8 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
}
CheckModel(model, false);
_logger.LogInformation("STAT {model.Status}, {_newStatus}", model.Status, _newStatus);
if (model.Status + 1 != _newStatus)
{
_logger.LogWarning("Status update to " + _newStatus.ToString() + " operation failed. Order status incorrect.");
@ -136,7 +139,7 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
if (result == null)
{
model.Status--;
_logger.LogWarning("Update operation failed");
_logger.LogInformation("Update operation failed");
return false;
}
SendOrderStatusMail(result.ClientId, $"Изменен статус заказа #{result.Id}", $"Заказ #{result.Id} изменен статус на {result.Status}");

View File

@ -35,7 +35,10 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
_logger.LogWarning("DoWork. Implementers is null");
return;
}
var orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят });
var orders = _orderLogic.ReadList(new OrderSearchModel
{
Status = OrderStatus.Принят
});
if (orders == null || orders.Count == 0)
{
_logger.LogWarning("DoWork. Orders is null or empty");
@ -55,7 +58,6 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
return;
}
await RunOrderInWork(implementer);
await Task.Run(() =>
{
foreach (var order in orders)
@ -78,8 +80,10 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
Id = order.Id,
ImplementerId = implementer.Id
});
// отдыхаем
Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
}
}
// кто-то мог уже перехватить заказ, игнорируем ошибку
catch (InvalidOperationException ex)
@ -92,8 +96,6 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
_logger.LogError(ex, "Error while do work");
throw;
}
// отдыхаем
Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
}
});
}
@ -117,14 +119,14 @@ namespace AbstractSoftwareInstallationBusinessLogic.BusinessLogic
}
_logger.LogDebug("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id);
// доделываем работу
Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count);
Thread.Sleep(implementer.WorkExperience * _rnd.Next(10, 30) * runOrder.Count);
_logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id);
_orderLogic.FinishOrder(new OrderBindingModel
{
Id = runOrder.Id
});
// отдыхаем
Thread.Sleep(implementer.Qualification * _rnd.Next(10, 100));
Thread.Sleep(implementer.Qualification * _rnd.Next(1, 10));
}
// заказа может не быть, просто игнорируем ошибку
catch (InvalidOperationException ex)

View File

@ -34,20 +34,29 @@ namespace AbstractSoftwareInstallationBusinessLogic.MailWorker
_smtpClientPort = config.SmtpClientPort;
_popHost = config.PopHost;
_popPort = config.PopPort;
_logger.LogDebug("Config: {login}, {password}, {clientHost},{ clientPOrt}, { popHost}, { popPort}", _mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
_logger.LogDebug("Config: {login}, {password}, {clientHost}, { clientPort}, { popHost}, { popPort} ",
_mailLogin, _mailPassword, _smtpClientHost, _smtpClientPort, _popHost, _popPort);
}
public async void MailSendAsync(MailSendInfoBindingModel info)
{
if (string.IsNullOrEmpty(_mailLogin) || string.IsNullOrEmpty(_mailPassword))
{
_logger.LogError("1: {_mailLogin}, {_mailPassword}",
_mailLogin, _mailPassword);
return;
}
if (string.IsNullOrEmpty(_smtpClientHost) || _smtpClientPort == 0)
{
_logger.LogError("2: {_smtpClientHost}, {_smtpClientPort}",
_smtpClientHost, _smtpClientPort);
return;
}
if (string.IsNullOrEmpty(info.MailAddress) || string.IsNullOrEmpty(info.Subject) || string.IsNullOrEmpty(info.Text))
if (string.IsNullOrEmpty(info.MailAddress)
|| string.IsNullOrEmpty(info.Subject)
|| string.IsNullOrEmpty(info.Text))
{
_logger.LogError("3: {info.MailAddress}, {info.Subject}, {info.Text}",
info.MailAddress, info.Subject, info.Text);
return;
}
_logger.LogDebug("Send Mail: {To}, {Subject}", info.MailAddress, info.Subject);
@ -71,7 +80,6 @@ namespace AbstractSoftwareInstallationBusinessLogic.MailWorker
_logger.LogDebug("Check Mail: {Count} new mails", list.Count);
foreach (var mail in list)
{
mail.ClientId = _clientLogic.ReadElement(new() { Email = mail.SenderName })?.Id;
_messageInfoLogic.Create(mail);
}
}

View File

@ -66,7 +66,7 @@ namespace AbstractSoftwareInstallationBusinessLogic.MailWorker
}
}
}
catch (MailKit.Security.AuthenticationException)
catch (AuthenticationException)
{ }
finally
{

View File

@ -0,0 +1,298 @@
// <auto-generated />
using System;
using AbstractSoftwareInstallationDatabaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace AbstractSoftwareInstallationDatabaseImplement.Migrations
{
[DbContext(typeof(AbstractSoftwareInstallationDatabase))]
[Migration("20230820134448_order_fix")]
partial class order_fix
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
modelBuilder.Entity("AbstractPackageInstallationDatabaseImplement.Models.Order", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("ClientId")
.HasColumnType("int");
b.Property<int>("Count")
.HasColumnType("int");
b.Property<DateTime>("DateCreate")
.HasColumnType("datetime2");
b.Property<DateTime?>("DateImplement")
.HasColumnType("datetime2");
b.Property<int?>("ImplementerId")
.HasColumnType("int");
b.Property<int>("PackageId")
.HasColumnType("int");
b.Property<int>("Status")
.HasColumnType("int");
b.Property<double>("Sum")
.HasColumnType("float");
b.HasKey("Id");
b.HasIndex("ClientId");
b.HasIndex("ImplementerId");
b.HasIndex("PackageId");
b.ToTable("Orders");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Client", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ClientFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Clients");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Implementer", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("ImplementerFIO")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int>("Qualification")
.HasColumnType("int");
b.Property<int>("WorkExperience")
.HasColumnType("int");
b.HasKey("Id");
b.ToTable("Implementers");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.MessageInfo", b =>
{
b.Property<string>("MessageId")
.HasColumnType("nvarchar(450)");
b.Property<string>("Body")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<int?>("ClientId")
.HasColumnType("int");
b.Property<DateTime>("DateDelivery")
.HasColumnType("datetime2");
b.Property<string>("SenderName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<string>("Subject")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("MessageId");
b.HasIndex("ClientId");
b.ToTable("Messages");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Package", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("PackageName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<double>("Price")
.HasColumnType("float");
b.HasKey("Id");
b.ToTable("Packages");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.PackageSoftware", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("PackageId")
.HasColumnType("int");
b.Property<int>("SoftwareId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("PackageId");
b.HasIndex("SoftwareId");
b.ToTable("PackageSoftwares");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Software", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<double>("Cost")
.HasColumnType("float");
b.Property<string>("SoftwareName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Softwares");
});
modelBuilder.Entity("AbstractPackageInstallationDatabaseImplement.Models.Order", b =>
{
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Client", "Client")
.WithMany("Orders")
.HasForeignKey("ClientId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Implementer", "Implementer")
.WithMany("Orders")
.HasForeignKey("ImplementerId");
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Package", "Package")
.WithMany("Orders")
.HasForeignKey("PackageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Client");
b.Navigation("Implementer");
b.Navigation("Package");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.MessageInfo", b =>
{
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Client", "Client")
.WithMany("Messages")
.HasForeignKey("ClientId");
b.Navigation("Client");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.PackageSoftware", b =>
{
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Package", "Package")
.WithMany("Softwares")
.HasForeignKey("PackageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AbstractSoftwareInstallationDatabaseImplement.Models.Software", "Software")
.WithMany("PackageSoftwares")
.HasForeignKey("SoftwareId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Package");
b.Navigation("Software");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Client", b =>
{
b.Navigation("Messages");
b.Navigation("Orders");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Implementer", b =>
{
b.Navigation("Orders");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Package", b =>
{
b.Navigation("Orders");
b.Navigation("Softwares");
});
modelBuilder.Entity("AbstractSoftwareInstallationDatabaseImplement.Models.Software", b =>
{
b.Navigation("PackageSoftwares");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,28 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AbstractSoftwareInstallationDatabaseImplement.Migrations
{
/// <inheritdoc />
public partial class order_fix : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<int>(
name: "ImplementerId",
table: "Orders",
nullable: true,
oldNullable: false,
oldClrType: typeof(int),
oldType: "int");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@ -21,7 +21,6 @@ namespace AbstractPackageInstallationDatabaseImplement.Models
[Required]
public int ClientId { get; private set; }
public int? ImplementerId { get; private set; }
[Required]
public int Count { get; private set; }
[Required]
public double Sum { get; private set; }

View File

@ -23,7 +23,7 @@ builder.Services.AddTransient<IOrderLogic, OrderLogic>();
builder.Services.AddTransient<IClientLogic, ClientLogic>();
builder.Services.AddTransient<IPackageLogic, PackageLogic>();
builder.Services.AddTransient<IMessageInfoLogic, MessageInfoLogic>();
builder.Services.AddTransient<AbstractMailWorker, MailKitWorker>();
builder.Services.AddSingleton<AbstractMailWorker, MailKitWorker>();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
@ -36,6 +36,7 @@ builder.Services.AddSwaggerGen(c =>
var app = builder.Build();
var mailSender = app.Services.GetService<AbstractMailWorker>();
mailSender?.MailConfig(new MailConfigBindingModel
{
MailLogin = builder.Configuration?.GetSection("MailLogin")?.Value?.ToString() ?? string.Empty,

View File

@ -6,12 +6,10 @@
}
},
"AllowedHosts": "*",
"SmtpClientHost": "smtp.gmail.com",
"SmtpClientPort": "587",
"PopHost": "pop.gmail.com",
"PopPort": "995",
"MailLogin": "doodlydoolka@gmail.com",
"MailPassword": "boob pmwo rkhx hfqz"
}