feat(config-db): AddAlarmMesReportable migration (TemplateAlarms.IsMesReportable, InstanceAlarmOverrides.IsMesReportableOverride)

Claude-Session: https://claude.ai/code/session_01Y5ef34iUUMjmwnMpL9xgmB
This commit is contained in:
Joseph Doherty
2026-09-11 09:55:47 -04:00
parent 54e21a8107
commit 30a23458e9
4 changed files with 2229 additions and 1 deletions
@@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Migrations
{
/// <inheritdoc />
public partial class AddAlarmMesReportable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<bool>(
name: "IsMesReportable",
table: "TemplateAlarms",
type: "bit",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsMesReportableOverride",
table: "InstanceAlarmOverrides",
type: "bit",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "IsMesReportable",
table: "TemplateAlarms");
migrationBuilder.DropColumn(
name: "IsMesReportableOverride",
table: "InstanceAlarmOverrides");
}
}
}
@@ -611,6 +611,9 @@ namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Migrations
b.Property<int>("InstanceId")
.HasColumnType("int");
b.Property<bool?>("IsMesReportableOverride")
.HasColumnType("bit");
b.Property<int?>("PriorityLevelOverride")
.HasColumnType("int");
@@ -1477,6 +1480,9 @@ namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Migrations
b.Property<bool>("IsLocked")
.HasColumnType("bit");
b.Property<bool>("IsMesReportable")
.HasColumnType("bit");
b.Property<bool>("LockedInDerived")
.HasColumnType("bit");
@@ -3,12 +3,14 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Audit;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.ExternalSystems;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Instances;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Notifications;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites;
using ZB.MOM.WW.ScadaBridge.Commons.Entities.Templates;
using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums;
using ZB.MOM.WW.ScadaBridge.Commons.Types.Templates;
using ZB.MOM.WW.ScadaBridge.ConfigurationDatabase;
using ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Repositories;
using ZB.MOM.WW.ScadaBridge.Commons.Types.Templates;
namespace ZB.MOM.WW.ScadaBridge.ConfigurationDatabase.Tests;
@@ -111,6 +113,45 @@ public class SchemaConfigurationTests : IDisposable
Assert.Equal(new[] { nameof(SiteCall.TerminalAtUtc) }, index.Properties.Select(p => p.Name).ToArray());
Assert.Equal("[TerminalAtUtc] IS NOT NULL", index.GetFilter());
}
// MES-reportable alarm flag: TemplateAlarm.IsMesReportable (bool, non-nullable,
// defaults false) and the nullable per-instance InstanceAlarmOverride
// .IsMesReportableOverride (null = inherit) must both round-trip through the
// configuration database. Backed on SQL Server by the AddAlarmMesReportable
// migration; pinned here on the model/persist path.
[Fact]
public async Task TemplateAlarm_And_Override_PersistMesReportableFlags()
{
var site = new Site("Site1", "S-001");
var template = new Template("MesAlarmT1");
_context.Sites.Add(site);
_context.Templates.Add(template);
await _context.SaveChangesAsync();
var instance = new Instance("MesAlarmInst1") { SiteId = site.Id, TemplateId = template.Id };
_context.Instances.Add(instance);
await _context.SaveChangesAsync();
var alarm = new TemplateAlarm("HighTemp")
{
TemplateId = template.Id,
TriggerType = AlarmTriggerType.HiLo,
PriorityLevel = 500,
IsMesReportable = true
};
var ovr = new InstanceAlarmOverride("HighTemp")
{
InstanceId = instance.Id,
IsMesReportableOverride = false
};
_context.TemplateAlarms.Add(alarm);
_context.InstanceAlarmOverrides.Add(ovr);
await _context.SaveChangesAsync();
_context.ChangeTracker.Clear();
Assert.True((await _context.TemplateAlarms.SingleAsync(a => a.Id == alarm.Id)).IsMesReportable);
Assert.False((await _context.InstanceAlarmOverrides.SingleAsync(o => o.Id == ovr.Id)).IsMesReportableOverride);
}
}
public class SplitQueryBehaviourTests : IDisposable