Kaynağa Gözat

fix: raw value is somehow applied to default filters

n2749 1 gün önce
ebeveyn
işleme
b8435d2db5

+ 13 - 0
bom_assistant/api/templates/_filtering.html

@@ -40,6 +40,19 @@
       {% endfor %}
     </div>
     {% endif %}
+    {% for param_name, options in row.facet_groups.paramNameValueMap.items() %}
+    <div class="facet-group">
+      <small>{{ param_name }}</small>
+      {% for opt in options.paramDetailList %}
+      <button hx-post="/session/{{ session_id }}/row/{{ row.row_id }}/apply-filter"
+              hx-vals='{"group": {{ param_name | tojson }}, "value": {{ opt.name | tojson }}}'
+              hx-target="#row-{{ row.row_id }}-filtering"
+              hx-swap="innerHTML">
+        {{ opt.name }}
+      </button>
+      {% endfor %}
+    </div>
+    {% endfor %}
   </div>
   {% endif %}
 

+ 1 - 1
bom_assistant/classification/package_patterns.json

@@ -1,6 +1,6 @@
 {
   "patterns": [
-    "\\b(0201|0402|0603|0805|1206|1210|2010|2512|2220|1812)\\b",
+    "(?<![A-Za-z0-9])(0201|0402|0603|0805|1206|1210|2010|2512|2220|1812)(?![A-Za-z0-9])",
     "(?<![A-Za-z])(SOT-\\d+(?:-[A-Z0-9]+)*)",
     "(?<![A-Za-z])(SOIC-\\d+(?:-[A-Z0-9]+)*)",
     "(?<![A-Za-z])(HTSOP-\\d+(?:-[A-Z0-9]+)*)",

+ 17 - 4
bom_assistant/scouting/orchestrator.py

@@ -47,11 +47,18 @@ def _preseed_package_filter(session: BomSession, row_id: str) -> None:
         apply_filter(session, row_id, "Package", match)
 
 
+def _preseed_value_filter(row: BomRow) -> None:
+    value_str = row.normalized_params.value_str
+    if value_str:
+        row.applied_filters["keyword"] = value_str
+
+
 def confirm_category(session: BomSession, row_id: str, category_id: int, category_name: str) -> BomRow:
     row = get_row(session, row_id)
     row.resolved_category_id = category_id
     row.resolved_category_name = category_name
     row.applied_filters = {}
+    _preseed_value_filter(row)
     row.confirmed_pick = None
     row.state = RowState.filtering
     _refresh_filtering(row)
@@ -64,11 +71,17 @@ def apply_filter(session: BomSession, row_id: str, group: str, value: str) -> Bo
     if row.resolved_category_id is None:
         raise ScoutingValidationError("row has no confirmed category yet")
     key = _GROUP_FILTER_KEYS.get(group)
-    if key is None:
+    if key is not None:
+        row.applied_filters.setdefault(key, [])
+        if value not in row.applied_filters[key]:
+            row.applied_filters[key].append(value)
+    elif group in row.facet_groups.get("paramNameValueMap", {}):
+        param_map = row.applied_filters.setdefault("paramNameValueMap", {})
+        param_map.setdefault(group, [])
+        if value not in param_map[group]:
+            param_map[group].append(value)
+    else:
         raise ScoutingValidationError(f"unsupported filter group: {group}")
-    row.applied_filters.setdefault(key, [])
-    if value not in row.applied_filters[key]:
-        row.applied_filters[key].append(value)
     _refresh_filtering(row)
     return row
 

+ 1 - 0
bom_assistant/suppliers/category_resolver.py

@@ -74,6 +74,7 @@ def _ai_resolve(row: BomRow, subcats: list[dict], supplier: str) -> list[Resolve
         lines.append(f"  raw_value: {row.raw_value!r}")
 
     subcat_lines = "\n".join(_fmt_subcat(s) for s in subcats)
+    print(lines)
     prompt = (
         f"You are an electronics sourcing expert. Rank the top 3 {supplier.upper()} subcategories for this component, best match first.\n\n"
         "Component:\n"

+ 112 - 0
bom_assistant/suppliers/lcsc/category_cache.json

@@ -1068,5 +1068,117 @@
       "name": "Through Hole Resistors",
       "id": 1203
     }
+  ],
+  "connector||Micro_SD_Card_Det1": [
+    {
+      "name": "Memory Connectors",
+      "id": 166
+    },
+    {
+      "name": "PC Card Sockets",
+      "id": 773
+    },
+    {
+      "name": "Card Edge Connectors",
+      "id": 156
+    }
+  ],
+  "resistor||33": [
+    {
+      "name": "Through Hole Resistors",
+      "id": 1203
+    },
+    {
+      "name": "Chip Resistor - Surface Mount",
+      "id": 1199
+    },
+    {
+      "name": "Resistor Networks, Arrays",
+      "id": 1200
+    }
+  ],
+  "capacitor||18pF": [
+    {
+      "name": "Ceramic Capacitors",
+      "id": 1142
+    },
+    {
+      "name": "Capacitor Networks, Arrays",
+      "id": 1141
+    },
+    {
+      "name": "Trimmers, Variable Capacitors",
+      "id": 1152
+    }
+  ],
+  "connector||AudioJack_PJ-342": [
+    {
+      "name": "Audio Connectors",
+      "id": 718
+    },
+    {
+      "name": "Barrel Connectors",
+      "id": 153
+    },
+    {
+      "name": "Jacks, Plugs",
+      "id": 717
+    }
+  ],
+  "capacitor|0402|100nF": [
+    {
+      "name": "Ceramic Capacitors",
+      "id": 1142
+    },
+    {
+      "name": "Capacitor Networks, Arrays",
+      "id": 1141
+    },
+    {
+      "name": "Tantalum Capacitors",
+      "id": 1150
+    }
+  ],
+  "capacitor|0402|15pF": [
+    {
+      "name": "Ceramic Capacitors",
+      "id": 1142
+    },
+    {
+      "name": "Capacitor Networks, Arrays",
+      "id": 1141
+    },
+    {
+      "name": "Silicon Capacitors",
+      "id": 1148
+    }
+  ],
+  "ic||H3": [
+    {
+      "name": "Specialized ICs",
+      "id": 264
+    },
+    {
+      "name": "Special Purpose Regulators",
+      "id": 1024
+    },
+    {
+      "name": "Special Purpose Isolators",
+      "id": 268
+    }
+  ],
+  "ic|SOT-23-5|SY8088": [
+    {
+      "name": "Voltage Regulators - DC DC Switching Regulators",
+      "id": 1029
+    },
+    {
+      "name": "Power Management (PMIC)",
+      "id": 263
+    },
+    {
+      "name": "DC DC Switching Controllers",
+      "id": 1007
+    }
   ]
 }