diff --git a/inventory-backend/app/services/inbound/buy_service.py b/inventory-backend/app/services/inbound/buy_service.py index 8035957..8d12fa4 100644 --- a/inventory-backend/app/services/inbound/buy_service.py +++ b/inventory-backend/app/services/inbound/buy_service.py @@ -12,6 +12,7 @@ import traceback import json import numpy as np from app.utils.ai_vision import extract_and_embed +from app.utils.warehouse_location import material_company, usable_locations from app.services.image_embedding_service import ImageEmbeddingService @@ -690,6 +691,15 @@ class BuyInboundService: if not candidates: return "" - # 按时间倒序排序,返回最新的库位 + # 按时间倒序排序 candidates.sort(key=lambda x: x[0] if x[0] else datetime.min, reverse=True) - return candidates[0][1] if candidates[0][1] else "" + + # ★ 回填前校验:历史库位可能已被删除、或属于别家公司。不过滤的话, + # 操作员会在不知情的情况下把货记到一个不属于本公司的库位上。 + # 按时间从新到旧挑第一个仍可用的;全都不合法则返回空串(表单不预填)。 + ordered = [loc for _, loc in candidates if loc] + usable = set(usable_locations(material_company(base_id), ordered)) + for loc in ordered: + if loc in usable: + return loc + return "" diff --git a/inventory-backend/app/services/inbound/product_service.py b/inventory-backend/app/services/inbound/product_service.py index a08d2b1..61c4508 100644 --- a/inventory-backend/app/services/inbound/product_service.py +++ b/inventory-backend/app/services/inbound/product_service.py @@ -12,6 +12,7 @@ import traceback import json import numpy as np from app.utils.ai_vision import extract_and_embed +from app.utils.warehouse_location import material_company, usable_locations from app.services.image_embedding_service import ImageEmbeddingService from app.services.track_webhook_service import notify_track, get_current_operator @@ -724,6 +725,15 @@ class ProductInboundService: if not candidates: return "" - # 按时间倒序排序,返回最新的库位 + # 按时间倒序排序 candidates.sort(key=lambda x: x[0] if x[0] else datetime.min, reverse=True) - return candidates[0][1] if candidates[0][1] else "" + + # ★ 回填前校验:历史库位可能已被删除、或属于别家公司。不过滤的话, + # 操作员会在不知情的情况下把货记到一个不属于本公司的库位上。 + # 按时间从新到旧挑第一个仍可用的;全都不合法则返回空串(表单不预填)。 + ordered = [loc for _, loc in candidates if loc] + usable = set(usable_locations(material_company(base_id), ordered)) + for loc in ordered: + if loc in usable: + return loc + return "" diff --git a/inventory-backend/app/services/inbound/semi_service.py b/inventory-backend/app/services/inbound/semi_service.py index 1e0fc7a..efb620e 100644 --- a/inventory-backend/app/services/inbound/semi_service.py +++ b/inventory-backend/app/services/inbound/semi_service.py @@ -12,6 +12,7 @@ import traceback import json import numpy as np from app.utils.ai_vision import extract_and_embed +from app.utils.warehouse_location import material_company, usable_locations from app.services.image_embedding_service import ImageEmbeddingService from app.services.track_webhook_service import notify_track, get_current_operator @@ -802,6 +803,15 @@ class SemiInboundService: if not candidates: return "" - # 按时间倒序排序,返回最新的库位 + # 按时间倒序排序 candidates.sort(key=lambda x: x[0] if x[0] else datetime.min, reverse=True) - return candidates[0][1] if candidates[0][1] else "" + + # ★ 回填前校验:历史库位可能已被删除、或属于别家公司。不过滤的话, + # 操作员会在不知情的情况下把货记到一个不属于本公司的库位上。 + # 按时间从新到旧挑第一个仍可用的;全都不合法则返回空串(表单不预填)。 + ordered = [loc for _, loc in candidates if loc] + usable = set(usable_locations(material_company(base_id), ordered)) + for loc in ordered: + if loc in usable: + return loc + return ""