using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Haoliang.Core.Services; using Haoliang.Models.Template; using Haoliang.Models.Device; using Haoliang.Models.System; using Haoliang.Models.Common; namespace Haoliang.Api.Controllers { [ApiController] [Route("api/v1/[controller]")] public class TemplateController : ControllerBase { private readonly ITemplateService _templateService; private readonly ITagMappingService _tagMappingService; private readonly ITemplateValidationService _validationService; private readonly ILoggingService _loggingService; public TemplateController( ITemplateService templateService, ITagMappingService tagMappingService, ITemplateValidationService validationService, ILoggingService loggingService) { _templateService = templateService; _tagMappingService = tagMappingService; _validationService = validationService; _loggingService = loggingService; } [HttpGet] public async Task GetAllTemplates() { try { var templates = await _templateService.GetAllTemplatesAsync(); return Ok(ApiResponse.Ok(templates)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get templates", ex); return StatusCode(500, ApiResponse.Error("Failed to get templates")); } } [HttpGet("{id}")] public async Task GetTemplate(int id) { try { var template = await _templateService.GetTemplateByIdAsync(id); if (template == null) { return NotFound(ApiResponse.NotFound("Template not found")); } return Ok(ApiResponse.Ok(template)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to get template")); } } [HttpPost] public async Task CreateTemplate([FromBody] CNCBrandTemplate template) { try { // 验证模板 var isValid = await _templateService.ValidateTemplateAsync(template); if (!isValid) { return BadRequest(ApiResponse.Error("Template validation failed")); } var createdTemplate = await _templateService.CreateTemplateAsync(template); return Ok(ApiResponse.Ok(createdTemplate, "Template created successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to create template", ex); return StatusCode(500, ApiResponse.Error("Failed to create template")); } } [HttpPut("{id}")] public async Task UpdateTemplate(int id, [FromBody] CNCBrandTemplate template) { try { template.TemplateId = id; // 验证模板 var isValid = await _templateService.ValidateTemplateAsync(template); if (!isValid) { return BadRequest(ApiResponse.Error("Template validation failed")); } var updatedTemplate = await _templateService.UpdateTemplateAsync(id, template); if (updatedTemplate == null) { return NotFound(ApiResponse.NotFound("Template not found")); } return Ok(ApiResponse.Ok(updatedTemplate, "Template updated successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to update template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to update template")); } } [HttpDelete("{id}")] public async Task DeleteTemplate(int id) { try { var result = await _templateService.DeleteTemplateAsync(id); if (!result) { return NotFound(ApiResponse.NotFound("Template not found")); } return Ok(ApiResponse.Ok(null, "Template deleted successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to delete template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to delete template")); } } [HttpPost("{id}/enable")] public async Task EnableTemplate(int id) { try { var result = await _templateService.EnableTemplateAsync(id); if (!result) { return NotFound(ApiResponse.NotFound("Template not found")); } return Ok(ApiResponse.Ok(null, "Template enabled successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to enable template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to enable template")); } } [HttpPost("{id}/disable")] public async Task DisableTemplate(int id) { try { var result = await _templateService.DisableTemplateAsync(id); if (!result) { return NotFound(ApiResponse.NotFound("Template not found")); } return Ok(ApiResponse.Ok(null, "Template disabled successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to disable template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to disable template")); } } [HttpPost("{id}/clone")] public async Task CloneTemplate(int id, [FromBody] CloneTemplateRequest request) { try { var clonedTemplate = await _templateService.CloneTemplateAsync(id, request.NewName); return Ok(ApiResponse.Ok(clonedTemplate, "Template cloned successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to clone template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to clone template")); } } [HttpPost("{id}/test")] public async Task TestTemplate(int id) { try { await _templateService.TestTemplateAsync(id); return Ok(ApiResponse.Ok(null, "Template test completed")); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to test template {id}", ex); return StatusCode(500, ApiResponse.Error("Failed to test template")); } } [HttpGet("brand/{brandName}")] public async Task GetTemplatesByBrand(string brandName) { try { var templates = await _templateService.GetTemplatesByBrandAsync(brandName); return Ok(ApiResponse.Ok(templates)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get templates for brand {brandName}", ex); return StatusCode(500, ApiResponse.Error("Failed to get templates by brand")); } } [HttpGet("active")] public async Task GetActiveTemplates() { try { var templates = await _templateService.GetActiveTemplatesAsync(); return Ok(ApiResponse.Ok(templates)); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to get active templates", ex); return StatusCode(500, ApiResponse.Error("Failed to get active templates")); } } [HttpGet("validate")] public async Task ValidateTemplate([FromBody] CNCBrandTemplate template) { try { var isValid = await _templateService.ValidateTemplateAsync(template); if (!isValid) { var errors = await _validationService.ValidateTemplateForDeviceAsync(template.TemplateId, 1); return BadRequest(ApiResponse.Error("Template validation failed", errors)); } return Ok(ApiResponse.Ok(true, "Template validation passed")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to validate template", ex); return StatusCode(500, ApiResponse.Error("Failed to validate template")); } } [HttpPost("migrate")] public async Task MigrateTemplate([FromBody] TemplateMigrationRequest request) { try { var migrationReport = await _validationService.GenerateMigrationReportAsync(request.Template, request.TargetBrand); if (!migrationReport.CanMigrate) { return BadRequest(ApiResponse.Error("Migration not possible", migrationReport.Issues)); } return Ok(ApiResponse.Ok(migrationReport, "Migration report generated")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to generate migration report", ex); return StatusCode(500, ApiResponse.Error("Failed to generate migration report")); } } [HttpGet("mappings/{templateId}")] public async Task GetTagMappings(int templateId) { try { var mappings = await _tagMappingService.GetMappingsByTemplateAsync(templateId); return Ok(ApiResponse.Ok(mappings)); } catch (Exception ex) { await _loggingService.LogErrorAsync($"Failed to get tag mappings for template {templateId}", ex); return StatusCode(500, ApiResponse.Error("Failed to get tag mappings")); } } [HttpPost("mappings")] public async Task CreateTagMapping([FromBody] TagMapping mapping) { try { var createdMapping = await _tagMappingService.CreateTagMappingAsync(mapping); return Ok(ApiResponse.Ok(createdMapping, "Tag mapping created successfully")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to create tag mapping", ex); return StatusCode(500, ApiResponse.Error("Failed to create tag mapping")); } } [HttpPost("sample-mapping")] public async Task TestTagMapping([FromBody] TestTagMappingRequest request) { try { var mappedTags = await _tagMappingService.MapDeviceTagsAsync(request.DeviceTags, request.TemplateId); return Ok(ApiResponse.Ok(mappedTags, "Tag mapping test completed")); } catch (Exception ex) { await _loggingService.LogErrorAsync("Failed to test tag mapping", ex); return StatusCode(500, ApiResponse.Error("Failed to test tag mapping")); } } } public class CloneTemplateRequest { public string NewName { get; set; } } public class TemplateMigrationRequest { public CNCBrandTemplate Template { get; set; } public string TargetBrand { get; set; } } public class TestTagMappingRequest { public IEnumerable DeviceTags { get; set; } public int TemplateId { get; set; } } }