fix 优化任务处理

This commit is contained in:
2025-07-05 13:15:49 +08:00
parent 77b2fdc222
commit 60e43bfb9d
3 changed files with 54 additions and 21 deletions

View File

@@ -46,7 +46,10 @@ public class CreateGetUploadRecordJob : BaseJob
} }
else else
{ {
if (deviceTask.Status == DeviceTaskStatusEnumType.Success) if (deviceTask.Status == DeviceTaskStatusEnumType.Success
|| (deviceTask.Status == DeviceTaskStatusEnumType.Process
&& deviceTask.ModifiedTime.AddMinutes(10) > DateTime.Now)
)
{ {
deviceTask.Status = DeviceTaskStatusEnumType.Wait; deviceTask.Status = DeviceTaskStatusEnumType.Wait;
deviceTask.Version = 0; deviceTask.Version = 0;

View File

@@ -46,7 +46,10 @@ public class CreateSyncServerDateTimeJob : BaseJob
} }
else else
{ {
if (deviceTask.Status == DeviceTaskStatusEnumType.Success) if (deviceTask.Status == DeviceTaskStatusEnumType.Success
|| (deviceTask.Status == DeviceTaskStatusEnumType.Process
&& deviceTask.ModifiedTime.AddMinutes(10) > DateTime.Now)
)
{ {
deviceTask.Status = DeviceTaskStatusEnumType.Wait; deviceTask.Status = DeviceTaskStatusEnumType.Wait;
deviceTask.Version = 0; deviceTask.Version = 0;

View File

@@ -241,21 +241,12 @@ public class AssignmentService : IAssignmentService
private async Task<List<TaskDto>> GetDataAsync(DeviceTaskGetRequest request) private async Task<List<TaskDto>> GetDataAsync(DeviceTaskGetRequest request)
{ {
var limitTime = DateTime.Now.AddDays(-3); (long? startId, List<long> otherIds) = await GetStartIdAndOtherIdsAsync(request.DeviceUniqueNo);
var limitData = await _dbContext.Queryable<DeviceTaskEntity>().Where(x => x.ModifiedTime >= limitTime).OrderBy(x => x.ModifiedTime).FirstAsync(); if (!startId.HasValue && otherIds.IsEmpty())
if (limitData == null)
{ {
return new List<TaskDto>(); return new List<TaskDto>();
} }
var startId = limitData.Id;
var otherIds = await _dbContext.Queryable<DeviceTaskEntity>().Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo)
.Where(x => x.Type == DeviceTaskEnumType.UploadRecord || x.Type == DeviceTaskEnumType.SyncDateTime)
.Where(x => x.Status == DeviceTaskStatusEnumType.Wait)
.Select(x => x.Id)
.ToListAsync();
var data = await CommonHelper.RetryAsync(async () => var data = await CommonHelper.RetryAsync(async () =>
{ {
var rows = await _dbContext.Queryable<DeviceTaskEntity>() var rows = await _dbContext.Queryable<DeviceTaskEntity>()
@@ -264,21 +255,24 @@ public class AssignmentService : IAssignmentService
.LeftJoin<GainfoLeaveEntity>((deviceTask, device, ga, gaLeave) => deviceTask.UserNo == gaLeave.No) .LeftJoin<GainfoLeaveEntity>((deviceTask, device, ga, gaLeave) => deviceTask.UserNo == gaLeave.No)
.LeftJoin<DepartmentEntity>((deviceTask, device, ga, gaLeave, department) => department.No == ga.DepartmentNo) .LeftJoin<DepartmentEntity>((deviceTask, device, ga, gaLeave, department) => department.No == ga.DepartmentNo)
.LeftJoin<DeviceRegistryEntity>((deviceTask, device, ga, gaLeave, department, deviceRegistry) => deviceRegistry.DeviceUniqueNo == deviceTask.DeviceUniqueNo) .LeftJoin<DeviceRegistryEntity>((deviceTask, device, ga, gaLeave, department, deviceRegistry) => deviceRegistry.DeviceUniqueNo == deviceTask.DeviceUniqueNo)
.Where((deviceTask, device) => .WhereIF(startId.HasValue, (deviceTask, device) =>
(deviceTask.Id >= startId || otherIds.Contains(deviceTask.Id)) (deviceTask.Id >= startId || otherIds.Contains(deviceTask.Id))
&& deviceTask.DeviceUniqueNo == request.DeviceUniqueNo && deviceTask.DeviceUniqueNo == request.DeviceUniqueNo
) ).WhereIF(!startId.HasValue, (deviceTask, device) =>
otherIds.Contains(deviceTask.Id)
&& deviceTask.DeviceUniqueNo == request.DeviceUniqueNo)
.WhereIF(!request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Wait) .WhereIF(!request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Wait)
.WhereIF(request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Process .WhereIF(request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Process
&& SqlFunc.DateDiff(DateType.Minute, deviceTask.ModifiedTime, DateTime.Now) > 10) && SqlFunc.DateDiff(DateType.Minute, deviceTask.ModifiedTime, DateTime.Now) > 10
&& deviceTask.Version < 10
)
.WhereIF(request.Types.IsPresent(), deviceTask => request.Types.Contains(deviceTask.Type)) .WhereIF(request.Types.IsPresent(), deviceTask => request.Types.Contains(deviceTask.Type))
.Where(deviceTask => deviceTask.Version < 10)
#if !DEBUG
.Where((deviceTask, device, ga, gaLeave, department, deviceRegistry) => .Where((deviceTask, device, ga, gaLeave, department, deviceRegistry) =>
device.HeartbeatInterval == 0 || SqlFunc.DateAdd(deviceRegistry.LastHeartbeatTime, device.HeartbeatInterval, DateType.Second) > DateTime.Now) device.HeartbeatInterval == 0
#endif || SqlFunc.DateAdd(deviceRegistry.LastHeartbeatTime, device.HeartbeatInterval * 3, DateType.Second) > DateTime.Now
)
.Where((deviceTask, device) => device.Enable) .Where((deviceTask, device) => device.Enable)
.OrderBy(deviceTask => new { deviceTask.CreateTime, Priority = SqlFunc.Desc(deviceTask.Priority) }) .OrderBy(deviceTask => new { deviceTask.Id, Priority = SqlFunc.Desc(deviceTask.Priority) })
.Select((deviceTask, device, ga, gaLeave, department) => new TaskDto .Select((deviceTask, device, ga, gaLeave, department) => new TaskDto
{ {
UserId = deviceTask.UserId == 0 || deviceTask.UserId == null UserId = deviceTask.UserId == 0 || deviceTask.UserId == null
@@ -336,6 +330,39 @@ public class AssignmentService : IAssignmentService
return data; return data;
} }
private async Task<(long? StartId, List<long> OtherIds)> GetStartIdAndOtherIdsAsync(string deviceUniqueNo)
{
var limitTime = DateTime.Now.AddDays(-3);
var types = new List<DeviceTaskEnumType>
{
DeviceTaskEnumType.UploadRecord,
DeviceTaskEnumType.SyncDateTime
};
//排除UploadRecord,SyncDateTime的任务,获取最近的任务ID
var limitData = await _dbContext.Queryable<DeviceTaskEntity>()
.Where(x => x.ModifiedTime >= limitTime)
.Where(x => x.DeviceUniqueNo == deviceUniqueNo)
.Where(x => !types.Contains(x.Type))
.OrderBy(x => x.Id)
.Select(x => new { x.Id })
.FirstAsync();
var startId = limitData?.Id;
//获取其他任务ID
var otherIds = await _dbContext.Queryable<DeviceTaskEntity>()
.Where(x => x.DeviceUniqueNo == deviceUniqueNo)
.Where(x => types.Contains(x.Type))
.Where(x => x.Status == DeviceTaskStatusEnumType.Wait)
.Select(x => x.Id)
.ToListAsync();
return (startId, otherIds);
}
/// <summary> /// <summary>
/// 处理获取上传记录的任务 /// 处理获取上传记录的任务
/// </summary> /// </summary>