diff --git a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs index e0274c09..bba3ae80 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DeviceGroupsController.cs @@ -23,7 +23,7 @@ public class DeviceGroupsController : ControllerBase } /// - /// 设备分组分页 + /// 设备组分页 /// /// /// @@ -34,7 +34,7 @@ public class DeviceGroupsController : ControllerBase } /// - /// 获取设备分组树 + /// 获取设备组树 /// /// 是否显示设备 /// diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index 404e8e6e..0efd2afc 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -38,4 +38,16 @@ public class DevicePermissionsController : ControllerBase { return await _devicePermissionService.GetAssignmentsAsync(request.UserNo, request.UniqueType); } + + + /// + /// 重置 + /// + /// + /// + [HttpPost("reset")] + public async Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request) + { + await _devicePermissionService.ResetAssignmentsAsync(request); + } } diff --git a/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs new file mode 100644 index 00000000..afdcbe9b --- /dev/null +++ b/Src/Dlhis.Basic/Device/Request/DeviceResetAssignmentsRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Device.Request; + +public class DeviceResetAssignmentsRequest +{ + /// + /// 人员档案号 + /// + [Required(ErrorMessage = "人员不能为空")] + public string UserNo { get; set; } +} diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index ee36c386..8c75e764 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -19,4 +19,20 @@ public interface IDevicePermissionService : IScopeDependency /// /// Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType); + + + /// + /// 重置分配 + /// + /// + Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request); + + + /// + /// 生成下发任务 + /// + /// + /// + /// + Task GenerateDeviceTasksAsync(Func func, List userNos); } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index 37c34957..f183213f 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -4,6 +4,7 @@ using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; +using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; using Mapster; @@ -13,10 +14,12 @@ namespace Dlhis.Basic.Device.Services.Implements; public class DeviceGroupService : IDeviceGroupService { private readonly IDbContext _dbContext; + private readonly IDevicePermissionService _devicePermissionService; - public DeviceGroupService(IDbContext dbContext) + public DeviceGroupService(IDbContext dbContext, IDevicePermissionService devicePermissionService) { _dbContext = dbContext; + _devicePermissionService = devicePermissionService; } public async Task> GetPageAsync(DeviceGroupPageRequest request) @@ -70,6 +73,7 @@ public class DeviceGroupService : IDeviceGroupService await _dbContext.DeleteAsync(deviceGroup); } + [Transactional] public async Task AssignDevicesAsync(DeviceAssignRequest request) { var group = await _dbContext.Queryable().Where(x => x.Code == request.GroupCode).FirstAsync(); @@ -77,15 +81,13 @@ public class DeviceGroupService : IDeviceGroupService await CheckNoNextGroupAsync(group.Code); - if (!request.DeviceCodes.Any()) + //下发任务 + await _devicePermissionService.GenerateDeviceTasksAsync(async () => { - //todo 删除时候判断权限是否分配 - var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); await _dbContext.DeleteAsync(relationships); - } - else - { + + request.DeviceCodes = await _dbContext.Queryable().Where(x => request.DeviceCodes.Contains(x.Code)).Select(x => x.Code).ToListAsync(); var entities = request.DeviceCodes.Select(x => new DeviceGroupRelationshipEntity { GroupCode = request.GroupCode, @@ -94,8 +96,8 @@ public class DeviceGroupService : IDeviceGroupService }).ToList(); await _dbContext.InsertAsync(entities); - } - //todo 生成下发任务 + + }, null); } public async Task> GetDevicesAsync(Guid code) @@ -165,6 +167,7 @@ public class DeviceGroupService : IDeviceGroupService Name = device.UniqueNo, PCode = relation.GroupCode }) + .Distinct() .ToList(); } } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 7c3645c2..3798ede7 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -1,7 +1,11 @@ using Dlhis.Basic.Device.Request; +using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; +using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; +using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Services; namespace Dlhis.Basic.Device.Services.Implements; @@ -15,26 +19,32 @@ public class DevicePermissionService : IDevicePermissionService _dbContext = dbContext; } + [Transactional] public async Task AssignmentAsync(List reuqests) { - foreach (var item in reuqests) + foreach (var grp in reuqests.GroupBy(x => x.UserNo)) { - var permissions = await _dbContext.Queryable() - .Where(x => x.UniqueType == item.UniqueType) - .Where(x => x.UniqueValue == item.UniqueValue) - .Where(x => x.UserNo == item.UserNo) - .ToListAsync(); + var userNo = grp.Key; + var data = grp.AsEnumerable().DistinctBy(x => x.UniqueValue).ToList(); - //todo 差异数据 - await _dbContext.Client.Deleteable(permissions).ExecuteCommandAsync(); - - await _dbContext.InsertAsync(new DevicePermissionEntity + await GenerateDeviceTasksAsync(async () => { - UserNo = item.UserNo, - UniqueType = item.UniqueType, - UniqueValue = item.UniqueValue, - }); - } + await _dbContext.Client.Deleteable() + .Where(x => x.UserNo == userNo) + .ExecuteCommandAsync(); + + var devicePermissions = data.Select(x => new DevicePermissionEntity + { + UserNo = x.UserNo, + UniqueType = x.UniqueType, + UniqueValue = x.UniqueValue, + + }).ToList(); + + await _dbContext.InsertAsync(devicePermissions); + + }, new List { userNo }); + }; } public async Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType) @@ -45,61 +55,141 @@ public class DevicePermissionService : IDevicePermissionService .Select(x => x.UniqueValue) .ToListAsync(); - return assignments; + if (uniqueType.HasValue && uniqueType == DeviceAssignmentTypeEnumType.Group) + { + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); + tops.ForEach(x => + { + RecursionGetNext(x, deviceGroups, assignments, assignments.Contains(x.Code)); + }); + } + + return assignments.Distinct().ToList(); + + void RecursionGetNext(DeviceGroupEntity current, List deviceGroups, List result, bool add) + { + var next = deviceGroups.Where(x => x.PCode == current.Code).ToList(); + foreach (var item in next) + { + if (add) assignments.Add(item.Code); + RecursionGetNext(item, deviceGroups, result, assignments.Contains(item.Code)); + } + } } - public async Task> GetAssignDeviceCodesAsync(string userNo) + + public async Task ResetAssignmentsAsync(DeviceResetAssignmentsRequest request) { + await GenerateDeviceTasksAsync(async () => + { + await _dbContext.Client.Deleteable() + .Where(x => x.UserNo == request.UserNo) + .ExecuteCommandAsync(); + + }, new List { request.UserNo }); + } + + public async Task GenerateDeviceTasksAsync(Func func, List userNos) + { + if (userNos.IsEmpty()) + { + userNos = await _dbContext.Queryable().Select(x => x.UserNo).Distinct().ToListAsync(); + } + + var beforeDic = new Dictionary>(userNos.Count); + foreach (var userNo in userNos) + { + beforeDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo)); + } + + //获取处理 + await func(); + + //获取当前的权限code + var currentDic = new Dictionary>(userNos.Count); + foreach (var userNo in userNos) + { + currentDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo)); + } + + foreach (var userNo in userNos) + { + var beforeCodes = beforeDic[userNo]; + var currentCodes = currentDic[userNo]; + + //被删除 + var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList(); + //新增 + var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList(); + + if (!deletedItems.Any() && !addItems.Any()) + { + continue; + } + + var deivces = await _dbContext.Queryable().Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).ToListAsync(); + var deviceCodes = deivces.Select(x => x.Code).ToList(); + deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList(); + addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList(); + + var userInfo = await _dbContext.Queryable() + .LeftJoin((ga, department) => department.No == ga.DepartmentNo) + .Where(ga => ga.No == userNo) + .Select(ga => new + { + ga.Code + }) + .SingleAsync(); + + //下发任务创建 + var toDeleted = deletedItems.Select(x => new DeviceTaskEntity + { + DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Delete, + UserNo = userNo, + Version = 0, + UserCode = userInfo.Code, + }).ToList(); + + var toAdd = addItems.Select(x => new DeviceTaskEntity + { + DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo, + Status = DeviceTaskStatusEnumType.Wait, + Type = DeviceTaskEnumType.Add, + UserNo = userNo, + Version = 0, + UserCode = userInfo.Code, + }).ToList(); + + var tasks = toDeleted.Concat(toAdd).ToList(); + await _dbContext.InsertAsync(tasks); + } + } + + + //************************************************ help methods ******************************************************* + + /// + /// 获取用户所有设备权限 + /// + /// + /// + private async Task> GetAssignDeviceCodesAsync(string userNo) + { + var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device); + var groupCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Group); - var deviceGroups = await _dbContext.Queryable().ToListAsync(); + var deviceCodeUnderGroups = await _dbContext.Queryable() + .Where(x => groupCodes.Contains(x.GroupCode)) + .Select(x => x.DeviceCode) + .Distinct() + .ToListAsync(); - return null; - //var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device); + deviceCodes.AddRange(deviceCodeUnderGroups); - //var permissionCodes = await _dbContext.Queryable() - // .Where(x => x.UniqueType == uniqueType) - // .Where(x => x.UniqueValue == uniqueData) - // .Select(x => x.Code) - // .ToListAsync(); - - //var menus = await GetListAsync(PlatformEnumType.PCAdmin); - - //foreach (var menu in menus) - //{ - // if (menu.Items.Any()) - // { - // var codes = RecursionHandler(menu.Items, permissionCodes); - // permissionCodes.RemoveAll(x => codes.Contains(x)); - // } - //} - - //return permissionCodes; - - //static List RecursionHandler(List menus, List innerPermissions) - //{ - // var codes = new HashSet(); - // foreach (var menu in menus) - // { - // if (menu.Items.Any()) - // { - // var innerPermissionCodes = RecursionHandler(menu.Items, innerPermissions); - // foreach (var item in innerPermissionCodes) - // { - // codes.Add(item); - // } - // } - - // if (!innerPermissions.Contains(menu.Code)) - // { - // foreach (var item in menu.Items.Select(x => x.Code)) - // { - // codes.Add(item); - // } - // } - // } - - // return codes.ToList(); - //} + return deviceCodes.Distinct().ToList(); } } diff --git a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs index 60895fd4..50f6dc86 100644 --- a/Src/Dlhis.Basic/Packs/SqlSugarPack.cs +++ b/Src/Dlhis.Basic/Packs/SqlSugarPack.cs @@ -17,6 +17,7 @@ public class SqlSugarPack : BaseAppPack public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) { #if DEBUG + //using var scope = app.ApplicationServices.CreateScope(); //var db = scope.ServiceProvider.GetService(); //var tables = App.ActiveTyps.Where(x => x.IsDefined(typeof(SugarTable), false)) diff --git a/Src/Dlhis.Sys/Dlhis.Sys.csproj b/Src/Dlhis.Sys/Dlhis.Sys.csproj index 8a58f593..77c0be37 100644 --- a/Src/Dlhis.Sys/Dlhis.Sys.csproj +++ b/Src/Dlhis.Sys/Dlhis.Sys.csproj @@ -25,8 +25,4 @@ - - - -