添加执行ID支持,改进模型统计信息,优化项目和MDB打开/关闭的回调通知
This commit is contained in:
parent
6aa9aa8456
commit
74e8ae24c2
@ -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)
|
||||
{
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
124
Network/BatchTaskResultCallbackService.cs
Normal file
124
Network/BatchTaskResultCallbackService.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user