fix 优化任务生成
This commit is contained in:
@@ -46,16 +46,113 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
}
|
||||
|
||||
public async Task<DevicePermissionAssignResponse> AssignAsync(DevicePermissionSaveRequest request)
|
||||
{
|
||||
var currentTenantId = _currentUser.GetStringTenantId();
|
||||
var role = _currentUser.GetRole();
|
||||
var isAll = role is "admin" or "tenant-admin";
|
||||
var deviceCodes = _myDataPermissionService.GetMyDeviceCodes();
|
||||
|
||||
if (request.AssignType == AssignTypeEnumType.Tenant && request.UniqueType == DeviceAssignmentTypeEnumType.Device)
|
||||
{
|
||||
var p = await _dbContext.Queryable<DevicePermissionEntity>()
|
||||
.Where(x => x.AssignType == AssignTypeEnumType.Tenant)
|
||||
.Where(x => x.AssignValue == request.AssignValue)
|
||||
.Where(x => x.UniqueType == request.UniqueType)
|
||||
.WhereIF(request.UniqueType == DeviceAssignmentTypeEnumType.Device && !isAll, x => deviceCodes.Contains(x.UniqueValue))
|
||||
.Where(x => x.Type == request.Type)
|
||||
.Where(x => x.TenantId == currentTenantId)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
var gainfoNos = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Factory == request.AssignValue).Select(x => x.No).ToListAsync();
|
||||
|
||||
var beforeDeviceCodes = p.Select(x => x.UniqueValue).ToList();
|
||||
var presentDeviceCodes = request.Codes.IsPresent() ? request.Codes : new List<Guid>();
|
||||
|
||||
var addDeviceCodes = presentDeviceCodes.Except(beforeDeviceCodes).ToList();
|
||||
var deleteDeviceCodes = beforeDeviceCodes.Except(presentDeviceCodes).ToList();
|
||||
|
||||
await _dbContext.DeleteAsync(p);
|
||||
//保存配置的权限
|
||||
if (request.Codes.IsPresent())
|
||||
{
|
||||
var devicePermissions = request.Codes.Select(code => new DevicePermissionEntity
|
||||
{
|
||||
AssignType = request.AssignType,
|
||||
AssignValue = request.AssignValue,
|
||||
UniqueType = request.UniqueType,
|
||||
UniqueValue = code,
|
||||
Type = request.Type,
|
||||
TenantId = currentTenantId
|
||||
}).ToList();
|
||||
|
||||
await _dbContext.InsertAsync(devicePermissions);
|
||||
}
|
||||
|
||||
var allDeviceCodes = addDeviceCodes.Concat(deleteDeviceCodes).ToList();
|
||||
var devices = await _dbContext.Queryable<DeviceEntity>()
|
||||
.Where(x => allDeviceCodes.Contains(x.Code))
|
||||
.Select(x => new { x.Code, x.UniqueNo, x.Type, x.TenantId })
|
||||
.ToListAsync();
|
||||
|
||||
var tasks = new List<DeviceTaskEntity>();
|
||||
foreach (var gainfoNo in gainfoNos)
|
||||
{
|
||||
tasks.AddRange(addDeviceCodes.Select(x =>
|
||||
{
|
||||
var d = devices.First(item => item.Code == x);
|
||||
return new DeviceTaskEntity
|
||||
{
|
||||
Type = DeviceTaskEnumType.Add,
|
||||
DeviceType = d.Type,
|
||||
UserId = null,
|
||||
UserNo = gainfoNo,
|
||||
DeviceUniqueNo = d.UniqueNo,
|
||||
Status = DeviceTaskStatusEnumType.Wait,
|
||||
Version = 0,
|
||||
ResultMessage = null,
|
||||
CancellationId = 0,
|
||||
Source = DeviceTaskSourceEnumType.Manually,
|
||||
Priority = 0,
|
||||
TenantId = d.TenantId,
|
||||
};
|
||||
}).ToList());
|
||||
|
||||
tasks.AddRange(deleteDeviceCodes.Select(x =>
|
||||
{
|
||||
var d = devices.First(item => item.Code == x);
|
||||
return new DeviceTaskEntity
|
||||
{
|
||||
Type = DeviceTaskEnumType.Delete,
|
||||
DeviceType = d.Type,
|
||||
UserId = null,
|
||||
UserNo = gainfoNo,
|
||||
DeviceUniqueNo = d.UniqueNo,
|
||||
Status = DeviceTaskStatusEnumType.Wait,
|
||||
Version = 0,
|
||||
ResultMessage = null,
|
||||
CancellationId = 0,
|
||||
Source = DeviceTaskSourceEnumType.Manually,
|
||||
Priority = 0,
|
||||
TenantId = d.TenantId,
|
||||
};
|
||||
}).ToList());
|
||||
}
|
||||
|
||||
await _dbContext.InsertAsync(tasks);
|
||||
return new DevicePermissionAssignResponse
|
||||
{
|
||||
AddCount = addDeviceCodes.Count * gainfoNos.Count,
|
||||
DeleteCount = deleteDeviceCodes.Count * gainfoNos.Count
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
await CheckAssignTopDoorDeviceGroupAsync(request);
|
||||
|
||||
return await GenerateDeviceTasksAsync(async () =>
|
||||
{
|
||||
request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue;
|
||||
var currentTenantId = _currentUser.GetStringTenantId();
|
||||
var role = _currentUser.GetRole();
|
||||
var isAll = role is "admin" or "tenant-admin";
|
||||
var deviceCodes = _myDataPermissionService.GetMyDeviceCodes();
|
||||
|
||||
await _dbContext.IgnoreAsync<ITenantId>(async () =>
|
||||
{
|
||||
@@ -89,6 +186,7 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
});
|
||||
}, null);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request)
|
||||
{
|
||||
@@ -112,6 +210,9 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
var today = DateTime.Today;
|
||||
var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList();
|
||||
|
||||
var device = await _dbContext.Queryable<DeviceEntity>().Where(x => x.Code == request.UniqueValue).SingleAsync();
|
||||
device.ThrowIfNull("设备不存在");
|
||||
|
||||
//删除当前匹配的基地权限
|
||||
var p = await _dbContext.Queryable<DevicePermissionEntity>()
|
||||
.Where(x => x.UniqueType == request.UniqueType)
|
||||
@@ -121,10 +222,11 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
.Where(x => x.TenantId == currentTenantId)
|
||||
.ToListAsync();
|
||||
|
||||
var gainfoNos = p.Select(x => x.AssignValue).ToList();
|
||||
var beforeNos = p.Select(x => x.AssignValue).ToList();
|
||||
var presentNos = new List<string>();
|
||||
if (request.Values.IsPresent())
|
||||
{
|
||||
var nos = await _dbContext.Client.Queryable<GainfoEntity>()
|
||||
presentNos = await _dbContext.Client.Queryable<GainfoEntity>()
|
||||
.Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable<BusinessTripEntity>()
|
||||
.Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today))
|
||||
.Any()
|
||||
@@ -133,29 +235,14 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
.Select(gainfo => gainfo.No)
|
||||
.ToListAsync();
|
||||
|
||||
gainfoNos = gainfoNos.Concat(nos).Distinct().ToList();
|
||||
//gainfoNos = gainfoNos.Concat(nos).Distinct().ToList();
|
||||
}
|
||||
|
||||
await GenerateDeviceTasksAsync(async () =>
|
||||
{
|
||||
var adds = presentNos.Except(beforeNos);
|
||||
var deletes = beforeNos.Except(presentNos);
|
||||
|
||||
await _dbContext.DeleteAsync(p);
|
||||
|
||||
//保存配置的权限
|
||||
if (request.Values.IsPresent())
|
||||
{
|
||||
var nos = await _dbContext.Client.Queryable<GainfoEntity>()
|
||||
.Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable<BusinessTripEntity>()
|
||||
.Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today))
|
||||
.Any()
|
||||
)
|
||||
.Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo))
|
||||
.Select(gainfo => gainfo.No)
|
||||
.ToListAsync();
|
||||
|
||||
//todo 临时注释
|
||||
//(gainfoNos.Count != request.Values.Count).ThrowIfTrue("存在非当前权限访问的人员,操作禁止!");
|
||||
|
||||
var devicePermissions = nos.Select(v => new DevicePermissionEntity
|
||||
var devicePermissions = presentNos.Select(v => new DevicePermissionEntity
|
||||
{
|
||||
UniqueType = request.UniqueType,
|
||||
UniqueValue = request.UniqueValue,
|
||||
@@ -166,8 +253,71 @@ public class DevicePermissionService : IDevicePermissionService
|
||||
}).ToList();
|
||||
|
||||
await _dbContext.InsertAsync(devicePermissions);
|
||||
}
|
||||
}, gainfoNos);
|
||||
|
||||
await _dbContext.InsertAsync(adds.Select(x => new DeviceTaskEntity
|
||||
{
|
||||
Type = DeviceTaskEnumType.Add,
|
||||
DeviceType = device.Type,
|
||||
UserId = null,
|
||||
UserNo = x,
|
||||
DeviceUniqueNo = device.UniqueNo,
|
||||
Status = DeviceTaskStatusEnumType.Wait,
|
||||
Version = 0,
|
||||
ResultMessage = null,
|
||||
CancellationId = 0,
|
||||
Source = DeviceTaskSourceEnumType.Manually,
|
||||
Priority = 0,
|
||||
TenantId = device.TenantId,
|
||||
}).ToList());
|
||||
|
||||
await _dbContext.InsertAsync(deletes.Select(x => new DeviceTaskEntity
|
||||
{
|
||||
Type = DeviceTaskEnumType.Delete,
|
||||
DeviceType = device.Type,
|
||||
UserId = null,
|
||||
UserNo = x,
|
||||
DeviceUniqueNo = device.UniqueNo,
|
||||
Status = DeviceTaskStatusEnumType.Wait,
|
||||
Version = 0,
|
||||
ResultMessage = null,
|
||||
CancellationId = 0,
|
||||
Source = DeviceTaskSourceEnumType.Manually,
|
||||
Priority = 0,
|
||||
TenantId = device.TenantId,
|
||||
}).ToList());
|
||||
|
||||
// await GenerateDeviceTasksAsync(async () =>
|
||||
// {
|
||||
// await _dbContext.DeleteAsync(p);
|
||||
//
|
||||
// //保存配置的权限
|
||||
// if (request.Values.IsPresent())
|
||||
// {
|
||||
// var nos = await _dbContext.Client.Queryable<GainfoEntity>()
|
||||
// .Where(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable<BusinessTripEntity>()
|
||||
// .Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today))
|
||||
// .Any()
|
||||
// )
|
||||
// .Where(gainfo => request.Values.Contains(gainfo.Code) || request.Values.Contains(gainfo.No) || request.Values.Contains(gainfo.IdNo))
|
||||
// .Select(gainfo => gainfo.No)
|
||||
// .ToListAsync();
|
||||
//
|
||||
// //todo 临时注释
|
||||
// //(gainfoNos.Count != request.Values.Count).ThrowIfTrue("存在非当前权限访问的人员,操作禁止!");
|
||||
//
|
||||
// var devicePermissions = nos.Select(v => new DevicePermissionEntity
|
||||
// {
|
||||
// UniqueType = request.UniqueType,
|
||||
// UniqueValue = request.UniqueValue,
|
||||
// AssignType = request.AssignType,
|
||||
// AssignValue = v,
|
||||
// TenantId = currentTenantId,
|
||||
// Type = request.Type
|
||||
// }).ToList();
|
||||
//
|
||||
// await _dbContext.InsertAsync(devicePermissions);
|
||||
// }
|
||||
// }, gainfoNos);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
Reference in New Issue
Block a user