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); }