using System; using StandardScene.Signal.Model; namespace StandardScene.Signal.Logic { /// /// 一条握手点配置的解析结果。新列(机构/工位/动作/附加参数)优先,旧 SignalParams 作回退。 /// public sealed class SignalStopSpec { public string SignalType { get; init; } = ""; public string SignalParams { get; init; } = ""; public string[] Parts { get; init; } = Array.Empty(); public string JgName { get; init; } = ""; public string DockId { get; init; } = ""; public string Action { get; init; } = ""; public string ExtraParams { get; init; } = ""; public string Part(int index) { if (index < 0 || index >= Parts.Length) return ""; return Parts[index] ?? ""; } public static SignalStopSpec Parse(string signalType, string signalParams) { var type = (signalType ?? "").Trim(); var raw = signalParams ?? ""; var parsed = new SignalStopSpec { SignalType = type, SignalParams = raw, Parts = raw.Split(new[] { ';' }, StringSplitOptions.None) }; return EnrichFromParts(parsed); } public static SignalStopSpec From(HandshakePointModel model) { if (model == null) return null; var type = (model.SignalType ?? "").Trim(); if (string.Equals(type, "TimedCharging", StringComparison.OrdinalIgnoreCase) || string.Equals(type, "RateFlowControl", StringComparison.OrdinalIgnoreCase)) { var raw = First(model.ExtraParams, model.SignalParams); return Parse(type, raw); } var parsed = Parse(type, model.SignalParams ?? ""); var jg = First(model.JgName, parsed.JgName); var action = First(model.Action, parsed.Action); var dock = First(model.DockId, parsed.DockId); var extra = First(model.ExtraParams, parsed.ExtraParams); return new SignalStopSpec { SignalType = parsed.SignalType, SignalParams = parsed.SignalParams, Parts = parsed.Parts, JgName = jg, DockId = dock, Action = action, ExtraParams = extra }; } public bool Is(string type) => string.Equals(SignalType, type, StringComparison.OrdinalIgnoreCase); private static SignalStopSpec EnrichFromParts(SignalStopSpec parsed) { var type = parsed.SignalType; if (string.Equals(type, "TimedCharging", StringComparison.OrdinalIgnoreCase) || string.Equals(type, "RateFlowControl", StringComparison.OrdinalIgnoreCase)) { return new SignalStopSpec { SignalType = parsed.SignalType, SignalParams = parsed.SignalParams, Parts = parsed.Parts, ExtraParams = parsed.SignalParams }; } var point = string.Equals(type, "PointControl", StringComparison.OrdinalIgnoreCase); var jg = point ? parsed.Part(1).Trim() : parsed.Part(0).Trim(); var action = point ? parsed.Part(0).Trim() : parsed.Part(1).Trim(); var dock = ""; var extra = ""; var p2 = parsed.Part(2).Trim(); if (LooksLikeDock(p2)) dock = p2; else if (LooksLikeRateFlow(p2)) extra = p2; if (string.IsNullOrEmpty(extra)) extra = parsed.Part(3).Trim(); return new SignalStopSpec { SignalType = parsed.SignalType, SignalParams = parsed.SignalParams, Parts = parsed.Parts, JgName = jg, DockId = dock, Action = action, ExtraParams = extra }; } private static string First(string a, string b) { if (!string.IsNullOrWhiteSpace(a)) return a.Trim(); return (b ?? "").Trim(); } private static bool LooksLikeRateFlow(string s) => !string.IsNullOrEmpty(s) && s.IndexOf('-') >= 0; private static bool LooksLikeDock(string s) => !string.IsNullOrEmpty(s) && s.IndexOf('-') < 0 && s.IndexOf(',') < 0; } }