ResultController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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 XdCxRhDW.Dto;
  10. using XdCxRhDW.Repostory;
  11. using System.IO;
  12. using XdCxRhDW.Entity;
  13. using XdCxRhDW.Api;
  14. using XdCxRhDW.WebApi;
  15. using DPP_YH_Core.Extensions;
  16. using XdCxRhDW.App.Model;
  17. using System.Diagnostics;
  18. using System.Configuration;
  19. using DevExpress.Mvvm.Native;
  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> cgRes = null;
  37. try
  38. {
  39. var start = dto.BeginTime.ToString("yyyy-MM-dd HH:mm:ss");
  40. var end = dto.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
  41. using (MySqlContext db = new MySqlContext())
  42. {
  43. string sql = $"select a.*,b.SatTxLon,b.SatTxLat,b.CdbTxLon,b.CdbTxLat,b.CxLon,b.CxLat,b.RefLon,b.RefLat from cgres a left join stationres b on a.StationResID=b.ID and b.SigTime>='{start}' and b.SigTime<='{end}' where a.SigTime>='{start}' and a.SigTime<='{end}' and a.Deleted=0 and a.TaskID={dto.TaskInfoID} ";
  44. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  45. sql = $"{sql} and TarFreqUp={dto.TarFrequpHz.Value} ";
  46. sql = $"{sql} order by SigTime desc ";
  47. cgRes = await db.SqlQueryAsync<CgResDto>(sql);
  48. }
  49. return Success(cgRes);
  50. }
  51. catch (TaskCanceledException)
  52. {
  53. string msg = $"参估结果时间范围查询超时.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  54. XdCxRhDW.Framework.LogHelper.Error(msg);
  55. return Error<List<CgResDto>>("参估结果时间范围查询超时");
  56. }
  57. catch (Exception ex)
  58. {
  59. string msg = $"参估结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  60. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  61. return Error<List<CgResDto>>("参估结果时间范围查询异常");
  62. }
  63. }
  64. /// <summary>
  65. /// 获取指定任务的所有上行频点
  66. /// </summary>
  67. /// <param name="dto">任务频点查询模型</param>
  68. /// <returns>任务所有频点信息</returns>
  69. /// <exception cref="Exception"></exception>
  70. [HttpPost]
  71. public async Task<AjaxResult<List<TaskFreqResDto>>> GetTaskFreqs(TaskFreqQueryDto dto)
  72. {
  73. List<long> posList = null;
  74. try
  75. {
  76. using (MySqlContext db = new MySqlContext())
  77. {
  78. posList = await db.PosRes.Where(p => p.Deleted == 0 && p.TaskInfoID == dto.TaskInfoID).Select(p => p.FreqUpHz).Distinct().ToListAsync();
  79. }
  80. var res = posList.Select(p => new TaskFreqResDto() { FreqUpHz = p }).OrderBy(o => o.FreqUpHz).ToList();
  81. return Success(res);
  82. }
  83. catch (Exception ex)
  84. {
  85. string msg = $"任务上行频点查询异常-任务编号:{dto.TaskInfoID}";
  86. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  87. return Error<List<TaskFreqResDto>>("任务上行频点查询异常");
  88. }
  89. }
  90. /// <summary>
  91. /// 获取所有执行中的任务
  92. /// </summary>
  93. [HttpPost]
  94. public async Task<AjaxResult<List<TaskQueryResDto>>> GetRunningTasks()
  95. {
  96. try
  97. {
  98. using (MySqlContext db = new MySqlContext())
  99. {
  100. var tasks = await db.TaskInfos.Where(p => p.TaskState == EnumTaskState.Running).ToListAsync();
  101. var res = tasks.Select(t => new TaskQueryResDto()
  102. {
  103. TaskID = t.ID,
  104. PosType = (EnumPosTypeDto)(int)t.PosType,
  105. TaskType = (EnumTaskTypeDto)(int)t.TaskType,
  106. });
  107. return Success(res.ToList());
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. string msg = $"查询执行中的任务异常";
  113. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  114. return Error<List<TaskQueryResDto>>("查询执行中的任务异常");
  115. }
  116. }
  117. #region 定位结果查询接口
  118. /// <summary>
  119. /// 根据时间范围查询定位结果
  120. /// </summary>
  121. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  122. /// <returns></returns>
  123. /// <exception cref="Exception"></exception>
  124. [HttpPost]
  125. public async Task<AjaxResult<List<PosResDto>>> GetPosResByTimeRange(PosRequestByTimeRangeDto dto)
  126. {
  127. var response = (await GetPosResByTimeRangeObsolete(dto));
  128. if (response.code == 200)
  129. {
  130. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  131. return Success(listDto);
  132. }
  133. else
  134. {
  135. return Error<List<PosResDto>>(response.msg);
  136. }
  137. }
  138. /// <summary>
  139. /// 查询最后X小时的的定位结果
  140. /// </summary>
  141. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  142. /// <returns></returns>
  143. /// <exception cref="Exception"></exception>
  144. [HttpPost]
  145. public async Task<AjaxResult<List<PosResDto>>> GetPosResByLastHours(PosRequestByLastRangeDto dto)
  146. {
  147. var response = (await GetPosResByLastHoursObsolete(dto));
  148. if (response.code == 200)
  149. {
  150. var listDto = response.data?.Select(p => MapDto(p)).ToList();
  151. return Success(listDto);
  152. }
  153. else
  154. {
  155. return Error<List<PosResDto>>(response.msg);
  156. }
  157. }
  158. /// <summary>
  159. /// 根据时间范围查询定位结果(此方法内部调用)
  160. /// </summary>
  161. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  162. /// <returns></returns>
  163. /// <exception cref="Exception"></exception>
  164. [HttpPost]
  165. [Obsolete]
  166. public async Task<AjaxResult<List<ModelPosRes>>> GetPosResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  167. {
  168. List<ModelPosRes> posRes = null;
  169. try
  170. {
  171. DateTime start = dto.BeginTime;
  172. DateTime end = dto.EndTime;
  173. List<TargetInfo> targets;
  174. using (MySqlContext db = new MySqlContext())
  175. {
  176. var startStr = dto.BeginTime.ToString("yyyy-MM-dd HH:mm:ss");
  177. var endStr = dto.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
  178. string sql = $"select a.*,b.UserName,b.PosCheckType,c.Snr1,c.Snr2,c.SnrCdb from posres a left join checkres b on a.CheckResID=b.ID and b.SigTime>='{startStr}' and b.SigTime<='{endStr}' left JOIN cgres c on a.CgResID=c.ID and c.SigTime>='{startStr}' and c.SigTime<='{endStr}' where a.SigTime>='{startStr}' and a.SigTime<='{endStr}' and a.Deleted=0 and a.TaskInfoID={dto.TaskInfoID} ";
  179. if (!dto.IncludeInvalidate)
  180. sql = $"{sql} and PosLon!=999 ";
  181. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  182. sql = $"{sql} and FreqUpHz={dto.TarFrequpHz.Value} ";
  183. sql = $"{sql} order by SigTime desc ";
  184. posRes = await db.SqlQueryAsync<ModelPosRes>(sql);
  185. if (posRes.Any())
  186. {
  187. targets = await db.TargetInfos.ToListAsync();
  188. foreach (var itemPos in posRes)
  189. {
  190. if (itemPos.TargetInfoID > 0)
  191. {
  192. var find = targets.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  193. itemPos.TargetName = find?.TargetName;
  194. itemPos.ColorKey = find?.TargeColor;
  195. }
  196. if (itemPos.Snr2 == null && itemPos.SnrCdb != null)
  197. {
  198. itemPos.Snr2 = itemPos.SnrCdb;
  199. }
  200. }
  201. }
  202. }
  203. return Success(posRes);
  204. }
  205. catch (Exception ex)
  206. {
  207. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  208. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  209. return Error<List<ModelPosRes>>("定位结果时间范围查询异常");
  210. }
  211. }
  212. /// <summary>
  213. /// 根据时间范围查询定位结果(此方法内部调用)
  214. /// </summary>
  215. /// <param name="dto"><see cref="PosRequestByTimeRangeDto"/>查询参数</param>
  216. /// <returns></returns>
  217. /// <exception cref="Exception"></exception>
  218. [HttpPost]
  219. [Obsolete]
  220. public async Task<AjaxResult<List<RePosRes>>> GetPosCgResByTimeRangeObsolete(PosRequestByTimeRangeDto dto)
  221. {
  222. List<RePosRes> posList = new List<RePosRes>();
  223. try
  224. {
  225. DateTime start = dto.BeginTime;
  226. DateTime end = dto.EndTime;
  227. var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DbPart");
  228. if (!Directory.Exists(dir)) return Success(posList);
  229. List<string> list = new List<string>();
  230. DateTime tempStart = new DateTime(start.Year, start.Month, start.Day);
  231. while (end >= tempStart)
  232. {
  233. list.Add(end.ToString("yyyy") + "\\" + end.ToString("MMdd") + ".db");
  234. end = end.AddDays(-1);
  235. }
  236. end = dto.EndTime;
  237. List<TargetInfo> targets;
  238. using (MySqlContext db = new MySqlContext())
  239. {
  240. targets = await db.TargetInfos.ToListAsync();
  241. }
  242. foreach (var item in list)
  243. {
  244. var dayFile = Path.Combine(dir, item);
  245. using (MySqlContext db = new MySqlContext())
  246. {
  247. if (db == null) continue;
  248. var query = db.PosRes.Where(p => p.Deleted == 0 && p.SigTime >= start && p.SigTime <= end && p.TaskInfoID == dto.TaskInfoID);
  249. if (!dto.IncludeInvalidate)
  250. query = query.Where(p => p.PosLon != 999);
  251. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  252. query = query.Where(p => p.FreqUpHz == dto.TarFrequpHz.Value);
  253. var posRes = await query.OrderByDescending(p => p.SigTime).ToListAsync();
  254. foreach (var itemPos in posRes)
  255. {
  256. var repos = new RePosRes();
  257. repos.ID = itemPos.ID;
  258. repos.SigTime = itemPos.SigTime;
  259. repos.PosLon = itemPos.PosLon;
  260. repos.PosLat = itemPos.PosLat;
  261. repos.MirrLon = itemPos.MirrLon;
  262. repos.MirrLat = itemPos.MirrLat;
  263. repos.TaskInfoID = itemPos.TaskInfoID;
  264. repos.FreqUpHz = itemPos.FreqUpHz;
  265. repos.StationResID = itemPos.StationResID;
  266. repos.CxResID = itemPos.CxResID;
  267. repos.CgResID = itemPos.CgResID;
  268. repos.CheckResID = itemPos.CheckResID;
  269. repos.PosResType = itemPos.PosResType;
  270. repos.TargetState = itemPos.TargetState;
  271. repos.TargetInfo = targets?.FirstOrDefault(p => p.ID == itemPos.TargetInfoID);
  272. if (itemPos.TargetInfo != null && !string.IsNullOrWhiteSpace(itemPos.TargetInfo.TargeColor))
  273. {
  274. repos.ColorKey = itemPos.TargetInfo.TargeColor;
  275. }
  276. repos.BaseTargetName = itemPos.TargetInfo?.TargetName;
  277. repos.CheckRes = await db.CheckRes.FirstOrDefaultAsync(p => p.ID == itemPos.CheckResID);
  278. repos.BaseCheckType = itemPos.CheckRes?.PosCheckType?.GetEnumDisplayName();
  279. repos.CgRes = await db.CgRes.FirstOrDefaultAsync(p => p.ID == itemPos.CgResID);
  280. repos.CxRes = await db.CxRes.FirstOrDefaultAsync(p => p.ID == itemPos.CxResID);
  281. repos.StationRes = await db.StationRes.FirstOrDefaultAsync(p => p.ID == itemPos.StationResID);
  282. posList.Add(repos);
  283. }
  284. }
  285. }
  286. return Success(posList);
  287. }
  288. catch (Exception ex)
  289. {
  290. string msg = $"定位结果时间范围查询异常.任务ID={dto.TaskInfoID},{dto.BeginTime:yyyyMMddHHmmss}-{dto.EndTime:yyyyMMddHHmmss}";
  291. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  292. return Error<List<RePosRes>>("定位结果时间范围查询异常");
  293. }
  294. }
  295. /// <summary>
  296. /// 查询最后X小时的的定位结果(此方法内部调用)
  297. /// </summary>
  298. /// <param name="dto"><see cref="PosRequestByLastRangeDto"/>查询参数</param>
  299. /// <returns></returns>
  300. /// <exception cref="Exception"></exception>
  301. [HttpPost]
  302. [Obsolete]
  303. public async Task<AjaxResult<List<ModelPosRes>>> GetPosResByLastHoursObsolete(PosRequestByLastRangeDto dto)
  304. {
  305. List<ModelPosRes> posList = new List<ModelPosRes>();
  306. try
  307. {
  308. DateTime? max = null;
  309. using (MySqlContext db = new MySqlContext())
  310. {
  311. var task = db.TaskInfos.FirstOrDefault(p => p.ID == dto.TaskInfoID);
  312. if (task == null) return Success(posList);
  313. string sql = $"select max(SigTime) from PosRes where 1=1 ";
  314. if (task.MaxSigTime != null)
  315. {
  316. sql = $"{sql} and SigTime<='{task.MaxSigTime:yyyy-MM-dd HH:mm:ss}' ";
  317. }
  318. if (task.MinSigTime != null)
  319. {
  320. sql = $"{sql} and SigTime>='{task.MinSigTime:yyyy-MM-dd HH:mm:ss}' ";
  321. }
  322. sql = $"{sql} and TaskInfoID={dto.TaskInfoID} and Deleted=0 ";
  323. if (!dto.IncludeInvalidate)
  324. {
  325. sql = $"{sql} and PosLon!=999 ";
  326. }
  327. if (dto.TarFrequpHz != null && dto.TarFrequpHz > 0)
  328. {
  329. sql = $"{sql} and FreqUpHz={dto.TarFrequpHz} ";
  330. }
  331. max = await db.SqlQueryOneAsync<DateTime?>(sql);
  332. }
  333. if (max == null) return Success(posList);
  334. DateTime min = max.Value.AddHours(-dto.Hours);
  335. var res = await GetPosResByTimeRangeObsolete(new PosRequestByTimeRangeDto()
  336. {
  337. TaskInfoID = dto.TaskInfoID,
  338. BeginTime = min,
  339. EndTime = max.Value,
  340. IncludeInvalidate = dto.IncludeInvalidate,
  341. TarFrequpHz = dto.TarFrequpHz,
  342. });
  343. return res;
  344. }
  345. catch (Exception ex)
  346. {
  347. string msg = $"定位结果查询最新数据异常-任务编号:{dto.TaskInfoID},Hours:{dto.Hours}";
  348. XdCxRhDW.Framework.LogHelper.Error(msg, ex);
  349. return Error<List<ModelPosRes>>("定位结果查询最新数据异常");
  350. }
  351. }
  352. #endregion
  353. private PosResDto MapDto(ModelPosRes res)
  354. {
  355. var item = new PosResDto()
  356. {
  357. ID = res.ID,
  358. FreqUpHz = res.FreqUpHz,
  359. SigTime = res.SigTime,
  360. TaskInfoID = res.TaskInfoID,
  361. TarName = res.TargetName,
  362. PosLon = res.PosLon,
  363. PosLat = res.PosLat,
  364. MirrLon = res.MirrLon,
  365. MirrLat = res.MirrLat,
  366. CheckType = res.PosCheckType?.GetEnumDisplayName(),
  367. TargetState = (EnumTargetStateDto)res.TargetState,
  368. PosResType = (EnumPosResTypeDto)res.PosResType,
  369. Confidence = res.Confidence,
  370. CreateTime = res.CreateTime,
  371. UserName = res.UserName,
  372. Snr1 = res.Snr1,
  373. Snr2 = res.Snr2,
  374. };
  375. return item;
  376. }
  377. }
  378. }