diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 8d3fb5eb..54d4c654 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -443,6 +443,7 @@ public class DevicePermissionService : IDevicePermissionService var gainfo = await _dbContext.Queryable().Where(x => x.No == userNo).SingleAsync() ?? await _dbContext.Queryable().AS("GainfoLeave").Where(x => x.No == userNo).SingleAsync(); + var gainfoGroups = await _dbContext.Queryable().ToListAsync(); var devicePermissions = await _dbContext.Queryable().ToListAsync(); @@ -451,7 +452,25 @@ public class DevicePermissionService : IDevicePermissionService var deviceRelationships = await _dbContext.Queryable().Where(x => deviceGroupCodes.Contains(x.GroupCode)).ToListAsync(); var departments = await _dbContext.Queryable().ToListAsync(); - var result = GetAssignDeviceCodesInternal(gainfo, gainfoGroups, devicePermissions, deviceGroups, deviceRelationships, deviceRegistries, devices, departments); + + var isOutsource = await _dbContext.Queryable().AnyAsync(x => x.Code == gainfo.Code); + + var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); + + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = isOutsource, + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableFactory ?? true + }; + + var result = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroups, devicePermissions, deviceGroups, deviceRelationships, deviceRegistries, devices, departments); return result.SelectMany(x => x.Codes).ToList(); } @@ -503,7 +522,6 @@ public class DevicePermissionService : IDevicePermissionService return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList(); - void RecursionGetNextAllDepartment(string current, List data, HashSet result) { var next = data.Where(x => x.PNo == current); @@ -603,6 +621,14 @@ public class DevicePermissionService : IDevicePermissionService return new Dictionary>(); } + var outsourceCodes = await _dbContext.Queryable() + .Where(x => userNos.Contains(x.No)) + .Where(x => SqlFunc.Subqueryable().Where(p => p.Code == x.Code).Any()) + .Select(x => x.Code) + .ToListAsync(); + + var enableFactoryPermissions = await _dbContext.Queryable().ToListAsync(); + var gainfoGroupRelationships = await _dbContext.Queryable().Where(x => userNos.Contains(x.UserNo)).ToListAsync(); var devicePermissions = await _dbContext.Queryable().ToListAsync(); var deviceGroups = await _dbContext.Queryable().ToListAsync(); @@ -612,7 +638,20 @@ public class DevicePermissionService : IDevicePermissionService var result = new Dictionary>(gainfos.Count, StringComparer.OrdinalIgnoreCase); foreach (var gainfo in gainfos) { - var codes = GetAssignDeviceCodesInternal(gainfo, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); + var gainfoDto = new GainfoDto + { + Id = gainfo.Id, + No = gainfo.No, + Code = gainfo.Code, + Name = gainfo.Name, + Workplace = gainfo.Workplace, + Factory = gainfo.Factory, + DepartmentNo = gainfo.DepartmentNo, + IsOutsource = outsourceCodes.Any(x => x == gainfo.Code), + EnableFactoryPermission = enableFactoryPermissions.FirstOrDefault(x => x.TenantId == gainfo.Factory)?.EnableFactory ?? true + }; + + var codes = GetAssignDeviceCodesInternal(gainfoDto, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, registries, devices, departments); result.Add(gainfo.No, codes); } @@ -620,7 +659,7 @@ public class DevicePermissionService : IDevicePermissionService } private static List GetAssignDeviceCodesInternal( - GainfoEntity gainfo, + GainfoDto gainfo, List gainfoGroupRelationships, List devicePermissions, List deviceGroups, @@ -628,7 +667,14 @@ public class DevicePermissionService : IDevicePermissionService List deviceRegistries, List devices, List departments) { + if (gainfo.IsOutsource) + { + //外包人员只允许门禁 + devices = devices.Where(x => x.Type == DeviceTypeEnumType.Door).ToList(); + } + var userNo = gainfo.No; + var deviceDtos = new List(); var deviceGroupDtos = new List(); var businessPlaceDtos = new List(); @@ -666,12 +712,15 @@ public class DevicePermissionService : IDevicePermissionService businessPlaceDtos.AddRange(pd); //按厂区 - var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory); - var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory); - var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory); - deviceDtos.AddRange(dt); - deviceGroupDtos.AddRange(gt); - businessPlaceDtos.AddRange(pt); + if (!gainfo.IsOutsource || gainfo.EnableFactoryPermission) + { + var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory); + var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory); + var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, departments, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory); + deviceDtos.AddRange(dt); + deviceGroupDtos.AddRange(gt); + businessPlaceDtos.AddRange(pt); + } var deviceGroupCodes = deviceGroupDtos.SelectMany(x => x.Codes).Distinct().ToList(); var businessPlaceCodes = businessPlaceDtos.SelectMany(x => x.Codes).Distinct().ToList(); @@ -700,10 +749,17 @@ public class DevicePermissionService : IDevicePermissionService deviceDtos.AddRange(deviceCodesByGroup); deviceDtos.AddRange(placeGroup); - return deviceDtos.GroupBy(x => x.Tenant).Select(x => new UserTenantDeviceCodeDto + return deviceDtos.GroupBy(x => x.Tenant).Select(x => { - Tenant = x.Key, - Codes = x.SelectMany(item => item.Codes).Distinct().ToList() + var dto = new UserTenantDeviceCodeDto + { + Tenant = x.Key, + Codes = x.SelectMany(item => item.Codes).Distinct().ToList() + }; + + dto.Codes = dto.Codes.Where(p => devices.Any(item => item.Code == p)).ToList(); + + return dto; }).ToList(); } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceSettingController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceSettingController.cs new file mode 100644 index 00000000..9af5b180 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfoOutsourceSettingController.cs @@ -0,0 +1,48 @@ +using Dlhis.Basic.Device.Filters; +using Dlhis.Basic.Organization.Request; +using Dlhis.Basic.Organization.Services; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Organization.Controllers; + +/// +/// 外包人员配置 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class GainfoOutsourceSettingController : ControllerBase +{ + private readonly IGainfoOutsourceSettingService _gainfoOutSourceService; + + public GainfoOutsourceSettingController(IGainfoOutsourceSettingService gainfoOutSourceService) + { + _gainfoOutSourceService = gainfoOutSourceService; + } + + + /// + /// 保存配置 + /// + /// + [HttpPost("save")] + [AssignPermissionLimit] + [Transactional] + [DataPermission] + public async Task SaveAsync(GainfoOutsourceSettingSaveRequest request) + { + await _gainfoOutSourceService.SaveAsync(request); + } + + /// + /// 获取当前厂区配置 + /// + /// + [HttpGet("current")] + public async Task GetSettingAsync() + { + return await _gainfoOutSourceService.GetSettingAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs index 11a57286..177f1f0c 100644 --- a/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs +++ b/Src/Dlhis.Basic/Organization/Dto/GainfoDto.cs @@ -3,8 +3,16 @@ public class GainfoDto { public long Id { get; set; } + + public string No { get; set; } + public string Code { get; set; } public string Name { get; set; } public string Workplace { get; set; } public string Factory { get; set; } + + public string DepartmentNo { get; set; } + + public bool IsOutsource { get; set; } + public bool EnableFactoryPermission { get; set; } } \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoOutsourceSettingSaveRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoOutsourceSettingSaveRequest.cs new file mode 100644 index 00000000..e4de6d6a --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoOutsourceSettingSaveRequest.cs @@ -0,0 +1,8 @@ +namespace Dlhis.Basic.Organization.Request; + +public class GainfoOutsourceSettingSaveRequest +{ + public long? Id { get; set; } + + public bool EnableFactory { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoOutsourceSettingService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoOutsourceSettingService.cs new file mode 100644 index 00000000..6c933100 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoOutsourceSettingService.cs @@ -0,0 +1,10 @@ +using Dlhis.Basic.Organization.Request; + +namespace Dlhis.Basic.Organization.Services; + +public interface IGainfoOutsourceSettingService : IScopeDependency +{ + Task SaveAsync(GainfoOutsourceSettingSaveRequest request); + + Task GetSettingAsync(); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceSettingService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceSettingService.cs new file mode 100644 index 00000000..dfcee0e0 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoOutsourceSettingService.cs @@ -0,0 +1,71 @@ +using Dlhis.Basic.Device.Services; +using Dlhis.Basic.Organization.Request; +using Dlhis.Entity.Basic.Entity; +using Kurisu.AspNetCore.Authentication.Abstractions; +using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; +using Kurisu.AspNetCore.Utils.Extensions; +using SqlSugar; + +namespace Dlhis.Basic.Organization.Services.Implements; + +public class GainfoOutsourceSettingService : IGainfoOutsourceSettingService +{ + private readonly IDbContext _dbContext; + private readonly ICurrentUser _currentUser; + private readonly IDevicePermissionService _devicePermissionService; + + public GainfoOutsourceSettingService(IDbContext dbContext, ICurrentUser currentUser, IDevicePermissionService devicePermissionService) + { + _dbContext = dbContext; + _currentUser = currentUser; + _devicePermissionService = devicePermissionService; + } + + public async Task SaveAsync(GainfoOutsourceSettingSaveRequest request) + { + var userNos = await _dbContext.Queryable() + .Where(x => SqlFunc.Subqueryable().Where(p => p.Code == x.Code).Any()) + .Select(x => x.No) + .ToListAsync(); + + await _devicePermissionService.GenerateDeviceTasksAsync(async () => + { + var currentTenantId = _currentUser.GetStringTenantId(); + + (!request.Id.HasValue && await _dbContext.Queryable() + .Where(x => x.TenantId == currentTenantId) + .AnyAsync()).ThrowIfTrue("保存失败,请检查参数"); + + if (!request.Id.HasValue) + { + var entity = new OutsourceSettingEntity + { + EnableFactory = request.EnableFactory, + TenantId = currentTenantId + }; + + await _dbContext.InsertAsync(entity); + } + else + { + var entity = await _dbContext.Queryable().Where(x => x.Id == request.Id).SingleAsync(); + entity.ThrowIfNull("数据不存在,保存失败"); + + entity.EnableFactory = request.EnableFactory; + + await _dbContext.UpdateAsync(entity); + } + }, userNos); + } + + + public async Task GetSettingAsync() + { + var currentTenantId = _currentUser.GetStringTenantId(); + return await _dbContext.Queryable().Where(x => x.TenantId == currentTenantId).Select(x => new + { + x.Id, + x.EnableFactory + }).SingleAsync(); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Entity/Basic/Entity/OutsourceSettingEntity.cs b/Src/Dlhis.Entity/Basic/Entity/OutsourceSettingEntity.cs new file mode 100644 index 00000000..7a218bd0 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/OutsourceSettingEntity.cs @@ -0,0 +1,14 @@ +using Kurisu.AspNetCore.DataAccess.Entity; +using Kurisu.AspNetCore.DataAccess.SqlSugar; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +[SugarTable(TableName = "OutsourceSetting", TableDescription = "外包人员配置")] +public class OutsourceSettingEntity : SugarBaseEntity, ITenantId +{ + [SugarColumn(ColumnDataType = "bit")] + public bool EnableFactory { get; set; } + + public string TenantId { get; set; } +} \ No newline at end of file