From 265081c43f6629b5c372cfa5232ee621da4dbdb5 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 23 Jun 2026 18:07:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BA=A7=E5=93=81=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=8E=BB=E9=87=8D=20=E2=80=94=20=E6=89=B9=E6=AC=A1=E5=86=85pro?= =?UTF-8?q?duct=5Fcode=E5=8E=BB=E9=87=8D=20+=20DB=E5=B1=82=E6=8C=89product?= =?UTF-8?q?=5Fcode+org=5Fid=E5=85=9C=E5=BA=95=E6=9F=A5=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 批次内seen_codes去重: 同一导入批次中相同product_code只处理第一条 - DB查重增加fallback: resource_ref_id查不到时再按product_code+org_id查 - update时同步写入resource_ref_id --- product_management/core.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/product_management/core.py b/product_management/core.py index d8ee48f..98f0174 100644 --- a/product_management/core.py +++ b/product_management/core.py @@ -1172,13 +1172,21 @@ class ProductManager: created_cats += 1 # Step 3: Process products — update existing, create new + # Local dedup: skip duplicate product_code within same import batch + seen_codes = set() for prod in products: target_cat_id = source_to_id.get(prod.get('source_category_id')) if not target_cat_id: continue + product_code = prod.get('product_code', '') resource_ref_id = prod.get('resource_ref_id', '') + # Skip duplicate product_code in this batch + if product_code in seen_codes: + continue + seen_codes.add(product_code) + # Check if product already exists by resource_ref_id + org_id existing_prod = None if resource_ref_id: @@ -1188,15 +1196,24 @@ class ProductManager: {'ref_id': resource_ref_id, 'org_id': org_id} ) + # Fallback: check by product_code + org_id (unique constraint) + if not existing_prod and product_code: + existing_prod = await sor.sqlExe( + """SELECT id FROM product + WHERE product_code = ${code}$ AND org_id = ${org_id}$""", + {'code': product_code, 'org_id': org_id} + ) + if existing_prod: # Update existing product await sor.U('product', { 'id': existing_prod[0].id, 'product_name': prod.get('product_name', ''), - 'product_code': prod.get('product_code', ''), + 'product_code': product_code, 'product_type': prod.get('product_type', ''), 'brief_intro': prod.get('brief_intro', ''), 'category_id': target_cat_id, + 'resource_ref_id': resource_ref_id, 'sort_order': str(prod.get('sort_order', 0)), 'updated_at': now })