#if false using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OrpaonVision.Core.Common; using OrpaonVision.Core.RuleEngine; using OrpaonVision.Core.AlarmSystem; using OrpaonVision.Core.ManualOverride; using OrpaonVision.SiteApp.Runtime.Services; namespace OrpaonVision.SiteApp.Runtime.Controllers; /// /// 运行时API控制器,提供Agent-2负责的所有服务接口。 /// [ApiController] [Route("api/[controller]")] [Authorize] public sealed class RuntimeController : ControllerBase { private readonly IRuleEngineService _ruleEngineService; private readonly IRuntimeStateMachineService _stateMachineService; private readonly IManualOverrideService _manualOverrideService; private readonly IAlarmSystemService _alarmSystemService; private readonly ILogger _logger; public RuntimeController( IRuleEngineService ruleEngineService, IRuntimeStateMachineService stateMachineService, IManualOverrideService manualOverrideService, IAlarmSystemService alarmSystemService, ILogger logger) { _ruleEngineService = ruleEngineService; _stateMachineService = stateMachineService; _manualOverrideService = manualOverrideService; _alarmSystemService = alarmSystemService; _logger = logger; } #region 规则引擎接口 /// /// 获取所有规则。 /// [HttpGet("rules")] public async Task>> GetRules(CancellationToken cancellationToken = default) { var result = await _ruleEngineService.GetRulesAsync(cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 评估规则。 /// [HttpPost("rules/evaluate")] public async Task> EvaluateRules([FromBody] RuleEvaluationRequest request, CancellationToken cancellationToken = default) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var result = await _ruleEngineService.EvaluateRulesAsync(request, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取规则详情。 /// [HttpGet("rules/{ruleId}")] public async Task> GetRule(string ruleId, CancellationToken cancellationToken = default) { if (!Guid.TryParse(ruleId, out var guid)) { return BadRequest("无效的规则ID格式"); } var result = await _ruleEngineService.GetRuleAsync(guid, cancellationToken); if (!result.IsSuccess) { return NotFound(new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } #endregion #region 状态机接口 /// /// 获取当前状态。 /// [HttpGet("state/current")] public ActionResult GetCurrentState() { var state = _stateMachineService.GetCurrentState(); var layer = _stateMachineService.GetCurrentLayer(); return Ok(new { state = state.ToString(), layer }); } /// /// 触发状态转换。 /// [HttpPost("state/trigger")] public async Task> TriggerStateTransition([FromBody] StateTransitionRequest request, CancellationToken cancellationToken = default) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var result = await _stateMachineService.TriggerTransitionAsync(request.Trigger, request.Reason, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取状态转换历史。 /// [HttpGet("state/history")] public async Task>> GetStateHistory([FromQuery] int maxCount = 100, CancellationToken cancellationToken = default) { var result = await _stateMachineService.GetEventHistoryAsync(maxCount, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 检查是否可以执行操作。 /// [HttpGet("state/can-execute/{trigger}")] public ActionResult CanExecuteOperation(string trigger) { if (!Enum.TryParse(trigger, true, out var triggerEnum)) { return BadRequest("无效的触发器"); } var canExecute = _stateMachineService.CanExecuteOperation(triggerEnum); return Ok(canExecute); } #endregion #region 人工干预接口 /// /// 获取可干预的会话。 /// [HttpGet("override/sessions")] public async Task>> GetOverrideableSessions( [FromQuery] DateTime startTime, [FromQuery] DateTime endTime, [FromQuery] string? productTypeCode = null, [FromQuery] OverrideStatus? overrideStatus = null, CancellationToken cancellationToken = default) { var result = await _manualOverrideService.GetOverrideableSessionsAsync(startTime, endTime, productTypeCode, overrideStatus, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取干预权限。 /// [HttpGet("override/permission/{sessionId}")] public async Task> GetOverridePermission(string sessionId, [FromQuery] string operatorId, CancellationToken cancellationToken = default) { if (!Guid.TryParse(sessionId, out var sessionGuid)) { return BadRequest("无效的会话ID格式"); } var result = await _manualOverrideService.GetOverridePermissionAsync(sessionGuid, operatorId, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 执行人工干预。 /// [HttpPost("override/execute")] [Authorize(Policy = "Operator")] public async Task> ExecuteManualOverride([FromBody] ManualOverrideRequest request, CancellationToken cancellationToken = default) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var result = await _manualOverrideService.ExecuteManualOverrideAsync(request, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取干预历史。 /// [HttpGet("override/history")] public async Task>> GetOverrideHistory( [FromQuery] DateTime startTime, [FromQuery] DateTime endTime, [FromQuery] string? operatorId = null, [FromQuery] OverrideType? overrideType = null, CancellationToken cancellationToken = default) { var result = await _manualOverrideService.GetOverrideHistoryAsync(startTime, endTime, operatorId, overrideType, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } #endregion #region 报警系统接口 /// /// 触发报警。 /// [HttpPost("alarms/trigger")] public async Task> TriggerAlarm([FromBody] AlarmRequest request, CancellationToken cancellationToken = default) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var result = await _alarmSystemService.TriggerAlarmAsync(request, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 确认报警。 /// [HttpPost("alarms/{alarmId}/confirm")] [Authorize(Policy = "Operator")] public async Task> ConfirmAlarm(string alarmId, [FromBody] AlarmConfirmRequest request, CancellationToken cancellationToken = default) { if (!Guid.TryParse(alarmId, out var alarmGuid)) { return BadRequest("无效的报警ID格式"); } request.AlarmId = alarmGuid; var result = await _alarmSystemService.ConfirmAlarmAsync(request, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 清除报警。 /// [HttpPost("alarms/{alarmId}/clear")] [Authorize(Policy = "Operator")] public async Task> ClearAlarm(string alarmId, [FromBody] AlarmClearRequest request, CancellationToken cancellationToken = default) { if (!Guid.TryParse(alarmId, out var alarmGuid)) { return BadRequest("无效的报警ID格式"); } request.AlarmId = alarmGuid; var result = await _alarmSystemService.ClearAlarmAsync(request, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取活跃报警。 /// [HttpGet("alarms/active")] public async Task>> GetActiveAlarms(CancellationToken cancellationToken = default) { var result = await _alarmSystemService.GetActiveAlarmsAsync(cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取报警栈。 /// [HttpGet("alarms/stack/{stackType}")] public async Task>> GetAlarmStack(string stackType, CancellationToken cancellationToken = default) { if (!Enum.TryParse(stackType, true, out var stackTypeEnum)) { return BadRequest("无效的报警栈类型"); } var result = await _alarmSystemService.GetAlarmStackAsync(stackTypeEnum, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } /// /// 获取报警生命周期。 /// [HttpGet("alarms/{alarmId}/lifecycle")] public async Task> GetAlarmLifecycle(string alarmId, CancellationToken cancellationToken = default) { if (!Guid.TryParse(alarmId, out var alarmGuid)) { return BadRequest("无效的报警ID格式"); } var result = await _alarmSystemService.GetAlarmLifecycleAsync(alarmGuid, cancellationToken); if (!result.IsSuccess) { return StatusCode(500, new { error = result.Message, traceId = result.TraceId }); } return Ok(result.Data); } #endregion #region 系统状态接口 /// /// 获取系统整体状态。 /// [HttpGet("status")] public ActionResult GetSystemStatus() { var currentState = _stateMachineService.GetCurrentState(); var currentLayer = _stateMachineService.GetCurrentLayer(); return Ok(new { timestamp = DateTime.UtcNow, state_machine = new { current_state = currentState.ToString(), current_layer = currentLayer }, services = new { rule_engine = "healthy", state_machine = "healthy", manual_override = "healthy", alarm_system = "healthy" } }); } #endregion } /// /// 状态转换请求模型。 /// public sealed class StateTransitionRequest { public StateTrigger Trigger { get; set; } public string Reason { get; set; } = string.Empty; } #endif