yg 4 months ago
parent
commit
0a1becd049

+ 7 - 1
AdService/AdService.csproj

@@ -5,7 +5,7 @@
 	<ImplicitUsings>enable</ImplicitUsings>
 	<Nullable>disable</Nullable>
 	<GenerateDocumentationFile>True</GenerateDocumentationFile>
-	<RootNamespace>AdService.Controller</RootNamespace>
+	<RootNamespace>AdService</RootNamespace>
   </PropertyGroup>
 
   <ItemGroup>
@@ -17,4 +17,10 @@
     <ProjectReference Include="..\DW5S.WebApi\05.DW5S.WebApi.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <None Update="test.dat">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
 </Project>

+ 37 - 4
AdService/Controllers/AdController.cs

@@ -1,5 +1,4 @@
-using DW5S.WebApi;
-using Microsoft.AspNetCore.Mvc;
+using AdService.Service;
 
 namespace AdService.Controllers
 {
@@ -10,16 +9,50 @@ namespace AdService.Controllers
     public class AdController : BaseController
     {
 
+        ILogger logger { get; set; }
+
+        private AdcService AdcService { get; set; }
 
         /// <summary>
         /// 开始采集
         /// </summary>
         /// <returns></returns>
         [HttpPost]
-        public string StartAD()
+        public async Task<AjaxResult<AdcResultDto>> StartAd(List<AdCard> dtos)
         {
-            return "aaaaaaaaaaa";
+            try
+            {
+                var res = await AdcService.Instance.StartTestAsync(dtos);
+
+                return Success(res);
+
+            }
+            catch(Exception ex)
+            {
+                return Error<AdcResultDto>("开始采集异常:"+ex.Message);
+            }
         }
 
+
+        /// <summary>
+        /// 停止采集
+        /// </summary>
+        [HttpPost]
+        public async Task<AjaxResult> StopAdc()
+        {
+            var res = await Task.Run(() =>
+            {
+                try
+                {
+                    AdcService.Instance.StopAd();
+                    return Success();
+                }
+                catch (Exception ex)
+                {
+                    return Error("停止采集异常:"+ex.Message);
+                }
+            });
+            return res;
+        }
     }
 }

+ 5 - 6
AdService/Controllers/AdFileController.cs

@@ -1,6 +1,4 @@
-using DW5S.WebApi;
-using Microsoft.AspNetCore.Mvc;
-
+
 namespace AdService.Controller.Controllers
 {
 
@@ -10,12 +8,13 @@ namespace AdService.Controller.Controllers
     public class AdFileController : BaseController
     {
         /// <summary>
-        /// 下载采集文件
+        /// 下载采集文件
         /// </summary>
         /// <param name="fileName">采集返回的名称</param>
+        /// <param name="path">采集返回的文件路径</param>
         /// <returns></returns>
         [HttpGet]
-        public IActionResult Download(string fileName)
+        public IActionResult Download(string path,string fileName)
         {
             if (string.IsNullOrWhiteSpace(fileName))
             {
@@ -23,7 +22,7 @@ namespace AdService.Controller.Controllers
             }
             if (fileName.StartsWith("/"))
                 fileName = fileName.Substring(1);
-            string localFile = Path.Combine("D:\\work", fileName);
+            string localFile = Path.Combine(path, fileName);
             try
             {
                 if (!System.IO.File.Exists(localFile))

+ 29 - 0
AdService/Dto/AdConfig.cs

@@ -0,0 +1,29 @@
+namespace AdService.Controller.Dto
+{
+    /// <summary>
+    /// 采集服务配置
+    /// </summary>
+    [Serializable]
+    public class AdConfig
+    {
+        /// <summary>
+        /// 数据存储目录
+        /// </summary>
+        public string DataDir { get; set; }
+
+        /// <summary>
+        /// 清理目录
+        /// </summary>
+        public string ClearDir { get; set; }
+
+        /// <summary>
+        /// 磁盘可用空间百分比
+        /// </summary>
+        public float ClearCondition { get; set; }
+
+        /// <summary>
+        /// 删除{ClearHours}小时的数据
+        /// </summary>
+        public int ClearHours { get; set; }
+    }
+}

+ 3 - 30
AdService/Program.cs

@@ -1,31 +1,4 @@
-var builder = WebApplication.CreateBuilder(args);
-
-// Add services to the container.
-
-builder.Services.AddControllers();
-// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
-builder.Services.AddEndpointsApiExplorer();
-builder.Services.AddSwaggerGen();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if (app.Environment.IsDevelopment())
-{
-    app.UseSwagger();
-    app.UseSwaggerUI();
-}
-
-app.UseHttpsRedirection();
-
-app.UseAuthorization();
-
-app.MapControllers();
-
-app.Run();
-
-
-/*WebApiHelper.Start(_localPort: 7011,
+WebApiHelper.Start(_localPort: 7011,
                dtoXmlName: "02.DW5S.DTO.xml",
-               controllerXmlName: "AdService.Controller.xml",
-               dllKey: "DW5S");*/
+               controllerXmlName: "AdService.xml",
+               dllKey: "DW5S");

+ 28 - 18
AdService/Service/AdReportService.cs

@@ -1,5 +1,4 @@
-using DW5S.DTO;
-
+
 namespace AdService.Service
 {
 
@@ -8,29 +7,40 @@ namespace AdService.Service
     /// </summary>
     public class AdReportService : BackgroundService
     {
+        ILogger logger { get; set; }
+
         /// <summary>
-        /// 服务上报服务
+        /// 采集服务上报
         /// </summary>
         protected override async Task ExecuteAsync(CancellationToken stoppingToken)
         {
-            
-            await Task.Run(async () =>
+            try
             {
-                while (!stoppingToken.IsCancellationRequested)
+                await Task.Delay(5000, stoppingToken);//延迟一会儿让webbapi先启动
+                stoppingToken.ThrowIfCancellationRequested();
+                await Task.Run(async () =>
                 {
-                    SvrStateReportDto dto = new SvrStateReportDto()
-                    {
-                        DD = TimeSpan.FromSeconds(1),
-                        SvrType = EnumSvrType.AdCgSvr,
-                        SvrID = "AdService",
-                        BaseHttpAddr = "",
-                        SwaggerAddr="",
-                        ReportType = 0,
-                    };
-                    // var res = await HttpHelper.PostRequestAsync<CpuCgResDto>("" + "SvrReport/Report", dto);
-                    await Task.Delay(3 * 1000, stoppingToken);
+                    while (!stoppingToken.IsCancellationRequested)
+                    {                 
+                        SvrStateReportDto dto = new SvrStateReportDto()
+                        {
+                            DD = TimeSpan.FromSeconds(1),
+                            SvrType = EnumSvrType.AdCgSvr,
+                            SvrID = "AdService",
+                            BaseHttpAddr = "",
+                            SwaggerAddr = "",
+                            ReportType = 0,
+                        };
+                        //var res = await HttpHelper.PostRequestAsync<SvrStateReportDto>("采集服务上报地址", dto);
+                         logger.LogInformation("测试时间轮询3s");
+                        await Task.Delay(3 * 1000, stoppingToken);                   
+                    }
+                }, stoppingToken);
                 }
-            }, stoppingToken);
+            catch (Exception ex)
+            {
+                //logger.LogError("采集服务状态上报异常:" + ex.Message);
+            }
         }
 
     }

+ 0 - 9
AdService/Service/AdService.cs

@@ -1,9 +0,0 @@
-namespace AdService.Service
-{
-    /// <summary>
-    /// 采集服务
-    /// </summary>
-    public class AdService
-    {
-    }
-}

+ 89 - 0
AdService/Service/AdcService.cs

@@ -0,0 +1,89 @@
+
+namespace AdService.Service
+{
+    /// <summary>
+    /// 采集服务
+    /// </summary>
+    public class AdcService
+    {
+        /// <summary>
+        /// 单例
+        /// </summary>
+        public static AdcService Instance { get; private set; } = new AdcService();
+
+        private bool isBusy = false;
+
+        //是否持续采集
+        private bool isSustain = true;
+
+        /// <summary>
+        /// 启动采集(无采集卡)
+        /// </summary>
+        /// <param name="dtos"></param>
+        /// <returns></returns>
+        public async Task<AdcResultDto> StartTestAsync(List<AdCard> dtos)
+        {
+            if (isBusy)
+            {
+                throw new Exception("上次采集未结束");
+            }
+            try
+            {
+                isBusy = true;
+                string test = Path.Combine(Directory.GetCurrentDirectory(), "test.dat");//测试数据
+                var bytes = File.ReadAllBytes(test);
+                AdcResultDto adcResult = new AdcResultDto(DateTime.Now);
+                await Task.Run(() =>
+                {
+                    while (isSustain)
+                    {
+                        List<SignalFile> signalFiles = new List<SignalFile>();
+                        string addate = Path.Combine("D:\\work\\data", DateTime.Now.ToString("yyyyMMdd_HH"));//20250307_10
+                        Directory.CreateDirectory(addate);
+                        foreach (var item in dtos)
+                        {
+                            for (int i = 0; i < item.AdChannels.Count; i++)
+                            {
+                                var fsad = item.ClockFreq / item.Mutil;
+                                SignalFile signal = new SignalFile()
+                                {
+                                    AdCardID = item.AdChannels[i].AdCardID.ToString(),
+                                    ChNum = item.AdChannels[i].ChNum,
+                                    Fs = (int)fsad,
+                                    SatInfoID = item.AdChannels[i].SatInfoID.ToString(),
+                                    SigTime = DateTime.Now,
+                                    DirName = "D:\\work\\data",
+                                };
+                                File.WriteAllBytes(Path.Combine("D:\\work\\data", signal.DateDirName, signal.FileName), bytes);
+                              
+                                signalFiles.Add(signal);
+                            }
+                            adcResult.FileList = signalFiles;
+                        }
+
+                        Thread.Sleep(1000 * 15);
+                    }
+
+                });
+                return adcResult;
+            }
+            finally
+            {
+                await Task.Delay(5000);
+                isBusy = false;
+            }
+
+        }
+
+
+        /// <summary>
+        /// 停止采集
+        /// </summary>
+        public void StopAd()
+        {
+            isSustain = false;
+        }
+
+
+    }
+}

+ 153 - 5
AdService/Service/CearDirService.cs

@@ -1,4 +1,5 @@
-using DW5S.DTO;
+using AdService.Controller.Dto;
+using Newtonsoft.Json;
 
 namespace AdService.Service
 {
@@ -14,14 +15,161 @@ namespace AdService.Service
         protected override async Task ExecuteAsync(CancellationToken stoppingToken)
         {
 
-            await Task.Run(async () =>
+            await Task.Delay(5000, stoppingToken);//延迟一会儿让webbapi先启动
+            //IpsLogger.Info($"启动采集专用目录数据清理功能...");
+           /* await Task.Run(async () =>
             {
+                #region 读取清理目录配置信息
+                StreamReader sr = new StreamReader(Directory.GetCurrentDirectory()+"appsettings.json");
+                string json = sr.ReadToEnd();
+                // 解析 JSON 字符串
+                var adConfig = JsonConvert.DeserializeObject<AdConfig>(json);
+                string dataClearStr = adConfig.ClearDir;
+                var dataClears = dataClearStr.Split(new string[] { ";", ";" }, StringSplitOptions.RemoveEmptyEntries)
+                .Select(p => p.ToLower()).ToList();
+                if (!dataClears.Contains(adConfig.DataDir))
+                    dataClears.Add(adConfig.DataDir);
+                #endregion
+
+                #region 检测有效的清理目录并读取清理条件
+                List<string> list = new List<string>();
+                foreach (var item in dataClears)
+                {
+                    var root = Path.GetPathRoot(item);
+                    DriveInfo drive = new DriveInfo(root);
+                    if (!drive.IsReady)
+                    {
+                        continue;
+                    }
+                    if (Directory.Exists(item))
+                    {
+                        list.Add(item);
+                    }
+                }
+                if (!list.Any())
+                {
+                    //IpsLogger.Warn($"配置文件中的数据清理目录无效");
+                    return;
+                }
+                float maxPercent = adConfig.ClearCondition;
+                var clearHours = adConfig.ClearHours;
+                if (clearHours < 1)
+                {
+                    clearHours = 1;
+                }
+                //IpsLogger.Info($"已启动目录[{string.Join(";", list)}]自动清理,清理条件=可用空间不足{(int)(maxPercent * 100)}%");
+                #endregion
+
+
+                //缓存每个目录上次清理的文件最大的一个写入时间
+                var prevClearTime = new Dictionary<string, DateTime>();
+                foreach (var item in list)
+                {
+                    prevClearTime[item] = DateTime.MinValue;
+ 
+                }
                 while (!stoppingToken.IsCancellationRequested)
                 {
-                   
-                    await Task.Delay(3 * 1000, stoppingToken);
+                   // IpsLogger.Info($"开始数据清理...");
+
+                    #region 从上次开始每个目录清理一定的数据(ClearHours)
+                    int delFileCount = 0;
+                    try
+                    {
+                        var driveFolders = list.GroupBy(m => Path.GetPathRoot(m).ToUpper());
+                        foreach (var driveFolder in driveFolders)//like D:\ E:\
+                        {
+                            if (stoppingToken.IsCancellationRequested) break;
+                            DriveInfo drive = new DriveInfo(driveFolder.Key);
+
+                            while (drive.TotalFreeSpace / (drive.TotalSize * 1.0f) <= maxPercent)
+                            {
+                                foreach (var item in driveFolder)//like D:\data E:\data
+                                {
+                                    //IpsLogger.Info($"正在清理[{item}]中的数据...");
+                                    var fsList = Directory.EnumerateFiles(item, "*", SearchOption.AllDirectories).Select(p => new FileInfo(p));
+                                    if (!fsList.Any())
+                                    {
+                                     // IpsLogger.Warn($"{drive.ToString().Substring(0, 1)}盘空间不足,但目录{item}没有数据,跳过此目录");
+                                    }
+                                    else
+                                    {
+                                        if (prevClearTime[item] == DateTime.MinValue)
+                                            prevClearTime[item] = fsList.Min(p => p.LastWriteTime);
+                                        var maxTime = prevClearTime[item].AddHours(clearHours);
+                                        if (maxTime <= prevClearTime[item])
+                                        {
+                                            //clearHours配置为0或负数时一次删所有文件
+                                            maxTime = DateTime.MaxValue;
+                                        }
+                                        //每次清理从上次清理结束时间开始,防止有些删不掉的文件阻止删除文件
+                                        var clearFiles = fsList.Where(m => m.LastWriteTime >= prevClearTime[item] && m.LastWriteTime <= maxTime).OrderBy(m => m.LastWriteTime);
+                                        foreach (var fsItem in clearFiles)
+                                        {
+                                            try
+                                            {
+                                                if (stoppingToken.IsCancellationRequested) break;
+                                                fsItem.Delete();
+                                                delFileCount++;
+                                            }
+                                            catch (Exception ex)
+                                            {
+                                               // IpsLogger.Error($"删除文件{fsItem.Name}出错", ex);
+                                            }
+                                        }
+                                        prevClearTime[item] = maxTime;
+
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        //IpsLogger.Error($"清理数据异常", ex);
+                    }
+                    #endregion
+
+                    #region 清理空目录
+                    int delDirCount = 0;
+                    foreach (var name in list)
+                    {
+                        string clearDir = Path.Combine(AppContext.BaseDirectory, name);
+                        try
+                        {
+                            var dirs = Directory.EnumerateDirectories(clearDir, "*", SearchOption.AllDirectories);
+                            foreach (var item in dirs)
+                            {
+                                DirectoryInfo dir = new DirectoryInfo(item);
+                                if (dir.EnumerateFiles().Any()) continue;
+                                //删除5分钟以前创建的空目录
+                                if ((DateTime.Now - dir.CreationTime).TotalMinutes > 5)
+                                {
+
+                                    try
+                                    {
+                                        dir.Delete();
+                                        delDirCount++;
+                                    }
+                                    catch (Exception ex)
+                                    {
+                                        //IpsLogger.Error($"删除空目录{dir.Name}异常", ex);
+                                    }
+                                }
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+                            //IpsLogger.Error($"删除{name}目录中的空目录出错", ex);
+                        }
+                    }
+                    #endregion
+
+                   // IpsLogger.Info($"本次清理数据结束,删除{delFileCount}个文件,删除{delDirCount}个空目录");
+
+                    await Task.Delay(5 * 60 * 1000, stoppingToken);
                 }
-            }, stoppingToken);
+            }, stoppingToken);*/
         }
 
 

+ 14 - 7
AdService/appsettings.json

@@ -1,9 +1,16 @@
 {
-  "Logging": {
-    "LogLevel": {
-      "Default": "Information",
-      "Microsoft.AspNetCore": "Warning"
-    }
-  },
-  "AllowedHosts": "*"
+	//数据存储目录,当外部未指定目录时使用此目录
+	"DataDir": "D:\\data",
+
+	//数据清理目录(多个目录用分号隔开,数据存储目录会自动加入清理计划,不用配置)
+	"ClearDir": "D:\\data1",
+
+	//磁盘可用空间百分比不足此数时开始清理
+	"ClearCondition": 0.2,
+
+	//每次达到清理条件时最多删除{ClearHours}小时的数据,为0时每次删除所有文件
+	"ClearHours": 1,
+
+	//采集服务上报地址
+	"AdcReportAddr": ""
 }

+ 4 - 0
AdService/globalusings.cs

@@ -0,0 +1,4 @@
+global using Microsoft.AspNetCore.Mvc;
+global using DW5S.DTO;
+global using DW5S.Entity;
+global using DW5S.WebApi;

+ 3 - 0
AdService/test.cmd

@@ -0,0 +1,3 @@
+chcp 65001
+sc create 采集服务 binpath= %cd%\AdService.exe start= auto displayname= "采集服务 "
+pause

BIN
AdService/test.dat


+ 10 - 1
DW5S.App/UserControl/CtrlSvrs.cs

@@ -50,7 +50,16 @@ namespace DW5S.App.UserControl
                 gridView1.Columns[nameof(SvrViewModel.SwaggerAddr)].ColumnEdit = linkEdit;
                 gridView1.Columns[nameof(SvrViewModel.SwaggerAddr)].OptionsColumn.AllowEdit = true;
             }
-            this.list.AddRange(ServerContext.Instance.GetAll().To<List<SvrViewModel>>());
+            List<SvrViewModel> svrList = new List<SvrViewModel>();
+            SvrViewModel svr = new SvrViewModel()
+            {
+                SvrType = EnumSvrType.AdCgSvr,
+                SvrID = "10001",
+                ReportTime = DateTime.Now,
+            };
+            svrList.Add(svr);
+            //this.list.AddRange(ServerContext.Instance.GetAll().To<List<SvrViewModel>>());
+            this.list.AddRange(svrList);
             gridView1.RefreshData();
             Messenger.Defalut.Sub<List<SvrViewModel>>("服务集合改变", RefreshSvr);
             var unitOfWork = IocContainer.UnitOfWork;

BIN
DW5S.App/dw5s.db


+ 44 - 0
DW5S.DTO/AdcResultDto.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DW5S.DTO
+{
+    /// <summary>
+    /// 采集结果
+    /// </summary>
+    [Serializable]
+    public class AdcResultDto
+    {
+
+        /// <summary>
+        /// 采集结果
+        /// </summary>
+        public AdcResultDto()
+        {
+            FileList = new List<SignalFile>();
+        }
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        public AdcResultDto(DateTime startTime) : this()
+        {
+            StartTime = startTime;
+        }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+
+        /// <summary>
+        /// 文件列表
+        /// </summary>
+        public List<SignalFile> FileList { get; set; }
+
+    }
+}

+ 207 - 0
DW5S.DTO/SignalFileDto.cs

@@ -0,0 +1,207 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DW5S.DTO
+{
+    /// <summary>
+    /// 信号文件
+    /// </summary>
+    public class SignalFile
+    {
+        public const string SigTimeFolderFormat = "yyyyMMdd_HH";
+        public const string SigTimeFileFormat = "yyyyMMddHHmmss";
+        public const string SigFreqFormat = "#######0.000###";
+        public const string BandWidthFormat = "######0.###";
+
+        /// <summary>
+        /// 信号文件实体类
+        /// </summary>
+        public SignalFile()
+        {
+        }
+
+        /// <summary>
+        /// 信号时间
+        /// </summary>
+        public DateTime SigTime { get; set; }
+
+        /// <summary>
+        /// 信号频点
+        /// </summary>
+        public long SigFreq { get; set; }
+
+        /// <summary>
+        /// 信号带宽
+        /// </summary>
+        public int BandWidth { get; set; }
+
+        /// <summary>
+        /// 采样率
+        /// </summary>
+        public int Fs { get; set; }
+
+        /// <summary>
+        /// 接收站编码
+        /// </summary>
+        public string SiteCode { get; set; }
+
+        /// <summary>
+        /// 采集卡编码
+        /// </summary>
+        public string AdCardID { get; set; }
+
+        /// <summary>
+        /// 采集通道编号
+        /// </summary>
+        public int ChNum { get; set; }
+
+        /// <summary>
+        /// 卫星编号
+        /// </summary>
+        public string SatInfoID { get; set; }
+
+        /// <summary>
+        /// 日志目录(E:\data)
+        /// </summary>
+        public string DirName { get; set; }
+
+        /// <summary>
+        /// 日期目录名称(20241129_13)
+        /// </summary>
+        public string DateDirName => SigTime.ToString(SigTimeFolderFormat);
+
+
+        /// <summary>
+        /// 文件名称(xxx.dat)
+        /// </summary>
+        public string FileName => GetFileName(SigTime, SigFreq, BandWidth, Fs, SiteCode, AdCardID, ChNum, SatInfoID);
+
+        /// <summary>
+        /// http下载文件名称(http://127.0.0.1/data/xxx.dat)
+        /// </summary>
+        public string HttpFile { get; set; }
+
+        /// <summary>
+        /// 获取文件全路径
+        /// </summary>
+        public string GetLocalFullName()
+        {
+            return FileName;
+        }
+
+        /// <summary>
+        /// 获取文件全路径
+        /// </summary>
+        public string GetLocalFullPath()
+        {
+            string fullName = Path.Combine(DirName, DateDirName, FileName);
+            return fullName;
+        }
+        /// <summary>
+        /// 将文件名转换为信号文件对象
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public static SignalFile Parse(string input)
+        {
+            if (string.IsNullOrWhiteSpace(input)) return null;
+            input = Path.GetFileNameWithoutExtension(input);
+            var items = input.Split('_');
+
+            var result = new SignalFile();
+            DateTime sigTime;
+            if (DateTime.TryParseExact(items[0], SigTimeFileFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out sigTime))
+            {
+                result.SigTime = sigTime;
+            }
+            foreach (var item in items)
+            {
+                var key = item[0];
+                var val = item.Substring(1);
+                switch (key)
+                {
+                    case 'F':
+                        result.SigFreq = double.TryParse(val, out double sigFreq) ? (long)Math.Round(sigFreq * 1e6, 0) : 0L;
+                        break;
+                    case 'W':
+                        result.BandWidth = double.TryParse(val, out double bandWidth) ? (int)Math.Round(bandWidth * 1e3) : 0;
+                        break;
+                    case 'C':
+                        result.Fs = int.TryParse(val, out int fs) ? fs : 0;
+                        break;
+                    case 'R':
+                        result.SiteCode = val;
+                        break;
+                    case 'K':
+                        result.AdCardID = val;
+                        break;
+                    case 'T':
+                        result.ChNum = int.TryParse(val, out int chNum) ? chNum : 0;
+                        break;
+                    case 'S':
+                        result.SatInfoID = val;
+                        break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 获取文件名称
+        /// </summary>
+        /// <param name="sigTime">信号时间</param>
+        /// <param name="sigFreq">信号频点</param>
+        /// <param name="bandWidth">信号带宽</param>
+        /// <param name="fs">采样率</param>
+        /// <param name="satNum">卫星编号</param>
+        /// <param name="siteCode">站点编码</param>
+        /// <param name="adcCode">采集卡编码</param>
+        /// <param name="chNum">通道号</param>
+        /// <param name="nullText">值为空时的替换符</param>
+        /// <returns></returns>
+        public static string GetFileName(DateTime? sigTime, long? sigFreq, int? bandWidth, int? fs, string siteCode, string adcCode, int? chNum, string satNum, string nullText = "")
+        {
+            string sigTimeText = sigTime.HasValue ? sigTime.Value.ToString(SigTimeFileFormat) : nullText;
+            string sigFreqText = sigFreq.HasValue && sigFreq > 0 ? "_F" + Math.Round(sigFreq.Value * 1e-6, 6).ToString(SigFreqFormat) : nullText;
+            string bandWidthText = bandWidth.HasValue && bandWidth > 0 ? "_W" + Math.Round(bandWidth.Value * 1e-3, 3).ToString(BandWidthFormat) : nullText;
+            string fsText = fs.HasValue && fs > 0 ? "_C" + fs.Value.ToString() : nullText;
+            string siteCodeText = !string.IsNullOrWhiteSpace(siteCode) ? "_" + siteCode.Trim() : nullText;
+            string adcCodeText = !string.IsNullOrWhiteSpace(adcCode) ? "_" + adcCode.Trim() : nullText;
+            string chNumText = chNum.HasValue && chNum > 0 ? $"_T{chNum}" : nullText;
+            string satNumText = !string.IsNullOrWhiteSpace(satNum) ? "_S" + satNum.Trim() : nullText;
+            return string.Concat(sigTimeText, sigFreqText, bandWidthText, fsText, siteCodeText, adcCodeText, chNumText, satNumText, ".dat");
+        }
+
+        /// <summary>
+        /// 创建信号文件基础信息
+        /// </summary>
+        /// <param name="sigTime">信号时间</param>
+        /// <param name="sigFreq">信号频点</param>
+        /// <param name="bandWidth">信号带宽</param>
+        /// <param name="fs">采样率(个)</param>
+        /// <param name="satNum">卫星编号</param>
+        /// <param name="siteCode">站点编码</param>
+        /// <param name="adcCode">采集卡编码</param>
+        /// <param name="chNum">通道号</param>
+        /// <returns></returns>
+        public static SignalFile Create(DateTime sigTime, long sigFreq, int bandWidth, int fs, string siteCode, string adcCode, int chNum, string satNum)
+        {
+            var result = new SignalFile()
+            {
+                SigTime = sigTime,
+                SigFreq = sigFreq,
+                BandWidth = bandWidth,
+                Fs = fs,
+                SiteCode = siteCode,
+                AdCardID = adcCode,
+                ChNum = chNum,
+                SatInfoID = satNum
+            };
+            return result;
+        }
+    }
+}

+ 1 - 10
DW5S.Entity/ADEntity/AdCard.cs

@@ -1,13 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Channels;
-using System.Threading.Tasks;
-
-namespace DW5S.Entity
+namespace DW5S.Entity
 {
     public class AdCard : BaseEntity<int>
     {

+ 0 - 5
DW5S.Entity/ADEntity/AdChannel.cs

@@ -1,11 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
 namespace DW5S.Entity
 {
     public class AdChannel : BaseEntity<int>

+ 5 - 5
DW5S.ViewModel/AdCardViewModel.cs

@@ -40,10 +40,10 @@ namespace DW5S.ViewModel
         public double DdcFreq { get; set; }
 
        
-        [Display(Name = "抽取倍数)")]
+        [Display(Name = "抽取倍数")]
         public int Mutil { get; set; }
        
-        [Display(Name = "存储路径)")]
+        [Display(Name = "存储路径")]
         public string StorePath { get; set; }
 
        
@@ -51,16 +51,16 @@ namespace DW5S.ViewModel
         [Display(Name = "采集启用状态)", AutoGenerateField =false)]
         public bool Enable { get; set; }
 
-        [Display(Name = "采集启用状态)")]
+        [Display(Name = "采集启用状态")]
         public string EnableStr => Enable ? "启用" : "禁用";
 
         /// <summary>
         /// 站点服务状态
         /// </summary>
-        [Display(Name = "采集服务状态)")]
+        [Display(Name = "采集服务状态")]
         public EnumServerStatus ServerStatus { get; set; }
 
-        [Display(Name = "采集通道)")]
+        [Display(Name = "采集通道")]
         public List<AdChannelViewModel> AdChannels { get; set; } = new List<AdChannelViewModel>();
     }
 }

+ 2 - 3
DW5S.ViewModel/SigViewModel.cs

@@ -28,8 +28,7 @@ namespace DW5S.ViewModel
         [Display(Name = "门限(dB)")]
         public double Snr { get; set; }
 
-
-        [Display(Name = "带宽(Hz)")]
+        [Display(Name = "采样率(Hz)")]
         public int Band { get; set; }
 
         [Display(Name = "是否是固定站", AutoGenerateField = false)]
@@ -37,7 +36,7 @@ namespace DW5S.ViewModel
 
         public override string ToString()
         {
-            return $"上行{FreqUpDis}MHz 下行{FreqDownDis}MHz 带宽{Band}Hz";
+            return $"上行{FreqUpDis}MHz 下行{FreqDownDis}MHz 采样率{Band}Hz";
         }
     }
 }

+ 3 - 2
DW5S.WebApi/WebApiHelper.cs

@@ -45,7 +45,7 @@ namespace DW5S.WebApi
         /// <param name="staticDir">要启用的静态目录预览及文件下载的目录(已经包含upload、download、logs三个目录)</param>
         /// <param name="dllKey">使用DI注入时程序集标识</param>
         /// <exception cref="Exception"></exception>
-        public  static void Start(int _localPort, string dtoXmlName = null, string[] staticDir = null, string controllerXmlName = null, string dllKey = "DW5S")
+        public static void Start(int _localPort, string dtoXmlName = null, string[] staticDir = null, string controllerXmlName = null, string dllKey = "DW5S")
         {
             BaseController.EnsureAssemblyLoaded();
             _cts = new CancellationTokenSource();
@@ -305,7 +305,8 @@ namespace DW5S.WebApi
              app.RunAsync(_cts.Token);
             //app.Run();
         }
-
+       
+       
         /// <summary>
         /// 结束WebAPI
         /// </summary>