using OrpaonVision.Core.Results; using OrpaonVision.SiteApp.Runtime.Contracts; using OrpaonVision.SiteApp.Runtime.Options; namespace OrpaonVision.SiteApp.Runtime.Services { /// /// 运行状态机简化实现(MVP 阶段)。 /// public sealed class SimpleRuntimeStateMachineService : IRuntimeStateMachineService { private readonly RuntimeOptions _options; private int _currentLayer; /// /// 构造函数。 /// public SimpleRuntimeStateMachineService(RuntimeOptions options) { _options = options; _currentLayer = 1; } /// public RuntimeStateSnapshotDto GetSnapshot() { return new RuntimeStateSnapshotDto { CurrentLayer = _currentLayer, TotalLayers = _options.TotalLayers, StateText = _currentLayer > _options.TotalLayers ? "工位完成" : "运行中" }; } /// public RuntimeState GetCurrentState() { return _currentLayer > _options.TotalLayers ? RuntimeState.Completed : RuntimeState.Running; } /// public int GetCurrentLayer() { return _currentLayer; } /// public bool CanExecuteOperation(StateTrigger trigger) { _ = trigger; return true; } /// public Result TriggerTransition(StateTrigger trigger, string? reason = null, object? parameters = null) { _ = reason; _ = parameters; // 简化实现:对某些触发器映射到已有操作 if (trigger == StateTrigger.MoveToNextLayer) { var move = MoveToNextLayer(); if (!move.Succeeded) { return Result.Fail(move.Code, move.Message); } } else if (trigger == StateTrigger.Reset) { Reset(); } var ev = new StateTransitionEvent { EventType = StateTransitionEventType.Error, PreviousState = RuntimeState.Running, NewState = GetCurrentState(), PreviousLayer = _currentLayer, NewLayer = _currentLayer, Timestamp = DateTime.UtcNow, Reason = reason ?? string.Empty, Trigger = trigger, GuardResult = "Simple" }; return Result.Success(ev); } /// public Result MoveToNextLayer() { if (_currentLayer >= _options.TotalLayers) { return Result.Fail("STATE_MACHINE_FINISHED", "当前已到最后一层,无法继续切层。"); } _currentLayer += 1; return Result.Success("STATE_MACHINE_MOVED", $"已切换到第 {_currentLayer} 层。"); } /// public void Reset() { _currentLayer = 1; } } }