feat: 打通采购申请与入库的按单入库链路

后端变更:
- PurchaseRequest 新增 base_id 硬关联 MaterialBase,StockBuy 新增 request_id 关联采购单
- handle_inbound 支持 request_id 入参,入库后自动反写采购单状态为已完成
- 新增 get_approved_requests 接口,返回已审批未入库采购单列表(含物料信息+历史数据回退匹配)
- create_purchase_request 新增 name+spec_model 自动匹配 MaterialBase
- 新增 SQL 和 Alembic 数据库迁移脚本

前端变更:
- 入库表单新增"从采购单导入"弹窗,支持搜索/选中已审批采购单并一键填充物料和商务信息
- 单价/总价交叉推算,缺项自动补全
- 选中行蓝色高亮+点击整行选中,行级交互优化
This commit is contained in:
yueli
2026-07-14 15:25:00 +08:00
parent 88b754120b
commit a11b7972c3
9 changed files with 643 additions and 16 deletions

View File

@ -165,6 +165,9 @@ class BuyInboundService:
generated_sku = str(next_global_id).zfill(10) if next_global_id else datetime.now().strftime('%Y%m%d%H%M%S')
final_barcode = data.get('barcode') or generated_sku
# [新增] 按单入库:关联采购申请单
request_id = data.get('request_id')
new_stock = StockBuy(
base_id=material.id, global_print_id=next_global_id, sku=generated_sku, barcode=final_barcode,
in_date=in_date_val, serial_number=data.get('serial_number'), batch_number=data.get('batch_number'),
@ -172,6 +175,9 @@ class BuyInboundService:
inspection_status=data.get('inspection_status', '未检'),
warehouse_location=data.get('warehouse_location'),
# [新增] 按单入库关联
request_id=request_id,
# 价格信息
pre_tax_unit_price=u_price,
post_tax_unit_price=post_tax_price,
@ -189,6 +195,15 @@ class BuyInboundService:
db.session.add(new_stock)
db.session.flush() # 获取 new_stock.id
# [新增] 按单入库:反写采购申请单状态为"已完成"
if request_id:
from app.models.purchase import PurchaseRequest
purchase_req = db.session.get(PurchaseRequest, request_id)
if purchase_req:
if purchase_req.status != 1:
raise ValueError(f"采购单【{purchase_req.request_no}】当前状态不允许入库,请确认审批状态")
purchase_req.status = 3 # 3 = 已完成/已入库
# 先提交主事务(入库单必须落盘),图片向量异步后台提取
db.session.commit()