EntityLocationScopeDisplayHelper.cs
2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
}
}