using DRS9.Dashboard.Application.DTOs; using DRS9.Dashboard.Application.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace DRS9.Dashboard.Server.Controllers; [ApiController] [Route("api/admin/devices")] // [Authorize] - 暂时禁用认证以便测试 // TODO: 后续添加管理员角色验证 public class DevicesManagementController : ControllerBase { private readonly DeviceManagementService _deviceManagementService; private readonly DashboardWebSocketManager _wsManager; private readonly ILogger _logger; public DevicesManagementController( DeviceManagementService deviceManagementService, DashboardWebSocketManager wsManager, ILogger logger) { _deviceManagementService = deviceManagementService; _wsManager = wsManager; _logger = logger; } // ===== 设备管理 ===== /// /// 获取所有设备 /// [HttpGet] public async Task> GetAll() { var result = await _deviceManagementService.GetAllDevicesAsync(); return Ok(result); } /// /// 获取在线设备 /// [HttpGet("online")] public async Task> GetOnline() { var result = await _deviceManagementService.GetOnlineDevicesAsync(); return Ok(result); } /// /// 获取设备详情 /// [HttpGet("{id}")] public async Task> GetById(int id) { var result = await _deviceManagementService.GetDeviceByIdAsync(id); if (result == null) { return NotFound(new { success = false, message = "设备不存在" }); } return Ok(new { success = true, data = result }); } /// /// 创建设备(生成设备码) /// [HttpPost] public async Task> Create([FromBody] DeviceCreateRequest request) { var result = await _deviceManagementService.CreateDeviceAsync(request); if (result == null) { return BadRequest(new { success = false, message = "设备码已存在" }); } _logger.LogInformation("Device created: {DeviceCode}", request.DeviceCode); return Ok(new { success = true, data = result, message = "创建成功" }); } /// /// 更新设备 /// [HttpPut("{id}")] public async Task> Update(int id, [FromBody] DeviceUpdateRequest request) { var result = await _deviceManagementService.UpdateDeviceAsync(id, request); if (result == null) { return NotFound(new { success = false, message = "设备不存在" }); } _logger.LogInformation("Device updated: {Id}", id); return Ok(new { success = true, data = result, message = "更新成功" }); } /// /// 删除设备 /// [HttpDelete("{id}")] public async Task Delete(int id) { var success = await _deviceManagementService.DeleteDeviceAsync(id); if (!success) { return NotFound(new { success = false, message = "设备不存在" }); } _logger.LogInformation("Device deleted: {Id}", id); return Ok(new { success = true, message = "删除成功" }); } // ===== 设备内容分配 ===== /// /// 获取设备分配的内容 /// [HttpGet("{id}/content")] public async Task> GetContent(int id) { var result = await _deviceManagementService.GetDeviceContentAsync(id); return Ok(result); } /// /// 为设备分配内容 /// [HttpPost("{id}/content")] public async Task AssignContent(int id, [FromBody] DeviceAssignmentRequest request) { if (request.DeviceId != id) { return BadRequest(new { success = false, message = "设备ID不匹配" }); } var success = await _deviceManagementService.AssignContentToDeviceAsync(id, request.ApplicationIds); if (!success) { return NotFound(new { success = false, message = "设备不存在" }); } _logger.LogInformation("Content assigned to device {DeviceId}: {Count} applications", id, request.ApplicationIds.Count); return Ok(new { success = true, message = "内容分配成功,已通知设备刷新" }); } // ===== 推送控制 ===== /// /// 刷新设备内容 /// [HttpPost("{id}/push/refresh")] public async Task PushRefresh(int id) { var success = await _deviceManagementService.PushMessageAsync(id, "content_refresh", new { message = "请刷新内容" }); if (!success) { return NotFound(new { success = false, message = "设备不在线或不存在" }); } _logger.LogInformation("Push refresh to device: {DeviceId}", id); return Ok(new { success = true, message = "推送成功" }); } /// /// 重启设备应用 /// [HttpPost("{id}/push/restart")] public async Task PushRestart(int id) { var success = await _deviceManagementService.PushMessageAsync(id, "app_restart", new { message = "请重启应用" }); if (!success) { return NotFound(new { success = false, message = "设备不在线或不存在" }); } _logger.LogInformation("Push restart to device: {DeviceId}", id); return Ok(new { success = true, message = "推送成功" }); } /// /// 获取 WebSocket 连接统计 /// [HttpGet("stats/connections")] public ActionResult GetConnectionStats() { var totalConnections = _wsManager.GetConnectionCount(); return Ok(new { success = true, data = new { totalConnections, timestamp = DateTime.UtcNow } }); } } // ===== 设备分组控制器 ===== [ApiController] [Route("api/admin/device-groups")] // [Authorize] - 暂时禁用认证以便测试 public class DeviceGroupsController : ControllerBase { private readonly DeviceManagementService _deviceManagementService; private readonly ILogger _logger; public DeviceGroupsController(DeviceManagementService deviceManagementService, ILogger logger) { _deviceManagementService = deviceManagementService; _logger = logger; } /// /// 获取所有设备分组 /// [HttpGet] public async Task> GetAll() { var result = await _deviceManagementService.GetAllGroupsAsync(); return Ok(result); } /// /// 创建设备分组 /// [HttpPost] public async Task> Create([FromBody] DeviceGroupCreateRequest request) { var result = await _deviceManagementService.CreateGroupAsync(request); if (result == null) { return BadRequest(new { success = false, message = "创建失败" }); } _logger.LogInformation("Device group created: {Name}", request.Name); return Ok(new { success = true, data = result, message = "创建成功" }); } /// /// 更新设备分组 /// [HttpPut("{id}")] public async Task> Update(int id, [FromBody] DeviceGroupUpdateRequest request) { var result = await _deviceManagementService.UpdateGroupAsync(id, request); if (result == null) { return NotFound(new { success = false, message = "分组不存在" }); } _logger.LogInformation("Device group updated: {Id}", id); return Ok(new { success = true, data = result, message = "更新成功" }); } /// /// 删除设备分组 /// [HttpDelete("{id}")] public async Task Delete(int id) { var success = await _deviceManagementService.DeleteGroupAsync(id); if (!success) { return NotFound(new { success = false, message = "分组不存在" }); } _logger.LogInformation("Device group deleted: {Id}", id); return Ok(new { success = true, message = "删除成功" }); } } // ===== 批量管理控制器 ===== [ApiController] [Route("api/admin/batch")] // [Authorize] - 暂时禁用认证以便测试 public class BatchManagementController : ControllerBase { private readonly BatchManagementService _batchService; private readonly ILogger _logger; public BatchManagementController(BatchManagementService batchService, ILogger logger) { _batchService = batchService; _logger = logger; } /// /// 批量为设备分配内容 /// [HttpPost("assign-content")] public async Task> BatchAssignContent([FromBody] BatchAssignContentRequest request) { var result = await _batchService.BatchAssignContentAsync(request); _logger.LogInformation("Batch assign content: {Count} devices", request.DeviceIds.Count); return Ok(result); } /// /// 批量推送消息到设备 /// [HttpPost("push")] public async Task> BatchPush([FromBody] BatchPushRequest request) { var result = await _batchService.BatchPushAsync(request); _logger.LogInformation("Batch push: {Type} to {Count} devices", request.MessageType, request.DeviceIds.Count); return Ok(result); } /// /// 批量推送消息到设备分组 /// [HttpPost("push-to-groups")] public async Task> BatchPushToGroups([FromBody] BatchPushToGroupRequest request) { var result = await _batchService.BatchPushToGroupAsync(request); _logger.LogInformation("Batch push to groups: {Type} to {Count} groups", request.MessageType, request.DeviceGroupIds.Count); return Ok(result); } /// /// 批量启用/禁用设备 /// [HttpPost("toggle-devices")] public async Task> BatchToggleDevices([FromBody] BatchToggleDevicesRequest request) { var result = await _batchService.BatchToggleDevicesAsync(request); _logger.LogInformation("Batch toggle devices: {Enabled} for {Count} devices", request.IsEnabled, request.DeviceIds.Count); return Ok(result); } /// /// 批量分配播放列表到分组 /// [HttpPost("assign-playlist")] public async Task> BatchAssignPlaylist([FromBody] BatchAssignPlaylistRequest request) { var result = await _batchService.BatchAssignPlaylistToGroupAsync(request); _logger.LogInformation("Batch assign playlist: {PlaylistId} to {Count} groups", request.PlaylistId, request.DeviceGroupIds.Count); return Ok(result); } } // ===== 仪表盘统计控制器 ===== [ApiController] [Route("api/admin/stats")] // [Authorize] - 暂时禁用认证以便测试 public class DashboardController : ControllerBase { private readonly DeviceManagementService _deviceManagementService; private readonly ApplicationService _applicationService; public DashboardController( DeviceManagementService deviceManagementService, ApplicationService applicationService) { _deviceManagementService = deviceManagementService; _applicationService = applicationService; } /// /// 获取仪表盘统计数据 /// [HttpGet] public async Task> GetStats() { var devices = await _deviceManagementService.GetAllDevicesAsync(); var applications = await _applicationService.GetAllAsync(); var stats = new DashboardStatsDto { TotalDevices = devices.Data.Count, OnlineDevices = devices.Data.Count(d => d.IsEnabled), TotalApplications = applications.Total }; return Ok(stats); } }