using WingServerCommon.Service;
using WingInterfaceLibrary.Interface;
using WingInterfaceLibrary.Request.RemedicalAISelected;
using System.Threading.Tasks;
using System.Linq;
// using WingServerCommon.Log;
using System.IO;
using System;
using System.Net.Http;
using System.Net;
using System.Collections.Generic;
using WingInterfaceLibrary.Request.Examine;
using Vinno.IUS.Common.Media.FFmpeg.Video;
using Vinno.IUS.Common.Media.FFmpeg.Video.Codecs;
using SkiaSharp;
using Vinno.IUS.Common.Media.FFmpeg.Settings;
using System.Diagnostics;
using Logger = WingServerCommon.Log.Logger;
using System.Text;
using Newtonsoft.Json;
using WingAIDiagnosisService.URMManage;
namespace WingAIDiagnosisService.Service
{
///
/// URM分析服务
///
public partial class AIDiagnosisService : JsonRpcService, IAIDiagnosisService
{
private readonly string _urmTempFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "URMTemp");
///
/// URM分析
///
/// URM分析请求实体
/// URM分析分析结果
///
///
public async Task URMAnalysisAsync(URMAnalysisRequest request)
{
return null;
}
///
/// URM分析V2
///
/// URM分析V2请求实体
/// URM分析分析结果V2
///
///
public async Task URMAnalysisV2Async(URMAnalysisV2Request request)
{
DeleteExpiredFolders(DateTime.Now.AddDays(-1));
var remedicalCode = request.RemedicalCode;
var customizedStartFrame = request.CustomizedStartFrame != null ? request.CustomizedStartFrame.ToString() : string.Empty;
var customizedEndFrame = request.CustomizedEndFrame != null ? request.CustomizedEndFrame.ToString() : string.Empty;
var pos = $"{request.X},{request.Y},{request.Width},{request.Height},{customizedStartFrame},{customizedEndFrame}";
Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async start, remedicalCode:{remedicalCode}, Pos:{pos}");
var currentFolder = string.Empty;
var resultData = new URMAnalysisV2Result { URMAnalysisDetails = new List() };
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == 0);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
var converImageUrl = remedical?.TerminalImages?.CoverImageUrl;
if (!string.IsNullOrWhiteSpace(fileToken) && !string.IsNullOrWhiteSpace(converImageUrl))
{
Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async, remedicalCode:{remedicalCode}, fileToken:{fileToken}, converImageUrl:{converImageUrl}");
currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialName = Path.GetFileName(fileToken);
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
var converName = Path.GetFileName(converImageUrl);
var converFile = Path.Combine(currentFolder, converName);
if (!File.Exists(converFile))
{
await DownloadToLocalAsync(converImageUrl, converFile);
}
DeleteTempFiles(currentFolder, new List { origialFile, converFile });
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var urmParamers = remedical.UrmParameters;
if (urmParamers != null && urmParamers.Any())
{
Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async URMAnalysisProcess start, remedicalCode:{remedicalCode}");
urmParamers.TryAdd("startX", request.X.ToString());
urmParamers.TryAdd("startY", request.Y.ToString());
urmParamers.TryAdd("width", request.Width.ToString());
urmParamers.TryAdd("height", request.Height.ToString());
urmParamers.TryAdd("CustomizedStartFrame", request.CustomizedStartFrame == null ? "" : request.CustomizedStartFrame.ToString());
urmParamers.TryAdd("CustomizedEndFrame", request.CustomizedEndFrame == null ? "" : request.CustomizedEndFrame.ToString());
urmParamers.TryAdd("RoiXPercent", request.RoiXPercent.ToString());
urmParamers.TryAdd("RoiYPercent", request.RoiYPercent.ToString());
urmParamers.TryAdd("RoiWPercent", request.RoiWPercent.ToString());
urmParamers.TryAdd("RoiHPercent", request.RoiHPercent.ToString());
// 开始URM分析
var result = DoURMAnalysisV2(remedicalCode, origialFile, converFile, currentFolder, urmParamers);
if (result != null)
{
resultData.IsSuccess = true;
resultData.UrmPosition = pos;
resultData.URMSrcWidth = result.URMSrcWidth;
resultData.URMSrcHeight = result.URMSrcHeight;
resultData.URMRes = result.URMRes;
await InitURMAnalysisDetails(resultData, fileToken, currentFolder, origialRemedicalInfo, result.ConverImageUrl);
}
}
}
else
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisV2Async failed, remedicalCode:{remedicalCode}, origialFile not existed");
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisV2Async error, remedicalCode:{remedicalCode}, ex:{ex}");
}
finally
{
try
{
// if (Directory.Exists(currentFolder))
// {
// Directory.Delete(currentFolder, true);
// }
}
catch { }
}
Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async finished, remedicalCode:{remedicalCode}, result:{resultData.IsSuccess}");
return resultData;
}
///
/// 测量项SRCurvature计算
///
///
///
public async Task GetSRCurvatureAsync(GetSRCurvatureRequest request)
{
DeleteExpiredFolders(DateTime.Now.AddHours(-6));
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRCurvatureAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRCurvatureAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY}";
var result = DoURMeasure("GetSRCurvature", remedicalCode, arguments);
return result;
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRCurvatureAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRRoiDensity计算
///
///
/// ///
public async Task GetSRRoiVelAsync(GetSRRoiVelRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiVelAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiVelAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY}";
var output = DoURMeasure("GetSRRoiVel", remedicalCode, arguments);
return new GetSRRoiVelResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRRoiVelAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRRoiFractalDim计算
///
///
///
public async Task GetSRRoiFractalDimAsync(GetSRRoiFractalDimRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiFractalDimAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiFractalDimAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY}";
var output = DoURMeasure("GetSRRoiFractalDim", remedicalCode, arguments);
return new GetSRRoiFractalDimResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRRoiFractalDimAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRRoiDensity Trace计算
///
///
///
public async Task GetSRTraceVelAsync(GetSRTraceVelRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRTraceVelAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
var inputPointPath = Path.Combine(currentFolder, $"{Guid.NewGuid():N}.txt");
File.WriteAllText(inputPointPath, JsonConvert.SerializeObject(request.InputPoints ?? new List()));
Logger.WriteLineInfo($"AIDiagnosisService GetSRTraceVelAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {inputPointPath}";
var output = DoURMeasure("GetSRTraceVel", remedicalCode, arguments);
return new GetSRTraceVelResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRTraceVelAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRTraceFD计算
///
///
///
public async Task GetSRTraceFractalDimAsync(GetSRTraceFractalDimRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRTraceFractalDimAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
var inputPointPath = Path.Combine(currentFolder, $"{Guid.NewGuid():N}.txt");
File.WriteAllText(inputPointPath, JsonConvert.SerializeObject(request.InputPoints ?? new List()));
Logger.WriteLineInfo($"AIDiagnosisService GetSRTraceFractalDimAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {inputPointPath}";
var output = DoURMeasure("GetSRTraceFractalDim", remedicalCode, arguments);
return new GetSRTraceFractalDimResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRTraceFractalDimAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRLoactionVel计算
///
///
///
public async Task GetSRLoactionVelAsync(GetSRLoactionVelRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRLoactionVelAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRLoactionVelAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY}";
var output = DoURMeasure("GetSRLoactionVel", remedicalCode, arguments);
return new GetSRLoactionVelResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRLoactionVelAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项SRRoiVel计算
///
///
///
public async Task GetSRRoiSpeedAsync(GetSRRoiSpeedRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiSpeedAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetSRRoiSpeedAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY}";
var output = DoURMeasure("GetSRRoiSpeed", remedicalCode, arguments);
return new GetSRRoiSpeedResult
{
Output = output,
};
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetSRRoiSpeedAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项URMDensityMeasure计算
///
///
///
public async Task GetURMDenMeasureAsync(GetURMDenMeasureRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetURMDenMeasureAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetURMDenMeasureAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY} {request.AreaScaler}";
var output = DoURMeasure("GetURMDenMeasureResult", remedicalCode, arguments);
return output;
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetURMDenMeasureAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项URMVelMeasure计算
///
///
///
public async Task GetURMVelMeasureAsync(GetURMVelMeasureRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetURMVelMeasureAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetURMVelMeasureAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY} {request.AreaScaler}";
var output = DoURMeasure("GetURMVelMeasureResult", remedicalCode, arguments);
return output;
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetURMVelMeasureAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// 测量项URMVessMeasure计算
///
///
///
public async Task GetUrmVessMeasureAsync(GetUrmVessMeasureRequest request)
{
var remedicalCode = request.RemedicalCode;
try
{
if (!string.IsNullOrWhiteSpace(remedicalCode))
{
var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == request.MeasureMode);
var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
if (!string.IsNullOrWhiteSpace(fileToken))
{
Logger.WriteLineInfo($"AIDiagnosisService GetUrmVessMeasureAsync, remedicalCode:{remedicalCode}, fileToken:{fileToken}");
var origialName = Path.GetFileName(fileToken);
var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
if (!Directory.Exists(currentFolder))
{
Directory.CreateDirectory(currentFolder);
}
var origialFile = Path.Combine(currentFolder, origialName);
if (!File.Exists(origialFile))
{
await DownloadToLocalAsync(fileToken, origialFile);
}
if (File.Exists(origialFile))
{
Logger.WriteLineInfo($"AIDiagnosisService GetUrmVessMeasureAsync download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
var arguments = $"{currentFolder} {origialFile} {request.DataWidth} {request.DataHeight} {request.StartPointX} {request.StartPointY} {request.EndPointX} {request.EndPointY} {request.AreaScaler} {request.CmLength}";
var output = DoURMeasure("GetUrmVessMeasureResult", remedicalCode, arguments);
return output;
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService GetUrmVessMeasureAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return null;
}
///
/// Converter Report
///
/// ReportConverter.exe param
private bool DoURMAnalysis(string origialFile, string pos, string outputFolder, Dictionary urmParamers)
{
try
{
// var urmFolder2 = $"\"UrmDatapath\":\"{origialFile}\",\"VecLens\":\"{GetValue(urmParamers, "VecLens")}\",\"Mlas\":\"{GetValue(urmParamers, "Mlas")}\",\"VectorStartForMid\":\"{GetValue(urmParamers, "VectorStartForMid")}\",\"FramesGot\":\"{GetValue(urmParamers, "FramesGot")}\",\"CenterFrequencyMHz\":\"{GetValue(urmParamers, "CenterFrequencyMHz")}\",\"Prf\":\"{GetValue(urmParamers, "Prf")}\",\"Angles\":\"{GetValue(urmParamers, "Angles")}\",\"SupersonicSpeed\":\"{GetValue(urmParamers, "SupersonicSpeed")}\",\"PulseNum\":\"{GetValue(urmParamers, "VectorStartForMid")}\",\"FrequencyMin\":\"{GetValue(urmParamers, "FrequencyMin")}\",\"FMUint\":\"{GetValue(urmParamers, "FMUint")}\",\"FrameRateDisplay\":\"{GetValue(urmParamers, "FrameRateDisplay")}\",\"FDUnit\":\"{GetValue(urmParamers, "FDUnit")}\",\"ScaleOfPixel_x\":\"{GetValue(urmParamers, "ScaleOfPixel_x")}\",\"ScaleOfPixel_y\":\"{GetValue(urmParamers, "ScaleOfPixel_y")}\",\"ULMCount\":\"{GetValue(urmParamers, "ULMCount")}\",\"PacketsNum\":\"{GetValue(urmParamers, "PacketsNum")}\",\"Res\":\"{GetValue(urmParamers, "Res")}\",\"MaxLinkingDistance\":\"{GetValue(urmParamers, "MaxLinkingDistance")}\",\"MinLength\":\"{GetValue(urmParamers, "MinLength")}\",\"MaxGapClosing\":\"{GetValue(urmParamers, "MaxGapClosing")}\",\"LocMethod\":\"{GetValue(urmParamers, "LocMethod")}\",\"ButterCuttofFreqLow\":\"{GetValue(urmParamers, "ButterCuttofFreqLow")}\",\"NLocalMax\":\"{GetValue(urmParamers, "NLocalMax")}\",\"SVDCutoffLow\":\"{GetValue(urmParamers, "SVDCutoffLow")}\",\"Fwhm\":\"{GetValue(urmParamers, "Fwhm")}\",\"MOCOYN\":\"{GetValue(urmParamers, "MOCOYN")}\",\"MOCOLevel\":\"{GetValue(urmParamers, "MOCOLevel")}\",\"MOCOThresh1\":\"{GetValue(urmParamers, "MOCOThresh1")}\",\"MOCOThresh2\":\"{GetValue(urmParamers, "MOCOThresh2")}\",\"MOCOThresh3\":\"{GetValue(urmParamers, "MOCOThresh3")}\",\"LocaFixmethod\":\"{GetValue(urmParamers, "LocaFixmethod")}\",\"LocFixThresh\":\"{GetValue(urmParamers, "LocFixThresh")}\",\"RefNum\":\"{GetValue(urmParamers, "RefNum")}\",\"MotionCorrThresh\":\"{GetValue(urmParamers, "MotionCorrThresh")}\",\"Pos\":\" {pos} \",\"FilterDeci\":\"{GetValue(urmParamers, "FilterDeci")}\",\"PSFNum\":\"{GetValue(urmParamers, "PSFNum")}\",\"PSFCorr\":\"{GetValue(urmParamers, "PSFCorr")}\",\"Depth\":\"{GetValue(urmParamers, "Depth")}\",\"X0\":\"{GetValue(urmParamers, "X0")}\",\"Z0\":\"{GetValue(urmParamers, "Z0")}\",\"ProbeType\":\"{GetValue(urmParamers, "ProbeType")}\",\"Decifactorx\":\"{GetValue(urmParamers, "Decifactorx")}\",\"Decifactory\":\"{GetValue(urmParamers, "Decifactory")}\",\"SizeScan\":\"{GetValue(urmParamers, "SizeScan")}\",\"MotionAngleThresh\":\"{GetValue(urmParamers, "MotionAngleThresh")}\",\"TrackInterpFactor\":\"{GetValue(urmParamers, "TrackInterpFactor")}\"";
StringBuilder urmFolder = new StringBuilder();
urmFolder.Append($"\"{origialFile}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "VecLens")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Mlas")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "VectorStartForMid")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FramesGot")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "CenterFrequencyMHz")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Prf")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Angles")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "SupersonicSpeed")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "PulseNum")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FrequencyMin")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FMUint")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FrameRateDisplay")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FDUnit")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "ScaleOfPixel_x")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "ScaleOfPixel_y")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "ULMCount")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "PacketsNum")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Res")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MaxLinkingDistance")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MinLength")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MaxGapClosing")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "LocMethod")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "ButterCuttofFreqLow")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "NLocalMax")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "SVDCutoffLow")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Fwhm")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MOCOYN")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MOCOLevel")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MOCOThresh1")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MOCOThresh2")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MOCOThresh3")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "LocaFixmethod")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "LocFixThresh")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "RefNum")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MotionCorrThresh")}\";");
urmFolder.Append($"\"{pos}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "FilterDeci")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "PSFNum")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "PSFCorr")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Depth")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "X0")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Z0")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "ProbeType")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Decifactorx")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "Decifactory")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "SizeScan")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "MotionAngleThresh")}\";");
urmFolder.Append($"\"{GetValue(urmParamers, "TrackInterpFactor")}\"");
var arguments = $"URMAnalysis {outputFolder} {urmFolder.ToString()}";
var exeFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "URM");
var exePath = Path.Combine(exeFolder, "URMAnalysis.exe");
var psi = new ProcessStartInfo(exePath, arguments)
{
Verb = "runas",
RedirectStandardOutput = true,
UseShellExecute = false,
};
using (var process = Process.Start(psi))
{
if (process != null)
{
// string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
}
return true;
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService DoURMAnalysis error, ex:{ex}");
}
return false;
}
private URMAnalysisV2Result DoURMAnalysisV2(string remedicalCode, string origialFile, string converFile, string outputFolder, Dictionary urmParamers)
{
try
{
StringBuilder arguments = new StringBuilder();
arguments.Append($"URMAnalysis ");
arguments.Append($"{outputFolder} ");
arguments.Append($"{converFile} ");
arguments.Append($"{origialFile};");
arguments.Append($"{GetValue(urmParamers, "familyName")};");
arguments.Append($"{GetValue(urmParamers, "typeInfo")};");
arguments.Append($"{GetValue(urmParamers, "nativeId")};");
arguments.Append($"{GetValue(urmParamers, "VecLens")};");
arguments.Append($"{GetValue(urmParamers, "Mlas")};");
arguments.Append($"{GetValue(urmParamers, "FramesGot")};");
arguments.Append($"{GetValue(urmParamers, "CenterFrequencyMhz")};");
arguments.Append($"{GetValue(urmParamers, "SupersonicSpeed")};");
arguments.Append($"{GetValue(urmParamers, "FrequencyMin")};");
arguments.Append($"{GetValue(urmParamers, "FrameRateDisplay")};");
arguments.Append($"{GetValue(urmParamers, "Depth")};");
arguments.Append($"{GetValue(urmParamers, "X0")};");
arguments.Append($"{GetValue(urmParamers, "Z0")};");
arguments.Append($"{GetValue(urmParamers, "ProbeType")};");
arguments.Append($"{GetValue(urmParamers, "ScaleOfPixel_x")};");
arguments.Append($"{GetValue(urmParamers, "ScaleOfPixel_y")};");
arguments.Append($"{GetValue(urmParamers, "section")};");
arguments.Append($"{GetValue(urmParamers, "MOCOYN")};");
arguments.Append($"{GetValue(urmParamers, "MidProc_DeciFactor")};");
arguments.Append($"{GetValue(urmParamers, "VectorStartForMid")};");
arguments.Append($"{GetValue(urmParamers, "isliner")};");
arguments.Append($"{GetValue(urmParamers, "startX")};");
arguments.Append($"{GetValue(urmParamers, "startY")};");
arguments.Append($"{GetValue(urmParamers, "width")};");
arguments.Append($"{GetValue(urmParamers, "height")};");
arguments.Append($"{GetValue(urmParamers, "CustomizedStartFrame")};");
arguments.Append($"{GetValue(urmParamers, "CustomizedEndFrame")};");
arguments.Append($"{GetValue(urmParamers, "RoiXPercent")};");
arguments.Append($"{GetValue(urmParamers, "RoiYPercent")};");
arguments.Append($"{GetValue(urmParamers, "RoiWPercent")};");
arguments.Append($"{GetValue(urmParamers, "RoiHPercent")};");
return new URMAnalysisManager().DoURMAnalysis(arguments.ToString().Split(" "));
// var exeFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "URM", "net6.0");
// // exeFolder = Path.Combine(@"D:\WingProjects\URMDemo\URMAnalysis\bin\Debug\net6.0");
// var exePath = Path.Combine(exeFolder, "URMAnalysis.exe");
// var psi = new ProcessStartInfo(exePath, arguments.ToString())
// {
// Verb = "runas",
// RedirectStandardOutput = true,
// UseShellExecute = false,
// };
// using (var process = Process.Start(psi))
// {
// if (process != null)
// {
// process.WaitForExit();
// }
// }
// var urmResultFile = Path.Combine(outputFolder, "urmResult.txt");
// if (File.Exists(urmResultFile))
// {
// var output = File.ReadAllText(urmResultFile);
// if (!string.IsNullOrWhiteSpace(output))
// {
// return JsonConvert.DeserializeObject(output);
// }
// }
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService DoURMAnalysisV2 error, remedicalCode:{remedicalCode}, ex:{ex}");
}
return default;
}
private TResult DoURMeasure(string measureType, string remedicalCode, string arguments)
{
try
{
arguments = measureType + " " + arguments;
var exeFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "URM");
var exePath = Path.Combine(exeFolder, "URMAnalysis.exe");
var psi = new ProcessStartInfo(exePath, arguments)
{
Verb = "runas",
RedirectStandardOutput = true,
UseShellExecute = false,
};
var output = string.Empty;
using (var process = Process.Start(psi))
{
if (process != null)
{
output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
}
return JsonConvert.DeserializeObject(output);
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService DoURMeasure error, remedicalCode:{remedicalCode}, measureType:{measureType}, ex:{ex}");
}
return default;
}
private string GetValue(Dictionary urmParamers, string key)
{
if (urmParamers.ContainsKey(key))
{
var value = urmParamers[key];
return string.IsNullOrWhiteSpace(value) ? "0" : value;
}
return "0";
}
private async Task InitURMAnalysisDetails(URMAnalysisV2Result resultData, string originalUrl, string currentFolder, ImgItem originalRemedicalInfo, string converImagePath)
{
var orginal = new ImgItem
{
ImgType = 0,
FileToken = originalUrl,
FileSize = originalRemedicalInfo.FileSize,
CoverImgUrl = originalRemedicalInfo.CoverImgUrl,
PreviewFileUrl = originalRemedicalInfo.PreviewFileUrl,
};
if (File.Exists(converImagePath))
{
var fileName = Path.GetFileName(converImagePath);
var fileInfo = await UploadFileWithSizeAsync(converImagePath, fileName);
orginal.CoverImgUrl = fileInfo.Item1;
orginal.PreviewFileUrl = fileInfo.Item1;
}
resultData.URMAnalysisDetails.Add(orginal);
var files = Directory.GetFiles(currentFolder);
foreach (var file in files)
{
var fileName = Path.GetFileName(file);
if (fileName.Contains(".bin"))
{
var imgType = 0;
if (fileName.Contains("srcDenArray.bin"))
{
imgType = 10;
}
else if (fileName.Contains("srcDirArray.bin"))
{
imgType = 11;
}
else if (fileName.Contains("srcVelArray.bin"))
{
imgType = 12;
}
else if (fileName.Contains("srcAngleArray.bin"))
{
imgType = 13;
}
else if (fileName.Contains("srcMaskArray.bin"))
{
imgType = 14;
}
else if (fileName.Contains("URMPoints.bin"))
{
imgType = 15;
}
else if (fileName.Contains("URMPointNums.bin"))
{
imgType = 16;
}
else
{
continue;
}
var fileInfo = await UploadFileWithSizeAsync(file, fileName);
resultData.URMAnalysisDetails.Add(new ImgItem
{
ImgType = imgType,
FileToken = fileInfo.Item1,
FileSize = fileInfo.Item2,
});
}
}
}
private async Task InitURMVideo(URMAnalysisResult resultData, string currentFolder)
{
var mp4FileInfos = ImagesToMP4(currentFolder);
await Task.Delay(1000 * 5);
if (!string.IsNullOrWhiteSpace(mp4FileInfos.Item1))
{
if (File.Exists(mp4FileInfos.Item1))
{
var converImageUrl = await UploadFileAsync(mp4FileInfos.Item1, Path.GetFileName(mp4FileInfos.Item1));
if (File.Exists(mp4FileInfos.Item2))
{
var mp4ImgItem = new ImgItem
{
ImgType = 4,
CoverImgUrl = converImageUrl,
PreviewFileUrl = converImageUrl,
};
var mp4Path = mp4FileInfos.Item2;
var mp4Info = await UploadFileWithSizeAsync(mp4Path, Path.GetFileName(mp4Path));
mp4ImgItem.FileToken = mp4Info.Item1;
mp4ImgItem.FileSize = mp4Info.Item2;
resultData.URMAnalysisDetails.Add(mp4ImgItem);
}
}
}
}
private Tuple GetRatioByName(string fileName)
{
try
{
if (fileName.Contains("_"))
{
var index = fileName.LastIndexOf("_");
var value = fileName.Substring(index + 1).Replace(".png", "");
if (value.Contains("x"))
{
var infos = value.Split("x");
if (int.TryParse(infos[0], out int width) && int.TryParse(infos[1], out int height))
{
return new Tuple(width, height);
}
}
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisAsync GetRatioByName ex:{ex}");
}
return new Tuple(0, 0);
}
private Tuple ImagesToMP4(string currentFolder)
{
try
{
var files = Directory.GetFiles(Path.Combine(currentFolder, "avi"))?.OrderBy(x =>
{
var start = x.IndexOf("avi_") + 4;
var end = x.IndexOf("_output");
if (!int.TryParse(x.Substring(start, end - start), out int index))
{
index = 0;
}
return index;
});
if (files?.Any() ?? false)
{
var mp4Path = Path.Combine(currentFolder, $"{Guid.NewGuid()}.mp4");
var firstFile = files.FirstOrDefault();
var width = 0;
var height = 0;
using (SKBitmap bitmap = SKBitmap.Decode(firstFile))
{
width = bitmap.Width;
height = bitmap.Height;
}
var frameRate = 30;
var setting = new FFmpegSettings();
var writeArgs = new FFmpegVideoWriterArgs(mp4Path, width, height)
{
FrameRate = frameRate,
VideoCodec = FFmpegVideoCodec.X264
};
using (var videoWriter = new FFmpegVideoWriter(writeArgs, setting, null))
{
foreach (var avi in files)
{
using (SKBitmap bitmap = SKBitmap.Decode(avi))
{
if (bitmap != null)
{
try
{
if (bitmap.Bytes != null && bitmap.Bytes.Length > 0 && bitmap.Width > 0 && bitmap.Height > 0)
{
var frame = new BitmapFrame(bitmap.Width, bitmap.Height, bitmap.Bytes);
videoWriter.WriteFrame(frame);
}
}
catch (Exception exception)
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisAsync ImagesToMP4 WriteFrame ex:{exception}");
}
}
}
}
}
return new Tuple(firstFile, mp4Path);
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisAsync ImagesToMP4 ex:{ex}");
}
return new Tuple("", "");
}
private async Task DownloadToLocalAsync(string fileUrl, string localFile)
{
try
{
if (fileUrl.Contains("FlyinsonoStorage"))
{
// 自建存储
var infos = fileUrl.Split("FlyinsonoStorage");
var sourceFilePath = Path.Combine(_storageDirectory, infos[1].Trim('/'));
if (File.Exists(sourceFilePath))
{
File.Copy(sourceFilePath, localFile);
return true;
}
}
long fileSize = 0;
using (var request = new HttpRequestMessage())
{
request.RequestUri = new Uri(fileUrl);
request.Method = HttpMethod.Get;
var response = await _httpClient.SendAsync(request);
if (response != null && response.StatusCode == HttpStatusCode.OK)
{
var contentLength = response.Content.Headers.ContentLength;
fileSize = contentLength == null ? 0 : contentLength.Value;
}
}
if (fileSize > 0)
{
byte[] bytes = await _httpClient.GetByteArrayAsync(fileUrl);
File.WriteAllBytes(localFile, bytes);
return true;
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisAsync, fileToken:{fileUrl}, ex:{ex}");
}
return false;
}
private void DeleteExpiredFolders(DateTime time)
{
if (Directory.Exists(_urmTempFolder))
{
DirectoryInfo theFolder = new DirectoryInfo(_urmTempFolder);
DirectoryInfo[] dics = theFolder.GetDirectories();
foreach (var item in dics)
{
if (item.CreationTime < time)
{
Directory.Delete(item.FullName, true);
}
}
}
}
private void DeleteTempFiles(string currentFolder, List expectFiles)
{
try
{
var files = Directory.GetFiles(currentFolder);
if (files?.Any() ?? false)
{
foreach (var file in files)
{
if (expectFiles == null || !expectFiles.Any(x => x == file))
{
File.Delete(file);
}
}
}
var aviFolder = Path.Combine(currentFolder, "avi");
if (Directory.Exists(aviFolder))
{
Directory.Delete(aviFolder, true);
}
}
catch (Exception ex)
{
Logger.WriteLineWarn($"AIDiagnosisService DeleteTempFiles failed, currentFolder:{currentFolder}, ex:{ex}");
}
}
}
}