zoulei 1 жил өмнө
parent
commit
d61c9cc396

+ 7 - 8
Service/X2D1TaskServer54/Controllers/X2D1NoRefTaskProcessingController.cs → Service/X2D1TaskServer54/Controllers/X3NoRefTaskProcessingController.cs

@@ -12,16 +12,16 @@ using X3TaskServer54.Service;
 namespace X3TaskServer54.Controllers
 {
     /// <summary>
-    ///离线任务处理接口
+    ///三星任务处理接口
     /// </summary>
-    public class X2D1NoRefTaskProcessingController : BaseController
+    public class X3NoRefTaskProcessingController : BaseController
     {
         /*******************
          * !!!不要在Controller中放业务逻辑的全局变量(每次调用Http接口Controller都可能是一个新的对象)
          * Controller主要就是调用Service层的东西。Service层执行业务逻辑和调用Repository层操作数据库
          * ********************/
-        private readonly HistoryTaskService _service;
-        public X2D1NoRefTaskProcessingController(HistoryTaskService service)
+        private readonly TaskService _service;
+        public X3NoRefTaskProcessingController(TaskService service)
         {
             _service = service;
         }
@@ -59,15 +59,14 @@ namespace X3TaskServer54.Controllers
         {
             try
             {
-
-                LogHelper.Warning($"接收停止历史任务编号:{dto.ID}");
+                LogHelper.Warning($"用户停止了任务,ID={dto.ID}");
                 _service.Stop();
                 return Success();
             }
             catch (Exception ex)
             {
-                Serilog.Log.Error(ex, "停止历史任务处理出错!");
-                return Error("停止历史任务处理出错");
+                Serilog.Log.Error(ex, $"【任务{dto.ID}】停止执行异常!");
+                return Error($"【任务{dto.ID}】停止执行异常!");
             }
         }
 

+ 3 - 3
Service/X2D1TaskServer54/MainForm.cs

@@ -38,7 +38,7 @@ namespace X3TaskServer54
             var port = Convert.ToInt32(ConfigurationManager.AppSettings["LocalHttpPort"].Trim());
             var svrID = ConfigurationManager.AppSettings["SvrID"].Trim();
             var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();
-            this.Text = EnumSvrType.X3NoRefHistoryTask.GetEnumDisplayName() + "-" + svrID;
+            this.Text = EnumSvrType.X3NoRefTask54.GetEnumDisplayName() + "-" + svrID;
             string localIp;
             string getIpUrl = $"{posPlatformAddr}/api/task/getclientip";
             while (true)
@@ -79,7 +79,7 @@ namespace X3TaskServer54
                 {
                     var res = await HttpHelper.PostRequestAsync<object>(url, new SvrStateReportDto()
                     {
-                        SvrType = EnumSvrType.X3NoRefHistoryTask,
+                        SvrType = EnumSvrType.X3NoRefTask54,
                         SvrID = svrID,
                         ReportType = 0,
                         BaseHttpAddr = $"http://{localIp}:{port}",
@@ -124,7 +124,7 @@ namespace X3TaskServer54
                 _ = HttpHelper.PostRequestAsync<object>(url, new SvrStateReportDto()
                 {
                     SvrID = svrID,
-                    SvrType = EnumSvrType.X3NoRefHistoryTask,
+                    SvrType = EnumSvrType.X3NoRefTask54,
                     ReportType = 1,
                     BaseHttpAddr = $"http://{localIp}:{port}",
                 });

+ 0 - 610
Service/X2D1TaskServer54/Service/HistoryTaskService.cs

@@ -1,610 +0,0 @@
-using DevExpress.Internal.WinApi.Windows.UI.Notifications;
-using System;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Web.Http.Results;
-using XdCxRhDW.Dto;
-
-namespace X3TaskServer54.Service
-{
-    //业务逻辑处理类
-    public class HistoryTaskService
-    {
-        private readonly string baseUrl;
-        CancellationTokenSource cts;
-
-        string DetectDir;
-        string CapDir;
-        string DdcDir;
-        string PosResDir;
-        int MainSatCode, Adja1SatCode, Adja2SatCode;
-        double[] MainSatXYZ, Adja1SatXYZ, Adja2SatXYZ;
-        int PosDtoFactor;
-        bool useGpuCg = false;
-        public HistoryTaskService()
-        {
-            Directory.CreateDirectory("tmp");
-            var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();//like http://127.0.0.1:8091 or http://127.0.0.1:8091/
-            if (posPlatformAddr.EndsWith("/"))
-                this.baseUrl = posPlatformAddr + "api/";
-            else
-                this.baseUrl = posPlatformAddr + "/api/";
-
-            DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
-            CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
-            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
-            PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
-            var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
-            int.TryParse(PosDtoFactorstr, out PosDtoFactor);
-            if (PosDtoFactor == 0) PosDtoFactor = 1;
-            string useGpuStr = ConfigurationManager.AppSettings["UseGpuCg"];
-            if (useGpuStr != null && useGpuStr.Trim() == "1")
-                useGpuCg = true;
-
-
-        }
-        public void StartAsync(X3NoRefTaskHandleDto dto)
-        {
-            cts = new CancellationTokenSource();
-            Task.Run(async () =>
-            {
-                LogHelper.Info($"【任务{dto.ID}】开始执行...");
-                //点击定位平台右上角查看接口可以在浏览器中查看平台提供的所有接口详细信息
-                while (!cts.IsCancellationRequested)
-                {
-                    try
-                    {
-                        #region 第1步,读取需要的配置信息
-                        if (!Directory.Exists(DetectDir))
-                        {
-                            StopTask(dto.ID, EnumTaskStopType.Error, $"检测结果目录[{DetectDir}]不存在");
-                            return;
-                        }
-                        if (!Directory.Exists(CapDir))
-                        {
-                            StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
-                            return;
-                        }
-                        Directory.CreateDirectory(DdcDir);
-                        Directory.CreateDirectory(PosResDir);
-                        LogHelper.Info($"【任务{dto.ID}】检测结果目录[{DetectDir}]");
-                        LogHelper.Info($"【任务{dto.ID}】AD采集目录[{CapDir}]");
-                        LogHelper.Info($"【任务{dto.ID}】DDC输出目录[{DdcDir}]");
-                        try
-                        {
-                            var mainInfo = ConfigurationManager.AppSettings["MainSatInfo"].Replace(",", ",").Trim();
-                            var adja1Info = ConfigurationManager.AppSettings["Adja1SatInfo"].Replace(",", ",").Trim();
-                            var adja2Info = ConfigurationManager.AppSettings["Adja2SatInfo"].Replace(",", ",").Trim();
-                            var arr1 = mainInfo.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
-                            var arr2 = adja1Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
-                            var arr3 = adja2Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
-                            MainSatCode = Convert.ToInt32(arr1[0]);
-                            Adja1SatCode = Convert.ToInt32(arr2[0]);
-                            Adja2SatCode = Convert.ToInt32(arr3[0]);
-                            MainSatXYZ = new double[3] { Convert.ToDouble(arr1[1]), Convert.ToDouble(arr1[2]), Convert.ToDouble(arr1[3]) };
-                            Adja1SatXYZ = new double[3] { Convert.ToDouble(arr2[1]), Convert.ToDouble(arr2[2]), Convert.ToDouble(arr2[3]) };
-                            Adja2SatXYZ = new double[3] { Convert.ToDouble(arr3[1]), Convert.ToDouble(arr3[2]), Convert.ToDouble(arr3[3]) };
-                        }
-                        catch
-                        {
-                            StopTask(dto.ID, EnumTaskStopType.Error, $"任务处理服务配置文件卫星信息解析出错");
-                            return;
-                        }
-                        #endregion
-
-                        #region 第2步,扫描检测结果目录
-                        var groupFiles = Directory.EnumerateFiles(DetectDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToCheckResFile(p))
-                             .GroupBy(m => Convert.ToInt64(m.DayTime.ToString("yyyyMMdd") + m.FlagNo)).OrderBy(m => m.Key);
-                        if (!groupFiles.Any())
-                        {
-                            LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
-                            await Task.Delay(10000);
-                        }
-                        foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的
-                        {
-                            if (cts.IsCancellationRequested) break;
-                            List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
-                            foreach (var item in groupFile)
-                            {
-                                var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
-                                if (!Debugger.IsAttached)
-                                    File.Delete(item.File);//检测检测结果文件
-                                if (slotsInfo.Slots.Any())
-                                    listSlotsInfo.Add(slotsInfo);
-                            }
-                            if (!listSlotsInfo.Any()) continue;
-                            var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
-                                .Where(p => p.AdTime == listSlotsInfo.First().AdTime);
-                            if (!adFiles.Any())
-                            {
-                                LogHelper.Warning($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻找不到原始AD文件,跳过此组文件");
-                                continue;
-                            }
-                            var first = listSlotsInfo.First();
-                            var sigs = listSlotsInfo.Select(p => new DDCSig() { FreqDownHz = (int)(p.FreqDownMHz * 1e6), Mult = (int)first.Multi, Slots = p });
-                            List<DDCFile> chDDCFiles = new List<DDCFile>();//同一个时刻多个频点多个通道的DDC数据
-                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理开始,共{sigs.Count()}个频点...");
-                            Stopwatch sw = new Stopwatch();
-                            sw.Start();
-                            Parallel.ForEach(adFiles, adFile =>
-                            {
-
-                                //227=变频器频点255-(140-112))
-                                var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), DdcDir, sigs);
-                                chDDCFiles.AddRange(StringToDDCFile(ddcRes));
-                                if (!Debugger.IsAttached)
-                                    File.Delete(adFile.File);//删除AD文件
-                            });
-                            sw.Stop();
-                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
-                            if (!chDDCFiles.Any())
-                            {
-                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
-                                continue;
-                            }
-                            var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
-                            foreach (var group in groupDDCFiles)
-                            {
-                                //group:同一个时刻同一个频点的多个通道数据
-                                var capTime = group.First().AdTime;
-                                var ch0File = group.Where(p => p.ChNo == 0).FirstOrDefault();
-                                var ch1File = group.Where(p => p.ChNo == 1).FirstOrDefault();
-                                var ch2File = group.Where(p => p.ChNo == 2).FirstOrDefault();
-                                if (ch0File == null)
-                                {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
-                                    continue;
-                                }
-                                if (ch1File == null)
-                                {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
-                                    continue;
-                                }
-                                if (ch2File == null)
-                                {
-                                    LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
-                                    continue;
-                                }
-                                var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
-                                if (useGpuCg)
-                                {
-                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
-                                    sw.Start();
-                                    List<GpuCgResponseDto> data1 = new List<GpuCgResponseDto>();
-                                    List<GpuCgResponseDto> data2 = new List<GpuCgResponseDto>();
-                                    foreach (var item in sig.Slots.Slots)
-                                    {
-                                        string f1 = $"tmp\\{Path.GetFileNameWithoutExtension(ch0File.File)}_{item.StartPoint}_{item.Len}.dat";
-                                        string f2 = $"tmp\\{Path.GetFileNameWithoutExtension(ch1File.File)}_{item.StartPoint}_{item.Len}.dat";
-                                        string f3 = $"tmp\\{Path.GetFileNameWithoutExtension(ch2File.File)}_{item.StartPoint}_{item.Len}.dat";
-                                        using (FileStream fs = new FileStream(ch0File.File, FileMode.Open))
-                                        {
-                                            byte[] data = new byte[item.Len * 4];
-                                            fs.Position = item.StartPoint * 4;
-                                            fs.Read(data, 0, data.Length);
-                                            File.WriteAllBytes(f1, data);
-                                        }
-                                        using (FileStream fs = new FileStream(ch1File.File, FileMode.Open))
-                                        {
-                                            byte[] data = new byte[item.Len * 4];
-                                            fs.Position = item.StartPoint * 4;
-                                            fs.Read(data, 0, data.Length);
-                                            File.WriteAllBytes(f2, data);
-                                        }
-                                        using (FileStream fs = new FileStream(ch2File.File, FileMode.Open))
-                                        {
-                                            byte[] data = new byte[item.Len * 4];
-                                            fs.Position = item.StartPoint * 4;
-                                            fs.Read(data, 0, data.Length);
-                                            File.WriteAllBytes(f3, data);
-                                        }
-                                        string mainSlotFile = await HttpHelper.UploadFileAsync(f1, baseUrl, token: cts.Token);//主星文件
-                                        string adja1SlotFile = await HttpHelper.UploadFileAsync(f2, baseUrl, token: cts.Token);//邻1星文件
-                                        string adja2SlotFile = await HttpHelper.UploadFileAsync(f3, baseUrl, token: cts.Token);//邻2星文件
-                                        File.Delete(f1);
-                                        File.Delete(f2);
-                                        File.Delete(f3);
-                                        var gpudto = new GpuCgRequestDto()
-                                        {
-                                            dtCenter = 0,
-                                            dtRange = 40000,
-                                            file1 = mainSlotFile,
-                                            file2 = adja1SlotFile,
-                                            samplingRate = ch0File.Fs,
-                                            smpCount = 0,
-                                            snrThreshold = 15
-                                        };
-                                        var result1 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
-                                        if (result1.code != 200)
-                                        {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
-                                            continue;
-                                        }
-                                        var data1First = result1.data.First();
-                                        data1First.TimeSeconds = item.TimeSeconds;
-                                        data1.Add(data1First);
-                                        gpudto = new GpuCgRequestDto()
-                                        {
-                                            dtCenter = 0,
-                                            dtRange = 40000,
-                                            file1 = mainSlotFile,
-                                            file2 = adja2SlotFile,
-                                            samplingRate = ch0File.Fs,
-                                            smpCount = 0,
-                                            snrThreshold = 15
-                                        };
-                                        var result2 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
-                                        if (result2.code != 200)
-                                        {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
-                                            continue;
-                                        }
-                                        var data2First = result2.data.First();
-                                        data2First.TimeSeconds = item.TimeSeconds;
-                                        data2.Add(data2First);
-                                    }
-                                    sw.Stop();
-                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
-                                    if (data1.Count != data2.Count || data1.Count != sig.Slots.Slots.Count)
-                                    {
-                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
-                                        continue;
-                                    }
-                                    for (int i = 0; i < data1.Count; i++)
-                                    {
-                                        try
-                                        {
-                                            if (cts.IsCancellationRequested) break;
-                                            X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
-                                            {
-                                                TaskID = dto.ID,
-                                                //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
-                                                MainCode = MainSatCode,
-                                                Adja1Code = Adja1SatCode,
-                                                Adja2Code = Adja2SatCode,
-                                                MainX = MainSatXYZ[0],
-                                                MainY = MainSatXYZ[1],
-                                                MainZ = MainSatXYZ[2],
-                                                Adja1X = Adja1SatXYZ[0],
-                                                Adja1Y = Adja1SatXYZ[1],
-                                                Adja1Z = Adja1SatXYZ[2],
-                                                Adja2X = Adja2SatXYZ[0],
-                                                Adja2Y = Adja2SatXYZ[1],
-                                                Adja2Z = Adja2SatXYZ[2],
-                                                Dto1 = PosDtoFactor * data1[i].Dt,
-                                                Dfo1 = data1[i].Df,
-                                                Snr1 = data1[i].Snr,
-                                                Dto2 = PosDtoFactor * data2[i].Dt,
-                                                Dfo2 = data2[i].Df,
-                                                Snr2 = data2[i].Snr,
-                                                FreqUp = ch0File.FreqDownMHz * 1e6,
-                                                SatTxLon = dto.CapLon,
-                                                SatTxLat = dto.CapLat,
-                                                FreqDown = ch0File.FreqDownMHz * 1e6,
-                                                CheckRes = new CheckResDto()
-                                                {
-                                                    FileName = Path.GetFileName(ch0File.File),
-                                                    SmpStart = sig.Slots.Slots[i].StartPoint,
-                                                    SmpCount = sig.Slots.Slots[i].Len,
-                                                    PosCheckType = EnumPosCheckTypeDto.DAMA,
-                                                }
-                                            };
-                                            var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
-                                            if (result.code != 200)
-                                            {
-                                                LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{capTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
-                                            }
-                                            else
-                                            {
-                                                var posRes = result.data;
-                                                double posLon = posRes.PosLon;
-                                                double posLat = posRes.PosLat;
-                                                if (x3.Snr1 == 0 || x3.Snr2 == 0)
-                                                {
-                                                    posLon = 0;
-                                                    posLat = 0;
-                                                }
-                                                StringBuilder sb = new StringBuilder();
-                                                sb.Append($"{x3.SigTime:yyyy}\t");
-                                                sb.Append($"{x3.SigTime:MM}\t");
-                                                sb.Append($"{x3.SigTime:dd}\t");
-                                                sb.Append($"{x3.SigTime:HH}\t");
-                                                sb.Append($"{x3.SigTime:mm}\t");
-                                                sb.Append($"{x3.SigTime:ss}\t");
-                                                sb.Append($"{x3.SigTime:fff}\t");
-                                                sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
-                                                sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
-                                                sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
-                                                sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
-                                                sb.Append($"{0:D4}\t");//目标序号
-                                                sb.Append($"res\t");
-                                                sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
-                                                sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
-                                                sb.Append($"{0:D8}\t");//长轴
-                                                sb.Append($"{0:D8}\t");//短轴
-                                                sb.Append($"{0:D7}\t");//倾角
-                                                sb.Append($"{data1.Count:D2}\t");//时隙属性
-                                                sb.Append($"{1}\t");//所属卫星
-                                                sb.Append($"{950:D3}\t");//置信度
-                                                sb.Append($"{3}\r\n");//定位体制(星地=3)
-                                                string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
-                                                File.AppendAllText(resFile, sb.ToString());
-                                            }
-                                        }
-                                        catch (Exception ex)
-                                        {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
-                                        }
-                                    }
-                                }
-                                else
-                                {
-                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
-                                    sw.Start();
-                                    string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
-                                    string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
-                                    string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl, token: cts.Token);//邻2星文件
-                                    var cgDto = new CpuCgMultiDto()
-                                    {
-                                        dtCenter = 0,
-                                        dtRange = 40000,
-                                        file1 = mainFile,
-                                        file2 = adja1File,
-                                        samplingRate = ch0File.Fs,
-                                        smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
-                                        snrThreshold = 15,
-                                    };
-                                    var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
-                                    if (result1.code != 200)
-                                    {
-                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
-                                        continue;
-                                    }
-                                    cgDto = new CpuCgMultiDto()
-                                    {
-                                        dtCenter = 0,
-                                        dtRange = 40000,
-                                        file1 = mainFile,
-                                        file2 = adja2File,
-                                        samplingRate = ch0File.Fs,
-                                        smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
-                                        snrThreshold = 15,
-                                    };
-                                    var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
-                                    sw.Stop();
-                                    if (result2.code != 200)
-                                    {
-                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
-                                        continue;
-                                    }
-                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
-                                    var data1 = result1.data;
-                                    var data2 = result2.data;
-                                    if (data1.Count != data2.Count || data1.Count != cgDto.smpPositions.Count)
-                                    {
-                                        LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
-                                        continue;
-                                    }
-                                    for (int i = 0; i < data1.Count; i++)
-                                    {
-                                        try
-                                        {
-                                            if (cts.IsCancellationRequested) break;
-                                            X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
-                                            {
-                                                TaskID = dto.ID,
-                                                //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
-                                                SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
-                                                MainCode = MainSatCode,
-                                                Adja1Code = Adja1SatCode,
-                                                Adja2Code = Adja2SatCode,
-                                                MainX = MainSatXYZ[0],
-                                                MainY = MainSatXYZ[1],
-                                                MainZ = MainSatXYZ[2],
-                                                Adja1X = Adja1SatXYZ[0],
-                                                Adja1Y = Adja1SatXYZ[1],
-                                                Adja1Z = Adja1SatXYZ[2],
-                                                Adja2X = Adja2SatXYZ[0],
-                                                Adja2Y = Adja2SatXYZ[1],
-                                                Adja2Z = Adja2SatXYZ[2],
-                                                Dto1 = PosDtoFactor * data1[i].Dt,
-                                                Dfo1 = data1[i].Df,
-                                                Snr1 = data1[i].Snr,
-                                                Dto2 = PosDtoFactor * data2[i].Dt,
-                                                Dfo2 = data2[i].Df,
-                                                Snr2 = data2[i].Snr,
-                                                SatTxLon = dto.CapLon,
-                                                SatTxLat = dto.CapLat,
-                                                FreqDown = ch0File.FreqDownMHz * 1e6,
-                                                FreqUp = ch0File.FreqDownMHz * 1e6,
-                                                CheckRes = new CheckResDto()
-                                                {
-                                                    FileName = Path.GetFileName(ch0File.File),
-                                                    SmpStart = sig.Slots.Slots[i].StartPoint,
-                                                    SmpCount = sig.Slots.Slots[i].Len,
-                                                    PosCheckType = EnumPosCheckTypeDto.DAMA,
-                                                }
-                                            };
-                                            var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
-                                            if (result.code != 200)
-                                            {
-                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
-                                            }
-                                            else
-                                            {
-                                                var posRes = result.data;
-                                                double posLon = posRes.PosLon;
-                                                double posLat = posRes.PosLat;
-                                                if (x3.Snr1 == 0 || x3.Snr2 == 0)
-                                                {
-                                                    posLon = 0;
-                                                    posLat = 0;
-                                                }
-                                                StringBuilder sb = new StringBuilder();
-                                                sb.Append($"{x3.SigTime:yyyy}\t");
-                                                sb.Append($"{x3.SigTime:MM}\t");
-                                                sb.Append($"{x3.SigTime:dd}\t");
-                                                sb.Append($"{x3.SigTime:HH}\t");
-                                                sb.Append($"{x3.SigTime:mm}\t");
-                                                sb.Append($"{x3.SigTime:ss}\t");
-                                                sb.Append($"{x3.SigTime:fff}\t");
-                                                sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
-                                                sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
-                                                sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
-                                                sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
-                                                sb.Append($"{0:D4}\t");//目标序号
-                                                sb.Append($"res\t");
-                                                sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
-                                                sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
-                                                sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
-                                                sb.Append($"{0:D8}\t");//长轴
-                                                sb.Append($"{0:D8}\t");//短轴
-                                                sb.Append($"{0:D7}\t");//倾角
-                                                sb.Append($"{data1.Count:D2}\t");//时隙属性
-                                                sb.Append($"{1}\t");//所属卫星
-                                                sb.Append($"{950:D3}\t");//置信度
-                                                sb.Append($"{3}");//定位体制(星地=3)
-                                                sb.Append($"QPSK");//调制类型
-                                                sb.Append($"1.33\r\n");//符号速率kbps
-                                                string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
-                                                File.AppendAllText(resFile, sb.ToString());
-                                            }
-                                        }
-                                        catch (Exception ex)
-                                        {
-                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
-                                        }
-                                    }
-                                }
-                                //删除DDC文件
-                                File.Delete(ch0File.File);
-                                File.Delete(ch1File.File);
-                                File.Delete(ch2File.File);
-                                LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成");
-                            }
-
-                        }
-                        #endregion
-                    }
-                    catch (TaskCanceledException ex)
-                    {
-                        LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
-                    }
-                    catch (Exception ex)
-                    {
-                        if (ex.InnerException != null && ex.InnerException.GetType() == typeof(TaskCanceledException))
-                            LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
-                        else
-                            LogHelper.Error($"【任务{dto.ID}】任务执行出错", ex);
-                        continue;
-                    }
-                }
-            }, cts.Token);
-        }
-        public void Stop()
-        {
-            cts?.Cancel();
-        }
-        private void StopTask(int taskID, EnumTaskStopType type, string stopReason)
-        {
-            Thread.Sleep(2000);
-            if (type == EnumTaskStopType.Properly)
-            {
-                LogHelper.Info($"【任务{taskID}】{stopReason}");
-            }
-            else
-            {
-                LogHelper.Error($"【任务{taskID}】{stopReason}");
-            }
-            TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopType = type, StopReason = stopReason };
-            var stopResp = HttpHelper.PostRequestAsync(baseUrl + "Task/StopTask", stopDto).Result;
-            if (stopResp.code != 200)
-            {
-                LogHelper.Error($"【任务{taskID}】停止异常.{stopResp.msg}");
-            }
-        }
-
-        private CheckResFile StringToCheckResFile(string file)
-        {
-            //YUFO_252.050MHz_20240409_1398.dat
-            string fileName = Path.GetFileNameWithoutExtension(file).ToUpper();
-            var arr = fileName.Split(new string[] { "_", "MHZ" }, StringSplitOptions.RemoveEmptyEntries);
-            var dayTime = DateTime.ParseExact(arr[2], "yyyyMMdd", null);
-            CheckResFile res = new CheckResFile()
-            {
-                DayTime = dayTime,
-                File = file,
-                FreqDownMHz = Convert.ToDouble(arr[1]),
-                FlagNo = Convert.ToInt64(arr[3]),
-            };
-            return res;
-        }
-        private AdFile StringToAdFile(string file)
-        {
-            //20240409094240_ADC_ch02.dat
-            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
-            var arr = name.Split(new string[] { "_", "CH" }, StringSplitOptions.RemoveEmptyEntries);
-            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
-            AdFile adFile = new AdFile()
-            {
-                File = file,
-                AdTime = time,
-                ChNo = Convert.ToInt32(arr[2]),
-            };
-            return adFile;
-        }
-        public DDCFile StringToDDCFile(string file)
-        {
-            //20240409094240_252.025_C109375_ch0.dat
-            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
-            var arr = name.Split(new string[] { "_", "MHz", "C", "H" }, StringSplitOptions.RemoveEmptyEntries);
-            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
-            double freqDown = Convert.ToDouble(arr[1]);
-            int fs = Convert.ToInt32(arr[2]);
-            int chNo = Convert.ToInt32(arr[3]);
-            return new DDCFile()
-            {
-                AdTime = time,
-                ChNo = chNo,
-                File = file,
-                FreqDownMHz = freqDown,
-                Fs = fs
-            };
-        }
-        public List<DDCFile> StringToDDCFile(List<string> files)
-        {
-            List<DDCFile> list = new List<DDCFile>();
-            foreach (var item in files)
-            {
-                list.Add(StringToDDCFile(item));
-            }
-            return list;
-        }
-    }
-}

+ 621 - 0
Service/X2D1TaskServer54/Service/TaskService.cs

@@ -0,0 +1,621 @@
+using DevExpress.Internal.WinApi.Windows.UI.Notifications;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Web.Http.Results;
+using XdCxRhDW.Dto;
+
+namespace X3TaskServer54.Service
+{
+    //业务逻辑处理类
+    public class TaskService
+    {
+        private readonly string baseUrl;
+        CancellationTokenSource cts;
+
+        string DetectDir;
+        string CapDir;
+        string DdcDir;
+        string PosResDir;
+        int MainSatCode, Adja1SatCode, Adja2SatCode;
+        double[] MainSatXYZ, Adja1SatXYZ, Adja2SatXYZ;
+        int PosDtoFactor;
+        bool useGpuCg = false;
+        public TaskService()
+        {
+            Directory.CreateDirectory("tmp");
+            var posPlatformAddr = ConfigurationManager.AppSettings["PosPlatformAddr"].Trim();//like http://127.0.0.1:8091 or http://127.0.0.1:8091/
+            if (posPlatformAddr.EndsWith("/"))
+                this.baseUrl = posPlatformAddr + "api/";
+            else
+                this.baseUrl = posPlatformAddr + "/api/";
+
+            DetectDir = ConfigurationManager.AppSettings["DetectDir"].Trim();
+            CapDir = ConfigurationManager.AppSettings["CapDir"].Trim();
+            DdcDir = ConfigurationManager.AppSettings["DdcDir"].Trim();
+            PosResDir = ConfigurationManager.AppSettings["PosResDir"].Trim();
+            var PosDtoFactorstr = ConfigurationManager.AppSettings["PosDtoFactor"].Trim();
+            int.TryParse(PosDtoFactorstr, out PosDtoFactor);
+            if (PosDtoFactor == 0) PosDtoFactor = 1;
+            string useGpuStr = ConfigurationManager.AppSettings["UseGpuCg"];
+            if (useGpuStr != null && useGpuStr.Trim() == "1")
+                useGpuCg = true;
+
+
+        }
+        public void StartAsync(X3NoRefTaskHandleDto dto)
+        {
+            cts = new CancellationTokenSource();
+            Task.Run(async () =>
+            {
+                LogHelper.Info($"【任务{dto.ID}】开始执行...");
+                LogHelper.Info($"【任务{dto.ID}】检测结果目录[{DetectDir}]");
+                LogHelper.Info($"【任务{dto.ID}】AD采集目录[{CapDir}]");
+                LogHelper.Info($"【任务{dto.ID}】DDC输出目录[{DdcDir}]");
+                //点击定位平台右上角查看接口可以在浏览器中查看平台提供的所有接口详细信息
+                while (!cts.IsCancellationRequested)
+                {
+                    try
+                    {
+                        #region 第1步,读取需要的配置信息
+                        if (!Directory.Exists(DetectDir))
+                        {
+                            await StopTask(dto.ID, EnumTaskStopType.Error, $"检测结果目录[{DetectDir}]不存在");
+                            return;
+                        }
+                        if (!Directory.Exists(CapDir))
+                        {
+                            await StopTask(dto.ID, EnumTaskStopType.Error, $"AD采集目录[{CapDir}]不存在");
+                            return;
+                        }
+                        Directory.CreateDirectory(DdcDir);
+                        Directory.CreateDirectory(PosResDir);
+                        try
+                        {
+                            var mainInfo = ConfigurationManager.AppSettings["MainSatInfo"].Replace(",", ",").Trim();
+                            var adja1Info = ConfigurationManager.AppSettings["Adja1SatInfo"].Replace(",", ",").Trim();
+                            var adja2Info = ConfigurationManager.AppSettings["Adja2SatInfo"].Replace(",", ",").Trim();
+                            var arr1 = mainInfo.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            var arr2 = adja1Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            var arr3 = adja2Info.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
+                            MainSatCode = Convert.ToInt32(arr1[0]);
+                            Adja1SatCode = Convert.ToInt32(arr2[0]);
+                            Adja2SatCode = Convert.ToInt32(arr3[0]);
+                            MainSatXYZ = new double[3] { Convert.ToDouble(arr1[1]), Convert.ToDouble(arr1[2]), Convert.ToDouble(arr1[3]) };
+                            Adja1SatXYZ = new double[3] { Convert.ToDouble(arr2[1]), Convert.ToDouble(arr2[2]), Convert.ToDouble(arr2[3]) };
+                            Adja2SatXYZ = new double[3] { Convert.ToDouble(arr3[1]), Convert.ToDouble(arr3[2]), Convert.ToDouble(arr3[3]) };
+                        }
+                        catch
+                        {
+                            await StopTask(dto.ID, EnumTaskStopType.Error, $"任务处理服务配置文件卫星信息解析出错");
+                            return;
+                        }
+                        #endregion
+
+                        #region 第2步,扫描检测结果目录
+                        var groupFiles = Directory.EnumerateFiles(DetectDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToCheckResFile(p))
+                             .GroupBy(m => Convert.ToInt64(m.DayTime.ToString("yyyyMMdd") + m.FlagNo)).OrderBy(m => m.Key);
+                        if (!groupFiles.Any())
+                        {
+                            LogHelper.Info($"【任务{dto.ID}】等待扫描文件...");
+                            await Task.Delay(10000);
+                        }
+                        foreach (var groupFile in groupFiles)//每一组文件代表同一个时刻的
+                        {
+                            if (cts.IsCancellationRequested) break;
+                            List<SlotsInfo> listSlotsInfo = new List<SlotsInfo>();//多个频点的时隙结果
+                            foreach (var item in groupFile)
+                            {
+                                var slotsInfo = SlotHelper.GetFileSlots(item.File);//某个频点的所有时隙
+                                if (!Debugger.IsAttached)
+                                    File.Delete(item.File);//检测检测结果文件
+                                if (slotsInfo.Slots.Any())
+                                    listSlotsInfo.Add(slotsInfo);
+                            }
+                            if (!listSlotsInfo.Any()) continue;
+                            var adFiles = Directory.EnumerateFiles(CapDir, "*.dat", SearchOption.TopDirectoryOnly).Select(p => StringToAdFile(p))
+                                .Where(p => p.AdTime == listSlotsInfo.First().AdTime);
+                            if (!adFiles.Any())
+                            {
+                                LogHelper.Warning($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻找不到原始AD文件,跳过此组文件");
+                                continue;
+                            }
+                            var first = listSlotsInfo.First();
+                            var sigs = listSlotsInfo.Select(p => new DDCSig() { FreqDownHz = (int)(p.FreqDownMHz * 1e6), Mult = (int)first.Multi, Slots = p });
+                            List<DDCFile> chDDCFiles = new List<DDCFile>();//同一个时刻多个频点多个通道的DDC数据
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理开始,共{sigs.Count()}个频点...");
+                            Stopwatch sw = new Stopwatch();
+                            sw.Start();
+                            var listTask = new List<Task>();
+                            foreach (var adFile in adFiles)
+                            {
+                                var task = Task.Run(() =>
+                                {
+                                    var ddcRes = DDCHelper.DDC(adFile.File, adFile.AdTime, adFile.ChNo, (long)(first.FsampleM * 1e6), (long)(227 * 1e6), DdcDir, sigs);
+                                    chDDCFiles.AddRange(StringToDDCFile(ddcRes));
+                                    if (!Debugger.IsAttached)
+                                        File.Delete(adFile.File);//删除AD文件
+                                }, cts.Token);
+                                listTask.Add(task);
+                            }
+                            await Task.WhenAll(listTask);
+                            sw.Stop();
+                            LogHelper.Info($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理完成,耗时{sw.ElapsedMilliseconds}ms");
+                            if (!chDDCFiles.Any())
+                            {
+                                LogHelper.Error($"【任务{dto.ID}】{listSlotsInfo.First().AdTime:yyyyMMddHHmmss}时刻DDC处理无结果");
+                                continue;
+                            }
+                            var groupDDCFiles = chDDCFiles.GroupBy(p => p.FreqDownMHz);
+                            listTask.Clear();
+                            foreach (var group in groupDDCFiles)
+                            {
+                                //group:同一个时刻同一个频点的多个通道数据
+                                var task = Task.Run(async () =>
+                                {
+                                    var capTime = group.First().AdTime;
+                                    var ch0File = group.Where(p => p.ChNo == 0).FirstOrDefault();
+                                    var ch1File = group.Where(p => p.ChNo == 1).FirstOrDefault();
+                                    var ch2File = group.Where(p => p.ChNo == 2).FirstOrDefault();
+                                    if (ch0File == null)
+                                    {
+                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到主星信号ch0文件,跳过此组数据");
+                                        return;
+                                    }
+                                    if (ch1File == null)
+                                    {
+                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻1星信号ch1文件,跳过此组数据");
+                                        return;
+                                    }
+                                    if (ch2File == null)
+                                    {
+                                        LogHelper.Warning($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-未找到邻2星信号ch2文件,跳过此组数据");
+                                        return;
+                                    }
+                                    var sig = sigs.FirstOrDefault(p => p.FreqDownHz == (int)(group.Key * 1e6));
+                                    if (useGpuCg)
+                                    {
+                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        sw.Start();
+                                        List<GpuCgResponseDto> data1 = new List<GpuCgResponseDto>();
+                                        List<GpuCgResponseDto> data2 = new List<GpuCgResponseDto>();
+                                        foreach (var item in sig.Slots.Slots)
+                                        {
+                                            string f1 = $"tmp\\{Path.GetFileNameWithoutExtension(ch0File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                            string f2 = $"tmp\\{Path.GetFileNameWithoutExtension(ch1File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                            string f3 = $"tmp\\{Path.GetFileNameWithoutExtension(ch2File.File)}_{item.StartPoint}_{item.Len}.dat";
+                                            using (FileStream fs = new FileStream(ch0File.File, FileMode.Open))
+                                            {
+                                                byte[] data = new byte[item.Len * 4];
+                                                fs.Position = item.StartPoint * 4;
+                                                fs.Read(data, 0, data.Length);
+                                                File.WriteAllBytes(f1, data);
+                                            }
+                                            using (FileStream fs = new FileStream(ch1File.File, FileMode.Open))
+                                            {
+                                                byte[] data = new byte[item.Len * 4];
+                                                fs.Position = item.StartPoint * 4;
+                                                fs.Read(data, 0, data.Length);
+                                                File.WriteAllBytes(f2, data);
+                                            }
+                                            using (FileStream fs = new FileStream(ch2File.File, FileMode.Open))
+                                            {
+                                                byte[] data = new byte[item.Len * 4];
+                                                fs.Position = item.StartPoint * 4;
+                                                fs.Read(data, 0, data.Length);
+                                                File.WriteAllBytes(f3, data);
+                                            }
+                                            string mainSlotFile = await HttpHelper.UploadFileAsync(f1, baseUrl, token: cts.Token);//主星文件
+                                            string adja1SlotFile = await HttpHelper.UploadFileAsync(f2, baseUrl, token: cts.Token);//邻1星文件
+                                            string adja2SlotFile = await HttpHelper.UploadFileAsync(f3, baseUrl, token: cts.Token);//邻2星文件
+                                            File.Delete(f1);
+                                            File.Delete(f2);
+                                            File.Delete(f3);
+                                            var gpudto = new GpuCgRequestDto()
+                                            {
+                                                dtCenter = 0,
+                                                dtRange = 40000,
+                                                file1 = mainSlotFile,
+                                                file2 = adja1SlotFile,
+                                                samplingRate = ch0File.Fs,
+                                                smpCount = 0,
+                                                snrThreshold = 15
+                                            };
+                                            var result1 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
+                                            if (result1.code != 200)
+                                            {
+                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星GPU参估出错.{result1.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                continue;
+                                            }
+                                            var data1First = result1.data.First();
+                                            data1First.TimeSeconds = item.TimeSeconds;
+                                            data1.Add(data1First);
+                                            gpudto = new GpuCgRequestDto()
+                                            {
+                                                dtCenter = 0,
+                                                dtRange = 40000,
+                                                file1 = mainSlotFile,
+                                                file2 = adja2SlotFile,
+                                                samplingRate = ch0File.Fs,
+                                                smpCount = 0,
+                                                snrThreshold = 15
+                                            };
+                                            var result2 = await HttpHelper.PostRequestAsync<List<GpuCgResponseDto>>(baseUrl + "DetectCg/GpuCgCalc", gpudto, token: cts.Token);
+                                            if (result2.code != 200)
+                                            {
+                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星GPU参估出错.{result2.msg}.突发位置{item.StartPoint}-{item.Len}");
+                                                continue;
+                                            }
+                                            var data2First = result2.data.First();
+                                            data2First.TimeSeconds = item.TimeSeconds;
+                                            data2.Add(data2First);
+                                        }
+                                        sw.Stop();
+                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-GPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        if (data1.Count != data2.Count || data1.Count != sig.Slots.Slots.Count)
+                                        {
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻参估结果个数和检测结果个数不匹配");
+                                            return;
+                                        }
+                                        for (int i = 0; i < data1.Count; i++)
+                                        {
+                                            try
+                                            {
+                                                if (cts.IsCancellationRequested) break;
+                                                X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
+                                                {
+                                                    TaskID = dto.ID,
+                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    MainCode = MainSatCode,
+                                                    Adja1Code = Adja1SatCode,
+                                                    Adja2Code = Adja2SatCode,
+                                                    MainX = MainSatXYZ[0],
+                                                    MainY = MainSatXYZ[1],
+                                                    MainZ = MainSatXYZ[2],
+                                                    Adja1X = Adja1SatXYZ[0],
+                                                    Adja1Y = Adja1SatXYZ[1],
+                                                    Adja1Z = Adja1SatXYZ[2],
+                                                    Adja2X = Adja2SatXYZ[0],
+                                                    Adja2Y = Adja2SatXYZ[1],
+                                                    Adja2Z = Adja2SatXYZ[2],
+                                                    Dto1 = PosDtoFactor * data1[i].Dt,
+                                                    Dfo1 = data1[i].Df,
+                                                    Snr1 = data1[i].Snr,
+                                                    Dto2 = PosDtoFactor * data2[i].Dt,
+                                                    Dfo2 = data2[i].Df,
+                                                    Snr2 = data2[i].Snr,
+                                                    FreqUp = ch0File.FreqDownMHz * 1e6,
+                                                    SatTxLon = dto.CapLon,
+                                                    SatTxLat = dto.CapLat,
+                                                    FreqDown = ch0File.FreqDownMHz * 1e6,
+                                                    CheckRes = new CheckResDto()
+                                                    {
+                                                        FileName = Path.GetFileName(ch0File.File),
+                                                        SmpStart = sig.Slots.Slots[i].StartPoint,
+                                                        SmpCount = sig.Slots.Slots[i].Len,
+                                                        PosCheckType = EnumPosCheckTypeDto.DAMA,
+                                                    }
+                                                };
+                                                var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
+                                                if (result.code != 200)
+                                                {
+                                                    LogHelper.Error($"【任务{dto.ID}】-信号{group.Key}MHz-{capTime:yyyyMMddHHmmss}时刻第{i + 1}个突发定位异常.{result.msg}");
+                                                }
+                                                else
+                                                {
+                                                    var posRes = result.data;
+                                                    double posLon = posRes.PosLon;
+                                                    double posLat = posRes.PosLat;
+                                                    if (x3.Snr1 == 0 || x3.Snr2 == 0)
+                                                    {
+                                                        posLon = 0;
+                                                        posLat = 0;
+                                                    }
+                                                    StringBuilder sb = new StringBuilder();
+                                                    sb.Append($"{x3.SigTime:yyyy}\t");
+                                                    sb.Append($"{x3.SigTime:MM}\t");
+                                                    sb.Append($"{x3.SigTime:dd}\t");
+                                                    sb.Append($"{x3.SigTime:HH}\t");
+                                                    sb.Append($"{x3.SigTime:mm}\t");
+                                                    sb.Append($"{x3.SigTime:ss}\t");
+                                                    sb.Append($"{x3.SigTime:fff}\t");
+                                                    sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
+                                                    sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
+                                                    sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
+                                                    sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
+                                                    sb.Append($"{0:D4}\t");//目标序号
+                                                    sb.Append($"res\t");
+                                                    sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
+                                                    sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
+                                                    sb.Append($"{0:D8}\t");//长轴
+                                                    sb.Append($"{0:D8}\t");//短轴
+                                                    sb.Append($"{0:D7}\t");//倾角
+                                                    sb.Append($"{data1.Count:D2}\t");//时隙属性
+                                                    sb.Append($"{1}\t");//所属卫星
+                                                    sb.Append($"{950:D3}\t");//置信度
+                                                    sb.Append($"{3}");//定位体制(星地=3)
+                                                    sb.Append($"QPSK");//调制类型
+                                                    sb.Append($"1.33\r\n");//符号速率kbps
+                                                    string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
+                                                    File.AppendAllText(resFile, sb.ToString());
+                                                }
+                                            }
+                                            catch (Exception ex)
+                                            {
+                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-第{i + 1}个突发定位异常", ex);
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估开始,共{sig.Slots.Slots.Count}个突发...");
+                                        sw.Start();
+                                        string mainFile = await HttpHelper.UploadFileAsync(ch0File.File, baseUrl, token: cts.Token);//主星文件
+                                        string adja1File = await HttpHelper.UploadFileAsync(ch1File.File, baseUrl, token: cts.Token);//邻1星文件
+                                        string adja2File = await HttpHelper.UploadFileAsync(ch2File.File, baseUrl, token: cts.Token);//邻2星文件
+                                        var cgDto = new CpuCgMultiDto()
+                                        {
+                                            dtCenter = 0,
+                                            dtRange = 40000,
+                                            file1 = mainFile,
+                                            file2 = adja1File,
+                                            samplingRate = ch0File.Fs,
+                                            smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
+                                            snrThreshold = 15,
+                                        };
+                                        var result1 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                        if (result1.code != 200)
+                                        {
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻1星CPU参估出错.{result1.msg}");
+                                            return;
+                                        }
+                                        cgDto = new CpuCgMultiDto()
+                                        {
+                                            dtCenter = 0,
+                                            dtRange = 40000,
+                                            file1 = mainFile,
+                                            file2 = adja2File,
+                                            samplingRate = ch0File.Fs,
+                                            smpPositions = sig.Slots.Slots.Select(p => new SmpPosition() { TimeSeconds = p.TimeSeconds, smpStart = p.StartPoint, smpCount = p.Len }).ToList(),
+                                            snrThreshold = 15,
+                                        };
+                                        var result2 = await HttpHelper.PostRequestAsync<List<CpuCgResDto>>(baseUrl + "DetectCg/CpuCgMultiCalc", cgDto, token: cts.Token);
+                                        sw.Stop();
+                                        if (result2.code != 200)
+                                        {
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-主星邻2星CPU参估出错.{result2.msg}");
+                                            return;
+                                        }
+                                        LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-CPU参估完成,耗时{sw.ElapsedMilliseconds}ms");
+                                        var data1 = result1.data;
+                                        var data2 = result2.data;
+                                        if (data1.Count != data2.Count || data1.Count != cgDto.smpPositions.Count)
+                                        {
+                                            LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-参估结果个数和检测结果个数不匹配");
+                                            return;
+                                        }
+                                        for (int i = 0; i < data1.Count; i++)
+                                        {
+                                            try
+                                            {
+                                                if (cts.IsCancellationRequested) break;
+                                                X3TwoDtoNoParPosDto x3 = new X3TwoDtoNoParPosDto()
+                                                {
+                                                    TaskID = dto.ID,
+                                                    //SigTime = capTime.AddSeconds(data1[i].Smpstart / (double)ch0File.Fs),
+                                                    SigTime = capTime.AddSeconds(data1[i].TimeSeconds),
+                                                    MainCode = MainSatCode,
+                                                    Adja1Code = Adja1SatCode,
+                                                    Adja2Code = Adja2SatCode,
+                                                    MainX = MainSatXYZ[0],
+                                                    MainY = MainSatXYZ[1],
+                                                    MainZ = MainSatXYZ[2],
+                                                    Adja1X = Adja1SatXYZ[0],
+                                                    Adja1Y = Adja1SatXYZ[1],
+                                                    Adja1Z = Adja1SatXYZ[2],
+                                                    Adja2X = Adja2SatXYZ[0],
+                                                    Adja2Y = Adja2SatXYZ[1],
+                                                    Adja2Z = Adja2SatXYZ[2],
+                                                    Dto1 = PosDtoFactor * data1[i].Dt,
+                                                    Dfo1 = data1[i].Df,
+                                                    Snr1 = data1[i].Snr,
+                                                    Dto2 = PosDtoFactor * data2[i].Dt,
+                                                    Dfo2 = data2[i].Df,
+                                                    Snr2 = data2[i].Snr,
+                                                    SatTxLon = dto.CapLon,
+                                                    SatTxLat = dto.CapLat,
+                                                    FreqDown = ch0File.FreqDownMHz * 1e6,
+                                                    FreqUp = ch0File.FreqDownMHz * 1e6,
+                                                    CheckRes = new CheckResDto()
+                                                    {
+                                                        FileName = Path.GetFileName(ch0File.File),
+                                                        SmpStart = sig.Slots.Slots[i].StartPoint,
+                                                        SmpCount = sig.Slots.Slots[i].Len,
+                                                        PosCheckType = EnumPosCheckTypeDto.DAMA,
+                                                    }
+                                                };
+                                                var result = await HttpHelper.PostRequestAsync<PosResDto>(baseUrl + "Pos/PosX3TwoDtoNoParAsync", x3);
+                                                if (result.code != 200)
+                                                {
+                                                    LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常.{result.msg}");
+                                                }
+                                                else
+                                                {
+                                                    var posRes = result.data;
+                                                    double posLon = posRes.PosLon;
+                                                    double posLat = posRes.PosLat;
+                                                    if (x3.Snr1 == 0 || x3.Snr2 == 0)
+                                                    {
+                                                        posLon = 0;
+                                                        posLat = 0;
+                                                    }
+                                                    StringBuilder sb = new StringBuilder();
+                                                    sb.Append($"{x3.SigTime:yyyy}\t");
+                                                    sb.Append($"{x3.SigTime:MM}\t");
+                                                    sb.Append($"{x3.SigTime:dd}\t");
+                                                    sb.Append($"{x3.SigTime:HH}\t");
+                                                    sb.Append($"{x3.SigTime:mm}\t");
+                                                    sb.Append($"{x3.SigTime:ss}\t");
+                                                    sb.Append($"{x3.SigTime:fff}\t");
+                                                    sb.Append($"{x3.CheckRes.SmpCount * 1000 / ch0File.Fs:D4}\t");//信号持续时间ms
+                                                    sb.Append($"{Convert.ToInt64(group.First().FreqDownMHz * 1e6):D12}\t");//下行频点
+                                                    sb.Append($"{Convert.ToInt64((group.First().FreqDownMHz + 44) * 1e6):D12}\t");//上行频点
+                                                    sb.Append($"{4}\t");//信号样式(暂定有这些1:CPM,2:BPSK,4:QPSK),
+                                                    sb.Append($"{0:D4}\t");//目标序号
+                                                    sb.Append($"res\t");
+                                                    sb.Append($"{Convert.ToInt64(posLon * 1e6):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(posLat * 1e6):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km
+                                                    sb.Append($"{Convert.ToInt64(x3.Dto1 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dfo1 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Snr1 * 1e2):D6}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dto2 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Dfo2 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(x3.Snr2 * 1e2):D6}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D10}\t");
+                                                    sb.Append($"{Convert.ToInt64(0 * 1e2):D6}\t");
+                                                    sb.Append($"{0:D8}\t");//长轴
+                                                    sb.Append($"{0:D8}\t");//短轴
+                                                    sb.Append($"{0:D7}\t");//倾角
+                                                    sb.Append($"{data1.Count:D2}\t");//时隙属性
+                                                    sb.Append($"{1}\t");//所属卫星
+                                                    sb.Append($"{950:D3}\t");//置信度
+                                                    sb.Append($"{3}");//定位体制(星地=3)
+                                                    sb.Append($"QPSK");//调制类型
+                                                    sb.Append($"1.33\r\n");//符号速率kbps
+                                                    string resFile = Path.Combine(PosResDir, $"定位结果_{posRes.SigTime:yyyyMMdd}.txt");
+                                                    File.AppendAllText(resFile, sb.ToString());
+                                                }
+                                            }
+                                            catch (Exception ex)
+                                            {
+                                                LogHelper.Error($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-时隙位置{data1[i].Smpstart}定位异常", ex);
+                                            }
+                                        }
+                                    }
+                                    //删除DDC文件
+                                    File.Delete(ch0File.File);
+                                    File.Delete(ch1File.File);
+                                    File.Delete(ch2File.File);
+                                    LogHelper.Info($"【任务{dto.ID}】{capTime:yyyyMMddHHmmss}时刻-信号{group.Key}MHz-定位完成");
+                                }, cts.Token);
+                                listTask.Add(task);
+                            }
+                            await Task.WhenAll(listTask);
+                        }
+                        #endregion
+                    }
+                    catch (TaskCanceledException ex)
+                    {
+                        LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
+                    }
+                    catch (Exception ex)
+                    {
+                        if (ex.InnerException != null && ex.InnerException.GetType() == typeof(TaskCanceledException))
+                            LogHelper.Warning($"【任务{dto.ID}】处理结束,用户手动终止", ex.InnerException);
+                        else
+                            LogHelper.Error($"【任务{dto.ID}】任务执行出错", ex);
+                        continue;
+                    }
+                }
+            }, cts.Token);
+        }
+        public void Stop()
+        {
+            cts?.Cancel();
+        }
+        private async Task StopTask(int taskID, EnumTaskStopType type, string stopReason)
+        {
+            await Task.Delay(2000);
+            if (type == EnumTaskStopType.Properly)
+            {
+                LogHelper.Info($"【任务{taskID}】{stopReason}");
+            }
+            else
+            {
+                LogHelper.Error($"【任务{taskID}】{stopReason}");
+            }
+            TaskStopHandleDto stopDto = new TaskStopHandleDto() { ID = taskID, StopType = type, StopReason = stopReason };
+            var stopResp = await HttpHelper.PostRequestAsync(baseUrl + "Task/StopTask", stopDto);
+            if (stopResp.code != 200)
+            {
+                LogHelper.Error($"【任务{taskID}】停止异常.{stopResp.msg}");
+            }
+        }
+
+        private CheckResFile StringToCheckResFile(string file)
+        {
+            //YUFO_252.050MHz_20240409_1398.dat
+            string fileName = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = fileName.Split(new string[] { "_", "MHZ" }, StringSplitOptions.RemoveEmptyEntries);
+            var dayTime = DateTime.ParseExact(arr[2], "yyyyMMdd", null);
+            CheckResFile res = new CheckResFile()
+            {
+                DayTime = dayTime,
+                File = file,
+                FreqDownMHz = Convert.ToDouble(arr[1]),
+                FlagNo = Convert.ToInt64(arr[3]),
+            };
+            return res;
+        }
+        private AdFile StringToAdFile(string file)
+        {
+            //20240409094240_ADC_ch02.dat
+            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = name.Split(new string[] { "_", "CH" }, StringSplitOptions.RemoveEmptyEntries);
+            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
+            AdFile adFile = new AdFile()
+            {
+                File = file,
+                AdTime = time,
+                ChNo = Convert.ToInt32(arr[2]),
+            };
+            return adFile;
+        }
+        public DDCFile StringToDDCFile(string file)
+        {
+            //20240409094240_252.025_C109375_ch0.dat
+            var name = Path.GetFileNameWithoutExtension(file).ToUpper();
+            var arr = name.Split(new string[] { "_", "MHz", "C", "H" }, StringSplitOptions.RemoveEmptyEntries);
+            var time = DateTime.ParseExact(arr[0], "yyyyMMddHHmmss", null);
+            double freqDown = Convert.ToDouble(arr[1]);
+            int fs = Convert.ToInt32(arr[2]);
+            int chNo = Convert.ToInt32(arr[3]);
+            return new DDCFile()
+            {
+                AdTime = time,
+                ChNo = chNo,
+                File = file,
+                FreqDownMHz = freqDown,
+                Fs = fs
+            };
+        }
+        public List<DDCFile> StringToDDCFile(List<string> files)
+        {
+            List<DDCFile> list = new List<DDCFile>();
+            foreach (var item in files)
+            {
+                list.Add(StringToDDCFile(item));
+            }
+            return list;
+        }
+    }
+}

+ 2 - 2
Service/X2D1TaskServer54/X3TaskServer54.csproj

@@ -119,7 +119,7 @@
       <Link>DxHelper\ChsLocalizer.cs</Link>
     </Compile>
     <Compile Include="AddIns\DDC\DDCHelper.cs" />
-    <Compile Include="Controllers\X2D1NoRefTaskProcessingController.cs" />
+    <Compile Include="Controllers\X3NoRefTaskProcessingController.cs" />
     <Compile Include="HistoryFile.cs" />
     <Compile Include="LogHelper.cs" />
     <Compile Include="LogInfo.cs" />
@@ -131,7 +131,7 @@
     <Compile Include="MainForm.Designer.cs">
       <DependentUpon>MainForm.cs</DependentUpon>
     </Compile>
-    <Compile Include="Service\HistoryTaskService.cs" />
+    <Compile Include="Service\TaskService.cs" />
     <Compile Include="AddIns\时隙获取\SlotHelper.cs" />
     <None Include="packages.config" />
     <None Include="Properties\licenses.licx" />

+ 10 - 6
XdCxRhDW.App/UserControl/CtrlHome.cs

@@ -577,6 +577,7 @@ namespace XdCxRhDW.App.UserControl
                     if (tsk.TaskType != EnumTaskType.Group)
                     {
                         TxInfo tx;
+                        TxInfo cdb;
                         List<TaskSigDto> tskSigsDto = new List<TaskSigDto>();
                         using (RHDWContext db = new RHDWContext())
                         {
@@ -602,8 +603,9 @@ namespace XdCxRhDW.App.UserControl
                                 tskSigsDto.Add(sigDto);
                             }
 
-                            tx = db.TxInfos.FirstOrDefault();
-                            if (tx == null)
+                            tx = db.TxInfos.FirstOrDefault(p => p.TxType == EnumTxType.Rec);
+                            cdb = db.TxInfos.FirstOrDefault(p => p.TxType == EnumTxType.Cdb);
+                            if (tx == null || cdb == null)
                             {
                                 DxHelper.MsgBoxHelper.ShowWarning($"未配置天线信息");
                                 return;
@@ -632,6 +634,8 @@ namespace XdCxRhDW.App.UserControl
                                 CapDir = tsk.CapDir,
                                 CapLon = tx.Lon,
                                 CapLat = tx.Lat,
+                                CdbLon = cdb.Lon,
+                                CdbLat = cdb.Lat,
                                 DateDirFormat = tsk.CapDirFormat,
                                 Sigs = tskSigsDto,
                             };
@@ -654,7 +658,7 @@ namespace XdCxRhDW.App.UserControl
                         }
                         else if (tsk.PosType == EnumPosType.X3TwoDto)
                         {
-                            
+
                             //下发任务
                             var svtItem = ServerContext.Instance.GetRandomOne(EnumSvrType.X3NoRefTask54);
                             if (svtItem == null)
@@ -678,7 +682,7 @@ namespace XdCxRhDW.App.UserControl
                                 CapLat = tx.Lat,
                                 Sigs = tskSigsDto.ToList()
                             };
-                            var res = await HttpHelper.PostRequestAsync<AjaxResult>(svtItem.BaseHttpAddr + "X2D1NoRefTaskProcessing/Run", dto);
+                            var res = await HttpHelper.PostRequestAsync<AjaxResult>(svtItem.BaseHttpAddr + "X3NoRefTaskProcessing/Run", dto);
                             if (res.code != 200)
                             {
                                 Serilog.Log.Error(res.msg);
@@ -688,7 +692,7 @@ namespace XdCxRhDW.App.UserControl
                         }
                         else
                         {
-                            DxHelper.MsgBoxHelper.ShowError($"暂不支持{tsk.PosType.GetEnumDisplayName()}类型的历史任务");
+                            DxHelper.MsgBoxHelper.ShowError($"暂不支持{tsk.PosType.GetEnumDisplayName()}类型的任务");
                             return;
                         }
                     }
@@ -736,7 +740,7 @@ namespace XdCxRhDW.App.UserControl
                         }
                         TaskStopHandleDto dto = new TaskStopHandleDto();
                         dto.ID = tsk.ID;
-                        var res = await HttpHelper.PostRequestAsync<AjaxResult>(svtItem.BaseHttpAddr + "X2D1NoRefTaskProcessing/Stop", dto);
+                        var res = await HttpHelper.PostRequestAsync<AjaxResult>(svtItem.BaseHttpAddr + "X3NoRefTaskProcessing/Stop", dto);
                         if (res.code != 200)
                         {
                             Serilog.Log.Error(res.msg);