diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
index d4028282..d7b1a1c7 100644
--- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
+++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs
@@ -92,11 +92,15 @@ public class DevicePermissionsController : ControllerBase
return await _devicePermissionService.GetGainfoPageByDeviceAsync(request);
}
+ ///
+ /// 设备人员下发重置
+ ///
+ ///
[HttpPost("gainfos/reset")]
[CrossTenant]
public async Task ResetGainfoPageByDeviceAsync(DeviceGainfoReset request)
{
- await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code);
+ await _devicePermissionService.ResetGainfoPageByDeviceAsync(request.Code, request.UserType);
}
[HttpGet("userPermissionCodes")]
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs b/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs
index a74606f0..c7614ba6 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceGainfoReset.cs
@@ -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; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs
index 2836c0de..ef4dc68f 100644
--- a/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs
+++ b/Src/Dlhis.Basic/Device/Request/DeviceWithGainfoRequest.cs
@@ -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
///
[Required(ErrorMessage = "设备号不能为空")]
public string DeviceUniqueNo { get; set; }
+
+ ///
+ /// 用户类型
+ ///
+ [EnumDataType(typeof(GainfoUserTypeEnumType))]
+ public GainfoUserTypeEnumType? UserType { get; set; }
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
index 921c50cf..24da92c2 100644
--- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs
@@ -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
///
///
Task AssignToUniqueAsync(DevicePermissionsAssignToDeviceRequest request);
-
+
//Task AssignToUniqueImportAsync(IFormFile file);
///
@@ -43,9 +43,10 @@ public interface IDevicePermissionService : IScopeDependency
Task> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request);
///
- /// 重新下载设备中所有人员
+ /// 重新下发设备中人员
///
///
+ ///
///
- Task ResetGainfoPageByDeviceAsync(Guid code);
+ Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType);
}
\ No newline at end of file
diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
index 8174cc14..70e08d34 100644
--- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
+++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
@@ -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> GetGainfoPageByDeviceAsync(DeviceWithGainfoRequest request)
{
- var device = await _dbContext.Queryable()
- .Where(x => x.UniqueNo == request.DeviceUniqueNo)
- .SingleAsync();
- device.ThrowIfNull("设备不存在");
-
- var departments = await _dbContext.Queryable().ToListAsync();
-
- //当前设备的分组
- var groups = await _dbContext.Queryable()
- .Where(x => x.DeviceCode == device.Code)
- .Select(x => x.GroupCode)
- .ToListAsync();
-
- var permissions = await _dbContext.Queryable()
- .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
- .ToListAsync();
-
- var ids = new List();
- foreach (var permission in permissions)
- {
- switch (permission.AssignType)
- {
- case AssignTypeEnumType.User:
- ids.Add(await _dbContext.Queryable().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().Where(x => x.Code == code)
- .LeftJoin((a, b) => a.Code == b.GroupCode)
- .LeftJoin((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().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.Id).ToListAsync());
- }
- break;
- case AssignTypeEnumType.Tenant:
- {
- ids.AddRange(await _dbContext.Queryable().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()
- .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()
- .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()
.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
}
///
- public async Task ResetGainfoPageByDeviceAsync(Guid code)
+ public async Task ResetGainfoPageByDeviceAsync(Guid code, GainfoUserTypeEnumType? userType)
{
var device = await _dbContext.Queryable().Where(x => x.Code == code).SingleAsync();
device.ThrowIfNull("设备不存在");
- var departments = await _dbContext.Queryable().ToListAsync();
- //当前设备的分组
- var groups = await _dbContext.Queryable()
- .Where(x => x.DeviceCode == device.Code)
- .Select(x => x.GroupCode)
- .ToListAsync();
-
- var permissions = await _dbContext.Queryable()
- .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code) || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
- .ToListAsync();
-
- var gainfoNos = new List();
- foreach (var permission in permissions)
- {
- switch (permission.AssignType)
- {
- case AssignTypeEnumType.User:
- gainfoNos.Add(await _dbContext.Queryable().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().Where(x => x.Code == groupCode)
- .LeftJoin((a, b) => a.Code == b.GroupCode)
- .LeftJoin((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().Where(x => x.Factory == tenantId && departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync());
- }
- break;
- case AssignTypeEnumType.Tenant:
- {
- gainfoNos.AddRange(await _dbContext.Queryable().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 { no });
return result.First().Value.SelectMany(x => x.AssignTypes.SelectMany(p => p.Codes)).Distinct().ToList();
}
+
+
+ //********************************************************************help methods********************************************************************************************
+
+ ///
+ /// 获取设备下的人员
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private async Task> GetDeviceUsersQueryAsync(string deviceUniqueNo, string search, GainfoUserTypeEnumType? userType)
+ {
+ var device = await _dbContext.Queryable()
+ .Where(x => x.UniqueNo == deviceUniqueNo)
+ .SingleAsync();
+ device.ThrowIfNull("设备不存在");
+
+ var departments = await _dbContext.Queryable().ToListAsync();
+
+ //当前设备的分组
+ var groups = await _dbContext.Queryable()
+ .Where(x => x.DeviceCode == device.Code)
+ .Select(x => x.GroupCode)
+ .ToListAsync();
+
+ var permissions = await _dbContext.Queryable()
+ .Where(x => (x.UniqueType == DeviceAssignmentTypeEnumType.Device && x.UniqueValue == device.Code)
+ || (x.UniqueType == DeviceAssignmentTypeEnumType.Group && groups.Contains(x.UniqueValue)))
+ .ToListAsync();
+
+ var ids = new List();
+ 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()
+ .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()
+ .LeftJoin((a, b) => a.Code == b.GroupCode)
+ .LeftJoin((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();
+ foreach (var tenantDepartment in tenantDepartments)
+ {
+ where = where.Or(x => x.Factory == tenantDepartment.tenantId && tenantDepartment.departmentNos.Contains(x.DepartmentNo));
+ }
+
+ ids.AddRange(await _dbContext.Queryable()
+ .Where(where)
+ .Select(x => x.Id)
+ .ToListAsync()
+ );
+ }
+ break;
+ case AssignTypeEnumType.Tenant:
+ {
+ ids.AddRange(await _dbContext.Queryable()
+ .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();
+ if (userType.HasValue)
+ {
+ if (userType == GainfoUserTypeEnumType.Normal)
+ {
+ userTypes.Add(GainfoUserTypeEnumType.Normal);
+ userTypes.Add(GainfoUserTypeEnumType.SecurityWhite);
+ }
+ else
+ {
+ userTypes.Add(userType.Value);
+ }
+ }
+
+ var query = _dbContext.Queryable()
+ .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();
+
+ return query;
+ }
}
\ No newline at end of file