Merge branch 'orders-manager' into dev
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
2661
PARR.DAL/Migrations/20231024020909_TblOrderAddNextStatusCode.Designer.cs
generated
Normal file
2661
PARR.DAL/Migrations/20231024020909_TblOrderAddNextStatusCode.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 =>
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
47
PARR.EsppOrderManager/EsppOrderManager.cs
Normal file
47
PARR.EsppOrderManager/EsppOrderManager.cs
Normal 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:
|
||||
}
|
||||
}
|
||||
}
|
||||
8
PARR.EsppOrderManager/IEsppOrderManager.cs
Normal file
8
PARR.EsppOrderManager/IEsppOrderManager.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace PARR.EsppOrderManager
|
||||
{
|
||||
public interface IEsppOrderManager
|
||||
{
|
||||
void Start();
|
||||
void Stop();
|
||||
}
|
||||
}
|
||||
@@ -12,4 +12,8 @@
|
||||
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -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)
|
||||
|
||||
12
PARR.EsppOrderManager/Settings/MqSettings.cs
Normal file
12
PARR.EsppOrderManager/Settings/MqSettings.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
7
PARR.Master/IMaster.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace PARR.Master
|
||||
{
|
||||
public interface IMaster
|
||||
{
|
||||
Task StartAsync();
|
||||
}
|
||||
}
|
||||
45
PARR.Master/Master.cs
Normal file
45
PARR.Master/Master.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,4 +11,8 @@
|
||||
<ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Services\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -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)
|
||||
|
||||
12
PARR.Master/Settings/MqSettings.cs
Normal file
12
PARR.Master/Settings/MqSettings.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
7
PARR.Master/Settings/WorkerSettings.cs
Normal file
7
PARR.Master/Settings/WorkerSettings.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace PARR.Master.Settings
|
||||
{
|
||||
internal class WorkerSettings
|
||||
{
|
||||
public TimeSpan RepeatEvery { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,5 +25,14 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"MqSettings": {
|
||||
"HostName": "parr-rabbitmq",
|
||||
"QueueName": "parr-orders",
|
||||
"User": "espp_orders_master",
|
||||
"Password": "Fjhgsdf*^%9sdfsd2"
|
||||
},
|
||||
"WorkerSettings": {
|
||||
"RepeatEvery": "0:30:00"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user