using FoodLabeling.Application.Services.DbModels; using SqlSugar; using Volo.Abp.Users; using Yi.Framework.SqlSugarCore.Abstractions; namespace FoodLabeling.Application.Helpers; /// /// 合作伙伴(公司)数据范围:管理员可见全部;非管理员仅可见其 userlocation 绑定门店所属公司。 /// public static class PartnerScopeHelper { /// /// 为 true 时不限制; /// 否则仅 中的公司 Id(fl_partner.Id)可见;无绑定时为空列表。 /// public sealed class PartnerScopeFilter { public bool IsUnrestricted { get; init; } public IReadOnlyList AllowedPartnerIds { get; init; } = Array.Empty(); } /// /// 解析当前登录用户可查询的合作伙伴 Id 范围。 /// public static async Task ResolvePartnerScopeAsync( ICurrentUser currentUser, ISqlSugarDbContext dbContext) { if (ReportsRoleHelper.IsAdminRole(currentUser)) { return new PartnerScopeFilter { IsUnrestricted = true }; } if (currentUser.Id is null) { return new PartnerScopeFilter(); } var db = dbContext.SqlSugarClient; var locationIds = await LocationScopeBindingHelper.ResolveBoundLocationIdsForUserAsync( db, currentUser.Id.Value); if (locationIds.Count == 0) { return new PartnerScopeFilter(); } var allowedIds = await LocationScopeBindingHelper.ResolvePartnerIdsFromLocationIdsAsync( db, locationIds); return new PartnerScopeFilter { AllowedPartnerIds = allowedIds }; } /// /// 将数据范围应用到合作伙伴查询(须在其它 Where 之前或之后均可,建议在 IsDeleted 之后)。 /// public static ISugarQueryable ApplyPartnerScope( ISugarQueryable query, PartnerScopeFilter scope) { if (scope.IsUnrestricted) { return query; } var ids = scope.AllowedPartnerIds; if (ids.Count == 0) { return query.Where(_ => false); } if (ids.Count == 1) { var single = ids[0]; return query.Where(x => x.Id == single); } return query.In(x => x.Id, ids.ToList()); } /// /// 组织(fl_group)数据范围(供 auth-scope 等复用);列表请优先用 。 /// public sealed class GroupScopeFilter { public bool IsUnrestricted { get; init; } public IReadOnlyList AllowedGroupIds { get; init; } = Array.Empty(); } /// /// 解析当前登录用户可查询的组织 Id 范围。 /// public static async Task ResolveGroupScopeAsync( ICurrentUser currentUser, ISqlSugarDbContext dbContext) { var scope = await GroupListScopeHelper.ResolveAsync(currentUser, dbContext); if (scope.IsUnrestricted) { return new GroupScopeFilter { IsUnrestricted = true }; } if (scope.AllowedPartnerIds.Count > 0) { var db = dbContext.SqlSugarClient; var groupIds = await LocationScopeBindingHelper.ResolveGroupIdsFromPartnerIdsAsync( db, scope.AllowedPartnerIds); return new GroupScopeFilter { AllowedGroupIds = groupIds }; } return new GroupScopeFilter { AllowedGroupIds = scope.AllowedGroupIds.ToList() }; } /// /// 将组织数据范围应用到 fl_group 单表查询。 /// public static ISugarQueryable ApplyGroupScope( ISugarQueryable query, GroupScopeFilter scope) => GroupListScopeHelper.ApplyToQuery(query, GroupListScopeHelper.FromGroupScopeFilter(scope)); /// /// 将组织数据范围应用到 fl_group 联表查询。 /// public static ISugarQueryable ApplyGroupScope( ISugarQueryable query, GroupScopeFilter scope) { if (scope.IsUnrestricted) { return query; } var ids = scope.AllowedGroupIds .Where(x => !string.IsNullOrWhiteSpace(x)) .Select(x => x.Trim()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); if (ids.Count == 0) { return query.Where((g, p) => false); } if (ids.Count == 1) { var single = ids[0]; return query.Where((g, p) => g.Id == single); } return query.In((g, p) => g.Id, ids); } }