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 入参收窄); /// 非管理员仅统计 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 userId = currentUser.Id.Value.ToString(); var boundIds = LocationScopeBindingHelper.NormalizeIds( await db.Queryable() .Where(x => !x.IsDeleted && x.UserId == userId) .Select(x => x.LocationId) .Distinct() .ToListAsync()); if (boundIds.Count == 0) { return new List(); } if (filterIds is null) { return boundIds; } if (filterIds.Count == 0) { return new List(); } var boundSet = new HashSet(boundIds, StringComparer.OrdinalIgnoreCase); return filterIds.Where(id => boundSet.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(); } }