自动化立体仓库 - WMS系统
zwl
2025-11-21 893f659d3923a710273b1e180eea2bcf614df403
1.自动勾选
1个文件已修改
215 ■■■■■ 已修改文件
src/main/webapp/views/order/outLocDetlQuery.html 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/outLocDetlQuery.html
@@ -202,7 +202,6 @@
<script>
    var conditionXmSelect;
    var
    function getCol() {
        var cols = [
            {type: 'checkbox'}
@@ -297,6 +296,14 @@
                    // 初始化选中数量
                    selectedTotal = 0;
                    updateSelectedTotal();
                    // 从后端获取数据后,默认自动勾选数据,勾选到和订单数量一致
                    if (res.data.length > 0 && orderTotal > 0) {
                        // 延迟执行,确保表格渲染完成
                        setTimeout(function() {
                            autoSelectItems();
                        }, 100);
                    }
                }
            });
@@ -306,29 +313,30 @@
                var checked = obj.checked;
                var type = obj.type;
                if (type === 'one') {
                    // 单个选择
                    if (checked) {
                        selectedTotal += parseFloat(data.anfme || 0);
                    } else {
                        selectedTotal -= parseFloat(data.anfme || 0);
                    }
                } else if (type === 'all') {
                    // 全选
                    var checkStatus = table.checkStatus('stockOut');
                    if (checked) {
                        // 计算当前页所有数据的数量总和
                        checkStatus.data.forEach(function(item){
                            selectedTotal += parseFloat(item.anfme || 0);
                        });
                    } else {
                        // 取消全选,减去当前页所有数据的数量总和
                        checkStatus.data.forEach(function(item){
                            selectedTotal -= parseFloat(item.anfme || 0);
                        });
                    }
                // 确保window.autoSelectedData已初始化
                if (!window.autoSelectedData) {
                    window.autoSelectedData = [];
                }
                // 重新计算selectedTotal,确保与实际勾选状态一致
                var updateSelectedTotalFromCheckboxes = function() {
                    var checkStatus = table.checkStatus('stockOut');
                    selectedTotal = 0;
                    // 更新window.autoSelectedData,只保留实际勾选的数据
                    window.autoSelectedData = [];
                    // 重新计算选中总数和更新autoSelectedData
                    checkStatus.data.forEach(function(item) {
                        selectedTotal += parseFloat(item.anfme || 0);
                        window.autoSelectedData.push(item);
                    });
                };
                // 不管是单选还是全选,都重新计算实际勾选的数据和总数
                updateSelectedTotalFromCheckboxes();
                // 更新显示选中的数量
                updateSelectedTotal();
                // 如果选中的数量超过订单数量,给出提示
@@ -340,17 +348,20 @@
            // 监听头工具栏事件
            table.on('toolbar(stockOut)', function (obj) {
                var checkStatus = table.checkStatus(obj.config.id);
                var data = checkStatus.data;
                var data = checkStatus.data; // 这里只获取实际勾选的数据
                switch (obj.event) {
                    case 'autoSelect':
                        // 自动勾选功能
                        autoSelectItems();
                        break;
                    case 'confirm':
                        // 只使用界面上实际勾选的数据,不再额外整合window.autoSelectedData
                        // 检查是否有数据可提取
                        if (data.length === 0) {
                            layer.msg("请选择数据");
                            return;
                        }
                        // 检查选中的数量是否超过订单数量
                        if (selectedTotal > orderTotal) {
                            layer.confirm('选中的数量已超过订单数量,是否继续?', {
@@ -367,7 +378,7 @@
                }
            });
            // 自动勾选函数 - 修复版本:勾选库存明细,数量累加不超过订单数量
            // 自动勾选函数 - 勾选库存明细,数量累加不超过订单数量
            function autoSelectItems() {
                // 获取当前页所有数据
                var allData = table.cache.stockOut;
@@ -389,65 +400,102 @@
                // 重置选中数量
                selectedTotal = 0;
                // 初始化自动选中数据
                window.autoSelectedData = [];
                // 按顺序勾选库存明细,直到累计数量达到订单数量
                var remaining = orderTotal;
                var selectedCount = 0;
                // 对库位数据进行排序,优先选择相同库位的库存
                allData.sort(function(a, b) {
                    // 先按库位号排序
                    if (a.locNo !== b.locNo) {
                        return a.locNo.localeCompare(b.locNo);
                    }
                    // 再按批次排序
                    return a.batch.localeCompare(b.batch);
                });
                for (var i = 0; i < allData.length; i++) {
                    var itemQuantity = parseFloat(allData[i].anfme || 0);
                    var item = allData[i];
                    var itemAnfme = parseFloat(item.anfme || 0);
                    // 跳过数量为0或无效的项
                    if (itemQuantity <= 0) continue;
                    if (itemAnfme <= 0) {
                        continue; // 跳过数量为0的记录
                    }
                    // 如果剩余需求为0,停止勾选
                    if (remaining <= 0) break;
                    // 勾选该项
                    // 如果剩余数量大于等于当前项的数量,全部勾选
                    if (remaining >= itemAnfme) {
                    allData[i].LAY_CHECKED = true;
                    selectedTotal += itemQuantity;
                        selectedTotal += itemAnfme;
                        remaining -= itemAnfme;
                    selectedCount++;
                        window.autoSelectedData.push(item);
                    }
                    // 否则只勾选剩余部分(实际操作中,整个记录都会被勾选,但会在提交时处理数量)
                    else if (remaining > 0) {
                        allData[i].LAY_CHECKED = true;
                        selectedTotal += itemAnfme;
                        // 这里不修改item.anfme,因为这是表格显示的数据
                        remaining = 0;
                        selectedCount++;
                        window.autoSelectedData.push(item);
                    } else {
                        break; // 已满足订单数量,停止勾选
                    }
                    // 更新剩余需求
                    remaining = orderTotal - selectedTotal;
                    // 如果勾选后超过订单数量,给出提示并停止勾选
                    if (selectedTotal > orderTotal) {
                        layer.msg('警告:自动勾选后数量超过订单数量,已停止勾选', {icon: 2, time: 3000});
                    // 如果已经满足订单数量,停止勾选
                    if (remaining <= 0) {
                        break;
                    }
                }
                // 更新表格显示 - 只调用一次
                table.reload('stockOut', {
                    data: allData,
                    done: function() {
                        // 在表格重载完成后,手动更新复选框的DOM状态
                        setTimeout(function() {
                            for (var i = 0; i < allData.length; i++) {
                                if (allData[i].LAY_CHECKED) {
                                    var trElem = $('tr[data-index="' + i + '"]');
                                    if (trElem.length > 0) {
                                        // 操作复选框
                                        trElem.find('input[type="checkbox"]').prop('checked', true);
                                        trElem.find('.layui-form-checkbox').addClass('layui-form-checked');
                                    }
                                }
                            }
                            // 重新渲染表单
                            form.render('checkbox');
                            // 更新显示
                            updateSelectedTotal();
                            if (selectedCount > 0) {
                                layer.msg('已自动勾选 ' + selectedCount + ' 个库存明细,数量: ' + selectedTotal, {icon: 1, time: 2000});
                // 不重新加载表格,直接更新表格的勾选状态
                var checkStatus = table.checkStatus('stockOut');
                // 遍历表格行并设置勾选状态
                $('.layui-table-box tr').each(function(index, tr) {
                    var rowIndex = $(tr).data('index');
                    if (rowIndex !== undefined && allData[rowIndex]) {
                        var checkbox = $(tr).find('input[type="checkbox"]');
                        checkbox.prop('checked', allData[rowIndex].LAY_CHECKED);
                        // 同步layui的勾选状态样式
                        if (allData[rowIndex].LAY_CHECKED) {
                            $(tr).addClass('layui-table-click');
                            checkbox.next().addClass('layui-form-checked');
                            } else {
                                layer.msg('没有可勾选的库存明细', {icon: 2});
                            $(tr).removeClass('layui-table-click');
                            checkbox.next().removeClass('layui-form-checked');
                            }
                        }, 100);
                    }
                });
                // 同步全选框状态
                var headerCheckbox = $('.layui-table-header input[type="checkbox"]');
                var allChecked = allData.length > 0;
                for (var i = 0; i < allData.length; i++) {
                    if (!allData[i].LAY_CHECKED) {
                        allChecked = false;
                        break;
                    }
                }
                headerCheckbox.prop('checked', allChecked);
                if (allChecked) {
                    headerCheckbox.next().addClass('layui-form-checked');
                } else {
                    headerCheckbox.next().removeClass('layui-form-checked');
                }
                // 更新显示选中的数量
                updateSelectedTotal();
                // 如果没有勾选足够的数据,给出提示
                if (selectedTotal < orderTotal && selectedCount > 0) {
                    layer.msg('已选择全部可用库存,但仍未满足订单数量!', {icon: 2, time: 3000});
                } else if (selectedCount === 0) {
                    layer.msg('没有可勾选的数据,请检查库存!', {icon: 2, time: 3000});
                } else {
                    layer.msg('自动勾选完成,已勾选 ' + selectedCount + ' 条记录!', {icon: 1, time: 2000});
                }
            }
            conditionXmSelect = xmSelect.render({
                el: '#condition',
@@ -494,11 +542,20 @@
            }
            function pakoutPreview(id, data) {
                // 确保传入的数据有效
                if (!data || data.length === 0) {
                    layer.msg("请选择数据");
                    return;
                }
                // 存储实际勾选的数据到全局变量,用于出库操作
                window.selectedDataForPakout = data;
                console.log("id=" + id)
                let loadIndex = layer.load(2);
                var da = {
                    "id": JSON.stringify(id),
                    "list": data
                    "list": data // 只使用实际勾选的数据
                }
                $.ajax({
                    url: baseUrl + "/out/pakout/preview/auth1",
@@ -657,11 +714,14 @@
                                }
                                , yes: function (index, layero) {
                                    //按钮【立即出库】的回调
                                    pakout(tableCache, index);
                                    // 不再传递tableCache,pakout函数将使用window.selectedDataForPakout
                                    pakout(index);
                                }
                                , btn2: function (index, layero) {
                                    //按钮【稍后处理】的回调
                                    layer.close(index)
                                    // 清理全局变量
                                    window.selectedDataForPakout = null;
                                    //return false 开启该代码可禁止点击该按钮关闭
                                }
                            });
@@ -674,7 +734,19 @@
                })
            }
            function pakout(tableCache, layerIndex) {
            function pakout(layerIndex) {
                // 获取存储的实际勾选数据
                var tableCache = window.selectedDataForPakout;
                // 确保传入的数据有效
                if (!tableCache || tableCache.length === 0) {
                    layer.msg("没有有效的数据可处理", {icon: 2});
                    return;
                }
                // 重置自动选中的数据,避免数据残留
                window.autoSelectedData = [];
                // let loadIndex = layer.load(2);
                notice.msg('正在生成出库任务......', {icon: 4});
                $.ajax({
@@ -725,11 +797,20 @@
                        } else {
                            layer.msg(res.msg, {icon: 2})
                        }
                    },
                    error: function () {
                        notice.destroy();
                        layer.msg('网络错误,请稍后重试', {icon: 2});
                    }
                });
                // 清理全局变量
                window.selectedDataForPakout = null;
            }
            window.pakoutPreview = pakoutPreview;
            // 初始化自动选中数据变量,确保页面加载时被正确初始化
            window.autoSelectedData = null;
        })
</script>
</html>