From 2b80cfa1ea7b8f177cc53e1ed3299e4db3ecac1d Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期四, 15 一月 2026 09:47:42 +0800
Subject: [PATCH] 完善销售订单出库自动勾选

---
 src/main/webapp/views/order/outLocDetlQuery.html |  222 +++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 151 insertions(+), 71 deletions(-)

diff --git a/src/main/webapp/views/order/outLocDetlQuery.html b/src/main/webapp/views/order/outLocDetlQuery.html
index c8535ef..39ca5e6 100644
--- a/src/main/webapp/views/order/outLocDetlQuery.html
+++ b/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 = [];
-
-                    // 閲嶆柊璁$畻閫変腑鎬绘暟鍜屾洿鏂癮utoSelectedData
-                    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;
-                        // 杩欓噷涓嶄慨鏀筰tem.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蹇呴』浣跨敤浜岀淮鏁扮粍鏍煎紡锛岃繖鏄痩ayui table鐨勬爣鍑嗛厤缃�
                                         cols: [[
-                                            // {type: 'checkbox', merge: ['orderNo']},
+                                            // 灏嗗閫夋鍒楁斁鍦ㄧ涓�鍒楋紝渚夸簬鐢ㄦ埛鎿嶄綔鍜宼ableMerge澶勭悊
+
                                             {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杩斿洖鐨勬暟鎹负绌猴紝灏濊瘯浠巘ableCache涓幏鍙�
+                                        if (stoPreTabData.length === 0) {
+                                            // 閬嶅巻tableCache锛屾壘鍑烘墍鏈夐�変腑鐨勮鍙婂叾鍚堝苟琛�
+                                            let checkedLocNos = [];
+                                            // 棣栧厛鎵惧嚭鎵�鏈夎閫変腑鐨勮鐨刲ocNo
+                                            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);
+                                                    // 鐩存帴浠嶥OM涓幏鍙栭�変腑鐨勭珯鐐瑰�硷紝纭繚鑳芥纭幏鍙栧埌
+                                                    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) {
+                                                            // 鍙牴鎹甽ocNo杩涜鍖归厤锛屽洜涓鸿〃鏍间腑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锛屾洿鏂版墍鏈塋AY_CHECKED涓簍rue鐨勯」
+                                                        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) {
                                     //鎸夐挳銆愮珛鍗冲嚭搴撱�戠殑鍥炶皟
                                     // 涓嶅啀浼犻�抰ableCache锛宲akout鍑芥暟灏嗕娇鐢╳indow.selectedDataForPakout
+                                    window.selectedDataForPakout = tableCache;
                                     pakout(index);
                                 }
                                 , btn2: function (index, layero) {
@@ -813,4 +893,4 @@
             window.autoSelectedData = null;
         })
 </script>
-</html>
\ No newline at end of file
+</html>

--
Gitblit v1.9.1