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 userId = currentUser.Id.Value.ToString(); var locationIds = await dbContext.SqlSugarClient.Queryable() .Where(x => !x.IsDeleted && x.UserId == userId) .Select(x => x.LocationId) .Distinct() .ToListAsync(); if (locationIds.Count == 0) { return new PartnerScopeFilter(); } var partnerKeys = await dbContext.SqlSugarClient.Queryable() .Where(x => !x.IsDeleted && locationIds.Contains(x.Id.ToString())) .Where(x => x.Partner != null && x.Partner != string.Empty) .Select(x => x.Partner!) .Distinct() .ToListAsync(); if (partnerKeys.Count == 0) { return new PartnerScopeFilter(); } var allowedIds = await dbContext.SqlSugarClient.Queryable() .Where(x => !x.IsDeleted) .Where(x => partnerKeys.Contains(x.PartnerName) || partnerKeys.Contains(x.Id)) .Select(x => x.Id) .Distinct() .ToListAsync(); 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)数据范围:管理员可见全部;非管理员仅可见其 userlocation 绑定门店对应的 Region(公司 + 组织名与 location 一致)。 /// public sealed class GroupScopeFilter { public bool IsUnrestricted { get; init; } public IReadOnlyList AllowedGroupIds { get; init; } = Array.Empty(); } /// /// 解析当前登录用户可查询的组织 Id 范围(与 Reports 按 location.Partner + location.GroupName 对齐)。 /// 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 userId = currentUser.Id.Value.ToString(); var locationRows = await dbContext.SqlSugarClient.Queryable() .InnerJoin((ul, loc) => !loc.IsDeleted && ul.LocationId == loc.Id.ToString()) .Where(ul => !ul.IsDeleted && ul.UserId == userId) .Select((ul, loc) => new { loc.Partner, loc.GroupName }) .ToListAsync(); if (locationRows.Count == 0) { return new GroupScopeFilter(); } var pairs = locationRows .Where(x => !string.IsNullOrWhiteSpace(x.GroupName)) .Select(x => (Partner: (x.Partner ?? string.Empty).Trim(), GroupName: x.GroupName!.Trim())) .Where(x => !string.IsNullOrEmpty(x.GroupName) && !string.IsNullOrEmpty(x.Partner)) .Distinct() .ToList(); if (pairs.Count == 0) { return new GroupScopeFilter(); } var partnerKeys = pairs.Select(x => x.Partner).Distinct().ToList(); var partners = await dbContext.SqlSugarClient.Queryable() .Where(x => !x.IsDeleted) .Where(x => partnerKeys.Contains(x.PartnerName) || partnerKeys.Contains(x.Id)) .Select(x => new { x.Id, x.PartnerName }) .ToListAsync(); var allowedGroupIds = new HashSet(StringComparer.Ordinal); foreach (var pair in pairs) { var partnerId = partners .FirstOrDefault(p => string.Equals(p.PartnerName, pair.Partner, StringComparison.Ordinal) || string.Equals(p.Id, pair.Partner, StringComparison.Ordinal)) ?.Id; if (string.IsNullOrEmpty(partnerId)) { continue; } var ids = await dbContext.SqlSugarClient.Queryable() .Where(g => !g.IsDeleted && g.PartnerId == partnerId && g.GroupName == pair.GroupName) .Select(g => g.Id) .ToListAsync(); foreach (var id in ids) { allowedGroupIds.Add(id); } } return new GroupScopeFilter { AllowedGroupIds = allowedGroupIds.ToList() }; } /// /// 将组织数据范围应用到 fl_group 联表查询。 /// public static ISugarQueryable ApplyGroupScope( ISugarQueryable query, GroupScopeFilter scope) { if (scope.IsUnrestricted) { return query; } var ids = scope.AllowedGroupIds; if (ids.Count == 0) { return query.Where((g, p) => false); } return query.Where((g, p) => ids.Contains(g.Id)); } }