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

@ -4,6 +4,7 @@ from pgvector.sqlalchemy import Vector
import json
# 显式导入 MaterialBase 以防 relationship 找不到引用
from app.models.base import MaterialBase
from app.models.purchase import PurchaseRequest
class StockBuy(db.Model):
@ -15,6 +16,8 @@ class StockBuy(db.Model):
id = db.Column(db.Integer, primary_key=True)
base_id = db.Column(db.Integer, db.ForeignKey('material_base.id'), nullable=False, index=True) # ★ 批量 IN 查询高频列
# [新增] 关联采购申请单,打通"按单入库"链路
request_id = db.Column(db.Integer, db.ForeignKey('purchase_request.id'), index=True, comment='关联采购申请单ID')
# 身份标识
sku = db.Column(db.String(100), index=True) # ★ 条码/SKU 快速定位
@ -61,6 +64,7 @@ class StockBuy(db.Model):
# 关系定义
base = db.relationship('MaterialBase', back_populates='stock_buys')
purchase_request = db.relationship('PurchaseRequest', back_populates='stock_buys')
def to_dict(self):
# 辅助解析函数
@ -77,6 +81,9 @@ class StockBuy(db.Model):
return {
'id': self.id,
'base_id': self.base_id,
'request_id': self.request_id,
# [新增] 采购申请单号(便于前端展示)
'request_no': self.purchase_request.request_no if self.purchase_request else '',
# [修改] 增加公司名称
'company_name': self.base.company_name if self.base else '',