|
|
|
@ -8,6 +8,9 @@ using Newtonsoft.Json.Linq; |
|
|
|
|
using SparkClient.Model.Entity.ApiEntity; |
|
|
|
|
using SparkClient.Model.Helper; |
|
|
|
|
using System.Configuration; |
|
|
|
|
using System.Diagnostics; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Text.RegularExpressions; |
|
|
|
|
using SparkClient.Model.Common; |
|
|
|
|
|
|
|
|
|
namespace SparkClient.Model.Services |
|
|
|
@ -24,7 +27,7 @@ namespace SparkClient.Model.Services |
|
|
|
|
|
|
|
|
|
// 添加公共方法 |
|
|
|
|
public AlgorithmResultEntity CallParseJsonAndReturnActions(string shape, string shape_mode, string image_files) |
|
|
|
|
{ |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
//半圆 |
|
|
|
@ -33,18 +36,23 @@ namespace SparkClient.Model.Services |
|
|
|
|
object halfCircleValue = circleTable.Rows[0][0]; |
|
|
|
|
bool.TryParse(halfCircleValue.ToString(), out bool boolResult); |
|
|
|
|
bool half_circle = boolResult; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//算法配置参数 |
|
|
|
|
string sql = $"SELECT JSON FROM ALGORITHM_CONFIG ORDER BY JSON_ORDER ASC"; |
|
|
|
|
DataTable table = DataBaseHelper.ExecuteQuery(sql); |
|
|
|
|
object lightLevelValue = table.Rows[0][0]; |
|
|
|
|
string algo_config = lightLevelValue.ToString() ?? throw new InvalidOperationException(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//图片根目录 |
|
|
|
|
string? image_file_base_path = ConfigurationManager.AppSettings["ImageFileBasePath"]; |
|
|
|
|
if (string.IsNullOrEmpty(image_file_base_path)) |
|
|
|
|
{ |
|
|
|
|
throw new InvalidOperationException("ImageFileBasePath is not configured in AppSettings."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 获取 log4net 日志文件所在的目录 |
|
|
|
|
string? log4NetLogDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); |
|
|
|
|
string? log4NetLogDirectory = |
|
|
|
|
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); |
|
|
|
|
// 构建C++ DLL 日志文件路径 |
|
|
|
|
string algorithm_log_path = Path.Combine(log4NetLogDirectory, "logs"); |
|
|
|
|
|
|
|
|
@ -55,51 +63,137 @@ namespace SparkClient.Model.Services |
|
|
|
|
new JProperty("image_file_base_path", image_file_base_path), |
|
|
|
|
new JProperty("image_files", JToken.Parse(image_files)), |
|
|
|
|
new JProperty("half_circle", half_circle), |
|
|
|
|
new JProperty("algorithm_log_path", algorithm_log_path), |
|
|
|
|
new JProperty("algorithm_log_path", algorithm_log_path), |
|
|
|
|
new JProperty("algo_config", JObject.Parse(algo_config)) |
|
|
|
|
); |
|
|
|
|
string jsonDataString = jsonData.ToString(); |
|
|
|
|
// 调用 C++ DLL 函数解析 JSON |
|
|
|
|
IntPtr resultPtr = DetectDiamond(jsonDataString); |
|
|
|
|
string resultJson = Marshal.PtrToStringAnsi(resultPtr); |
|
|
|
|
// 释放 DLL 分配的内存 |
|
|
|
|
FreeString(resultPtr); |
|
|
|
|
|
|
|
|
|
// 检查返回的 JSON 字符串是否为空或无效 |
|
|
|
|
if (string.IsNullOrEmpty(resultJson)) |
|
|
|
|
string jsonDataString = jsonData.ToString().Replace("\"", "\\\""); |
|
|
|
|
//string jsonDataString = jsonData.ToString(); |
|
|
|
|
// // 调用 C++ DLL 函数解析 JSON |
|
|
|
|
// IntPtr resultPtr = DetectDiamond(jsonDataString); |
|
|
|
|
// string resultJson = Marshal.PtrToStringAnsi(resultPtr); |
|
|
|
|
// // 释放 DLL 分配的内存 |
|
|
|
|
// FreeString(resultPtr); |
|
|
|
|
// // 检查返回的 JSON 字符串是否为空或无效 |
|
|
|
|
// if (string.IsNullOrEmpty(resultJson)) |
|
|
|
|
// { |
|
|
|
|
// Logger.Error("Algorithm failed or no result returned."); |
|
|
|
|
// // 返回一个默认的 AlgorithmResultEntity 对象表示解析失败 |
|
|
|
|
// return new AlgorithmResultEntity |
|
|
|
|
// { |
|
|
|
|
// facets = new List<Facet>(), |
|
|
|
|
// measurements = new Measurements() |
|
|
|
|
// }; |
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
// 启动隔离的控制台应用程序 |
|
|
|
|
var startInfo = new ProcessStartInfo |
|
|
|
|
{ |
|
|
|
|
// 返回一个默认的 AlgorithmResultEntity 对象表示解析失败 |
|
|
|
|
return new AlgorithmResultEntity |
|
|
|
|
FileName = "AlgorithmDllIsolationConsoleApp.exe", // 控制台应用程序路径 |
|
|
|
|
Arguments = $"\"{jsonDataString}\"", // 将 JSON 数据作为参数传递给控制台应用程序 |
|
|
|
|
RedirectStandardOutput = true, // 获取控制台应用程序的输出 |
|
|
|
|
RedirectStandardError = true, |
|
|
|
|
UseShellExecute = false, |
|
|
|
|
CreateNoWindow = true |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
using (var process = Process.Start(startInfo)) |
|
|
|
|
{ |
|
|
|
|
// 使用 StringBuilder 来捕获标准输出和标准错误 |
|
|
|
|
var outputBuilder = new StringBuilder(); |
|
|
|
|
var errorBuilder = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
// 订阅标准输出事件 |
|
|
|
|
process.OutputDataReceived += (sender, e) => |
|
|
|
|
{ |
|
|
|
|
facets = new List<Facet>(), |
|
|
|
|
measurements = new Measurements() |
|
|
|
|
if (e.Data == null) |
|
|
|
|
{ |
|
|
|
|
// 当 e.Data 为 null 时,表示读取完成 |
|
|
|
|
outputBuilder.AppendLine(e.Data); |
|
|
|
|
Console.WriteLine($"Output: {e.Data}"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 将输出数据追加到 outputBuilder |
|
|
|
|
outputBuilder.AppendLine(e.Data); |
|
|
|
|
// 打印输出数据到控制台 |
|
|
|
|
Console.WriteLine($"Output: {e.Data}"); |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
// 反序列化 JSON 字符串为 AlgorithmResultEntity 对象 |
|
|
|
|
var result = JsonConvert.DeserializeObject<AlgorithmResultEntity>(resultJson); |
|
|
|
|
|
|
|
|
|
// 检查反序列化结果是否为 null |
|
|
|
|
if (result == null) |
|
|
|
|
{ |
|
|
|
|
// 返回一个默认的 AlgorithmResultEntity 对象表示解析失败 |
|
|
|
|
return new AlgorithmResultEntity |
|
|
|
|
// 订阅标准错误事件 |
|
|
|
|
process.ErrorDataReceived += (sender, e) => |
|
|
|
|
{ |
|
|
|
|
facets = new List<Facet>(), |
|
|
|
|
measurements = new Measurements() |
|
|
|
|
if (e.Data == null) |
|
|
|
|
{ |
|
|
|
|
// 当 e.Data 为 null 时,表示读取完成 |
|
|
|
|
errorBuilder.AppendLine(e.Data); |
|
|
|
|
Logger.Error($"Error Output: {e.Data}"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 将错误数据追加到 errorBuilder |
|
|
|
|
errorBuilder.AppendLine(e.Data); |
|
|
|
|
// 记录错误数据到日志 |
|
|
|
|
Logger.Error($"Error Output: {e.Data}"); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// 开始异步读取 |
|
|
|
|
process.BeginOutputReadLine(); |
|
|
|
|
process.BeginErrorReadLine(); |
|
|
|
|
|
|
|
|
|
// 等待控制台应用程序结束 |
|
|
|
|
process.WaitForExit(); |
|
|
|
|
|
|
|
|
|
// 等待异步读取完成 |
|
|
|
|
//Task.WaitAll(outputTcs.Task, errorTcs.Task); |
|
|
|
|
|
|
|
|
|
// 获取结果 |
|
|
|
|
string resultJson = outputBuilder.ToString(); |
|
|
|
|
string errorOutput = errorBuilder.ToString(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果控制台应用程序有错误输出 |
|
|
|
|
if (!string.IsNullOrEmpty(errorOutput)) |
|
|
|
|
{ |
|
|
|
|
Logger.Error($"Console App Error: {errorOutput}"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 如果没有结果或失败 |
|
|
|
|
if (string.IsNullOrEmpty(resultJson)) |
|
|
|
|
{ |
|
|
|
|
Logger.Error("Algorithm failed or no result returned."); |
|
|
|
|
return new AlgorithmResultEntity |
|
|
|
|
{ |
|
|
|
|
facets = new List<Facet>(), |
|
|
|
|
measurements = new Measurements() |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 反序列化 JSON 字符串为 AlgorithmResultEntity 对象 |
|
|
|
|
var result = JsonConvert.DeserializeObject<AlgorithmResultEntity>(resultJson); |
|
|
|
|
|
|
|
|
|
// 检查反序列化结果是否为 null |
|
|
|
|
if (result == null) |
|
|
|
|
{ |
|
|
|
|
// 返回一个默认的 AlgorithmResultEntity 对象表示解析失败 |
|
|
|
|
return new AlgorithmResultEntity |
|
|
|
|
{ |
|
|
|
|
facets = new List<Facet>(), |
|
|
|
|
measurements = new Measurements() |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 记录算法失败的状态 |
|
|
|
|
Logger.Info($"Algorithm failed with status: {result.status}"); |
|
|
|
|
// 记录算法失败的错误信息 |
|
|
|
|
Logger.Info($"Algorithm failed with errorMsg: {result.error_msg}"); |
|
|
|
|
// 处理 C++ DLL 日志文件 |
|
|
|
|
//ProcessDllLog(); |
|
|
|
|
// 算法调用失败时,保存图片到历史记录文件夹 |
|
|
|
|
// if (result.status == StatusCodes.AlgorithmFailed) |
|
|
|
|
// { |
|
|
|
|
// HandleAlgorithmFailure(image_files); |
|
|
|
|
// } |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
// 记录算法失败的状态 |
|
|
|
|
Logger.Error($"Algorithm failed with status: {result.status}"); |
|
|
|
|
// 记录算法失败的错误信息 |
|
|
|
|
Logger.Error($"Algorithm failed with errorMsg: {result.error_msg}"); |
|
|
|
|
// 处理 C++ DLL 日志文件 |
|
|
|
|
//ProcessDllLog(); |
|
|
|
|
// 算法调用失败时,保存图片到历史记录文件夹 |
|
|
|
|
// if (result.status == StatusCodes.AlgorithmFailed) |
|
|
|
|
// { |
|
|
|
|
// HandleAlgorithmFailure(image_files); |
|
|
|
|
// } |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) |
|
|
|
|
{ |
|
|
|
@ -112,6 +206,7 @@ namespace SparkClient.Model.Services |
|
|
|
|
Logger.Error($"Inner Exception: {ex.InnerException.Message}"); |
|
|
|
|
Logger.Error($"Inner Stack Trace: {ex.InnerException.StackTrace}"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 返回一个默认的 AlgorithmResultEntity 对象表示解析失败 |
|
|
|
|
return new AlgorithmResultEntity |
|
|
|
|
{ |
|
|
|
|