diff --git a/inventory-backend/app/api/v1/inbound/buy.py b/inventory-backend/app/api/v1/inbound/buy.py index f6c0604..3090c88 100644 --- a/inventory-backend/app/api/v1/inbound/buy.py +++ b/inventory-backend/app/api/v1/inbound/buy.py @@ -115,6 +115,7 @@ def get_list(): page = request.args.get('page', 1, type=int) limit = request.args.get('pageSize', 15, type=int) keyword = request.args.get('keyword', '') + sku = request.args.get('sku', '') # 新增筛选参数 category = request.args.get('category', '') @@ -137,7 +138,7 @@ def get_list(): statuses_str = request.args.get('statuses', '') statuses = statuses_str.split(',') if statuses_str else [] - result = BuyInboundService.get_list(page, limit, keyword, statuses, category, material_type, company, + result = BuyInboundService.get_list(page, limit, keyword, sku, statuses, category, material_type, company, order_by, is_asc, advanced_filters) # 字段级脱敏 user_permissions = get_current_user_permissions() diff --git a/inventory-backend/app/api/v1/inbound/product.py b/inventory-backend/app/api/v1/inbound/product.py index 9ec367b..6efb4b3 100644 --- a/inventory-backend/app/api/v1/inbound/product.py +++ b/inventory-backend/app/api/v1/inbound/product.py @@ -73,6 +73,7 @@ def get_list(): page = request.args.get('page', 1, type=int) limit = request.args.get('pageSize', 15, type=int) keyword = request.args.get('keyword', '') + sku = request.args.get('sku', '') statuses_str = request.args.get('statuses', '') statuses = statuses_str.split(',') if statuses_str else [] category = request.args.get('category', '') @@ -104,7 +105,7 @@ def get_list(): # 调用服务,传入所有参数 result = ProductInboundService.get_list( - page, limit, keyword, statuses, + page, limit, keyword, sku, statuses, category=extra_filters.get('category'), material_type=extra_filters.get('material_type'), company=extra_filters.get('company'), diff --git a/inventory-backend/app/api/v1/inbound/semi.py b/inventory-backend/app/api/v1/inbound/semi.py index 86c7bb4..dbd5980 100644 --- a/inventory-backend/app/api/v1/inbound/semi.py +++ b/inventory-backend/app/api/v1/inbound/semi.py @@ -73,6 +73,7 @@ def get_list(): page = request.args.get('page', 1, type=int) limit = request.args.get('pageSize', 15, type=int) keyword = request.args.get('keyword', '') + sku = request.args.get('sku', '') statuses_str = request.args.get('statuses', '') statuses = statuses_str.split(',') if statuses_str else [] company = request.args.get('company', '') @@ -104,7 +105,7 @@ def get_list(): # 调用服务,传入所有参数 result = SemiInboundService.get_list( - page, limit, keyword, statuses, + page, limit, keyword, sku, statuses, **extra_filters ) user_permissions = get_current_user_permissions() diff --git a/inventory-backend/app/services/inbound/buy_service.py b/inventory-backend/app/services/inbound/buy_service.py index 77e3210..e96ac72 100644 --- a/inventory-backend/app/services/inbound/buy_service.py +++ b/inventory-backend/app/services/inbound/buy_service.py @@ -240,17 +240,16 @@ class BuyInboundService: # 5. 获取列表 (支持排序和高级筛选) # ============================================================ @staticmethod - def get_list(page, limit, keyword=None, statuses=None, category=None, material_type=None, company=None, + def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None, order_by='', is_asc='', advanced_filters=None): try: from sqlalchemy import and_, or_ query = db.session.query(StockBuy).outerjoin(MaterialBase, StockBuy.base_id == MaterialBase.id) - # 1. 通用关键词搜索 + # 1. 通用关键词搜索(名称、规格、公司) if keyword: k_str = f'%{keyword.strip()}%' conditions = [ - StockBuy.sku.ilike(k_str), StockBuy.barcode.ilike(k_str), StockBuy.batch_number.ilike(k_str), StockBuy.serial_number.ilike(k_str), @@ -262,6 +261,11 @@ class BuyInboundService: ] query = query.filter(or_(*conditions)) + # 1.1 SKU 独立搜索 + if sku and sku.strip(): + sku_str = f'%{sku.strip()}%' + query = query.filter(StockBuy.sku.ilike(sku_str)) + # 2. 类别独立搜索 if category and category.strip(): query = query.filter(MaterialBase.category == category.strip()) diff --git a/inventory-backend/app/services/inbound/product_service.py b/inventory-backend/app/services/inbound/product_service.py index 2c99a07..d9cc528 100644 --- a/inventory-backend/app/services/inbound/product_service.py +++ b/inventory-backend/app/services/inbound/product_service.py @@ -270,11 +270,12 @@ class ProductInboundService: return [] @staticmethod - def get_list(page, limit, keyword=None, statuses=None, category=None, material_type=None, company=None, + def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None, order_by_column=None, is_asc=None, advanced_filters=None): from app.models.inbound.product import StockProduct try: query = db.session.query(StockProduct).outerjoin(MaterialBase, StockProduct.base_id == MaterialBase.id) + # 1. 通用关键词搜索(名称、规格、公司) if keyword: kw = f'%{keyword}%' query = query.filter(or_( @@ -283,9 +284,12 @@ class ProductInboundService: MaterialBase.company_name.ilike(kw), StockProduct.serial_number.ilike(kw), StockProduct.work_order_code.ilike(kw), - StockProduct.order_id.ilike(kw), - StockProduct.sku.ilike(kw) + StockProduct.order_id.ilike(kw) )) + # 1.1 SKU 独立搜索 + if sku and sku.strip(): + sku_str = f'%{sku.strip()}%' + query = query.filter(StockProduct.sku.ilike(sku_str)) if category and category.strip(): query = query.filter(MaterialBase.category == category.strip()) if material_type and material_type.strip(): diff --git a/inventory-backend/app/services/inbound/semi_service.py b/inventory-backend/app/services/inbound/semi_service.py index 45f84c1..aa41084 100644 --- a/inventory-backend/app/services/inbound/semi_service.py +++ b/inventory-backend/app/services/inbound/semi_service.py @@ -359,11 +359,12 @@ class SemiInboundService: return [] @staticmethod - def get_list(page, limit, keyword=None, statuses=None, category=None, material_type=None, company=None, + def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None, order_by_column=None, is_asc=None, advanced_filters=None): from app.models.inbound.semi import StockSemi try: query = db.session.query(StockSemi).outerjoin(MaterialBase, StockSemi.base_id == MaterialBase.id) + # 1. 通用关键词搜索(名称、规格、公司) if keyword: kw = f'%{keyword}%' query = query.filter( @@ -373,11 +374,14 @@ class SemiInboundService: MaterialBase.company_name.ilike(kw), StockSemi.batch_number.ilike(kw), StockSemi.serial_number.ilike(kw), - StockSemi.sku.ilike(kw), StockSemi.work_order_code.ilike(kw), StockSemi.bom_code.ilike(kw) ) ) + # 1.1 SKU 独立搜索 + if sku and sku.strip(): + sku_str = f'%{sku.strip()}%' + query = query.filter(StockSemi.sku.ilike(sku_str)) if category and category.strip(): query = query.filter(MaterialBase.category == category.strip()) if material_type and material_type.strip(): diff --git a/inventory-web/src/views/stock/inbound/buy.vue b/inventory-web/src/views/stock/inbound/buy.vue index ada8fc3..08d14d8 100644 --- a/inventory-web/src/views/stock/inbound/buy.vue +++ b/inventory-web/src/views/stock/inbound/buy.vue @@ -17,12 +17,24 @@ + + + + @@ -745,6 +757,7 @@ const queryParams = reactive({ page: 1, pageSize: 100, keyword: '', + sku: '', category: '', material_type: '', company: '', @@ -1240,6 +1253,7 @@ const loadWarehouseTree = async () => { const resetQuery = () => { queryParams.keyword = '' + queryParams.sku = '' queryParams.category = '' queryParams.material_type = '' queryParams.company = '' diff --git a/inventory-web/src/views/stock/inbound/product.vue b/inventory-web/src/views/stock/inbound/product.vue index 13896e2..da630c9 100644 --- a/inventory-web/src/views/stock/inbound/product.vue +++ b/inventory-web/src/views/stock/inbound/product.vue @@ -16,12 +16,24 @@ + + + + @@ -555,7 +567,7 @@ const dialogStatus = ref<'create' | 'update'>('create') const tableData = ref([]) const total = ref(0) const formRef = ref() -const queryParams = reactive({ page: 1, pageSize: 100, keyword: '', category: '', material_type: '', statuses: ['在库', '借库'], company: '', orderByColumn: '', isAsc: '', advancedFilters: [] }) +const queryParams = reactive({ page: 1, pageSize: 100, keyword: '', sku: '', category: '', material_type: '', statuses: ['在库', '借库'], company: '', orderByColumn: '', isAsc: '', advancedFilters: [] }) const categoryOptions = ref([]) const typeOptions = ref([]) const companyOptions = ref([]) // [新增] @@ -982,6 +994,7 @@ const loadWarehouseTree = async () => { const resetQuery = () => { queryParams.keyword = '' + queryParams.sku = '' queryParams.category = '' queryParams.material_type = '' queryParams.company = '' diff --git a/inventory-web/src/views/stock/inbound/semi.vue b/inventory-web/src/views/stock/inbound/semi.vue index c2df26a..950bb48 100644 --- a/inventory-web/src/views/stock/inbound/semi.vue +++ b/inventory-web/src/views/stock/inbound/semi.vue @@ -17,12 +17,24 @@ + + + + @@ -621,7 +633,7 @@ const dialogStatus = ref<'create' | 'update'>('create') const tableData = ref([]) const total = ref(0) const formRef = ref() -const queryParams = reactive({ page: 1, pageSize: 100, keyword: '', category: '', material_type: '', statuses: ['在库', '借库'], company: '', orderByColumn: '', isAsc: '', advancedFilters: [] }) +const queryParams = reactive({ page: 1, pageSize: 100, keyword: '', sku: '', category: '', material_type: '', statuses: ['在库', '借库'], company: '', orderByColumn: '', isAsc: '', advancedFilters: [] }) const categoryOptions = ref([]) const typeOptions = ref([]) const companyOptions = ref([]) // [新增] @@ -1116,6 +1128,7 @@ const loadWarehouseTree = async () => { const resetQuery = () => { queryParams.keyword = '' + queryParams.sku = '' queryParams.category = '' queryParams.material_type = '' queryParams.company = ''