diff --git a/Src/Dlhis.Basic/Appointment/Request/AppointmentAreaAssignRequest.cs b/Src/Dlhis.Basic/Appointment/Request/AppointmentAreaAssignRequest.cs index 112cf6b8..299f9370 100644 --- a/Src/Dlhis.Basic/Appointment/Request/AppointmentAreaAssignRequest.cs +++ b/Src/Dlhis.Basic/Appointment/Request/AppointmentAreaAssignRequest.cs @@ -13,5 +13,5 @@ public class AppointmentAreaAssignRequest /// /// 设备分组 /// - public List DeviceGroupCodes { get; set; } + public IEnumerable DeviceGroupCodes { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentAreaService.cs b/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentAreaService.cs index d6778125..85ba8e54 100644 --- a/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentAreaService.cs +++ b/Src/Dlhis.Basic/Appointment/Services/Implements/AppointmentAreaService.cs @@ -51,8 +51,10 @@ public class AppointmentAreaService : IAppointmentAreaService public async Task AssignAsync(AppointmentAreaAssignRequest request) { - (await _dbContext.Queryable().Where(x => x.CustomCode == request.CustomCode).AnyAsync()) - .ThrowIfFalse("区域不存在"); + (await _dbContext.Queryable() + .Where(x => x.CustomCode == request.CustomCode) + .AnyAsync() + ).ThrowIfFalse("区域不存在"); (await _dbContext.Queryable() .Where(x => request.DeviceGroupCodes.Contains(x.Code)) diff --git a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs index 117ec9fa..61b77490 100644 --- a/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs +++ b/Src/Dlhis.Basic/DataPermissions/GetDataPermissionService.cs @@ -75,7 +75,7 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc { dict.Add(deviceGroupCodeProperty.Name, deviceGroupCodes); } - + if (deviceCodeProperty != null) { var currentDeviceCodes = userDataPermissions.Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device).Select(x => x.UniqueValue).ToList(); @@ -88,13 +88,13 @@ public class GetDataPermissionService : IGetDataPermissions, ISingletonDependenc } } -public interface IMyDataPermissionService : IScopeDependency +public interface IDataPermissionService : IScopeDependency { (bool, List) GetMyDeviceCodes(); (bool, List) GetMyDeviceGroupCodes(); } -public class MyDataPermissionService : IMyDataPermissionService +public class MyDataPermissionService : IDataPermissionService { private readonly IGetDataPermissions _getDataPermissions; private readonly ICurrentUser _currentUser; @@ -110,13 +110,14 @@ public class MyDataPermissionService : IMyDataPermissionService { var codes = new List(); - var disableFilter = _currentUser.GetRole() is "admin" or "tenant-admin"; - if (!disableFilter) + var hasAllPermission = _currentUser.GetRole() is "admin" or "tenant-admin"; + + if (!hasAllPermission) { codes = _getDataPermissions.GetData().FirstOrDefault().Value ?? new List(); } - return (!disableFilter, codes); + return (!hasAllPermission, codes); } /// diff --git a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs index ec9335ce..9ef0df5a 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/BasePermissionAnalyzeService.cs @@ -40,6 +40,7 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService await CheckWhetherAssignToTopDeviceGroupAsync(request); await CheckAssignedToTenantAsync(request); + await CheckAssignAppointmentAndBusinessTripGroupAsync(request); var dps = await _devicePermissionAnalyzeService.GetDevicePermissionsAsync(request); @@ -204,6 +205,19 @@ public abstract class BasePermissionAnalyzeService : IPermissionAnalyzeService } } + private async Task CheckAssignAppointmentAndBusinessTripGroupAsync(DevicePermissionSaveRequest request) + { + if (request.UniqueType == DeviceAssignmentTypeEnumType.Group && request.AssignType != AssignTypeEnumType.User) + { + if (await DbContext.Queryable().Where(x => request.Codes.Contains(x.Code)) + .Where(x => x.AsAppointment || x.IsBusinessTrip) + .AnyAsync()) + { + true.ThrowIfTrue("不可分配出差组和预约组"); + } + } + } + /// /// 持久化数据 /// diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs index dab25556..fd7737a7 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DeviceGroupService.cs @@ -7,6 +7,7 @@ using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; +using Dlhis.Entity.Visitor.Entity; using Dlhis.Sys.Api; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; @@ -79,6 +80,14 @@ public class DeviceGroupService : IDeviceGroupService entity.ThrowIfNull("设备分组不存在,无法更新"); entity.Editable.ThrowIfFalse("不可编辑当前分组"); + if (entity.AsAppointment && request.AsAppointment == false) + { + (await _dbContext.Queryable() + .Where(x => x.DeviceGroupCode == entity.Code) + .AnyAsync() + ).ThrowIfTrue("该访客组已被分配,无法取消"); + } + if (request.Type != entity.Type) { //检查下级分组type不一致 @@ -106,7 +115,7 @@ public class DeviceGroupService : IDeviceGroupService await CheckNoNextGroupAsync(group.Code); await CheckGroupTypeMatchAsync(request, group); - await CheckAssignToTenantAsync(group.Code, request.DeviceCodes); + await CheckAssignToTenantAsync(group, request.DeviceCodes); var relationships = await _dbContext.Queryable().Where(x => x.GroupCode == request.GroupCode).ToListAsync(); @@ -126,19 +135,46 @@ public class DeviceGroupService : IDeviceGroupService return r; } - private async Task CheckAssignToTenantAsync(Guid groupCode, List deviceCodes) + private async Task CheckAssignToTenantAsync(DeviceGroupEntity group, List deviceCodes) { if (await _dbContext.Queryable() .Where(x => x.AssignType == AssignTypeEnumType.Tenant) .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) - .Where(x => x.UniqueValue == groupCode) + .Where(x => x.UniqueValue == group.Code) .AnyAsync()) { (await _dbContext.Queryable() .Where(x => x.AssignType != AssignTypeEnumType.Tenant) .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Device) .Where(x => deviceCodes.Contains(x.UniqueValue)) - .AnyAsync()).ThrowIfTrue("无法分配设备到该设备组:设备组已分配到厂区"); + .AnyAsync()).ThrowIfTrue("无法分配设备到该设备组:设备组已分配到厂区并且存在设备已分配到其他类型"); + } + else + { + //当前组没有tenant级别 + + var currentAssignedToOthers = await _dbContext.Queryable() + .Where(x => x.AssignType != AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => x.UniqueValue == group.Code) + .AnyAsync(); + + var groupCodes = await _dbContext.Queryable() + .Where(x => deviceCodes.Contains(x.DeviceCode)) + .Select(x => x.GroupCode).Distinct() + .ToListAsync(); + + if (groupCodes.Any()) + { + if (await _dbContext.Queryable() + .Where(x => x.AssignType == AssignTypeEnumType.Tenant) + .Where(x => x.UniqueType == DeviceAssignmentTypeEnumType.Group) + .Where(x => groupCodes.Contains(x.UniqueValue)) + .AnyAsync() && currentAssignedToOthers) + { + true.ThrowIfTrue("存在设备所在的分组已分配到厂区级别,但当前分组存在其他级别的分配"); + } + } } } @@ -212,7 +248,7 @@ public class DeviceGroupService : IDeviceGroupService return p.OriginalCodes.IsPresent() && p.OriginalCodes.First() != groupCode; }).ToList(); } - + var myDeviceCodes = permissions.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).ToList(); var currentDevicesToDelete = devicesToDelete.Where(p => devicesToDelete.Select(x => x.Code).Except(myDeviceCodes).Contains(p.Code)).ToList(); diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs index d5317e74..4bb29219 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionAnalyzeService.cs @@ -21,32 +21,39 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; - private readonly IMyDataPermissionService _myDataPermissionService; + private readonly IDataPermissionService _myDataPermissionService; public DevicePermissionAnalyzeService(IDbContext dbContext, ICurrentUser currentUser, - IMyDataPermissionService myDataPermissionService) + IDataPermissionService myDataPermissionService) { _dbContext = dbContext; _currentUser = currentUser; _myDataPermissionService = myDataPermissionService; } - public async Task> GetDevicePermissionsAsync(DevicePermissionSaveRequest request) { var currentTenantId = await GetCurrentFactoryAsync(request); - (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); - (bool enableDeviceGroupFilter, List deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes(); - return await _dbContext.Queryable().Where(x => x.AssignType == request.AssignType - && x.AssignValue == request.GetActualAssignValue() - && x.UniqueType == request.UniqueType - && x.Type == request.Type - && x.TenantId == currentTenantId) - .WhereIF(enableDeviceFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue)) - .WhereIF(enableDeviceGroupFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Group, x => deviceGroupCodes.Contains(x.UniqueValue)) - .ToListAsync(); + var setting = _dbContext.GetQueryableSetting(); + + var query = _dbContext.Queryable().Where(x => x.AssignType == request.AssignType + && x.AssignValue == request.GetActualAssignValue() + && x.UniqueType == request.UniqueType + && x.Type == request.Type + && x.TenantId == currentTenantId); + if (setting.GetEnableDataPermission()) + { + (bool enableDeviceFilter, List deviceCodes) = _myDataPermissionService.GetMyDeviceCodes(); + (bool enableDeviceGroupFilter, List deviceGroupCodes) = _myDataPermissionService.GetMyDeviceGroupCodes(); + + query = query + .WhereIF(enableDeviceFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Device, x => deviceCodes.Contains(x.UniqueValue)) + .WhereIF(enableDeviceGroupFilter && request.UniqueType == DeviceAssignmentTypeEnumType.Group, x => deviceGroupCodes.Contains(x.UniqueValue)); + } + + return await query.ToListAsync(); } private async Task GetCurrentFactoryAsync(DevicePermissionSaveRequest request) @@ -179,7 +186,8 @@ public class DevicePermissionAnalyzeService : IDevicePermissionAnalyzeService if (ignoreAssignType.HasValue) internalIgnoreAssignTypes.Add(ignoreAssignType.Value); - if (gainfo.Type == GainfoUserTypeEnumType.Outsource && (enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true) == false) + if (gainfo.Type == GainfoUserTypeEnumType.External || + (gainfo.Type == GainfoUserTypeEnumType.Outsource && (enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableOutsourceDown ?? true) == false)) { internalIgnoreAssignTypes.Add(AssignTypeEnumType.Tenant); } diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index caf30660..ae034a9a 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -549,7 +549,7 @@ public class OrderService : IOrderService var current = await _dbContext.Queryable() .Where(x => x.No == no && x.IdNo == idNo) - .Select(x => new { x.Start, x.End }) + .Select(x => new { x.Name, x.Start, x.End }) .SingleAsync(); (now >= current.Start && now <= current.End).ThrowIfFalse("餐券已过期"); @@ -587,6 +587,7 @@ public class OrderService : IOrderService //写入记录 var balanceRecord = order.Adapt(); + balanceRecord.Remark = $"({no})"+current.Name; await _dbContext.InsertAsync(balanceRecord); }, 5); }); diff --git a/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs b/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs index babfb4db..7aa96cba 100644 --- a/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs +++ b/Src/Dlhis.Entity/Device/Entities/DeviceGroupEntity.cs @@ -2,6 +2,7 @@ using Dlhis.Entity.Device.Enums; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar; +using Mapster; using SqlSugar; using SqlSugar.DbConvert; @@ -29,6 +30,7 @@ public class DeviceGroupEntity : SugarBaseEntity, ITenantId, ISoftDeleted /// 设备组code /// [DeviceGroupCode] + [AdaptIgnore(MemberSide.Destination)] [SugarColumn(ColumnDescription = "设备组code")] public Guid Code { get; set; } diff --git a/Src/Dlhis.Entity/Dlhis.Entity.csproj b/Src/Dlhis.Entity/Dlhis.Entity.csproj index c3f003b9..730fa9df 100644 --- a/Src/Dlhis.Entity/Dlhis.Entity.csproj +++ b/Src/Dlhis.Entity/Dlhis.Entity.csproj @@ -11,7 +11,7 @@ - +