diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs
index 1795014a..021705ed 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionManuallyController.cs
@@ -59,6 +59,7 @@ public class DevicePermissionManuallyController : ControllerBase
///
///
[HttpPost("batchDelete")]
+ [Transactional]
public async Task DeleteAsync(List ids)
{
await _devicePermissionService.DeleteAsync(ids);
diff --git a/Src/Dlhis.ScheduledTask/Jobs/RemoveManuallyDevicePermissionJob.cs b/Src/Dlhis.ScheduledTask/Jobs/RemoveManuallyDevicePermissionJob.cs
new file mode 100644
index 00000000..a158a177
--- /dev/null
+++ b/Src/Dlhis.ScheduledTask/Jobs/RemoveManuallyDevicePermissionJob.cs
@@ -0,0 +1,58 @@
+using Dlhis.Entity.Basic.Entity;
+using Dlhis.Entity.Device.Entities;
+using Dlhis.Entity.Device.Enums;
+using Dlhis.ScheduledTask.Attributes;
+using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
+
+namespace Dlhis.ScheduledTask.Jobs;
+
+///
+/// 移除例外权限
+///
+[RecurringJob(nameof(RemoveManuallyDevicePermissionJob), "", Name = "移除例外权限")]
+public class RemoveManuallyDevicePermissionJob : BaseJob
+{
+ public RemoveManuallyDevicePermissionJob(IServiceProvider serviceProvider) : base(serviceProvider)
+ {
+ }
+
+ protected override async Task RunAsync(IServiceProvider serviceProvider)
+ {
+ var now = DateTime.Now;
+ var db = serviceProvider.GetService();
+
+ var data = await db.Queryable().Where(x => x.ValidDateTime.HasValue && x.ValidDateTime >= now).ToListAsync();
+ var deviceCodes = data.Select(x => x.DeviceCode).Distinct().ToList();
+ var devices = await db.Queryable().Where(x => deviceCodes.Contains(x.Code)).ToListAsync();
+
+ foreach (var item in data)
+ {
+ var userInfo = await db.Queryable().Where(x => x.No == item.UserNo).Select(x => new { x.Id, x.No }).SingleAsync()
+ ?? await db.Queryable().Where(x => x.No == item.UserNo).Select(x => new { Id = (long)x.IdentityUserId, x.No }).SingleAsync();
+
+ if (userInfo != null)
+ {
+ var device = devices.FirstOrDefault(x => x.Code == item.DeviceCode);
+ if (device != null)
+ {
+ await db.InsertAsync(new DeviceTaskEntity
+ {
+ Type = DeviceTaskEnumType.Delete,
+ DeviceType = device.Type,
+ UserId = userInfo.Id,
+ UserNo = userInfo.No,
+ DeviceUniqueNo = device.UniqueNo,
+ Status = DeviceTaskStatusEnumType.Wait,
+ Version = 0,
+ ResultMessage = null,
+ Source = "例外权限到期",
+ Priority = 0,
+ TenantId = device.TenantId
+ });
+ }
+ }
+
+ await db.DeleteAsync(item);
+ }
+ }
+}