using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.ScheduledTask.Common.Request; using Dlhis.ScheduledTask.Common.Services; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Scheduled; using Kurisu.Scheduled.Attributes; using Microsoft.Extensions.Logging; using SqlSugar; namespace Dlhis.ScheduledTask.Jobs; /// /// 上传考勤记录 /// [RecurringJob(nameof(SyncOriginCardInfoJob), "0 0/15 * * * ?", Name = "上传考勤记录")] public class SyncOriginCardInfoJob : BaseJob { private readonly IJinkoJIPService _jinkoJIPService; public SyncOriginCardInfoJob(IJinkoJIPService jinkoJIPService, IServiceProvider serviceProvider) : base(serviceProvider) { _jinkoJIPService = jinkoJIPService; } public override async Task RunAsync(IServiceProvider serviceProvider) { //考勤设备(不需要Enable参数) var devices = await DbContext.Queryable() .Where(x => x.Type == DeviceTypeEnumType.Attendance || x.Type == DeviceTypeEnumType.Door && x.AsAttendance) .ToListAsync(); //获取上传日志(有效的) var deviceUniqueNos = devices.Select(x => x.UniqueNo).ToList(); var logs = await DbContext.Queryable() .Where(x => deviceUniqueNos.Contains(x.DeviceUniqueNo)) .Where(x => !string.IsNullOrEmpty(x.UserUniqueNo)) .Where(x => x.Sync == false) .ToListAsync(); //获取人员信息 var userCodes = logs.Select(x => x.UserUniqueNo).ToList(); var gainfoCodes = await DbContext.Queryable().Where(x => userCodes.Contains(x.Code)).Select(x => x.Code).ToListAsync(); var requests = logs.Select(x => new UploadAttendanceRequest { Id = x.Id, RaiseDateTime = x.RaiseDateTime, ZNOTE = devices.First(item => item.UniqueNo == x.DeviceUniqueNo).DeployPlace, ZWORKCODE = gainfoCodes.Contains(x.UserUniqueNo) ? x.UserUniqueNo?.TrimEnd('\0') : string.Empty, }).Where(x => x.ZWORKCODE.IsPresent()).ToList(); if (requests.Any()) { foreach (var items in requests.Chunk(500)) { try { var ids = items.Select(x => x.Id).ToList(); var r = await _jinkoJIPService.UploadAttendancesAsync(items.ToList()); if (r.OLX == "0") { await DbContext.Updateable() .SetColumns(x => x.Sync == true) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => ids.Contains(x.Id)) .ExecuteCommandAsync(); } else { Logger.LogError(r.OMS); } } catch (Exception ex) { Logger.LogError(ex, "考勤分配上传异常:{message}", ex.Message); } } } } }