using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel.DataAnnotations; using WIDESEAWCS_S7Simulator.Core.Entities; using WIDESEAWCS_S7Simulator.Core.Enums; namespace WIDESEAWCS_S7Simulator.Web.Pages; /// /// 创建实例页 /// public class CreateModel : PageModel { private readonly ILogger _logger; private readonly HttpClient _httpClient; public CreateModel(ILogger logger, IHttpClientFactory httpClientFactory) { _logger = logger; _httpClient = httpClientFactory.CreateClient(); _httpClient.BaseAddress = new Uri($"{Request.Scheme}://{Request.Host}"); } [BindProperty] public CreateInstanceInputModel Input { get; set; } = new(); public void OnGet() { _logger.LogInformation("Loading create instance page"); } public async Task OnPostAsync() { if (!ModelState.IsValid) { return Page(); } try { var config = new InstanceConfig { Id = Input.Id, Name = Input.Name, PLCType = Input.PLCType, Port = Input.Port, ActivationKey = Input.ActivationKey ?? string.Empty, AutoStart = Input.AutoStart, MemoryConfig = new MemoryRegionConfig { MRegionSize = Input.MRegionSize > 0 ? Input.MRegionSize : 1024, DBBlockCount = Input.DBBlockCount > 0 ? Input.DBBlockCount : 100, DBBlockSize = Input.DBBlockSize > 0 ? Input.DBBlockSize : 1024, IRegionSize = Input.IRegionSize > 0 ? Input.IRegionSize : 256, QRegionSize = Input.QRegionSize > 0 ? Input.QRegionSize : 256, TRegionCount = Input.TRegionCount > 0 ? Input.TRegionCount : 64, CRegionCount = Input.CRegionCount > 0 ? Input.CRegionCount : 64 } }; var response = await _httpClient.PostAsJsonAsync("/api/SimulatorInstances", config); if (response.IsSuccessStatusCode) { _logger.LogInformation("Instance {InstanceId} created successfully", Input.Id); TempData["SuccessMessage"] = $"实例 \"{Input.Id}\" 创建成功!"; return RedirectToPage("/Index"); } else if (response.StatusCode == System.Net.HttpStatusCode.Conflict) { ModelState.AddModelError(string.Empty, "实例ID已存在,请使用其他ID"); } else { var error = await response.Content.ReadFromJsonAsync(); ModelState.AddModelError(string.Empty, error?.ToString() ?? "创建实例失败"); } } catch (HttpRequestException ex) { _logger.LogError(ex, "Failed to create instance"); ModelState.AddModelError(string.Empty, "网络错误,请稍后重试"); } return Page(); } /// /// 创建实例输入模型 /// public class CreateInstanceInputModel { /// /// 实例ID /// [Required(ErrorMessage = "实例ID不能为空")] [StringLength(50, MinimumLength = 1, ErrorMessage = "实例ID长度必须在1-50个字符之间")] [RegularExpression("^[a-zA-Z0-9_-]+$", ErrorMessage = "实例ID只能包含字母、数字、下划线和连字符")] public string Id { get; set; } = string.Empty; /// /// 实例名称 /// [Required(ErrorMessage = "实例名称不能为空")] [StringLength(100, ErrorMessage = "实例名称不能超过100个字符")] public string Name { get; set; } = string.Empty; /// /// PLC型号 /// [Required(ErrorMessage = "PLC型号不能为空")] public SiemensPLCType PLCType { get; set; } = SiemensPLCType.S71200; /// /// 监听端口 /// [Required(ErrorMessage = "端口不能为空")] [Range(1, 65535, ErrorMessage = "端口必须在1-65535之间")] public int Port { get; set; } = 102; /// /// HSL激活码 /// [StringLength(200, ErrorMessage = "激活码不能超过200个字符")] public string? ActivationKey { get; set; } /// /// 自动启动 /// public bool AutoStart { get; set; } = false; // 内存配置 public int MRegionSize { get; set; } public int DBBlockCount { get; set; } public int DBBlockSize { get; set; } public int IRegionSize { get; set; } public int QRegionSize { get; set; } public int TRegionCount { get; set; } public int CRegionCount { get; set; } } }