ResultController.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Net.Http;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web.Http;
  9. using Serilog;
  10. using XdCxRhDW.Dto;
  11. using XdCxRhDW.Repostory;
  12. using System.IO;
  13. using XdCxRhDW.Entity;
  14. using XdCxRhDW.Api;
  15. using XdCxRhDW.WebApi;
  16. using DPP_YH_Core.Extensions;
  17. using XdCxRhDW.App.Model;
  18. using System.Diagnostics;
  19. using System.Configuration;
  20. namespace XdCxRhDW.App.Controllers
  21. {
  22. /// <summary>
  23. /// 结果查询相关接口
  24. /// </summary>
  25. public class ResultController : BaseController
  26. {
  27. /// <summary>
  28. /// 根据时间范围查询参估结果
  29. /// </summary>
  30. /// <param name="dto"><see cref="CgResQueryDto"/>查询参数</param>
  31. /// <returns></returns>
  32. /// <exception cref="Exception"></exception>
  33. [HttpPost]
  34. public async Task<AjaxResult<List<CgResDto>>> GetCgResByTimeRange(CgResQueryDto dto)
  35. {
  36. List<CgResDto> cgList = new List<CgResDto>();
  37. try
  38. {
  39. DateTime start = dto.BeginTime;
  40. DateTime end = dto.EndTime;
  41. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  42. if (!Directory.Exists(dir)) return Success(cgList);
  43. List<string> list = new List<string>();
  44. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  45. while (end >= tempStart)
  46. {
  47. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  48. end = end.AddDays(-1);
  49. }
  50. end = dto.EndTime;
  51. foreach (var item in list)
  52. {
  53. var dayFile = Path.Combine(dir, item);
  54. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  55. {
  56. if (db == null) continue;
  57. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  58. if (!dto.IncludeInvalidate)
  59. query = query.Where(p => p.PosLon != 999);
  60. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  61. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  62. var cgRes = await query.Include(p => p.CgRes).Select(t => t.CgRes).Include(t => t.StationRes).OrderByDescending(p => p.SigTime).ToListAsync();
  63. var listDto = MapCgDto(cgRes);
  64. cgList.AddRange(listDto);
  65. }
  66. }
  67. return Success(cgList);
  68. }
  69. catch (TaskCanceledException)
  70. {
  71. string msg = $"参估结果时间范围查询超时.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  72. Serilog.Log.Error(msg);
  73. return Error<List<CgResDto>>("参估结果时间范围查询超时");
  74. }
  75. catch (Exception ex)
  76. {
  77. string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  78. Serilog.Log.Error(ex, msg);
  79. return Error<List<CgResDto>>("参估结果时间范围查询异常");
  80. }
  81. }
  82. #region 定位结果查询接口
  83. /// <summary>
  84. /// 根据时间范围查询定位结果
  85. /// </summary>
  86. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  87. /// <returns></returns>
  88. /// <exception cref="Exception"></exception>
  89. [HttpPost]
  90. public async Task<AjaxResult<List<PosResDto>>> GetPosResByTimeRange(PosRequestByTimeRangeDto dto)
  91. {
  92. var response = (await GetPosResByTimeRangeObsolete(dto));
  93. if (response.code == 200)
  94. {
  95. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  96. return Success(listDto);
  97. }
  98. else
  99. {
  100. return Error<List<PosResDto>>(response.msg);
  101. }
  102. }
  103. /// <summary>
  104. /// 查询最后X小时的的定位结果
  105. /// </summary>
  106. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  107. /// <returns></returns>
  108. /// <exception cref="Exception"></exception>
  109. [HttpPost]
  110. public async Task<AjaxResult<List<PosResDto>>> GetPosResByLastHours(PosRequestByLastRangeDto dto)
  111. {
  112. var response = (await GetPosResByLastHoursObsolete(dto));
  113. if (response.code == 200)
  114. {
  115. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  116. return Success(listDto);
  117. }
  118. else
  119. {
  120. return Error<List<PosResDto>>(response.msg);
  121. }
  122. }
  123. /// <summary>
  124. /// 根据时间范围查询定位结果(此方法内部调用)
  125. /// </summary>
  126. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  127. /// <returns></returns>
  128. /// <exception cref="Exception"></exception>
  129. [HttpPost]
  130. [Obsolete]
  131. public async Task<AjaxResult<List<PosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  132. {
  133. List<PosRes> posList = new List<PosRes>();
  134. try
  135. {
  136. DateTime start = dto.BeginTime;
  137. DateTime end = dto.EndTime;
  138. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  139. if (!Directory.Exists(dir)) return Success(posList);
  140. List<string> list = new List<string>();
  141. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  142. while (end >= tempStart)
  143. {
  144. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  145. end = end.AddDays(-1);
  146. }
  147. end = dto.EndTime;
  148. List<TargetInfo> targets;
  149. using (RHDWContext dbBasic = new RHDWContext())
  150. {
  151. targets = await dbBasic.TargetInfos.ToListAsync();
  152. }
  153. foreach (var item in list)
  154. {
  155. var dayFile = Path.Combine(dir, item);
  156. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  157. {
  158. if (db == null) continue;
  159. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  160. if (!dto.IncludeInvalidate)
  161. query = query.Where(p => p.PosLon != 999);
  162. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  163. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  164. var posRes = await query.Include(p => p.CheckRes).OrderByDescending(p => p.SigTime).ToListAsync();
  165. foreach (var itemPos in posRes)
  166. {
  167. if (itemPos.TargetInfoID > 0)
  168. {
  169. itemPos.TargetInfo = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  170. if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
  171. itemPos.ColorKey = itemPos.TargetInfo.TargeColor;
  172. }
  173. }
  174. posList.AddRange(posRes);
  175. }
  176. }
  177. return Success(posList);
  178. }
  179. catch (Exception ex)
  180. {
  181. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  182. Serilog.Log.Error(ex, msg);
  183. return Error<List<PosRes>>("定位结果时间范围查询异常");
  184. }
  185. }
  186. /// <summary>
  187. /// 根据时间范围查询定位结果(此方法内部调用)
  188. /// </summary>
  189. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  190. /// <returns></returns>
  191. /// <exception cref="Exception"></exception>
  192. [HttpPost]
  193. [Obsolete]
  194. public async Task<AjaxResult<List<RePosRes>>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  195. {
  196. List<RePosRes> posList = new List<RePosRes>();
  197. try
  198. {
  199. DateTime start = dto.BeginTime;
  200. DateTime end = dto.EndTime;
  201. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  202. if (!Directory.Exists(dir)) return Success(posList);
  203. List<string> list = new List<string>();
  204. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  205. while (end >= tempStart)
  206. {
  207. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  208. end = end.AddDays(-1);
  209. }
  210. end = dto.EndTime;
  211. List<TargetInfo> targets;
  212. using (RHDWContext dbBasic = new RHDWContext())
  213. {
  214. targets = await dbBasic.TargetInfos.ToListAsync();
  215. }
  216. foreach (var item in list)
  217. {
  218. var dayFile = Path.Combine(dir, item);
  219. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  220. {
  221. if (db == null) continue;
  222. var query = db.PosRes.Where(p => p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  223. if (!dto.IncludeInvalidate)
  224. query = query.Where(p => p.PosLon != 999);
  225. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  226. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  227. var posRes = await query.OrderByDescending(p => p.SigTime).ToListAsync();
  228. foreach (var itemPos in posRes)
  229. {
  230. var repos = new RePosRes();
  231. repos.ID = itemPos.ID;
  232. repos.SigTime = itemPos.SigTime;
  233. repos.PosLon = itemPos.PosLon;
  234. repos.PosLat = itemPos.PosLat;
  235. repos.MirrLon = itemPos.MirrLon;
  236. repos.MirrLat = itemPos.MirrLat;
  237. repos.TaskInfoID = itemPos.TaskInfoID;
  238. repos.FreqUpHz = itemPos.FreqUpHz;
  239. repos.StationResID = itemPos.StationResID;
  240. repos.CxResID = itemPos.CxResID;
  241. repos.CgResID = itemPos.CgResID;
  242. repos.CheckResID = itemPos.CheckResID;
  243. repos.PosResType = itemPos.PosResType;
  244. repos.TargetState = itemPos.TargetState;
  245. repos.TargetInfo = targets?.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  246. if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
  247. {
  248. repos.ColorKey = itemPos.TargetInfo.TargeColor;
  249. }
  250. repos.BaseTargetName = itemPos.TargetInfo?.TargetName;
  251. repos.CheckRes = await db.CheckRes.FirstOrDefaultAsync(p => p.ID == itemPos.CheckResID);
  252. repos.BaseCheckType = itemPos.CheckRes?.PosCheckType?.GetEnumDisplayName();
  253. repos.CgRes = await db.CgRes.FirstOrDefaultAsync(p => p.ID == itemPos.CgResID);
  254. repos.CxRes = await db.CxRes.FirstOrDefaultAsync(p => p.ID == itemPos.CxResID);
  255. repos.StationRes = await db.StationRes.FirstOrDefaultAsync(p => p.ID == itemPos.StationResID);
  256. posList.Add(repos);
  257. }
  258. }
  259. }
  260. return Success(posList);
  261. }
  262. catch (Exception ex)
  263. {
  264. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  265. Serilog.Log.Error(ex, msg);
  266. return Error<List<RePosRes>>("定位结果时间范围查询异常");
  267. }
  268. }
  269. /// <summary>
  270. /// 查询最后X小时的的定位结果(此方法内部调用)
  271. /// </summary>
  272. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  273. /// <returns></returns>
  274. /// <exception cref="Exception"></exception>
  275. [HttpPost]
  276. [Obsolete]
  277. public async Task<AjaxResult<List<PosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
  278. {
  279. List<PosRes> posList = new List<PosRes>();
  280. try
  281. {
  282. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  283. if (!Directory.Exists(dir)) return Success(posList);
  284. var yearDirs = Directory.EnumerateDirectories(dir).OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name));//年目录,倒叙排列
  285. DateTime max = DateTime.MinValue;
  286. foreach (var yearDir in yearDirs)
  287. {
  288. if (max != DateTime.MinValue) break;
  289. //每一天的db文件,倒序排列
  290. var dayFiles = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, yearDir), "*.db").OrderByDescending(p => Convert.ToInt32(new DirectoryInfo(p).Name.Substring(0, 4)));
  291. foreach (var dayFile in dayFiles)
  292. {
  293. using (RHDWPartContext db = RHDWPartContext.GetContext(dayFile))
  294. {
  295. if (db == null) continue;
  296. var query = db.PosRes.Where(p => p.TaskInfoID == dto.TaskInfoID);
  297. if (!dto.IncludeInvalidate)
  298. {
  299. query = query.Where(p => p.PosLon != 999);
  300. }
  301. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  302. {
  303. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz);
  304. }
  305. bool any = await query.AnyAsync();
  306. if (any)
  307. max = await query.MaxAsync(p => p.SigTime);
  308. }
  309. if (max != DateTime.MinValue)
  310. {
  311. break;
  312. }
  313. }
  314. }
  315. if (max == DateTime.MinValue) return Success(posList);
  316. DateTime min = max.AddHours(-dto.Hours);
  317. var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto()
  318. {
  319. TaskInfoID = dto.TaskInfoID,
  320. BeginTime = min,
  321. EndTime = max,
  322. IncludeInvalidate = dto.IncludeInvalidate,
  323. TarFrequpHz = dto.TarFrequpHz,
  324. });
  325. return res;
  326. }
  327. catch (Exception ex)
  328. {
  329. string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}";
  330. Serilog.Log.Error(ex, msg);
  331. return Error<List<PosRes>>("定位结果查询最新数据异常");
  332. }
  333. }
  334. #endregion
  335. private PosResDto MapDto(PosRes res)
  336. {
  337. return new PosResDto()
  338. {
  339. ID = res.ID,
  340. FreqUpHz = res.FreqUpHz,
  341. SigTime = res.SigTime,
  342. TaskInfoID = res.TaskInfoID,
  343. TarName = res.TargetInfo?.TargetName,
  344. PosLon = res.PosLon,
  345. PosLat = res.PosLat,
  346. MirrLon = res.MirrLon,
  347. MirrLat = res.MirrLat,
  348. CheckType = res.CheckRes?.PosCheckType == null ? "" : res.CheckRes?.PosCheckType?.GetEnumDisplayName(),
  349. TargetState = (EnumTargetStateDto)res.TargetState,
  350. PosResType = (EnumPosResTypeDto)res.PosResType,
  351. Confidence = res.Confidence,
  352. CreateTime = res.CreateTime,
  353. };
  354. }
  355. private List<CgResDto> MapCgDto(List<CgRes> listCg)
  356. {
  357. List<CgResDto> list = new List<CgResDto>();
  358. foreach (CgRes cgRes in listCg)
  359. {
  360. var dto = new CgResDto()
  361. {
  362. ID = cgRes.ID,
  363. TaskID = cgRes.TaskID,
  364. FreqUpHz = cgRes.TarFreqUp == null ? 0 : (long)(cgRes.TarFreqUp.Value),
  365. SigTime = cgRes.SigTime,
  366. Dto1 = cgRes.Dto1,
  367. Dfo1 = cgRes.Dfo1,
  368. Snr1 = cgRes.Snr1,
  369. Dto2 = cgRes.Dto2,
  370. Dfo2 = cgRes.Dfo2,
  371. Snr2 = cgRes.Snr2,
  372. DtoCdb = cgRes.DtoCdb,
  373. DfoCdb = cgRes.DfoCdb,
  374. SnrCdb = cgRes.SnrCdb,
  375. YbMainDto = cgRes.YbMainDto,
  376. YbMainDfo = cgRes.YbMainDfo,
  377. YbMainSnr = cgRes.YbMainSnr,
  378. YbAdja1Dto = cgRes.YbAdja1Dto,
  379. YbAdja1Dfo = cgRes.YbAdja1Dfo,
  380. YbAdja1Snr = cgRes.YbAdja1Snr,
  381. YbAdja2Dfo = cgRes.YbAdja2Dfo,
  382. YbAdja2Dto = cgRes.YbAdja2Dto,
  383. YbAdja2Snr = cgRes.YbAdja2Snr,
  384. TarFreqUp = cgRes.TarFreqUp,
  385. TarFreqDown = cgRes.TarFreqDown,
  386. RefFreqUp = cgRes.RefFreqUp,
  387. RefFreqDown = cgRes.RefFreqDown,
  388. MainCode = cgRes.MainCode,
  389. Adja1Code = cgRes.Adja1Code,
  390. Adja2Code = cgRes.Adja2Code,
  391. MainXlTime = cgRes.MainXlTime,
  392. Adja1XlTime = cgRes.Adja1XlTime,
  393. Adja2XlTime = cgRes.Adja2XlTime,
  394. MainX = cgRes.MainX,
  395. MainY = cgRes.MainY,
  396. MainZ = cgRes.MainZ,
  397. MainVx = cgRes.MainVx,
  398. MainVy = cgRes.MainVy,
  399. MainVz = cgRes.MainVz,
  400. Adja1X = cgRes.Adja1X,
  401. Adja1Y = cgRes.Adja1Y,
  402. Adja1Z = cgRes.Adja1Z,
  403. Adja1Vx = cgRes.Adja1Vx,
  404. Adja1Vy = cgRes.Adja1Vy,
  405. Adja1Vz = cgRes.Adja1Vz,
  406. Adja2X = cgRes.Adja2X,
  407. Adja2Y = cgRes.Adja2Y,
  408. Adja2Z = cgRes.Adja2Z,
  409. Adja2Vx = cgRes.Adja2Vx,
  410. Adja2Vy = cgRes.Adja2Vy,
  411. Adja2Vz = cgRes.Adja2Vz,
  412. SatTxLon = cgRes.StationRes.SatTxLon,
  413. SatTxLat = cgRes.StationRes.SatTxLat,
  414. CdbTxLon = cgRes.StationRes.CdbTxLon,
  415. CdbTxLat = cgRes.StationRes.CdbTxLat,
  416. CxLon = cgRes.StationRes.CxLon,
  417. CxLat = cgRes.StationRes.CxLat,
  418. RefLon = cgRes.StationRes.RefLon,
  419. RefLat = cgRes.StationRes.RefLat,
  420. CreateTime = cgRes.CreateTime,
  421. };
  422. list.Add(dto);
  423. }
  424. return list;
  425. }
  426. }
  427. }