fix 优化任务生成

This commit is contained in:
2024-12-03 10:57:35 +08:00
parent 0fee83ba17
commit 3c39f39f4b

View File

@@ -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 />