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:
@@ -1499,11 +1499,12 @@ def order_new():
|
|||||||
factory_id = int(fid_raw) if fid_raw.isdigit() else None
|
factory_id = int(fid_raw) if fid_raw.isdigit() else None
|
||||||
if not pairs:
|
if not pairs:
|
||||||
flash("请至少选择一个 BOM 并填写大于 0 的生产数量", "error")
|
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:
|
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()
|
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)):
|
if db.session.scalar(db.select(ProdOrder).where(ProdOrder.order_no == order_no)):
|
||||||
order_no = _gen_order_no()
|
order_no = _gen_order_no()
|
||||||
@@ -1650,8 +1651,9 @@ def order_edit(oid):
|
|||||||
flash("请至少选择一个 BOM 并填写大于 0 的生产数量", "error")
|
flash("请至少选择一个 BOM 并填写大于 0 的生产数量", "error")
|
||||||
return render_template("order_form.html", boms=boms_all, factories=factories,
|
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)])
|
o=o, initial_lines=[[b.id, q] for b, q in order_bom_lines(o)])
|
||||||
if _bom_qty_invalid(pairs):
|
msg = _bom_qty_invalid(pairs)
|
||||||
flash("每个 BOM 的生产数量需为 1–9 的个位正整数", "error")
|
if msg:
|
||||||
|
flash(msg, "error")
|
||||||
return render_template("order_form.html", boms=boms_all, factories=factories,
|
return render_template("order_form.html", boms=boms_all, factories=factories,
|
||||||
o=o, initial_lines=[[bid, qv] for bid, qv in pairs])
|
o=o, initial_lines=[[bid, qv] for bid, qv in pairs])
|
||||||
old_no = o.order_no
|
old_no = o.order_no
|
||||||
@@ -1788,15 +1790,16 @@ def _parse_bom_pairs(form):
|
|||||||
|
|
||||||
|
|
||||||
def _bom_qty_invalid(pairs):
|
def _bom_qty_invalid(pairs):
|
||||||
"""返回 pairs 中不符合『1–9 个位正整数』的 qty 列表; 空列表表示全部合法。
|
"""校验生产订单每个 BOM 的生产数量:必须为 >=1 的正整数(不含小数点, 不限位数)。
|
||||||
|
|
||||||
生产订单每个 BOM 的生产数量限定为个位正整数(1~9), 不允许 0、小数或超过个位。
|
返回错误描述字符串; 全部合法时返回 None。
|
||||||
"""
|
"""
|
||||||
bad = []
|
for bid, q in pairs:
|
||||||
for _, q in pairs:
|
if q is None or q < 1:
|
||||||
if not (1 <= q <= 9 and float(q).is_integer()):
|
return f"BOM#{bid} 的生产数量需为不小于 1 的整数"
|
||||||
bad.append(q)
|
if abs(q - round(q)) > 1e-9:
|
||||||
return bad
|
return f"BOM#{bid} 的生产数量不可含小数点(需为整数)"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _find_posted_flows(order_no, material_id):
|
def _find_posted_flows(order_no, material_id):
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<input name="order_no" value="{{ o.order_no if o else '' }}" placeholder="如 WO20260911xxx">
|
<input name="order_no" value="{{ o.order_no if o else '' }}" placeholder="如 WO20260911xxx">
|
||||||
|
|
||||||
<label>BOM 与生产数量 *</label>
|
<label>BOM 与生产数量 *</label>
|
||||||
<p class="small muted" style="margin:0 0 6px">可在同一订单中加入多个 BOM,每个 BOM 独立填写生产数量(限 <b>1–9 的个位正整数</b>);点击「+ 添加 BOM」增加一行,不需要的行可删除。</p>
|
<p class="small muted" style="margin:0 0 6px">可在同一订单中加入多个 BOM,每个 BOM 独立填写生产数量(限<b>正整数,不含小数点</b>,如 1、12、100);点击「+ 添加 BOM」增加一行,不需要的行可删除。</p>
|
||||||
<div id="bomRows" class="bom-rows"></div>
|
<div id="bomRows" class="bom-rows"></div>
|
||||||
<button type="button" class="btn" style="margin:2px 0 12px" onclick="addBomRow()">+ 添加 BOM</button>
|
<button type="button" class="btn" style="margin:2px 0 12px" onclick="addBomRow()">+ 添加 BOM</button>
|
||||||
|
|
||||||
@@ -36,18 +36,16 @@
|
|||||||
<option value="">-- 选择 BOM --</option>
|
<option value="">-- 选择 BOM --</option>
|
||||||
{% for b in boms %}<option value="{{ b.id }}">{{ b.code }}{% if b.name %} · {{ b.name }}{% endif %}</option>{% endfor %}
|
{% for b in boms %}<option value="{{ b.id }}">{{ b.code }}{% if b.name %} · {{ b.name }}{% endif %}</option>{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
<input name="qty[]" type="text" inputmode="numeric" maxlength="1" required placeholder="数量 1-9" style="width:110px" oninput="capQty(this)">
|
<input name="qty[]" type="text" inputmode="numeric" required placeholder="数量(整数)" style="width:130px" oninput="capQty(this)">
|
||||||
<button type="button" class="link-danger" onclick="this.closest('.bom-row').remove();checkRows()">删除</button>
|
<button type="button" class="link-danger" onclick="this.closest('.bom-row').remove();checkRows()">删除</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function capQty(el){
|
function capQty(el){
|
||||||
// 仅允许 1–9 的个位正整数: 去非数字、限制 1 位、超出范围清空
|
// 仅保留数字, 禁止小数点/负号, 允许多位正整数(不限位数)
|
||||||
var v = (el.value || '').replace(/[^0-9]/g, '');
|
var v = (el.value || '').replace(/[^\d]/g, '');
|
||||||
if (v.length > 1) v = v.slice(0, 1);
|
el.value = v === '' ? '' : String(parseInt(v, 10));
|
||||||
if (v !== '' && (parseInt(v, 10) < 1 || parseInt(v, 10) > 9)) v = '';
|
|
||||||
el.value = v;
|
|
||||||
}
|
}
|
||||||
function addBomRow(sel, qty){
|
function addBomRow(sel, qty){
|
||||||
var tpl = document.getElementById('bomTpl');
|
var tpl = document.getElementById('bomTpl');
|
||||||
|
|||||||
Reference in New Issue
Block a user