diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs new file mode 100644 index 00000000..e9459d2e --- /dev/null +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/DoubleSearchStore.cs @@ -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> GetResultAsync(this IDbContext dbContext, + List tables, + Expression> where, + int pageIndex, int pageSize) where T : DeviceUploadLogEntity + { + var searchOffset = (pageIndex - 1) * pageSize; + var currentOffset = (pageIndex - 1) * pageSize / tables.Count; + + var listResult = new List>(tables.Count); + foreach (var table in tables) + { + var r = await dbContext.Queryable().AS(table) + .WhereIF(where != null, where) + .OrderBy(x => x.RaiseDateTime) + .Skip(currentOffset).Take(pageSize) + .ToListAsync(); + + listResult.Add(new TempResult + { + 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().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 + { + public string Table { get; set; } + public List Result { get; set; } + public DateTime Min { get; set; } + public DateTime Max { get; set; } + } +} + +// public static class DoubleSearchStore +// { +// public static async Task> GetResultAsync(this IDbContext dbContext, +// List tables, +// Expression> where, +// int pageIndex, int pageSize) where T : TestDataEntity +// { +// var searchOffset = (pageIndex - 1) * pageSize; +// var currentOffset = (pageIndex - 1) * pageSize / tables.Count; +// +// var listResult = new List>(tables.Count); +// foreach (var table in tables) +// { +// var r = await dbContext.Queryable().AS(table) +// .WhereIF(where != null, where) +// .OrderBy(x => x.Timestamp) +// .Skip(currentOffset).Take(pageSize) +// .ToListAsync(); +// +// listResult.Add(new TempResult +// { +// 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().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 +// { +// public string Table { get; set; } +// public List Result { get; set; } +// public long Min { get; set; } +// public long Max { get; set; } +// } +// } \ No newline at end of file diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/DeviceTaskAssignmentsController.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/DeviceTaskAssignmentsController.cs index bb56508b..7e9c6d30 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/DeviceTaskAssignmentsController.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Controllers/DeviceTaskAssignmentsController.cs @@ -34,6 +34,18 @@ public class DeviceTaskAssignmentsController : ControllerBase { return await _deviceTaskAssignmentService.GetPageAsync(request); } + + /// + /// 设备任务预警 + /// + /// + /// + [HttpGet("page-warning")] + [IgnoreTenant] + public async Task> GetPageWarningAsync([FromQuery] DeviceTaskAssignmentRequest request) + { + return await _deviceTaskAssignmentService.GetPageWarningAsync(request); + } /// /// 重置任务 diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/IDeviceTaskAssignmentService.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/IDeviceTaskAssignmentService.cs index 27fee27c..85af7824 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/IDeviceTaskAssignmentService.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/IDeviceTaskAssignmentService.cs @@ -7,6 +7,9 @@ namespace Dlhis.ScheduledTask.TaskAssignment.Services; public interface IDeviceTaskAssignmentService : IScopeDependency { Task> GetPageAsync(DeviceTaskAssignmentRequest request); + + Task> GetPageWarningAsync(DeviceTaskAssignmentRequest request); + Task ResetAsync(DeviceTaskResetRequest request); diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/DeviceTaskAssignmentService.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/DeviceTaskAssignmentService.cs index 06238a39..b9e7b0d4 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/DeviceTaskAssignmentService.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/DeviceTaskAssignmentService.cs @@ -103,6 +103,68 @@ public class DeviceTaskAssignmentService : IDeviceTaskAssignmentService return page; } + public async Task> GetPageWarningAsync(DeviceTaskAssignmentRequest request) + { + var page = await _dbContext.Queryable() + .LeftJoin((deviceTask, device) => deviceTask.DeviceUniqueNo == device.UniqueNo) + .LeftJoin((deviceTask, device, ga) => deviceTask.UserNo == ga.No) + .LeftJoin((deviceTask, device, ga, gaLeave) => deviceTask.UserNo == gaLeave.No) + .LeftJoin((deviceTask, device, ga, gaLeave, deviceRegistry) => deviceRegistry.DeviceUniqueNo == deviceTask.DeviceUniqueNo) + .Where(deviceTask => deviceTask.TenantId == request.Factory) + .WhereIF(!request.Search.IsEmpty(), (deviceTask, device, ga) => + ga.Name == request.Search + || ga.Code == request.Search + || deviceTask.DeviceUniqueNo == request.Search + ) + .Where(deviceTask => deviceTask.Version >= 10) + .OrderBy(deviceTask => deviceTask.ModifiedTime, OrderByType.Desc) + .Select((deviceTask, device, ga, gaLeave, deviceRegistry) => new DeviceTaskAssignmentResponse + { + Id = deviceTask.Id, + DeviceUniqueNo = deviceTask.DeviceUniqueNo, + ResultMessage = deviceTask.ResultMessage, + RetryCount = deviceTask.Version, + Status = deviceTask.Status, + UserNo = deviceTask.UserNo, + UserName = SqlFunc.IsNull(ga.Name, gaLeave.Name), + UserCode = SqlFunc.IsNull(ga.Code, gaLeave.Code), + Type = deviceTask.Type, + CreateTime = deviceTask.CreateTime, + LastUpdateTime = deviceTask.ModifiedTime, + TenantId = deviceTask.TenantId, + LastHeartbeatTime = deviceRegistry.LastHeartbeatTime, + HeartbeatInterval = device.HeartbeatInterval, + DeployPlace = device.DeployPlace, + CreateBy = deviceTask.CreatedBy, + Source = deviceTask.Source + }) + .ToPageListAsync(request); + + try + { + var tenants = await _tenantApi.GetTenantsInternalAsync(); + page.Data.ForEach(item => { item.TenantName = tenants.FirstOrDefault(x => x.Code == item.TenantId)?.Name; }); + } + catch (Exception) + { + //ignore + } + + try + { + var userIds = page.Data.Select(x => x.CreateBy).Distinct().ToList(); + var userInfos = await _userApi.GetUserByIdsAsync(new IdsRequest { Ids = userIds }); + page.Data.ForEach(item => item.Creator = userInfos.FirstOrDefault(x => x.Id == item.CreateBy)?.OperatorName); + } + catch (Exception e) + { + _logger.LogError("获取人员数据失败:{error}", e.Message); + } + + return page; + } + + public async Task ResetAsync(DeviceTaskResetRequest request) { var tasks = await _dbContext.Queryable()