using DW5S.Entity;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DW5S.Repostory
{
///
/// 双行根星历仓储
///
public class XlRepository : Repository
{
///
///
///
///
public XlRepository(SqliteContext ctx)
: base(ctx)
{
}
///
/// 获取双行根数总条数
///
///
///
public async Task GetCount(int? satCode)
{
var queryable = base.dbSet.AsQueryable();
if (satCode != null)
queryable = queryable.Where(p => p.SatCode == satCode);
var count = await queryable.CountAsync();
return count;
}
public async Task> GetAllSat()
{
var list = IocContainer.Cache.Get>(CacheKeys.AllXlSat);
if (list != null)
{
return list;
}
var data = await dbSet.GroupBy(p => p.SatCode).Select(p => p.FirstOrDefault()).ToListAsync();
var sats = data.Select(p => new SatInfo()
{
SatCode = p.SatCode,
SatName = p.SatName,
SatLon = p.Lon,
}).ToList();
IocContainer.Cache.Set(CacheKeys.AllXlSat, sats, TimeSpan.FromDays(1));
return sats;
}
///
/// 获取数据库双行根数
///
/// 当前页(从1开始)
/// 每页显示的条数
/// 卫星编号
///
public async Task> GetPageAsync(int currentPage, int pageSize, int? satCode)
{
try
{
int skip = (currentPage - 1) * pageSize;
var queryable = base.dbSet.AsQueryable();
if (satCode != null)
queryable = queryable.Where(p => p.SatCode == satCode);
var res = await queryable.OrderByDescending(p => p.TimeUTC)
.ThenByDescending(p => p.Lon).Skip(skip).Take(pageSize).ToListAsync();
return res;
}
catch (Exception ex)
{
throw new Exception("分页星历信息查询异常", ex);
}
}
///
/// 获取某个星某个时刻最近的双行根
///
/// 卫星编号
/// 时刻
///
public async Task GetLatestAsync(int satCode, DateTime sigTime)
{
try
{
var max = await dbSet.Where(p => p.SatCode == satCode && p.TimeUTC >= sigTime)
.OrderBy(p => p.TimeUTC).FirstOrDefaultAsync();
var min = await dbSet.Where(p => p.SatCode == satCode && p.TimeUTC <= sigTime)
.OrderByDescending(p => p.TimeUTC).FirstOrDefaultAsync();
if (max == null && min == null)
{
throw new Exception($"系统缺少编号{satCode}的卫星星历!");
}
else
{
XlInfo xlInfo = null;
if (max != null && min == null)
{
xlInfo = max;
}
else if (max == null && min != null)
{
xlInfo = min;
}
else
{
var val1 = Math.Abs((max.TimeUTC - sigTime).TotalSeconds);
var val2 = Math.Abs((min.TimeUTC - sigTime).TotalSeconds);
if (val1 < val2)
xlInfo = max;
else
xlInfo = min;
}
int days = AppConfigHelper.Get("XlWarningDays", 5);
if (Math.Abs((sigTime - xlInfo.TimeUTC).TotalDays) > days)
{
IocContainer.Logger.Warning($"编号{satCode}卫星TLE星历(发布时刻:{xlInfo.TimeUTC:yyyyMMdd})和信号时刻({sigTime:yyyyMMdd})相差过大");
}
IocContainer.Logger.Information($"卫星{satCode}使用发布时刻为{xlInfo.TimeUTC:yyyyMMddHHmmss}的星历进行推算");
return xlInfo;
}
}
catch (Exception ex)
{
throw new Exception($"获取卫星[{satCode}]--{sigTime:yyyyMMddHHmmss}时刻附近的双行根数出错!", ex);
}
}
}
}