Merge branch 'orders-manager' into dev

This commit is contained in:
Mikhail Trubnikov
2023-10-24 15:41:05 +10:00
22 changed files with 2983 additions and 37 deletions

View File

@@ -7,7 +7,7 @@ namespace PARR.BLL.Services.Interfaces
public interface IMqService : IDisposable
{
bool InitConsumer(IMqSettings mqSettings, MqMessageHandlerDelegate test);
bool InitConsumer(IMqSettings mqSettings, MqMessageHandlerDelegate messageHandler);
MqSendResult Send(IMqSettings mqSettings, string[] msgList);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,92 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class TblOrderAddNextStatusCode : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Orders_OrderStatuses_OrderStatusCode",
table: "Orders");
migrationBuilder.RenameColumn(
name: "OrderStatusCode",
table: "Orders",
newName: "StatusCode");
migrationBuilder.RenameIndex(
name: "IX_Orders_OrderStatusCode",
table: "Orders",
newName: "IX_Orders_StatusCode");
migrationBuilder.AddColumn<int>(
name: "NextStatusCode",
table: "Orders",
type: "integer",
nullable: true);
migrationBuilder.CreateIndex(
name: "IX_Orders_NextStatusCode",
table: "Orders",
column: "NextStatusCode");
migrationBuilder.AddForeignKey(
name: "FK_Orders_OrderStatuses_NextStatusCode",
table: "Orders",
column: "NextStatusCode",
principalTable: "OrderStatuses",
principalColumn: "Code");
migrationBuilder.AddForeignKey(
name: "FK_Orders_OrderStatuses_StatusCode",
table: "Orders",
column: "StatusCode",
principalTable: "OrderStatuses",
principalColumn: "Code",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Orders_OrderStatuses_NextStatusCode",
table: "Orders");
migrationBuilder.DropForeignKey(
name: "FK_Orders_OrderStatuses_StatusCode",
table: "Orders");
migrationBuilder.DropIndex(
name: "IX_Orders_NextStatusCode",
table: "Orders");
migrationBuilder.DropColumn(
name: "NextStatusCode",
table: "Orders");
migrationBuilder.RenameColumn(
name: "StatusCode",
table: "Orders",
newName: "OrderStatusCode");
migrationBuilder.RenameIndex(
name: "IX_Orders_StatusCode",
table: "Orders",
newName: "IX_Orders_OrderStatusCode");
migrationBuilder.AddForeignKey(
name: "FK_Orders_OrderStatuses_OrderStatusCode",
table: "Orders",
column: "OrderStatusCode",
principalTable: "OrderStatuses",
principalColumn: "Code",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@@ -1564,17 +1564,20 @@ namespace PARR.DAL.Migrations
b.Property<DateTimeOffset?>("DateModified")
.HasColumnType("timestamp with time zone");
b.Property<int?>("NextStatusCode")
.HasColumnType("integer");
b.Property<string>("Number")
.IsRequired()
.HasColumnType("text");
b.Property<int>("OrderStatusCode")
.HasColumnType("integer");
b.Property<string>("ShortName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("StatusCode")
.HasColumnType("integer");
b.Property<Guid?>("TemplateId")
.HasColumnType("uuid");
@@ -1583,7 +1586,9 @@ namespace PARR.DAL.Migrations
b.HasKey("Id");
b.HasIndex("OrderStatusCode");
b.HasIndex("NextStatusCode");
b.HasIndex("StatusCode");
b.HasIndex("TemplateId");
@@ -2382,9 +2387,13 @@ namespace PARR.DAL.Migrations
modelBuilder.Entity("PARR.DAL.Models.Order", b =>
{
b.HasOne("PARR.DAL.Models.OrderStatus", "NextStatus")
.WithMany("OrdersNext")
.HasForeignKey("NextStatusCode");
b.HasOne("PARR.DAL.Models.OrderStatus", "OrderStatus")
.WithMany("Orders")
.HasForeignKey("OrderStatusCode")
.HasForeignKey("StatusCode")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
@@ -2392,6 +2401,8 @@ namespace PARR.DAL.Migrations
.WithMany("Orders")
.HasForeignKey("TemplateId");
b.Navigation("NextStatus");
b.Navigation("OrderStatus");
b.Navigation("Template");
@@ -2577,6 +2588,8 @@ namespace PARR.DAL.Migrations
modelBuilder.Entity("PARR.DAL.Models.OrderStatus", b =>
{
b.Navigation("Orders");
b.Navigation("OrdersNext");
});
modelBuilder.Entity("PARR.DAL.Models.Process", b =>

View File

@@ -25,14 +25,25 @@ namespace PARR.DAL.Models
public Guid? TemplateId { get; set; }
public int OrderStatusCode { get; set; }
/// <summary>
/// Статус в ЕСПП
/// </summary>
public int StatusCode { get; set; }
/// <summary>
/// Статус который должен быть в ЕСПП
/// </summary>
public int? NextStatusCode { get; set; }
[ForeignKey(nameof(TemplateId))]
public Template? Template { get; set; }
[ForeignKey(nameof(OrderStatusCode))]
[ForeignKey(nameof(StatusCode))]
public OrderStatus? OrderStatus { get; set; }
[ForeignKey(nameof(NextStatusCode))]
public OrderStatus? NextStatus { get; set; }
public ICollection<AgentHistory> AgentHistories { get; set; } = new HashSet<AgentHistory>();
}
}

View File

@@ -13,6 +13,10 @@ namespace PARR.DAL.Models
public required string Description { get; set; }
[InverseProperty(nameof(Order.OrderStatus))]
public ICollection<Order> Orders { get; set; } = new HashSet<Order>();
[InverseProperty(nameof(Order.NextStatus))]
public ICollection<Order> OrdersNext { get; set; } = new HashSet<Order>();
}
}

View File

@@ -47,7 +47,7 @@ namespace PARR.EsppOrderLoader.Services
WorkGroup = esppOrder.WorkGroup,
ShortName = esppOrder.ShortName,
TemplateId = template?.Id,
OrderStatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status)
StatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status)
};
if (!await orderService.CreateAsync(newOrder) || !await orderService.CommitAsync())

View File

@@ -0,0 +1,47 @@
using Microsoft.Extensions.Logging;
using PARR.BLL.Services.Interfaces;
using PARR.EsppOrderManager.Settings;
namespace PARR.EsppOrderManager
{
internal class EsppOrderManager : IEsppOrderManager
{
private readonly MqSettings mqSettings;
private readonly IMqService mqService;
private readonly ILogger<EsppOrderManager> logger;
public EsppOrderManager(
MqSettings mqSettings,
IMqService mqService,
ILogger<EsppOrderManager> logger
)
{
this.mqSettings = mqSettings;
this.mqService = mqService;
this.logger = logger;
}
public void Start()
{
var isConnected = mqService.InitConsumer(mqSettings, ManageOrder);
if (!isConnected)
throw new Exception("Ошибка при подключении к RabbitMq");
}
public void Stop()
{
mqService.Dispose();
}
private async Task ManageOrder(string msg)
{
logger.LogDebug($"Получили сообщение: {msg}");
//тут по идее берет в работу / выполняет
//todo:
}
}
}

View File

@@ -0,0 +1,8 @@
namespace PARR.EsppOrderManager
{
public interface IEsppOrderManager
{
void Start();
void Stop();
}
}

View File

@@ -12,4 +12,8 @@
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Services\" />
</ItemGroup>
</Project>

View File

@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using PARR.BLL;
using PARR.DAL;
using PARR.EsppApi;
using PARR.EsppOrderManager.Settings;
namespace PARR.EsppOrderManager
{
@@ -14,14 +15,11 @@ namespace PARR.EsppOrderManager
services.InstallDalServices(configuration);
services.InstallEsppApiServices(configuration);
// settings
//SettingsFromDb configuration
//var settingsFromDb = new SettingsFromDb();
//configuration.GetSection(nameof(SettingsFromDb)).Bind(settingsFromDb);
//services.AddSingleton(settingsFromDb);
var mqSettings = new MqSettings();
configuration.GetSection(nameof(MqSettings)).Bind(mqSettings);
services.AddSingleton(mqSettings);
//add other services
//services.AddTransient<IEsppApiService, EsppApiService>();
services.AddTransient<IEsppOrderManager, EsppOrderManager>();
}
public static IConfigurationBuilder AddEsppOrderManagerConfigurations(this IConfigurationBuilder builder, IServiceCollection services)

View File

@@ -0,0 +1,12 @@
using PARR.BLL.Contracts.Interfaces;
namespace PARR.EsppOrderManager.Settings
{
internal class MqSettings : IMqSettings
{
public string HostName { get; set; } = string.Empty;
public string QueueName { get; set; } = string.Empty;
public string User { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
}

View File

@@ -1,23 +1,28 @@
using PARR.EsppOrderManager;
namespace PARR.EsppOrderManagerWorker
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IEsppOrderManager esppOrderManager;
public Worker(ILogger<Worker> logger)
public Worker(ILogger<Worker> logger, IEsppOrderManager esppOrderManager)
{
_logger = logger;
this.esppOrderManager = esppOrderManager;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
esppOrderManager.Start();
}
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
// await Task.Delay(1000, stoppingToken);
//}
public override Task StopAsync(CancellationToken cancellationToken)
{
esppOrderManager.Stop();
return base.StopAsync(cancellationToken);
}
}
}

View File

@@ -25,5 +25,11 @@
}
}
]
},
"MqSettings": {
"HostName": "parr-rabbitmq",
"QueueName": "parr-orders",
"User": "espp_orders_manager",
"Password": "Lfhsdkfg*&%9sdfgf23"
}
}

7
PARR.Master/IMaster.cs Normal file
View File

@@ -0,0 +1,7 @@
namespace PARR.Master
{
public interface IMaster
{
Task StartAsync();
}
}

45
PARR.Master/Master.cs Normal file
View File

@@ -0,0 +1,45 @@
using Microsoft.Extensions.Logging;
using PARR.Master.Settings;
namespace PARR.Master
{
internal class Master : IMaster
{
private readonly WorkerSettings settings;
private readonly ILogger<Master> logger;
public Master(
WorkerSettings settings,
ILogger<Master> logger
)
{
this.settings = settings;
this.logger = logger;
}
public async Task StartAsync()
{
logger.LogInformation("Запуск сервиса.");
var nextStart = DateTime.Now;
while (true)
{
if (nextStart.Hour == DateTime.Now.Hour && nextStart.Minute == DateTime.Now.Minute)
{
logger.LogInformation("Запуск по расписанию.");
//todo:
// await Tratata();
nextStart = DateTime.Now.Add(settings.RepeatEvery);
logger.LogInformation($"Следующая дата запуска: {nextStart}");
}
// Каждую минуту
await Task.Delay(60 * 1000);
}
}
}
}

View File

@@ -11,4 +11,8 @@
<ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Services\" />
</ItemGroup>
</Project>

View File

@@ -2,6 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using PARR.BLL;
using PARR.DAL;
using PARR.Master.Settings;
namespace PARR.Master
{
@@ -12,14 +13,16 @@ namespace PARR.Master
services.InstallBllServices(configuration);
services.InstallDalServices(configuration);
// settings
//SettingsFromDb configuration
//var settingsFromDb = new SettingsFromDb();
//configuration.GetSection(nameof(SettingsFromDb)).Bind(settingsFromDb);
//services.AddSingleton(settingsFromDb);
var settings = new WorkerSettings();
configuration.GetSection(nameof(WorkerSettings)).Bind(settings);
services.AddSingleton(settings);
var mqSettings = new MqSettings();
configuration.GetSection(nameof(MqSettings)).Bind(mqSettings);
services.AddSingleton(mqSettings);
//add other services
//services.AddTransient<IEsppApiService, EsppApiService>();
services.AddTransient<IMaster, Master>();
}
public static IConfigurationBuilder AddMasterConfigurations(this IConfigurationBuilder builder, IServiceCollection services)

View File

@@ -0,0 +1,12 @@
using PARR.BLL.Contracts.Interfaces;
namespace PARR.Master.Settings
{
internal class MqSettings : IMqSettings
{
public string HostName { get; set; } = string.Empty;
public string QueueName { get; set; } = string.Empty;
public string User { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,7 @@
namespace PARR.Master.Settings
{
internal class WorkerSettings
{
public TimeSpan RepeatEvery { get; set; }
}
}

View File

@@ -1,23 +1,21 @@
using PARR.Master;
namespace PARR.MasterWorker
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IMaster master;
public Worker(ILogger<Worker> logger)
public Worker(ILogger<Worker> logger, IMaster master)
{
_logger = logger;
this.master = master;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
// await Task.Delay(1000, stoppingToken);
//}
await master.StartAsync();
}
}
}

View File

@@ -25,5 +25,14 @@
}
}
]
},
"MqSettings": {
"HostName": "parr-rabbitmq",
"QueueName": "parr-orders",
"User": "espp_orders_master",
"Password": "Fjhgsdf*^%9sdfsd2"
},
"WorkerSettings": {
"RepeatEvery": "0:30:00"
}
}