fix 下发任务结构修改,根据类型处理

This commit is contained in:
2024-01-19 13:30:35 +08:00
parent 0ae4737c0f
commit 7f05cbc368
13 changed files with 240 additions and 45 deletions

View File

@@ -43,4 +43,15 @@ public class DeviceUploadLogsController : ControllerBase
{ {
await _deviceUploadLogService.UploadLogAsync(request); await _deviceUploadLogService.UploadLogAsync(request);
} }
/// <summary>
/// 批量上传记录
/// </summary>
/// <param name="requests"></param>
/// <returns></returns>
[HttpPost("records")]
public async Task UploadLogsAsync(List<DeviceUploadLogUploadRequest> requests)
{
await _deviceUploadLogService.UploadLogsAsync(requests);
}
} }

View File

@@ -13,8 +13,8 @@ public class DeviceUploadLogUploadRequest
/// <summary> /// <summary>
/// 用户学工号 /// 用户学工号
/// </summary> /// </summary>
[Required(ErrorMessage = "用户学工号不能为空")] [Required(ErrorMessage = "人员唯一号不能为空")]
public string UserCode { get; set; } public string UserUniqueNo { get; set; }
/// <summary> /// <summary>
/// 上传时间 /// 上传时间

View File

@@ -9,4 +9,6 @@ public interface IDeviceUploadLogService : IScopeDependency
Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request); Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request);
Task UploadLogAsync(DeviceUploadLogUploadRequest request); Task UploadLogAsync(DeviceUploadLogUploadRequest request);
Task UploadLogsAsync(List<DeviceUploadLogUploadRequest> requests);
} }

View File

@@ -22,7 +22,7 @@ public class DeviceUploadLogService : IDeviceUploadLogService
public async Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request) public async Task<Pagination<DeviceUploadLogResponse>> GetPageAsync(DeviceUploadLogPageRequest request)
{ {
var page = await _dbContext.Queryable<DeviceUploadLogEntity>() var page = await _dbContext.Queryable<DeviceUploadLogEntity>()
.LeftJoin<GainfoEntity>((deviceUp, ga) => deviceUp.UserNo == ga.No) .LeftJoin<GainfoEntity>((deviceUp, ga) => deviceUp.UserUniqueNo == ga.No)
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.UploadTime >= request.SearchDateTimePeriod.Start) .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.UploadTime >= request.SearchDateTimePeriod.Start)
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.UploadTime <= request.SearchDateTimePeriod.End) .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.UploadTime <= request.SearchDateTimePeriod.End)
.Select((deviceUp, ga) => new DeviceUploadLogResponse .Select((deviceUp, ga) => new DeviceUploadLogResponse
@@ -31,8 +31,8 @@ public class DeviceUploadLogService : IDeviceUploadLogService
Id = deviceUp.Id, Id = deviceUp.Id,
Ip = deviceUp.Ip, Ip = deviceUp.Ip,
UploadTime = deviceUp.UploadTime, UploadTime = deviceUp.UploadTime,
UserNo = deviceUp.UserNo, UserNo = ga.No,
UserCode = deviceUp.UserCode, UserCode = ga.Code,
UserName = ga.Name, UserName = ga.Name,
}) })
.ToPageListAsync(request); .ToPageListAsync(request);
@@ -46,18 +46,41 @@ public class DeviceUploadLogService : IDeviceUploadLogService
var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.UniqueNo == request.DeviceUniqueNo).SingleAsync(); var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.UniqueNo == request.DeviceUniqueNo).SingleAsync();
device.ThrowIfNull("设备信息不存在"); device.ThrowIfNull("设备信息不存在");
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == request.UserCode).FirstAsync();
device.ThrowIfNull("人员信息不存在");
var entity = new DeviceUploadLogEntity var entity = new DeviceUploadLogEntity
{ {
DeviceUniqueNo = request.DeviceUniqueNo, DeviceUniqueNo = request.DeviceUniqueNo,
UploadTime = request.UploadTime, UploadTime = request.UploadTime,
UserCode = request.UserCode, UserUniqueNo = request.UserUniqueNo,
UserNo = gainfo.No,
TenantId = device.TenantId, TenantId = device.TenantId,
}; };
await _dbContext.InsertAsync(entity); await _dbContext.InsertAsync(entity);
} }
[IgnoreTenant]
public async Task UploadLogsAsync(List<DeviceUploadLogUploadRequest> requests)
{
var nos = requests.Select(x => x.DeviceUniqueNo).ToList();
var devices = await _dbContext.Queryable<DeviceEntity>().Where(x => nos.Contains(x.UniqueNo)).ToListAsync();
var records = requests.GroupBy(x => x.DeviceUniqueNo).Select(x =>
{
var device = devices.FirstOrDefault(item => item.UniqueNo == x.Key);
if (device != null)
{
return x.AsEnumerable().Select(item => new DeviceUploadLogEntity
{
DeviceUniqueNo = x.Key,
UserUniqueNo = item.UserUniqueNo,
UploadTime = item.UploadTime,
TenantId = device.TenantId,
}).ToList();
}
return null;
}).Where(x => x != null).ToList();
await _dbContext.InsertAsync(records);
}
} }

View File

@@ -12,17 +12,9 @@ public class JobPack : BaseAppPack
public override void Invoke(IServiceProvider serviceProvider) public override void Invoke(IServiceProvider serviceProvider)
{ {
#if DEBUG
RecurringJob.AddOrUpdate<SyncOrganizationJob>("SyncSap", s => s.SyncOrgInfo(), "30 * * * * ?", new RecurringJobOptions
{
TimeZone = TimeZoneInfo.Local
});
#else
RecurringJob.AddOrUpdate<SyncOrganizationJob>("SyncSap", s => s.SyncOrgInfo(), "0 0 2 * * ?", new RecurringJobOptions RecurringJob.AddOrUpdate<SyncOrganizationJob>("SyncSap", s => s.SyncOrgInfo(), "0 0 2 * * ?", new RecurringJobOptions
{ {
TimeZone = TimeZoneInfo.Local TimeZone = TimeZoneInfo.Local
}); });
#endif
} }
} }

View File

@@ -16,6 +16,11 @@ public class DeviceTaskGetRequest : PageDto, IValidatableObject
/// </summary> /// </summary>
public string DeviceUniqueNo { get; set; } public string DeviceUniqueNo { get; set; }
/// <summary>
/// 获取处理中的任务
/// </summary>
public bool IsProcess { get; set; } = false;
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{ {
if (Brand.IsEmpty() && DeviceUniqueNo.IsEmpty()) if (Brand.IsEmpty() && DeviceUniqueNo.IsEmpty())

View File

@@ -1,7 +1,7 @@
namespace Dlhis.ScheduledTask.TaskAssignment.Response; namespace Dlhis.ScheduledTask.TaskAssignment.Response;
/// <summary> /// <summary>
/// 设备维度任务 /// 设备任务
/// </summary> /// </summary>
public class DeviceTaskToDeviceByDeviceResponse public class DeviceTaskToDeviceByDeviceResponse
{ {
@@ -16,12 +16,12 @@ public class DeviceTaskToDeviceByDeviceResponse
public string DeviceUniqueNo { get; set; } public string DeviceUniqueNo { get; set; }
/// <summary> /// <summary>
/// 连接信息 /// 设备信息
/// </summary> /// </summary>
public string DeviceConnectionInfo { get; set; } public object DeviceInfo { get; set; }
/// <summary> /// <summary>
/// 任务 /// 任务
/// </summary> /// </summary>
public List<TaskCombineUserDimensionDto> Tasks { get; set; } public List<TaskCombineDto> Tasks { get; set; }
} }

View File

@@ -0,0 +1,16 @@
using Kurisu.Core.CustomClass;
namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class ScheduleDto
{
/// <summary>
/// 假日名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 开始结束日期时段
/// </summary>
public DateTimePeriod DateTimePeriod { get; set; }
}

View File

@@ -0,0 +1,24 @@
namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class ScheduleToDeviceResponse
{
/// <summary>
/// 计划id,范围:1-128
/// </summary>
public int Id { get; set; }
/// <summary>
/// 使能
/// </summary>
public bool Enable { get; set; }
/// <summary>
/// 计划名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 计划
/// </summary>
public List<ScheduleDto> Schedules { get; set; }
}

View File

@@ -3,7 +3,7 @@ using Kurisu.AspNetCore.Utils.Extensions;
namespace Dlhis.ScheduledTask.TaskAssignment.Response; namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class TaskCombineUserDimensionDto public class TaskCombineDto
{ {
/// <summary> /// <summary>
/// 任务id /// 任务id
@@ -21,7 +21,7 @@ public class TaskCombineUserDimensionDto
public string TypeDesc => Type.GetDescription(); public string TypeDesc => Type.GetDescription();
/// <summary> /// <summary>
/// 用户下发信息 /// 下发信息
/// </summary> /// </summary>
public UserToDeviceResponse UserInfo { get; set; } public object Info { get; set; }
} }

View File

@@ -0,0 +1,21 @@
using Kurisu.Core.CustomClass;
namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class TimePeriodToDeviceResponse
{
/// <summary>
/// 时段码id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 星期
/// </summary>
public List<DayOfWeek> Weeks { get; set; }
/// <summary>
/// 时段区间
/// </summary>
public TimePeriod TimePeriod { get; set; }
}

View File

@@ -1,4 +1,6 @@
namespace Dlhis.ScheduledTask.TaskAssignment.Response; using Kurisu.Core.CustomClass;
namespace Dlhis.ScheduledTask.TaskAssignment.Response;
public class UserToDeviceResponse public class UserToDeviceResponse
{ {
@@ -32,7 +34,6 @@ public class UserToDeviceResponse
/// </summary> /// </summary>
public string DepartmentName { get; set; } public string DepartmentName { get; set; }
/// <summary> /// <summary>
/// 卡号 /// 卡号
/// </summary> /// </summary>
@@ -42,4 +43,24 @@ public class UserToDeviceResponse
/// 人脸 /// 人脸
/// </summary> /// </summary>
public string Face { get; set; } public string Face { get; set; }
/// <summary>
/// 有效日期范围
/// </summary>
public DatePeriod ValidDatePeriod { get; set; }
/// <summary>
/// 控制门[1,2,3....]
/// </summary>
public List<int> Doors { get; set; }
/// <summary>
/// 时段[1,2,3....]
/// </summary>
public List<int> TimePeriods { get; set; }
/// <summary>
/// 假期计划id
/// </summary>
public int Schedule { get; set; }
} }

View File

@@ -13,7 +13,8 @@ using Microsoft.Extensions.Options;
using SqlSugar; using SqlSugar;
using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Extensions;
using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Attributes;
using System.Threading.Tasks; using Newtonsoft.Json.Linq;
using Kurisu.Core.CustomClass;
namespace Dlhis.ScheduledTask.TaskAssignment.Services.Implements; namespace Dlhis.ScheduledTask.TaskAssignment.Services.Implements;
@@ -40,16 +41,18 @@ public class AssignmentService : IAssignmentService
.LeftJoin<DepartmentEntity>((deviceTask, deivce, deivceTamplate, ga, department) => department.No == ga.DepartmentNo) .LeftJoin<DepartmentEntity>((deviceTask, deivce, deivceTamplate, ga, department) => department.No == ga.DepartmentNo)
.WhereIF(request.Brand.IsPresent(), (deviceTask, deivce, deivceTamplate) => deivceTamplate.Brand == request.Brand) .WhereIF(request.Brand.IsPresent(), (deviceTask, deivce, deivceTamplate) => deivceTamplate.Brand == request.Brand)
.WhereIF(request.DeviceUniqueNo.IsPresent(), (deviceTask, deivce) => deviceTask.DeviceUniqueNo == request.DeviceUniqueNo) .WhereIF(request.DeviceUniqueNo.IsPresent(), (deviceTask, deivce) => deviceTask.DeviceUniqueNo == request.DeviceUniqueNo)
.Where(deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Wait) .WhereIF(!request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Wait)
.WhereIF(request.IsProcess, deviceTask => deviceTask.Status == DeviceTaskStatusEnumType.Process)
.OrderBy(deviceTask => deviceTask.CreateTime) .OrderBy(deviceTask => deviceTask.CreateTime)
.Select((deviceTask, deivce, deivceTamplate, ga, department) => new .Select((deviceTask, deivce, deivceTamplate, ga, department) => new
{ {
UserId = ga.Id, UserId = SqlFunc.IsNull(ga.Id, 0),
TaskId = deviceTask.Id, TaskId = deviceTask.Id,
deviceTask.Type, deviceTask.Type,
deviceTask.DeviceUniqueNo, deviceTask.DeviceUniqueNo,
DeviceConnectionInfo = deivce.ConnectionInfo, DeviceConnectionInfo = deivce.ConnectionInfo,
deivce.Brand, deivce.Brand,
FuncStr = deivce.Funcs.ToString(),
deviceTask.UserNo, deviceTask.UserNo,
deviceTask.UserCode, deviceTask.UserCode,
UserName = ga.Name, UserName = ga.Name,
@@ -112,18 +115,25 @@ public class AssignmentService : IAssignmentService
.CreateProtector("down:face") .CreateProtector("down:face")
.ToTimeLimitedDataProtector(); .ToTimeLimitedDataProtector();
return data.GroupBy(x => new { x.Brand, x.DeviceUniqueNo, x.DeviceConnectionInfo }) return data.GroupBy(x => new { x.Brand, x.DeviceUniqueNo, x.DeviceConnectionInfo, x.FuncStr })
.Select(x => .Select(x =>
{ {
var b = x.Key.Brand; var b = x.Key.Brand;
var d = x.Key.DeviceUniqueNo; var d = x.Key.DeviceUniqueNo;
var dc = x.Key.DeviceConnectionInfo; var dc = x.Key.DeviceConnectionInfo??"{}";
var func = x.Key.FuncStr??"[]";
var jobj = new JObject
{
{ "connectionInfo", JToken.Parse(dc) },
{ "function", JArray.Parse(func) }
};
return new DeviceTaskToDeviceByDeviceResponse return new DeviceTaskToDeviceByDeviceResponse
{ {
Brand = b, Brand = b,
DeviceUniqueNo = d, DeviceUniqueNo = d,
DeviceConnectionInfo = dc, DeviceInfo = jobj,
Tasks = x.AsEnumerable().Select(item => Tasks = x.AsEnumerable().Select(item =>
{ {
var key = $"face:{item.UserCode}"; var key = $"face:{item.UserCode}";
@@ -131,11 +141,20 @@ public class AssignmentService : IAssignmentService
? timeLimitedDataProtector.Protect(key, TimeSpan.FromSeconds(faceUrlOptions.Limit)) ? timeLimitedDataProtector.Protect(key, TimeSpan.FromSeconds(faceUrlOptions.Limit))
: string.Empty; : string.Empty;
return new TaskCombineUserDimensionDto var dto = new TaskCombineDto
{ {
TaskId = item.TaskId, TaskId = item.TaskId,
Type = item.Type, Type = item.Type,
UserInfo = new UserToDeviceResponse };
switch (dto.Type)
{
case DeviceTaskEnumType.Add:
case DeviceTaskEnumType.Delete:
case DeviceTaskEnumType.Update:
{
dto.Info = new UserToDeviceResponse
{ {
UserId = item.UserId, UserId = item.UserId,
UserNo = item.UserNo, UserNo = item.UserNo,
@@ -145,9 +164,62 @@ public class AssignmentService : IAssignmentService
DepartmentName = item.DepartmentName, DepartmentName = item.DepartmentName,
CardNo = item.Type == DeviceTaskEnumType.Add ? item.CardNo : string.Empty, CardNo = item.Type == DeviceTaskEnumType.Add ? item.CardNo : string.Empty,
Face = item.Type == DeviceTaskEnumType.Add ? faceUrlOptions.Url + token : string.Empty,//下发才附带照片信息 Face = item.Type == DeviceTaskEnumType.Add ? faceUrlOptions.Url + token : string.Empty,//下发才附带照片信息
ValidDatePeriod = new DatePeriod
{
Start = DateOnly.FromDateTime(DateTime.Now),
End = DateOnly.FromDateTime(DateTime.Now.AddYears(20)),
},
TimePeriods = new List<int> { 1 },
Doors = new List<int> { 1, 2, 3 },
Schedule = 1
};
}
break;
case DeviceTaskEnumType.TimePeriodAdd:
case DeviceTaskEnumType.TimePeriodDelete:
{
dto.Info = new TimePeriodToDeviceResponse
{
Id = 1,
TimePeriod = new TimePeriod
{
Start = TimeOnly.Parse("08:00:00"),
End = TimeOnly.Parse("17:30:00"),
},
Weeks = new List<DayOfWeek>
{
DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday
},
};
}
break;
case DeviceTaskEnumType.ScheduleAdd:
case DeviceTaskEnumType.ScheduleDelete:
{
dto.Info = new ScheduleToDeviceResponse
{
Id = 1,
Enable = true,
Name = "计划的一部分",
Schedules = new List<ScheduleDto>
{
new ScheduleDto
{
Name = "国庆节",
DateTimePeriod = new DateTimePeriod
{
Start = new DateTime(2024,10,1), End = new DateTime(2024,10,7)
}
}
} }
}; };
}
break;
default:
break;
}
return dto;
}) })
.ToList() .ToList()
}; };
@@ -226,6 +298,14 @@ public class AssignmentService : IAssignmentService
//*********************************************************** help methods ********************************************************************* //*********************************************************** help methods *********************************************************************
/// <summary>
/// 并发处理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <param name="retry"></param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<T> ContinueUpdateAsync<T>(Func<Task<T>> func, int retry) private async Task<T> ContinueUpdateAsync<T>(Func<Task<T>> func, int retry)
{ {
for (int i = 0; i < retry; i++) for (int i = 0; i < retry; i++)