Files
jinko.yikatong/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs
liguoyang b23c674c6e Squashed commit of the following:
commit ee0ee9b167
Merge: e78ab0b cd4888d
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Tue Mar 19 12:07:22 2024 +0800

    Merge branch 'development' of https://git.dlhis.com/liguoyang/jinko.yikatong into development

commit e78ab0baea
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Tue Mar 19 12:06:13 2024 +0800

    fix 增加权限控制

commit 793a3325f2
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Tue Mar 19 10:24:41 2024 +0800

    Squashed commit of the following:

    commit d4ab7d407a141b80024f85eeaab0062bea016051
    Author: liguoyang <Ligy.97@foxmail.com>
    Date:   Tue Mar 19 10:23:30 2024 +0800

        merge error

    commit 6204fa4ed15e0be303f7eb62307476725b8e7e36
    Merge: 7290f0b aaeacf4
    Author: liguoyang <Ligy.97@foxmail.com>
    Date:   Tue Mar 19 10:19:41 2024 +0800

        Merge branch 'feat-PlacePermission' of https://git.dlhis.com/liguoyang/jinko.yikatong into feat-PlacePermission

    commit 7290f0bd822c0e2bd957908fd58f6e99f22ad46b
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 15:05:28 2024 +0800

        fix 获取用户权限设备 优化

    commit 41b94fa3a9596a38cda1b4bf4f345ce13fe5677a
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 13:13:23 2024 +0800

        fix  第一

    commit aaeacf4ffa778eb6a6104e2349357644d038151b
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 15:05:28 2024 +0800

        fix 获取用户权限设备 优化

    commit 9e6099c52d0318cba35e7c082cb4d3085b46b0fa
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 14:00:53 2024 +0800

        fix 营业点配置权限

    commit b4565e34f48da0e5ef1d3dffa59d0ccf0d950920
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 13:13:23 2024 +0800

        fix  第一

commit 153f0ecd2a
Author: cheche <717840555@qq.com>
Date:   Tue Mar 19 09:58:31 2024 +0800

    fix 返回支付方式中文描述

commit e548c780b8
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 16:59:45 2024 +0800

    fix 优化送餐

commit fa376f7671
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 16:11:45 2024 +0800

    fix 参数结构调整

commit 1b58ca69bf
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:57:18 2024 +0800

    fix 餐次数据补充

commit e8a98c614c
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:11:56 2024 +0800

    add 补充实体变更

commit 4651adedc3
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:11:38 2024 +0800

    fix 优化查询,增加详情接口

commit ad48e37273
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:09:16 2024 +0800

    fix 枚举code过滤

commit abf2e2ed29
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:44:15 2024 +0800

    fix 获取订餐最晚时间

commit 00869111df
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:21:19 2024 +0800

    fix 检验权限修改

commit 7b83014119
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 13:42:35 2024 +0800

    fix 优化菜品保存和分页

commit fefc785b66
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:17:19 2024 +0800

    fix  修改营业点返回体

commit 3b7874a2a0
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 12:14:06 2024 +0800

    fix currentUser

commit c825531fda
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 11:03:43 2024 +0800

    fix 提交可编译版本

commit 8f430bccd3
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:48:38 2024 +0800

    fix GetDishesMenusBookingResponse修改字段

commit 69c60dc459
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:59:52 2024 +0800

    fix 增加日期返回

commit fadee3861a
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:01:31 2024 +0800

    fix GetDishesMenusBookingSetting返回体修改

commit 058b989ead
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 10:54:28 2024 +0800

    fix 获取营业点下面餐次

commit a82e7ff798
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:28:56 2024 +0800

    fix 命名空间调整

commit 9acdab4e01
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:27:46 2024 +0800

    fix 更新控制器名称

commit 3005443392
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:01:03 2024 +0800

    feat 菜品/菜单配置

commit a59404711c
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Sun Mar 17 21:26:16 2024 +0800

    feat 获取服务时间

commit ba0fe3e67f
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Sun Mar 17 20:58:11 2024 +0800

    fix 处理next空数组

commit 97fb157c9f
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 20:49:44 2024 +0800

    fix 营业点权限调整

commit 70420b9668
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 18:54:15 2024 +0800

    fix 修改IBusinessPlacePermissionsService

commit 6f2383c663
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 18:47:33 2024 +0800

    fix  api

commit 99e1c8f125
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 18:03:09 2024 +0800

    fix 实体变更

commit d327e9e3aa
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 16:06:17 2024 +0800

    fix 临时修改送餐代码

commit 4825648e41
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 15:13:53 2024 +0800

    fix 按基地分配获取值错误

commit 8ed8addbf3
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 15:10:55 2024 +0800

    fix 表增加ITenantid

commit cd4888d900
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Tue Mar 19 12:06:13 2024 +0800

    fix 增加权限控制

commit 1cd9b2467e
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Tue Mar 19 10:24:41 2024 +0800

    Squashed commit of the following:

    commit d4ab7d407a141b80024f85eeaab0062bea016051
    Author: liguoyang <Ligy.97@foxmail.com>
    Date:   Tue Mar 19 10:23:30 2024 +0800

        merge error

    commit 6204fa4ed15e0be303f7eb62307476725b8e7e36
    Merge: 7290f0b aaeacf4
    Author: liguoyang <Ligy.97@foxmail.com>
    Date:   Tue Mar 19 10:19:41 2024 +0800

        Merge branch 'feat-PlacePermission' of https://git.dlhis.com/liguoyang/jinko.yikatong into feat-PlacePermission

    commit 7290f0bd822c0e2bd957908fd58f6e99f22ad46b
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 15:05:28 2024 +0800

        fix 获取用户权限设备 优化

    commit 41b94fa3a9596a38cda1b4bf4f345ce13fe5677a
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 13:13:23 2024 +0800

        fix  第一

    commit aaeacf4ffa778eb6a6104e2349357644d038151b
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 15:05:28 2024 +0800

        fix 获取用户权限设备 优化

    commit 9e6099c52d0318cba35e7c082cb4d3085b46b0fa
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 14:00:53 2024 +0800

        fix 营业点配置权限

    commit b4565e34f48da0e5ef1d3dffa59d0ccf0d950920
    Author: cheche <717840555@qq.com>
    Date:   Tue Mar 12 13:13:23 2024 +0800

        fix  第一

commit ed25ab626a
Author: cheche <717840555@qq.com>
Date:   Tue Mar 19 09:58:31 2024 +0800

    fix 返回支付方式中文描述

commit c4b48131d2
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 16:59:45 2024 +0800

    fix 优化送餐

commit 8f26e7e84b
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 16:11:45 2024 +0800

    fix 参数结构调整

commit 8307d1d941
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:57:18 2024 +0800

    fix 餐次数据补充

commit 068a5b9507
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:11:56 2024 +0800

    add 补充实体变更

commit 805f0f83d1
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:11:38 2024 +0800

    fix 优化查询,增加详情接口

commit 9ef57fba55
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 15:09:16 2024 +0800

    fix 枚举code过滤

commit 0124fa4bc9
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:44:15 2024 +0800

    fix 获取订餐最晚时间

commit fd4a925b4a
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:21:19 2024 +0800

    fix 检验权限修改

commit e6dee2d504
Merge: 2cbf894 b3b9962
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:18:15 2024 +0800

    fix 解决dishersservice冲突

commit 2cbf894ea8
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 14:17:19 2024 +0800

    fix  修改营业点返回体

commit b3b99623e3
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 13:42:35 2024 +0800

    fix 优化菜品保存和分页

commit fcc1f134ed
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 12:14:06 2024 +0800

    fix currentUser

commit 253caf26c1
Merge: c743d2d 63ded81
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:48:41 2024 +0800

    Merge branch 'development' of https://git.dlhis.com/liguoyang/jinko.yikatong into development

commit c743d2d1c5
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:48:38 2024 +0800

    fix GetDishesMenusBookingResponse修改字段

commit 63ded819c5
Merge: 5fe4104 3b46ac2
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 11:03:45 2024 +0800

    Merge branch 'development' of https://git.dlhis.com/liguoyang/jinko.yikatong into development

commit 5fe4104ff6
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 11:03:43 2024 +0800

    fix 提交可编译版本

commit 3b46ac25a7
Merge: 11a3a0a a2eca2c
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:01:33 2024 +0800

    Merge branch 'development' of https://git.dlhis.com/liguoyang/jinko.yikatong into development

commit 11a3a0aded
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 11:01:31 2024 +0800

    fix GetDishesMenusBookingSetting返回体修改

commit a2eca2cdeb
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:59:52 2024 +0800

    fix 增加日期返回

commit 0bed0bc97b
Author: cheche <717840555@qq.com>
Date:   Mon Mar 18 10:54:28 2024 +0800

    fix 获取营业点下面餐次

commit c1d84ae1c6
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:28:56 2024 +0800

    fix 命名空间调整

commit e2cc31003f
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:27:46 2024 +0800

    fix 更新控制器名称

commit ab406adecf
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Mon Mar 18 10:01:03 2024 +0800

    feat 菜品/菜单配置

commit 6ba2d7d6a2
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Sun Mar 17 21:26:16 2024 +0800

    feat 获取服务时间

commit 6872518b65
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Sun Mar 17 20:58:11 2024 +0800

    fix 处理next空数组

commit 423d90bf3d
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 20:49:44 2024 +0800

    fix 营业点权限调整

commit 220ff2d963
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 18:54:15 2024 +0800

    fix 修改IBusinessPlacePermissionsService

commit 72f93a59a6
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 18:47:33 2024 +0800

    fix  api

commit 149660ca0f
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 18:03:09 2024 +0800

    fix 实体变更

commit 9a84143315
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 16:06:17 2024 +0800

    fix 临时修改送餐代码

commit 328ef5f42c
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 15:13:53 2024 +0800

    fix 按基地分配获取值错误

commit ea4a15c44b
Merge: a3112eb 255f4b4
Author: liguoyang <Ligy.97@foxmail.com>
Date:   Fri Mar 15 15:13:37 2024 +0800

    Merge branch 'development' of https://git.dlhis.com/liguoyang/jinko.yikatong into development

commit 255f4b4a13
Author: cheche <717840555@qq.com>
Date:   Fri Mar 15 15:10:55 2024 +0800

    fix 表增加ITenantid
2024-03-19 12:09:50 +08:00

590 lines
25 KiB
C#

using Dlhis.Basic.Device.Dtos;
using Dlhis.Basic.Device.Request;
using Dlhis.Basic.Device.Response;
using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Device.Entities;
using Dlhis.Entity.Device.Enums;
using Dlhis.Entity.Sys.Entities;
using Dlhis.Entity.Sys.Enums;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.DataAccess.Dto;
using Kurisu.Core.DataAccess.Entity;
using Kurisu.Core.User.Abstractions;
using Kurisu.SqlSugar.Services;
using SqlSugar;
namespace Dlhis.Basic.Device.Services.Implements;
public class DevicePermissionService : IDevicePermissionService
{
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
public DevicePermissionService(IDbContext dbContext, ICurrentUser currentUser)
{
_dbContext = dbContext;
_currentUser = currentUser;
}
public async Task AssignAsync(DevicePermissionSaveReuqest reuqest)
{
await GenerateDeviceTasksAsync(async () =>
{
var tenantId = reuqest.AssignType == AssignTypeEnumType.Department ? reuqest.TenantId : _currentUser.GetStringTenantId();
//删除当前匹配的基地权限
var p = await _dbContext.Queryable<DevicePermissionEntity>()
.Where(x => x.AssignType == reuqest.AssignType)
.Where(x => x.AssignValue == reuqest.AssignValue)
.Where(x => x.UniqueType == reuqest.UniqueType)
.Where(x => x.TenantId == tenantId)
.ToListAsync();
await _dbContext.DeleteReallyAsync(p);
//保存配置的权限
if (reuqest.Codes.IsPresent())
{
var devicePermissions = reuqest.Codes.Select(code => new DevicePermissionEntity
{
AssignType = reuqest.AssignType,
AssignValue = reuqest.AssignValue,
UniqueType = reuqest.UniqueType,
UniqueValue = code,
TenantId = tenantId
})
.ToList();
await _dbContext.InsertAsync(devicePermissions);
}
}, null);
}
public async Task<List<Guid>> GetAssignmentsAsync(DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue)
{
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
var result = GetAssignCodesInternal(devicePermissions, deviceGroups, uniqueType, assignType, assignValue);
return result.FirstOrDefault(x => x.Tenant == _currentUser.GetStringTenantId())?.Codes;
}
public async Task GenerateDeviceTasksAsync(Func<Task> func, List<string> userNos)
{
_dbContext.Client.QueryFilter.ClearAndBackup<ITenantId>();
try
{
//获取所有人的权限
if (userNos.IsEmpty())
userNos = await GetPermissionUserNosAsync();
var before = await GetAssignDeviceCodesInternalAsync(userNos);
_dbContext.Client.QueryFilter.Restore();
//业务处理
await func();
_dbContext.Client.QueryFilter.ClearAndBackup<ITenantId>();
//获取业务处理后所有人的权限
var nextUserNos = await GetPermissionUserNosAsync();
if (nextUserNos.Any())
userNos = userNos.Concat(nextUserNos).Distinct().ToList();
var current = await GetAssignDeviceCodesInternalAsync(userNos);
var deivces = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
var waitTasks = new List<DeviceTaskEntity>();
foreach (var userNo in userNos)
{
before.TryGetValue(userNo, out var beforeTenantDeviceCodes);
beforeTenantDeviceCodes ??= new();
current.TryGetValue(userNo, out var currentTenantDeviceCodes);
currentTenantDeviceCodes ??= new();
var tenants = beforeTenantDeviceCodes.Select(x => x.Tenant).Concat(currentTenantDeviceCodes.Select(x => x.Tenant)).Distinct().ToList();
foreach (var tenant in tenants)
{
var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
//被删除
var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList();
//新增
var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList();
if (!deletedItems.Any() && !addItems.Any())
{
continue;
}
var deviceCodes = deivces.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList();
deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList();
addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList();
//下发任务创建
var toDeleted = deletedItems.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
Status = DeviceTaskStatusEnumType.Wait,
Type = DeviceTaskEnumType.Delete,
UserNo = userNo,
Version = 0,
TenantId = tenant,
}).ToList();
var toAdd = addItems.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
Status = DeviceTaskStatusEnumType.Wait,
Type = DeviceTaskEnumType.Add,
UserNo = userNo,
Version = 0,
TenantId = tenant,
}).ToList();
waitTasks.AddRange(toDeleted.Concat(toAdd).ToList());
}
}
if (waitTasks.Any())
{
await _dbContext.InsertAsync(waitTasks);
}
}
finally
{
_dbContext.Client.QueryFilter.Restore();
}
}
public async Task<PermissionUsersInfoDto> GetPermissionUsersInfoAsync()
{
//获取所有人的权限
var userNos = await GetPermissionUserNosAsync();
var permissions = await GetAssignDeviceCodesInternalAsync(userNos);
return new PermissionUsersInfoDto
{
UserNos = userNos,
PermissionInfos = permissions
};
}
public async Task<int> ReGeneratePermissionUsersInfoAsync(PermissionUsersInfoDto beforeDto)
{
var userNos = beforeDto.UserNos;
var before = beforeDto.PermissionInfos.ToDictionary(x => x.Key, x => x.Value, StringComparer.OrdinalIgnoreCase);
//获取业务处理后所有人的权限
var nextUserNos = await GetPermissionUserNosAsync();
if (nextUserNos.Any())
userNos = userNos.Concat(nextUserNos).Distinct(StringComparer.OrdinalIgnoreCase).ToList();
var current = await GetAssignDeviceCodesInternalAsync(userNos);
var deivces = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
var waitTasks = new List<DeviceTaskEntity>();
foreach (var userNo in userNos)
{
before.TryGetValue(userNo, out var beforeTenantDeviceCodes);
beforeTenantDeviceCodes ??= new();
current.TryGetValue(userNo, out var currentTenantDeviceCodes);
currentTenantDeviceCodes ??= new();
var tenants = beforeTenantDeviceCodes.Select(x => x.Tenant).Concat(currentTenantDeviceCodes.Select(x => x.Tenant)).Distinct().ToList();
foreach (var tenant in tenants)
{
var currentCodes = currentTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
var beforeCodes = beforeTenantDeviceCodes.FirstOrDefault(x => x.Tenant == tenant)?.Codes ?? new();
//被删除
var deletedItems = beforeCodes.Where(x => !currentCodes.Contains(x)).ToList();
//新增
var addItems = currentCodes.Where(x => !beforeCodes.Contains(x)).ToList();
if (!deletedItems.Any() && !addItems.Any())
{
continue;
}
var deviceCodes = deivces.Where(x => deletedItems.Contains(x.Code) || addItems.Contains(x.Code)).Select(x => x.Code).ToList();
deletedItems = deletedItems.Where(x => deviceCodes.Contains(x)).ToList();
addItems = addItems.Where(x => deviceCodes.Contains(x)).ToList();
//下发任务创建
var toDeleted = deletedItems.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
Status = DeviceTaskStatusEnumType.Wait,
Type = DeviceTaskEnumType.Delete,
UserNo = userNo,
Version = 0,
TenantId = tenant,
}).ToList();
var toAdd = addItems.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
Status = DeviceTaskStatusEnumType.Wait,
Type = DeviceTaskEnumType.Add,
UserNo = userNo,
Version = 0,
TenantId = tenant,
}).ToList();
waitTasks.AddRange(toDeleted.Concat(toAdd).ToList());
}
}
if (waitTasks.Any())
{
await _dbContext.InsertAsync(waitTasks);
}
return waitTasks.Count;
}
public async Task GenerateDeviceTasksAsync(string userNo, DeviceTaskEnumType taskType)
{
var deviceCodes = await GetAssignDeviceCodesAsync(userNo);
if (!deviceCodes.Any())
{
return;
}
var deivces = await _dbContext.Queryable<DeviceEntity>().Where(x => deviceCodes.Contains(x.Code)).ToListAsync();
deviceCodes = deivces.Select(x => x.Code).ToList();
var userInfo = await _dbContext.Queryable<GainfoEntity>()
.LeftJoin<DepartmentEntity>((ga, department) => department.No == ga.DepartmentNo)
.Where(ga => ga.No == userNo)
.Select(ga => new
{
ga.Code
})
.SingleAsync();
var tasks = deviceCodes.Select(x => new DeviceTaskEntity
{
DeviceUniqueNo = deivces.First(item => item.Code == x).UniqueNo,
Status = DeviceTaskStatusEnumType.Wait,
Type = taskType,
UserNo = userNo,
Version = 0,
}).ToList();
await _dbContext.InsertAsync(tasks);
}
public async Task<List<string>> GetCanteenDeviceUniqueNosByUserNoAsync(string userNo)
{
var all = await GetAssignDeviceCodesAsync(userNo);
return await _dbContext.Queryable<DeviceEntity>().Where(x => x.Type == DeviceTypeEnumType.Meal)
.Where(x => all.Contains(x.Code))
.Select(x => x.UniqueNo)
.ToListAsync();
}
/// <summary>
/// 获取用户所有设备权限
/// </summary>
/// <param name="userNo"></param>
/// <returns></returns>
public async Task<List<Guid>> GetAssignDeviceCodesAsync(string userNo)
{
var devices = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
var deviceRegistries = await _dbContext.Queryable<DeviceRegistryEntity>().ToListAsync();
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.No == userNo).SingleAsync();
var gainfoGroups = await _dbContext.Queryable<GainfoGroupRelationshipEntity>().ToListAsync();
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
var deviceRelationships = await _dbContext.Queryable<DeviceGroupRelationshipEntity>().ToListAsync();
var result = GetAssignDeviceCodesInternal(gainfo, gainfoGroups, devicePermissions, deviceGroups, deviceRelationships, deviceRegistries, devices);
return result.SelectMany(x => x.Codes).ToList();
}
/// <summary>
/// 获取用户权限设备
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public async Task<Pagination<AssigmentByCodeResponse>> GetAssigmentByCodeAsync(AssigmentByCodeRequest request)
{
var lst1 = new List<Guid>();
//所有设备guid
var gds = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, request.No);
if (gds != null && gds.Count > 0)
{
lst1.AddRange(gds);
}
//所有设备组guid
var ggs = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, request.No);
//所有营业点guid
var gps = await GetAssignmentsAsync(DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, request.No);
var devices = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
var regiss = await _dbContext.Queryable<DeviceRegistryEntity>().ToListAsync();
if (ggs != null && ggs.Count > 0)
{
foreach (var gid in ggs)
{
var ds = await _dbContext.Queryable<DeviceGroupRelationshipEntity>()
.Where(x => x.GroupCode == gid)
.Select(x => x.DeviceCode)
.ToListAsync();
lst1.AddRange(ds);
}
}
if (gps != null && gps.Count > 0)
{
foreach (var placeCode in gps)
{
var nos = regiss.Where(x => x.BusinessPlaceCode == placeCode)
.Select(x => x.DeviceUniqueNo).ToList();
var dcodes = devices.Where(d => nos.Contains(d.UniqueNo))
.Select(d => d.Code).ToList();
lst1.AddRange(dcodes);
}
}
var dds = lst1.Distinct().ToList();
var lst = devices.Where(x => dds.Contains(x.Code))
.Select(x => new AssigmentByCodeResponse
{
UniqueNo = x.UniqueNo,
UniqueName = x.Supplier
}).ToList();
// 分页操作
var startIndex = (request.PageIndex - 1) * request.PageSize;
var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList();
var pagination = new Pagination<AssigmentByCodeResponse>
{
PageIndex = request.PageIndex,
PageSize = request.PageSize,
Total = lst.Count, // 使用原始列表的总数进行分页
Data = pagedData
};
return pagination;
}
//************************************************ help methods *******************************************************
/// <summary>
/// 获取当前基地有权限的用户
/// </summary>
/// <returns></returns>
private async Task<List<string>> GetPermissionUserNosAsync()
{
var permissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
//User
var userNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.User).Select(x => x.AssignValue).ToList();
//Group
var groupCode = permissions.Where(x => x.AssignType == AssignTypeEnumType.Group).Select(x => Guid.Parse(x.AssignValue)).ToList();
var userNosByGroup = await _dbContext.Queryable<GainfoGroupRelationshipEntity>()
.Where(x => groupCode.Contains(x.GroupCode))
.Select(x => x.UserNo)
.ToListAsync();
//Department
var departmentNos = permissions.Where(x => x.AssignType == AssignTypeEnumType.Department).Select(x => x.AssignValue).ToList();
var userNosByDepartment = await _dbContext.Queryable<GainfoEntity>().Where(x => departmentNos.Contains(x.DepartmentNo)).Select(x => x.No).ToListAsync();
//Tenant
var tenants = permissions.Where(x => x.AssignType == AssignTypeEnumType.Tenant).Select(x => x.AssignValue).ToList();
var userNosByWerk = await _dbContext.Queryable<GainfoEntity>().Where(x => tenants.Contains(x.Werks)).Select(x => x.No).ToListAsync();
return userNos.Concat(userNosByGroup).Concat(userNosByDepartment).Concat(userNosByWerk).Distinct().ToList();
}
private static List<UserTenantDeviceCodeDto> GetAssignCodesInternal(
List<DevicePermissionEntity> devicePermissions, List<DeviceGroupEntity> deviceGroups,
DeviceAssignmentTypeEnumType uniqueType, AssignTypeEnumType assignType, string assignValue)
{
var tenantDevicePermissions = devicePermissions
.Where(x => x.UniqueType == uniqueType)
.Where(x => x.AssignType == assignType)
.Where(x => x.AssignValue == assignValue)
.GroupBy(x => x.TenantId)
.Select(x => new UserTenantDeviceCodeDto { Tenant = x.Key, Codes = x.Select(x => x.UniqueValue).ToList() })
.ToList();
//处理获取设备分组的情况
if (uniqueType == DeviceAssignmentTypeEnumType.Group)
{
//开始递归处理
var tops = deviceGroups.Where(x => !x.PCode.HasValue).ToList();
tops.ForEach(x =>
{
RecursionGetNext(x, deviceGroups, tenantDevicePermissions, tenantDevicePermissions.SelectMany(x => x.Codes).Contains(x.Code));
});
}
return tenantDevicePermissions.GroupBy(x => x.Tenant).Select(x =>
{
var tenant = x.Key;
return new UserTenantDeviceCodeDto
{
Tenant = tenant,
Codes = x.SelectMany(item => item.Codes).ToList()
};
}).ToList();
void RecursionGetNext(DeviceGroupEntity current, List<DeviceGroupEntity> deviceGroups, List<UserTenantDeviceCodeDto> result, bool add)
{
var next = deviceGroups.Where(x => x.PCode == current.Code).ToList();
foreach (var item in next)
{
if (add)
{
result.Add(new UserTenantDeviceCodeDto { Tenant = item.TenantId, Codes = new List<Guid> { item.Code } });
}
RecursionGetNext(item, deviceGroups, result, result.SelectMany(x => x.Codes).Contains(item.Code));
}
}
}
private async Task<Dictionary<string, List<UserTenantDeviceCodeDto>>> GetAssignDeviceCodesInternalAsync(List<string> userNos)
{
var devices = await _dbContext.Queryable<DeviceEntity>().ToListAsync();
var regiss = await _dbContext.Queryable<DeviceRegistryEntity>().Where(x => !SqlFunc.IsNullOrEmpty(x.BusinessPlaceCode)).ToListAsync();
var gainfos = await _dbContext.Queryable<GainfoEntity>().Where(x => userNos.Contains(x.No)).ToListAsync();
if (!gainfos.Any())
{
return new Dictionary<string, List<UserTenantDeviceCodeDto>>();
}
var gainfoGroupRelationships = await _dbContext.Queryable<GainfoGroupRelationshipEntity>().Where(x => userNos.Contains(x.UserNo)).ToListAsync();
var devicePermissions = await _dbContext.Queryable<DevicePermissionEntity>().ToListAsync();
var deviceGroups = await _dbContext.Queryable<DeviceGroupEntity>().ToListAsync();
var deviceRelationships = await _dbContext.Queryable<DeviceGroupRelationshipEntity>().ToListAsync();
var result = new Dictionary<string, List<UserTenantDeviceCodeDto>>(gainfos.Count, StringComparer.OrdinalIgnoreCase);
foreach (var gainfo in gainfos)
{
var codes = GetAssignDeviceCodesInternal(gainfo, gainfoGroupRelationships, devicePermissions, deviceGroups, deviceRelationships, regiss, devices);
result.Add(gainfo.No, codes);
}
return result;
}
private static List<UserTenantDeviceCodeDto> GetAssignDeviceCodesInternal(
GainfoEntity gainfo,
List<GainfoGroupRelationshipEntity> gainfoGroupRelationships,
List<DevicePermissionEntity> devicePermissions,
List<DeviceGroupEntity> deviceGroups,
List<DeviceGroupRelationshipEntity> deviceGroupRelationships,
List<DeviceRegistryEntity> deviceRegistries,
List<DeviceEntity> devices
)
{
var userNo = gainfo.No;
var deviceCodes = new List<UserTenantDeviceCodeDto>();
var deviceGroupCodes = new List<UserTenantDeviceCodeDto>();
var placeCodes = new List<UserTenantDeviceCodeDto>();
//获取人员的分组,跨基地
var gainfoGroups = gainfoGroupRelationships.Where(x => x.UserNo == userNo).Select(x => x.GroupCode).ToList();
//按用户
var du = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.User, userNo);
var gu = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.User, userNo);
var pu = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.User, userNo);
deviceCodes.AddRange(du);
deviceGroupCodes.AddRange(gu);
placeCodes.AddRange(pu);
//按用户组
foreach (var groupCode in gainfoGroups)
{
var dg = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Group, groupCode.ToString());
var gg = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Group, groupCode.ToString());
var pg = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Group, groupCode.ToString());
deviceCodes.AddRange(dg);
deviceGroupCodes.AddRange(gg);
placeCodes.AddRange(pg);
}
//按部门
var gainfoFactoryDevicePermissions = devicePermissions.Where(x => x.TenantId == gainfo.Factory).ToList();
var dd = GetAssignCodesInternal(gainfoFactoryDevicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Department, gainfo.DepartmentNo);
var gd = GetAssignCodesInternal(gainfoFactoryDevicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Department, gainfo.DepartmentNo);
var pd = GetAssignCodesInternal(gainfoFactoryDevicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Department, gainfo.DepartmentNo);
deviceCodes.AddRange(dd);
deviceGroupCodes.AddRange(gd);
placeCodes.AddRange(pd);
//按厂区
var dt = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Device, AssignTypeEnumType.Tenant, gainfo.Factory);
var gt = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.Group, AssignTypeEnumType.Tenant, gainfo.Factory);
var pt = GetAssignCodesInternal(devicePermissions, deviceGroups, DeviceAssignmentTypeEnumType.BusinessPlace, AssignTypeEnumType.Tenant, gainfo.Factory);
placeCodes.AddRange(pt);
deviceCodes.AddRange(dt);
deviceGroupCodes.AddRange(gt);
var groupCodes = deviceGroupCodes.SelectMany(x => x.Codes).Distinct().ToList();
var placecodes = placeCodes.SelectMany(x => x.Codes).Distinct().ToList();
var deveiceCodesByGroup = deviceGroupRelationships.Where(x => groupCodes.Contains(x.GroupCode)).GroupBy(x => x.TenantId)
.Select(x => new UserTenantDeviceCodeDto
{
Tenant = x.Key,
Codes = x.Select(item => item.DeviceCode).Distinct().ToList()
});
var placeGroup = deviceRegistries.Where(x => placecodes.Contains((Guid)x.BusinessPlaceCode)).GroupBy(x => x.TenantId)
.Select(x => new UserTenantDeviceCodeDto
{
Tenant = x.Key,
}).ToList();
placeGroup.ForEach(t =>
{
var nos = deviceRegistries.Where(x => placecodes.Contains((Guid)x.BusinessPlaceCode))
.Where(x => x.TenantId == t.Tenant)
.Select(x => x.DeviceUniqueNo)
.ToList();
t.Codes = devices.Where(d => nos.Contains(d.UniqueNo)).Select(d => d.Code).ToList();
});
deviceCodes.AddRange(deveiceCodesByGroup);
deviceCodes.AddRange(placeGroup);
return deviceCodes.GroupBy(x => x.Tenant).Select(x => new UserTenantDeviceCodeDto
{
Tenant = x.Key,
Codes = x.SelectMany(item => item.Codes).Distinct().ToList()
}).ToList();
}
}