diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 9bdfa3d0..4ad01fd4 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -87,28 +87,22 @@ public class DevicePermissionService : IDevicePermissionService userNos = await GetPermissionUserNosAsync(); } - var beforeDic = new Dictionary>(userNos.Count); - foreach (var userNo in userNos) - { - beforeDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo)); - } + var beforeDic = await GetAssignDeviceCodesAsync(userNos); //获取处理 await func(); //获取当前的权限code - var currentDic = new Dictionary>(userNos.Count); + var nextUserNos = await GetPermissionUserNosAsync(); if (nextUserNos.Any()) { userNos = nextUserNos; } - foreach (var userNo in userNos) - { - currentDic.TryAdd(userNo, await GetAssignDeviceCodesAsync(userNo)); - } + var currentDic = await GetAssignDeviceCodesAsync(userNos); + var deivces = await _dbContext.Queryable().ToListAsync(); foreach (var userNo in userNos) { beforeDic.TryGetValue(userNo, out var beforeCodes); @@ -127,8 +121,7 @@ public class DevicePermissionService : IDevicePermissionService 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(); + var deviceCodes = deivces.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList(); deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList(); addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList(); @@ -244,6 +237,91 @@ public class DevicePermissionService : IDevicePermissionService return deviceCodes.Distinct().ToList(); } + private async Task>> GetAssignDeviceCodesAsync(List userNos) + { + var gainfos = await _dbContext.Queryable().Where(x => userNos.Contains(x.No)).ToListAsync(); + if (!gainfos.Any()) + { + return new Dictionary>(); + } + var gainfoGroupRelationships = await _dbContext.Queryable().ToListAsync(); + var devicePermissions = await _dbContext.Queryable().ToListAsync(); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + + var result = new Dictionary>(); + + foreach (var gainfo in gainfos) + { + var userNo = gainfo.No; + + var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).ToList(); + + var deviceCodes = new List(); + var deviceGroupCodes = new List(); + + var du = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo); + var gu = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo); + deviceCodes.AddRange(du); + deviceGroupCodes.AddRange(gu); + + foreach (var group in gainfoGroups) + { + var dg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, group.ToString()); + var gg = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, group.ToString()); + deviceCodes.AddRange(dg); + deviceGroupCodes.AddRange(gg); + } + + var dd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo); + var gd = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo); + deviceCodes.AddRange(dd); + deviceGroupCodes.AddRange(gd); + + var dt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Werks); + var gt = GetAssignmentsInternal(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Werks); + deviceCodes.AddRange(du); + deviceGroupCodes.AddRange(gu); + + var deveiceCodesByGroup = await _dbContext.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).Select(x => x.DeviceCode).ToListAsync(); + deviceCodes.AddRange(deveiceCodesByGroup); + + result.Add(userNo, deviceCodes.Distinct().ToList()); + } + + return result; + + + List GetAssignmentsInternal(DeviceAssignmentTypeEnumType uniqueTypeInternal, AssignTypeEnumType assignTypeInternal, string assignValueInternal) + { + var devicePermissionsInternal = devicePermissions.Where(x => x.UniqueType == uniqueTypeInternal) + .Where(x => x.AssignType == assignTypeInternal) + .Where(x => x.AssignValue == assignValueInternal) + .Select(x => x.UniqueValue) + .ToList(); + + if (uniqueTypeInternal == DeviceAssignmentTypeEnumType.Group) + { + var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList(); + tops.ForEach(x => + { + RecursionGetNext(x, deviceGroups, devicePermissionsInternal, devicePermissionsInternal.Contains(x.Code)); + }); + } + + return devicePermissionsInternal.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) result.Add(item.Code); + RecursionGetNext(item, deviceGroups, result, result.Contains(item.Code)); + } + } + } + } + //************************************************ help methods ******************************************************* diff --git a/Src/Dlhis.ScheduledTask/Packs/HangfirePack.cs b/Src/Dlhis.ScheduledTask/Packs/HangfirePack.cs index 81ee379c..32fed15f 100644 --- a/Src/Dlhis.ScheduledTask/Packs/HangfirePack.cs +++ b/Src/Dlhis.ScheduledTask/Packs/HangfirePack.cs @@ -1,5 +1,4 @@ -using Dlhis.ScheduledTask.SyncSapInfo.Job; -using Hangfire; +using Hangfire; using Hangfire.Dashboard.BasicAuthorization; using Hangfire.MySql; using Kurisu.AspNetCore.Startup; @@ -9,7 +8,7 @@ namespace Dlhis.ScheduledTask.Packs; public class HangfirePack : BaseAppPack { - public override int Order => 999; + public override int Order => 990; public override bool IsBeforeUseRouting { get; } @@ -58,13 +57,5 @@ public class HangfirePack : BaseAppPack }); app.UseHangfireDashboard(); - - #region 周期任务 - //0:00 - RecurringJob.AddOrUpdate("SysSap", s => s.SyncOrgInfo(), "30 * * * * ?", new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Local - }); - #endregion } } diff --git a/Src/Dlhis.ScheduledTask/Packs/JobPack.cs b/Src/Dlhis.ScheduledTask/Packs/JobPack.cs new file mode 100644 index 00000000..2cd1b3a8 --- /dev/null +++ b/Src/Dlhis.ScheduledTask/Packs/JobPack.cs @@ -0,0 +1,28 @@ +using Dlhis.ScheduledTask.SyncSapInfo.Job; +using Hangfire; +using Kurisu.AspNetCore.Startup; + +namespace Dlhis.ScheduledTask.Packs; + +public class JobPack : BaseAppPack +{ + public override int Order => 999; + public override bool IsBeforeUseRouting { get; } + + + public override void Invoke(IServiceProvider serviceProvider) + { + +#if DEBUG + RecurringJob.AddOrUpdate("SyncSap", s => s.SyncOrgInfo(), "30 * * * * ?", new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Local + }); +#else + RecurringJob.AddOrUpdate("SyncSap", s => s.SyncOrgInfo(), "0 0 2 * * ?", new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Local + }); +#endif + } +}