feat(transport): carry IsMesReportable / IsMesReportableOverride through bundles (round-trip guard extended)
Claude-Session: https://claude.ai/code/session_01Y5ef34iUUMjmwnMpL9xgmB
This commit is contained in:
@@ -491,7 +491,8 @@ public sealed class ArtifactDiff
|
||||
e => e.AlarmCanonicalName,
|
||||
i => i.AlarmCanonicalName,
|
||||
(e, i) => e.TriggerConfigurationOverride == i.TriggerConfigurationOverride
|
||||
&& e.PriorityLevelOverride == i.PriorityLevelOverride,
|
||||
&& e.PriorityLevelOverride == i.PriorityLevelOverride
|
||||
&& e.IsMesReportableOverride == i.IsMesReportableOverride,
|
||||
"AlarmOverrides",
|
||||
changes);
|
||||
|
||||
|
||||
@@ -2172,6 +2172,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
TriggerConfiguration = al.TriggerConfiguration,
|
||||
IsLocked = al.IsLocked,
|
||||
LockedInDerived = al.LockedInDerived,
|
||||
IsMesReportable = al.IsMesReportable,
|
||||
});
|
||||
}
|
||||
foreach (var s in dto.Scripts)
|
||||
@@ -2395,6 +2396,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
current.TriggerConfiguration = alarmDto.TriggerConfiguration;
|
||||
current.IsLocked = alarmDto.IsLocked;
|
||||
current.LockedInDerived = alarmDto.LockedInDerived;
|
||||
current.IsMesReportable = alarmDto.IsMesReportable;
|
||||
current.OnTriggerScriptId = null; // re-resolved post-flush.
|
||||
await _templateRepo.UpdateTemplateAlarmAsync(current, ct).ConfigureAwait(false);
|
||||
await _auditService.LogAsync(
|
||||
@@ -2413,6 +2415,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
current.TriggerConfiguration,
|
||||
current.IsLocked,
|
||||
current.LockedInDerived,
|
||||
current.IsMesReportable,
|
||||
OnTriggerScriptName = alarmDto.OnTriggerScriptName,
|
||||
},
|
||||
ct).ConfigureAwait(false);
|
||||
@@ -2427,6 +2430,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
TriggerConfiguration = alarmDto.TriggerConfiguration,
|
||||
IsLocked = alarmDto.IsLocked,
|
||||
LockedInDerived = alarmDto.LockedInDerived,
|
||||
IsMesReportable = alarmDto.IsMesReportable,
|
||||
};
|
||||
ex.Alarms.Add(newAlarm);
|
||||
await _auditService.LogAsync(
|
||||
@@ -2445,6 +2449,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
newAlarm.TriggerConfiguration,
|
||||
newAlarm.IsLocked,
|
||||
newAlarm.LockedInDerived,
|
||||
newAlarm.IsMesReportable,
|
||||
OnTriggerScriptName = alarmDto.OnTriggerScriptName,
|
||||
},
|
||||
ct).ConfigureAwait(false);
|
||||
@@ -4360,6 +4365,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
{
|
||||
TriggerConfigurationOverride = o.TriggerConfigurationOverride,
|
||||
PriorityLevelOverride = o.PriorityLevelOverride,
|
||||
IsMesReportableOverride = o.IsMesReportableOverride,
|
||||
});
|
||||
}
|
||||
foreach (var o in dto.NativeAlarmSourceOverrides)
|
||||
@@ -4913,6 +4919,7 @@ public sealed class BundleImporter : IBundleImporter
|
||||
// at this single-template-scope validation step the bare name
|
||||
// IS the canonical name, so just pass it through.
|
||||
OnTriggerScriptCanonicalName = string.IsNullOrEmpty(al.OnTriggerScriptName) ? null : al.OnTriggerScriptName,
|
||||
IsMesReportable = al.IsMesReportable,
|
||||
Source = "Template",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ internal static class TemplateChildEquality
|
||||
&& e.TriggerConfiguration == i.TriggerConfiguration
|
||||
&& e.IsLocked == i.IsLocked
|
||||
&& e.LockedInDerived == i.LockedInDerived
|
||||
&& e.IsMesReportable == i.IsMesReportable
|
||||
&& scriptNameById(e.OnTriggerScriptId) == i.OnTriggerScriptName;
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -218,7 +218,10 @@ public sealed record TemplateAlarmDto(
|
||||
bool IsLocked,
|
||||
string? OnTriggerScriptName,
|
||||
// Derived-lock flag; additive trailing field (see TemplateAttributeDto).
|
||||
bool LockedInDerived = false);
|
||||
bool LockedInDerived = false,
|
||||
// Whether this alarm is reported to MES; additive trailing field, false on
|
||||
// bundles written before it existed (see TemplateAttributeDto).
|
||||
bool IsMesReportable = false);
|
||||
|
||||
public sealed record TemplateScriptDto(
|
||||
string Name,
|
||||
@@ -395,7 +398,10 @@ public sealed record InstanceAttributeOverrideDto(
|
||||
public sealed record InstanceAlarmOverrideDto(
|
||||
string AlarmCanonicalName,
|
||||
string? TriggerConfigurationOverride,
|
||||
int? PriorityLevelOverride);
|
||||
int? PriorityLevelOverride,
|
||||
// Per-instance override of the alarm's MES-reportable flag; additive trailing
|
||||
// field, null ("keep inherited") on bundles written before it existed.
|
||||
bool? IsMesReportableOverride = null);
|
||||
|
||||
public sealed record InstanceNativeAlarmSourceOverrideDto(
|
||||
string SourceCanonicalName,
|
||||
|
||||
@@ -77,7 +77,8 @@ public sealed class EntitySerializer
|
||||
// name comes through as null and the importer leaves the
|
||||
// FK null on the imported alarm.
|
||||
OnTriggerScriptName: a.OnTriggerScriptId is { } sid && scriptNameById.TryGetValue(sid, out var sn) ? sn : null,
|
||||
LockedInDerived: a.LockedInDerived)).ToList(),
|
||||
LockedInDerived: a.LockedInDerived,
|
||||
IsMesReportable: a.IsMesReportable)).ToList(),
|
||||
Scripts: t.Scripts.Select(s => new TemplateScriptDto(
|
||||
Name: s.Name,
|
||||
Code: s.Code,
|
||||
@@ -285,7 +286,8 @@ public sealed class EntitySerializer
|
||||
AlarmOverrides: inst.AlarmOverrides.Select(o => new InstanceAlarmOverrideDto(
|
||||
AlarmCanonicalName: o.AlarmCanonicalName,
|
||||
TriggerConfigurationOverride: o.TriggerConfigurationOverride,
|
||||
PriorityLevelOverride: o.PriorityLevelOverride)).ToList(),
|
||||
PriorityLevelOverride: o.PriorityLevelOverride,
|
||||
IsMesReportableOverride: o.IsMesReportableOverride)).ToList(),
|
||||
NativeAlarmSourceOverrides: inst.NativeAlarmSourceOverrides.Select(o => new InstanceNativeAlarmSourceOverrideDto(
|
||||
SourceCanonicalName: o.SourceCanonicalName,
|
||||
ConnectionNameOverride: o.ConnectionNameOverride,
|
||||
@@ -354,6 +356,7 @@ public sealed class EntitySerializer
|
||||
TriggerConfiguration = al.TriggerConfiguration,
|
||||
IsLocked = al.IsLocked,
|
||||
LockedInDerived = al.LockedInDerived,
|
||||
IsMesReportable = al.IsMesReportable,
|
||||
});
|
||||
}
|
||||
foreach (var s in dto.Scripts)
|
||||
@@ -607,6 +610,7 @@ public sealed class EntitySerializer
|
||||
InstanceId = inst.Id,
|
||||
TriggerConfigurationOverride = o.TriggerConfigurationOverride,
|
||||
PriorityLevelOverride = o.PriorityLevelOverride,
|
||||
IsMesReportableOverride = o.IsMesReportableOverride,
|
||||
});
|
||||
}
|
||||
foreach (var o in dto.NativeAlarmSourceOverrides)
|
||||
|
||||
Reference in New Issue
Block a user