| | |
| | | .over-limit #selectedTotal { |
| | | color: #FF5722 !important; /* 红色警告 */ |
| | | } |
| | | |
| | | /* 订单完成状态 */ |
| | | .order-completed { |
| | | background: #5FB878 !important; |
| | | } |
| | | </style> |
| | | </head> |
| | | <body> |
| | |
| | | |
| | | <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> |
| | |
| | | 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', |
| | |
| | | // 初始化选中数量 |
| | | selectedTotal = 0; |
| | | updateSelectedTotal(); |
| | | |
| | | // 从后端获取数据后,默认自动勾选数据,勾选到和订单数量一致 |
| | | if (res.data.length > 0 && orderTotal > 0) { |
| | | // 延迟执行,确保表格渲染完成 |
| | | setTimeout(function() { |
| | | autoSelectItems(); |
| | | }, 100); |
| | | } |
| | | } |
| | | }); |
| | | |
| | |
| | | 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(); |
| | | |
| | | // 如果选中的数量超过订单数量,给出提示 |
| | |
| | | // 监听头工具栏事件 |
| | | 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('选中的数量已超过订单数量,是否继续?', { |
| | |
| | | } |
| | | }); |
| | | |
| | | // 自动勾选函数 - 勾选库存明细,数量累加不超过订单数量 |
| | | 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: { |
| | |
| | | } |
| | | |
| | | 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", |
| | |
| | | } |
| | | , 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 开启该代码可禁止点击该按钮关闭 |
| | | } |
| | | }); |
| | |
| | | }) |
| | | } |
| | | |
| | | 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({ |
| | |
| | | } 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> |