EntityLocationScopeDisplayHelper.cs 3.2 KB
using FoodLabeling.Domain.Shared;
using SqlSugar;

namespace FoodLabeling.Application.Helpers;

/// <summary>
/// 标签类型/分类/多选项等:列表 Region/Location 列展示(适用全部时分别为 All Region / All Location)。
/// </summary>
public static class EntityLocationScopeDisplayHelper
{
    /// <summary>
    /// 根据可用范围类型与已解析的 Region/Location Id、名称,生成列表展示文案。
    /// </summary>
    /// <remarks>
    /// 有具体门店 Guid 时始终展示门店名称,不因「覆盖某 Region 下全部门店」误显示 All Location
    /// (常见于 <c>AppliedRegionType=ALL</c> + 单个 <c>locationIds</c>)。
    /// </remarks>
    public static async Task<(string Region, string Location)> BuildListDisplayAsync(
        ISqlSugarClient db,
        string? availabilityType,
        IReadOnlyList<string> regionIds,
        IReadOnlyList<string> locationIds,
        IEnumerable<string> regionNames,
        IEnumerable<string> locationNames,
        IReadOnlyList<string>? partnerIdsForContext,
        string? appliedRegionType = null)
    {
        if (AllScopeBindingHelper.IsDeclaredAll(availabilityType))
        {
            return (AllScopeBindingHelper.AllRegionsDisplay, AllScopeBindingHelper.AllLocationsDisplay);
        }

        var normRegionIds = LocationScopeBindingHelper.NormalizeIds(regionIds);
        var normLocationIds = LocationScopeBindingHelper.NormalizeIds(locationIds);
        var partnerContext = partnerIdsForContext is { Count: > 0 } ? partnerIdsForContext : null;

        string regionDisplay;
        if (AllScopeBindingHelper.IsDeclaredAll(appliedRegionType)
            || AllScopeBindingHelper.HasAllScopeSentinelSelection(normRegionIds))
        {
            regionDisplay = AllScopeBindingHelper.AllRegionsDisplay;
        }
        else
        {
            var allRegionIds = await AllScopeBindingHelper.ResolveAllRegionIdsAsync(db, partnerContext);
            var regionIsAll = normRegionIds.Count > 0
                              && allRegionIds.Count > 0
                              && AllScopeBindingHelper.IsFullIdSelection(normRegionIds, allRegionIds);
            regionDisplay = regionIsAll
                ? AllScopeBindingHelper.AllRegionsDisplay
                : JoinDistinctNames(regionNames);
        }

        // 具体门店 Guid → 显示门店名;仅 AvailabilityType=ALL 或 locationIds 含 ALL 哨兵才显示 All Location
        string locationDisplay;
        if (AllScopeBindingHelper.HasAllScopeSentinelSelection(normLocationIds))
        {
            locationDisplay = AllScopeBindingHelper.AllLocationsDisplay;
        }
        else
        {
            locationDisplay = JoinDistinctNames(locationNames);
        }

        return (regionDisplay, locationDisplay);
    }

    private static string JoinDistinctNames(IEnumerable<string> names)
    {
        var ordered = names
            .Where(x => !string.IsNullOrWhiteSpace(x))
            .Select(x => x.Trim())
            .Distinct(StringComparer.OrdinalIgnoreCase)
            .OrderBy(x => x, StringComparer.OrdinalIgnoreCase)
            .ToList();
        return ordered.Count > 0 ? string.Join(", ", ordered) : FoodLabelingDisplayConsts.NotAvailable;
    }
}