diff --git a/Src/Dlhis.Basic/Device/EventBusHandler/CancelDuplicationTaskHandler.cs b/Src/Dlhis.Basic/Device/EventBusHandler/CancelDuplicationTaskHandler.cs new file mode 100644 index 00000000..43c096dc --- /dev/null +++ b/Src/Dlhis.Basic/Device/EventBusHandler/CancelDuplicationTaskHandler.cs @@ -0,0 +1,135 @@ +using System.Linq.Expressions; +using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; +using Kurisu.AspNetCore.EventBus.Abstractions; +using Kurisu.AspNetCore.EventBus.Abstractions.Handler; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.DataAccess.Entity; +using Kurisu.SqlSugar.Services; +using SqlSugar; + +namespace Dlhis.Basic.Device.EventBusHandler; + +public class CancelDuplicationTaskHandler : IAsyncChannelHandler +{ + private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; + + public CancelDuplicationTaskHandler(IServiceProvider serviceProvider, ILogger logger) + { + _serviceProvider = serviceProvider; + _logger = logger; + } + + public async Task InvokeAsync(CancelDuplicationTaskMessage message) + { + _logger.LogInformation("抵消任务开始处理"); + + using (var scope = _serviceProvider.CreateScope()) + { + var optionService = scope.ServiceProvider.GetService(); + var db = scope.ServiceProvider.GetService(); + + db.Client.QueryFilter.ClearAndBackup(); + optionService.IgnoreTenant = true; + try + { + //人员下发任务相关 + var taskTypes = new List() { DeviceTaskEnumType.Add, DeviceTaskEnumType.Delete, DeviceTaskEnumType.Update }; + + var deviceTasks = await db.Queryable() + .Where(x => x.Status == DeviceTaskStatusEnumType.Wait)//没有被获取 + .Where(x => taskTypes.Contains(x.Type)) + .OrderBy(x => x.CreateTime, OrderByType.Desc) + .ToListAsync(); + + var groupData = deviceTasks.GroupBy(x => new { x.TenantId, x.UserNo, x.DeviceUniqueNo }); + foreach (var deviceTaskPack in groupData) + { + var uniqueInfo = deviceTaskPack.Key; + var data = deviceTaskPack.ToList(); + + + foreach (var item in data) + { + try + { + Expression> where = LinqExpressionExtension.False(); + var ignoreData = new List(); + //最新一条更新人员信息 + if (item.Type == DeviceTaskEnumType.Update && item.Status == DeviceTaskStatusEnumType.Wait) + { + //获取过往的更新人员任务 + ignoreData = data.Where(x => x.Type == DeviceTaskEnumType.Update) + .Where(x => x.Status == DeviceTaskStatusEnumType.Wait) + .Where(x => x.Id != item.Id) + .Select(x => new IdVersion { Id = x.Id, Version = x.Version }).ToList(); + + ignoreData.ForEach(p => + { + where = where.Or(x => x.Id == p.Id && x.Version == p.Version && x.Status == DeviceTaskStatusEnumType.Wait); + }); + } + else if (item.Type == DeviceTaskEnumType.Delete && item.Status == DeviceTaskStatusEnumType.Wait) + { + ignoreData = data.Where(x => (x.Type == DeviceTaskEnumType.Add || x.Type == DeviceTaskEnumType.Delete)) + .Where(x => x.Status == DeviceTaskStatusEnumType.Wait) + .Where(x => x.Id != item.Id) + .Select(x => new IdVersion { Id = x.Id, Version = x.Version }).ToList(); + + ignoreData.ForEach(p => + { + where = where.Or(x => x.Id == p.Id && x.Version == p.Version && x.Status == DeviceTaskStatusEnumType.Wait); + }); + } + + if (ignoreData.Any()) + { + await db.Updateable() + .SetColumns(x => x.Version == x.Version + 1) + .SetColumns(x => x.Status == DeviceTaskStatusEnumType.Cancel) + .SetColumns(x => x.CancellationId == item.Id) + .SetColumns(x => x.ModifiedTime == DateTime.Now) + .Where(where) + .ExecuteCommandAsync(); + + data.ForEach(x => + { + if (ignoreData.Any(p => p.Id == x.Id)) + x.Status = DeviceTaskStatusEnumType.Cancel; + }); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "抵消处理异常:{message}", ex.Message); + } + } + } + } + catch (Exception ex) + { + _logger.LogError(ex, "抵消处理异常:{message}", ex.Message); + } + finally + { + db.Client.QueryFilter.Restore(); + optionService.IgnoreTenant = false; + } + } + + + _logger.LogInformation("抵消任务处理完成"); + } +} + +public class CancelDuplicationTaskMessage : IAsyncChannelMessage +{ + +} + +public class IdVersion +{ + public long Id { get; set; } + public int Version { get; set; } +} diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index f3c56a47..d1b38a8c 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -1,4 +1,5 @@ using Dlhis.Basic.Device.Dtos; +using Dlhis.Basic.Device.EventBusHandler; using Dlhis.Basic.Device.Request; using Dlhis.Basic.Device.Response; using Dlhis.Entity.Basic.Entity; @@ -6,6 +7,7 @@ using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.EventBus.Abstractions; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.Core.DataAccess.Entity; @@ -18,11 +20,13 @@ public class DevicePermissionService : IDevicePermissionService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; + private readonly IEventBus _eventBus; - public DevicePermissionService(IDbContext dbContext, ICurrentUser currentUser) + public DevicePermissionService(IDbContext dbContext, ICurrentUser currentUser, IEventBus eventBus) { _dbContext = dbContext; _currentUser = currentUser; + _eventBus = eventBus; } public async Task AssignAsync(DevicePermissionSaveReuqest reuqest) @@ -153,6 +157,7 @@ public class DevicePermissionService : IDevicePermissionService if (waitTasks.Any()) { await _dbContext.InsertAsync(waitTasks); + await _eventBus.PublishAsync(new CancelDuplicationTaskMessage()); } } finally diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index ffe86e4d..61d37f79 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -17,7 +17,7 @@ - + diff --git a/Src/Dlhis.Basic/Program.cs b/Src/Dlhis.Basic/Program.cs index 953eea17..8ccfcccb 100644 --- a/Src/Dlhis.Basic/Program.cs +++ b/Src/Dlhis.Basic/Program.cs @@ -1,3 +1,4 @@ +using Kurisu.AspNetCore.EventBus.Extensions; using Kurisu.AspNetCore.Startup; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Startup; @@ -22,5 +23,6 @@ public class Startup : DefaultStartup { base.ConfigureServices(services); services.AddRedis(); + services.AddEventBus(); } } \ No newline at end of file diff --git a/Src/Dlhis.Entity/Device/Entities/DeviceTaskEntity.cs b/Src/Dlhis.Entity/Device/Entities/DeviceTaskEntity.cs index 22d404b6..93ba3b54 100644 --- a/Src/Dlhis.Entity/Device/Entities/DeviceTaskEntity.cs +++ b/Src/Dlhis.Entity/Device/Entities/DeviceTaskEntity.cs @@ -47,5 +47,11 @@ public class DeviceTaskEntity : SugarBaseEntity, ITenantId, IVersion [SugarColumn(ColumnDataType = "longtext")] public string ResultMessage { get; set; } + /// + /// 取消id + /// + public long CancellationId { get; set; } + + public string TenantId { get; set; } } diff --git a/Src/Dlhis.Entity/Device/Enums/DeviceTaskStatusEnumType.cs b/Src/Dlhis.Entity/Device/Enums/DeviceTaskStatusEnumType.cs index 3c2009af..9b9cc18c 100644 --- a/Src/Dlhis.Entity/Device/Enums/DeviceTaskStatusEnumType.cs +++ b/Src/Dlhis.Entity/Device/Enums/DeviceTaskStatusEnumType.cs @@ -26,6 +26,13 @@ public enum DeviceTaskStatusEnumType [Description("下发完成")] Success = 10, + + /// + /// 取消 + /// + [Description("取消")] + Cancel = 95, + /// /// 异常 ///