添加执行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(); var effectiveRequest = request ?? new OpenProjectRequest();
effectiveRequest.ApplyDefaults(); effectiveRequest.ApplyDefaults();
var result = new OpenProjectResult var result = new OpenProjectResult
{ {
ProjectName = effectiveRequest.ProjectName, ProjectName = effectiveRequest.ProjectName,
CompletedAt = DateTime.Now FileSize = -1,
}; PolygonCount = -1,
FeatureCount = -1,
CompletedAt = DateTime.Now
};
try try
{ {
@ -276,12 +279,13 @@ namespace TellmePdmsPluging.Core
result.WasAlreadyOpen = alreadyOpen; result.WasAlreadyOpen = alreadyOpen;
// 如果已经打开且未指定目标项目名,则直接返回成功 // 如果已经打开且未指定目标项目名,则直接返回成功
if (alreadyOpen && string.IsNullOrEmpty(effectiveRequest.ProjectName)) if (alreadyOpen && string.IsNullOrEmpty(effectiveRequest.ProjectName))
{ {
result.Success = true; result.Success = true;
result.Message = "项目已打开"; result.Message = "项目已打开";
return result; PopulateOpenProjectMetrics(result);
} return result;
}
if (string.IsNullOrEmpty(effectiveRequest.ProjectName)) if (string.IsNullOrEmpty(effectiveRequest.ProjectName))
{ {
@ -295,10 +299,14 @@ namespace TellmePdmsPluging.Core
effectiveRequest.UserName ?? string.Empty, effectiveRequest.UserName ?? string.Empty,
effectiveRequest.Password ?? string.Empty); effectiveRequest.Password ?? string.Empty);
result.Success = opened; result.Success = opened;
result.Message = opened ? "项目打开成功" : "项目打开失败Open 返回 false"; result.Message = opened ? "项目打开成功" : "项目打开失败Open 返回 false";
result.CompletedAt = DateTime.Now; if (opened)
return result; {
PopulateOpenProjectMetrics(result);
}
result.CompletedAt = DateTime.Now;
return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -487,13 +495,16 @@ namespace TellmePdmsPluging.Core
var effectiveRequest = request ?? new OpenMdbRequest(); var effectiveRequest = request ?? new OpenMdbRequest();
effectiveRequest.ApplyDefaults(); effectiveRequest.ApplyDefaults();
var result = new OpenMdbResult var result = new OpenMdbResult
{ {
MdbName = effectiveRequest.MdbName, MdbName = effectiveRequest.MdbName,
ReadOnly = effectiveRequest.ReadOnly, ReadOnly = effectiveRequest.ReadOnly,
DefaultType = effectiveRequest.DefaultType, DefaultType = effectiveRequest.DefaultType,
CompletedAt = DateTime.Now FileSize = -1,
}; PolygonCount = -1,
FeatureCount = -1,
CompletedAt = DateTime.Now
};
try try
{ {
@ -508,14 +519,15 @@ namespace TellmePdmsPluging.Core
try try
{ {
var current = MDB.CurrentMDB; var current = MDB.CurrentMDB;
if (current != null && string.Equals(current.Name, effectiveRequest.MdbName, StringComparison.OrdinalIgnoreCase)) if (current != null && string.Equals(current.Name, effectiveRequest.MdbName, StringComparison.OrdinalIgnoreCase))
{ {
result.Success = true; result.Success = true;
result.WasAlreadyOpen = true; result.WasAlreadyOpen = true;
result.Message = "MDB 已经打开"; result.Message = "MDB 已经打开";
result.CompletedAt = DateTime.Now; PopulateOpenMdbMetrics(result);
return result; result.CompletedAt = DateTime.Now;
} return result;
}
} }
catch catch
{ {
@ -585,11 +597,12 @@ namespace TellmePdmsPluging.Core
} }
result.Success = true; result.Success = true;
result.WasAlreadyOpen = false; result.WasAlreadyOpen = false;
result.MdbName = openedMdb.Name; result.MdbName = openedMdb.Name;
result.Message = "MDB 打开成功"; result.Message = "MDB 打开成功";
result.CompletedAt = DateTime.Now; PopulateOpenMdbMetrics(result);
return result; result.CompletedAt = DateTime.Now;
return result;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -769,36 +782,147 @@ namespace TellmePdmsPluging.Core
// 专门统计Zone信息 // 专门统计Zone信息
CountZones(designDb.World, ref zoneCount, activeZones); CountZones(designDb.World, ref zoneCount, activeZones);
return new ModelStatistics return new ModelStatistics
{ {
TotalElements = totalElements, TotalElements = totalElements,
ElementCounts = elementCounts, ElementCounts = elementCounts,
ZoneCount = zoneCount, ZoneCount = zoneCount,
ActiveZones = activeZones ActiveZones = activeZones,
}; FileSize = TryGetCurrentModelFileSize(),
} PolygonCount = -1,
} FeatureCount = totalElements
};
}
}
return new ModelStatistics return new ModelStatistics
{ {
TotalElements = 0, TotalElements = 0,
ElementCounts = new Dictionary<string, int>(), ElementCounts = new Dictionary<string, int>(),
ZoneCount = 0, ZoneCount = 0,
ActiveZones = new List<string>() ActiveZones = new List<string>(),
}; FileSize = -1,
} PolygonCount = -1,
catch (Exception ex) FeatureCount = 0
{ };
System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}"); }
return new ModelStatistics catch (Exception ex)
{ {
TotalElements = 0, System.Diagnostics.Debug.WriteLine($"获取模型统计信息失败: {ex.Message}");
ElementCounts = new Dictionary<string, int>(), return new ModelStatistics
ZoneCount = 0, {
ActiveZones = new List<string>() 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) 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 class CloseProjectRequest
{ {
public string ExecutionId { get; set; }
public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } }
public bool Force { get; set; } public bool Force { get; set; }
public void ApplyDefaults() public void ApplyDefaults()

View File

@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models
{ {
public class ExportIfcRequest 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 ExportPath { get; set; }
public string FileName { get; set; } public string FileName { get; set; }

View File

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

View File

@ -5,6 +5,9 @@ namespace TellmePdmsPluging.Models
{ {
public class OpenMdbRequest public class OpenMdbRequest
{ {
public string ExecutionId { get; set; }
public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } }
/// <summary> /// <summary>
/// MDB name to open /// MDB name to open
/// </summary> /// </summary>
@ -121,6 +124,9 @@ namespace TellmePdmsPluging.Models
public bool WasAlreadyOpen { get; set; } public bool WasAlreadyOpen { get; set; }
public bool ReadOnly { get; set; } public bool ReadOnly { get; set; }
public string DefaultType { 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; } public DateTime CompletedAt { get; set; }
} }
} }

View File

@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models
{ {
public class OpenProjectRequest public class OpenProjectRequest
{ {
public string ExecutionId { get; set; }
public string execution_id { get { return ExecutionId; } set { ExecutionId = value; } }
/// <summary> /// <summary>
/// PDMS Project name /// PDMS Project name
/// </summary> /// </summary>
@ -61,6 +64,9 @@ namespace TellmePdmsPluging.Models
public string Message { get; set; } public string Message { get; set; }
public string ProjectName { get; set; } public string ProjectName { get; set; }
public bool WasAlreadyOpen { 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; } public DateTime CompletedAt { get; set; }
} }
} }

View File

@ -4,6 +4,9 @@ namespace TellmePdmsPluging.Models
{ {
public class ShrinkwrapModelRequest 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 bool DryRun { get; set; } = true;
public double Padding { get; set; } = 500.0; public double Padding { get; set; } = 500.0;

View File

@ -5,6 +5,9 @@ namespace TellmePdmsPluging.Models
{ {
public class SimplifyModelRequest 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 bool DryRun { get; set; } = true;
public List<string> ZoneFilters 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;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Web.Script.Serialization; using System.Web.Script.Serialization;
using TellmePdmsPluging.Commands; using TellmePdmsPluging.Commands;
using TellmePdmsPluging.Core; using TellmePdmsPluging.Core;
using TellmePdmsPluging.Models; using TellmePdmsPluging.Models;
namespace TellmePdmsPluging.Network namespace TellmePdmsPluging.Network
{ {
public class HttpServer : IDisposable public class HttpServer : IDisposable
{ {
private readonly HttpListener _listener; private readonly HttpListener _listener;
private readonly int _port; private readonly BatchTaskResultCallbackService _batchCallbackService;
private bool _isRunning; private readonly int _port;
private bool _isRunning;
public HttpServer(int port = 9001) public HttpServer(int port = 9001)
{ {
_port = port; _port = port;
_listener = new HttpListener(); _listener = new HttpListener();
_listener.Prefixes.Add($"http://localhost:{port}/"); _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() public void Start()
{ {
@ -231,18 +236,20 @@ namespace TellmePdmsPluging.Network
} }
} }
private string HandleModelSimplify(HttpListenerRequest request) private string HandleModelSimplify(HttpListenerRequest request)
{ {
try string executionId = null;
{ try
var payload = ReadRequestBody(request); {
if (string.IsNullOrEmpty(payload)) var payload = ReadRequestBody(request);
{ if (string.IsNullOrEmpty(payload))
{
return CreateErrorResponse(400, "请求体不能为空"); return CreateErrorResponse(400, "请求体不能为空");
} }
var serializer = new JavaScriptSerializer(); var serializer = new JavaScriptSerializer();
var simplifyRequest = serializer.Deserialize<SimplifyModelRequest>(payload) ?? new SimplifyModelRequest(); var simplifyRequest = serializer.Deserialize<SimplifyModelRequest>(payload) ?? new SimplifyModelRequest();
executionId = simplifyRequest.ExecutionId;
var command = new SimplifyModelCommand(simplifyRequest); var command = new SimplifyModelCommand(simplifyRequest);
var result = command.Execute() as SimplifyModelResult; var result = command.Execute() as SimplifyModelResult;
@ -252,41 +259,47 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(500, "模型轻量化结果为空"); return CreateErrorResponse(500, "模型轻量化结果为空");
} }
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "模型轻量化失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "模型轻量化失败" : result.Message;
return CreateErrorResponse(500, message); NotifyBatchTaskResult(simplifyRequest.ExecutionId, false, message, null);
} return CreateErrorResponse(500, message);
}
return CreateSuccessResponse(result);
} NotifyBatchTaskResult(simplifyRequest.ExecutionId, true, null, result);
catch (Exception ex) return CreateSuccessResponse(result);
{ }
return CreateErrorResponse(500, $"模型轻量化失败: {ex.Message}"); catch (Exception ex)
} {
} NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, $"模型轻量化失败: {ex.Message}");
private string HandleModelShrinkwrap(HttpListenerRequest request) }
{ }
try
{ private string HandleModelShrinkwrap(HttpListenerRequest request)
var payload = ReadRequestBody(request); {
if (string.IsNullOrEmpty(payload)) string executionId = null;
{ try
{
var payload = ReadRequestBody(request);
if (string.IsNullOrEmpty(payload))
{
return CreateErrorResponse(400, "请求体不能为空"); return CreateErrorResponse(400, "请求体不能为空");
} }
var serializer = new JavaScriptSerializer(); var serializer = new JavaScriptSerializer();
var shrinkwrapRequest = serializer.Deserialize<ShrinkwrapModelRequest>(payload) ?? new ShrinkwrapModelRequest(); var shrinkwrapRequest = serializer.Deserialize<ShrinkwrapModelRequest>(payload) ?? new ShrinkwrapModelRequest();
executionId = shrinkwrapRequest.ExecutionId;
var command = new ShrinkwrapModelCommand(shrinkwrapRequest); var command = new ShrinkwrapModelCommand(shrinkwrapRequest);
var invokeResult = MainThreadInvoker.Invoke(command, 600000); var invokeResult = MainThreadInvoker.Invoke(command, 600000);
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "外壳保留失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "外壳保留失败" : invokeResult.Message;
return CreateErrorResponse(500, msg); NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, false, msg, null);
} return CreateErrorResponse(500, msg);
}
var result = invokeResult.Result as ShrinkwrapModelResult; var result = invokeResult.Result as ShrinkwrapModelResult;
if (result == null) if (result == null)
@ -294,27 +307,31 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(500, "外壳保留结果为空"); return CreateErrorResponse(500, "外壳保留结果为空");
} }
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "外壳保留失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "外壳保留失败" : result.Message;
return CreateErrorResponse(500, message); NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, false, message, null);
} return CreateErrorResponse(500, message);
}
return CreateSuccessResponse(result);
} NotifyBatchTaskResult(shrinkwrapRequest.ExecutionId, true, null, result);
catch (Exception ex) return CreateSuccessResponse(result);
{ }
return CreateErrorResponse(500, $"外壳保留失败: {ex.Message}"); catch (Exception ex)
} {
} NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, $"外壳保留失败: {ex.Message}");
}
}
private string HandleProjectOpen(HttpListenerRequest request) private string HandleProjectOpen(HttpListenerRequest request)
{ {
try string executionId = null;
{ try
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) {
{ if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
return CreateErrorResponse(405, "仅支持POST"); {
return CreateErrorResponse(405, "仅支持POST");
} }
var payload = ReadRequestBody(request); var payload = ReadRequestBody(request);
@ -323,17 +340,19 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(400, "请求体不能为空"); return CreateErrorResponse(400, "请求体不能为空");
} }
var serializer = new JavaScriptSerializer(); var serializer = new JavaScriptSerializer();
var openRequest = serializer.Deserialize<OpenProjectRequest>(payload) ?? new OpenProjectRequest(); var openRequest = serializer.Deserialize<OpenProjectRequest>(payload) ?? new OpenProjectRequest();
executionId = openRequest.ExecutionId;
var command = new OpenProjectCommand(openRequest); var command = new OpenProjectCommand(openRequest);
var invokeResult = MainThreadInvoker.Invoke(command, 600000); var invokeResult = MainThreadInvoker.Invoke(command, 600000);
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开项目失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开项目失败" : invokeResult.Message;
return CreateErrorResponse(500, msg); NotifyBatchTaskResult(openRequest.ExecutionId, false, msg, null);
} return CreateErrorResponse(500, msg);
}
var result = invokeResult.Result as OpenProjectResult; var result = invokeResult.Result as OpenProjectResult;
if (result == null) if (result == null)
@ -341,22 +360,26 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(500, "打开项目结果为空"); return CreateErrorResponse(500, "打开项目结果为空");
} }
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "打开项目失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "打开项目失败" : result.Message;
return CreateErrorResponse(500, message); NotifyBatchTaskResult(openRequest.ExecutionId, false, message, null);
} return CreateErrorResponse(500, message);
}
return CreateSuccessResponse(result);
} NotifyBatchTaskResult(openRequest.ExecutionId, true, null, result);
catch (Exception ex) return CreateSuccessResponse(result);
{ }
return CreateErrorResponse(500, $"打开项目失败: {ex.Message}"); catch (Exception ex)
} {
NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, $"打开项目失败: {ex.Message}");
}
} }
private string HandleProjectClose(HttpListenerRequest request) private string HandleProjectClose(HttpListenerRequest request)
{ {
string executionId = null;
try try
{ {
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
@ -369,6 +392,7 @@ namespace TellmePdmsPluging.Network
var closeRequest = string.IsNullOrEmpty(payload) var closeRequest = string.IsNullOrEmpty(payload)
? new CloseProjectRequest() ? new CloseProjectRequest()
: (serializer.Deserialize<CloseProjectRequest>(payload) ?? new CloseProjectRequest()); : (serializer.Deserialize<CloseProjectRequest>(payload) ?? new CloseProjectRequest());
executionId = closeRequest.ExecutionId;
var command = new CloseProjectCommand(closeRequest); var command = new CloseProjectCommand(closeRequest);
var invokeResult = MainThreadInvoker.Invoke(command, 600000); var invokeResult = MainThreadInvoker.Invoke(command, 600000);
@ -376,6 +400,7 @@ namespace TellmePdmsPluging.Network
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "关闭项目失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "关闭项目失败" : invokeResult.Message;
NotifyBatchTaskResult(closeRequest.ExecutionId, false, msg, null);
return CreateErrorResponse(500, msg); return CreateErrorResponse(500, msg);
} }
@ -388,24 +413,28 @@ namespace TellmePdmsPluging.Network
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "关闭项目失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "关闭项目失败" : result.Message;
NotifyBatchTaskResult(closeRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(closeRequest.ExecutionId, true, null, result);
return CreateSuccessResponse(result); return CreateSuccessResponse(result);
} }
catch (Exception ex) catch (Exception ex)
{ {
NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, "关闭项目失败: " + ex.Message); return CreateErrorResponse(500, "关闭项目失败: " + ex.Message);
} }
} }
private string HandleMdbOpen(HttpListenerRequest request) private string HandleMdbOpen(HttpListenerRequest request)
{ {
try string executionId = null;
{ try
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) {
{ if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
return CreateErrorResponse(405, "仅支持POST"); {
return CreateErrorResponse(405, "仅支持POST");
} }
var payload = ReadRequestBody(request); var payload = ReadRequestBody(request);
@ -414,17 +443,19 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(400, "请求体不能为空"); return CreateErrorResponse(400, "请求体不能为空");
} }
var serializer = new JavaScriptSerializer(); var serializer = new JavaScriptSerializer();
var openRequest = serializer.Deserialize<OpenMdbRequest>(payload) ?? new OpenMdbRequest(); var openRequest = serializer.Deserialize<OpenMdbRequest>(payload) ?? new OpenMdbRequest();
executionId = openRequest.ExecutionId;
var command = new OpenMdbCommand(openRequest); var command = new OpenMdbCommand(openRequest);
var invokeResult = MainThreadInvoker.Invoke(command, 600000); var invokeResult = MainThreadInvoker.Invoke(command, 600000);
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message;
return CreateErrorResponse(500, msg); NotifyBatchTaskResult(openRequest.ExecutionId, false, msg, null);
} return CreateErrorResponse(500, msg);
}
var result = invokeResult.Result as OpenMdbResult; var result = invokeResult.Result as OpenMdbResult;
if (result == null) if (result == null)
@ -432,27 +463,31 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(500, "打开MDB结果为空"); return CreateErrorResponse(500, "打开MDB结果为空");
} }
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message;
return CreateErrorResponse(500, message); NotifyBatchTaskResult(openRequest.ExecutionId, false, message, null);
} return CreateErrorResponse(500, message);
}
return CreateSuccessResponse(result);
} NotifyBatchTaskResult(openRequest.ExecutionId, true, null, result);
catch (Exception ex) return CreateSuccessResponse(result);
{ }
return CreateErrorResponse(500, $"打开MDB失败: {ex.Message}"); catch (Exception ex)
} {
} NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, $"打开MDB失败: {ex.Message}");
private string HandleExportIfc(HttpListenerRequest request) }
{ }
try
{ private string HandleExportIfc(HttpListenerRequest request)
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) {
{ string executionId = null;
return CreateErrorResponse(405, "仅支持POST"); try
{
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
{
return CreateErrorResponse(405, "仅支持POST");
} }
var payload = ReadRequestBody(request); var payload = ReadRequestBody(request);
@ -461,17 +496,19 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(400, "请求体不能为空"); return CreateErrorResponse(400, "请求体不能为空");
} }
var serializer = new JavaScriptSerializer(); var serializer = new JavaScriptSerializer();
var exportRequest = serializer.Deserialize<ExportIfcRequest>(payload) ?? new ExportIfcRequest(); var exportRequest = serializer.Deserialize<ExportIfcRequest>(payload) ?? new ExportIfcRequest();
executionId = exportRequest.ExecutionId;
var command = new ExportIfcCommand(exportRequest); var command = new ExportIfcCommand(exportRequest);
var invokeResult = MainThreadInvoker.Invoke(command, 600000); var invokeResult = MainThreadInvoker.Invoke(command, 600000);
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message;
return CreateErrorResponse(500, msg); NotifyBatchTaskResult(exportRequest.ExecutionId, false, msg, null);
} return CreateErrorResponse(500, msg);
}
var result = invokeResult.Result as ExportIfcResult; var result = invokeResult.Result as ExportIfcResult;
if (result == null) if (result == null)
@ -479,19 +516,22 @@ namespace TellmePdmsPluging.Network
return CreateErrorResponse(500, "IFC导出结果为空"); return CreateErrorResponse(500, "IFC导出结果为空");
} }
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message;
return CreateErrorResponse(500, message); NotifyBatchTaskResult(exportRequest.ExecutionId, false, message, null);
} return CreateErrorResponse(500, message);
}
return CreateSuccessResponse(result);
} NotifyBatchTaskResult(exportRequest.ExecutionId, true, null, result);
catch (Exception ex) return CreateSuccessResponse(result);
{ }
return CreateErrorResponse(500, $"IFC导出失败: {ex.Message}"); catch (Exception ex)
} {
} NotifyBatchTaskResult(executionId, false, ex.Message, null);
return CreateErrorResponse(500, $"IFC导出失败: {ex.Message}");
}
}
private string ReadRequestBody(HttpListenerRequest request) private string ReadRequestBody(HttpListenerRequest request)
{ {
@ -620,8 +660,8 @@ namespace TellmePdmsPluging.Network
return "{" + string.Join(",", jsonParts.ToArray()) + "}"; return "{" + string.Join(",", jsonParts.ToArray()) + "}";
} }
private string SerializeModelStatusResponse(ModelStatusResponse model) private string SerializeModelStatusResponse(ModelStatusResponse model)
{ {
var parts = new List<string>(); var parts = new List<string>();
parts.Add($"\"ModelLoaded\":{model.ModelLoaded.ToString().ToLower()}"); parts.Add($"\"ModelLoaded\":{model.ModelLoaded.ToString().ToLower()}");
@ -629,8 +669,13 @@ namespace TellmePdmsPluging.Network
parts.Add($"\"ModelStatistics\":{SimpleJsonSerialize(model.ModelStatistics)}"); parts.Add($"\"ModelStatistics\":{SimpleJsonSerialize(model.ModelStatistics)}");
parts.Add($"\"SessionInfo\":{SimpleJsonSerialize(model.SessionInfo)}"); 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) private void LogMessage(string message)
{ {

View File

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