Blame view

美国版/Food Labeling Management Platform/src/lib/labelingToolbarScope.ts 3.52 KB
540ac0e3   杨鑫   前端修改bug
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);
  }