diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs
new file mode 100644
index 00000000..d7809b21
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Controllers/DeviceUploadLogsController.cs
@@ -0,0 +1,35 @@
+using Dlhis.ScheduledTask.DeviceUploadLog.Request;
+using Dlhis.ScheduledTask.DeviceUploadLog.Response;
+using Dlhis.ScheduledTask.DeviceUploadLog.Services;
+using Kurisu.Core.DataAccess.Dto;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Dlhis.ScheduledTask.DeviceUploadLog.Controllers;
+
+///
+/// 设备上传记录
+///
+[Authorize]
+[Route("api/[controller]")]
+[ApiController]
+public class DeviceUploadLogsController : ControllerBase
+{
+ private readonly IDeviceUploadLogService _deviceUploadLogService;
+
+ public DeviceUploadLogsController(IDeviceUploadLogService deviceUploadLogService)
+ {
+ _deviceUploadLogService = deviceUploadLogService;
+ }
+
+ ///
+ /// 获取上传记录分页
+ ///
+ ///
+ ///
+ [HttpGet("page")]
+ public async Task> GetPageAsync([FromQuery] DeviceUploadLogPageRequest request)
+ {
+ return await _deviceUploadLogService.GetPageAsync(request);
+ }
+}
diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogPageRequest.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogPageRequest.cs
new file mode 100644
index 00000000..37aef592
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Request/DeviceUploadLogPageRequest.cs
@@ -0,0 +1,66 @@
+using Dlhis.Entity.Canteen.Enums;
+using Kurisu.Core.CustomClass;
+using System.ComponentModel.DataAnnotations;
+using Kurisu.Core.DataAccess.Dto;
+
+namespace Dlhis.ScheduledTask.DeviceUploadLog.Request;
+
+public class DeviceUploadLogPageRequest : PageDto, IValidatableObject
+{
+ ///
+ /// 查询日期范围类型 DateTimeSearchEnumType
+ ///
+ [EnumDataType(typeof(DateTimeSearchEnumType))]
+ public DateTimeSearchEnumType? SearchDateTimeDimension { get; set; }
+
+ ///
+ /// 日期范围查询
+ ///
+ public DateTimePeriod SearchDateTimePeriod { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ var now = DateTime.Now;
+ if (SearchDateTimeDimension.HasValue)
+ {
+ //重新赋值
+ SearchDateTimePeriod = new DateTimePeriod();
+
+ if (SearchDateTimeDimension == DateTimeSearchEnumType.Day)
+ {
+ SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, now.Day, 0, 0, 1);
+ SearchDateTimePeriod.End = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59);
+ }
+ else if (SearchDateTimeDimension == DateTimeSearchEnumType.Week)
+ {
+ SearchDateTimePeriod.Start = now.AddDays(1 - (int)now.DayOfWeek);
+ SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddDays(6);
+ }
+ else if (SearchDateTimeDimension == DateTimeSearchEnumType.Month)
+ {
+ SearchDateTimePeriod.Start = new DateTime(now.Year, now.Month, 1);
+ SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddMonths(1).AddDays(-1);
+ }
+ else if (SearchDateTimeDimension == DateTimeSearchEnumType.Season)
+ {
+ SearchDateTimePeriod.Start = now.AddMonths(0 - ((now.Month - 1) % 3));
+ SearchDateTimePeriod.End = now.AddMonths(3 - ((now.Month - 1) % 3)).AddMonths(1).AddDays(-1);
+ }
+ else if (SearchDateTimeDimension == DateTimeSearchEnumType.HalfOfYear)
+ {
+ SearchDateTimePeriod.Start = now.AddDays(-180);
+ SearchDateTimePeriod.End = now;
+ }
+ else if (SearchDateTimeDimension == DateTimeSearchEnumType.Year)
+ {
+ SearchDateTimePeriod.Start = new DateTime(now.Year, 1, 1);
+ SearchDateTimePeriod.End = SearchDateTimePeriod.Start.Value.AddYears(1).AddDays(-1);
+ }
+
+ SearchDateTimePeriod.Start = SearchDateTimePeriod.Start.Value.Date;
+ SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.Date;
+ }
+
+ yield break;
+ }
+}
diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Response/DeviceUploadLogResponse.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Response/DeviceUploadLogResponse.cs
new file mode 100644
index 00000000..1770a7e6
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Response/DeviceUploadLogResponse.cs
@@ -0,0 +1,37 @@
+namespace Dlhis.ScheduledTask.DeviceUploadLog.Response;
+
+public class DeviceUploadLogResponse
+{
+ public long Id { get; set; }
+
+ ///
+ /// 设备号
+ ///
+ public string DeviceUniqueNo { get; set; }
+
+ ///
+ /// 用户档案号
+ ///
+ public string UserNo { get; set; }
+
+ ///
+ /// 用户学工号
+ ///
+ public string UserCode { get; set; }
+
+
+ ///
+ /// 用户名称
+ ///
+ public string UserName { get; set; }
+
+ ///
+ /// 上传IP
+ ///
+ public string Ip { get; set; }
+
+ ///
+ /// 上传时间
+ ///
+ public DateTime UploadTime { get; set; }
+}
diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs
new file mode 100644
index 00000000..8ff42806
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/IDeviceUploadLogService.cs
@@ -0,0 +1,10 @@
+using Dlhis.ScheduledTask.DeviceUploadLog.Request;
+using Dlhis.ScheduledTask.DeviceUploadLog.Response;
+using Kurisu.Core.DataAccess.Dto;
+
+namespace Dlhis.ScheduledTask.DeviceUploadLog.Services;
+
+public interface IDeviceUploadLogService : IScopeDependency
+{
+ Task> GetPageAsync(DeviceUploadLogPageRequest request);
+}
diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs
new file mode 100644
index 00000000..795cd81e
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs
@@ -0,0 +1,40 @@
+using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Device.Entities;
+using Dlhis.ScheduledTask.DeviceUploadLog.Request;
+using Dlhis.ScheduledTask.DeviceUploadLog.Response;
+using Kurisu.Core.DataAccess.Dto;
+using Kurisu.SqlSugar.Extensions;
+using Kurisu.SqlSugar.Services;
+
+namespace Dlhis.ScheduledTask.DeviceUploadLog.Services.Implements;
+
+public class DeviceUploadLogService : IDeviceUploadLogService
+{
+ private readonly IDbContext _dbContext;
+
+ public DeviceUploadLogService(IDbContext dbContext)
+ {
+ _dbContext = dbContext;
+ }
+
+ public async Task> GetPageAsync(DeviceUploadLogPageRequest request)
+ {
+ var page = await _dbContext.Queryable()
+ .LeftJoin((deviceUp, ga) => deviceUp.UserNo == ga.No)
+ .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, deviceUp => deviceUp.CreateTime >= request.SearchDateTimePeriod.Start)
+ .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, deviceUp => deviceUp.CreateTime <= request.SearchDateTimePeriod.End)
+ .Select((deviceUp, ga) => new DeviceUploadLogResponse
+ {
+ DeviceUniqueNo = deviceUp.DeviceUniqueNo,
+ Id = deviceUp.Id,
+ Ip = deviceUp.Ip,
+ UploadTime = deviceUp.CreateTime,
+ UserNo = deviceUp.UserNo,
+ UserCode = deviceUp.UserCode,
+ UserName = ga.Name,
+ })
+ .ToPageListAsync(request);
+
+ return page;
+ }
+}