using Microsoft.AspNetCore.Mvc; using RIZO.Model.PLC; using RIZO.Service.PLC.IService; namespace RIZO.Admin.WebApi.Controllers.Plc { [ApiController] [Route("api/[controller]")] public class PlcDataController : ControllerBase { private readonly IPlcDataService _plcDataService; private readonly ILogger _logger; public PlcDataController( IPlcDataService plcDataService, ILogger logger) { _plcDataService = plcDataService; _logger = logger; } /// /// 获取所有工站数据概览 /// [HttpGet] public ActionResult GetAllStationsData() { try { var allData = _plcDataService.GetAllStationData(); var connectedCount = allData.Count(s => s.Value.IsConnected); var result = new AllStationsDataDto { Stations = allData.ToDictionary( kvp => kvp.Key, kvp => new StationDataDto { StationName = kvp.Value.StationName, IsConnected = kvp.Value.IsConnected, LastUpdateTime = kvp.Value.LastReadTime, LastConnectTime = kvp.Value.LastConnectTime, ReadFailureCount = kvp.Value.ReadFailureCount, CurrentValues = kvp.Value.DataItems.ToDictionary( di => di.Key, di => di.Value.Value ) } ), ServerTime = DateTime.Now, TotalStations = allData.Count, ConnectedStations = connectedCount }; return Ok(result); } catch (Exception ex) { _logger.LogError(ex, "获取所有工站数据失败"); return StatusCode(500, new { error = "获取数据失败" }); } } /// /// 获取指定工站详细数据 /// [HttpGet("{stationName}")] public ActionResult GetStationData(string stationName) { try { var stationData = _plcDataService.GetStationData(stationName); if (stationData == null) return NotFound(new { error = $"未找到工位: {stationName}" }); var result = new StationDataDto { StationName = stationData.StationName, IsConnected = stationData.IsConnected, LastUpdateTime = stationData.LastReadTime, LastConnectTime = stationData.LastConnectTime, ReadFailureCount = stationData.ReadFailureCount, CurrentValues = stationData.DataItems.ToDictionary( di => di.Key, di => di.Value.Value ) }; return Ok(result); } catch (Exception ex) { _logger.LogError(ex, $"获取工位 {stationName} 数据失败"); return StatusCode(500, new { error = "获取数据失败" }); } } /// /// 获取指定数据项的详细信息 /// [HttpGet("{stationName}/data/{dataItemName}")] public ActionResult GetDataItemDetail(string stationName, string dataItemName) { try { var stationData = _plcDataService.GetStationData(stationName); if (stationData == null) return NotFound(new { error = $"未找到工位: {stationName}" }); if (!stationData.DataItems.ContainsKey(dataItemName)) return NotFound(new { error = $"未找到数据项: {dataItemName}" }); var dataItem = stationData.DataItems[dataItemName]; return Ok(new { Name = dataItem.Name, Value = dataItem.Value, LastUpdateTime = dataItem.LastUpdateTime, IsSuccess = dataItem.IsSuccess, ErrorMessage = dataItem.ErrorMessage }); } catch (Exception ex) { _logger.LogError(ex, $"获取工位 {stationName} 数据项 {dataItemName} 失败"); return StatusCode(500, new { error = "获取数据失败" }); } } /// /// 手动重连指定工站 /// [HttpPost("{stationName}/reconnect")] public async Task ReconnectStation(string stationName) { try { var success = await _plcDataService.ReconnectStationAsync(stationName); if (success) return Ok(new { message = $"工位 {stationName} 重连成功" }); else return BadRequest(new { error = $"工位 {stationName} 重连失败" }); } catch (Exception ex) { _logger.LogError(ex, $"重连工位 {stationName} 失败"); return StatusCode(500, new { error = "重连失败" }); } } /// /// 写入数据到PLC /// [HttpPost("{stationName}/write")] public async Task WriteData(string stationName, [FromBody] WriteDataRequest request) { try { if (string.IsNullOrEmpty(request.DataItemName)) return BadRequest(new { error = "数据项名称不能为空" }); var success = await _plcDataService.WriteDataAsync(stationName, request.DataItemName, request.Value); if (success) return Ok(new { message = "写入成功" }); else return BadRequest(new { error = "写入失败" }); } catch (Exception ex) { _logger.LogError(ex, $"写入工位 {stationName} 数据失败"); return StatusCode(500, new { error = "写入失败" }); } } } public class WriteDataRequest { public string DataItemName { get; set; } = string.Empty; public object Value { get; set; } = new(); } }