From 737dec3c384f394fd6f9849b4480b697d1ba35d5 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 17 三月 2026 09:16:44 +0800
Subject: [PATCH] chore: 提交所有当前改动
---
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Controllers/SimulatorInstancesController.cs | 183 +++++++++++++++++++++++++++++++++++++++------
1 files changed, 158 insertions(+), 25 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Controllers/SimulatorInstancesController.cs b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Controllers/SimulatorInstancesController.cs
index f94fe46..5fe5fc8 100644
--- a/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Controllers/SimulatorInstancesController.cs
+++ b/Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Controllers/SimulatorInstancesController.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc;
+using WIDESEAWCS_S7Simulator.Application.Protocol;
using WIDESEAWCS_S7Simulator.Core.Entities;
using WIDESEAWCS_S7Simulator.Core.Interfaces;
@@ -12,20 +13,23 @@
public class SimulatorInstancesController : ControllerBase
{
private readonly ISimulatorInstanceManager _instanceManager;
+ private readonly IProtocolTemplateService _protocolTemplateService;
private readonly ILogger<SimulatorInstancesController> _logger;
public SimulatorInstancesController(
ISimulatorInstanceManager instanceManager,
+ IProtocolTemplateService protocolTemplateService,
ILogger<SimulatorInstancesController> logger)
{
_instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
+ _protocolTemplateService = protocolTemplateService ?? throw new ArgumentNullException(nameof(protocolTemplateService));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
/// <summary>
/// 鑾峰彇鎵�鏈夊疄渚嬪垪琛�
/// </summary>
- [HttpGet]
+ [HttpGet("GetAll")]
[ProducesResponseType(typeof(IEnumerable<object>), StatusCodes.Status200OK)]
public ActionResult GetAllInstances()
{
@@ -57,10 +61,10 @@
/// <summary>
/// 鍒涘缓鏂板疄渚�
/// </summary>
- [HttpPost]
- [ProducesResponseType(typeof(InstanceState), StatusCodes.Status201Created)]
+ [HttpPost("Create")]
+ [ProducesResponseType(typeof(object), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
- public async Task<ActionResult<InstanceState>> CreateInstance([FromBody] InstanceConfig config)
+ public async Task<ActionResult> CreateInstance([FromBody] InstanceConfig config)
{
try
{
@@ -89,13 +93,38 @@
return BadRequest(new { error = "Port must be between 1 and 65535" });
}
+ NormalizeMemoryConfig(config);
+
+ if (string.IsNullOrWhiteSpace(config.ProtocolTemplateId))
+ {
+ return BadRequest(new { error = "Protocol template is required" });
+ }
+
+ if (!await _protocolTemplateService.ExistsAsync(config.ProtocolTemplateId))
+ {
+ return BadRequest(new { error = $"Protocol template '{config.ProtocolTemplateId}' not found" });
+ }
+
var instance = await _instanceManager.CreateInstanceAsync(config);
var state = instance.GetState();
+ var result = new
+ {
+ instanceId = instance.Config.Id,
+ name = instance.Config.Name,
+ plcType = instance.Config.PLCType.ToString(),
+ port = instance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
return CreatedAtAction(
nameof(GetInstance),
new { id = config.Id },
- state);
+ result);
}
catch (ArgumentException ex)
{
@@ -112,10 +141,10 @@
/// <summary>
/// 鑾峰彇鎸囧畾瀹炰緥璇︽儏
/// </summary>
- [HttpGet("{id}")]
- [ProducesResponseType(typeof(InstanceState), StatusCodes.Status200OK)]
+ [HttpGet("GetInstance")]
+ [ProducesResponseType(typeof(object), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
- public ActionResult<InstanceState> GetInstance(string id)
+ public ActionResult GetInstance(string id)
{
try
{
@@ -131,7 +160,20 @@
}
var state = instance.GetState();
- return Ok(state);
+ var result = new
+ {
+ instanceId = instance.Config.Id,
+ name = instance.Config.Name,
+ plcType = instance.Config.PLCType.ToString(),
+ port = instance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
+ return Ok(result);
}
catch (Exception ex)
{
@@ -143,7 +185,7 @@
/// <summary>
/// 鑾峰彇鎸囧畾瀹炰緥鐨勯厤缃�
/// </summary>
- [HttpGet("{id}/config")]
+ [HttpGet("GetInstanceConfig")]
[ProducesResponseType(typeof(InstanceConfig), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public ActionResult<InstanceConfig> GetInstanceConfig(string id)
@@ -173,11 +215,11 @@
/// <summary>
/// 鏇存柊瀹炰緥閰嶇疆
/// </summary>
- [HttpPut("{id}")]
- [ProducesResponseType(typeof(InstanceState), StatusCodes.Status200OK)]
+ [HttpPut("Update")]
+ [ProducesResponseType(typeof(object), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
- public async Task<ActionResult<InstanceState>> UpdateInstance(string id, [FromBody] InstanceConfig config)
+ public async Task<ActionResult> UpdateInstance([FromQuery] string id, [FromBody] InstanceConfig config)
{
try
{
@@ -203,6 +245,18 @@
return BadRequest(new { error = "Port must be between 1 and 65535" });
}
+ NormalizeMemoryConfig(config);
+
+ if (string.IsNullOrWhiteSpace(config.ProtocolTemplateId))
+ {
+ return BadRequest(new { error = "Protocol template is required" });
+ }
+
+ if (!await _protocolTemplateService.ExistsAsync(config.ProtocolTemplateId))
+ {
+ return BadRequest(new { error = $"Protocol template '{config.ProtocolTemplateId}' not found" });
+ }
+
// Delete existing instance and recreate with new config
// Note: This is a simplified approach. In production, you might want to support hot-reload
bool wasRunning = instance.GetState().Status == Core.Enums.InstanceStatus.Running;
@@ -217,7 +271,20 @@
}
var state = newInstance.GetState();
- return Ok(state);
+ var result = new
+ {
+ instanceId = newInstance.Config.Id,
+ name = newInstance.Config.Name,
+ plcType = newInstance.Config.PLCType.ToString(),
+ port = newInstance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
+ return Ok(result);
}
catch (ArgumentException ex)
{
@@ -234,10 +301,10 @@
/// <summary>
/// 鍒犻櫎瀹炰緥
/// </summary>
- [HttpDelete("{id}")]
+ [HttpDelete("Delete")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
- public async Task<IActionResult> DeleteInstance(string id, [FromQuery] bool deleteConfig = true)
+ public async Task<IActionResult> DeleteInstance(string id, bool deleteConfig = true)
{
try
{
@@ -264,11 +331,11 @@
/// <summary>
/// 鍚姩瀹炰緥
/// </summary>
- [HttpPost("{id}/start")]
+ [HttpPost("start")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
- public async Task<ActionResult<InstanceState>> StartInstance(string id)
+ public async Task<ActionResult> StartInstance([FromQuery] string id)
{
try
{
@@ -290,7 +357,20 @@
var instance = _instanceManager.GetInstance(id);
var state = instance?.GetState();
- return Ok(state);
+ var result = new
+ {
+ instanceId = instance.Config.Id,
+ name = instance.Config.Name,
+ plcType = instance.Config.PLCType.ToString(),
+ port = instance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
+ return Ok(result);
}
catch (Exception ex)
{
@@ -302,10 +382,10 @@
/// <summary>
/// 鍋滄瀹炰緥
/// </summary>
- [HttpPost("{id}/stop")]
+ [HttpPost("stop")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
- public async Task<ActionResult<InstanceState>> StopInstance(string id)
+ public async Task<ActionResult> StopInstance([FromQuery] string id)
{
try
{
@@ -323,7 +403,20 @@
var instance = _instanceManager.GetInstance(id);
var state = instance?.GetState();
- return Ok(state);
+ var result = new
+ {
+ instanceId = instance.Config.Id,
+ name = instance.Config.Name,
+ plcType = instance.Config.PLCType.ToString(),
+ port = instance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
+ return Ok(result);
}
catch (Exception ex)
{
@@ -335,11 +428,11 @@
/// <summary>
/// 閲嶅惎瀹炰緥
/// </summary>
- [HttpPost("{id}/restart")]
+ [HttpPost("restart")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
- public async Task<ActionResult<InstanceState>> RestartInstance(string id)
+ public async Task<ActionResult> RestartInstance([FromQuery] string id)
{
try
{
@@ -361,7 +454,20 @@
var instance = _instanceManager.GetInstance(id);
var state = instance?.GetState();
- return Ok(state);
+ var result = new
+ {
+ instanceId = instance.Config.Id,
+ name = instance.Config.Name,
+ plcType = instance.Config.PLCType.ToString(),
+ port = instance.Config.Port,
+ status = state.Status.ToString(),
+ clientCount = state.ClientCount,
+ totalRequests = state.TotalRequests,
+ startTime = state.StartTime,
+ lastActivityTime = state.LastActivityTime,
+ errorMessage = state.ErrorMessage
+ };
+ return Ok(result);
}
catch (Exception ex)
{
@@ -413,5 +519,32 @@
return StatusCode(StatusCodes.Status500InternalServerError, new { error = "Failed to stop instances" });
}
}
+
+ /// <summary>
+ /// 瑙勮寖鍖栧苟鏍¢獙鍐呭瓨閰嶇疆锛屼紭鍏堜娇鐢ㄦ樉寮� DB 鍧楀垪琛ㄣ��
+ /// </summary>
+ private static void NormalizeMemoryConfig(InstanceConfig config)
+ {
+ if (config.MemoryConfig == null)
+ {
+ config.MemoryConfig = new MemoryRegionConfig();
+ }
+
+ var dbBlockNumbers = (config.MemoryConfig.DBBlockNumbers ?? new List<int>())
+ .Where(x => x > 0)
+ .Distinct()
+ .OrderBy(x => x)
+ .ToList();
+
+ if (dbBlockNumbers.Count == 0)
+ {
+ var count = config.MemoryConfig.DBBlockCount > 0 ? config.MemoryConfig.DBBlockCount : 1;
+ dbBlockNumbers = Enumerable.Range(1, count).ToList();
+ }
+
+ config.MemoryConfig.DBBlockNumbers = dbBlockNumbers;
+ config.MemoryConfig.DBBlockCount = dbBlockNumbers.Count;
+ config.MemoryConfig.DBBlockSize = config.MemoryConfig.DBBlockSize > 0 ? config.MemoryConfig.DBBlockSize : 1024;
+ }
}
}
--
Gitblit v1.9.3