using FoodLabeling.Application.Services.DbModels; using FoodLabeling.Domain.Entities; using SqlSugar; using Volo.Abp.Users; using Yi.Framework.SqlSugarCore.Abstractions; namespace FoodLabeling.Application.Helpers; /// /// Reports 门店数据范围:管理员可查全部(可按 Company/Region/Location 入参收窄); /// Company Admin 为绑定 Company 下全部门店;其它非管理员为 userlocation 绑定门店。 /// public static class ReportsLocationScopeHelper { /// /// 解析报表统计适用的门店 Id 列表。 /// /// 返回 null:不限制门店(管理员且未传 Company/Region/Location 筛选); /// 返回空列表:无可访问门店或筛选后无交集; /// 返回非空列表:仅统计这些 fl_label_print_task.LocationId /// /// public static async Task?> ResolveReportLocationIdsAsync( ICurrentUser currentUser, ISqlSugarClient db, string? partnerId, string? groupId, string? locationId) { var filterIds = await ResolveFilterLocationIdsFromQueryAsync(db, partnerId, groupId, locationId); if (ReportsRoleHelper.IsAdminRole(currentUser)) { return filterIds; } if (currentUser.Id is null) { return new List(); } var accessibleIds = await LocationScopeBindingHelper.ResolveAppAccessibleLocationIdsForUserAsync( db, currentUser.Id.Value, currentUser); if (accessibleIds.Count == 0) { return new List(); } if (filterIds is null) { return accessibleIds; } if (filterIds.Count == 0) { return new List(); } var accessibleSet = new HashSet(accessibleIds, StringComparer.OrdinalIgnoreCase); return filterIds.Where(id => accessibleSet.Contains(id)).ToList(); } /// /// 按入参 Company / Region / Location 解析门店 Id;均未传时返回 null(不限制)。 /// private static async Task?> ResolveFilterLocationIdsFromQueryAsync( ISqlSugarClient db, string? partnerId, string? groupId, string? locationId) { var locId = locationId?.Trim(); if (!string.IsNullOrWhiteSpace(locId)) { return new List { locId }; } var gid = groupId?.Trim(); var pid = partnerId?.Trim(); if (string.IsNullOrWhiteSpace(pid) && string.IsNullOrWhiteSpace(gid)) { return null; } var q = db.Queryable().Where(x => !x.IsDeleted); if (!string.IsNullOrWhiteSpace(gid)) { var g = await db.Queryable() .FirstAsync(x => !x.IsDeleted && x.Id == gid); if (g is null) { return new List(); } var gName = g.GroupName?.Trim() ?? string.Empty; var partner = await db.Queryable() .FirstAsync(x => !x.IsDeleted && x.Id == g.PartnerId); var pName = partner?.PartnerName?.Trim() ?? string.Empty; q = q.Where(x => x.GroupName == gName && x.Partner == pName); } else if (!string.IsNullOrWhiteSpace(pid)) { var partner = await db.Queryable() .FirstAsync(x => !x.IsDeleted && x.Id == pid); if (partner is null) { return new List(); } var pName = partner.PartnerName?.Trim() ?? string.Empty; q = q.Where(x => x.Partner == pName); } return await q.Select(x => SqlFunc.ToString(x.Id)).ToListAsync(); } }