From 7f05cbc3687df09460f5aac03b0469f20e4c88f5 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 19 Jan 2024 13:30:35 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=B8=8B=E5=8F=91=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BF=AE=E6=94=B9,=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DeviceUploadLogsController.cs | 11 ++ .../Request/DeviceUploadLogUploadRequest.cs | 4 +- .../Services/IDeviceUploadLogService.cs | 2 + .../Implements/DeviceUploadLogService.cs | 39 ++++-- Src/Dlhis.ScheduledTask/Packs/JobPack.cs | 8 -- .../Request/DeviceTaskGetRequest.cs | 5 + .../Response/DeviceTaskToDeviceResponse.cs | 8 +- .../TaskAssignment/Response/ScheduleDto.cs | 16 +++ .../Response/ScheduleToDeviceResponse.cs | 24 ++++ ...eUserDimensionDto.cs => TaskCombineDto.cs} | 6 +- .../Response/TimePeriodToDeviceResponse.cs | 21 ++++ .../Response/UserToDeviceResponse.cs | 25 +++- .../Services/Implements/AssignmentService.cs | 116 +++++++++++++++--- 13 files changed, 240 insertions(+), 45 deletions(-) create mode 100644 Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleDto.cs create mode 100644 Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleToDeviceResponse.cs rename Src/Dlhis.ScheduledTask/TaskAssignment/Response/{TaskCombineUserDimensionDto.cs => TaskCombineDto.cs} (80%) create mode 100644 Src/Dlhis.ScheduledTask/TaskAssignment/Response/TimePeriodToDeviceResponse.cs diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs index c98178a5..b9e57664 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs @@ -43,4 +43,15 @@ public class DeviceUploadLogsController : ControllerBase { await _deviceUploadLogService.UploadLogAsync(request); } + + /// + /// 批量上传记录 + /// + /// + /// + [HttpPost("records")] + public async Task UploadLogsAsync(List requests) + { + await _deviceUploadLogService.UploadLogsAsync(requests); + } } diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogUploadRequest.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogUploadRequest.cs index df39165a..42a43522 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogUploadRequest.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogUploadRequest.cs @@ -13,8 +13,8 @@ public class DeviceUploadLogUploadRequest /// /// 用户学工号 /// - [Required(ErrorMessage = "用户学工号不能为空")] - public string UserCode { get; set; } + [Required(ErrorMessage = "人员唯一号不能为空")] + public string UserUniqueNo { get; set; } /// /// 上传时间 diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs index b3793541..8a6285e2 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs @@ -9,4 +9,6 @@ public interface IDeviceUploadLogService : IScopeDependency Task> GetPageAsync(DeviceUploadLogPageRequest request); Task UploadLogAsync(DeviceUploadLogUploadRequest request); + + Task UploadLogsAsync(List requests); } diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs index a2411af6..43961c53 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs @@ -22,7 +22,7 @@ public class DeviceUploadLogService : IDeviceUploadLogService public async Task> GetPageAsync(DeviceUploadLogPageRequest request) { var page = await _dbContext.Queryable() - .LeftJoin((deviceUp, ga) => deviceUp.UserNo == ga.No) + .LeftJoin((deviceUp, ga) => deviceUp.UserUniqueNo == ga.No) .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.UploadTime >= request.SearchDateTimePeriod.Start) .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.UploadTime <= request.SearchDateTimePeriod.End) .Select((deviceUp, ga) => new DeviceUploadLogResponse @@ -31,8 +31,8 @@ public class DeviceUploadLogService : IDeviceUploadLogService Id = deviceUp.Id, Ip = deviceUp.Ip, UploadTime = deviceUp.UploadTime, - UserNo = deviceUp.UserNo, - UserCode = deviceUp.UserCode, + UserNo = ga.No, + UserCode = ga.Code, UserName = ga.Name, }) .ToPageListAsync(request); @@ -46,18 +46,41 @@ public class DeviceUploadLogService : IDeviceUploadLogService var device = await _dbContext.Queryable().Where(x => x.UniqueNo == request.DeviceUniqueNo).SingleAsync(); device.ThrowIfNull("设备信息不存在"); - var gainfo = await _dbContext.Queryable().Where(x => x.Code == request.UserCode).FirstAsync(); - device.ThrowIfNull("人员信息不存在"); - var entity = new DeviceUploadLogEntity { DeviceUniqueNo = request.DeviceUniqueNo, UploadTime = request.UploadTime, - UserCode = request.UserCode, - UserNo = gainfo.No, + UserUniqueNo = request.UserUniqueNo, TenantId = device.TenantId, }; await _dbContext.InsertAsync(entity); } + + [IgnoreTenant] + public async Task UploadLogsAsync(List requests) + { + var nos = requests.Select(x => x.DeviceUniqueNo).ToList(); + var devices = await _dbContext.Queryable().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); + } } diff --git a/Src/Dlhis.ScheduledTask/Packs/JobPack.cs b/Src/Dlhis.ScheduledTask/Packs/JobPack.cs index 2cd1b3a8..59ae770e 100644 --- a/Src/Dlhis.ScheduledTask/Packs/JobPack.cs +++ b/Src/Dlhis.ScheduledTask/Packs/JobPack.cs @@ -12,17 +12,9 @@ public class JobPack : BaseAppPack public override void Invoke(IServiceProvider serviceProvider) { - -#if DEBUG - RecurringJob.AddOrUpdate("SyncSap", s => s.SyncOrgInfo(), "30 * * * * ?", new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Local - }); -#else RecurringJob.AddOrUpdate("SyncSap", s => s.SyncOrgInfo(), "0 0 2 * * ?", new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }); -#endif } } diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Request/DeviceTaskGetRequest.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/DeviceTaskGetRequest.cs index 612c6eec..178481ce 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Request/DeviceTaskGetRequest.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Request/DeviceTaskGetRequest.cs @@ -16,6 +16,11 @@ public class DeviceTaskGetRequest : PageDto, IValidatableObject /// public string DeviceUniqueNo { get; set; } + /// + /// 获取处理中的任务 + /// + public bool IsProcess { get; set; } = false; + public IEnumerable Validate(ValidationContext validationContext) { if (Brand.IsEmpty() && DeviceUniqueNo.IsEmpty()) diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/DeviceTaskToDeviceResponse.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/DeviceTaskToDeviceResponse.cs index ab6bd4ce..5c9846e8 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/DeviceTaskToDeviceResponse.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/DeviceTaskToDeviceResponse.cs @@ -1,7 +1,7 @@ namespace Dlhis.ScheduledTask.TaskAssignment.Response; /// -/// 设备维度任务 +/// 设备任务 /// public class DeviceTaskToDeviceByDeviceResponse { @@ -16,12 +16,12 @@ public class DeviceTaskToDeviceByDeviceResponse public string DeviceUniqueNo { get; set; } /// - /// 连接信息 + /// 设备信息 /// - public string DeviceConnectionInfo { get; set; } + public object DeviceInfo { get; set; } /// /// 任务 /// - public List Tasks { get; set; } + public List Tasks { get; set; } } diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleDto.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleDto.cs new file mode 100644 index 00000000..648262e6 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleDto.cs @@ -0,0 +1,16 @@ +using Kurisu.Core.CustomClass; + +namespace Dlhis.ScheduledTask.TaskAssignment.Response; + +public class ScheduleDto +{ + /// + /// 假日名称 + /// + public string Name { get; set; } + + /// + /// 开始结束日期时段 + /// + public DateTimePeriod DateTimePeriod { get; set; } +} diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleToDeviceResponse.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleToDeviceResponse.cs new file mode 100644 index 00000000..4f8515b1 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/ScheduleToDeviceResponse.cs @@ -0,0 +1,24 @@ +namespace Dlhis.ScheduledTask.TaskAssignment.Response; + +public class ScheduleToDeviceResponse +{ + /// + /// 计划id,范围:1-128 + /// + public int Id { get; set; } + + /// + /// 使能 + /// + public bool Enable { get; set; } + + /// + /// 计划名称 + /// + public string Name { get; set; } + + /// + /// 计划 + /// + public List Schedules { get; set; } +} diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineUserDimensionDto.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineDto.cs similarity index 80% rename from Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineUserDimensionDto.cs rename to Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineDto.cs index a9725d53..6b1526c8 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineUserDimensionDto.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TaskCombineDto.cs @@ -3,7 +3,7 @@ using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.ScheduledTask.TaskAssignment.Response; -public class TaskCombineUserDimensionDto +public class TaskCombineDto { /// /// 任务id @@ -21,7 +21,7 @@ public class TaskCombineUserDimensionDto public string TypeDesc => Type.GetDescription(); /// - /// 用户下发信息 + /// 下发信息 /// - public UserToDeviceResponse UserInfo { get; set; } + public object Info { get; set; } } diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TimePeriodToDeviceResponse.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TimePeriodToDeviceResponse.cs new file mode 100644 index 00000000..3402e934 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/TimePeriodToDeviceResponse.cs @@ -0,0 +1,21 @@ +using Kurisu.Core.CustomClass; + +namespace Dlhis.ScheduledTask.TaskAssignment.Response; + +public class TimePeriodToDeviceResponse +{ + /// + /// 时段码id + /// + public int Id { get; set; } + + /// + /// 星期 + /// + public List Weeks { get; set; } + + /// + /// 时段区间 + /// + public TimePeriod TimePeriod { get; set; } +} diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/UserToDeviceResponse.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/UserToDeviceResponse.cs index b2d752f3..7f857406 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Response/UserToDeviceResponse.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Response/UserToDeviceResponse.cs @@ -1,4 +1,6 @@ -namespace Dlhis.ScheduledTask.TaskAssignment.Response; +using Kurisu.Core.CustomClass; + +namespace Dlhis.ScheduledTask.TaskAssignment.Response; public class UserToDeviceResponse { @@ -32,7 +34,6 @@ public class UserToDeviceResponse /// public string DepartmentName { get; set; } - /// /// 卡号 /// @@ -42,4 +43,24 @@ public class UserToDeviceResponse /// 人脸 /// public string Face { get; set; } + + /// + /// 有效日期范围 + /// + public DatePeriod ValidDatePeriod { get; set; } + + /// + /// 控制门[1,2,3....] + /// + public List Doors { get; set; } + + /// + /// 时段[1,2,3....] + /// + public List TimePeriods { get; set; } + + /// + /// 假期计划id + /// + public int Schedule { get; set; } } diff --git a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs index bb595476..e447b532 100644 --- a/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs +++ b/Src/Dlhis.ScheduledTask/TaskAssignment/Services/Implements/AssignmentService.cs @@ -13,7 +13,8 @@ using Microsoft.Extensions.Options; using SqlSugar; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Attributes; -using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using Kurisu.Core.CustomClass; namespace Dlhis.ScheduledTask.TaskAssignment.Services.Implements; @@ -40,16 +41,18 @@ public class AssignmentService : IAssignmentService .LeftJoin((deviceTask, deivce, deivceTamplate, ga, department) => department.No == ga.DepartmentNo) .WhereIF(request.Brand.IsPresent(), (deviceTask, deivce, deivceTamplate) => deivceTamplate.Brand == request.Brand) .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) .Select((deviceTask, deivce, deivceTamplate, ga, department) => new { - UserId = ga.Id, + UserId = SqlFunc.IsNull(ga.Id, 0), TaskId = deviceTask.Id, deviceTask.Type, deviceTask.DeviceUniqueNo, DeviceConnectionInfo = deivce.ConnectionInfo, deivce.Brand, + FuncStr = deivce.Funcs.ToString(), deviceTask.UserNo, deviceTask.UserCode, UserName = ga.Name, @@ -112,18 +115,25 @@ public class AssignmentService : IAssignmentService .CreateProtector("down:face") .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 => { var b = x.Key.Brand; 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 { Brand = b, DeviceUniqueNo = d, - DeviceConnectionInfo = dc, + DeviceInfo = jobj, Tasks = x.AsEnumerable().Select(item => { var key = $"face:{item.UserCode}"; @@ -131,23 +141,85 @@ public class AssignmentService : IAssignmentService ? timeLimitedDataProtector.Protect(key, TimeSpan.FromSeconds(faceUrlOptions.Limit)) : string.Empty; - return new TaskCombineUserDimensionDto + var dto = new TaskCombineDto { TaskId = item.TaskId, Type = item.Type, - UserInfo = new UserToDeviceResponse - { - UserId = item.UserId, - UserNo = item.UserNo, - UserCode = item.UserCode, - UserName = item.UserName, - DepartmentNo = item.DepartmentNo, - DepartmentName = item.DepartmentName, - CardNo = item.Type == DeviceTaskEnumType.Add ? item.CardNo : string.Empty, - Face = item.Type == DeviceTaskEnumType.Add ? faceUrlOptions.Url + token : string.Empty,//下发才附带照片信息 - } }; + + switch (dto.Type) + { + case DeviceTaskEnumType.Add: + case DeviceTaskEnumType.Delete: + case DeviceTaskEnumType.Update: + { + dto.Info = new UserToDeviceResponse + { + UserId = item.UserId, + UserNo = item.UserNo, + UserCode = item.UserCode, + UserName = item.UserName, + DepartmentNo = item.DepartmentNo, + DepartmentName = item.DepartmentName, + CardNo = item.Type == DeviceTaskEnumType.Add ? item.CardNo : 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 { 1 }, + Doors = new List { 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.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 + { + new ScheduleDto + { + Name = "国庆节", + DateTimePeriod = new DateTimePeriod + { + Start = new DateTime(2024,10,1), End = new DateTime(2024,10,7) + } + } + } + }; + } + break; + default: + break; + } + + return dto; }) .ToList() }; @@ -226,6 +298,14 @@ public class AssignmentService : IAssignmentService //*********************************************************** help methods ********************************************************************* + /// + /// 并发处理 + /// + /// + /// + /// + /// + /// private async Task ContinueUpdateAsync(Func> func, int retry) { for (int i = 0; i < retry; i++)