AdFsHistoryWorker.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using DevExpress.Xpo;
  2. using Ips.Library.Basic;
  3. using Ips.Library.Entity;
  4. using Ips.Library.LocLib;
  5. using Ips.Library.Signals;
  6. using Ips.Sps.Adcs;
  7. using Ips.Sps.Scheduling.Entities;
  8. using Ips.Sps.Sigs;
  9. using Ips.Sps.TskResults.Pases;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Globalization;
  13. using System.IO.Compression;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. namespace Ips.Sps.Scheduling.SigAds
  18. {
  19. public class AdFsHistoryWorker : AdWorkerBase
  20. {
  21. public AdFsHistoryWorker(RunTsk context) : base(context)
  22. {
  23. }
  24. public override void Execute(CancellationToken token = default)
  25. {
  26. if (CurrentTsk.SigTime < CurrentTsk.StartTime)
  27. {
  28. CurrentTsk.SigTime = CurrentTsk.StartTime;
  29. }
  30. try
  31. {
  32. ExcuteInternal(token);
  33. }
  34. finally
  35. {
  36. CurrentTsk.SigTime = CurrentTsk.StopTime;
  37. }
  38. }
  39. private void ExcuteInternal(CancellationToken token)
  40. {
  41. var startTime = CurrentTsk.StartTime;
  42. var stopTime = CurrentTsk.StopTime;
  43. var adCard = CurrentTsk.AdCard;
  44. if (string.IsNullOrWhiteSpace(adCard.StorePath))
  45. {
  46. throw new Exception($"采集管理->{adCard.CardName}未设置落盘目录!");
  47. }
  48. try
  49. {
  50. Directory.CreateDirectory(adCard.StorePath);
  51. }
  52. catch
  53. {
  54. throw new Exception($"采集管理->{adCard.CardName}设置的落盘目录{adCard.StorePath}创建失败!");
  55. }
  56. var storeDir = new DirectoryInfo(adCard.StorePath);
  57. var fileTimeLen = SignalFile.SigTimeFileFormat.Length;
  58. var allSigList = CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList);
  59. SortedDictionary<DateTime, Dictionary<RunSig, List<SignalFile>>> timeFileList = new();
  60. foreach (var dateDir in storeDir.EnumerateDirectories("????????_??"))
  61. {
  62. if (token.IsCancellationRequested) break;
  63. if (DateTime.TryParseExact(dateDir.Name, SignalFile.SigTimeFolderFormat, null, DateTimeStyles.None, out DateTime date))
  64. {
  65. if (date.AddHours(1) > startTime && date < stopTime)
  66. {
  67. foreach (var fileItem in dateDir.EnumerateFiles("*.dat"))
  68. {
  69. if (token.IsCancellationRequested) break;
  70. var fileTimeStr = fileItem.Name.Left(fileTimeLen);
  71. if (fileTimeStr.Length != fileTimeLen) continue;
  72. if (DateTime.TryParseExact(fileTimeStr, SignalFile.SigTimeFileFormat, null, DateTimeStyles.None, out DateTime fileTime))
  73. {
  74. if (fileTime < startTime && fileTime > stopTime) continue;
  75. var sigFile = SignalFile.Parse(fileItem.Name);
  76. if (sigFile.AdcCode != CurrentTsk.AdCard.CardCode) continue;
  77. if (CurrentTsk.AdCard.Channels.Any(m => m.AntCode == sigFile.SiteCode) is false) continue;
  78. var runSig = allSigList.FirstOrDefault(m => m.SigFreq == sigFile.SigFreq
  79. && m.BandWidth == sigFile.BandWidth
  80. && m.Fs == sigFile.Fs);
  81. if (runSig == null) continue;
  82. if (!timeFileList.ContainsKey(fileTime))
  83. {
  84. timeFileList.Add(fileTime, new Dictionary<RunSig, List<SignalFile>>());
  85. }
  86. if (!timeFileList[fileTime].ContainsKey(runSig))
  87. {
  88. timeFileList[fileTime].Add(runSig, new List<SignalFile>());
  89. }
  90. timeFileList[fileTime][runSig].Add(sigFile);
  91. }
  92. }
  93. }
  94. }
  95. }
  96. foreach (var timeFiles in timeFileList)
  97. {
  98. if (token.IsCancellationRequested) break;
  99. var sigTime = timeFiles.Key;
  100. DateTime groupTime = sigTime;
  101. var adGroup = new AdSigGroup(CurrentTsk.TskId, groupTime);
  102. OnAdSigGroupStart(new AdSigGroupStartEventArgs(adGroup));
  103. foreach (var sigFiles in timeFiles.Value.OrderBy(m => m.Key.SigCategory != SignalCategory.RefSig))
  104. {
  105. var runSig = sigFiles.Key;
  106. List<Pas> pasList = new List<Pas>();
  107. foreach (var sigFile in sigFiles.Value)
  108. {
  109. if (token.IsCancellationRequested) break;
  110. var satNum = sigFile.SatNum.To(0);
  111. var ch = CurrentTsk.AdCard.Channels.Find(m => m.Sats.Any(m => m.SatNum == satNum));
  112. var sat = ch.Sats.Find(m => m.SatNum == satNum);
  113. if (ch != null && sat != null)
  114. {
  115. //var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  116. //var adfile = SignalFile.Create(sigTime, runSig.SigFreq, runSig.BandWidth, runSig.Fs, ch.AntCode, adCard.CardCode, ch.ChNum, satNum);
  117. var pas = CreatePas(runSig, adGroup.GroupTime, sigTime, sat, adCard, ch, sigFile);
  118. if (pas != null)
  119. pasList.Add(pas);
  120. }
  121. }
  122. var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, runSig, sigTime, pasList);
  123. adGroup.GroupSigList.Add(adSigResult);
  124. }
  125. foreach (var sig in CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList))
  126. {
  127. token.ThrowIfCancellationRequested();
  128. var pasList = FindSigFileByTime(sig, CurrentTsk.SigTime, CurrentTsk.AdCard, adGroup, token);
  129. var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, sigTime, pasList);
  130. adGroup.GroupSigList.Add(adSigResult);
  131. }
  132. adGroup.GroupSigList.CompleteAdding();
  133. }
  134. }
  135. protected virtual void ExecuteFixTimeFile(CancellationToken token = default)
  136. {
  137. if (CurrentTsk.SigTime < CurrentTsk.StartTime)
  138. {
  139. CurrentTsk.SigTime = CurrentTsk.StartTime.AddSeconds(CurrentTsk.StartTime.Second / 15 * 15);
  140. }
  141. while (CurrentTsk.SigTime < CurrentTsk.StopTime)
  142. {
  143. DateTime groupTime = CurrentTsk.SigTime;
  144. var adGroup = new AdSigGroup(CurrentTsk.TskId, groupTime);
  145. OnAdSigGroupStart(new AdSigGroupStartEventArgs(adGroup));
  146. foreach (var sig in CurrentTsk.RefSigList.Concat(CurrentTsk.TarSigList))
  147. {
  148. token.ThrowIfCancellationRequested();
  149. var pasList = FindSigFileByTime(sig, CurrentTsk.SigTime, CurrentTsk.AdCard, adGroup, token);
  150. var adSigResult = new AdSigResult(adGroup.TskId, adGroup.GroupTime, sig, CurrentTsk.SigTime, pasList);
  151. adGroup.GroupSigList.Add(adSigResult);
  152. }
  153. adGroup.GroupSigList.CompleteAdding();
  154. CurrentTsk.SigTime = CurrentTsk.SigTime.AddSeconds(15);
  155. }
  156. }
  157. protected List<Pas> FindSigFileByTime(RunSig sig, DateTime sigTime, RunAdCard adCard, AdSigGroup adGroup, CancellationToken token = default)
  158. {
  159. var fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);
  160. List<Pas> pasList = new List<Pas>();
  161. if (sig.MainSatId > 0)
  162. {
  163. var pas = FindSigSatPas(sig.MainSatId, sig, sigTime, adCard, adGroup);
  164. pasList.AddIf(pas != null, pas);
  165. }
  166. foreach (var satid in sig.AdjaSatIds)
  167. {
  168. var pas = FindSigSatPas(satid, sig, sigTime, adCard, adGroup);
  169. pasList.AddIf(pas != null, pas);
  170. }
  171. return pasList;
  172. }
  173. protected Pas FindSigSatPas(int satId, RunSig sig, DateTime sigTime, RunAdCard adCard, AdSigGroup adGroup)
  174. {
  175. Pas result = null;
  176. var ch = adCard.Channels.Find(m => m.Sats.Any(m => m.SatId == satId));
  177. if (ch != null)
  178. {
  179. var sat = ch.Sats.Find(m => m.SatId == satId);
  180. var freqInfo = SigCalcUtil.GetFreqPointBySigFreq(sig.SigFreq, sat.SatType, sat.SatTurn, ch.FrqTurn);
  181. var adfile = SignalFile.Create(sigTime, sig.SigFreq, sig.BandWidth, sig.Fs, ch.AntCode, adCard.CardCode, ch.ChNum, satId.ToString());
  182. result = CreatePas(sig, adGroup.GroupTime, sigTime, sat, adCard, ch, adfile);
  183. }
  184. return result;
  185. }
  186. protected Pas CreatePas(RunSig sig, DateTime groupTime, DateTime sigTime, RunSat sat, RunAdCard adCard, RunAdCh adCh, SignalFile adFile)
  187. {
  188. string fullName = adFile.GetLocalFullName(adCard.StorePath);
  189. if (!File.Exists(fullName)) return null;
  190. Pas pas = new Pas();
  191. pas.TskId = CurrentTsk.TskId;
  192. pas.GroupTime = groupTime;
  193. pas.SigId = sig.SigId;
  194. pas.EmtId = sig.EmtId;
  195. pas.SigTime = sigTime;
  196. pas.SigFreq = sig.SigFreq;
  197. pas.BandWidth = sig.BandWidth;
  198. pas.CreateTime = DateTime.Now;
  199. pas.SatId = sat.SatId;
  200. pas.SatNum = sat.SatNum;
  201. pas.SigCategory = sig.SigCategory;
  202. pas.SigType = sig.SigType;
  203. pas.SigLen = sig.SigLen;
  204. pas.Fs = SigCalcUtil.CalcFs(adCard.ClockFreq, sig.BandWidth, adCard.Mutil);
  205. pas.SatCode = sat.SatCode;
  206. pas.AdCardId = adCard.CardId;
  207. pas.AdChId = adCh.ChId;
  208. pas.ChNum = adFile.ChNum;
  209. pas.FolderName = adFile.DirectoryName;
  210. pas.FileName = adFile.FileName;
  211. pas.AntId = adCh.AntId;
  212. pas.AntCode = adCh.AntCode;
  213. pas.AntLon = adCh.AntLon;
  214. pas.AntLat = adCh.AntLat;
  215. pas.AntAlt = adCh.AntAlt;
  216. return pas;
  217. }
  218. protected void FindFile(CancellationToken token)
  219. {
  220. }
  221. }
  222. }