Browse Source

添加参估计算接口

wyq 1 year ago
parent
commit
4048b22ab5

+ 28 - 0
XdCxRhDW.App/App.config

@@ -74,4 +74,32 @@
     <!--公司名称(没有则不会显示版权)-->
     <add key="Company" value="" />
   </appSettings>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-5.3.0.0" newVersion="5.3.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
 </configuration>

+ 84 - 22
XdCxRhDW.App/CorTools/DetectToolForm.cs

@@ -9,7 +9,9 @@ using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.IO;
+using System.IO.Compression;
 using System.Linq;
+using System.Net.Http;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
@@ -208,6 +210,7 @@ namespace XdCxRhDW.App.CorTools
         private void chkDama_CheckedChanged(object sender, EventArgs e)
         {
             lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always;
+            btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true;
             if (chkDama.Checked)
             {
                 ckIBS.Checked = false;
@@ -217,8 +220,10 @@ namespace XdCxRhDW.App.CorTools
         private void ckIBS_CheckedChanged(object sender, EventArgs e)
         {
             lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always;
+            btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true;
             if (ckIBS.Checked)
             {
+
                 chkDama.Checked = false;
                 ckKY.Checked = false;
             }
@@ -227,6 +232,7 @@ namespace XdCxRhDW.App.CorTools
         private void ckKY_CheckedChanged(object sender, EventArgs e)
         {
             lciStartPos.Visibility = lciSampleLength.Visibility = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? LayoutVisibility.Never : LayoutVisibility.Always;
+            btnCalc.Enabled = ckKY.Checked | ckIBS.Checked | chkDama.Checked ? false : true;
             if (ckKY.Checked)
             {
                 ckIBS.Checked = false;
@@ -251,11 +257,49 @@ namespace XdCxRhDW.App.CorTools
             {
                 return;
             }
-            if (lciStartPos.Visibility == LayoutVisibility.Never && gridSource.Count == 0)
+
+
+            // 压缩文件
+            string compressedFilePath = CompressFile(btnFile1.Text);
+
+            // 创建 HttpClient 对象
+            using (HttpClient client = new HttpClient())
             {
-                DxHelper.MsgBoxHelper.ShowError($"请输入计算参数起始样点及计算样点(勿勾选DAMA|IBS|Ky5758)!");
-                return;
+                // 构建上传请求的 Uri
+                string uploadUri = "http://localhost:8091/api/DetectCg/UploadFile"; 
+
+                // 创建 MultipartFormDataContent 用于封装文件内容
+                MultipartFormDataContent content = new MultipartFormDataContent();
+
+                // 添加压缩后的文件内容到 MultipartFormDataContent
+                byte[] fileBytes = File.ReadAllBytes(compressedFilePath);
+                ByteArrayContent fileContent = new ByteArrayContent(fileBytes);
+                content.Add(fileContent, "file", Path.GetFileName(compressedFilePath));
+
+                try
+                {
+                    // 发送上传请求
+                    HttpResponseMessage response = await client.PostAsync(uploadUri, content);
+
+                    // 检查响应状态码
+                    if (response.IsSuccessStatusCode)
+                    {
+                        MessageBox.Show("文件上传成功!");
+                    }
+                    else
+                    {
+                        MessageBox.Show("文件上传失败!");
+                    }
+                }
+                catch (Exception ex)
+                {
+                    MessageBox.Show("文件上传失败:" + ex.Message);
+                }
             }
+
+            // 删除压缩后的临时文件
+            File.Delete(compressedFilePath);
+
             List<XcorrStruct> xcorrs = new List<XcorrStruct>();
             XcorrStruct xItem = new XcorrStruct();
             xItem.file1 = btnFile1.Text;
@@ -281,8 +325,8 @@ namespace XdCxRhDW.App.CorTools
             {
                 foreach (var item in gridSource)
                 {
-                   var corritem= xItem.Copy();
-                    corritem.smpCount =(int)item.smplen;
+                    var corritem = xItem.Copy();
+                    corritem.smpCount = (int)item.smplen;
                     corritem.smpStart = (int)item.smpstart;
                     xcorrs.Add(corritem);
                 }
@@ -296,35 +340,53 @@ namespace XdCxRhDW.App.CorTools
             WriteIni();
             btnCalc.Text = "停止";
             beRunning = true;
+            gridSource.Clear();
             foreach (var xcitem in xcorrs)
             {
                 var result = await ExecuteCorAsync(xcitem);
                 if (result != null)
                 {
-                    var smitemindex = gridSource.FindIndex(m => m.smpstart == xcitem.smpStart && m.smplen == xcitem.smpCount);
-                    if (smitemindex == -1)
-                    {
-                        gridSource.Add(result);
-                        gridView1.FocusedRowHandle = gridSource.Count - 1;
-                    }
-                    else
-                    {
-                        var smitem = gridSource[smitemindex];
-                        smitem.dt = result.dt;
-                        smitem.df = result.df;
-                        smitem.snr = result.snr;
-                        smitem.tm = result.tm;
-                        gridView1.RefreshData();
-                        gridView1.FocusedRowHandle = smitemindex;
-                    }
+                    //var smitemindex = gridSource.FindIndex(m => m.smpstart == xcitem.smpStart && m.smplen == xcitem.smpCount);
+                    //if (smitemindex == -1)
+                    //{
+                    gridSource.Add(result);
+                    gridView1.FocusedRowHandle = gridSource.Count - 1;
+                    //}
+                    //else
+                    //{
+                    //    var smitem = gridSource[smitemindex];
+                    //    smitem.dt = result.dt;
+                    //    smitem.df = result.df;
+                    //    smitem.snr = result.snr;
+                    //    smitem.tm = result.tm;
+                    //    gridView1.RefreshData();
+                    //    gridView1.FocusedRowHandle = smitemindex;
+                    //}
                 }
 
             }
-           
+
             btnCalc.Text = "计算";
             beRunning = false;
 
         }
+        private string CompressFile(string filePath)
+        {
+            string compressedFilePath = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + ".zip");
+
+            using (FileStream originalFileStream = File.OpenRead(filePath))
+            {
+                using (FileStream compressedFileStream = File.Create(compressedFilePath))
+                {
+                    using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
+                    {
+                        originalFileStream.CopyTo(compressionStream);
+                    }
+                }
+            }
+
+            return compressedFilePath;
+        }
         private async Task<CafResult> ExecuteCorAsync(XcorrStruct xItem)
         {
 

+ 26 - 26
XdCxRhDW.App/CorTools/DetectToolForm.designer.cs

@@ -30,6 +30,7 @@
         {
             this.components = new System.ComponentModel.Container();
             this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            this.btnCalc = new DevExpress.XtraEditors.SimpleButton();
             this.chkDama = new DevExpress.XtraEditors.CheckEdit();
             this.barManager1 = new DevExpress.XtraBars.BarManager(this.components);
             this.barDockControlTop = new DevExpress.XtraBars.BarDockControl();
@@ -75,10 +76,9 @@
             this.lciBtnCheck = new DevExpress.XtraLayout.LayoutControlItem();
             this.layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
             this.layoutControlItem7 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem11 = new DevExpress.XtraLayout.LayoutControlItem();
             this.popupMenu1 = new DevExpress.XtraBars.PopupMenu(this.components);
             this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
-            this.btnCalc = new DevExpress.XtraEditors.SimpleButton();
-            this.layoutControlItem11 = new DevExpress.XtraLayout.LayoutControlItem();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit();
             this.layoutControl1.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.chkDama.Properties)).BeginInit();
@@ -111,8 +111,8 @@
             ((System.ComponentModel.ISupportInitialize)(this.lciBtnCheck)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem7)).BeginInit();
-            ((System.ComponentModel.ISupportInitialize)(this.popupMenu1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem11)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.popupMenu1)).BeginInit();
             this.SuspendLayout();
             // 
             // layoutControl1
@@ -142,6 +142,16 @@
             this.layoutControl1.TabIndex = 0;
             this.layoutControl1.Text = "layoutControl1";
             // 
+            // btnCalc
+            // 
+            this.btnCalc.Location = new System.Drawing.Point(984, 31);
+            this.btnCalc.Name = "btnCalc";
+            this.btnCalc.Size = new System.Drawing.Size(111, 22);
+            this.btnCalc.StyleController = this.layoutControl1;
+            this.btnCalc.TabIndex = 19;
+            this.btnCalc.Text = "计算";
+            this.btnCalc.Click += new System.EventHandler(this.btnCalc_Click);
+            // 
             // chkDama
             // 
             this.chkDama.Location = new System.Drawing.Point(867, 6);
@@ -663,28 +673,6 @@
             this.layoutControlItem7.TextSize = new System.Drawing.Size(0, 0);
             this.layoutControlItem7.TextVisible = false;
             // 
-            // popupMenu1
-            // 
-            this.popupMenu1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] {
-            new DevExpress.XtraBars.LinkPersistInfo(this.barButtonItem1),
-            new DevExpress.XtraBars.LinkPersistInfo(this.barButtonItem2)});
-            this.popupMenu1.Manager = this.barManager1;
-            this.popupMenu1.Name = "popupMenu1";
-            // 
-            // openFileDialog1
-            // 
-            this.openFileDialog1.FileName = "openFileDialog1";
-            // 
-            // btnCalc
-            // 
-            this.btnCalc.Location = new System.Drawing.Point(984, 31);
-            this.btnCalc.Name = "btnCalc";
-            this.btnCalc.Size = new System.Drawing.Size(111, 22);
-            this.btnCalc.StyleController = this.layoutControl1;
-            this.btnCalc.TabIndex = 19;
-            this.btnCalc.Text = "计算";
-            this.btnCalc.Click += new System.EventHandler(this.btnCalc_Click);
-            // 
             // layoutControlItem11
             // 
             this.layoutControlItem11.Control = this.btnCalc;
@@ -697,6 +685,18 @@
             this.layoutControlItem11.TextSize = new System.Drawing.Size(0, 0);
             this.layoutControlItem11.TextVisible = false;
             // 
+            // popupMenu1
+            // 
+            this.popupMenu1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] {
+            new DevExpress.XtraBars.LinkPersistInfo(this.barButtonItem1),
+            new DevExpress.XtraBars.LinkPersistInfo(this.barButtonItem2)});
+            this.popupMenu1.Manager = this.barManager1;
+            this.popupMenu1.Name = "popupMenu1";
+            // 
+            // openFileDialog1
+            // 
+            this.openFileDialog1.FileName = "openFileDialog1";
+            // 
             // DetectToolForm
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F);
@@ -746,8 +746,8 @@
             ((System.ComponentModel.ISupportInitialize)(this.lciBtnCheck)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem6)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem7)).EndInit();
-            ((System.ComponentModel.ISupportInitialize)(this.popupMenu1)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem11)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.popupMenu1)).EndInit();
             this.ResumeLayout(false);
             this.PerformLayout();
 

+ 0 - 10
XdCxRhDW.App/Properties/licenses.licx

@@ -1,10 +0,0 @@
-DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
-DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

+ 172 - 0
XdCxRhDW.App/WebAPI/Controllers/DetectCgController.cs

@@ -0,0 +1,172 @@
+using PosResAnalysis;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+using System.Web.Http;
+using XdCxRhDw.Dto;
+using XdCxRhDW.App.CorTools;
+using System.Web;
+namespace XdCxRhDW.App.WebAPI
+{
+    /// <summary>
+    /// 检测参估功能相关接口
+    /// </summary>
+    public class DetectCgController : BaseController
+    {
+
+        private string UploadFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UploadFolder");
+        private (bool, string) ValidateCalcParam(CalcDto dto)
+        {
+            if (dto == null)
+            {
+                return (false, "参估计算参数格式错误!");
+            }
+            if (string.IsNullOrEmpty(dto.file1))
+            {
+                return (false, "参估计算参数数据文件[file1]不能为空!");
+            }
+            if (string.IsNullOrEmpty(dto.file2))
+            {
+                return (false, "参估计算参数数据文件[file2]不能为空!");
+            }
+            if (!File.Exists(dto.file1))
+            {
+                return (false, $"参估计算参数数据文件[{dto.file1}]不存在!");
+            }
+            if (!File.Exists(dto.file2))
+            {
+                return (false, $"参估计算参数数据文件[{dto.file2}]不存在!");
+            }
+            if (dto.dtRange <= 0)
+            {
+                return (false, "参估计算参数时差范围[dtRange]不能小于等于0!");
+            }
+            if (dto.smpStart < 0)
+            {
+                return (false, "参估计算参数开始样点[smpStart]不能小于0!");
+            }
+            if (dto.smpCount < 0)
+            {
+                return (false, "参估计算参数样点数[smpCount]不能小于0!");
+            }
+            return (true, string.Empty);
+        }
+        /// <summary>
+        /// 参估计算
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<AjaxResult<EstimationResDto>> EstimationCalc(CalcDto dto)
+        {
+            var vpres = ValidateCalcParam(dto);
+            if (!vpres.Item1)
+            {
+                Serilog.Log.Warning(vpres.Item2);
+                return Error<EstimationResDto>(vpres.Item2);
+            }
+            XcorrStruct xItem = new XcorrStruct();
+            xItem.file1 = dto.file1;
+            xItem.file2 = dto.file2;
+            xItem.samplingRate = dto.samplingRate;
+            xItem.dtCenter = dto.dtCenter;
+            xItem.dtRange = dto.dtRange;
+            xItem.dfRange = dto.dfRange;
+            //样点数为0时计算所有样本
+            if (dto.smpCount == 0)
+            {
+
+                FileInfo file = new FileInfo(dto.file1);
+                long totalsamp = file.Length / 4;
+                xItem.smpCount = (int)totalsamp - dto.smpStart;
+            }
+            else
+            {
+                xItem.smpCount = dto.smpCount;
+            }
+            xItem.smpStart = dto.smpStart;
+            xItem.snrThreshold = dto.snrThreshold;
+
+            var result = await XcorrUtils.Calc(xItem);
+            //开始计算
+            if (result.flag == -2)
+            {
+                Serilog.Log.Warning("参估计算内部错误!");
+                return Error<EstimationResDto>("参估计算内部错误!");
+            }
+            else if (result.flag == -1)
+            {
+                Serilog.Log.Warning("参估计算所需数据超出文件范围!");
+                return Error<EstimationResDto>("参估计算所需数据超出文件范围!");
+            }
+            EstimationResDto resDto = new EstimationResDto();
+            resDto.Tm = result.tm;
+            resDto.Smpstart = result.smpstart;
+            resDto.Smplen = result.smplen;
+            resDto.File1 = result.file1;
+            resDto.File2 = result.file2;
+            if (result.flag == 1)
+            {
+                resDto.Dt = result.dt.Value;
+                resDto.Df = result.df.Value;
+                resDto.Snr = result.snr.Value;
+            }
+            return Success(resDto);
+
+        }
+
+
+        /// <summary>
+        /// 上传文件
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<AjaxResult<string>> UploadFile()
+        {
+            if (!Request.Content.IsMimeMultipartContent("form-data"))
+            {
+                return Error<string>("不支持当前媒介类型");
+            }
+
+            var provider = new MultipartMemoryStreamProvider();
+            await Request.Content.ReadAsMultipartAsync(provider);
+
+            // 创建文件夹(如果尚未存在)
+            if (!Directory.Exists(UploadFolder))
+            {
+                Directory.CreateDirectory(UploadFolder);
+            }
+            var content = provider.Contents.First();
+            var fileName = GetFileName(content.Headers);
+            var fileData = await content.ReadAsByteArrayAsync();
+
+            // 将文件保存到本地文件夹中
+            var filePath = Path.Combine(UploadFolder, fileName);
+            using (var fileStream = new FileStream(filePath, FileMode.Create))
+            {
+                await fileStream.WriteAsync(fileData, 0, fileData.Length);
+            }
+
+            return Success<string>(filePath);
+        }
+
+        private string GetFileName(System.Net.Http.Headers.HttpContentHeaders headers)
+        {
+            var disposition = headers.ContentDisposition;
+            var fileName = disposition.FileName.Trim('"');
+
+            // 如果 fileName 为空,则可以根据需要生成唯一的文件名
+            if (string.IsNullOrEmpty(fileName))
+            {
+                fileName = Guid.NewGuid().ToString();
+            }
+
+            return fileName;
+        }
+    }
+}

+ 51 - 1
XdCxRhDW.App/WebAPI/Startup.cs

@@ -1,13 +1,18 @@
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.IO;
+using System.Linq;
 using System.Net;
 using System.Net.Http;
 using System.Text;
 using System.Web.Http;
 using System.Web.Http.Filters;
+using System.Web.Http.Metadata;
 using System.Web.Http.Routing;
+using System.Web.Http.Validation;
+using System.Web.Http.Validation.Providers;
 using System.Xml;
 using Microsoft.Owin;
 using Microsoft.Owin.Cors;
@@ -28,6 +33,13 @@ namespace XdCxRhDW.App.WebAPI
         {
             HttpConfiguration config = new HttpConfiguration();
 
+            IEnumerable<ModelValidatorProvider> modelValidatorProviders = config.Services.GetModelValidatorProviders();
+
+            DataAnnotationsModelValidatorProvider provider = (DataAnnotationsModelValidatorProvider)
+                    modelValidatorProviders.Single(x => x is DataAnnotationsModelValidatorProvider);
+
+            provider.RegisterDefaultValidatableObjectAdapter(typeof(CustomModelValidator));
+
             JsonSerializerSettings setting = new JsonSerializerSettings()
             {
                 //日期类型默认格式化处理
@@ -58,7 +70,6 @@ namespace XdCxRhDW.App.WebAPI
 
             //app.Use<LoggingMiddleware>();
             app.UseWebApi(config);
-
         }
         private static void ConfigureSwagger(HttpConfiguration config)
         {
@@ -183,4 +194,43 @@ namespace XdCxRhDW.App.WebAPI
             }
         }
     }
+
+    public class CustomModelValidator : ModelValidator
+    {
+        public CustomModelValidator(IEnumerable<ModelValidatorProvider> modelValidatorProviders) : base(modelValidatorProviders)
+        {
+
+        }
+
+
+        public override IEnumerable<ModelValidationResult> Validate(ModelMetadata metadata, object container)
+        {
+            if (metadata.IsComplexType && metadata.Model == null)
+            {
+                return new List<ModelValidationResult> { new ModelValidationResult { MemberName = metadata.GetDisplayName(), Message = "请求参数对象不能为空。" } };
+            }
+
+            if (typeof(IValidatableObject).IsAssignableFrom(metadata.ModelType))
+            {
+                var validationResult = (metadata.Model as IValidatableObject).Validate(new ValidationContext(metadata.Model));
+                if (validationResult != null)
+                {
+                    var modelValidationResults = new List<ModelValidationResult>();
+                    foreach (var result in validationResult)
+                    {
+                        modelValidationResults.Add(new ModelValidationResult
+                        {
+                            MemberName = string.Join(",", result.MemberNames),
+                            Message = result.ErrorMessage
+                        });
+                    }
+
+                    return modelValidationResults;
+                }
+                return null;
+            }
+
+            return GetModelValidator(ValidatorProviders).Validate(metadata, container);
+        }
+    }
 }

+ 4 - 10
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -89,9 +89,6 @@
     <Reference Include="Microsoft.Owin.Hosting, Version=4.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Owin.Hosting.4.2.2\lib\net45\Microsoft.Owin.Hosting.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
-    </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
       <Private>True</Private>
@@ -127,6 +124,9 @@
     <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
     </Reference>
+    <Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
+    </Reference>
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Core" />
@@ -178,9 +178,6 @@
     <Reference Include="System.Web.Http.SelfHost, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.AspNet.WebApi.SelfHost.5.3.0\lib\net45\System.Web.Http.SelfHost.dll</HintPath>
     </Reference>
-    <Reference Include="System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll</HintPath>
-    </Reference>
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -189,9 +186,6 @@
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
-    <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL">
-      <HintPath>..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath>
-    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Api\EphHelper.cs" />
@@ -359,6 +353,7 @@
       <DependentUpon>CtrlXl.cs</DependentUpon>
     </Compile>
     <Compile Include="WebAPI\Controllers\BaseController.cs" />
+    <Compile Include="WebAPI\Controllers\DetectCgController.cs" />
     <Compile Include="WebAPI\Controllers\XlController.cs" />
     <Compile Include="WebAPI\Controllers\PosController.cs" />
     <Compile Include="WebAPI\DTO\Test.cs" />
@@ -397,7 +392,6 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <None Include="packages.config" />
-    <EmbeddedResource Include="Properties\licenses.licx" />
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>

+ 1 - 0
XdCxRhDW.App/packages.config

@@ -26,6 +26,7 @@
   <package id="Swashbuckle" version="5.6.0" targetFramework="net472" />
   <package id="Swashbuckle.Core" version="5.6.0" targetFramework="net472" />
   <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
+  <package id="System.ComponentModel.Annotations" version="5.0.0" targetFramework="net472" />
   <package id="System.Data.SQLite" version="1.0.118.0" targetFramework="net472" />
   <package id="System.Data.SQLite.Core" version="1.0.118.0" targetFramework="net472" />
   <package id="System.Data.SQLite.EF6" version="1.0.118.0" targetFramework="net472" />

+ 56 - 0
XdCxRhDw.Dto/CalcDto.cs

@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Markup;
+
+namespace XdCxRhDw.Dto
+{
+    /// <summary>
+    /// 参数估计计算参数DTo
+    /// </summary>
+    public class CalcDto
+    {
+        /// <summary>
+        /// 数据文件1
+        /// </summary>
+        public String file1 { get; set; }
+        /// <summary>
+        /// 数据文件2
+        /// </summary>
+        public String file2 { get; set; }
+
+        [Range(1, 5, ErrorMessage = "111")]
+        /// <summary>
+        /// 开始样点
+        /// </summary>
+        public int smpStart { get; set; }  
+        /// <summary>
+        /// 样点数
+        /// </summary>
+        public int smpCount { get; set; }      
+        /// <summary>
+        /// 采样率(Hz)
+        /// </summary>
+        public double samplingRate { get; set; } 
+        /// <summary>
+        /// 时差中心(us)
+        /// </summary>
+        public double dtCenter { get; set; } 
+        /// <summary>
+        /// 时差范围(us)
+        /// </summary>
+        public double dtRange { get; set; }   
+        /// <summary>
+        /// 频差范围(Hz)
+        /// </summary>
+        public double dfRange { get; set; } 
+        /// <summary>
+        /// 信噪比dB
+        /// </summary>
+        public double snrThreshold { get; set; }
+
+    }
+}

+ 56 - 0
XdCxRhDw.Dto/EstimationResDto.cs

@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDw.Dto
+{
+    /// <summary>
+    /// 参估结果DTO
+    /// </summary>
+    public class EstimationResDto
+    {
+        
+        /// <summary>
+        /// 相关时差,单位:us
+        /// </summary>
+        public double Dt { get; set; }
+
+        /// <summary>
+        /// 相关频差:单位:Hz
+        /// </summary>
+        public double Df { get; set; }
+
+        /// <summary>
+        /// 相关信噪比,单位:db
+        /// </summary>
+        public double Snr { get; set; }
+
+        /// <summary>
+        /// 耗时(s)
+        /// </summary>
+        public double Tm { get; set; }
+
+        /// <summary>
+        /// 开始样点
+        /// </summary>
+        public Int64 Smpstart { get; set; }
+
+        /// <summary>
+        /// 样点长度
+        /// </summary>
+        public Int64 Smplen { get; set; }
+
+        /// <summary>
+        /// 数据文件1
+        /// </summary>
+        public String File1 { get; set; }
+
+        /// <summary>
+        /// 数据文件2
+        /// </summary>
+        public String File2 { get; set; }
+
+    }
+}

+ 2 - 0
XdCxRhDw.Dto/XdCxRhDw.Dto.csproj

@@ -46,6 +46,8 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="CalcDto.cs" />
+    <Compile Include="EstimationResDto.cs" />
     <Compile Include="PosResQueryDto.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="SendDto.cs" />