labelingToolbarScope.ts 3.52 KB
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);
}