| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | using DevExpress.Xpo;using Ips.Library.Basic;using Ips.Library.Entity;using Ips.Library.LocLib;using Ips.Library.Signals;using Ips.Sps.Adcs;using Ips.Sps.Scheduling.Entities;using Ips.Sps.Sigs;using Ips.Sps.TskResults.Pases;using System;using System.Collections.Generic;using System.Globalization;using System.IO.Compression;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Ips.Sps.Scheduling.SigAds{    public class AdFsHistoryWorker : AdWorkerBase    {        public AdFsHistoryWorker(RunTsk context) : base(context)        {        }        public override void Execute(CancellationToken token = default)        {            if (CurrentTsk.SigTime < CurrentTsk.StartTime)            {                CurrentTsk.SigTime = CurrentTsk.StartTime;            }            try            {                ExcuteInternal(token);            }            finally            {                CurrentTsk.SigTime = CurrentTsk.StopTime;            }        }        private void ExcuteInternal(CancellationToken token)        {            var startTime = CurrentTsk.StartTime;            var stopTime = CurrentTsk.StopTime;            var adCard = CurrentTsk.AdCard;            if (string.IsNullOrWhiteSpace(adCard.StorePath))            {                throw new Exception($"采集管理->{adCard.CardName}未设置落盘目录!");            }            try            {                Directory.CreateDirectory(adCard.StorePath);            }            catch            {                throw new Exception($"采集管理->{adCard.CardName}设置的落盘目录{adCard.StorePath}创建失败!");            }            var storeDir = new DirectoryInfo(adCard.StorePath);            var fileTimeLen = SignalFile.SigTimeFileFormat.Length;            var allSigList = CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList);            SortedDictionary<DateTime, Dictionary<RunSig, List<SignalFile>>> timeFileList = new();            foreach (var dateDir in storeDir.EnumerateDirectories("????????_??"))            {                if (token.IsCancellationRequested) break;                if (DateTime.TryParseExact(dateDir.Name, SignalFile.SigTimeFolderFormat, null, DateTimeStyles.None, out DateTime date))                {                    if (date.AddHours(1) > startTime && date < stopTime)                    {                        foreach (var fileItem in dateDir.EnumerateFiles("*.dat"))                        {                            if (token.IsCancellationRequested) break;                            var fileTimeStr = fileItem.Name.Left(fileTimeLen);                            if (fileTimeStr.Length != fileTimeLen) continue;                            if (DateTime.TryParseExact(fileTimeStr, SignalFile.SigTimeFileFormat, null, DateTimeStyles.None, out DateTime fileTime))                            {                                if (fileTime < startTime && fileTime > stopTime) continue;                                var sigFile = SignalFile.Parse(fileItem.Name);                                if (sigFile.AdcCode != CurrentTsk.AdCard.CardCode) continue;                                if (CurrentTsk.AdCard.Channels.Any(m => m.AntCode == sigFile.SiteCode) is false) continue;                                var runSig = allSigList.FirstOrDefault(m => m.SigFreq == sigFile.SigFreq                                                    && m.BandWidth == sigFile.BandWidth                                                    && m.Fs == sigFile.Fs);                                if (runSig == null) continue;                                if (!timeFileList.ContainsKey(fileTime))                                {                                    timeFileList.Add(fileTime, new Dictionary<RunSig, List<SignalFile>>());                                }                                if (!timeFileList[fileTime].ContainsKey(runSig))                                {                                    timeFileList[fileTime].Add(runSig, new List<SignalFile>());                                }                                timeFileList[fileTime][runSig].Add(sigFile);                            }                        }                    }                }            }            foreach (var timeFiles in timeFileList)            {                if (token.IsCancellationRequested) break;                var sigTime = timeFiles.Key;                DateTime groupTime = sigTime;                var adGroup = new AdSigGroup(CurrentTsk.TskId, groupTime);                OnAdSigGroupStart(new AdSigGroupStartEventArgs(adGroup));                foreach (var sigFiles in timeFiles.Value.OrderBy(m => m.Key.SigCategory != SignalCategory.RefSig))                {                    var runSig = sigFiles.Key;                    List<Pas> pasList = new List<Pas>();                    foreach (var sigFile in sigFiles.Value)                    {                        if (token.IsCancellationRequested) break;                        var satNum = sigFile.SatNum.To(0);                        var ch = CurrentTsk.AdCard.Channels.Find(m => m.Sats.Any(m => m.SatNum == satNum));                        var sat = ch.Sats.Find(m => m.SatNum == satNum);                        if (ch != null && sat != null)                        {                            //var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);                            //var adfile = SignalFile.Create(sigTime, runSig.SigFreq, runSig.BandWidth, runSig.Fs, ch.AntCode, adCard.CardCode, ch.ChNum, satNum);                            var pas = CreatePas(runSig, adGroup.GroupTime, sigTime, sat, adCard, ch, sigFile);                            if (pas != null)                                pasList.Add(pas);                        }                    }                    var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, runSig, sigTime, pasList);                    adGroup.GroupSigList.Add(adSigResult);                }                foreach (var sig in CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList))                {                    token.ThrowIfCancellationRequested();                    var pasList = FindSigFileByTime(sig, CurrentTsk.SigTime, CurrentTsk.AdCard, adGroup, token);                    var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, sigTime, pasList);                    adGroup.GroupSigList.Add(adSigResult);                }                adGroup.GroupSigList.CompleteAdding();            }        }        protected virtual void ExecuteFixTimeFile(CancellationToken token = default)        {            if (CurrentTsk.SigTime < CurrentTsk.StartTime)            {                CurrentTsk.SigTime = CurrentTsk.StartTime.AddSeconds(CurrentTsk.StartTime.Second / 15 * 15);            }            while (CurrentTsk.SigTime < CurrentTsk.StopTime)            {                DateTime groupTime = CurrentTsk.SigTime;                var adGroup = new AdSigGroup(CurrentTsk.TskId, groupTime);                OnAdSigGroupStart(new AdSigGroupStartEventArgs(adGroup));                foreach (var sig in CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList))                {                    token.ThrowIfCancellationRequested();                    var pasList = FindSigFileByTime(sig, CurrentTsk.SigTime, CurrentTsk.AdCard, adGroup, token);                    var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, CurrentTsk.SigTime, pasList);                    adGroup.GroupSigList.Add(adSigResult);                }                adGroup.GroupSigList.CompleteAdding();                CurrentTsk.SigTime = CurrentTsk.SigTime.AddSeconds(15);            }        }        protected List<Pas> FindSigFileByTime(RunSig sig, DateTime sigTime, RunAdCard adCard, AdSigGroup adGroup, CancellationToken token = default)        {            var fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);            List<Pas> pasList = new List<Pas>();            if (sig.MainSatId > 0)            {                var pas = FindSigSatPas(sig.MainSatId, sig, sigTime, adCard, adGroup);                pasList.AddIf(pas != null, pas);            }            foreach (var satid in sig.AdjaSatIds)            {                var pas = FindSigSatPas(satid, sig, sigTime, adCard, adGroup);                pasList.AddIf(pas != null, pas);            }            return pasList;        }        protected Pas FindSigSatPas(int satId, RunSig sig, DateTime sigTime, RunAdCard adCard, AdSigGroup adGroup)        {            Pas result = null;            var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == satId));            if (ch != null)            {                var sat = ch.Sats.Find(m => m.SatId == satId);                var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);                var adfile = SignalFile.Create(sigTime, sig.SigFreq, sig.BandWidth, sig.Fs, ch.AntCode, adCard.CardCode, ch.ChNum, satId.ToString());                result = CreatePas(sig, adGroup.GroupTime, sigTime, sat, adCard, ch, adfile);            }            return result;        }        protected Pas CreatePas(RunSig sig, DateTime groupTime, DateTime sigTime, RunSat sat, RunAdCard adCard, RunAdCh adCh, SignalFile adFile)        {            string fullName = adFile.GetLocalFullName(adCard.StorePath);            if (!File.Exists(fullName)) return null;            Pas pas = new Pas();            pas.TskId = CurrentTsk.TskId;            pas.GroupTime = groupTime;            pas.SigId = sig.SigId;            pas.EmtId = sig.EmtId;            pas.SigTime = sigTime;            pas.SigFreq = sig.SigFreq;            pas.BandWidth = sig.BandWidth;            pas.CreateTime = DateTime.Now;            pas.SatId = sat.SatId;            pas.SatNum = sat.SatNum;            pas.SigCategory = sig.SigCategory;            pas.SigType = sig.SigType;            pas.SigLen = sig.SigLen;            pas.Fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);            pas.SatCode = sat.SatCode;            pas.AdCardId = adCard.CardId;            pas.AdChId = adCh.ChId;            pas.ChNum = adFile.ChNum;            pas.FolderName = adFile.DirectoryName;            pas.FileName = adFile.FileName;            pas.AntId = adCh.AntId;            pas.AntCode = adCh.AntCode;            pas.AntLon = adCh.AntLon;            pas.AntLat = adCh.AntLat;            pas.AntAlt = adCh.AntAlt;            return pas;        }        protected void FindFile(CancellationToken token)        {        }    }}
 |