feat 外包人员下发配置

This commit is contained in:
2024-07-22 17:24:14 +08:00
parent d27aa2e007
commit 9cd31df6fc
7 changed files with 228 additions and 13 deletions

View File

@@ -443,6 +443,7 @@ public class DevicePermissionService : IDevicePermissionService
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.No == userNo).SingleAsync()
?? await _dbContext.Queryable<GainfoEntity>().AS("GainfoLeave").Where(x => x.No == userNo).SingleAsync();
var gainfoGroups = await _dbContext.Queryable<GainfoGroupRelationshipEntity>().ToListAsync();
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
@@ -451,7 +452,25 @@ public class DevicePermissionService : IDevicePermissionService
var deviceRelationships = await _dbContext.Queryable<DeviceGroupRelationshipEntity>().Where(x => deviceGroupCodes.Contains(x.GroupCode)).ToListAsync();
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
var result = GetAssignDeviceCodesInternal(gainfo, gainfoGroups, devicePermissions, deviceGroups, deviceRelationships, deviceRegistries, devices, departments);
var isOutsource = await _dbContext.Queryable<OutsourceEntity>().AnyAsync(x => x.Code == gainfo.Code);
var enableFactoryPermissions = await _dbContext.Queryable<OutsourceSettingEntity>().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<DepartmentEntity> data, HashSet<string> result)
{
var next = data.Where(x => x.PNo == current);
@@ -603,6 +621,14 @@ public class DevicePermissionService : IDevicePermissionService
return new Dictionary<string, List<UserTenantDeviceCodeDto>>();
}
var outsourceCodes = await _dbContext.Queryable<GainfoEntity>()
.Where(x => userNos.Contains(x.No))
.Where(x => SqlFunc.Subqueryable<OutsourceEntity>().Where(p => p.Code == x.Code).Any())
.Select(x => x.Code)
.ToListAsync();
var enableFactoryPermissions = await _dbContext.Queryable<OutsourceSettingEntity>().ToListAsync();
var gainfoGroupRelationships = await _dbContext.Queryable<GainfoGroupRelationshipEntity>().Where(x => userNos.Contains(x.UserNo)).ToListAsync();
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
@@ -612,7 +638,20 @@ public class DevicePermissionService : IDevicePermissionService
var result = new Dictionary<string, List<UserTenantDeviceCodeDto>>(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<UserTenantDeviceCodeDto> GetAssignDeviceCodesInternal(
GainfoEntity gainfo,
GainfoDto gainfo,
List<GainfoGroupRelationshipEntity> gainfoGroupRelationships,
List<DevicePermissionEntity> devicePermissions,
List<DeviceGroupEntity> deviceGroups,
@@ -628,7 +667,14 @@ public class DevicePermissionService : IDevicePermissionService
List<DeviceRegistryEntity> deviceRegistries,
List<DeviceEntity> devices, List<DepartmentEntity> departments)
{
if (gainfo.IsOutsource)
{
//外包人员只允许门禁
devices = devices.Where(x => x.Type == DeviceTypeEnumType.Door).ToList();
}
var userNo = gainfo.No;
var deviceDtos = new List<UserTenantDeviceCodeDto>();
var deviceGroupDtos = new List<UserTenantDeviceCodeDto>();
var businessPlaceDtos = new List<UserTenantDeviceCodeDto>();
@@ -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();
}
}

View File

@@ -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;
/// <summary>
/// 外包人员配置
/// </summary>
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class GainfoOutsourceSettingController : ControllerBase
{
private readonly IGainfoOutsourceSettingService _gainfoOutSourceService;
public GainfoOutsourceSettingController(IGainfoOutsourceSettingService gainfoOutSourceService)
{
_gainfoOutSourceService = gainfoOutSourceService;
}
/// <summary>
/// 保存配置
/// </summary>
/// <param name="request"></param>
[HttpPost("save")]
[AssignPermissionLimit]
[Transactional]
[DataPermission]
public async Task SaveAsync(GainfoOutsourceSettingSaveRequest request)
{
await _gainfoOutSourceService.SaveAsync(request);
}
/// <summary>
/// 获取当前厂区配置
/// </summary>
/// <returns></returns>
[HttpGet("current")]
public async Task<object> GetSettingAsync()
{
return await _gainfoOutSourceService.GetSettingAsync();
}
}

View File

@@ -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; }
}

View File

@@ -0,0 +1,8 @@
namespace Dlhis.Basic.Organization.Request;
public class GainfoOutsourceSettingSaveRequest
{
public long? Id { get; set; }
public bool EnableFactory { get; set; }
}

View File

@@ -0,0 +1,10 @@
using Dlhis.Basic.Organization.Request;
namespace Dlhis.Basic.Organization.Services;
public interface IGainfoOutsourceSettingService : IScopeDependency
{
Task SaveAsync(GainfoOutsourceSettingSaveRequest request);
Task<object> GetSettingAsync();
}

View File

@@ -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<GainfoEntity>()
.Where(x => SqlFunc.Subqueryable<OutsourceEntity>().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<OutsourceSettingEntity>()
.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<OutsourceSettingEntity>().Where(x => x.Id == request.Id).SingleAsync();
entity.ThrowIfNull("数据不存在,保存失败");
entity.EnableFactory = request.EnableFactory;
await _dbContext.UpdateAsync(entity);
}
}, userNos);
}
public async Task<object> GetSettingAsync()
{
var currentTenantId = _currentUser.GetStringTenantId();
return await _dbContext.Queryable<OutsourceSettingEntity>().Where(x => x.TenantId == currentTenantId).Select(x => new
{
x.Id,
x.EnableFactory
}).SingleAsync();
}
}