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