diff --git a/routes/products.py b/routes/products.py
index 50f29df..3b195f9 100644
--- a/routes/products.py
+++ b/routes/products.py
@@ -171,16 +171,29 @@ def brand_management_delete():
return jsonify({"code": 400, "msg": "品牌名称不能为空"})
product_rows = query(
- "SELECT COUNT(*) AS cnt FROM products "
- "WHERE deleted_at IS NULL AND TRIM(brand)=%s",
+ "SELECT COALESCE(NULLIF(TRIM(product_type), ''), '未分类') AS product_type, "
+ "COUNT(*) AS cnt FROM products "
+ "WHERE deleted_at IS NULL AND TRIM(brand)=%s "
+ "GROUP BY COALESCE(NULLIF(TRIM(product_type), ''), '未分类') "
+ "ORDER BY cnt DESC",
(brand,),
)
- product_count = int(product_rows[0].get('cnt') or 0) if product_rows else 0
+ product_count = sum(int(row.get('cnt') or 0) for row in product_rows)
if product_count:
+ usage_counts = {
+ (row.get('product_type') or '未分类'): int(row.get('cnt') or 0)
+ for row in product_rows
+ }
+ usage_summary = '、'.join(
+ f"{product_type}{count}条"
+ for product_type, count in usage_counts.items()
+ )
return jsonify({
"code": 409,
- "msg": f"品牌「{brand}」正在被{product_count}个有效产品使用,请先修改这些产品的品牌后再删除",
+ "msg": f"品牌「{brand}」正在被产品信息管理基础表中的{product_count}条未回收记录使用"
+ f"({usage_summary}),请先修改这些产品的品牌后再删除",
"product_count": product_count,
+ "usage_counts": usage_counts,
})
saved = query("SELECT brand, category FROM brand_information WHERE brand=%s LIMIT 1", (brand,))
@@ -253,7 +266,7 @@ def products_list():
where.append("(s.supplier_name LIKE %s OR p.supplier_name_match LIKE %s)")
params.extend([f"%{supplier_filter}%", f"%{supplier_filter}%"])
if brand_filter:
- where.append("p.brand=%s")
+ where.append("TRIM(p.brand)=%s")
params.append(brand_filter)
if category1_filter:
where.append("p.category1=%s")
@@ -377,8 +390,21 @@ def products_list():
@products_bp.route('/api/products/filters')
@login_required
def products_filters():
- brands = query("SELECT DISTINCT brand FROM products WHERE brand IS NOT NULL AND brand != '' ORDER BY brand")
- categories = query("SELECT DISTINCT category1 FROM products WHERE category1 IS NOT NULL AND category1 != '' ORDER BY category1")
+ scope = request.args.get('scope', 'all')
+ if scope == 'active':
+ scope_clause = 'deleted_at IS NULL AND '
+ elif scope == 'recycle':
+ scope_clause = 'deleted_at IS NOT NULL AND '
+ else:
+ scope_clause = ''
+ brands = query(
+ f"SELECT DISTINCT TRIM(brand) AS brand FROM products WHERE {scope_clause}"
+ "brand IS NOT NULL AND TRIM(brand) != '' ORDER BY TRIM(brand)"
+ )
+ categories = query(
+ f"SELECT DISTINCT category1 FROM products WHERE {scope_clause}"
+ "category1 IS NOT NULL AND category1 != '' ORDER BY category1"
+ )
return jsonify({
"code": 0,
"data": {
@@ -2136,6 +2162,7 @@ def products_recycle_bin():
prod_name = request.args.get('prod_name', '')
unified_search = request.args.get('search', '')
supplier_filter = request.args.get('supplier', '')
+ brand_filter = request.args.get('brand', '')
product_type = request.args.get('product_type', '')
where = ["p.deleted_at IS NOT NULL"]
@@ -2153,6 +2180,9 @@ def products_recycle_bin():
if supplier_filter:
where.append("(p.supplier_name_match LIKE %s OR s.supplier_name LIKE %s)")
params.extend([f"%{supplier_filter}%", f"%{supplier_filter}%"])
+ if brand_filter:
+ where.append("TRIM(p.brand)=%s")
+ params.append(brand_filter)
if product_type:
where.append("p.product_type=%s")
params.append(product_type)
diff --git a/static/js/app.js b/static/js/app.js
index 97a6202..0ab319f 100644
--- a/static/js/app.js
+++ b/static/js/app.js
@@ -8163,6 +8163,9 @@ function loadProductsPage(container) {
+