You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

418 lines
13 KiB
C#

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