From 38ee24f6eee978526758883e6174fd460925e95a Mon Sep 17 00:00:00 2001 From: star <395723461@qq.com> Date: Mon, 26 Oct 2026 10:51:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=AF=8F=E4=B8=AA=20BOM=20=E7=94=9F=E4=BA=A7=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E9=99=90=E5=88=B6=E4=B8=BA=201=E2=80=939=20=E7=9A=84=E4=B8=AA?= =?UTF-8?q?=E4=BD=8D=E6=AD=A3=E6=95=B4=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端: 数量输入框改为 text/inputmode=numeric/maxlength=1,新增 capQty 实时拦截非个位(去非数字、限1位、超范围清空) - 后端: 新增 _bom_qty_invalid 校验,order_new/order_edit 拒绝非个位数量并回显已填内容,提示「每个 BOM 的生产数量需为 1–9 的个位正整数」 Co-Authored-By: WorkBuddy --- app.py | 20 ++++++++++++++++++++ templates/order_form.html | 11 +++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index 675a00e..74ec930 100644 --- a/app.py +++ b/app.py @@ -1499,6 +1499,10 @@ def order_new(): factory_id = int(fid_raw) if fid_raw.isdigit() else None if not pairs: flash("请至少选择一个 BOM 并填写大于 0 的生产数量", "error") + elif _bom_qty_invalid(pairs): + flash("每个 BOM 的生产数量需为 1–9 的个位正整数", "error") + return render_template("order_form.html", boms=boms_all, factories=factories, + o=None, initial_lines=[[bid, qv] for bid, qv in pairs]) else: order_no = request.form.get("order_no", "").strip() or _gen_order_no() if db.session.scalar(db.select(ProdOrder).where(ProdOrder.order_no == order_no)): @@ -1646,6 +1650,10 @@ def order_edit(oid): flash("请至少选择一个 BOM 并填写大于 0 的生产数量", "error") return render_template("order_form.html", boms=boms_all, factories=factories, o=o, initial_lines=[[b.id, q] for b, q in order_bom_lines(o)]) + if _bom_qty_invalid(pairs): + flash("每个 BOM 的生产数量需为 1–9 的个位正整数", "error") + return render_template("order_form.html", boms=boms_all, factories=factories, + o=o, initial_lines=[[bid, qv] for bid, qv in pairs]) old_no = o.order_no order_no = request.form.get("order_no", "").strip() or o.order_no if order_no != o.order_no and db.session.scalar( @@ -1779,6 +1787,18 @@ def _parse_bom_pairs(form): return pairs +def _bom_qty_invalid(pairs): + """返回 pairs 中不符合『1–9 个位正整数』的 qty 列表; 空列表表示全部合法。 + + 生产订单每个 BOM 的生产数量限定为个位正整数(1~9), 不允许 0、小数或超过个位。 + """ + bad = [] + for _, q in pairs: + if not (1 <= q <= 9 and float(q).is_integer()): + bad.append(q) + return bad + + def _find_posted_flows(order_no, material_id): """返回某生产订单某物料已入账调入流水(源厂出库 + 生产厂入库)。""" outs = db.session.scalars(db.select(Outbound).where( diff --git a/templates/order_form.html b/templates/order_form.html index d5988a7..e1e308f 100644 --- a/templates/order_form.html +++ b/templates/order_form.html @@ -9,7 +9,7 @@ -

可在同一订单中加入多个 BOM,每个 BOM 独立填写生产数量;点击「+ 添加 BOM」增加一行,不需要的行可删除。

+

可在同一订单中加入多个 BOM,每个 BOM 独立填写生产数量(限 1–9 的个位正整数);点击「+ 添加 BOM」增加一行,不需要的行可删除。

@@ -36,12 +36,19 @@ {% for b in boms %}{% endfor %} - +