XlRepository.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using DW5S.Entity;
  2. using Microsoft.AspNetCore.Mvc.RazorPages;
  3. using Microsoft.EntityFrameworkCore;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace DW5S.Repostory
  12. {
  13. /// <summary>
  14. /// 双行根星历仓储
  15. /// </summary>
  16. public class XlRepository : Repository<XlInfo,int>
  17. {
  18. public XlRepository(OracleContext ctx)
  19. : base(ctx)
  20. {
  21. }
  22. /// <summary>
  23. /// 获取双行根数总条数
  24. /// </summary>
  25. /// <param name="satCode"></param>
  26. /// <returns></returns>
  27. public async Task<int> GetCount(int? satCode)
  28. {
  29. var queryable = base.dbSet.AsQueryable();
  30. if (satCode != null)
  31. queryable = queryable.Where(p => p.SatCode == satCode);
  32. var count = await queryable.CountAsync();
  33. return count;
  34. }
  35. public async Task<List<SatInfo>> GetAllSat()
  36. {
  37. var data = await dbSet.GroupBy(p => p.SatCode).Select(p => p.FirstOrDefault()).ToListAsync();
  38. var sats = data.Select(p => new SatInfo()
  39. {
  40. SatCode = p.SatCode,
  41. SatName = p.SatName,
  42. SatLon = p.Lon,
  43. }).ToList();
  44. return sats;
  45. }
  46. /// <summary>
  47. /// 获取数据库双行根数
  48. /// </summary>
  49. /// <param name="currentPage">当前页(从1开始)</param>
  50. /// <param name="pageSize">每页显示的条数</param>
  51. /// <param name="satCode">卫星编号</param>
  52. /// <returns></returns>
  53. public async Task<List<XlInfo>> GetPageAsync(int currentPage, int pageSize, int? satCode)
  54. {
  55. try
  56. {
  57. int skip = (currentPage - 1) * pageSize;
  58. var queryable = base.dbSet.AsQueryable();
  59. if (satCode != null)
  60. queryable = queryable.Where(p => p.SatCode == satCode);
  61. var res = await queryable.OrderByDescending(p => p.TimeUTC)
  62. .ThenByDescending(p => p.Lon).Skip(skip).Take(pageSize).ToListAsync();
  63. return res;
  64. }
  65. catch (Exception ex)
  66. {
  67. throw new Exception("分页星历信息查询异常", ex);
  68. }
  69. }
  70. /// <summary>
  71. /// 获取某个星某个时刻最近的双行根(可能返回null)
  72. /// </summary>
  73. /// <param name="satCode">卫星编号</param>
  74. /// <param name="sigTime">时刻</param>
  75. /// <returns></returns>
  76. public async Task<XlInfo> GetLatestAsync(int satCode, DateTime sigTime)
  77. {
  78. try
  79. {
  80. var max = await dbSet.Where(p => p.SatCode == satCode && p.TimeUTC >= sigTime)
  81. .OrderBy(p => p.TimeUTC).FirstOrDefaultAsync();
  82. var min = await dbSet.Where(p => p.SatCode == satCode && p.TimeUTC <= sigTime)
  83. .OrderByDescending(p => p.TimeUTC).FirstOrDefaultAsync();
  84. if (max == null && min == null)
  85. return null;
  86. else if (max != null && min == null)
  87. return max;
  88. else if (max == null && min != null)
  89. return min;
  90. else
  91. {
  92. //谁离得更接近就用谁
  93. var val1 = Math.Abs((max.TimeUTC - sigTime).TotalSeconds);
  94. var val2 = Math.Abs((min.TimeUTC - sigTime).TotalSeconds);
  95. if (val1 < val2)
  96. return max;
  97. else
  98. return min;
  99. }
  100. }
  101. catch (Exception ex)
  102. {
  103. throw new Exception($"获取卫星[{satCode}]--{sigTime:yyyyMMddHHmmss}时刻附近的双行根数出错!", ex);
  104. }
  105. }
  106. }
  107. }