自动化立体仓库 - WMS系统
zwl
2026-01-15 2b80cfa1ea7b8f177cc53e1ed3299e4db3ecac1d
src/main/webapp/views/order/outLocDetlQuery.html
@@ -186,6 +186,32 @@
    </div>
</script>
<!-- 批量选择出库站弹窗模板 -->
<script type="text/html" id="staBatchSelectDialog">
    <div style="padding: 20px;">
        <form class="layui-form" id="batchSelectStaBox">
            <!-- 下拉框将通过Handlebars模板动态渲染 -->
        </form>
        <div style="text-align: center; margin-top: 20px;">
            <button class="layui-btn layui-btn-sm" lay-submit lay-filter="staBatchSelectConfirm">确认</button>
        </div>
    </div>
</script>
<!-- 批量选择出库站下拉框模板 -->
<script type="text/html" id="batchStaSelectTpl">
    <div class="layui-form-item">
        <label class="layui-form-label">出库站</label>
        <div class="layui-input-block">
            <select name="batchSta" lay-filter="batchSta" lay-search>
                {{#each list}}
                <option value="{{this}}">{{this}}</option>
                {{/each}}
            </select>
        </div>
    </div>
</script>
<script type="text/html" id="tbBasicTbStaNos">
    <div class="ew-select-fixed">
        <select class="order-sta-select" lay-filter="tbBasicTbStaNos">
@@ -267,7 +293,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',
@@ -312,31 +338,30 @@
                var data = obj.data;
                var checked = obj.checked;
                var type = obj.type;
                // 确保window.autoSelectedData已初始化
                if (!window.autoSelectedData) {
                    window.autoSelectedData = [];
                console.log("data"+data.batch)
                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);
                        });
                    }
                }
                // 重新计算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();
                // 如果选中的数量超过订单数量,给出提示
@@ -407,47 +432,39 @@
                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);
                });
                // 使用原始顺序的副本,从第一页第一个开始勾选
                var sortedData = allData.slice();
                for (var i = 0; i < allData.length; i++) {
                    var item = allData[i];
                // 选择集合(使用唯一键避免索引错乱)
                var selectionKeys = {};
                for (var i = 0; i < sortedData.length; i++) {
                    var item = sortedData[i];
                    var itemAnfme = parseFloat(item.anfme || 0);
                    if (itemAnfme <= 0) {
                        continue; // 跳过数量为0的记录
                    }
                    // 如果剩余数量大于等于当前项的数量,全部勾选
                    if (itemAnfme <= 0) continue;
                    var key = (item.locNo || '') + '|' + (item.batch || '') + '|' + (item.matnr || '') + '|' + (item.anfme || 0);
                    if (remaining >= itemAnfme) {
                        allData[i].LAY_CHECKED = true;
                        selectedTotal += itemAnfme;
                        selectionKeys[key] = true;
                        remaining -= itemAnfme;
                        selectedCount++;
                        window.autoSelectedData.push(item);
                    }
                    // 否则只勾选剩余部分(实际操作中,整个记录都会被勾选,但会在提交时处理数量)
                    else if (remaining > 0) {
                        allData[i].LAY_CHECKED = true;
                        selectedTotal += itemAnfme;
                        // 这里不修改item.anfme,因为这是表格显示的数据
                    } else if (remaining > 0) {
                        selectionKeys[key] = true;
                        remaining = 0;
                        selectedCount++;
                        window.autoSelectedData.push(item);
                    } else {
                        break; // 已满足订单数量,停止勾选
                    }
                    // 如果已经满足订单数量,停止勾选
                    if (remaining <= 0) {
                        break;
                    } else {
                        break;
                    }
                }
                // 根据选择集合同步原始数据的勾选标记,并重新计算选中数量
                selectedTotal = 0;
                for (var i = 0; i < allData.length; i++) {
                    var k = (allData[i].locNo || '') + '|' + (allData[i].batch || '') + '|' + (allData[i].matnr || '') + '|' + (allData[i].anfme || 0);
                    allData[i].LAY_CHECKED = !!selectionKeys[k];
                    if (allData[i].LAY_CHECKED) {
                        selectedTotal += parseFloat(allData[i].anfme || 0);
                    }
                }
@@ -580,9 +597,6 @@
                                , moveType: 1 //拖拽模式,0或者1
                                , content: $('#pakoutPreviewBox').html()
                                , success: function (layero, index) {
                                    res.data.forEach((item, index) => {
                                        console.log(`项 ${index + 1}:`, item);
                                    });
                                    stoPreTabIdx = table.render({
                                        elem: '#stoPreTab1',
                                        data: res.data,
@@ -590,8 +604,10 @@
                                        page: false,
                                        limit: Number.MAX_VALUE,
                                        cellMinWidth: 100,
                                        // cols必须使用二维数组格式,这是layui table的标准配置
                                        cols: [[
                                            // {type: 'checkbox', merge: ['orderNo']},
                                            // 将复选框列放在第一列,便于用户操作和tableMerge处理
                                            {field: 'orderNo', title: '单据编号', merge: true, align: 'center'},
                                            {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                                            {field: 'batch', title: '批号', align: 'center'},
@@ -607,6 +623,7 @@
                                                title: '货位',
                                                align: 'center',
                                                width: 100,
                                                merge: ['locNo'],
                                                templet: '#locNoTpl'
                                            },
                                            {
@@ -616,7 +633,7 @@
                                                merge: ['locNo'],
                                                templet: '#tbBasicTbStaNos'
                                            },
                                            {type: 'checkbox', merge: ['locNo']},
                                            {type: 'checkbox'}
                                        ]],
                                        done: function (res) {
                                            tableMerge.render(this);
@@ -638,7 +655,30 @@
                                    });
                                    // 批量修改出库站
                                    form.on('submit(batchModifySta)', function () {
                                        let stoPreTabData = layui.table.checkStatus('stoPreTab1').data;
                                        // 获取选中的数据,兼容合并行的情况
                                        let checkStatus = table.checkStatus('stoPreTab1');
                                        let stoPreTabData = checkStatus.data;
                                        // 如果checkStatus返回的数据为空,尝试从tableCache中获取
                                        if (stoPreTabData.length === 0) {
                                            // 遍历tableCache,找出所有选中的行及其合并行
                                            let checkedLocNos = [];
                                            // 首先找出所有被选中的行的locNo
                                            tableCache.forEach(function(item) {
                                                if (item.LAY_CHECKED === true) {
                                                    checkedLocNos.push(item.locNo);
                                                }
                                            });
                                            // 去重
                                            checkedLocNos = [...new Set(checkedLocNos)];
                                            // 根据locNo过滤出所有相关的行
                                            stoPreTabData = tableCache.filter(function(item) {
                                                return checkedLocNos.includes(item.locNo);
                                            });
                                        }
                                        if (stoPreTabData.length < 1) {
                                            layer.msg("请至少选择一条以上合并数据", {icon: 7});
                                            return false;
@@ -663,6 +703,11 @@
                                                }
                                            }
                                        }
                                        // 添加调试信息
                                        console.log('staBatchSelectVal:', staBatchSelectVal);
                                        console.log('staBatchSelectVal类型:', Array.isArray(staBatchSelectVal) ? '数组' : '非数组');
                                        console.log('staBatchSelectVal长度:', staBatchSelectVal.length);
                                        if (staBatchSelectVal.length === 0) {
                                            layer.msg("出库站没有交集,无法批量修改", {icon: 2});
                                            return;
@@ -674,21 +719,56 @@
                                            title: '请选择站点',
                                            content: $('#staBatchSelectDialog').html(),
                                            success: function (layero, ddIndex) {
                                                // 渲染下拉框
                                                let template = Handlebars.compile($('#batchStaSelectTpl').html());
                                                $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
                                                // 直接使用原生方式创建select元素,不依赖Handlebars模板
                                                let selectHtml = '<div class="layui-form-item">';
                                                selectHtml += '<label class="layui-form-label">出库站</label>';
                                                selectHtml += '<div class="layui-input-block">';
                                                selectHtml += '<select name="batchSta" lay-filter="batchSta" lay-search>';
                                                // 手动遍历数组创建option
                                                staBatchSelectVal.forEach(function(staNo) {
                                                    selectHtml += '<option value="' + staNo + '">' + staNo + '</option>';
                                                });
                                                selectHtml += '</select>';
                                                selectHtml += '</div>';
                                                selectHtml += '</div>';
                                                // 直接插入HTML
                                                $(layero).find('#batchSelectStaBox').html(selectHtml);
                                                // 渲染表单
                                                layui.form.render('select');
                                                // 确认
                                                form.on('submit(staBatchSelectConfirm)', function (obj) {
                                                    let loadIdx = layer.load(2);
                                                    let batchSta = Number(obj.field.batchSta);
                                                    // 直接从DOM中获取选中的站点值,确保能正确获取到
                                                    let batchSta = $(layero).find('select[name="batchSta"]').val();
                                                    console.log('批量修改的站点值:', batchSta);
                                                    let arr = [];
                                                    for (let j = 0; j < stoPreTabData.length; j++) {
                                                    // 简化更新逻辑,直接更新所有选中的数据
                                                    stoPreTabData.forEach(function(preItem) {
                                                        for (let i = 0; i < tableCache.length; i++) {
                                                            if (tableCache[i].orderNo === stoPreTabData[j].orderNo
                                                                && tableCache[i].matnr === stoPreTabData[j].matnr
                                                                && tableCache[i].locNo === stoPreTabData[j].locNo) {
                                                            // 只根据locNo进行匹配,因为表格中locNo是合并单元格的关键字段
                                                            if (tableCache[i].locNo === preItem.locNo) {
                                                                tableCache[i]['staNo'] = batchSta;
                                                                arr.push(i);
                                                                console.log('更新了数据索引:', i, '站点值:', batchSta);
                                                            }
                                                        }
                                                    });
                                                    // 如果没有找到匹配项,尝试直接更新选中的数据
                                                    if (arr.length === 0) {
                                                        console.log('未找到匹配项,尝试直接更新');
                                                        // 直接遍历tableCache,更新所有LAY_CHECKED为true的项
                                                        for (let i = 0; i < tableCache.length; i++) {
                                                            if (tableCache[i].LAY_CHECKED === true) {
                                                                tableCache[i]['staNo'] = batchSta;
                                                                arr.push(i);
                                                                console.log('直接更新了选中的数据索引:', i);
                                                            }
                                                        }
                                                    }
@@ -706,7 +786,6 @@
                                                });
                                                // 弹窗不出现滚动条
                                                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                                                layui.form.render('select');
                                            },
                                        })
                                    }
@@ -715,6 +794,7 @@
                                , yes: function (index, layero) {
                                    //按钮【立即出库】的回调
                                    // 不再传递tableCache,pakout函数将使用window.selectedDataForPakout
                                    window.selectedDataForPakout = tableCache;
                                    pakout(index);
                                }
                                , btn2: function (index, layero) {
@@ -813,4 +893,4 @@
            window.autoSelectedData = null;
        })
</script>
</html>
</html>