using FoodLabeling.Application.Contracts.Dtos.TeamMember; using FoodLabeling.Domain.Shared; using SqlSugar; namespace FoodLabeling.Application.Helpers; /// /// Team Member 列表展示:适用全部 Region/Location 时返回 All Region / All Location。 /// public static class TeamMemberScopeDisplayHelper { public static List AllLocationDisplay { get; } = new() { new TeamMemberAssignedLocationDto { LocationName = FoodLabelingDisplayConsts.AllLocation } }; /// /// 列表/导出用:当成员绑定范围覆盖其 Company/Region 下全部门店时,折叠为 All Location。 /// public static async Task> FormatAssignedLocationsForListAsync( ISqlSugarClient db, Guid? roleId, IReadOnlyList partnerIds, IReadOnlyList regionIds, IReadOnlyList assigned) { var assignedIds = assigned .Select(x => x.Id) .Where(x => !string.IsNullOrWhiteSpace(x)) .Select(x => x.Trim()) .Distinct(StringComparer.Ordinal) .ToList(); if (assignedIds.Count == 0) { return assigned.ToList(); } if (partnerIds.Count > 0) { var allPartnerLocationIds = await LocationScopeBindingHelper.ResolveLocationIdsFromPartnerIdsAsync( db, partnerIds); if (allPartnerLocationIds.Count > 0 && AllScopeBindingHelper.IsFullIdSelection(assignedIds, allPartnerLocationIds)) { return AllLocationDisplay; } } return assigned.ToList(); } /// /// 列表/导出用:当 Region 覆盖 Company 下全部 Region 时,返回 All Region 展示文案。 /// public static async Task FormatRegionTextForListAsync( ISqlSugarClient db, IReadOnlyList partnerIds, IReadOnlyList regionIds, IReadOnlyDictionary regionNameMap) { if (regionIds.Count == 0) { return FoodLabelingDisplayConsts.NotAvailable; } if (partnerIds.Count > 0) { var allRegions = await LocationScopeBindingHelper.ResolveGroupIdsFromPartnerIdsAsync(db, partnerIds); if (allRegions.Count > 0 && AllScopeBindingHelper.IsFullIdSelection(regionIds, allRegions)) { return FoodLabelingDisplayConsts.AllRegion; } } return string.Join("; ", regionIds.Select(id => regionNameMap.TryGetValue(id, out var name) && !string.IsNullOrWhiteSpace(name) ? name : id)); } /// /// 编辑回显:库中存展开后的 Guid;若绑定已覆盖 Company 下全部 Region/门店,则将对应 Id 列表折叠为 ["ALL"],供前端勾选 ALL。 /// public static async Task<(List RegionIds, List LocationIds, List Assigned)> CollapseScopeIdsToAllSentinelForEditAsync( ISqlSugarClient db, IReadOnlyList partnerIds, IReadOnlyList regionIds, IReadOnlyList locationIds, IReadOnlyList assigned) { var partners = LocationScopeBindingHelper.NormalizeIds(partnerIds); var regions = LocationScopeBindingHelper.NormalizeIds(regionIds); var locations = LocationScopeBindingHelper.NormalizeIds(locationIds); var assignedList = assigned?.ToList() ?? new List(); if (partners.Count == 0) { return (regions, locations, assignedList); } var allRegionIds = await LocationScopeBindingHelper.ResolveGroupIdsFromPartnerIdsAsync(db, partners); if (allRegionIds.Count > 0 && AllScopeBindingHelper.IsFullIdSelection(regions, allRegionIds)) { regions = new List { AllScopeBindingHelper.ScopeAll }; } var allLocationIds = await LocationScopeBindingHelper.ResolveLocationIdsFromPartnerIdsAsync(db, partners); if (allLocationIds.Count > 0 && AllScopeBindingHelper.IsFullIdSelection(locations, allLocationIds)) { locations = new List { AllScopeBindingHelper.ScopeAll }; assignedList = AllLocationDisplay; } return (regions, locations, assignedList); } public static string FormatLocationTextForList(IReadOnlyList assigned) { if (assigned.Count == 0) { return FoodLabelingDisplayConsts.NotAvailable; } if (assigned.Count == 1 && string.Equals(assigned[0].LocationName, FoodLabelingDisplayConsts.AllLocation, StringComparison.Ordinal) && string.IsNullOrWhiteSpace(assigned[0].LocationCode)) { return FoodLabelingDisplayConsts.AllLocation; } return string.Join("; ", assigned.Select(a => { var code = a.LocationCode?.Trim() ?? string.Empty; var name = a.LocationName?.Trim() ?? string.Empty; if (!string.IsNullOrEmpty(code) && !string.IsNullOrEmpty(name)) { return $"{code} - {name}"; } return !string.IsNullOrEmpty(name) ? name : code; })); } }