using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Cors; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Haoliang.Models.Device; using Haoliang.Data.Repositories; namespace Haoliang.Api.Controllers { [Route("api/v1/devices")] [ApiController] [EnableCors("AllowAll")] public class DeviceController : ControllerBase { private readonly DeviceRepository _deviceRepository; private readonly DeviceStatusRepository _statusRepository; public DeviceController(DeviceRepository deviceRepository, DeviceStatusRepository statusRepository) { _deviceRepository = deviceRepository; _statusRepository = statusRepository; } [HttpGet] public IActionResult GetAllDevices() { try { var devices = _deviceRepository.GetAllDevices(); return Ok(new { success = true, data = devices.Select(d => new { d.Id, d.DeviceCode, d.DeviceName, d.IPAddress, d.IsOnline, d.IsAvailable, d.LastCollectionTime, d.CreatedAt, d.UpdatedAt }), message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取设备列表失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpGet("{id}")] public IActionResult GetDevice(int id) { try { var device = _deviceRepository.GetDeviceById(id); if (device == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } return Ok(new { success = true, data = device, message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpPost] public IActionResult CreateDevice([FromBody] CNCDevice device) { try { // 验证设备编号唯一性 var existingDevice = _deviceRepository.GetDeviceByCode(device.DeviceCode); if (existingDevice != null) { return BadRequest(new { success = false, message = "设备编号已存在", timestamp = DateTime.Now }); } device.CreatedAt = DateTime.Now; device.UpdatedAt = DateTime.Now; var createdDevice = _deviceRepository.CreateDevice(device); return Ok(new { success = true, data = createdDevice, message = "创建成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"创建设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpPut("{id}")] public IActionResult UpdateDevice(int id, [FromBody] CNCDevice device) { try { var existingDevice = _deviceRepository.GetDeviceById(id); if (existingDevice == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } device.Id = id; device.UpdatedAt = DateTime.Now; var updatedDevice = _deviceRepository.UpdateDevice(device); return Ok(new { success = true, data = updatedDevice, message = "更新成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"更新设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpDelete("{id}")] public IActionResult DeleteDevice(int id) { try { var device = _deviceRepository.GetDeviceById(id); if (device == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } _deviceRepository.DeleteDevice(id); return Ok(new { success = true, message = "删除成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"删除设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpGet("{id}/status")] public IActionResult GetDeviceStatus(int id) { try { var device = _deviceRepository.GetDeviceById(id); if (device == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } var status = _statusRepository.GetLatestDeviceStatus(id); return Ok(new { success = true, data = new { device.Id, device.DeviceCode, device.DeviceName, device.IsOnline, device.IsAvailable, Status = status?.Status ?? "未知", IsRunning = status?.IsRunning ?? false, NCProgram = status?.NCProgram, CumulativeCount = status?.CumulativeCount ?? 0, OperatingMode = status?.OperatingMode, RecordTime = status?.RecordTime, LastCollectionTime = device.LastCollectionTime }, message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取设备状态失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpGet("{id}/status-history")] public IActionResult GetDeviceStatusHistory(int id, DateTime? startTime = null, DateTime? endTime = null) { try { var statuses = _statusRepository.GetDeviceStatuses(id, startTime, endTime); return Ok(new { success = true, data = statuses.Select(s => new { s.Id, s.DeviceId, s.Status, s.IsRunning, s.NCProgram, s.CumulativeCount, s.OperatingMode, s.RecordTime }), message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取设备状态历史失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpGet("online")] public IActionResult GetOnlineDevices() { try { var devices = _deviceRepository.GetOnlineDevices(); return Ok(new { success = true, data = devices, message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取在线设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpGet("available")] public IActionResult GetAvailableDevices() { try { var devices = _deviceRepository.GetAvailableDevices(); return Ok(new { success = true, data = devices, message = "获取成功", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"获取可用设备失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpPost("{id}/toggle-status")] public IActionResult ToggleDeviceStatus(int id, [FromBody] bool isAvailable) { try { var device = _deviceRepository.GetDeviceById(id); if (device == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } device.IsAvailable = isAvailable; device.UpdatedAt = DateTime.Now; var updatedDevice = _deviceRepository.UpdateDevice(device); return Ok(new { success = true, data = updatedDevice, message = $"设备状态已更新为{(isAvailable ? "可用" : "不可用")}", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"更新设备状态失败: {ex.Message}", timestamp = DateTime.Now }); } } [HttpPost("{id}/collect")] public IActionResult TriggerCollection(int id) { try { var device = _deviceRepository.GetDeviceById(id); if (device == null) { return NotFound(new { success = false, message = "设备不存在", timestamp = DateTime.Now }); } // 这里应该触发数据采集逻辑 // 简化实现,返回成功响应 return Ok(new { success = true, message = "采集任务已触发", timestamp = DateTime.Now }); } catch (Exception ex) { return StatusCode(500, new { success = false, message = $"触发采集任务失败: {ex.Message}", timestamp = DateTime.Now }); } } } }