feat 任务预警
This commit is contained in:
137
Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs
Normal file
137
Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs
Normal file
@@ -0,0 +1,137 @@
|
||||
using System.Linq.Expressions;
|
||||
using Dlhis.Entity.Device.Entities;
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
|
||||
|
||||
namespace Dlhis.ScheduledTask.DeviceUploadLog;
|
||||
|
||||
public static class DoubleSearchStore
|
||||
{
|
||||
public static async Task<List<T>> GetResultAsync<T>(this IDbContext dbContext,
|
||||
List<string> tables,
|
||||
Expression<Func<T, bool>> where,
|
||||
int pageIndex, int pageSize) where T : DeviceUploadLogEntity
|
||||
{
|
||||
var searchOffset = (pageIndex - 1) * pageSize;
|
||||
var currentOffset = (pageIndex - 1) * pageSize / tables.Count;
|
||||
|
||||
var listResult = new List<TempResult<T>>(tables.Count);
|
||||
foreach (var table in tables)
|
||||
{
|
||||
var r = await dbContext.Queryable<T>().AS(table)
|
||||
.WhereIF(where != null, where)
|
||||
.OrderBy(x => x.RaiseDateTime)
|
||||
.Skip(currentOffset).Take(pageSize)
|
||||
.ToListAsync();
|
||||
|
||||
listResult.Add(new TempResult<T>
|
||||
{
|
||||
Table = table,
|
||||
Result = r,
|
||||
Min = r.Min(x => x.RaiseDateTime),
|
||||
Max = r.Max(x => x.RaiseDateTime)
|
||||
});
|
||||
}
|
||||
|
||||
var currentMin = listResult.Min(x => x.Min);
|
||||
var currentMax = listResult.Max(x => x.Max);
|
||||
var resultOffset = 0;
|
||||
foreach (var item in listResult)
|
||||
{
|
||||
var r = await dbContext.Queryable<T>().AS(item.Table)
|
||||
.WhereIF(where != null, where)
|
||||
.Where(x => x.RaiseDateTime >= currentMin && x.RaiseDateTime <= currentMax)
|
||||
.OrderBy(x => x.RaiseDateTime)
|
||||
.ToListAsync();
|
||||
|
||||
var ct = r.Min(x => x.RaiseDateTime);
|
||||
if (ct == currentMin)
|
||||
{
|
||||
resultOffset += currentOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
var count = r.Count(x => x.RaiseDateTime > currentMin && x.RaiseDateTime <= item.Min);
|
||||
resultOffset += currentOffset - count;
|
||||
}
|
||||
|
||||
item.Result = r;
|
||||
}
|
||||
|
||||
var result = listResult.SelectMany(x => x.Result).OrderBy(x => x.RaiseDateTime).ToList();
|
||||
return result.Skip(searchOffset - (resultOffset + 1)).Take(pageSize).ToList();
|
||||
}
|
||||
|
||||
public class TempResult<T>
|
||||
{
|
||||
public string Table { get; set; }
|
||||
public List<T> Result { get; set; }
|
||||
public DateTime Min { get; set; }
|
||||
public DateTime Max { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
// public static class DoubleSearchStore
|
||||
// {
|
||||
// public static async Task<List<T>> GetResultAsync<T>(this IDbContext dbContext,
|
||||
// List<string> tables,
|
||||
// Expression<Func<T, bool>> where,
|
||||
// int pageIndex, int pageSize) where T : TestDataEntity
|
||||
// {
|
||||
// var searchOffset = (pageIndex - 1) * pageSize;
|
||||
// var currentOffset = (pageIndex - 1) * pageSize / tables.Count;
|
||||
//
|
||||
// var listResult = new List<TempResult<T>>(tables.Count);
|
||||
// foreach (var table in tables)
|
||||
// {
|
||||
// var r = await dbContext.Queryable<T>().AS(table)
|
||||
// .WhereIF(where != null, where)
|
||||
// .OrderBy(x => x.Timestamp)
|
||||
// .Skip(currentOffset).Take(pageSize)
|
||||
// .ToListAsync();
|
||||
//
|
||||
// listResult.Add(new TempResult<T>
|
||||
// {
|
||||
// Table = table,
|
||||
// Result = r,
|
||||
// Min = r.Min(x => x.Timestamp),
|
||||
// Max = r.Max(x => x.Timestamp)
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// var currentMin = listResult.Min(x => x.Min);
|
||||
// var currentMax = listResult.Max(x => x.Max);
|
||||
// var resultOffset = 0;
|
||||
// foreach (var item in listResult)
|
||||
// {
|
||||
// var r = await dbContext.Queryable<T>().AS(item.Table)
|
||||
// .WhereIF(where != null, where)
|
||||
// .Where(x => x.Timestamp >= currentMin && x.Timestamp <= currentMax)
|
||||
// .OrderBy(x => x.Timestamp)
|
||||
// .ToListAsync();
|
||||
//
|
||||
// var ct = r.Min(x => x.Timestamp);
|
||||
// if (ct == currentMin)
|
||||
// {
|
||||
// resultOffset += currentOffset;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// var count = r.Count(x => x.Timestamp > currentMin && x.Timestamp <= item.Min);
|
||||
// resultOffset += currentOffset - count;
|
||||
// }
|
||||
//
|
||||
// item.Result = r;
|
||||
// }
|
||||
//
|
||||
// var result = listResult.SelectMany(x => x.Result).OrderBy(x => x.Timestamp).ToList();
|
||||
// return result.Skip(searchOffset - (resultOffset + 1)).Take(pageSize).ToList();
|
||||
// }
|
||||
//
|
||||
// public class TempResult<T>
|
||||
// {
|
||||
// public string Table { get; set; }
|
||||
// public List<T> Result { get; set; }
|
||||
// public long Min { get; set; }
|
||||
// public long Max { get; set; }
|
||||
// }
|
||||
// }
|
||||
Reference in New Issue
Block a user