自动化立体仓库 - WMS系统
zwl
2025-11-21 d8b7e1ccee37e96e71c9072e53bc6fc736cdad2a
src/main/webapp/views/order/outLocDetlQuery.html
@@ -75,6 +75,11 @@
        .over-limit #selectedTotal {
            color: #FF5722 !important; /* 红色警告 */
        }
        /* 订单完成状态 */
        .order-completed {
            background: #5FB878 !important;
        }
    </style>
</head>
<body>
@@ -126,14 +131,9 @@
                <input class="layui-input" type="text" name="batch" placeholder="批号" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="brand" placeholder="生产线" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="sku" placeholder="等级" autocomplete="off">
        <div class="layui-input-inline" style="margin-right: 100px;">
            <div id="condition" name="condition">
            </div>
        </div>
        <!-- 日期范围 -->
@@ -154,6 +154,7 @@
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn" id="btn-auto-select" lay-event="autoSelect">自动勾选</button>
        <button class="layui-btn" id="btn-confirm" lay-event="confirm" style="">提取</button>
    </div>
</script>
@@ -200,9 +201,10 @@
</script>
<script>
    var conditionXmSelect;
    function getCol() {
        var cols = [
            {type: 'checkbox', merge: ['locNo']}
            {type: 'checkbox'}
            , {field: 'locNo', align: 'center', title: '库位号', merge: true, style: 'font-weight: bold'}
            // ,{field: 'locNo$', align: 'center',title: '库位号'}
        ];
@@ -217,7 +219,7 @@
    }).extend({
        notice: 'notice/notice',
    })
        .use(['table', 'notice', 'laydate', 'form', 'admin', 'tableMerge'], function () {
        .use(['table', 'notice', 'laydate', 'form', 'admin', 'tableMerge','xmSelect'], function () {
            var table = layui.table;
            var $ = layui.jquery;
            var layer = layui.layer;
@@ -226,6 +228,7 @@
            var admin = layui.admin;
            var tableMerge = layui.tableMerge;
            var notice = layui.notice;
            var xmSelect = layui.xmSelect;
            $('#matnr').val(parent.matnR);
            $('#anfme').val(parent.anfme);
@@ -264,7 +267,7 @@
                url: baseUrl + '/stock/out/list/auth',
                where: {matnr: parent.matnR[0]},
                page: true,
                limits: [16, 30, 50, 100, 200, 500],
                limits: [50, 100, 200, 500],
                limit: 16,
                even: true,
                toolbar: '#toolbar',
@@ -293,6 +296,14 @@
                    // 初始化选中数量
                    selectedTotal = 0;
                    updateSelectedTotal();
                    // 从后端获取数据后,默认自动勾选数据,勾选到和订单数量一致
                    if (res.data.length > 0 && orderTotal > 0) {
                        // 延迟执行,确保表格渲染完成
                        setTimeout(function() {
                            autoSelectItems();
                        }, 100);
                    }
                }
            });
@@ -302,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();
                // 如果选中的数量超过订单数量,给出提示
@@ -336,13 +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('选中的数量已超过订单数量,是否继续?', {
@@ -358,6 +377,145 @@
                        break;
                }
            });
            // 自动勾选函数 - 勾选库存明细,数量累加不超过订单数量
            function autoSelectItems() {
                // 获取当前页所有数据
                var allData = table.cache.stockOut;
                if (!allData || allData.length === 0) {
                    layer.msg("没有可勾选的数据", {icon: 2});
                    return;
                }
                // 如果订单数量为0,不需要勾选
                if (orderTotal <= 0) {
                    layer.msg("订单数量为0,无需勾选", {icon: 2});
                    return;
                }
                // 先取消所有已选中的项
                for (var i = 0; i < allData.length; i++) {
                    allData[i].LAY_CHECKED = false;
                }
                // 重置选中数量
                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 item = allData[i];
                    var itemAnfme = parseFloat(item.anfme || 0);
                    if (itemAnfme <= 0) {
                        continue; // 跳过数量为0的记录
                    }
                    // 如果剩余数量大于等于当前项的数量,全部勾选
                    if (remaining >= itemAnfme) {
                        allData[i].LAY_CHECKED = true;
                        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; // 已满足订单数量,停止勾选
                    }
                    // 如果已经满足订单数量,停止勾选
                    if (remaining <= 0) {
                        break;
                    }
                }
                // 不重新加载表格,直接更新表格的勾选状态
                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 {
                            $(tr).removeClass('layui-table-click');
                            checkbox.next().removeClass('layui-form-checked');
                        }
                    }
                });
                // 同步全选框状态
                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',
                style: {
                    width: '200px',
                },
                autoRow: true,
                toolbar: {show: true},
                filterable: true,
                data: [
                    {
                        name: '成品智能立库',
                        value: '成品智能立库'
                    },
                    {
                        name: '特采智能立库',
                        value: '特采智能立库'
                    }
                ]
            })
            // 搜索栏搜索事件
            form.on('submit(search)', function (data) {
@@ -384,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",
@@ -547,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 开启该代码可禁止点击该按钮关闭
                                }
                            });
@@ -564,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({
@@ -615,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>