DetectCgController.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using PosResAnalysis;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net.Http;
  7. using System.Net;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Web.Http;
  11. using XdCxRhDw.Dto;
  12. using XdCxRhDW.App.CorTools;
  13. using System.Web;
  14. namespace XdCxRhDW.App.WebAPI
  15. {
  16. /// <summary>
  17. /// 检测参估功能相关接口
  18. /// </summary>
  19. public class DetectCgController : BaseController
  20. {
  21. private string UploadFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFolder");
  22. private (bool, string) ValidateCalcParam(CalcDto dto)
  23. {
  24. if (dto == null)
  25. {
  26. return (false, "参估计算参数格式错误!");
  27. }
  28. if (string.IsNullOrEmpty(dto.file1))
  29. {
  30. return (false, "参估计算参数数据文件[file1]不能为空!");
  31. }
  32. if (string.IsNullOrEmpty(dto.file2))
  33. {
  34. return (false, "参估计算参数数据文件[file2]不能为空!");
  35. }
  36. if (!File.Exists(dto.file1))
  37. {
  38. return (false, $"参估计算参数数据文件[{dto.file1}]不存在!");
  39. }
  40. if (!File.Exists(dto.file2))
  41. {
  42. return (false, $"参估计算参数数据文件[{dto.file2}]不存在!");
  43. }
  44. if (dto.dtRange <= 0)
  45. {
  46. return (false, "参估计算参数时差范围[dtRange]不能小于等于0!");
  47. }
  48. if (dto.smpStart < 0)
  49. {
  50. return (false, "参估计算参数开始样点[smpStart]不能小于0!");
  51. }
  52. if (dto.smpCount < 0)
  53. {
  54. return (false, "参估计算参数样点数[smpCount]不能小于0!");
  55. }
  56. return (true, string.Empty);
  57. }
  58. /// <summary>
  59. /// 参估计算
  60. /// </summary>
  61. /// <param name="dto"></param>
  62. /// <returns></returns>
  63. [HttpPost]
  64. public async Task<AjaxResult<EstimationResDto>> EstimationCalc(CalcDto dto)
  65. {
  66. var vpres = ValidateCalcParam(dto);
  67. if (!vpres.Item1)
  68. {
  69. Serilog.Log.Warning(vpres.Item2);
  70. return Error<EstimationResDto>(vpres.Item2);
  71. }
  72. XcorrStruct xItem = new XcorrStruct();
  73. xItem.file1 = dto.file1;
  74. xItem.file2 = dto.file2;
  75. xItem.samplingRate = dto.samplingRate;
  76. xItem.dtCenter = dto.dtCenter;
  77. xItem.dtRange = dto.dtRange;
  78. xItem.dfRange = dto.dfRange;
  79. //样点数为0时计算所有样本
  80. if (dto.smpCount == 0)
  81. {
  82. FileInfo file = new FileInfo(dto.file1);
  83. long totalsamp = file.Length / 4;
  84. xItem.smpCount = (int)totalsamp - dto.smpStart;
  85. }
  86. else
  87. {
  88. xItem.smpCount = dto.smpCount;
  89. }
  90. xItem.smpStart = dto.smpStart;
  91. xItem.snrThreshold = dto.snrThreshold;
  92. var result = await XcorrUtils.Calc(xItem);
  93. //开始计算
  94. if (result.flag == -2)
  95. {
  96. Serilog.Log.Warning("参估计算内部错误!");
  97. return Error<EstimationResDto>("参估计算内部错误!");
  98. }
  99. else if (result.flag == -1)
  100. {
  101. Serilog.Log.Warning("参估计算所需数据超出文件范围!");
  102. return Error<EstimationResDto>("参估计算所需数据超出文件范围!");
  103. }
  104. EstimationResDto resDto = new EstimationResDto();
  105. resDto.Tm = result.tm;
  106. resDto.Smpstart = result.smpstart;
  107. resDto.Smplen = result.smplen;
  108. resDto.File1 = result.file1;
  109. resDto.File2 = result.file2;
  110. if (result.flag == 1)
  111. {
  112. resDto.Dt = result.dt.Value;
  113. resDto.Df = result.df.Value;
  114. resDto.Snr = result.snr.Value;
  115. }
  116. return Success(resDto);
  117. }
  118. /// <summary>
  119. /// 上传文件
  120. /// </summary>
  121. /// <returns></returns>
  122. [HttpPost]
  123. public async Task<AjaxResult<string>> UploadFile()
  124. {
  125. if (!Request.Content.IsMimeMultipartContent("form-data"))
  126. {
  127. return Error<string>("不支持当前媒介类型");
  128. }
  129. var provider = new MultipartMemoryStreamProvider();
  130. await Request.Content.ReadAsMultipartAsync(provider);
  131. // 创建文件夹(如果尚未存在)
  132. if (!Directory.Exists(UploadFolder))
  133. {
  134. Directory.CreateDirectory(UploadFolder);
  135. }
  136. var content = provider.Contents.First();
  137. var fileName = GetFileName(content.Headers);
  138. var fileData = await content.ReadAsByteArrayAsync();
  139. // 将文件保存到本地文件夹中
  140. var filePath = Path.Combine(UploadFolder, fileName);
  141. using (var fileStream = new FileStream(filePath, FileMode.Create))
  142. {
  143. await fileStream.WriteAsync(fileData, 0, fileData.Length);
  144. }
  145. return Success<string>(filePath);
  146. }
  147. private string GetFileName(System.Net.Http.Headers.HttpContentHeaders headers)
  148. {
  149. var disposition = headers.ContentDisposition;
  150. var fileName = disposition.FileName.Trim('"');
  151. // 如果 fileName 为空,则可以根据需要生成唯一的文件名
  152. if (string.IsNullOrEmpty(fileName))
  153. {
  154. fileName = Guid.NewGuid().ToString();
  155. }
  156. return fileName;
  157. }
  158. }
  159. }