feat: 新增备料(采购下单)功能模块,含清空清单

- 独立采购备料清单:选 BOM + 输入套数一键生成计划(计划数量 = 单套用量 × 套数),可手工增删改、导出 Excel

- 备料与生产订单完全解耦,仅记录计划数量、不记账(不产生任何出入库流水)

- 新增「清空清单」功能(/prepare/clear,JS 二次确认 + 操作日志),按当前工厂范围清空

- 配套:PrepPlan 模型、缺口(计划-库存)实时计算、库存随工厂切换过滤
This commit is contained in:
2026-10-19 15:09:20 +08:00
parent e9b605fca6
commit 5a6f4ea4df
6 changed files with 424 additions and 1 deletions
+19
View File
@@ -157,6 +157,25 @@ class Factory(db.Model):
created_at = db.Column(db.DateTime, default=datetime.now)
# ---------------- 备料计划数量(人工录入, 不记账) ----------------
class PrepPlan(db.Model):
"""备料「计划数量」人工录入(不记账): 每个物料在某工厂范围下的计划采购量。
- (material_id, factory_id) 组合唯一; factory_id 为 NULL 表示「全部工厂(汇总)」范围的计划。
- plan_qty 为 NULL 表示「尚未填写」; 0 表示明确计划不采购。
- 仅用于采购下单参考, 不产生任何入库/出库流水。
"""
__tablename__ = "prep_plan"
id = db.Column(db.Integer, primary_key=True)
material_id = db.Column(db.Integer, db.ForeignKey("material.id"), nullable=False, index=True)
factory_id = db.Column(db.Integer, db.ForeignKey("factory.id"), nullable=True, index=True)
plan_qty = db.Column(db.Float, nullable=True, default=None) # 计划采购数量(空=未填写)
note = db.Column(db.String(255), default="")
created_at = db.Column(db.DateTime, default=datetime.now)
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
__table_args__ = (UniqueConstraint("material_id", "factory_id", name="uq_prep_plan_mf"),)
# ---------------- M2-2: 厂间调拨 ----------------
class Transfer(db.Model):
"""厂间调拨: 从源工厂调出、调入目标工厂(同一颗物料)。