using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
using Dlhis.Jip.Api;
using Dlhis.Jip.Api.Requests;
using Dlhis.ScheduledTask.Attributes;
using SqlSugar;
namespace Dlhis.ScheduledTask.Jobs;
///
/// 上传考勤记录
///
[RecurringJob(nameof(SyncOriginCardInfoJob), "0 0/1 * * * ?", Name = "上传考勤记录")]
public class SyncOriginCardInfoJob : BaseJob
{
private readonly IJinkoJipApi _jinkoJipApi;
public SyncOriginCardInfoJob(IJinkoJipApi jinkoJipApi, IServiceProvider serviceProvider) : base(serviceProvider)
{
_jinkoJipApi = jinkoJipApi;
}
protected override async Task RunAsync(IServiceProvider serviceProvider)
{
var start = DateTime.Now.AddHours(-1);
var requests = await DbContext.Queryable()
.LeftJoin((x, device) => x.DeviceUniqueNo == device.UniqueNo)
.Where(x => x.ModifiedTime > start)
.Where(x => !string.IsNullOrEmpty(x.UserUniqueNo))
.Where(x => x.Sync == false)
.Where(x => SqlFunc.Subqueryable().Where(p => p.Code == x.UserUniqueNo).NotAny())
.Where(x => SqlFunc.Subqueryable()
.Where(p => p.UniqueNo == x.DeviceUniqueNo)
.Where(p => p.Type == DeviceTypeEnumType.Attendance || (p.Type == DeviceTypeEnumType.Door && p.AsAttendance)).Any())
.Select((x, device) => new UploadAttendanceRequestItem
{
Id = x.Id,
RaiseDateTime = x.RaiseDateTime,
ZNOTE = device.DeployPlace,
ZWORKCODE = x.UserUniqueNo
})
.ToPageListAsync(1, 500);
Logger.LogInformation("获取待上传考勤记录数:{count}", requests.Count);
if (requests.Any())
{
foreach (var items in requests.Chunk(500))
{
try
{
var ids = items.Select(x => x.Id).ToList();
var r = await _jinkoJipApi.UploadAttendancesAsync(new UploadAttendanceRequest { Data = 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("考勤上传异常:{message}", r.OMS);
}
}
catch (Exception ex)
{
Logger.LogError(ex, "考勤上传异常:{message}", ex.Message);
}
}
}
}
}