labelingToolbarScope.ts
3.52 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import type { GroupListItem } from "../types/group";
import type { LocationDto } from "../types/location";
import type { PartnerListItem } from "../types/partner";
export function partnerNameForFilterId(
partners: PartnerListItem[],
companyFilterId: string,
): string {
if (companyFilterId === "all") return "";
return (partners.find((p) => p.id === companyFilterId)?.partnerName ?? "").trim();
}
export function filterGroupsByCompany(groups: GroupListItem[], companyFilterId: string): GroupListItem[] {
if (companyFilterId === "all") return groups;
return groups.filter((g) => g.partnerId === companyFilterId);
}
export function filterLocationsByCompanyAndRegion(
locations: LocationDto[],
partners: PartnerListItem[],
companyFilterId: string,
regionFilterId: string,
groups: GroupListItem[],
): LocationDto[] {
let list = locations;
const pn = partnerNameForFilterId(partners, companyFilterId);
if (pn) {
list = list.filter((l) => (l.partner ?? "").trim() === pn);
}
if (regionFilterId !== "all") {
const g = groups.find((x) => x.id === regionFilterId);
if (g) {
const gn = (g.groupName ?? "").trim();
const gpn = (g.partnerName ?? "").trim();
list = list.filter(
(l) => (l.groupName ?? "").trim() === gn && (l.partner ?? "").trim() === gpn,
);
}
}
return list;
}
/** 按门店 Id 判断是否属于所选公司;无绑定门店时默认匹配(与 Category ALL/SPECIFIED 空集一致) */
export function matchesCompanyByLocationIds(
locationIds: string[],
companyFilterId: string,
catalog: LocationDto[],
partners: PartnerListItem[],
): boolean {
if (companyFilterId === "all") return true;
const pn = partnerNameForFilterId(partners, companyFilterId);
if (!pn) return true;
const ids = locationIds.map((x) => String(x).trim()).filter(Boolean);
if (!ids.length) return true;
const byId = new Map(catalog.map((l) => [l.id, l]));
const matched = ids.map((id) => byId.get(id)).filter((l): l is LocationDto => !!l);
if (!matched.length) return true;
return matched.some((l) => (l.partner ?? "").trim() === pn);
}
export function matchesRegionByLocationIds(
locationIds: string[],
regionFilterId: string,
catalog: LocationDto[],
groups: GroupListItem[],
): boolean {
if (regionFilterId === "all") return true;
const g = groups.find((x) => x.id === regionFilterId);
if (!g) return true;
const gn = (g.groupName ?? "").trim();
const pn = (g.partnerName ?? "").trim();
const ids = locationIds.map((x) => String(x).trim()).filter(Boolean);
if (!ids.length) return true;
const byId = new Map(catalog.map((l) => [l.id, l]));
const matched = ids.map((id) => byId.get(id)).filter((l): l is LocationDto => !!l);
if (!matched.length) return true;
return matched.some(
(l) => (l.groupName ?? "").trim() === gn && (l.partner ?? "").trim() === pn,
);
}
export function resolveScopedLocationIdsForToolbar(
companyFilterId: string,
regionFilterId: string,
locationFilterId: string,
locationCatalog: LocationDto[],
filterGroups: GroupListItem[],
filterPartners: PartnerListItem[],
): string[] | null {
if (
companyFilterId === "all" &&
regionFilterId === "all" &&
locationFilterId === "all"
) {
return null;
}
if (locationFilterId !== "all") {
const lid = locationFilterId.trim();
return lid ? [lid] : [];
}
const scoped = filterLocationsByCompanyAndRegion(
locationCatalog,
filterPartners,
companyFilterId,
regionFilterId,
filterGroups,
);
return scoped.map((l) => l.id).filter(Boolean);
}