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) {
+