Добавил механизм удаления заготовок (ст.250 мониторинг)

This commit is contained in:
2025-05-26 23:26:41 +04:00
parent 83f1edcd9c
commit e8e9cdca3c
4 changed files with 276 additions and 22 deletions

140
RemovingBillets.cs Normal file
View File

@@ -0,0 +1,140 @@
using Oracle.ManagedDataAccess.Client;
using SendNotify;
using System.Data;
public class RemovingBillets
{
private static readonly object _syncRoot = new object();
private static bool _isProcessActive = false;
private static DateTime _lastCheckTime = DateTime.MinValue;
public static async Task StartRemovalProcess(CancellationToken ct)
{
lock (_syncRoot)
{
if (_isProcessActive)
{
Log.Logger("Процесс удаления уже запущен");
return;
}
_isProcessActive = true;
}
Log.Logger("Процесс удаления: СТАРТ");
try
{
using (var periodicTimer = new PeriodicTimer(TimeSpan.FromSeconds(5)))
{
while (await periodicTimer.WaitForNextTickAsync(ct))
{
if (ct.IsCancellationRequested)
break;
try
{
var result = await CheckAndSendAlerts(ct);
if (!result)
{
Log.Logger("Нет заготовок для удаления - остановка");
break;
}
_lastCheckTime = DateTime.Now;
}
catch (Exception ex) when (ex is not OperationCanceledException)
{
Log.Logger($"Ошибка в процессе удаления: {ex.Message}");
}
}
}
}
catch (OperationCanceledException)
{
Log.Logger("Процесс удаления: ОСТАНОВЛЕН ПО ТРЕБОВАНИЮ");
}
finally
{
lock (_syncRoot)
{
_isProcessActive = false;
}
Program.statusRemovingBillets = false;
Log.Logger("Процесс удаления: ФИНАЛИЗАЦИЯ");
}
}
private static async Task<bool> CheckAndSendAlerts(CancellationToken ct)
{
const string oracleConn = "User Id=main;Password=main;Data Source=10.14.18.50:1521/izl2;";
try
{
using var conn = new OracleConnection(oracleConn);
await conn.OpenAsync(ct);
var products = await GetTrackedProducts(conn, ct);
if (!products.Any()) return false;
foreach (var product in products)
{
ct.ThrowIfCancellationRequested();
await SendToRoll(product.ProductId, conn, ct);
Thread.Sleep(5000);
}
return true;
}
catch
{
throw;
}
}
private static async Task<List<ProductInfo>> GetTrackedProducts(OracleConnection conn, CancellationToken ct)
{
var result = new List<ProductInfo>();
using var cmd = conn.CreateCommand();
cmd.CommandText = @"
SELECT
product_id,
DISCHARGING_DATI
FROM V_TRACKING_MILL
WHERE DISCHARGING_DATI > :last_check";
cmd.Parameters.Add("last_check", OracleDbType.Date).Value = _lastCheckTime;
using var reader = await cmd.ExecuteReaderAsync(ct);
while (await reader.ReadAsync(ct))
{
result.Add(new ProductInfo
{
ProductId = reader.GetInt32(0),
CreatedDate = reader.GetDateTime(1)
});
}
return result;
}
private static async Task SendToRoll(int productId, OracleConnection conn, CancellationToken ct)
{
using var cmd = conn.CreateCommand();
cmd.CommandText = "dbms_alert.signal";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new OracleParameter("name", "UI_ALERT_IZH"));
cmd.Parameters.Add(new OracleParameter("message", $"send_finish_mill {productId}"));
await cmd.ExecuteNonQueryAsync(ct);
Log.Logger($"Отправлен сигнал удаления для ID: {productId}");
}
}
public class ProductInfo
{
public int ProductId { get; set; }
public DateTime CreatedDate { get; set; }
}