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;
}
}
}