fix(deploy): cluster-attribute driver-less equipment via its UNS line area (BuildClusterSets)
This commit is contained in:
@@ -260,7 +260,8 @@ public static class DeploymentArtifact
|
||||
/// <summary>The in-cluster id sets used to filter a composition.</summary>
|
||||
/// <param name="DriverIds">DriverInstanceIds whose row carries the in-scope ClusterId.</param>
|
||||
/// <param name="AreaIds">UnsAreaIds whose row carries the in-scope ClusterId.</param>
|
||||
/// <param name="EquipmentIds">EquipmentIds whose owning DriverInstanceId is in-cluster.</param>
|
||||
/// <param name="EquipmentIds">In-cluster EquipmentIds: driver-bound equipment is attributed by its
|
||||
/// driver's cluster; driver-less equipment (null DriverInstanceId) by its UNS line's area cluster.</param>
|
||||
private sealed record ClusterSets(HashSet<string> DriverIds, HashSet<string> AreaIds, HashSet<string> EquipmentIds);
|
||||
|
||||
/// <summary>Build the in-cluster id sets used to filter a composition: DriverInstanceIds + UnsAreaIds
|
||||
@@ -279,7 +280,22 @@ public static class DeploymentArtifact
|
||||
var root = doc.RootElement;
|
||||
CollectIdsWhereCluster(root, "DriverInstances", "DriverInstanceId", clusterId, driverIds);
|
||||
CollectIdsWhereCluster(root, "UnsAreas", "UnsAreaId", clusterId, areaIds);
|
||||
// Equipment carries no ClusterId — include it when its DriverInstanceId is in-cluster.
|
||||
// Map each UnsLine to its owning UnsArea so driver-less equipment can be attributed via
|
||||
// its line's area cluster (Equipment -> UnsLine.UnsAreaId -> UnsArea.ClusterId).
|
||||
var lineToArea = new Dictionary<string, string>(StringComparer.Ordinal);
|
||||
if (root.TryGetProperty("UnsLines", out var lines) && lines.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
foreach (var el in lines.EnumerateArray())
|
||||
{
|
||||
if (el.ValueKind != JsonValueKind.Object) continue;
|
||||
var lineId = el.TryGetProperty("UnsLineId", out var lEl) ? lEl.GetString() : null;
|
||||
var areaId = el.TryGetProperty("UnsAreaId", out var aEl) ? aEl.GetString() : null;
|
||||
if (!string.IsNullOrWhiteSpace(lineId) && !string.IsNullOrWhiteSpace(areaId))
|
||||
lineToArea[lineId!] = areaId!;
|
||||
}
|
||||
}
|
||||
// Equipment carries no ClusterId — driver-bound equipment is attributed by its driver's
|
||||
// cluster; driver-less equipment (null DriverInstanceId) by its UNS line's area cluster.
|
||||
if (root.TryGetProperty("Equipment", out var eq) && eq.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
foreach (var el in eq.EnumerateArray())
|
||||
@@ -287,8 +303,12 @@ public static class DeploymentArtifact
|
||||
if (el.ValueKind != JsonValueKind.Object) continue;
|
||||
var di = el.TryGetProperty("DriverInstanceId", out var diEl) ? diEl.GetString() : null;
|
||||
var id = el.TryGetProperty("EquipmentId", out var idEl) ? idEl.GetString() : null;
|
||||
if (!string.IsNullOrWhiteSpace(id) && di is not null && driverIds.Contains(di))
|
||||
equipmentIds.Add(id!);
|
||||
var lineId = el.TryGetProperty("UnsLineId", out var luEl) ? luEl.GetString() : null;
|
||||
if (string.IsNullOrWhiteSpace(id)) continue;
|
||||
var inByDriver = di is not null && driverIds.Contains(di);
|
||||
var inByLine = di is null && lineId is not null
|
||||
&& lineToArea.TryGetValue(lineId, out var areaOfLine) && areaIds.Contains(areaOfLine);
|
||||
if (inByDriver || inByLine) equipmentIds.Add(id!);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user