61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
"""BOM 成品搜索 API
|
||
|
||
注意:prefix 必须唯一,不能与 deduce_bom.py 的 /api/pms 冲突
|
||
"""
|
||
from fastapi import APIRouter, Depends, Query
|
||
from pydantic import BaseModel
|
||
|
||
from app.models import MaterialBase, BomTable
|
||
|
||
# 修改 prefix 为唯一值,避免与 deduce_bom.py 的 /api/pms 冲突
|
||
router = APIRouter(prefix="/api/pms/bom", tags=["BOM 成品搜索"])
|
||
|
||
|
||
class BomTargetItem(BaseModel):
|
||
"""成品下拉项"""
|
||
id: int
|
||
name: str
|
||
spec_model: str | None
|
||
|
||
|
||
@router.get("/targets", response_model=list[BomTargetItem])
|
||
async def search_bom_targets(q: str = Query("", description="搜索词")):
|
||
"""
|
||
成品模糊搜索接口
|
||
|
||
- 仅返回在 bom_table 中作为 parent_id 出现过的物料(即真正的成品)
|
||
- 支持按 name 或 spec_model 模糊匹配
|
||
"""
|
||
from app.database import SessionLocalInventory
|
||
db = SessionLocalInventory()
|
||
|
||
try:
|
||
# 子查询:找出所有作为 parent_id 的物料ID
|
||
parent_ids = db.query(BomTable.parent_id).distinct().subquery()
|
||
|
||
# 基础查询:仅成品
|
||
query = db.query(MaterialBase).filter(
|
||
MaterialBase.id.in_(parent_ids)
|
||
)
|
||
|
||
# 如果有搜索词,添加模糊匹配
|
||
if q:
|
||
search_pattern = f"%{q}%"
|
||
query = query.filter(
|
||
(MaterialBase.name.ilike(search_pattern)) |
|
||
(MaterialBase.spec_model.ilike(search_pattern))
|
||
)
|
||
|
||
materials = query.limit(50).all()
|
||
|
||
return [
|
||
BomTargetItem(
|
||
id=m.id,
|
||
name=m.name,
|
||
spec_model=m.spec_model
|
||
)
|
||
for m in materials
|
||
]
|
||
finally:
|
||
db.close()
|