添加执行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

@ -250,6 +250,9 @@ namespace TellmePdmsPluging.Core
var result = new OpenProjectResult var result = new OpenProjectResult
{ {
ProjectName = effectiveRequest.ProjectName, ProjectName = effectiveRequest.ProjectName,
FileSize = -1,
PolygonCount = -1,
FeatureCount = -1,
CompletedAt = DateTime.Now CompletedAt = DateTime.Now
}; };
@ -280,6 +283,7 @@ namespace TellmePdmsPluging.Core
{ {
result.Success = true; result.Success = true;
result.Message = "项目已打开"; result.Message = "项目已打开";
PopulateOpenProjectMetrics(result);
return result; return result;
} }
@ -297,6 +301,10 @@ namespace TellmePdmsPluging.Core
result.Success = opened; result.Success = opened;
result.Message = opened ? "项目打开成功" : "项目打开失败Open 返回 false"; result.Message = opened ? "项目打开成功" : "项目打开失败Open 返回 false";
if (opened)
{
PopulateOpenProjectMetrics(result);
}
result.CompletedAt = DateTime.Now; result.CompletedAt = DateTime.Now;
return result; return result;
} }
@ -492,6 +500,9 @@ namespace TellmePdmsPluging.Core
MdbName = effectiveRequest.MdbName, MdbName = effectiveRequest.MdbName,
ReadOnly = effectiveRequest.ReadOnly, ReadOnly = effectiveRequest.ReadOnly,
DefaultType = effectiveRequest.DefaultType, DefaultType = effectiveRequest.DefaultType,
FileSize = -1,
PolygonCount = -1,
FeatureCount = -1,
CompletedAt = DateTime.Now CompletedAt = DateTime.Now
}; };
@ -513,6 +524,7 @@ namespace TellmePdmsPluging.Core
result.Success = true; result.Success = true;
result.WasAlreadyOpen = true; result.WasAlreadyOpen = true;
result.Message = "MDB 已经打开"; result.Message = "MDB 已经打开";
PopulateOpenMdbMetrics(result);
result.CompletedAt = DateTime.Now; result.CompletedAt = DateTime.Now;
return result; return result;
} }
@ -588,6 +600,7 @@ namespace TellmePdmsPluging.Core
result.WasAlreadyOpen = false; result.WasAlreadyOpen = false;
result.MdbName = openedMdb.Name; result.MdbName = openedMdb.Name;
result.Message = "MDB 打开成功"; result.Message = "MDB 打开成功";
PopulateOpenMdbMetrics(result);
result.CompletedAt = DateTime.Now; result.CompletedAt = DateTime.Now;
return result; return result;
} }
@ -774,7 +787,10 @@ namespace TellmePdmsPluging.Core
TotalElements = totalElements, TotalElements = totalElements,
ElementCounts = elementCounts, ElementCounts = elementCounts,
ZoneCount = zoneCount, ZoneCount = zoneCount,
ActiveZones = activeZones ActiveZones = activeZones,
FileSize = TryGetCurrentModelFileSize(),
PolygonCount = -1,
FeatureCount = totalElements
}; };
} }
} }
@ -784,7 +800,10 @@ namespace TellmePdmsPluging.Core
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,
FeatureCount = 0
}; };
} }
catch (Exception ex) catch (Exception ex)
@ -795,11 +814,116 @@ namespace TellmePdmsPluging.Core
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,
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)
{ {
try try

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

@ -25,6 +25,9 @@ namespace TellmePdmsPluging.Models
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

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

@ -13,6 +13,7 @@ namespace TellmePdmsPluging.Network
public class HttpServer : IDisposable public class HttpServer : IDisposable
{ {
private readonly HttpListener _listener; private readonly HttpListener _listener;
private readonly BatchTaskResultCallbackService _batchCallbackService;
private readonly int _port; private readonly int _port;
private bool _isRunning; private bool _isRunning;
@ -21,6 +22,10 @@ namespace TellmePdmsPluging.Network
_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()
@ -233,6 +238,7 @@ namespace TellmePdmsPluging.Network
private string HandleModelSimplify(HttpListenerRequest request) private string HandleModelSimplify(HttpListenerRequest request)
{ {
string executionId = null;
try try
{ {
var payload = ReadRequestBody(request); var payload = ReadRequestBody(request);
@ -243,6 +249,7 @@ namespace TellmePdmsPluging.Network
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;
@ -255,19 +262,23 @@ 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(simplifyRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(simplifyRequest.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 HandleModelShrinkwrap(HttpListenerRequest request) private string HandleModelShrinkwrap(HttpListenerRequest request)
{ {
string executionId = null;
try try
{ {
var payload = ReadRequestBody(request); var payload = ReadRequestBody(request);
@ -278,6 +289,7 @@ namespace TellmePdmsPluging.Network
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);
@ -285,6 +297,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(shrinkwrapRequest.ExecutionId, false, msg, null);
return CreateErrorResponse(500, msg); return CreateErrorResponse(500, msg);
} }
@ -297,19 +310,23 @@ 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(shrinkwrapRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(shrinkwrapRequest.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 HandleProjectOpen(HttpListenerRequest request) private string HandleProjectOpen(HttpListenerRequest request)
{ {
string executionId = null;
try try
{ {
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
@ -325,6 +342,7 @@ namespace TellmePdmsPluging.Network
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);
@ -332,6 +350,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(openRequest.ExecutionId, false, msg, null);
return CreateErrorResponse(500, msg); return CreateErrorResponse(500, msg);
} }
@ -344,19 +363,23 @@ 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(openRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(openRequest.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 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,19 +413,23 @@ 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)
{ {
string executionId = null;
try try
{ {
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
@ -416,6 +445,7 @@ namespace TellmePdmsPluging.Network
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);
@ -423,6 +453,7 @@ namespace TellmePdmsPluging.Network
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "打开MDB失败" : invokeResult.Message;
NotifyBatchTaskResult(openRequest.ExecutionId, false, msg, null);
return CreateErrorResponse(500, msg); return CreateErrorResponse(500, msg);
} }
@ -435,19 +466,23 @@ namespace TellmePdmsPluging.Network
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "打开MDB失败" : result.Message;
NotifyBatchTaskResult(openRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(openRequest.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, $"打开MDB失败: {ex.Message}"); return CreateErrorResponse(500, $"打开MDB失败: {ex.Message}");
} }
} }
private string HandleExportIfc(HttpListenerRequest request) private string HandleExportIfc(HttpListenerRequest request)
{ {
string executionId = null;
try try
{ {
if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase)) if (!string.Equals(request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase))
@ -463,6 +498,7 @@ namespace TellmePdmsPluging.Network
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);
@ -470,6 +506,7 @@ namespace TellmePdmsPluging.Network
if (!invokeResult.Success) if (!invokeResult.Success)
{ {
var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message; var msg = string.IsNullOrEmpty(invokeResult.Message) ? "IFC导出失败" : invokeResult.Message;
NotifyBatchTaskResult(exportRequest.ExecutionId, false, msg, null);
return CreateErrorResponse(500, msg); return CreateErrorResponse(500, msg);
} }
@ -482,13 +519,16 @@ namespace TellmePdmsPluging.Network
if (!result.Success) if (!result.Success)
{ {
var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message; var message = string.IsNullOrEmpty(result.Message) ? "IFC导出失败" : result.Message;
NotifyBatchTaskResult(exportRequest.ExecutionId, false, message, null);
return CreateErrorResponse(500, message); return CreateErrorResponse(500, message);
} }
NotifyBatchTaskResult(exportRequest.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, $"IFC导出失败: {ex.Message}"); return CreateErrorResponse(500, $"IFC导出失败: {ex.Message}");
} }
} }
@ -632,6 +672,11 @@ namespace TellmePdmsPluging.Network
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)
{ {
try try

View File

@ -98,6 +98,7 @@
<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="Network\BatchTaskResultCallbackService.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />