using FoodLabeling.Application.Services.DbModels; using FoodLabeling.Domain.Entities; 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); } return query.Where(x => ids.Contains(x.Id)); } /// /// 组织(fl_group)数据范围:管理员可见全部;Company Admin 可见绑定公司下全部 Region(与 Team Member 详情 regionIds 一致); /// 其它非管理员仅可见其绑定门店反推的 Region。 /// public sealed class GroupScopeFilter { public bool IsUnrestricted { get; init; } public IReadOnlyList AllowedGroupIds { get; init; } = Array.Empty(); } /// /// 解析当前登录用户可查询的组织 Id 范围(与 Team Member 编辑回显 regionIds/groupIds 对齐)。 /// public static async Task ResolveGroupScopeAsync( ICurrentUser currentUser, ISqlSugarDbContext dbContext) { if (ReportsRoleHelper.IsAdminRole(currentUser)) { return new GroupScopeFilter { IsUnrestricted = true }; } if (currentUser.Id is null) { return new GroupScopeFilter(); } var regionIds = await LocationScopeBindingHelper.ResolveDisplayRegionIdsForCurrentUserAsync( dbContext.SqlSugarClient, currentUser); return new GroupScopeFilter { AllowedGroupIds = regionIds }; } /// /// 将组织数据范围应用到 fl_group 联表查询。 /// public static ISugarQueryable ApplyGroupScope( ISugarQueryable query, GroupScopeFilter scope) { if (scope.IsUnrestricted) { return query; } var allowedGuids = TeamMemberListScopeHelper.ParseGuidHashSet(scope.AllowedGroupIds); if (allowedGuids.Count == 0) { return query.Where((g, p) => false); } var guidList = allowedGuids.ToList(); return query.Where((g, p) => guidList.Contains(SqlFunc.ToGuid(g.Id))); } }