using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using XdCxRhDW.Dto; using XdCxRhDW.Entity; namespace XdCxRhDW.App.Service { public class FileWriterService { string posDir;//定位结果txt存储目录 string stateDir;//状态上报txt存储目录 Random r = new Random(); public FileWriterService() { this.posDir = ConfigurationManager.AppSettings["PosResDir"].Trim(); this.stateDir = ConfigurationManager.AppSettings["StateRptDir"].Trim(); Directory.CreateDirectory(posDir); Directory.CreateDirectory(stateDir); } public void WritePosRes(PosResWriteDto posDto) { var val = (r.Next(90, 96) + r.NextDouble()) * 10; var valInt = (int)val; StringBuilder sb = new StringBuilder(); sb.Append($"{posDto.SigTime:yyyy}\t"); sb.Append($"{posDto.SigTime:MM}\t"); sb.Append($"{posDto.SigTime:dd}\t"); sb.Append($"{posDto.SigTime:HH}\t"); sb.Append($"{posDto.SigTime:mm}\t"); sb.Append($"{posDto.SigTime:ss}\t"); sb.Append($"{posDto.SigTime:fff}\t"); sb.Append($"{posDto.SigTimeLenMs:D4}\t");//信号持续时间ms sb.Append($"{Convert.ToInt64(posDto.FreqDownMHz * 1e6):D12}\t");//下行频点 sb.Append($"{Convert.ToInt64(posDto.FreqUpMHz * 1e6):D12}\t");//上行频点 sb.Append($"{GetSignalType(posDto.SigModType)}\t");//信号样式(0:未知 1:CPM 2:BPSK 4:QPSK), sb.Append($"{0:D4}\t");//目标序号 sb.Append($"res\t"); sb.Append($"{Convert.ToInt64(posDto.PosLon * 1e6):D10}\t"); sb.Append($"{Convert.ToInt64(posDto.PosLat * 1e6):D10}\t"); sb.Append($"{Convert.ToInt64(0 * 1e3):D8}\t");//定位误差km sb.Append($"{Convert.ToInt64(posDto.Dto1 * 1e2):D10}\t"); sb.Append($"{Convert.ToInt64(posDto.Dfo1 * 1e2):D10}\t"); sb.Append($"{Convert.ToInt64(posDto.Snr1 * 1e2):D6}\t"); sb.Append($"{Convert.ToInt64(posDto.Dto2 * 1e2):D10}\t"); sb.Append($"{Convert.ToInt64(posDto.Dfo2 * 1e2):D10}\t"); sb.Append($"{Convert.ToInt64(posDto.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($"{(long)posDto.LongRadius:D8}\t");//长轴m sb.Append($"{(long)posDto.ShortRadius:D8}\t");//短轴m sb.Append($"{(long)posDto.DipAngle:D7}\t");//倾角° sb.Append($"{posDto.TsCount:D2}\t");//时隙名称CCOW之类的 sb.Append($"{1}\t");//所属卫星 sb.Append($"{valInt:D3}\t");//置信度 sb.Append($"{posDto.PosType}\t");//定位体制(0未知,1高轨多星,2高低轨,3星地,4星座) sb.Append($"{(long)posDto.ModRate:D12}\t");//符号速率bps 12个 sb.Append($"{Convert.ToInt64(posDto.CdbLon * 1e6):D10}\t");//超短站经度 sb.Append($"{Convert.ToInt64(posDto.CdbLat * 1e6):D10}\t");//超短站纬度 sb.Append("\r\n"); string flag = ""; if (posDto.PosTypeDto == EnumPosTypeDto.X2D1) flag = "两星一地"; else if (posDto.PosTypeDto == EnumPosTypeDto.X3TwoDto) flag = "高轨多星"; else if (posDto.PosTypeDto == EnumPosTypeDto.X1Leo) flag = "低轨单星"; else if (posDto.PosTypeDto == EnumPosTypeDto.X2Leo) flag = "低轨双星"; else if (posDto.PosTypeDto == EnumPosTypeDto.X3Leo) flag = "低轨三星"; string resFile = Path.Combine(posDir, $"{flag}定位结果_{DateTime.Now:yyyyMMdd}.txt"); string txt = sb.ToString(); lock (this) { File.AppendAllText(resFile, txt); } } private int GetSignalType(string modTypestr) { EnumSignalTypeDto modType = modTypestr.GetEnumByDisplayName(); //0:未知 1:CPM 2:BPSK 4:QPSK int signalType = 0; if (modType == EnumSignalTypeDto.BPSK) { signalType = 2; } else if (modType == EnumSignalTypeDto.QPSK) { signalType = 4; } return signalType; } public void WriteStateRes(SvrStateReportDto dto) { if (string.IsNullOrWhiteSpace(dto.DevId)) return; int flag = 20; if (dto.SvrType == EnumSvrType.PosPlatform) flag = 20; if (dto.SvrType == EnumSvrType.X2D1NoRefTask54) flag = 30; else if (dto.SvrType == EnumSvrType.X3NoRefTask54) flag = 40; else if (dto.SvrType == EnumSvrType.LeoX1Task54) flag = 50; else if (dto.SvrType == EnumSvrType.LeoX2Task54) flag = 60; else if (dto.SvrType == EnumSvrType.LeoX3Task54) flag = 70; else if (dto.SvrType == EnumSvrType.CpuCgSvr) flag = 80; else if (dto.SvrType == EnumSvrType.GpuCgSvr) flag = 90; else if (dto.SvrType == EnumSvrType.CheckSvr) flag = 100; else if (dto.SvrType == EnumSvrType.CgDbScan) flag = 110; flag = flag + (int)dto.ModuleType; var now = DateTime.Now; StringBuilder sb = new StringBuilder(); sb.Append($"{now:yyyy}\t"); sb.Append($"{now:MM}\t"); sb.Append($"{now:dd}\t"); sb.Append($"{now:HH}\t"); sb.Append($"{now:mm}\t"); sb.Append($"{now:ss}\t"); sb.Append($"{now:fff}\t"); sb.Append($"{(int)dto.ModuleState:D4}\t");//模块状态 0=故障, 1=正常,2=空闲 3=工作 sb.Append($"{0:D12}\t");//下行频点 sb.Append($"{0:D12}\t");//上行频点 sb.Append($"{flag}\t");//状态模块 sb.Append($"{dto.DevId:D4}\t");//设备编号:星地采集设备=1003,星座采集设备=1004,参数估计设备=2003|2004,定位处理设备=3003|3004 sb.Append($"res\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D8}\t");//定位误差km sb.Append($"{0:D10}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D6}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D6}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D10}\t"); sb.Append($"{0:D6}\t"); sb.Append($"{0:D8}\t");//长轴m sb.Append($"{0:D8}\t");//短轴m sb.Append($"{0:D7}\t");//倾角° sb.Append($"{0:D2}\t");//时隙属性 sb.Append($"{0}\t");//所属卫星 sb.Append($"{0:D3}\t");//置信度 sb.Append($"{0}\t");//定位体制(0未知,1高轨多星,2高低轨,3星地,4星座) sb.Append($"{0:D12}\t");//符号速率bps 12个 sb.Append($"{0:D10}\t");//超短站经度 sb.Append($"{0:D10}\t");//超短站纬度 sb.Append("\r\n"); string sysFlag; if (ConfigurationManager.AppSettings["DevID"].Trim() == "3004") sysFlag = "星座"; else sysFlag = "星地"; string resFile = Path.Combine(stateDir, $"{sysFlag}系统状态上报结果_{now:yyyyMMdd}.txt"); string txt = sb.ToString(); lock (this) { File.AppendAllText(resFile, txt); } /* * 模块编号说明 * 20=联合定位平台, 21=IP 22=端口 23=程序 24=文件 25=星历 26=内存 27=磁盘 30=星地数据处理服务 31=同21 ... 40=高轨三星数据处理服务 41=同21 ... 50=低轨单星数据处理服务 ... 60=低轨双星数据处理服务 ... 70=低轨三星数据处理服务 ... 80=CPU参数估计服务 ... 90=GPU参数估计服务 ... 100=信号检测服务 ... 110=参估编批服务 ... */ } } }