AIDiagnosisService.URM.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. using WingServerCommon.Service;
  2. using WingInterfaceLibrary.Interface;
  3. using WingInterfaceLibrary.Request.RemedicalAISelected;
  4. using System.Threading.Tasks;
  5. using System.Linq;
  6. // using WingServerCommon.Log;
  7. using System.IO;
  8. using System;
  9. using System.Net.Http;
  10. using System.Net;
  11. using System.Collections.Generic;
  12. using WingInterfaceLibrary.Request.Examine;
  13. using Vinno.IUS.Common.Media.FFmpeg.Video;
  14. using Vinno.IUS.Common.Media.FFmpeg.Video.Codecs;
  15. using SkiaSharp;
  16. using Vinno.IUS.Common.Media.FFmpeg.Settings;
  17. using System.Diagnostics;
  18. using Logger = WingServerCommon.Log.Logger;
  19. using System.Text;
  20. using Newtonsoft.Json;
  21. using WingAIDiagnosisService.URMManage;
  22. using WingInterfaceLibrary.Result.Record;
  23. using Vinno.DataTypes;
  24. using WingInterfaceLibrary.DTO.Record;
  25. using static WingAIDiagnosisService.URMManage.UrmProcessRequest;
  26. namespace WingAIDiagnosisService.Service
  27. {
  28. /// <summary>
  29. /// URM分析服务
  30. /// </summary>
  31. public partial class AIDiagnosisService : JsonRpcService, IAIDiagnosisService
  32. {
  33. private readonly string _urmTempFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "URMTemp");
  34. private URMAnalysisManager _urmAnalysisManager;
  35. private URMAnalysisManager URMAnalysisManager
  36. {
  37. get
  38. {
  39. if (_urmAnalysisManager == null)
  40. {
  41. _urmAnalysisManager = new URMAnalysisManager();
  42. }
  43. return _urmAnalysisManager;
  44. }
  45. }
  46. /// <summary>
  47. /// URM分析
  48. /// </summary>
  49. /// <param name="request">URM分析请求实体</param>
  50. /// <returns>URM分析分析结果</returns>
  51. /// <value></value>
  52. /// <errorCodes></errorCodes>
  53. public async Task<URMAnalysisResult> URMAnalysisAsync(URMAnalysisRequest request)
  54. {
  55. return null;
  56. }
  57. /// <summary>
  58. /// URM分析V2
  59. /// </summary>
  60. /// <param name="request">URM分析V2请求实体</param>
  61. /// <returns>URM分析分析结果V2</returns>
  62. /// <value></value>
  63. /// <errorCodes></errorCodes>
  64. public async Task<URMAnalysisV2Result> URMAnalysisV2Async(URMAnalysisV2Request request)
  65. {
  66. DeleteExpiredFolders(DateTime.Now.AddDays(-1));
  67. var remedicalCode = request.RemedicalCode;
  68. var customizedStartFrame = request.CustomizedStartFrame != null ? request.CustomizedStartFrame.ToString() : string.Empty;
  69. var customizedEndFrame = request.CustomizedEndFrame != null ? request.CustomizedEndFrame.ToString() : string.Empty;
  70. var x = (int)request.X;
  71. var y = (int)request.Y;
  72. var width = (int)request.Width;
  73. var height = (int)request.Height;
  74. var pos = $"{x},{y},{width},{height},{customizedStartFrame},{customizedEndFrame}";
  75. Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async start, remedicalCode:{remedicalCode}, Pos:{pos}");
  76. var currentFolder = string.Empty;
  77. var resultData = new URMAnalysisV2Result { URMAnalysisDetails = new List<ImgItem>() };
  78. try
  79. {
  80. if (!string.IsNullOrWhiteSpace(remedicalCode))
  81. {
  82. var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
  83. var origialRemedicalInfo = remedical?.ImgList?.FirstOrDefault(x => x.ImgType == 0);
  84. var fileToken = origialRemedicalInfo?.FileToken ?? string.Empty;
  85. var converImageUrl = remedical?.TerminalImages?.CoverImageUrl;
  86. if (!string.IsNullOrWhiteSpace(fileToken) && !string.IsNullOrWhiteSpace(converImageUrl))
  87. {
  88. Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async, remedicalCode:{remedicalCode}, fileToken:{fileToken}, converImageUrl:{converImageUrl}");
  89. currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
  90. if (!Directory.Exists(currentFolder))
  91. {
  92. Directory.CreateDirectory(currentFolder);
  93. }
  94. var origialName = Path.GetFileName(fileToken);
  95. var origialFile = Path.Combine(currentFolder, origialName);
  96. if (!File.Exists(origialFile))
  97. {
  98. await DownloadToLocalAsync(fileToken, origialFile);
  99. }
  100. var converName = Path.GetFileName(converImageUrl);
  101. var converFile = Path.Combine(currentFolder, converName);
  102. if (!File.Exists(converFile))
  103. {
  104. await DownloadToLocalAsync(converImageUrl, converFile);
  105. }
  106. DeleteTempFiles(currentFolder, new List<string> { origialFile, converFile });
  107. if (File.Exists(origialFile))
  108. {
  109. Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async download success, remedicalCode:{remedicalCode}, fileToken:{fileToken}, localFile:{origialFile}");
  110. var urmParamers = remedical.UrmParameters;
  111. if (urmParamers != null && urmParamers.Any())
  112. {
  113. Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async URMAnalysisProcess start, remedicalCode:{remedicalCode}");
  114. urmParamers.TryAdd("startX", x.ToString());
  115. urmParamers.TryAdd("startY", y.ToString());
  116. urmParamers.TryAdd("width", width.ToString());
  117. urmParamers.TryAdd("height", height.ToString());
  118. urmParamers.TryAdd("CustomizedStartFrame", request.CustomizedStartFrame == null ? "" : request.CustomizedStartFrame.ToString());
  119. urmParamers.TryAdd("CustomizedEndFrame", request.CustomizedEndFrame == null ? "" : request.CustomizedEndFrame.ToString());
  120. urmParamers.TryAdd("RoiXPercent", request.RoiXPercent.ToString());
  121. urmParamers.TryAdd("RoiYPercent", request.RoiYPercent.ToString());
  122. urmParamers.TryAdd("RoiWPercent", request.RoiWPercent.ToString());
  123. urmParamers.TryAdd("RoiHPercent", request.RoiHPercent.ToString());
  124. foreach (var k in urmParamers.Keys)
  125. {
  126. if (k.ToLower() == "section")
  127. {
  128. var section = urmParamers[k];
  129. if (!string.IsNullOrWhiteSpace(section) && !section.Contains("URMAnalysisParam:Level"))
  130. {
  131. urmParamers[k] = $"URMAnalysisParam:Level{section}";
  132. }
  133. }
  134. }
  135. // 开始URM分析
  136. var result = DoURMAnalysisV2(remedicalCode, origialFile, converFile, currentFolder, urmParamers);
  137. if (result != null)
  138. {
  139. resultData.IsSuccess = true;
  140. resultData.UrmPosition = pos;
  141. resultData.URMSrcWidth = result.URMSrcWidth;
  142. resultData.URMSrcHeight = result.URMSrcHeight;
  143. resultData.URMRes = result.URMRes;
  144. await InitURMAnalysisDetails(resultData, fileToken, currentFolder, origialRemedicalInfo, result.ConverImageUrl);
  145. }
  146. }
  147. }
  148. else
  149. {
  150. Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisV2Async failed, remedicalCode:{remedicalCode}, origialFile not existed");
  151. }
  152. }
  153. }
  154. }
  155. catch (Exception ex)
  156. {
  157. Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisV2Async error, remedicalCode:{remedicalCode}, ex:{ex}");
  158. }
  159. finally
  160. {
  161. try
  162. {
  163. // if (Directory.Exists(currentFolder))
  164. // {
  165. // Directory.Delete(currentFolder, true);
  166. // }
  167. }
  168. catch { }
  169. }
  170. Logger.WriteLineInfo($"AIDiagnosisService URMAnalysisV2Async finished, remedicalCode:{remedicalCode}, result:{resultData.IsSuccess}");
  171. return resultData;
  172. }
  173. /// <summary>
  174. /// URM后处理
  175. /// </summary>
  176. /// <param name="request">URM后处理请求实体</param>
  177. /// <returns>URM后处理结果</returns>
  178. /// <value></value>
  179. /// <errorCodes></errorCodes>
  180. public async Task<URMProcessResult> URMProcessAsync(URMProcessRequest request)
  181. {
  182. // DeleteExpiredFolders(DateTime.Now.AddHours(-6));
  183. var remedicalCode = request.RemedicalCode;
  184. try
  185. {
  186. if (!string.IsNullOrWhiteSpace(remedicalCode))
  187. {
  188. var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
  189. // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
  190. if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
  191. && remedical.UrmParameters != null && remedical.UrmParameters.Any())
  192. {
  193. Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync start, remedicalCode:{remedicalCode}");
  194. var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
  195. if (!Directory.Exists(currentFolder))
  196. {
  197. Directory.CreateDirectory(currentFolder);
  198. }
  199. await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
  200. var urmProcessRequest = ConvertToUrmRequest<URMProcessRequest, UrmProcessRequest>(request, remedical, currentFolder);
  201. var base64String = URMAnalysisManager.DoUrmProcess(urmProcessRequest);
  202. Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
  203. return new URMProcessResult
  204. {
  205. Base64String = base64String,
  206. };
  207. }
  208. }
  209. }
  210. catch (Exception ex)
  211. {
  212. Logger.WriteLineWarn($"AIDiagnosisService URMProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
  213. }
  214. finally
  215. {
  216. Logger.WriteLineInfo($"AIDiagnosisService URMProcessAsync finally, remedicalCode:{remedicalCode}");
  217. }
  218. return new URMProcessResult();
  219. }
  220. private async Task DownloadUrmBinFiles(string currentFolder, List<ImgItem> imgList)
  221. {
  222. // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
  223. foreach (var imgItem in imgList)
  224. {
  225. if (imgItem.ImgType != 0 && !string.IsNullOrWhiteSpace(imgItem.FileToken))
  226. {
  227. var fileName = Path.GetFileName(imgItem.FileToken);
  228. if (imgItem.ImgType == 10)
  229. {
  230. fileName = "srcDenArray.bin";
  231. }
  232. else if (imgItem.ImgType == 11)
  233. {
  234. fileName = "srcDirArray.bin";
  235. }
  236. else if (imgItem.ImgType == 12)
  237. {
  238. fileName = "srcVelArray.bin";
  239. }
  240. else if (imgItem.ImgType == 13)
  241. {
  242. fileName = "srcAngleArray.bin";
  243. }
  244. else if (imgItem.ImgType == 14)
  245. {
  246. fileName = "srcMaskArray.bin";
  247. }
  248. else if (imgItem.ImgType == 15)
  249. {
  250. fileName = "URMPoints.bin";
  251. }
  252. else if (imgItem.ImgType == 16)
  253. {
  254. fileName = "URMPointNums.bin";
  255. }
  256. var localFilePath = Path.Combine(currentFolder, fileName);
  257. if (!File.Exists(localFilePath))
  258. {
  259. await DownloadToLocalAsync(imgItem.FileToken, localFilePath);
  260. }
  261. }
  262. }
  263. }
  264. /// <summary>
  265. /// URM视频后处理
  266. /// </summary>
  267. /// <param name="request">URM视频后处理请求实体</param>
  268. /// <returns>URM视频后处理结果</returns>
  269. /// <value></value>
  270. /// <errorCodes></errorCodes>
  271. public async Task<URMVideoProcessResult> URMVideoProcessAsync(URMVideoProcessRequest request)
  272. {
  273. var remedicalCode = request.RemedicalCode;
  274. try
  275. {
  276. if (!string.IsNullOrWhiteSpace(remedicalCode))
  277. {
  278. var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
  279. // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
  280. if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
  281. && remedical.UrmParameters != null && remedical.UrmParameters.Any())
  282. {
  283. Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync start, remedicalCode:{remedicalCode}");
  284. var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
  285. if (!Directory.Exists(currentFolder))
  286. {
  287. Directory.CreateDirectory(currentFolder);
  288. }
  289. await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
  290. var urmProcessRequest = ConvertToUrmRequest<URMVideoProcessRequest, DoUrmVideoProcessRequest>(request, remedical, currentFolder);
  291. urmProcessRequest.GUID = request.RemedicalCode;
  292. urmProcessRequest.VideoFrame = request.VideoFrame;
  293. urmProcessRequest.URMVideoScaler = request.URMVideoScaler;
  294. urmProcessRequest.URMVideoParameter = request.URMVideoParameter;
  295. urmProcessRequest.URMVideoType = request.URMVideoType;
  296. var pointsPath = Path.Combine(currentFolder, "URMPoints.bin");
  297. var pointNumsPath = Path.Combine(currentFolder, "URMPointNums.bin");
  298. urmProcessRequest.PointsDataPath = File.Exists(pointsPath) ? pointsPath : string.Empty;
  299. urmProcessRequest.PointNumsDataPath = File.Exists(pointNumsPath) ? pointNumsPath : string.Empty;
  300. var base64String = URMAnalysisManager.DoUrmVideoProcess(urmProcessRequest);
  301. Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync end, remedicalCode:{remedicalCode}, base64String-Length:{base64String.Length}");
  302. return new URMVideoProcessResult
  303. {
  304. Base64String = base64String,
  305. };
  306. }
  307. }
  308. }
  309. catch (Exception ex)
  310. {
  311. Logger.WriteLineWarn($"AIDiagnosisService URMVideoProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
  312. }
  313. finally
  314. {
  315. Logger.WriteLineInfo($"AIDiagnosisService URMVideoProcessAsync finally, remedicalCode:{remedicalCode}");
  316. }
  317. return new URMVideoProcessResult();
  318. }
  319. /// <summary>
  320. /// URM测量
  321. /// </summary>
  322. /// <param name="request">URM测量后处理测量请求实体</param>
  323. /// <returns>URM测量后处理结果</returns>
  324. /// <value></value>
  325. /// <errorCodes></errorCodes>
  326. public async Task<URMMeasureProcessResult> URMMeasureProcessAsync(URMMeasureProcessRequest request)
  327. {
  328. var remedicalCode = request.RemedicalCode;
  329. try
  330. {
  331. if (!string.IsNullOrWhiteSpace(remedicalCode))
  332. {
  333. var remedical = await _remedicalDBService.GetRemedicalByCodeAsync(remedicalCode, false);
  334. // 10-srcDenArray.bin,11-srcDirArray.bin,12-srcVelArray.bin,13-srcAngleArray.bin,14-srcMaskArray.bin,15-URMPoints.bin,16-URMPointNums.bin
  335. if (remedical != null && remedical.ImgList != null && remedical.ImgList.Any() && remedical.ImgList.Any(x => x.ImgType != 0)
  336. && remedical.UrmParameters != null && remedical.UrmParameters.Any())
  337. {
  338. Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync start, remedicalCode:{remedicalCode}");
  339. var currentFolder = Path.Combine(_urmTempFolder, remedicalCode);
  340. if (!Directory.Exists(currentFolder))
  341. {
  342. Directory.CreateDirectory(currentFolder);
  343. }
  344. await DownloadUrmBinFiles(currentFolder, remedical.ImgList);
  345. var urmProcessRequest = ConvertToUrmRequest<URMMeasureProcessRequest, UrmMeasureProcessRequest>(request, remedical, currentFolder);
  346. urmProcessRequest.UrmMeasureType = (URMMeasureType)request.UrmMeasureType;
  347. urmProcessRequest.SrcDPoints = request.SrcDPoints?.Select(p => new DPoint { X = p.X, Y = p.Y })?.ToList() ?? new List<DPoint>();
  348. urmProcessRequest.CMlength = request.CMlength;
  349. urmProcessRequest.Phywidth = request.Phywidth;
  350. urmProcessRequest.ROIType = (URMROIType)request.ROIType;
  351. urmProcessRequest.ShellWidth = request.ShellWidth;
  352. var output = URMAnalysisManager.MeasureProcess(urmProcessRequest);
  353. Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync end, remedicalCode:{remedicalCode}, ResultFlag: {output?.ResultFlag}");
  354. if (output != null)
  355. {
  356. return JsonConvert.DeserializeObject<URMMeasureProcessResult>(JsonConvert.SerializeObject(output));
  357. }
  358. }
  359. }
  360. }
  361. catch (Exception ex)
  362. {
  363. Logger.WriteLineWarn($"AIDiagnosisService URMMeasureProcessAsync error, remedicalCode:{remedicalCode}, ex:{ex}");
  364. }
  365. finally
  366. {
  367. Logger.WriteLineInfo($"AIDiagnosisService URMMeasureProcessAsync finally, remedicalCode:{remedicalCode}");
  368. }
  369. return new URMMeasureProcessResult();
  370. }
  371. private URMAnalysisV2Result DoURMAnalysisV2(string remedicalCode, string origialFile, string converFile, string outputFolder, Dictionary<string, string> urmParamers)
  372. {
  373. try
  374. {
  375. var arguments = new List<string>();
  376. arguments.Add($"{origialFile}");
  377. arguments.Add($"{GetValue(urmParamers, "familyName")}");
  378. arguments.Add($"{GetValue(urmParamers, "typeInfo")}");
  379. arguments.Add($"{GetValue(urmParamers, "nativeId")}");
  380. arguments.Add($"{GetValue(urmParamers, "VecLens")}");
  381. arguments.Add($"{GetValue(urmParamers, "Mlas")}");
  382. arguments.Add($"{GetValue(urmParamers, "FramesGot")}");
  383. arguments.Add($"{GetValue(urmParamers, "CenterFrequencyMhz")}");
  384. arguments.Add($"{GetValue(urmParamers, "SupersonicSpeed")}");
  385. arguments.Add($"{GetValue(urmParamers, "FrequencyMin")}");
  386. arguments.Add($"{GetValue(urmParamers, "FrameRateDisplay")}");
  387. arguments.Add($"{GetValue(urmParamers, "Depth")}");
  388. arguments.Add($"{GetValue(urmParamers, "X0")}");
  389. arguments.Add($"{GetValue(urmParamers, "Z0")}");
  390. arguments.Add($"{GetValue(urmParamers, "ProbeType")}");
  391. arguments.Add($"{GetValue(urmParamers, "ScaleOfPixel_x")}");
  392. arguments.Add($"{GetValue(urmParamers, "ScaleOfPixel_y")}");
  393. arguments.Add($"{GetValue(urmParamers, "section")}");
  394. arguments.Add($"{GetValue(urmParamers, "MOCOYN")}");
  395. arguments.Add($"{GetValue(urmParamers, "MidProc_DeciFactor")}");
  396. arguments.Add($"{GetValue(urmParamers, "VectorStartForMid")}");
  397. arguments.Add($"{GetValue(urmParamers, "isliner")}");
  398. arguments.Add($"{GetValue(urmParamers, "startX")}");
  399. arguments.Add($"{GetValue(urmParamers, "startY")}");
  400. arguments.Add($"{GetValue(urmParamers, "width")}");
  401. arguments.Add($"{GetValue(urmParamers, "height")}");
  402. arguments.Add($"{GetValue(urmParamers, "CustomizedStartFrame")}");
  403. arguments.Add($"{GetValue(urmParamers, "CustomizedEndFrame")}");
  404. arguments.Add($"{GetValue(urmParamers, "RoiXPercent")}");
  405. arguments.Add($"{GetValue(urmParamers, "RoiYPercent")}");
  406. arguments.Add($"{GetValue(urmParamers, "RoiWPercent")}");
  407. arguments.Add($"{GetValue(urmParamers, "RoiHPercent")}");
  408. Logger.WriteLineInfo($"AIDiagnosisService DoURMAnalysisV2 arguments:{string.Join(";", arguments)}");
  409. return URMAnalysisManager.DoURMAnalysis(arguments, outputFolder, converFile);
  410. }
  411. catch (Exception ex)
  412. {
  413. Logger.WriteLineWarn($"AIDiagnosisService DoURMAnalysisV2 error, remedicalCode:{remedicalCode}, ex:{ex}");
  414. }
  415. return default;
  416. }
  417. private string GetValue(Dictionary<string, string> urmParamers, string key)
  418. {
  419. foreach (var k in urmParamers.Keys)
  420. {
  421. if (k.ToLower() == key.ToLower())
  422. {
  423. var value = urmParamers[k];
  424. return string.IsNullOrWhiteSpace(value) ? "" : value;
  425. }
  426. }
  427. return "";
  428. }
  429. private async Task InitURMAnalysisDetails(URMAnalysisV2Result resultData, string originalUrl, string currentFolder, ImgItem originalRemedicalInfo, string converImagePath)
  430. {
  431. var orginal = new ImgItem
  432. {
  433. ImgType = 0,
  434. FileToken = originalUrl,
  435. FileSize = originalRemedicalInfo.FileSize,
  436. CoverImgUrl = originalRemedicalInfo.CoverImgUrl,
  437. PreviewFileUrl = originalRemedicalInfo.PreviewFileUrl,
  438. };
  439. if (File.Exists(converImagePath))
  440. {
  441. var fileName = Path.GetFileName(converImagePath);
  442. var fileInfo = await UploadFileWithSizeAsync(converImagePath, fileName);
  443. orginal.CoverImgUrl = fileInfo.Item1;
  444. orginal.PreviewFileUrl = fileInfo.Item1;
  445. }
  446. resultData.URMAnalysisDetails.Add(orginal);
  447. var files = Directory.GetFiles(currentFolder);
  448. foreach (var file in files)
  449. {
  450. var fileName = Path.GetFileName(file);
  451. if (fileName.Contains(".bin"))
  452. {
  453. var imgType = 0;
  454. if (fileName.Contains("srcDenArray.bin"))
  455. {
  456. imgType = 10;
  457. }
  458. else if (fileName.Contains("srcDirArray.bin"))
  459. {
  460. imgType = 11;
  461. }
  462. else if (fileName.Contains("srcVelArray.bin"))
  463. {
  464. imgType = 12;
  465. }
  466. else if (fileName.Contains("srcAngleArray.bin"))
  467. {
  468. imgType = 13;
  469. }
  470. else if (fileName.Contains("srcMaskArray.bin"))
  471. {
  472. imgType = 14;
  473. }
  474. else if (fileName.Contains("URMPoints.bin"))
  475. {
  476. imgType = 15;
  477. }
  478. else if (fileName.Contains("URMPointNums.bin"))
  479. {
  480. imgType = 16;
  481. }
  482. else
  483. {
  484. continue;
  485. }
  486. var fileInfo = await UploadFileWithSizeAsync(file, fileName);
  487. resultData.URMAnalysisDetails.Add(new ImgItem
  488. {
  489. ImgType = imgType,
  490. FileToken = fileInfo.Item1,
  491. FileSize = fileInfo.Item2,
  492. });
  493. }
  494. }
  495. }
  496. private async Task<bool> DownloadToLocalAsync(string fileUrl, string localFile)
  497. {
  498. try
  499. {
  500. if (fileUrl.Contains("FlyinsonoStorage"))
  501. {
  502. // 自建存储
  503. var infos = fileUrl.Split("FlyinsonoStorage");
  504. var sourceFilePath = Path.Combine(_storageDirectory, infos[1].Trim('/'));
  505. if (File.Exists(sourceFilePath))
  506. {
  507. File.Copy(sourceFilePath, localFile);
  508. return true;
  509. }
  510. }
  511. long fileSize = 0;
  512. using (var request = new HttpRequestMessage())
  513. {
  514. request.RequestUri = new Uri(fileUrl);
  515. request.Method = HttpMethod.Get;
  516. var response = await _httpClient.SendAsync(request);
  517. if (response != null && response.StatusCode == HttpStatusCode.OK)
  518. {
  519. var contentLength = response.Content.Headers.ContentLength;
  520. fileSize = contentLength == null ? 0 : contentLength.Value;
  521. }
  522. }
  523. if (fileSize > 0)
  524. {
  525. byte[] bytes = await _httpClient.GetByteArrayAsync(fileUrl);
  526. File.WriteAllBytes(localFile, bytes);
  527. return true;
  528. }
  529. }
  530. catch (Exception ex)
  531. {
  532. Logger.WriteLineWarn($"AIDiagnosisService URMAnalysisAsync, fileToken:{fileUrl}, ex:{ex}");
  533. }
  534. return false;
  535. }
  536. private void DeleteExpiredFolders(DateTime time)
  537. {
  538. if (Directory.Exists(_urmTempFolder))
  539. {
  540. DirectoryInfo theFolder = new DirectoryInfo(_urmTempFolder);
  541. DirectoryInfo[] dics = theFolder.GetDirectories();
  542. foreach (var item in dics)
  543. {
  544. if (item.CreationTime < time)
  545. {
  546. Directory.Delete(item.FullName, true);
  547. }
  548. }
  549. }
  550. }
  551. private void DeleteTempFiles(string currentFolder, List<string> expectFiles)
  552. {
  553. try
  554. {
  555. var files = Directory.GetFiles(currentFolder);
  556. if (files?.Any() ?? false)
  557. {
  558. foreach (var file in files)
  559. {
  560. if (expectFiles == null || !expectFiles.Any(x => x == file))
  561. {
  562. File.Delete(file);
  563. }
  564. }
  565. }
  566. var aviFolder = Path.Combine(currentFolder, "avi");
  567. if (Directory.Exists(aviFolder))
  568. {
  569. Directory.Delete(aviFolder, true);
  570. }
  571. }
  572. catch (Exception ex)
  573. {
  574. Logger.WriteLineWarn($"AIDiagnosisService DeleteTempFiles failed, currentFolder:{currentFolder}, ex:{ex}");
  575. }
  576. }
  577. private double ConvertToDouble(string value)
  578. {
  579. if (string.IsNullOrWhiteSpace(value))
  580. {
  581. return 0;
  582. }
  583. if (double.TryParse(value, out double x))
  584. {
  585. return x;
  586. }
  587. return 0;
  588. }
  589. private URMRequest ConvertToUrmRequest<WingRequest, URMRequest>(WingRequest request, RemedicalInfoDTO remedical, string currentFolder)
  590. where WingRequest : URMProcessRequest, new()
  591. where URMRequest : UrmProcessRequest, new()
  592. {
  593. var denPath = Path.Combine(currentFolder, "srcDenArray.bin");
  594. var dirPath = Path.Combine(currentFolder, "srcDirArray.bin");
  595. var velPath = Path.Combine(currentFolder, "srcVelArray.bin");
  596. var angelPath = Path.Combine(currentFolder, "srcAngleArray.bin");
  597. var maskPath = Path.Combine(currentFolder, "srcMaskArray.bin");
  598. var urmProcessRequest = new URMRequest
  599. {
  600. FamilyName = GetValue(remedical.UrmParameters, "familyName"),
  601. TypeInfo = GetValue(remedical.UrmParameters, "typeInfo"),
  602. NativeId = GetValue(remedical.UrmParameters, "nativeId"),
  603. Isliner = GetValue(remedical.UrmParameters, "isliner").ToLower() == "true",
  604. ScaleOfPixel_x = ConvertToDouble(GetValue(remedical.UrmParameters, "ScaleOfPixel_x")),
  605. ScaleOfPixel_y = ConvertToDouble(GetValue(remedical.UrmParameters, "ScaleOfPixel_y")),
  606. Urmsrcwidth = remedical.URMSrcWidth,
  607. Urmsrcheight = remedical.URMSrcHeight,
  608. DenDataPath = File.Exists(denPath) ? denPath : string.Empty,
  609. DirDataPath = File.Exists(dirPath) ? dirPath : string.Empty,
  610. VelDataPath = File.Exists(velPath) ? velPath : string.Empty,
  611. AngleDataPath = File.Exists(angelPath) ? angelPath : string.Empty,
  612. MaskDataPath = File.Exists(maskPath) ? maskPath : string.Empty,
  613. Res = remedical.URMRes,
  614. UrmImageType = request.UrmImageType,
  615. UrmBlend = request.UrmBlend,
  616. DownsampleIndex = request.DownsampleIndex,
  617. IntPowerDen = request.IntPowerDen,
  618. IntPowerDir = request.IntPowerDir,
  619. SigmaGauss = request.SigmaGauss,
  620. VessScale = request.VessScale,
  621. VelMaxScaler = request.VelMaxScaler,
  622. VelMinScaler = request.VelMinScaler,
  623. Iterations = request.Iterations,
  624. ImgProcessVer = request.ImgProcessVer,
  625. ZoomOn = request.ZoomOn,
  626. ZoomRoix = request.ZoomRoix,
  627. ZoomRoiy = request.ZoomRoiy,
  628. ZoomRoiwidth = request.ZoomRoiwidth,
  629. ZoomRoiheight = request.ZoomRoiheight,
  630. LeftRight = request.LeftRight,
  631. UpDown = request.UpDown,
  632. UrmTraceDPoints = request.UrmTraceDPoints?.Select(p => new DPoint { X = p.X, Y = p.Y })?.ToArray(),
  633. Roix = request.Roix,
  634. Roiy = request.Roiy,
  635. Roiwidth = request.Roiwidth,
  636. Roiheight = request.Roiheight,
  637. ScreenWidth = request.ScreenWidth,
  638. ScreenHeight = request.ScreenHeight,
  639. };
  640. return urmProcessRequest;
  641. }
  642. }
  643. }