WIP: AI Validator

This commit is contained in:
2025-12-15 20:05:26 +01:00
parent 096ff5573e
commit f10dfe629e
16 changed files with 1686 additions and 9 deletions

View File

@@ -234,6 +234,89 @@
}
</MudTabPanel>
@if (layer?.Type == LayerType.Validation)
{
<MudTabPanel Text="Validation Results" Icon="@Icons.Material.Filled.CheckCircle">
@if (records.Any())
{
var overallStatus = records.FirstOrDefault(r => r.Code == "OverallStatus")?.Desc1;
var confidence = records.FirstOrDefault(r => r.Code == "Confidence")?.Desc1;
var summary = records.FirstOrDefault(r => r.Code == "Summary")?.Desc1;
<MudAlert Severity="@GetValidationSeverity(overallStatus)" Dense="false" Class="mb-4">
<strong>Overall Status:</strong> @(overallStatus?.ToUpper() ?? "UNKNOWN")
@if (!string.IsNullOrEmpty(confidence))
{
<span style="margin-left: 16px;"><strong>Confidence:</strong> @confidence</span>
}
</MudAlert>
@if (!string.IsNullOrEmpty(summary))
{
<MudPaper Class="pa-4 mb-4" Outlined="true">
<MudText Typo="Typo.h6" Class="mb-2">Summary</MudText>
<MudText Typo="Typo.body2">@summary</MudText>
</MudPaper>
}
@if (records.Where(r => r.Code.StartsWith("ANOMALY_")).Any())
{
<MudText Typo="Typo.h6" Class="mb-3">Record Anomalies</MudText>
<MudTable Items="@records.Where(r => r.Code.StartsWith("ANOMALY_")).ToList()"
Dense="true"
Striped="true"
FixedHeader="true"
Elevation="0"
Class="mb-4">
<HeaderContent>
<MudTh>Code</MudTh>
<MudTh>Details</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Code">
<MudChip T="string" Size="Size.Small" Color="Color.Warning">@context.Code.Replace("ANOMALY_", "")</MudChip>
</MudTd>
<MudTd DataLabel="Details">@context.Desc1</MudTd>
</RowTemplate>
</MudTable>
}
@if (records.Where(r => r.Code.StartsWith("STRUCTURAL_")).Any())
{
<MudText Typo="Typo.h6" Class="mb-3">Structural Issues</MudText>
<MudTable Items="@records.Where(r => r.Code.StartsWith("STRUCTURAL_")).ToList()"
Dense="true"
Striped="true"
FixedHeader="true"
Elevation="0"
Class="mb-4">
<HeaderContent>
<MudTh>Type</MudTh>
<MudTh>Details</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Type">
<MudChip T="string" Size="Size.Small" Color="Color.Error">@context.Code.Replace("STRUCTURAL_", "")</MudChip>
</MudTd>
<MudTd DataLabel="Details">@context.Desc1</MudTd>
</RowTemplate>
</MudTable>
}
@if (!records.Where(r => r.Code.StartsWith("ANOMALY_")).Any() && !records.Where(r => r.Code.StartsWith("STRUCTURAL_")).Any())
{
<MudAlert Severity="Severity.Success" Dense="true">
No anomalies or structural issues detected. All data appears normal.
</MudAlert>
}
}
else
{
<MudAlert Severity="Severity.Info">No validation results available.</MudAlert>
}
</MudTabPanel>
}
@if (showHistoryTab)
{
<MudTabPanel Text="History" Icon="@Icons.Material.Filled.History">

View File

@@ -503,7 +503,7 @@ public partial class Details : ComponentBase, IDisposable
if (layer?.Records == null) return false;
var typeRecord = layer.Records.FirstOrDefault(x => x.Code == "Type");
return typeRecord?.Desc1 == "ImportWorker" || typeRecord?.Desc1 == "ProcessWorker";
return typeRecord?.Desc1 == "ImportWorker" || typeRecord?.Desc1 == "ProcessWorker" || typeRecord?.Desc1 == "ValidationWorker";
}
private async Task RunNow()
@@ -545,6 +545,18 @@ public partial class Details : ComponentBase, IDisposable
}
}
// Validation tab helper methods
private Severity GetValidationSeverity(string? status)
{
return status?.ToLower() switch
{
"pass" => Severity.Success,
"warning" => Severity.Warning,
"critical" => Severity.Error,
_ => Severity.Info
};
}
public void Dispose()
{
HubService.EntityChanged -= OnEntityChanged;