diff --git a/app.py b/app.py index e0d3ea5..1e65acf 100644 --- a/app.py +++ b/app.py @@ -831,11 +831,21 @@ def material_detail(mid): stmt_out.order_by(Outbound.occur_date.desc(), Outbound.id.desc()) ).all() fmap = {f.id: f.name for f in db.session.scalars(db.select(Factory)).all()} + # 各工厂实时库存(按工厂拆分, 实时聚合 inbound-outbound) + inb_by_f = {r[0]: float(r[1]) for r in db.session.execute( + db.text("SELECT factory_id, COALESCE(SUM(qty),0) FROM inbound WHERE material_id=:mid GROUP BY factory_id"), + {"mid": mid}).fetchall()} + out_by_f = {r[0]: float(r[1]) for r in db.session.execute( + db.text("SELECT factory_id, COALESCE(SUM(qty),0) FROM outbound WHERE material_id=:mid GROUP BY factory_id"), + {"mid": mid}).fetchall()} + per_factory = [{"f": f, "stock": inb_by_f.get(f.id, 0) - out_by_f.get(f.id, 0)} + for f in db.session.scalars(db.select(Factory).order_by(Factory.code)).all()] return render_template("material_detail.html", m=m, stock=sm.get(m.id, 0), inb_total=inb_total.get(m.id, 0), out_total=out_total.get(m.id, 0), - inbounds=inbounds, outbounds=outbounds, fmap=fmap) + inbounds=inbounds, outbounds=outbounds, fmap=fmap, + per_factory=per_factory) # ---------------- 入库 / 出库 ---------------- @@ -1366,8 +1376,21 @@ def bom_edit(bid): return redirect(url_for("boms")) mats = db.session.scalars(db.select(Material).order_by(Material.part_number)).all() if request.method == "POST": + # BOM 型号(简码)可编辑: 校验非空 + 不与其它 BOM 重复 + new_code = request.form.get("code", "").strip() b.name = request.form.get("name", "") b.note = request.form.get("note", "") + raw = db.session.scalars(db.select(BomItem).where(BomItem.bom_id == b.id)).all() + items = [{"pn": db.session.get(Material, it.material_id).part_number, + "qty": it.qty_per_unit} for it in raw] + if not new_code: + flash("BOM 型号必填", "error") + return render_template("bom_form.html", b=b, mats=mats, items=items, form_code=new_code) + dup = db.session.scalar(db.select(Bom).where(Bom.code == new_code, Bom.id != b.id)) + if dup: + flash("BOM 型号已存在", "error") + return render_template("bom_form.html", b=b, mats=mats, items=items, form_code=new_code) + b.code = new_code db.session.execute(db.delete(BomItem).where(BomItem.bom_id == b.id)) pns = request.form.getlist("pn") qts = request.form.getlist("qty") diff --git a/templates/bom_form.html b/templates/bom_form.html index cdcd1e5..cf768c9 100644 --- a/templates/bom_form.html +++ b/templates/bom_form.html @@ -4,7 +4,7 @@

{{ '编辑 BOM' if b else '新增 BOM' }}

- + diff --git a/templates/material_detail.html b/templates/material_detail.html index 8753c64..909b7ab 100644 --- a/templates/material_detail.html +++ b/templates/material_detail.html @@ -27,6 +27,22 @@
{{ '%.2f'|format(out_total) }}
消耗总数量
+

各工厂实时库存(实时聚合)

+ + + + {% for pf in per_factory %} + + + + + + {% else %} + + {% endfor %} + +
工厂编号工厂名称实时库存
{{ pf.f.code }}{{ pf.f.name or '-' }}{{ '%.2f'|format(pf.stock) }}
暂无工厂
+

入库流水(每次入库时间 / 数量)

diff --git a/templates/order_detail.html b/templates/order_detail.html index 944d70c..cfb1101 100644 --- a/templates/order_detail.html +++ b/templates/order_detail.html @@ -8,7 +8,7 @@

下单信息(按下单时记录)

-

BOM: {{ bom.code if bom else '-' }} ({{ bom.name if bom else '' }}) | 接单量: {{ '%.2f'|format(o.qty) }} | 生产工厂: {% if factory %}{{ factory.code }}{% if factory.name %} · {{ factory.name }}{% endif %}{% else %}未指定(按汇总库存){% endif %} | 经手人: {{ o.operator or '-' }}{% if o.created_at %} | 下单时间: {{ o.created_at.strftime('%Y-%m-%d %H:%M') }}{% endif %}

+

BOM: {{ bom.code if bom else '-' }}{% if bom and bom.name %} · {{ bom.name }}{% endif %} | 接单量: {{ '%.2f'|format(o.qty) }} | 生产工厂: {% if factory %}{{ factory.code }}{% if factory.name %} · {{ factory.name }}{% endif %}{% else %}未指定(按汇总库存){% endif %} | 经手人: {{ o.operator or '-' }}{% if o.created_at %} | 下单时间: {{ o.created_at.strftime('%Y-%m-%d %H:%M') }}{% endif %}

{% if o.remark %}

备注: {{ o.remark }}

{% endif %}

提示:点击「编辑订单」保存后,该订单会冲销已产生的调入/领料流水并清空调入计划,自动回到「刚下单」状态(待领料、未调拨),可重新规划。

diff --git a/templates/order_form.html b/templates/order_form.html index 4ee1463..a6ba4e3 100644 --- a/templates/order_form.html +++ b/templates/order_form.html @@ -11,7 +11,7 @@ diff --git a/templates/orders.html b/templates/orders.html index 9b95263..d06c666 100644 --- a/templates/orders.html +++ b/templates/orders.html @@ -11,7 +11,7 @@ {% for d in data %} - +
入库日期工厂送货日期录入时间数量批次号来源 / 供应商经手人备注
{{ d.o.order_no }}{{ d.bom.code if d.bom else '-' }} ({{ d.bom.name if d.bom else '' }}){{ d.bom.code if d.bom else '-' }}{% if d.bom and d.bom.name %} · {{ d.bom.name }}{% endif %} {{ '%.2f'|format(d.o.qty) }} {% if d.factory %}{{ d.factory.code }}{% if d.factory.name %} · {{ d.factory.name }}{% endif %}{% else %}未指定{% endif %} {{ '已领料' if d.o.status=='picked' else '待领料' }}