diff --git a/Core/PdmsManager.cs b/Core/PdmsManager.cs index 6db0d19..51bf5d7 100644 --- a/Core/PdmsManager.cs +++ b/Core/PdmsManager.cs @@ -247,11 +247,14 @@ namespace TellmePdmsPluging.Core var effectiveRequest = request ?? new OpenProjectRequest(); effectiveRequest.ApplyDefaults(); - var result = new OpenProjectResult - { - ProjectName = effectiveRequest.ProjectName, - CompletedAt = DateTime.Now - }; + var result = new OpenProjectResult + { + ProjectName = effectiveRequest.ProjectName, + FileSize = -1, + PolygonCount = -1, + FeatureCount = -1, + CompletedAt = DateTime.Now + }; try { @@ -276,12 +279,13 @@ namespace TellmePdmsPluging.Core result.WasAlreadyOpen = alreadyOpen; // 如果已经打开且未指定目标项目名,则直接返回成功 - if (alreadyOpen && string.IsNullOrEmpty(effectiveRequest.ProjectName)) - { - result.Success = true; - result.Message = "项目已打开"; - return result; - } + if (alreadyOpen && string.IsNullOrEmpty(effectiveRequest.ProjectName)) + { + result.Success = true; + result.Message = "项目已打开"; + PopulateOpenProjectMetrics(result); + return result; + } if (string.IsNullOrEmpty(effectiveRequest.ProjectName)) { @@ -295,10 +299,14 @@ namespace TellmePdmsPluging.Core effectiveRequest.UserName ?? string.Empty, effectiveRequest.Password ?? string.Empty); - result.Success = opened; - result.Message = opened ? "项目打开成功" : "项目打开失败(Open 返回 false)"; - result.CompletedAt = DateTime.Now; - return result; + result.Success = opened; + result.Message = opened ? "项目打开成功" : "项目打开失败(Open 返回 false)"; + if (opened) + { + PopulateOpenProjectMetrics(result); + } + result.CompletedAt = DateTime.Now; + return result; } catch (Exception ex) { @@ -487,13 +495,16 @@ namespace TellmePdmsPluging.Core var effectiveRequest = request ?? new OpenMdbRequest(); effectiveRequest.ApplyDefaults(); - var result = new OpenMdbResult - { - MdbName = effectiveRequest.MdbName, - ReadOnly = effectiveRequest.ReadOnly, - DefaultType = effectiveRequest.DefaultType, - CompletedAt = DateTime.Now - }; + var result = new OpenMdbResult + { + MdbName = effectiveRequest.MdbName, + ReadOnly = effectiveRequest.ReadOnly, + DefaultType = effectiveRequest.DefaultType, + FileSize = -1, + PolygonCount = -1, + FeatureCount = -1, + CompletedAt = DateTime.Now + }; try { @@ -508,14 +519,15 @@ namespace TellmePdmsPluging.Core try { var current = MDB.CurrentMDB; - if (current != null && string.Equals(current.Name, effectiveRequest.MdbName, StringComparison.OrdinalIgnoreCase)) - { - result.Success = true; - result.WasAlreadyOpen = true; - result.Message = "MDB 已经打开"; - result.CompletedAt = DateTime.Now; - return result; - } + if (current != null && string.Equals(current.Name, effectiveRequest.MdbName, StringComparison.OrdinalIgnoreCase)) + { + result.Success = true; + result.WasAlreadyOpen = true; + result.Message = "MDB 已经打开"; + PopulateOpenMdbMetrics(result); + result.CompletedAt = DateTime.Now; + return result; + } } catch { @@ -585,11 +597,12 @@ namespace TellmePdmsPluging.Core } result.Success = true; - result.WasAlreadyOpen = false; - result.MdbName = openedMdb.Name; - result.Message = "MDB 打开成功"; - result.CompletedAt = DateTime.Now; - return result; + result.WasAlreadyOpen = false; + result.MdbName = openedMdb.Name; + result.Message = "MDB 打开成功"; + PopulateOpenMdbMetrics(result); + result.CompletedAt = DateTime.Now; + return result; } catch (Exception ex) { @@ -769,36 +782,147 @@ namespace TellmePdmsPluging.Core // 专门统计Zone信息 CountZones(designDb.World, ref zoneCount, activeZones); - return new ModelStatistics - { - TotalElements = totalElements, - ElementCounts = elementCounts, - ZoneCount = zoneCount, - ActiveZones = activeZones - }; - } - } + return new ModelStatistics + { + TotalElements = totalElements, + ElementCounts = elementCounts, + ZoneCount = zoneCount, + ActiveZones = activeZones, + FileSize = TryGetCurrentModelFileSize(), + PolygonCount = -1, + FeatureCount = totalElements + }; + } + } - return new ModelStatistics - { - TotalElements = 0, - ElementCounts = new Dictionary(), - ZoneCount = 0, - ActiveZones = new List() - }; - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}"); - return new ModelStatistics - { - TotalElements = 0, - ElementCounts = new Dictionary(), - ZoneCount = 0, - ActiveZones = new List() - }; - } - } + return new ModelStatistics + { + TotalElements = 0, + ElementCounts = new Dictionary(), + ZoneCount = 0, + ActiveZones = new List(), + FileSize = -1, + PolygonCount = -1, + FeatureCount = 0 + }; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}"); + return new ModelStatistics + { + TotalElements = 0, + ElementCounts = new Dictionary(), + ZoneCount = 0, + ActiveZones = new List(), + FileSize = -1, + PolygonCount = -1, + FeatureCount = 0 + }; + } + } + + private void PopulateOpenProjectMetrics(OpenProjectResult result) + { + var statistics = GetModelStatistics(); + if (statistics == null) + { + return; + } + + result.FileSize = statistics.FileSize; + result.PolygonCount = statistics.PolygonCount; + result.FeatureCount = statistics.FeatureCount; + } + + private void PopulateOpenMdbMetrics(OpenMdbResult result) + { + var statistics = GetModelStatistics(); + if (statistics == null) + { + return; + } + + result.FileSize = statistics.FileSize; + result.PolygonCount = statistics.PolygonCount; + result.FeatureCount = statistics.FeatureCount; + } + + private long TryGetCurrentModelFileSize() + { + try + { + var currentMdb = MDB.CurrentMDB; + if (currentMdb == null) + { + return -1; + } + + var designDb = currentMdb.GetFirstDB(DbType.Design); + string path = TryGetCandidatePath(designDb) ?? TryGetCandidatePath(currentMdb); + if (string.IsNullOrEmpty(path) || !System.IO.File.Exists(path)) + { + return -1; + } + + return new System.IO.FileInfo(path).Length; + } + catch + { + return -1; + } + } + + private static string TryGetCandidatePath(object source) + { + if (source == null) + { + return null; + } + + var type = source.GetType(); + var names = new[] { "FileName", "Filename", "FullName", "Path" }; + foreach (var name in names) + { + var prop = type.GetProperty(name); + if (prop != null && prop.PropertyType == typeof(string)) + { + var value = prop.GetValue(source, null) as string; + if (LooksLikeFilePath(value)) + { + return value; + } + } + + var field = type.GetField(name); + if (field != null && field.FieldType == typeof(string)) + { + var value = field.GetValue(source) as string; + if (LooksLikeFilePath(value)) + { + return value; + } + } + } + + return null; + } + + private static bool LooksLikeFilePath(string value) + { + if (string.IsNullOrEmpty(value)) + { + return false; + } + + var trimmed = value.Trim(); + if (trimmed.Length < 3) + { + return false; + } + + return trimmed.IndexOf('\\') >= 0 || trimmed.IndexOf('/') >= 0; + } private void CountElementsByType(DbElement parentElement, Dictionary elementCounts, ref int totalElements) { diff --git a/Models/CloseProjectRequest.cs b/Models/CloseProjectRequest.cs index b977fa6..55d532f 100644 --- a/Models/CloseProjectRequest.cs +++ b/Models/CloseProjectRequest.cs @@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models { public class CloseProjectRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + public bool Force { get; set; } public void ApplyDefaults() diff --git a/Models/ExportIfcRequest.cs b/Models/ExportIfcRequest.cs index f2aedfd..f7a5f9b 100644 --- a/Models/ExportIfcRequest.cs +++ b/Models/ExportIfcRequest.cs @@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models { public class ExportIfcRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + public string ExportPath { get; set; } public string FileName { get; set; } diff --git a/Models/ModelStatusResponse.cs b/Models/ModelStatusResponse.cs index e83d98e..a79f5d2 100644 --- a/Models/ModelStatusResponse.cs +++ b/Models/ModelStatusResponse.cs @@ -19,13 +19,16 @@ namespace TellmePdmsPluging.Models } - public class ModelStatistics - { - public int TotalElements { get; set; } - public Dictionary ElementCounts { get; set; } - public int ZoneCount { get; set; } - public List ActiveZones { get; set; } - } + public class ModelStatistics + { + public int TotalElements { get; set; } + public Dictionary ElementCounts { get; set; } + public int ZoneCount { get; set; } + public List ActiveZones { get; set; } + public long FileSize { get; set; } + public long PolygonCount { get; set; } + public long FeatureCount { get; set; } + } public class SessionInfo { @@ -34,4 +37,4 @@ namespace TellmePdmsPluging.Models public int DurationMinutes { get; set; } } -} \ No newline at end of file +} diff --git a/Models/OpenMdbRequest.cs b/Models/OpenMdbRequest.cs index 7c891a5..a5d3ab5 100644 --- a/Models/OpenMdbRequest.cs +++ b/Models/OpenMdbRequest.cs @@ -5,6 +5,9 @@ namespace TellmePdmsPluging.Models { public class OpenMdbRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + /// /// MDB name to open /// @@ -121,6 +124,9 @@ namespace TellmePdmsPluging.Models public bool WasAlreadyOpen { get; set; } public bool ReadOnly { get; set; } public string DefaultType { get; set; } + public long FileSize { get; set; } + public long PolygonCount { get; set; } + public long FeatureCount { get; set; } public DateTime CompletedAt { get; set; } } } diff --git a/Models/OpenProjectRequest.cs b/Models/OpenProjectRequest.cs index 18401ae..72eaf29 100644 --- a/Models/OpenProjectRequest.cs +++ b/Models/OpenProjectRequest.cs @@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models { public class OpenProjectRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + /// /// PDMS Project name /// @@ -61,6 +64,9 @@ namespace TellmePdmsPluging.Models public string Message { get; set; } public string ProjectName { get; set; } public bool WasAlreadyOpen { get; set; } + public long FileSize { get; set; } + public long PolygonCount { get; set; } + public long FeatureCount { get; set; } public DateTime CompletedAt { get; set; } } } diff --git a/Models/ShrinkwrapModelRequest.cs b/Models/ShrinkwrapModelRequest.cs index 2dbfd28..6bee819 100644 --- a/Models/ShrinkwrapModelRequest.cs +++ b/Models/ShrinkwrapModelRequest.cs @@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models { public class ShrinkwrapModelRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + public bool DryRun { get; set; } = true; public double Padding { get; set; } = 500.0; diff --git a/Models/SimplifyModelRequest.cs b/Models/SimplifyModelRequest.cs index 22b969f..61e00a5 100644 --- a/Models/SimplifyModelRequest.cs +++ b/Models/SimplifyModelRequest.cs @@ -5,6 +5,9 @@ namespace TellmePdmsPluging.Models { public class SimplifyModelRequest { + public string ExecutionId { get; set; } + public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } } + public bool DryRun { get; set; } = true; public List ZoneFilters diff --git a/Network/BatchTaskResultCallbackService.cs b/Network/BatchTaskResultCallbackService.cs new file mode 100644 index 0000000..2c48062 --- /dev/null +++ b/Network/BatchTaskResultCallbackService.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using System.Web.Script.Serialization; + +namespace TellmePdmsPluging.Network +{ + internal class BatchTaskResultCallbackService + { + private readonly string _serverAddress; + private readonly string _token; + private readonly string _softwareId; + private readonly JavaScriptSerializer _serializer = new JavaScriptSerializer(); + private readonly int[] _retryDelaysMs = new[] { 1000, 3000, 5000 }; + + public BatchTaskResultCallbackService(string serverAddress, string token, string softwareId) + { + _serverAddress = NormalizeServerAddress(serverAddress); + _token = token ?? string.Empty; + _softwareId = string.IsNullOrEmpty(softwareId) ? "pdms" : softwareId; + } + + public void NotifyTaskResultAsync(string executionId, bool success, string errorMessage, object result) + { + if (string.IsNullOrEmpty(executionId)) + { + return; + } + + if (string.IsNullOrEmpty(_serverAddress) || string.IsNullOrEmpty(_token)) + { + return; + } + + ThreadPool.QueueUserWorkItem(_ => + { + TryPostWithRetries(executionId, success, errorMessage, result); + }); + } + + private void TryPostWithRetries(string executionId, bool success, string errorMessage, object result) + { + string callbackUrl = _serverAddress + "/api/v1/plugin-callbacks/task-result"; + + var payload = new Dictionary + { + { "execution_id", executionId }, + { "software_id", _softwareId }, + { "status", success ? "success" : "failed" }, + { "error_message", success ? null : GetFailedErrorMessage(errorMessage) }, + { "result", success ? (result ?? new Dictionary()) : new Dictionary() }, + { "finished_at", DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ") }, + { "token", _token } + }; + + string json = _serializer.Serialize(payload); + + for (int attempt = 0; attempt < _retryDelaysMs.Length + 1; attempt++) + { + if (PostJson(callbackUrl, json)) + { + return; + } + + if (attempt < _retryDelaysMs.Length) + { + Thread.Sleep(_retryDelaysMs[attempt]); + } + } + } + + private static bool PostJson(string url, string json) + { + try + { + var request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "POST"; + request.ContentType = "application/json"; + request.Timeout = 15000; + + byte[] data = Encoding.UTF8.GetBytes(json); + request.ContentLength = data.Length; + + using (var stream = request.GetRequestStream()) + { + stream.Write(data, 0, data.Length); + } + + using (var response = (HttpWebResponse)request.GetResponse()) + { + int statusCode = (int)response.StatusCode; + return statusCode >= 200 && statusCode < 300; + } + } + catch + { + return false; + } + } + + private static string NormalizeServerAddress(string serverAddress) + { + if (string.IsNullOrEmpty(serverAddress)) + { + return null; + } + + string value = serverAddress.Trim(); + while (value.EndsWith("/", StringComparison.Ordinal)) + { + value = value.Substring(0, value.Length - 1); + } + + return value; + } + + private static string GetFailedErrorMessage(string errorMessage) + { + return string.IsNullOrEmpty(errorMessage) ? "UNKNOWN_ERROR" : errorMessage; + } + } +} diff --git a/Network/HttpServer.cs b/Network/HttpServer.cs index 65c74b8..4fce761 100644 --- a/Network/HttpServer.cs +++ b/Network/HttpServer.cs @@ -1,27 +1,32 @@ using System; using System.Net; using System.Text; -using System.IO; -using System.Collections.Generic; -using System.Web.Script.Serialization; -using TellmePdmsPluging.Commands; -using TellmePdmsPluging.Core; -using TellmePdmsPluging.Models; +using System.IO; +using System.Collections.Generic; +using System.Web.Script.Serialization; +using TellmePdmsPluging.Commands; +using TellmePdmsPluging.Core; +using TellmePdmsPluging.Models; namespace TellmePdmsPluging.Network { public class HttpServer : IDisposable { - private readonly HttpListener _listener; - private readonly int _port; - private bool _isRunning; + private readonly HttpListener _listener; + private readonly BatchTaskResultCallbackService _batchCallbackService; + private readonly int _port; + private bool _isRunning; - public HttpServer(int port = 9001) - { - _port = port; - _listener = new HttpListener(); - _listener.Prefixes.Add($"http://localhost:{port}/"); - } + public HttpServer(int port = 9001) + { + _port = port; + _listener = new HttpListener(); + _listener.Prefixes.Add($"http://localhost:{port}/"); + _batchCallbackService = new BatchTaskResultCallbackService( + Environment.GetEnvironmentVariable("TELLME_BATCH_CALLBACK_SERVER"), + Environment.GetEnvironmentVariable("TELLME_BATCH_CALLBACK_TOKEN"), + "pdms"); + } public void Start() { @@ -231,18 +236,20 @@ namespace TellmePdmsPluging.Network } } - private string HandleModelSimplify(HttpListenerRequest request) - { - try - { - var payload = ReadRequestBody(request); - if (string.IsNullOrEmpty(payload)) - { + private string HandleModelSimplify(HttpListenerRequest request) + { + string executionId = null; + try + { + var payload = ReadRequestBody(request); + if (string.IsNullOrEmpty(payload)) + { return CreateErrorResponse(400, "请求体不能为空"); } - var serializer = new JavaScriptSerializer(); - var simplifyRequest = serializer.Deserialize(payload) ?? new SimplifyModelRequest(); + var serializer = new JavaScriptSerializer(); + var simplifyRequest = serializer.Deserialize(payload) ?? new SimplifyModelRequest(); + executionId = simplifyRequest.ExecutionId; var command = new SimplifyModelCommand(simplifyRequest); var result = command.Execute() as SimplifyModelResult; @@ -252,41 +259,47 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(500, "模型轻量化结果为空"); } - if (!result.Success) - { - var message = string.IsNullOrEmpty(result.Message) ? "模型轻量化失败" : result.Message; - return CreateErrorResponse(500, message); - } - - return CreateSuccessResponse(result); - } - catch (Exception ex) - { - return CreateErrorResponse(500, $"模型轻量化失败: {ex.Message}"); - } - } - - private string HandleModelShrinkwrap(HttpListenerRequest request) - { - try - { - var payload = ReadRequestBody(request); - if (string.IsNullOrEmpty(payload)) - { + if (!result.Success) + { + var message = string.IsNullOrEmpty(result.Message) ? "模型轻量化失败" : result.Message; + NotifyBatchTaskResult(simplifyRequest.ExecutionId, false, message, null); + return CreateErrorResponse(500, message); + } + + NotifyBatchTaskResult(simplifyRequest.ExecutionId, true, null, result); + return CreateSuccessResponse(result); + } + catch (Exception ex) + { + NotifyBatchTaskResult(executionId, false, ex.Message, null); + return CreateErrorResponse(500, $"模型轻量化失败: {ex.Message}"); + } + } + + private string HandleModelShrinkwrap(HttpListenerRequest request) + { + string executionId = null; + try + { + var payload = ReadRequestBody(request); + if (string.IsNullOrEmpty(payload)) + { return CreateErrorResponse(400, "请求体不能为空"); } - var serializer = new JavaScriptSerializer(); - var shrinkwrapRequest = serializer.Deserialize(payload) ?? new ShrinkwrapModelRequest(); + var serializer = new JavaScriptSerializer(); + var shrinkwrapRequest = serializer.Deserialize(payload) ?? new ShrinkwrapModelRequest(); + executionId = shrinkwrapRequest.ExecutionId; var command = new ShrinkwrapModelCommand(shrinkwrapRequest); var invokeResult = MainThreadInvoker.Invoke(command, 600000); - if (!invokeResult.Success) - { - var msg = string.IsNullOrEmpty(invokeResult.Message) ? "外壳保留失败" : invokeResult.Message; - return CreateErrorResponse(500, msg); - } + if (!invokeResult.Success) + { + var msg = string.IsNullOrEmpty(invokeResult.Message) ? "外壳保留失败" : invokeResult.Message; + NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, false, msg, null); + return CreateErrorResponse(500, msg); + } var result = invokeResult.Result as ShrinkwrapModelResult; if (result == null) @@ -294,27 +307,31 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(500, "外壳保留结果为空"); } - if (!result.Success) - { - var message = string.IsNullOrEmpty(result.Message) ? "外壳保留失败" : result.Message; - return CreateErrorResponse(500, message); - } - - return CreateSuccessResponse(result); - } - catch (Exception ex) - { - return CreateErrorResponse(500, $"外壳保留失败: {ex.Message}"); - } - } - + if (!result.Success) + { + var message = string.IsNullOrEmpty(result.Message) ? "外壳保留失败" : result.Message; + NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, false, message, null); + return CreateErrorResponse(500, message); + } + + NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, true, null, result); + return CreateSuccessResponse(result); + } + catch (Exception ex) + { + NotifyBatchTaskResult(executionId, false, ex.Message, null); + return CreateErrorResponse(500, $"外壳保留失败: {ex.Message}"); + } + } + private string HandleProjectOpen(HttpListenerRequest request) { - try - { - if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) - { - return CreateErrorResponse(405, "仅支持POST"); + string executionId = null; + try + { + if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) + { + return CreateErrorResponse(405, "仅支持POST"); } var payload = ReadRequestBody(request); @@ -323,17 +340,19 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(400, "请求体不能为空"); } - var serializer = new JavaScriptSerializer(); - var openRequest = serializer.Deserialize(payload) ?? new OpenProjectRequest(); + var serializer = new JavaScriptSerializer(); + var openRequest = serializer.Deserialize(payload) ?? new OpenProjectRequest(); + executionId = openRequest.ExecutionId; var command = new OpenProjectCommand(openRequest); var invokeResult = MainThreadInvoker.Invoke(command, 600000); - if (!invokeResult.Success) - { - var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开项目失败" : invokeResult.Message; - return CreateErrorResponse(500, msg); - } + if (!invokeResult.Success) + { + var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开项目失败" : invokeResult.Message; + NotifyBatchTaskResult(openRequest.ExecutionId, false, msg, null); + return CreateErrorResponse(500, msg); + } var result = invokeResult.Result as OpenProjectResult; if (result == null) @@ -341,22 +360,26 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(500, "打开项目结果为空"); } - if (!result.Success) - { - var message = string.IsNullOrEmpty(result.Message) ? "打开项目失败" : result.Message; - return CreateErrorResponse(500, message); - } - - return CreateSuccessResponse(result); - } - catch (Exception ex) - { - return CreateErrorResponse(500, $"打开项目失败: {ex.Message}"); - } + if (!result.Success) + { + var message = string.IsNullOrEmpty(result.Message) ? "打开项目失败" : result.Message; + NotifyBatchTaskResult(openRequest.ExecutionId, false, message, null); + return CreateErrorResponse(500, message); + } + + NotifyBatchTaskResult(openRequest.ExecutionId, true, null, result); + return CreateSuccessResponse(result); + } + catch (Exception ex) + { + NotifyBatchTaskResult(executionId, false, ex.Message, null); + return CreateErrorResponse(500, $"打开项目失败: {ex.Message}"); + } } private string HandleProjectClose(HttpListenerRequest request) { + string executionId = null; try { if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) @@ -369,6 +392,7 @@ namespace TellmePdmsPluging.Network var closeRequest = string.IsNullOrEmpty(payload) ? new CloseProjectRequest() : (serializer.Deserialize(payload) ?? new CloseProjectRequest()); + executionId = closeRequest.ExecutionId; var command = new CloseProjectCommand(closeRequest); var invokeResult = MainThreadInvoker.Invoke(command, 600000); @@ -376,6 +400,7 @@ namespace TellmePdmsPluging.Network if (!invokeResult.Success) { var msg = string.IsNullOrEmpty(invokeResult.Message) ? "关闭项目失败" : invokeResult.Message; + NotifyBatchTaskResult(closeRequest.ExecutionId, false, msg, null); return CreateErrorResponse(500, msg); } @@ -388,24 +413,28 @@ namespace TellmePdmsPluging.Network if (!result.Success) { var message = string.IsNullOrEmpty(result.Message) ? "关闭项目失败" : result.Message; + NotifyBatchTaskResult(closeRequest.ExecutionId, false, message, null); return CreateErrorResponse(500, message); } + NotifyBatchTaskResult(closeRequest.ExecutionId, true, null, result); return CreateSuccessResponse(result); } catch (Exception ex) { + NotifyBatchTaskResult(executionId, false, ex.Message, null); return CreateErrorResponse(500, "关闭项目失败: " + ex.Message); } } - - private string HandleMdbOpen(HttpListenerRequest request) - { - try - { - if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) - { - return CreateErrorResponse(405, "仅支持POST"); + + private string HandleMdbOpen(HttpListenerRequest request) + { + string executionId = null; + try + { + if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) + { + return CreateErrorResponse(405, "仅支持POST"); } var payload = ReadRequestBody(request); @@ -414,17 +443,19 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(400, "请求体不能为空"); } - var serializer = new JavaScriptSerializer(); - var openRequest = serializer.Deserialize(payload) ?? new OpenMdbRequest(); + var serializer = new JavaScriptSerializer(); + var openRequest = serializer.Deserialize(payload) ?? new OpenMdbRequest(); + executionId = openRequest.ExecutionId; var command = new OpenMdbCommand(openRequest); var invokeResult = MainThreadInvoker.Invoke(command, 600000); - if (!invokeResult.Success) - { - var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message; - return CreateErrorResponse(500, msg); - } + if (!invokeResult.Success) + { + var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message; + NotifyBatchTaskResult(openRequest.ExecutionId, false, msg, null); + return CreateErrorResponse(500, msg); + } var result = invokeResult.Result as OpenMdbResult; if (result == null) @@ -432,27 +463,31 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(500, "打开MDB结果为空"); } - if (!result.Success) - { - var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message; - return CreateErrorResponse(500, message); - } - - return CreateSuccessResponse(result); - } - catch (Exception ex) - { - return CreateErrorResponse(500, $"打开MDB失败: {ex.Message}"); - } - } - - private string HandleExportIfc(HttpListenerRequest request) - { - try - { - if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) - { - return CreateErrorResponse(405, "仅支持POST"); + if (!result.Success) + { + var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message; + NotifyBatchTaskResult(openRequest.ExecutionId, false, message, null); + return CreateErrorResponse(500, message); + } + + NotifyBatchTaskResult(openRequest.ExecutionId, true, null, result); + return CreateSuccessResponse(result); + } + catch (Exception ex) + { + NotifyBatchTaskResult(executionId, false, ex.Message, null); + return CreateErrorResponse(500, $"打开MDB失败: {ex.Message}"); + } + } + + private string HandleExportIfc(HttpListenerRequest request) + { + string executionId = null; + try + { + if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) + { + return CreateErrorResponse(405, "仅支持POST"); } var payload = ReadRequestBody(request); @@ -461,17 +496,19 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(400, "请求体不能为空"); } - var serializer = new JavaScriptSerializer(); - var exportRequest = serializer.Deserialize(payload) ?? new ExportIfcRequest(); + var serializer = new JavaScriptSerializer(); + var exportRequest = serializer.Deserialize(payload) ?? new ExportIfcRequest(); + executionId = exportRequest.ExecutionId; var command = new ExportIfcCommand(exportRequest); var invokeResult = MainThreadInvoker.Invoke(command, 600000); - if (!invokeResult.Success) - { - var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message; - return CreateErrorResponse(500, msg); - } + if (!invokeResult.Success) + { + var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message; + NotifyBatchTaskResult(exportRequest.ExecutionId, false, msg, null); + return CreateErrorResponse(500, msg); + } var result = invokeResult.Result as ExportIfcResult; if (result == null) @@ -479,19 +516,22 @@ namespace TellmePdmsPluging.Network return CreateErrorResponse(500, "IFC导出结果为空"); } - if (!result.Success) - { - var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message; - return CreateErrorResponse(500, message); - } - - return CreateSuccessResponse(result); - } - catch (Exception ex) - { - return CreateErrorResponse(500, $"IFC导出失败: {ex.Message}"); - } - } + if (!result.Success) + { + var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message; + NotifyBatchTaskResult(exportRequest.ExecutionId, false, message, null); + return CreateErrorResponse(500, message); + } + + NotifyBatchTaskResult(exportRequest.ExecutionId, true, null, result); + return CreateSuccessResponse(result); + } + catch (Exception ex) + { + NotifyBatchTaskResult(executionId, false, ex.Message, null); + return CreateErrorResponse(500, $"IFC导出失败: {ex.Message}"); + } + } private string ReadRequestBody(HttpListenerRequest request) { @@ -620,8 +660,8 @@ namespace TellmePdmsPluging.Network return "{" + string.Join(",", jsonParts.ToArray()) + "}"; } - private string SerializeModelStatusResponse(ModelStatusResponse model) - { + private string SerializeModelStatusResponse(ModelStatusResponse model) + { var parts = new List(); parts.Add($"\"ModelLoaded\":{model.ModelLoaded.ToString().ToLower()}"); @@ -629,8 +669,13 @@ namespace TellmePdmsPluging.Network parts.Add($"\"ModelStatistics\":{SimpleJsonSerialize(model.ModelStatistics)}"); parts.Add($"\"SessionInfo\":{SimpleJsonSerialize(model.SessionInfo)}"); - return "{" + string.Join(",", parts.ToArray()) + "}"; - } + return "{" + string.Join(",", parts.ToArray()) + "}"; + } + + private void NotifyBatchTaskResult(string executionId, bool success, string errorMessage, object result) + { + _batchCallbackService.NotifyTaskResultAsync(executionId, success, errorMessage, result); + } private void LogMessage(string message) { diff --git a/TellmePdmsPluging.csproj b/TellmePdmsPluging.csproj index 880bd3c..adddeb0 100644 --- a/TellmePdmsPluging.csproj +++ b/TellmePdmsPluging.csproj @@ -97,8 +97,9 @@ - - - + + + +