Bladeren bron

添加两星一地流程

wyq 1 jaar geleden
bovenliggende
commit
8802c06f18

+ 1 - 0
XdCxRhDW.App/XdCxRhDW.App.csproj

@@ -437,6 +437,7 @@
     <EmbeddedResource Include="PopupControl\ShowCxCtrl.resx">
       <DependentUpon>ShowCxCtrl.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Properties\licenses.licx" />
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>

+ 4 - 1
XdCxRhDW.TaskServer/App.config

@@ -1,5 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
+	<connectionStrings>
+		<add name="MySql" connectionString="server=192.168.1.5;port=3306;database=mcms;user=root;password=123456" />
+	</connectionStrings>
 	<appSettings>
 		<!--服务ID-->
 		<add key="SvrID" value="001" />
@@ -8,7 +11,7 @@
 		<add key="LocalHttpPort" value="8920" />
 
 		<!--融合定位平台Http地址-->
-		<add key="PosPlatformAddr" value="http://127.0.0.1:8990" />
+		<add key="PosPlatformAddr" value="http://127.0.0.1:8091" />
 
 	</appSettings>
 	<startup>

+ 6 - 21
XdCxRhDW.TaskServer/Controllers/HistoryTaskProcessingController.cs

@@ -23,36 +23,21 @@ namespace XdCxRhDW.TaskServer.Controllers
         {
             try
             {
-                LogHelper.Info($"接收到历史任务:{dto.ID}");
+                LogHelper.Info($"接收到历史任务编号:{dto.ID}");
                 dto.StartTime = new DateTime(2024, 03, 24, 12, 00, 00);
                 dto.DateDirFormat = "yyyyMMddHH";
                 dto.CapDir = @"D:\\data";
+                dto.PosType = EnumPosTypeDto.X2D1;
+                dto.SigType = EnumSigTypeDto.DAMA;
                 if (!Directory.Exists(dto.CapDir))
                 {
                     LogHelper.Error($"采集路径:{dto.CapDir}不存在");
                     return Error($"采集路径:{dto.CapDir}不存在");
                 }
-              
-
-
-                switch (dto.PosType)
+                if (dto.PosType == EnumPosTypeDto.X2D1)
                 {
-                    case EnumPosTypeDto.X1D1CX:
-                        X1D1CXTask x1D1 = new X1D1CXTask();
-                        x1D1.Start(dto);
-                        break;
-                    case EnumPosTypeDto.X2D1:
-                        break;
-                    case EnumPosTypeDto.RH:
-                        break;
-                    case EnumPosTypeDto.X3TwoDto:
-                        break;
-                    case EnumPosTypeDto.X3TwoDfo:
-                        break;
-                    case EnumPosTypeDto.X2Dfo:
-                        break;
-                    default:
-                        break;
+                    X2D1Task x2D1 = new X2D1Task();
+                    x2D1.Start(dto);
                 }
 
                 return Success();

+ 3 - 2
XdCxRhDW.TaskServer/MainForm.cs

@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using System.Configuration;
 using System.Windows.Forms;
 using XdCxRhDW.Dto;
+using XdCxRhDW.TaskServer.Controllers;
 using XdCxRhDW.WebApi;
 
 namespace XdCxRhDW.TaskServer
@@ -32,8 +33,8 @@ namespace XdCxRhDW.TaskServer
         private async void MainForm_LoadAsync(object sender, EventArgs e)
         {
 
-           // HistoryTaskProcessingController historyTask = new HistoryTaskProcessingController();
-            //historyTask.Run(new HistoryTaskProcessingDto());
+            HistoryTaskProcessingController historyTask = new HistoryTaskProcessingController();
+           historyTask.Run(new HistoryTaskProcessingDto());
             var port = Convert.ToInt32(ConfigurationManager.AppSettings["LocalHttpPort"].Trim());
             var svrID = ConfigurationManager.AppSettings["SvrID"].Trim();
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();

+ 39 - 0
XdCxRhDW.TaskServer/Task/HistoryFile.cs

@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XdCxRhDW.TaskServer.Task
+{
+    public class HistoryFile
+    {
+        /// <summary>
+        /// 文件路径
+        /// </summary>
+        public string FilePath { get; set; }
+        /// <summary>
+        /// 采集时间
+        /// </summary>
+        public DateTime CapTime { get; set; }
+
+        /// <summary>
+        /// 通道1是上行频点,其余是下行频点
+        /// </summary>
+        public double FreqHz { get; set; }
+
+        /// <summary>
+        /// 采样率Hz
+        /// </summary>
+        public double FsHz { get; set; }
+
+        /// <summary>
+        /// 通道数
+        /// </summary>
+        public int Ch { get; set; }
+        /// <summary>
+        /// 卫星编号
+        /// </summary>
+        public int SatId { get; set; }
+    }
+}

+ 172 - 7
XdCxRhDW.TaskServer/Task/HistoryTaskI.cs

@@ -1,9 +1,14 @@
-using System;
+using DevExpress.Utils.Extensions;
+using DevExpress.XtraPrinting.Native.Properties;
+using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Configuration;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using XdCxRhDw;
 using XdCxRhDW.Dto;
 
 namespace XdCxRhDW.TaskServer.Task
@@ -11,27 +16,187 @@ namespace XdCxRhDW.TaskServer.Task
     public class HistoryTaskI
     {
 
-        protected internal virtual string posPlatformAddr => ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();
+        protected internal virtual string baseUrl => $"{ConfigurationManager.AppSettings["PosPlatformAddr"].Trim()}/api/";
+
+        protected internal virtual bool IsRuning { get; set; } = false;
+
+        //变采样
+        protected internal virtual int OutFsHz { get; set; } = 96000;
+
         public virtual void Start(HistoryTaskProcessingDto dto)
         {
         }
-
+        /// <summary>
+        /// 根据下行频点获取卫星Id
+        /// </summary>
+        /// <param name="freqdown"></param>
+        /// <returns></returns>
+        public int GetSatId(double freqdown)
+        {
+            // (洋区固定大写字母aì,不是数字1,查不到结果给出日志方便排查
+            string sql = $"select 卫星ID from freguencysatid where 下行 = '{freqdown}'and 洋区 = 'I' LIMIT 1";
+            sql = "SELECT id FROM role where id=1  LIMIT 1";
+            var res = MySqlTools.ExecuteScalar(System.Data.CommandType.Text, sql);
+            int satId = 0;
+            bool isInt = int.TryParse($"{res}", out satId);
+            if (!isInt)
+            {
+                LogHelper.Error($"下行频点{freqdown}未找到卫星编号");
+            }
+            return satId;
+        }
         public virtual void Stop()
-        { }
+        {
+            IsRuning = true;
+        }
 
         //检测
-        public virtual void DAMA()
+        public async Task<IEnumerable<DetectResDto>> DAMAAsync(DmcTypeDto dmc, double fsHz, string mFile)
         {
+            try
+            {
+                //主星变采样
+                var resampleRes = await ToResampleAsync((int)fsHz, mFile);
+
+                DetectDto dto = new DetectDto();
+                dto.dmcType = (DmcType)dmc;
+                dto.fsHz = resampleRes.OutFsHz;
+                dto.file1 = await UploadFileAsync("DAMA检测", resampleRes.File);
+#warning  信号带宽怎么获取
+                //dto.band = double.Parse(txtBand.Text);
+                var dmcResult = await HttpHelper.PostRequestAsync<IEnumerable<DetectResDto>>(baseUrl + "DetectCg/DetectCalc", dto);
+                if (dmcResult.code != 200)
+                {
+                    throw new Exception($"执行DAMA检测异常:{dmcResult.msg}");
+                }
+                else
+                {
+                    dmcResult.data.ForEach(m => m.File1 = resampleRes.File);
+                    return dmcResult.data;
+
+                }
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"信号检测出错:{ex.Message}");
+            }
         }
+        public async Task<ResampleResponseDto> ToResampleAsync(int fsHz, string file)
+        {
+            ResampleResponseDto dtores = new ResampleResponseDto();
+            dtores.File = file;
+            dtores.OutFsHz = fsHz;
+            string step = "变采样";
+            //不需要变采样
+            if (fsHz == OutFsHz)
+            {
+                return dtores;
+            }
+            string file1 = await UploadFileAsync(step, file);
+            ResampleRequestDto dto = new ResampleRequestDto()
+            {
+                File = file1,
+                FsHz = fsHz,
+            };
+            var response = await HttpHelper.PostRequestAsync<ResampleResponseDto>(baseUrl + "/DetectCg/Resample", dto, dto.TimeoutSeconds);
+            if (response.code == 200)
+            {
+                string downloadFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "download");
+                string outFile = Path.Combine(downloadFolder, Path.GetFileNameWithoutExtension(file1) + $"_Resample{response.data.OutFsHz}K.dat");
+                await DownloadFileAsync(step, response.data.File, outFile);
+
+                dtores.OutFsHz = response.data.OutFsHz;
+                dtores.File = outFile;
+                return dtores;
+            }
+            else
+            {
+                throw new Exception($"采样率:{fsHz}变采样{file}异常:{response.msg}");
+            }
 
+        }
+        public async Task<string> UploadFileAsync(string step, string file)
+        {
+            try
+            {
+                string file1 = await HttpHelper.UploadFileAsync(file, baseUrl + "File/UploadFileAsync");
+                return file1;
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"执行{step}上传文件异常:{ex.Message}");
+            }
+        }
+        public async Task<bool> DownloadFileAsync(string step, string Infile, string outFile)
+        {
+            try
+            {
+                return await HttpHelper.DownloadFileAsync(baseUrl, Infile, outFile);
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"执行{step}下载文件{Infile}异常:{ex.Message}");
+            }
+        }
         //CPU计算
-        public virtual void CPUCalc()
+        public async Task<CpuCgResDto> CPUCalcAsync(string file1, string file2, double fsHz, DetectResDto detect)
         {
+            string step = "CPU计算";
+            CpuCgDto dto = new CpuCgDto();
+            dto.file1 = await UploadFileAsync(step, file1);
+            dto.file2 = await UploadFileAsync(step, file2);
+            dto.smpCount = detect.Length;
+            dto.samplingRate = fsHz;
+            dto.dtCenter = 0;
+            dto.dtRange = 40000;
+            dto.smpStart = detect.Start;
+            dto.snrThreshold = 14;
+            try
+            {
+                var result = await HttpHelper.PostRequestAsync<CpuCgResDto>(baseUrl + "DetectCg/CpuCgCalc", dto);
+                if (result.code != 200)
+                {
+                    throw new Exception($"CPU文件参估出错,{result.msg}");
+
+                }
+                return result.data;
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"CPU文件参估出错,{ex.Message}");
+            }
         }
 
         //GPU计算
-        public virtual void GPUCalc()
+        public async Task<GpuCgResponseDto> GPUCalcAsync(string file1, string file2, double fsHz)
         {
+            string step = "GPU计算";
+            GpuCgRequestDto dto = new GpuCgRequestDto();
+            dto.file1 = await UploadFileAsync(step, file1);
+            dto.file2 = await UploadFileAsync(step, file2);
+            dto.smpCount = 0;
+            dto.samplingRate = fsHz;
+            dto.dtCenter = 0;
+            dto.dtRange = 10000;
+            dto.snrThreshold = 14;
+            try
+            {
+                var result = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", dto, dto.TimeoutSeconds);
+                if (result.code != 200)
+                {
+                    throw new Exception($"GPU文件参估出错,{result.msg}");
+                }
+
+                return result.data.Count > 0 ? result.data.First() : new GpuCgResponseDto();
+            }
+            catch (TaskCanceledException)
+            {
+                throw new Exception("GPU文件参估Http接口调用超时");
+            }
+            catch (Exception ex)
+            {
+                throw new Exception($"GPU文件参估出错{ex.Message}");
+            }
         }
 
 

+ 1 - 27
XdCxRhDW.TaskServer/Task/X1D1CXTask.cs

@@ -4,33 +4,7 @@ using XdCxRhDW.Dto;
 
 namespace XdCxRhDW.TaskServer.Task
 {
-    public class X1D1CXTask : HistoryTaskI
+    public class X1D1CXTask
     {
-        public override void Start(HistoryTaskProcessingDto dto)
-        {
-            System.Threading.Tasks.Task.Run(() =>
-            {
-                string capfile = Path.Combine(dto.CapDir, $"{dto.StartTime.ToString(dto.DateDirFormat)}");
-                //读取采集文件
-                //2024 01 31 10 10 51 000000000ch11xxхххххххххххххххххххххххххххFs}Hz {FreqUp}Hz xxxxxxxxxxxxx.dat
-                string fs = "";
-                foreach (var FreqHz in dto.FreqsHz)
-                {
-                    var ch1 = Directory.GetDirectories(capfile, $"*{dto.StartTime:yyyyMMddHHmmss}000000000ch11{fs}Hz {FreqHz}Hz.dat");
-                    var ch2 = Directory.GetDirectories(capfile, $"*{dto.StartTime:yyyyMMddHHmmss}000000000ch22{fs}Hz {FreqHz}Hz.dat");
-
-
-
-                }
-                //根据信号类型执行检测或参数估计 
-
-
-            });
-        }
-
-        public override void Stop()
-        {
-            throw new NotImplementedException();
-        }
     }
 }

+ 180 - 2
XdCxRhDW.TaskServer/Task/X2D1Task.cs

@@ -1,12 +1,190 @@
-using System;
+using DevExpress.Utils.About;
+using MySql.Data.MySqlClient;
+using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
+using System.Security.Policy;
 using System.Text;
 using System.Threading.Tasks;
+using XdCxRhDw;
+using XdCxRhDW.Dto;
+using ZstdSharp.Unsafe;
 
 namespace XdCxRhDW.TaskServer.Task
 {
-    public class X2D1Task
+    public class X2D1Task : HistoryTaskI
     {
+
+        public override void Start(HistoryTaskProcessingDto dto)
+        {
+            IsRuning = true;
+            System.Threading.Tasks.Task.Run(async () =>
+            {
+
+                DateTime preTime = dto.StartTime;
+
+                while (IsRuning || dto.EndTime.HasValue && dto.EndTime <= DateTime.Now)
+                {
+                    string capfile = Path.Combine(dto.CapDir, $"{preTime.ToString(dto.DateDirFormat)}");
+
+                    var files = Directory.EnumerateFiles(capfile, "*.dat");
+                    /* ch1 = 超短波信号
+                        ch2 = 主星
+                        ch3 = 邻1
+                        ch4 = 采集卡4通道采集没接信号的那一路,不用管这路文件*/
+                    var groups = files.Select(f => FileToHistoryFile(f)).GroupBy(m => m.CapTime).OrderBy(m => m.Key);
+                    foreach (var item in groups)
+                    {
+                        var finfos = item.ToList();
+                        if (finfos.Count < 3)
+                        {
+                            LogHelper.Info($"历史任务:{dto.ID}采集时刻:{finfos.First().CapTime:yyyy-MM-dd HH:mm:ss}文件数量只有{finfos.Count}个,不满足");
+                            continue;
+                        }
+                        //超短波信号
+                        var dinfo = finfos.First(m => m.Ch == 1);
+                        //主星
+                        var minfo = finfos.First(m => m.Ch == 2);
+                        //邻1
+                        var ninfo = finfos.First(m => m.Ch == 3);
+                        try
+                        {
+                            //根据信号类型执行检测或参数估计 
+                            if (dto.SigType == EnumSigTypeDto.Normal)
+                            {
+                                var xd = await GPUCalcAsync(minfo.FilePath, dinfo.FilePath, minfo.FsHz);
+                                var sx = await GPUCalcAsync(minfo.FilePath, ninfo.FilePath, minfo.FsHz);
+                                X2D1NoXlPosDto x2D1 = new X2D1NoXlPosDto()
+                                {
+                                    SigTime = minfo.CapTime,
+                                    MainCode = minfo.SatId,
+                                    AdjaCode = ninfo.SatId,
+                                    SxDto = sx.Dt * 1e6,
+                                    XdDto = xd.Dt * 1e6,
+                                    /* MainYbDto = Convert.ToDouble(items[2]) * 1e6,
+                                    /AdjaYbDto = Convert.ToDouble(items[3]) * 1e6,
+                                    SatTxLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "卫星接收天线", "Lon"),
+                                    SatTxLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "卫星接收天线", "Lat"),
+                                    CdbTxLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "超短波接收天线", "Lon"),
+                                    CdbTxLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "超短波接收天线", "Lat"),
+                                    RefLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "参考站", "Lon"),
+                                    RefLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "参考站", "Lat"),
+                                    FreqDown = 295.425e6,//For Api Test
+                                    FreqUp = 260.425e6,//For Api Test*/
+                                    XdDfo = xd.Df,
+                                    XdSnr = xd.Snr,
+                                    SxDfo = sx.Df,
+                                    SxSnr = sx.Snr,
+                                };
+
+                                await X2D1NoXlAsync(x2D1);
+                            }
+                            else
+                            {
+                                var mDetect = await DAMAAsync(DmcTypeDto.DAMA, minfo.FsHz, minfo.FilePath);
+                                var dfile = await ToResampleAsync((int)dinfo.FsHz, dinfo.FilePath);
+                                var nfile = await ToResampleAsync((int)ninfo.FsHz, ninfo.FilePath);
+                                foreach (var deitem in mDetect)
+                                {
+                                    var xd = await CPUCalcAsync(deitem.File1, dfile.File, dfile.OutFsHz, deitem);
+                                    var sx = await CPUCalcAsync(deitem.File1, nfile.File, nfile.OutFsHz, deitem);
+                                    X2D1NoXlPosDto x2D1 = new X2D1NoXlPosDto()
+                                    {
+                                        SigTime = minfo.CapTime.AddSeconds(deitem.Start / nfile.OutFsHz),
+                                        MainCode = minfo.SatId,
+                                        AdjaCode = ninfo.SatId,
+                                        SxDto = sx.Dt * 1e6,
+                                        XdDto = xd.Dt * 1e6,
+                                        /* MainYbDto = Convert.ToDouble(items[2]) * 1e6,
+                                        /AdjaYbDto = Convert.ToDouble(items[3]) * 1e6,
+                                        SatTxLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "卫星接收天线", "Lon"),
+                                        SatTxLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "卫星接收天线", "Lat"),
+                                        CdbTxLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "超短波接收天线", "Lon"),
+                                        CdbTxLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "超短波接收天线", "Lat"),
+                                        RefLon = IniFiles.ReadValue<double>("Station_Data2023.ini", "参考站", "Lon"),
+                                        RefLat = IniFiles.ReadValue<double>("Station_Data2023.ini", "参考站", "Lat"),
+                                        FreqDown = 295.425e6,//For Api Test
+                                        FreqUp = 260.425e6,//For Api Test*/
+                                        XdDfo = xd.Df,
+                                        XdSnr = xd.Snr,
+                                        SxDfo = sx.Df,
+                                        SxSnr = sx.Snr,
+                                    };
+
+                                    await X2D1NoXlAsync(x2D1);
+                                }
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            LogHelper.Info($"执行历史任务:{dto.ID}异常:{ex.Message}");
+                            continue;
+                        }
+
+                    }
+
+
+                    preTime = preTime.AddHours(1);
+                }
+
+
+            });
+        }
+
+        private async Task<bool> X2D1NoXlAsync(X2D1NoXlPosDto x2D1)
+        {
+            var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX2D1NoXlAsync", x2D1);
+            if (result.code != 200)
+            {
+                return false;
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 获取采集文件信息
+        /// </summary>
+        /// <param name="filePath"></param>
+        /// <returns></returns>
+        private HistoryFile FileToHistoryFile(string filePath)
+        {  //读取采集文件
+           //2024_01_31_10_01_51_000000000_ch11_-1__Nxx.xxxxxx_Exx.xxxxxx_xxxxx.xxxHz_xxx.xxxMHz_ch1_xd1.dat
+            HistoryFile historyFile = new HistoryFile();
+            historyFile.FilePath = filePath;
+            var fileName = Path.GetFileNameWithoutExtension(filePath);
+            var strs = fileName.Split(new string[] { "_", "MHz", "Hz", "ch" }, StringSplitOptions.RemoveEmptyEntries);
+
+            //采集时间
+            var datestr = string.Join("_", strs.Take(6));
+            historyFile.CapTime = DateTime.ParseExact(datestr, "yyyy_MM_dd_HH_mm_ss", null);
+
+            //采集通道
+            var chstr = strs.Skip(strs.Length - 2).Take(1).First();
+            int ch;
+            int.TryParse(chstr, out ch);
+
+            //采集频点
+            var freqstr = strs.Skip(strs.Length - 3).Take(1).First();
+            double freqMHz;
+            double.TryParse(freqstr, out freqMHz);
+
+            //采样率
+            var fsstr = strs.Skip(strs.Length - 4).Take(1).First();
+            double fsHz;
+            double.TryParse(fsstr, out fsHz);
+
+            historyFile.FreqHz = freqMHz * 1e6;
+            historyFile.Ch = ch;
+            historyFile.FsHz = fsHz;
+            if (ch > 1)
+            {
+                historyFile.SatId = GetSatId(historyFile.FreqHz);
+
+            }
+            return historyFile;
+
+        }
+
     }
 }

+ 1 - 0
XdCxRhDW.TaskServer/XdCxRhDW.TaskServer.csproj

@@ -158,6 +158,7 @@
     <Compile Include="MainForm.Designer.cs">
       <DependentUpon>MainForm.cs</DependentUpon>
     </Compile>
+    <Compile Include="Task\HistoryFile.cs" />
     <Compile Include="Task\HistoryTaskI.cs" />
     <Compile Include="Task\X1D1CXTask.cs" />
     <Compile Include="Task\X2D1Task.cs" />

+ 24 - 0
XdCxRhDw.Dto/EnumPosResTypeDto.cs

@@ -161,4 +161,28 @@ namespace XdCxRhDW.Dto
         [Display(Name = "DAMA信号")]
         DAMA,
     }
+    /// <summary>
+    /// 检测类型
+    /// </summary>
+    public enum DmcTypeDto
+    {
+        /// <summary>
+        /// DAMA检测
+        /// </summary>
+        [Display(Name = "DAMA检测")]
+        DAMA = 1,
+
+        /// <summary>
+        /// IBS检测
+        /// </summary>
+        [Display(Name = "IBS检测")]
+        IBS = 2,
+
+        /// <summary>
+        /// 能量检测
+        /// </summary>
+        [Display(Name = "能量检测")]
+        Ky5758 = 3
+    }
+
 }

+ 4 - 1
XdCxRhDw.Dto/HistoryTaskProcessingDto.cs

@@ -35,7 +35,7 @@ namespace XdCxRhDW.Dto
         /// <summary>
         /// 结束时间
         /// </summary>
-        public DateTime EndTime { get; set; }
+        public DateTime? EndTime { get; set; }
 
         /// <summary>
         /// 日期目录格式(yyyy-MM-dd等格式)
@@ -54,5 +54,8 @@ namespace XdCxRhDW.Dto
 
         [Display(Name = "信号类型")]
         public EnumSigTypeDto SigType { get; set; }
+
+        [Display(Name = "检测类型")]
+        public DmcTypeDto DmcType { get; set; }
     }
 }