feat(management): IsMesReportable on alarm commands, IsMesReportableOverride on SetInstanceAlarmOverride

Claude-Session: https://claude.ai/code/session_01Y5ef34iUUMjmwnMpL9xgmB
This commit is contained in:
Joseph Doherty
2026-09-11 10:04:17 -04:00
parent c8a1bcef98
commit 63ec226582
4 changed files with 128 additions and 7 deletions
@@ -34,13 +34,23 @@ public record SetInstanceAreaCommand(int InstanceId, int? AreaId);
/// Sets (or upserts) a per-instance alarm override. For HiLo trigger types the
/// <c>TriggerConfigurationOverride</c> JSON is merged setpoint-by-setpoint with
/// the inherited config; for binary trigger types it replaces the whole config.
/// Either field is optional — pass null to leave it unchanged.
/// Each override field is optional — null means the instance inherits the template value
/// for that field (the row is replaced whole on every call, not merged).
/// </summary>
/// <param name="InstanceId">ID of the instance the override applies to.</param>
/// <param name="AlarmCanonicalName">Canonical (path-qualified for composed members) alarm name.</param>
/// <param name="TriggerConfigurationOverride">Trigger configuration JSON override, or null.</param>
/// <param name="PriorityLevelOverride">Priority level override, or null.</param>
/// <param name="IsMesReportableOverride">
/// Per-instance override of the template alarm's MES-reportable flag. Additive trailing
/// optional; null (the default) inherits the template value, true/false forces it.
/// </param>
public record SetInstanceAlarmOverrideCommand(
int InstanceId,
string AlarmCanonicalName,
string? TriggerConfigurationOverride,
int? PriorityLevelOverride);
int? PriorityLevelOverride,
bool? IsMesReportableOverride = null);
public record DeleteInstanceAlarmOverrideCommand(
int InstanceId,
@@ -42,8 +42,11 @@ public record ResyncInheritedMembersCommand(int TemplateId);
public record AddTemplateAttributeCommand(int TemplateId, string Name, string DataType, string? Value, string? Description, string? DataSourceReference, bool IsLocked, string? ElementDataType = null);
public record UpdateTemplateAttributeCommand(int AttributeId, string Name, string DataType, string? Value, string? Description, string? DataSourceReference, bool IsLocked, string? ElementDataType = null);
public record DeleteTemplateAttributeCommand(int AttributeId);
public record AddTemplateAlarmCommand(int TemplateId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked);
public record UpdateTemplateAlarmCommand(int AlarmId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked);
// IsMesReportable is an additive trailing optional (default false = "not reported to MES"):
// it mirrors TemplateAlarm.IsMesReportable and marks the alarm for inclusion in the MES
// alarm-status feed. Additive-only: never reorder the existing parameters.
public record AddTemplateAlarmCommand(int TemplateId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked, bool IsMesReportable = false);
public record UpdateTemplateAlarmCommand(int AlarmId, string Name, string TriggerType, int PriorityLevel, string? Description, string? TriggerConfiguration, bool IsLocked, bool IsMesReportable = false);
public record DeleteTemplateAlarmCommand(int AlarmId);
// Native alarm source bindings (read-only mirror of an OPC UA A&C / MxGateway source's alarms)
public record AddTemplateNativeAlarmSourceCommand(int TemplateId, string Name, string ConnectionName, string SourceReference, string? ConditionFilter, string? Description, bool IsLocked);
@@ -1175,7 +1175,7 @@ public class ManagementActor : ReceiveActor
var result = await svc.SetAlarmOverrideAsync(
cmd.InstanceId, cmd.AlarmCanonicalName,
cmd.TriggerConfigurationOverride, cmd.PriorityLevelOverride,
user.Username);
user.Username, cmd.IsMesReportableOverride);
return result.IsSuccess
? result.Value
: throw new ManagementCommandException(result.Error);
@@ -3179,7 +3179,8 @@ public class ManagementActor : ReceiveActor
PriorityLevel = cmd.PriorityLevel,
Description = cmd.Description,
TriggerConfiguration = cmd.TriggerConfiguration,
IsLocked = cmd.IsLocked
IsLocked = cmd.IsLocked,
IsMesReportable = cmd.IsMesReportable
};
var result = await svc.AddAlarmAsync(cmd.TemplateId, alarm, user);
return result.IsSuccess ? result.Value : throw new ManagementCommandException(result.Error);
@@ -3194,7 +3195,8 @@ public class ManagementActor : ReceiveActor
PriorityLevel = cmd.PriorityLevel,
Description = cmd.Description,
TriggerConfiguration = cmd.TriggerConfiguration,
IsLocked = cmd.IsLocked
IsLocked = cmd.IsLocked,
IsMesReportable = cmd.IsMesReportable
};
var result = await svc.UpdateAlarmAsync(cmd.AlarmId, alarm, user);
return result.IsSuccess ? result.Value : throw new ManagementCommandException(result.Error);