fix 统一逻辑处理

This commit is contained in:
2025-03-21 12:53:53 +08:00
parent f26147c9f7
commit 38fbfbf983
5 changed files with 158 additions and 126 deletions

View File

@@ -92,11 +92,15 @@ public class DevicePermissionsController : ControllerBase
return await _devicePermissionService.GetGainfoPageByDeviceAsync(request);
}
/// <summary>
/// 设备人员下发重置
/// </summary>
/// <param name="request"></param>
[HttpPost("gainfos/reset")]
[CrossTenant]
public async Task ResetGainfoPageByDeviceAsync(DeviceGainfoReset request)
{
await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code);
await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code, request.UserType);
}
[HttpGet("userPermissionCodes")]

View File

@@ -1,6 +1,12 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Basic.Enums;
namespace Dlhis.Basic.Device.Request;
public class DeviceGainfoReset
{
public Guid Code { get; set; }
[EnumDataType(typeof(GainfoUserTypeEnumType))]
public GainfoUserTypeEnumType? UserType { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.ComponentModel.DataAnnotations;
using Dlhis.Entity.Basic.Enums;
using Kurisu.AspNetCore.DataAccess.Dto;
namespace Dlhis.Basic.Device.Request;
@@ -10,4 +11,10 @@ public class DeviceWithGainfoRequest : PageDto
/// </summary>
[Required(ErrorMessage = "设备号不能为空")]
public string DeviceUniqueNo { get; set; }
/// <summary>
/// 用户类型
/// </summary>
[EnumDataType(typeof(GainfoUserTypeEnumType))]
public GainfoUserTypeEnumType? UserType { get; set; }
}

View File

@@ -1,6 +1,6 @@
using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Enums;
using Dlhis.Entity.Device.Enums;
using Kurisu.AspNetCore.DataAccess.Dto;
@@ -21,7 +21,7 @@ public interface IDevicePermissionService : IScopeDependency
/// <param name="request"></param>
/// <returns></returns>
Task<DevicePermissionAssignResponse> AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request);
//Task AssignToUniqueImportAsync(IFormFile file);
/// <summary>
@@ -43,9 +43,10 @@ public interface IDevicePermissionService : IScopeDependency
Task<Pagination<DeviceGainfoResponse>> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request);
/// <summary>
/// 重新下载设备中所有人员
/// 重新下发设备中人员
/// </summary>
/// <param name="code"></param>
/// <param name="userType"></param>
/// <returns></returns>
Task ResetGainfoPageByDeviceAsync(Guid code);
Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType);
}

View File

@@ -15,7 +15,6 @@ using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
using OfficeOpenXml;
using SqlSugar;
namespace Dlhis.Basic.Device.Services.Implements;
@@ -232,78 +231,13 @@ public class DevicePermissionService : IDevicePermissionService
public async Task<Pagination<DeviceGainfoResponse>> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request)
{
var device = await _dbContext.Queryable<DeviceEntity>()
.Where(x => x.UniqueNo == request.DeviceUniqueNo)
.SingleAsync();
device.ThrowIfNull("设备不存在");
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
//当前设备的分组
var groups = await _dbContext.Queryable<DeviceGroupRelationshipEntity>()
.Where(x => x.DeviceCode == device.Code)
.Select(x => x.GroupCode)
.ToListAsync();
var permissions = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
.ToListAsync();
var ids = new List<long>();
foreach (var permission in permissions)
{
switch (permission.AssignType)
{
case AssignTypeEnumType.User:
ids.Add(await _dbContext.Queryable<GainfoEntity>().Where(x => x.No == permission.AssignValue).Select(x => x.Id).SingleAsync());
break;
case AssignTypeEnumType.Group:
{
var code = Guid.Parse(permission.AssignValue);
ids.AddRange(await _dbContext.Queryable<GainfoGroupEntity>().Where(x => x.Code == code)
.LeftJoin<GainfoGroupRelationshipEntity>((a, b) => a.Code == b.GroupCode)
.LeftJoin<GainfoEntity>((a, b, c) => b.UserNo == c.No)
.Select((a, b, c) => c.Id).ToListAsync());
}
break;
case AssignTypeEnumType.Department:
{
//递归向上获取 assignValue = department.No
var arr = permission.AssignValue.Split(":");
var tenantId = arr.First();
var currentDepartmentNo = arr.Last();
var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments);
ids.AddRange(await _dbContext.Queryable<GainfoEntity>().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.Id).ToListAsync());
}
break;
case AssignTypeEnumType.Tenant:
{
ids.AddRange(await _dbContext.Queryable<GainfoEntity>().Where(x => x.Factory == permission.AssignValue).Select(x => x.Id).ToListAsync());
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
ids = ids.Distinct().ToList();
var factorySetting = await _factorySettingService.GetFactorySettingAsync(device.TenantId, false);
var page = await _dbContext.Queryable<GainfoEntity>()
.Where(x => ids.Contains(x.Id))
.Where(x => x.Type != GainfoUserTypeEnumType.External)
.WhereIF(factorySetting.EnableOutsourceDown == false, x => x.Type != GainfoUserTypeEnumType.Outsource)
.WhereIF(device.Type == DeviceTypeEnumType.Meal, x => x.Type != GainfoUserTypeEnumType.External && x.Type != GainfoUserTypeEnumType.Outsource)
.WhereIF(request.Search.IsPresent(), x => x.Code == request.Search || x.Name.Contains(request.Search))
.Select<DeviceGainfoResponse>()
.ToPageListAsync(request);
var query = await GetDeviceUsersQueryAsync(request.DeviceUniqueNo, request.Search, request.UserType);
var page = await query.ToPageListAsync(request);
var userNos = page.Data.Select(x => x.No).ToList();
var downStatus = await _dbContext.Queryable<DeviceTaskEntity>()
.Where(x => userNos.Contains(x.UserNo))
.Where(x => x.DeviceUniqueNo == device.UniqueNo)
.Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo)
.Where(x => x.Status == DeviceTaskStatusEnumType.Success)
.Select(x => new
{
@@ -338,61 +272,14 @@ public class DevicePermissionService : IDevicePermissionService
}
/// <inheritdoc />
public async Task ResetGainfoPageByDeviceAsync(Guid code)
public async Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType)
{
var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.Code == code).SingleAsync();
device.ThrowIfNull("设备不存在");
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
//当前设备的分组
var groups = await _dbContext.Queryable<DeviceGroupRelationshipEntity>()
.Where(x => x.DeviceCode == device.Code)
.Select(x => x.GroupCode)
.ToListAsync();
var permissions = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
.ToListAsync();
var gainfoNos = new List<string>();
foreach (var permission in permissions)
{
switch (permission.AssignType)
{
case AssignTypeEnumType.User:
gainfoNos.Add(await _dbContext.Queryable<GainfoEntity>().Where(x => x.No == permission.AssignValue).Select(x => x.No).SingleAsync());
break;
case AssignTypeEnumType.Group:
{
var groupCode = Guid.Parse(permission.AssignValue);
gainfoNos.AddRange(await _dbContext.Queryable<GainfoGroupEntity>().Where(x => x.Code == groupCode)
.LeftJoin<GainfoGroupRelationshipEntity>((a, b) => a.Code == b.GroupCode)
.LeftJoin<GainfoEntity>((a, b, c) => b.UserNo == c.No)
.Select((a, b, c) => c.No).ToListAsync());
}
break;
case AssignTypeEnumType.Department:
{
//递归向上获取 assignValue = department.No
var arr = permission.AssignValue.Split(":");
var tenantId = arr.First();
var currentDepartmentNo = arr.Last();
var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments);
gainfoNos.AddRange(await _dbContext.Queryable<GainfoEntity>().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync());
}
break;
case AssignTypeEnumType.Tenant:
{
gainfoNos.AddRange(await _dbContext.Queryable<GainfoEntity>().Where(x => x.Factory == permission.AssignValue).Select(x => x.No).ToListAsync());
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
gainfoNos = gainfoNos.Distinct().ToList();
var query = await GetDeviceUsersQueryAsync(device.UniqueNo, string.Empty, userType);
var all = await query.ToListAsync();
var gainfoNos = all.Select(x => x.No).Distinct().ToList();
await _dbContext.InsertAsync(gainfoNos.Select(x => new DeviceTaskEntity
{
@@ -407,6 +294,7 @@ public class DevicePermissionService : IDevicePermissionService
}).ToList());
}
public async Task GenerateDeviceTasksAsync(string userNo, DeviceTaskEnumType taskType, string source)
{
var deviceCodes = await GetUserDeviceCodesByNoAsync(userNo);
@@ -443,4 +331,130 @@ public class DevicePermissionService : IDevicePermissionService
var result = await _devicePermissionAnalyzeService.GetUserAssignDeviceCodesWithTypeInTenantAsync(new List<string> { no });
return result.First().Value.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList();
}
//********************************************************************help methods********************************************************************************************
/// <summary>
/// 获取设备下的人员
/// </summary>
/// <param name="deviceUniqueNo"></param>
/// <param name="search"></param>
/// <param name="userType"></param>
/// <returns></returns>
/// <exception cref="ArgumentOutOfRangeException"></exception>
private async Task<ISugarQueryable<DeviceGainfoResponse>> GetDeviceUsersQueryAsync(string deviceUniqueNo, string search, GainfoUserTypeEnumType? userType)
{
var device = await _dbContext.Queryable<DeviceEntity>()
.Where(x => x.UniqueNo == deviceUniqueNo)
.SingleAsync();
device.ThrowIfNull("设备不存在");
var departments = await _dbContext.Queryable<DepartmentEntity>().ToListAsync();
//当前设备的分组
var groups = await _dbContext.Queryable<DeviceGroupRelationshipEntity>()
.Where(x => x.DeviceCode == device.Code)
.Select(x => x.GroupCode)
.ToListAsync();
var permissions = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code)
|| (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
.ToListAsync();
var ids = new List<long>();
foreach (var permissionGroup in permissions.GroupBy(x => x.AssignType))
{
var assignType = permissionGroup.Key;
var assignValues = permissionGroup.Select(x => x.AssignValue).ToList();
switch (assignType)
{
case AssignTypeEnumType.User:
ids.AddRange(await _dbContext.Queryable<GainfoEntity>()
.Where(x => assignValues.Contains(x.No))
.Select(x => x.Id)
.ToListAsync()
);
break;
case AssignTypeEnumType.Group:
{
var codes = assignValues.Select(Guid.Parse);
ids.AddRange(await _dbContext.Queryable<GainfoGroupEntity>()
.LeftJoin<GainfoGroupRelationshipEntity>((a, b) => a.Code == b.GroupCode)
.LeftJoin<GainfoEntity>((a, b, c) => b.UserNo == c.No)
.Where(a => codes.Contains(a.Code))
.Select((a, b, c) => c.Id)
.ToListAsync()
);
}
break;
case AssignTypeEnumType.Department:
{
//递归向上获取 assignValue = tenant:department
var tenantDepartments = assignValues.Select(x =>
{
var arr = x.Split(":");
var currentDepartmentNo = arr.Last();
var departmentNos = RecursionHelper.HandlerDepartmentNextCodes(currentDepartmentNo, departments);
return new
{
tenantId = arr.First(), departmentNos
};
});
var where = LinqExpressionExtensions.False<GainfoEntity>();
foreach (var tenantDepartment in tenantDepartments)
{
where = where.Or(x => x.Factory == tenantDepartment.tenantId && tenantDepartment.departmentNos.Contains(x.DepartmentNo));
}
ids.AddRange(await _dbContext.Queryable<GainfoEntity>()
.Where(where)
.Select(x => x.Id)
.ToListAsync()
);
}
break;
case AssignTypeEnumType.Tenant:
{
ids.AddRange(await _dbContext.Queryable<GainfoEntity>()
.Where(x => assignValues.Contains(x.Factory))
.Select(x => x.Id)
.ToListAsync()
);
}
break;
default:
throw new ArgumentOutOfRangeException($"不支持的权限类型:{assignType}");
}
}
ids = ids.Distinct().ToList();
var factorySetting = await _factorySettingService.GetFactorySettingAsync(device.TenantId, false);
var userTypes = new List<GainfoUserTypeEnumType>();
if (userType.HasValue)
{
if (userType == GainfoUserTypeEnumType.Normal)
{
userTypes.Add(GainfoUserTypeEnumType.Normal);
userTypes.Add(GainfoUserTypeEnumType.SecurityWhite);
}
else
{
userTypes.Add(userType.Value);
}
}
var query = _dbContext.Queryable<GainfoEntity>()
.Where(x => ids.Contains(x.Id))
.WhereIF(userTypes.Any(), x => userTypes.Contains(x.Type))
.Where(x => x.Type != GainfoUserTypeEnumType.External)
.WhereIF(factorySetting.EnableOutsourceDown == false, x => x.Type != GainfoUserTypeEnumType.Outsource)
.WhereIF(device.Type == DeviceTypeEnumType.Meal, x => x.Type != GainfoUserTypeEnumType.External && x.Type != GainfoUserTypeEnumType.Outsource)
.WhereIF(search.IsPresent(), x => x.Code == search || x.Name.Contains(search))
.Select<DeviceGainfoResponse>();
return query;
}
}