添加执行ID支持,改进模型统计信息,优化项目和MDB打开/关闭的回调通知

This commit is contained in:
sladro 2026-03-03 18:26:08 +08:00
parent 6aa9aa8456
commit 74e8ae24c2
11 changed files with 546 additions and 225 deletions

View File

@ -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<string, int>(),
ZoneCount = 0,
ActiveZones = new List<string>()
};
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}");
return new ModelStatistics
{
TotalElements = 0,
ElementCounts = new Dictionary<string, int>(),
ZoneCount = 0,
ActiveZones = new List<string>()
};
}
}
return new ModelStatistics
{
TotalElements = 0,
ElementCounts = new Dictionary<string, int>(),
ZoneCount = 0,
ActiveZones = new List<string>(),
FileSize = -1,
PolygonCount = -1,
FeatureCount = 0
};
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}");
return new ModelStatistics
{
TotalElements = 0,
ElementCounts = new Dictionary<string, int>(),
ZoneCount = 0,
ActiveZones = new List<string>(),
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<string, int> elementCounts, ref int totalElements)
{

View File

@ -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()

View File

@ -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; }

View File

@ -19,13 +19,16 @@ namespace TellmePdmsPluging.Models
}
public class ModelStatistics
{
public int TotalElements { get; set; }
public Dictionary<string, int> ElementCounts { get; set; }
public int ZoneCount { get; set; }
public List<string> ActiveZones { get; set; }
}
public class ModelStatistics
{
public int TotalElements { get; set; }
public Dictionary<string, int> ElementCounts { get; set; }
public int ZoneCount { get; set; }
public List<string> 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; }
}
}
}

View File

@ -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; } }
/// <summary>
/// MDB name to open
/// </summary>
@ -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; }
}
}

View File

@ -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; } }
/// <summary>
/// PDMS Project name
/// </summary>
@ -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; }
}
}

View File

@ -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;

View File

@ -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<string> ZoneFilters

View File

@ -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<string, object>
{
{ "execution_id", executionId },
{ "software_id", _softwareId },
{ "status", success ? "success" : "failed" },
{ "error_message", success ? null : GetFailedErrorMessage(errorMessage) },
{ "result", success ? (result ?? new Dictionary<string, object>()) : new Dictionary<string, object>() },
{ "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;
}
}
}

View File

@ -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<SimplifyModelRequest>(payload) ?? new SimplifyModelRequest();
var serializer = new JavaScriptSerializer();
var simplifyRequest = serializer.Deserialize<SimplifyModelRequest>(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<ShrinkwrapModelRequest>(payload) ?? new ShrinkwrapModelRequest();
var serializer = new JavaScriptSerializer();
var shrinkwrapRequest = serializer.Deserialize<ShrinkwrapModelRequest>(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<OpenProjectRequest>(payload) ?? new OpenProjectRequest();
var serializer = new JavaScriptSerializer();
var openRequest = serializer.Deserialize<OpenProjectRequest>(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<CloseProjectRequest>(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<OpenMdbRequest>(payload) ?? new OpenMdbRequest();
var serializer = new JavaScriptSerializer();
var openRequest = serializer.Deserialize<OpenMdbRequest>(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<ExportIfcRequest>(payload) ?? new ExportIfcRequest();
var serializer = new JavaScriptSerializer();
var exportRequest = serializer.Deserialize<ExportIfcRequest>(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<string>();
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)
{

View File

@ -97,8 +97,9 @@
<Compile Include="Models\OpenProjectRequest.cs" />
<Compile Include="Models\ShrinkwrapModelRequest.cs" />
<Compile Include="Models\SimplifyModelRequest.cs" />
<Compile Include="Network\HttpServer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Compile Include="Network\HttpServer.cs" />
<Compile Include="Network\BatchTaskResultCallbackService.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>