fix 优化任务生成
This commit is contained in:
@@ -46,16 +46,113 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DevicePermissionAssignResponse> AssignAsync(DevicePermissionSaveRequest request)
|
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);
|
await CheckAssignTopDoorDeviceGroupAsync(request);
|
||||||
|
|
||||||
return await GenerateDeviceTasksAsync(async () =>
|
return await GenerateDeviceTasksAsync(async () =>
|
||||||
{
|
{
|
||||||
request.AssignValue = request.AssignType == AssignTypeEnumType.Department ? request.TenantId + ":" + request.AssignValue : request.AssignValue;
|
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 () =>
|
await _dbContext.IgnoreAsync<ITenantId>(async () =>
|
||||||
{
|
{
|
||||||
@@ -89,6 +186,7 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
});
|
});
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request)
|
private async Task CheckAssignTopDoorDeviceGroupAsync(DevicePermissionSaveRequest request)
|
||||||
{
|
{
|
||||||
@@ -112,6 +210,9 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
var today = DateTime.Today;
|
var today = DateTime.Today;
|
||||||
var factories = _currentUser.GetUserClaim("tenants").Split(",").ToList();
|
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>()
|
var p = await _dbContext.Queryable<DevicePermissionEntity>()
|
||||||
.Where(x => x.UniqueType == request.UniqueType)
|
.Where(x => x.UniqueType == request.UniqueType)
|
||||||
@@ -121,10 +222,11 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
.Where(x => x.TenantId == currentTenantId)
|
.Where(x => x.TenantId == currentTenantId)
|
||||||
.ToListAsync();
|
.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())
|
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(gainfo => factories.Contains(gainfo.Factory) || SqlFunc.Subqueryable<BusinessTripEntity>()
|
||||||
.Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today))
|
.Where(x => factories.Contains(x.Destination) && SqlFunc.DateIsSame(x.BeginDate, today))
|
||||||
.Any()
|
.Any()
|
||||||
@@ -133,29 +235,14 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
.Select(gainfo => gainfo.No)
|
.Select(gainfo => gainfo.No)
|
||||||
.ToListAsync();
|
.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);
|
await _dbContext.DeleteAsync(p);
|
||||||
|
var devicePermissions = presentNos.Select(v => new DevicePermissionEntity
|
||||||
//保存配置的权限
|
|
||||||
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,
|
UniqueType = request.UniqueType,
|
||||||
UniqueValue = request.UniqueValue,
|
UniqueValue = request.UniqueValue,
|
||||||
@@ -166,8 +253,71 @@ public class DevicePermissionService : IDevicePermissionService
|
|||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
await _dbContext.InsertAsync(devicePermissions);
|
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 />
|
/// <inheritdoc />
|
||||||
|
|||||||
Reference in New Issue
Block a user