EntityLocationScopeDisplayHelper.cs 2.81 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>
    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)
    {
        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;

        var allRegionIds = await AllScopeBindingHelper.ResolveAllRegionIdsAsync(db, partnerContext);
        var regionIsAll = normRegionIds.Count > 0
                          && allRegionIds.Count > 0
                          && AllScopeBindingHelper.IsFullIdSelection(normRegionIds, allRegionIds);

        var regionContextForLocations = regionIsAll ? null : normRegionIds.Count > 0 ? normRegionIds : null;
        var allLocationIds = await AllScopeBindingHelper.ResolveAllLocationIdsAsync(
            db,
            partnerContext,
            regionContextForLocations);
        var locationIsAll = normLocationIds.Count > 0
                            && allLocationIds.Count > 0
                            && AllScopeBindingHelper.IsFullIdSelection(normLocationIds, allLocationIds);

        var regionDisplay = regionIsAll
            ? AllScopeBindingHelper.AllRegionsDisplay
            : JoinDistinctNames(regionNames);

        var locationDisplay = locationIsAll
            ? AllScopeBindingHelper.AllLocationsDisplay
            : 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;
    }
}