fix: 生产订单数量放宽为正整數(≥1、不限位数、禁止小数)

- 用户澄清"保持个位"实为"不要小数点":移除 1–9 单 digit 上限,允许任意位正整数(如 12、100)
- 前端 capQty 改为仅保留数字、去小数点/负号、允许多位;输入框去掉 maxlength=1
- 后端 _bom_qty_invalid 改为校验正整数(≥1 且非小数),拒绝 1.5 等带小数点数量并提示

Co-Authored-By: WorkBuddy <workbuddy@tencent.com>
This commit is contained in:
2026-10-26 11:10:05 +08:00
co-authored by WorkBuddy
parent 38ee24f6ee
commit 27fb218c40
2 changed files with 21 additions and 20 deletions
+16 -13
View File
@@ -1499,11 +1499,12 @@ 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:
msg = _bom_qty_invalid(pairs)
if msg:
flash(msg, "error")
return render_template("order_form.html", boms=boms_all, factories=factories,
o=None, initial_lines=[[bid, qv] for bid, qv in pairs])
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)):
order_no = _gen_order_no()
@@ -1650,8 +1651,9 @@ 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")
msg = _bom_qty_invalid(pairs)
if msg:
flash(msg, "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
@@ -1788,15 +1790,16 @@ def _parse_bom_pairs(form):
def _bom_qty_invalid(pairs):
"""返回 pairs 中不符合『1–9 个位正整数』的 qty 列表; 空列表表示全部合法。
"""校验生产订单每个 BOM 的生产数量:必须为 >=1 的正整数(不含小数点, 不限位数)。
生产订单每个 BOM 的生产数量限定为个位正整数(1~9), 不允许 0、小数或超过个位。
返回错误描述字符串; 全部合法时返回 None。
"""
bad = []
for _, q in pairs:
if not (1 <= q <= 9 and float(q).is_integer()):
bad.append(q)
return bad
for bid, q in pairs:
if q is None or q < 1:
return f"BOM#{bid} 的生产数量需为不小于 1 的整数"
if abs(q - round(q)) > 1e-9:
return f"BOM#{bid} 的生产数量不可含小数点(需为整数)"
return None
def _find_posted_flows(order_no, material_id):