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:
@ -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 '',
|
||||
|
||||
@ -11,6 +11,8 @@ class PurchaseRequest(db.Model):
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
request_no = db.Column(db.String(100), unique=True, nullable=False, index=True)
|
||||
# [新增] 硬关联基础物料表,打通"按单入库"链路
|
||||
base_id = db.Column(db.Integer, db.ForeignKey('material_base.id'), index=True, comment='关联基础物料ID')
|
||||
name = db.Column(db.String(255), nullable=False, comment='采购名称')
|
||||
spec_model = db.Column(db.String(255), comment='规格型号')
|
||||
quantity = db.Column(db.Numeric(19, 4), nullable=False, comment='采购数量')
|
||||
@ -23,6 +25,8 @@ class PurchaseRequest(db.Model):
|
||||
status = db.Column(db.Integer, default=0, nullable=False)
|
||||
requester_id = db.Column(db.Integer, nullable=False, index=True)
|
||||
approver_id = db.Column(db.Integer, index=True)
|
||||
# [新增] 反向关联:该采购申请对应的入库记录
|
||||
stock_buys = db.relationship('StockBuy', back_populates='purchase_request', lazy='dynamic')
|
||||
approved_at = db.Column(db.DateTime)
|
||||
reject_reason = db.Column(db.Text)
|
||||
created_at = db.Column(db.DateTime, default=beijing_time, nullable=False)
|
||||
@ -64,6 +68,7 @@ class PurchaseRequest(db.Model):
|
||||
return {
|
||||
'id': self.id,
|
||||
'request_no': self.request_no,
|
||||
'base_id': self.base_id,
|
||||
'name': self.name,
|
||||
'spec_model': self.spec_model or '',
|
||||
'quantity': float(self.quantity) if self.quantity else 0,
|
||||
|
||||
Reference in New Issue
Block a user