using System.Linq.Expressions; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.ScheduledTask.DeviceUploadLog.Request; using Dlhis.ScheduledTask.DeviceUploadLog.Response; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; using SqlSugar; namespace Dlhis.ScheduledTask.DeviceUploadLog.Services.Implements; public class DeviceUploadLogService : IDeviceUploadLogService { private readonly IDbContext _dbContext; private readonly ILogger _logger; public DeviceUploadLogService(IDbContext dbContext, ILogger logger) { _dbContext = dbContext; _logger = logger; } public async Task> GetPageAsync(DeviceUploadLogPageRequest request) { DeviceUploadLogTypeEnumType? type = request.Type == DeviceTypeEnumType.Attendance ? DeviceUploadLogTypeEnumType.Attendance : request.Type == DeviceTypeEnumType.Door ? DeviceUploadLogTypeEnumType.Door : null; return await _dbContext.Queryable() .LeftJoin((deviceUp, device) => deviceUp.DeviceUniqueNo == device.UniqueNo) .LeftJoin((deviceUp, device, ga) => deviceUp.UserUniqueNo == ga.Code) .WhereIF(type.HasValue, (deviceUp, device) => deviceUp.Type == type) .WhereIF(request.Sync.HasValue, deviceUp => deviceUp.Sync == request.Sync) .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.RaiseDateTime >= request.SearchDateTimePeriod.Start) .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.RaiseDateTime <= request.SearchDateTimePeriod.End) .WhereIF(request.Search.IsPresent(), (deviceUp, device, ga) => ga.Code == request.Search || ga.Name == request.Search || deviceUp.DeviceUniqueNo == request.Search ) .OrderBy(deviceUp => deviceUp.CreateTime, OrderByType.Desc) .Select((deviceUp, device, ga) => new DeviceUploadLogResponse { OriginUserUniqueNo = deviceUp.UserUniqueNo, Supplier = device.Supplier, DeviceUniqueNo = deviceUp.DeviceUniqueNo, Id = deviceUp.Id, RaiseDateTime = deviceUp.RaiseDateTime, CreateTime = deviceUp.CreateTime, SerialNo = deviceUp.SerialNo, UserNo = ga.No, UserCode = ga.Code, UserName = ga.Name, DeployPlace = device.DeployPlace, Sync = deviceUp.Sync, }) .ToPageListAsync(request); } public async Task UploadLogsAsync(List requests) { //判断存在的记录 Expression> where = LinqExpressionExtensions.False(); requests.ForEach(p => { where = where.Or(x => x.DeviceUniqueNo == p.DeviceUniqueNo && x.SerialNo == p.SerialNo && x.RaiseDateTime == p.RaiseDateTime); }); //处理冗余的请求数据 var exists = await _dbContext.Queryable().Where(where).ToListAsync(); foreach (var item in exists) { requests.RemoveAll(x => x.DeviceUniqueNo == item.DeviceUniqueNo && x.SerialNo == item.SerialNo && x.RaiseDateTime == item.RaiseDateTime); } 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).SelectMany(x => { var device = devices.FirstOrDefault(item => item.UniqueNo == x.Key); if (device != null) { return x.Select(item => new DeviceUploadLogEntity { DeviceUniqueNo = x.Key, UserUniqueNo = item.UserUniqueNo, RaiseDateTime = item.RaiseDateTime, SerialNo = item.SerialNo, Type = device.Type == DeviceTypeEnumType.Attendance ? DeviceUploadLogTypeEnumType.Attendance : DeviceUploadLogTypeEnumType.Door, TenantId = device.TenantId, }).ToList(); } return null; }).Where(x => x != null).ToList(); await _dbContext.InsertAsync(records); } public async Task SetUploadLogsBeginDateTimeAsync(List requests) { var uniqueNos = requests.DistinctBy(x => x.DeviceUniqueNo).Select(x => x.DeviceUniqueNo).ToList(); var devices = await _dbContext.Queryable() .Where(x => uniqueNos.Contains(x.UniqueNo)) .Where(x => x.Type == DeviceTypeEnumType.Attendance || x.Type == DeviceTypeEnumType.Door) .ToListAsync(); (uniqueNos.Count != devices.Count).ThrowIfTrue("存在非考勤和门禁的设备"); var tenantId = devices.FirstOrDefault().TenantId; var logs = new List(requests.Count); foreach (var request in requests) { logs.Add(new DeviceUploadLogEntity { DeviceUniqueNo = request.DeviceUniqueNo, Type = DeviceUploadLogTypeEnumType.Raise, RaiseDateTime = request.Begin, TenantId = tenantId }); } await _dbContext.InsertAsync(logs); } }