feat(master): Подкготовка расписания

This commit is contained in:
Mikhail Trubnikov
2023-10-24 12:14:22 +10:00
parent 7991121f07
commit 1d515e46c1
14 changed files with 2882 additions and 22 deletions

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

View File

@@ -25,14 +25,25 @@ namespace PARR.DAL.Models
public Guid? TemplateId { get; set; } 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))] [ForeignKey(nameof(TemplateId))]
public Template? Template { get; set; } public Template? Template { get; set; }
[ForeignKey(nameof(OrderStatusCode))] [ForeignKey(nameof(StatusCode))]
public OrderStatus? OrderStatus { get; set; } public OrderStatus? OrderStatus { get; set; }
[ForeignKey(nameof(NextStatusCode))]
public OrderStatus? NextStatus { get; set; }
public ICollection<AgentHistory> AgentHistories { get; set; } = new HashSet<AgentHistory>(); 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; } public required string Description { get; set; }
[InverseProperty(nameof(Order.OrderStatus))]
public ICollection<Order> Orders { get; set; } = new HashSet<Order>(); 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, WorkGroup = esppOrder.WorkGroup,
ShortName = esppOrder.ShortName, ShortName = esppOrder.ShortName,
TemplateId = template?.Id, TemplateId = template?.Id,
OrderStatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status) StatusCode = (int)orderStatusService.GetOrderStatusByName(esppOrder.Status)
}; };
if (!await orderService.CreateAsync(newOrder) || !await orderService.CommitAsync()) if (!await orderService.CreateAsync(newOrder) || !await orderService.CommitAsync())

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" /> <ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Services\" />
</ItemGroup>
</Project> </Project>

View File

@@ -2,6 +2,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using PARR.BLL; using PARR.BLL;
using PARR.DAL; using PARR.DAL;
using PARR.Master.Settings;
namespace PARR.Master namespace PARR.Master
{ {
@@ -12,14 +13,16 @@ namespace PARR.Master
services.InstallBllServices(configuration); services.InstallBllServices(configuration);
services.InstallDalServices(configuration); services.InstallDalServices(configuration);
// settings var settings = new WorkerSettings();
//SettingsFromDb configuration configuration.GetSection(nameof(WorkerSettings)).Bind(settings);
//var settingsFromDb = new SettingsFromDb(); services.AddSingleton(settings);
//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 //add other services
//services.AddTransient<IEsppApiService, EsppApiService>(); services.AddTransient<IMaster, Master>();
} }
public static IConfigurationBuilder AddMasterConfigurations(this IConfigurationBuilder builder, IServiceCollection services) 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 namespace PARR.MasterWorker
{ {
public class Worker : BackgroundService public class Worker : BackgroundService
{ {
private readonly ILogger<Worker> _logger; private readonly ILogger<Worker> _logger;
private readonly IMaster master;
public Worker(ILogger<Worker> logger) public Worker(ILogger<Worker> logger, IMaster master)
{ {
_logger = logger; _logger = logger;
this.master = master;
} }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await master.StartAsync();
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
// await Task.Delay(1000, stoppingToken);
//}
} }
} }
} }

View File

@@ -31,5 +31,8 @@
"QueueName": "parr-orders", "QueueName": "parr-orders",
"User": "espp_orders_master", "User": "espp_orders_master",
"Password": "Fjhgsdf*^%9sdfsd2" "Password": "Fjhgsdf*^%9sdfsd2"
},
"WorkerSettings": {
"RepeatEvery": "0:30:00"
} }
} }