Laravel-9/JavaScript库存告警问题:动态行库存校验失效
问题描述
动态添加发票行时,库存数量校验逻辑异常:仅第一行会使用对应商品的库存值判断,后续新增行仍沿用第一行的库存数值。例如选择水泥(库存3)、钢材(库存10)后,输入钢材销售数量超过3时仍触发错误提示。需求是实现keyup/click触发校验,当销售数量大于对应商品库存时提示Selling Quantity is more than Quantity in Stock。
核心问题原因
原代码直接通过$('#current_stock_qty').val()获取全局库存输入框的值,而动态新增的发票行未绑定各自对应的商品库存数据,导致所有行复用同一个全局库存值。
解决方案
1. 调整Handlebars模板,为每行添加独立库存存储字段
修改模板,在每行中新增隐藏输入框,用于存储当前行对应商品的库存值,确保每行拥有独立的库存数据:
<script id="document-template" type="text/x-handlebars-template"> <td> <input type="number" min="1" class="form-control selling_qty text-right" name="selling_qty[]" value=""> <!-- 新增隐藏字段,存储当前行商品的库存 --> <input type="hidden" class="row_stock_qty" name="row_stock_qty[]" value=""> </td> <td> <input type="number" class="form-control unit_price text-right" name="unit_price[]" value=""> </td> </script>
2. 同步库存值到新增行的隐藏字段
在选择商品并新增发票行的逻辑中,将当前选中商品的库存值(即#current_stock_qty的值)同步到新行的隐藏字段中。示例代码如下(需根据你的实际新增行逻辑调整):
function addInvoiceRow() { var template = $('#document-template').html(); var html = Handlebars.compile(template)(); $('#addRow').append(html); // 将当前选中商品的库存赋值给新行的隐藏字段 var currentStock = $('#current_stock_qty').val(); $('#addRow tr:last').find('.row_stock_qty').val(currentStock); }
3. 修正库存校验的JS代码
修改校验逻辑,读取当前行内的独立库存值,不再依赖全局的#current_stock_qty:
<script type="text/javascript"> $(document).on('keyup click', '.unit_price,.selling_qty', function() { var $row = $(this).closest('tr'); // 获取当前行的库存值和销售数量 var current_stock_qty = $row.find('.row_stock_qty').val(); var selling_qty = $row.find('.selling_qty').val(); // 过滤空值或非数值的情况,避免逻辑错误 if (!selling_qty || isNaN(selling_qty) || !current_stock_qty || isNaN(current_stock_qty)) { return; } // 转换为整数后比较 selling_qty = parseInt(selling_qty); current_stock_qty = parseInt(current_stock_qty); if (current_stock_qty < selling_qty) { $.notify("Selling Quantity is more than Quantity in Stock", { globalPosition: 'top right', className: 'error' }); } }); </script>
内容的提问来源于stack exchange,提问作者Basharmal
相关产品推荐
相关产品推荐

