From 268e41b540b945c7dbc414f621d092d298d6a9c6 Mon Sep 17 00:00:00 2001 From: hayu <1604366271@qq.com> Date: Tue, 3 Feb 2026 14:55:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=8F=91=E8=B4=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/aq_demand_plan/child/apply_plan_detail.js | 7 +- js/aq_demand_plan/child/send_out_detail.js | 175 ++++++++++----- js/aq_demand_plan/child/send_out_edit_form.js | 10 +- .../child/send_out_supplement.js | 202 ++++-------------- .../aq_demand_plan/child/send_out_detail.html | 27 +++ .../child/send_out_supplemen.html | 2 +- 6 files changed, 200 insertions(+), 223 deletions(-) diff --git a/js/aq_demand_plan/child/apply_plan_detail.js b/js/aq_demand_plan/child/apply_plan_detail.js index 021c959..63b2b09 100644 --- a/js/aq_demand_plan/child/apply_plan_detail.js +++ b/js/aq_demand_plan/child/apply_plan_detail.js @@ -289,7 +289,7 @@ function setOperRecordInfo(list, obj) { '' + '
' + '
' + - '' + item.auditName + '(' + item.phone + ')' + dept + '' + + '' + formatEmptyValue(item.auditName) + '(' + formatEmptyValue(item.phone) + ')' + formatEmptyValue(dept) + '' + '
' + '
' + '' + operData + '' + @@ -308,6 +308,11 @@ function setOperRecordInfo(list, obj) { $('.layui-timeline').empty().append(html); } +function formatEmptyValue(value) { + // 覆盖所有非正常数据:null/undefined/''/0/NaN/false 等 + return (value === null || value === undefined || value === '' || isNaN(value) && typeof value === 'number') ? '' : String(value); +} + // 设置计划编号/审核状态 function setCheckStatus(obj) { $('#code').empty().html(obj.code); diff --git a/js/aq_demand_plan/child/send_out_detail.js b/js/aq_demand_plan/child/send_out_detail.js index 77ae94e..7276515 100644 --- a/js/aq_demand_plan/child/send_out_detail.js +++ b/js/aq_demand_plan/child/send_out_detail.js @@ -1,4 +1,6 @@ let objParam, dataObj; +let batchData = {}; +let currentBatch = ''; let form, table, upload, tableIns, layer; let pageNum = 1; @@ -70,19 +72,91 @@ function getPurchaseDetailsList() { 'id': objParam.id }) }; - let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList'; + let url = dataUrl + 'backstage/purchase/getPurchaseDetailsListBatch'; ajaxRequest(url, "POST", params, true, function () { }, function (result) { console.error(result); if (result.code === 200) { dataObj = result.data; - setBaseTable(result.data); + // 新增:处理批次数据并生成标签 + console.log("数据:",result.data) + handleBatchData(result.data); + // 默认显示第一批次数据 + if (currentBatch) { + setBaseTable(batchData[currentBatch]); + } else { + let allData = mergeAllBatchData(result.data); + setBaseTable(allData); + } } }, function (xhr, status, error) { errorFn(xhr, status, error) }, null); } +// 新增:处理批次数据,生成批次标签 +function handleBatchData(data) { + // 1. 批次按外层数组索引区分(第1批次、第2批次...) + let batchCount = data.length; + if (batchCount === 0) { + $('#batch-tabs').html('
暂无批次数据
'); + return; + } + + // 2. 构建批次数据映射(key:批次号,value:该批次的batchList数据) + batchData = {}; + data.forEach((item, index) => { + let batchNum = index + 1; // 批次号从1开始 + batchData[batchNum] = item.batchList || []; + }); + + // 3. 生成批次标签HTML + let tabHtml = ''; + for (let i = 1; i <= batchCount; i++) { + let batchName = `第${i}批次`; + let isActive = i === 1 ? 'active' : ''; // 默认选中第一个批次 + if (i === 1) { + currentBatch = i; // 默认选中第一个批次 + } + tabHtml += `
${batchName}
`; + } + + // 4. 渲染标签并绑定点击事件 + $('#batch-tabs').html(tabHtml); + $('.batch-tab').click(function () { + // 切换激活状态 + $('.batch-tab').removeClass('active'); + $(this).addClass('active'); + // 获取选中的批次 + currentBatch = $(this).data('batch'); + // 筛选对应批次的数据并渲染表格 + setBaseTable(batchData[currentBatch] || []); + // 重置搜索框 + resetSearch(); + }); +} + +// 新增:合并所有批次数据(用于无批次选中时显示) +function mergeAllBatchData(data) { + let allData = []; + data.forEach(item => { + if (item.batchList && item.batchList.length > 0) { + allData = allData.concat(item.batchList); + } + }); + return allData; +} + +// 新增:根据批次筛选数据 +function filterDataByBatch(originalData, batch) { + if (!batch || !originalData || originalData.length === 0) { + return mergeAllBatchData(originalData); + } + // 返回指定批次的batchList数据 + let batchIndex = batch - 1; // 转换为数组索引 + return originalData[batchIndex]?.batchList || []; +} + // 供应商信息赋值 function setSubInfos(list) { $('#supplier-table-box tbody tr:not(:first)').remove(); @@ -141,71 +215,63 @@ function handleFileType(value) { // 查询 function search() { - let keyWord = $('#name').val(); - let keyWord2 = $('#model').val(); + let keyWord = $('#name').val().trim(); + let keyWord2 = $('#model').val().trim(); + // 获取当前批次的数据源 + let currentData = currentBatch ? filterDataByBatch(dataObj, currentBatch) : mergeAllBatchData(dataObj); + if (!keyWord && !keyWord2) { - setBaseTable(dataObj); - } else if (keyWord && !keyWord2) { - let dataList = dataObj.filter(item => { - return item.name.indexOf(keyWord) > -1; - }) - setBaseTable(dataList); - } else if (!keyWord && keyWord2) { - let dataList = dataObj.filter(item => { - return item.model.indexOf(keyWord2) > -1; - }) - setBaseTable(dataList); - } else if (keyWord && keyWord2) { - let dataList = dataObj.filter(item => { - return item.name.indexOf(keyWord) > -1 && item.model.indexOf(keyWord2) > -1; - }) - setBaseTable(dataList); + setBaseTable(currentData); + return; } + + // 筛选逻辑(适配batchList中的字段) + let filteredList = currentData.filter(item => { + let nameMatch = true; + let modelMatch = true; + + if (keyWord && item.name) { + nameMatch = item.name.indexOf(keyWord) > -1; + } + if (keyWord2 && item.model) { + modelMatch = item.model.indexOf(keyWord2) > -1; + } + + return nameMatch && modelMatch; + }); + + setBaseTable(filteredList); } // 重置 function resetSearch() { $('#name').val(''); $('#model').val(''); - setBaseTable(dataObj); + // 重置时显示当前批次的完整数据 + let currentData = currentBatch ? filterDataByBatch(dataObj, currentBatch) : mergeAllBatchData(dataObj); + setBaseTable(currentData); } function setBaseTable(results) { let html = ""; if (results && results.length > 0) { - for (var i = 0; i < results.length; i++) { - var l = results[i]; - let list = l.supList; - $.each(list, function (index, item) { - if (index === 0) { - html += ""; - html += "" - + (i + 1) + ""; - html += "" + l.type + ""; - html += "" + l.name + ""; - html += "" + l.model + ""; - html += "" + l.unit + ""; - html += "" + l.needNum + ""; - html += "" + item.cgNum + ""; - html += "" + item.lkNum + ""; - html += "" + item.supName + ""; - html += "" + item.ccDay + ""; - html += "" + item.jyDay + ""; - html += "" + item.remark + ""; - html += ""; - } else { - html += ""; - html += "" + item.cgNum + ""; - html += "" + item.lkNum + ""; - html += "" + item.supName + ""; - html += "" + item.ccDay + ""; - html += "" + item.jyDay + ""; - html += "" + item.remark + ""; - html += ""; - } - }) - } + results.forEach((item, index) => { + html += ""; + html += "" + (index + 1) + ""; + html += "" + (item.type || '') + ""; + html += "" + (item.name || '') + ""; + html += "" + (item.model || '') + ""; + html += "" + (item.unit || '') + ""; + html += "" + (item.needNum || '') + ""; + html += "" + (item.cgNum || '') + ""; + html += "" + (item.lkNum || '') + ""; + html += "" + (item.supName || '') + ""; // 无数据则显示空 + html += "" + (item.ccDay || '') + ""; + html += "" + (item.jyDay || '') + ""; + html += "" + (item.remark || '') + ""; + html += ""; + }); } else { html += "没有相关数据"; } @@ -222,7 +288,8 @@ function exportExcel() { let params = { 'name': $('#name').val(), 'model': $('#model').val(), - 'id': objParam.id + 'id': objParam.id, + 'batch': currentBatch // 传递当前选中批次 } let url = dataUrl + "backstage/purchase/exportDetailsList"; exportExcelUtil(url, '采购发货明细', JSON.stringify(params)); diff --git a/js/aq_demand_plan/child/send_out_edit_form.js b/js/aq_demand_plan/child/send_out_edit_form.js index 5d36927..c5a8de7 100644 --- a/js/aq_demand_plan/child/send_out_edit_form.js +++ b/js/aq_demand_plan/child/send_out_edit_form.js @@ -46,10 +46,10 @@ function setParams(obj) { } $('.supplier' + modelId + '').each(function (index, item) { let id = $(this).find('option:checked').val(); - if (id && id === value && !($(data.elem).is($(this)))) { - $(data.elem).val(''); - return layer.msg('请勿重复选择供应商', { icon: 7 }); - } + // if (id && id === value && !($(data.elem).is($(this)))) { + // $(data.elem).val(''); + // return layer.msg('请勿重复选择供应商', { icon: 7 }); + // } }) } }); @@ -143,7 +143,7 @@ function getPurchaseDetailsList() { let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList'; ajaxRequest(url, "POST", params, true, function () { }, function (result) { - console.error(result); + console.error("发货明细:",result); if (result.code === 200) { setBaseTable(result.data); } diff --git a/js/aq_demand_plan/child/send_out_supplement.js b/js/aq_demand_plan/child/send_out_supplement.js index 5867d55..f1ae26a 100644 --- a/js/aq_demand_plan/child/send_out_supplement.js +++ b/js/aq_demand_plan/child/send_out_supplement.js @@ -5,7 +5,6 @@ let pageNum = 1, tableIns; let supplierList = []; let delSupIdArr = []; // 存储原始采购量/利库量(用于灵活校验,独立于DOM元素) -let originalCgLkMap = new Map(); // key: modelId_index, value: {originalCgNum: 0, originalLkNum: 0} // 设置参数初始化 function setParams(obj) { @@ -24,15 +23,7 @@ function setParams(obj) { // 渲染日期选择器(只读状态,不可修改) laydate.render({ elem: '#fhDay', - trigger: 'none' // 禁止触发日期选择 - }); - laydate.render({ - elem: '.cjDate', - trigger: 'none' - }); - laydate.render({ - elem: '.jyDate', - trigger: 'none' + trigger: 'click' }); form.verify(); @@ -128,13 +119,11 @@ function getPurchaseDetailsList() { 'id': objParam.id }) }; - let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList'; + let url = dataUrl + 'backstage/purchase/getPurchaseDetailsListBySupplement'; ajaxRequest(url, "POST", params, true, function () { }, function (result) { console.error(result); if (result.code === 200) { - // 先存储原始采购量/利库量到全局Map(强制确保键值正确) - saveOriginalCgLkNum(result.data); // 渲染表格 setBaseTable(result.data); } @@ -143,28 +132,6 @@ function getPurchaseDetailsList() { }, null); } -// 存储原始采购量/利库量(核心:修复键值生成逻辑,确保唯一性和一致性) -function saveOriginalCgLkNum(data) { - if (!data || data.length === 0) return; - originalCgLkMap.clear(); - for (let i = 0; i < data.length; i++) { - let item = data[i]; - let modelId = item.modelId || 'default_' + i; // 兜底:防止modelId为空 - if (item.supList && item.supList.length > 0) { - for (let j = 0; j < item.supList.length; j++) { - let supItem = item.supList[j]; - let key = modelId + '_' + j; // 明确:modelId + 索引j,与提交校验时一致 - originalCgLkMap.set(key, { - originalCgNum: parseInt(supItem.cgNum || 0), - originalLkNum: parseInt(supItem.lkNum || 0) - }); - // 控制台打印:方便调试查看原始值存储情况 - console.log('原始值存储 - 键:', key, ' 采购量:', parseInt(supItem.cgNum || 0), ' 利库量:', parseInt(supItem.lkNum || 0)); - } - } - } -} - // 设置文件类型渲染 function handleFileType(index, file, result) { let html = '', img = ''; @@ -223,37 +190,12 @@ function beforeSubmitApply() { cgNum += currentCgNum; lkNum += currentLkNum; - // 关键修复:使用与存储时完全一致的键值,获取原始值 - let key = modelId + '_' + j; - let originalData = originalCgLkMap.get(key); - - // 兜底:防止原始值未获取到 - if (!originalData) { - layer.msg('序号为' + (i + 1) + '的数据,未获取到原始数据,请刷新页面重试', { icon: 7 }); - hasError = true; - break; - } - - // 强制校验:采购量不可小于原始值 - if (currentCgNum < originalData.originalCgNum) { - layer.msg('序号为' + (i + 1) + '的数据,采购量不可小于原始值:' + originalData.originalCgNum + '(当前值:' + currentCgNum + ')', { icon: 7 }); - hasError = true; - break; - } - // 强制校验:利库量不可小于原始值(修复第二条数据不提示问题) - if (currentLkNum < originalData.originalLkNum) { - layer.msg('序号为' + (i + 1) + '的数据,利库量不可小于原始值:' + originalData.originalLkNum + '(当前值:' + currentLkNum + ')', { icon: 7 }); - hasError = true; - break; - } - // 新增校验:采购量>0时,供应商为必填项 if (currentCgNum > 0 && (!l.supId || l.supId === '')) { layer.msg('序号为' + (i + 1) + '的数据,采购量大于0时必须选择供应商', { icon: 7 }); hasError = true; break; } - } if (hasError) break; @@ -338,7 +280,7 @@ function submitApply() { console.log(data); formData.append('params', JSON.stringify(data)); let loadingMsg = layer.msg('正在提交补充,请稍等...', { icon: 16, shade: 0.01, time: '0' }); - let url = dataUrl + 'backstage/purchase/updatePurchaseData'; + let url = dataUrl + 'backstage/purchase/addPurchaseDataBySupplement'; ajaxRequestByUploadFile(url, formData, function () { $('.save').addClass("layui-btn-disabled").attr("disabled", true); $('.cancel').addClass("layui-btn-disabled").attr("disabled", true); @@ -384,9 +326,9 @@ function getSupplierList(callback) { }, null); } -// 厂家校验(禁用,仅保留兼容,不限制供应商) +// 厂家校验(完全去除禁用限制,直接返回true) function supCheck(modelId, contractId, value) { - return true; // 直接返回通过,不做校验 + return true; // 直接返回通过,不做任何校验,完全去除禁用限制 } // 库存数量校验(保留,不影响核心逻辑) @@ -480,59 +422,6 @@ function closePage(data) { parent.layer.close(index); } -// 监听采购量输入框(增强提示:实时+失焦双重提示,确保用户感知) -// 修复:选择器匹配修改后的输入框类名,确保监听生效 -$(document).on('input blur', '.num, .num' + objParam.modelId, function () { - let $this = $(this); - let modelId = $this.attr('modelId') || $this.closest('tr').attr('id') || $this.closest('tr').attr('class').match(/model(\S+)/)[1] || 'default_0'; - let index = $this.attr('index') || $this.closest('td').index() - 7 || 0; - let currentVal = parseInt($this.val() || 0); - let key = modelId + '_' + index; - let originalData = originalCgLkMap.get(key); - - if (!originalData) return; - - // 实时提示:采购量不可小于原始值 - if (currentVal < originalData.originalCgNum) { - layer.tips('采购量不可小于原始值:' + originalData.originalCgNum + '(当前值:' + currentVal + ')', $this, { - tips: [1, '#f56c6c'], - time: 3000 - }); - } - - // 实时提示:采购量>0时需要选择供应商 - if (currentVal > 0) { - let $supplier = $('.supplier' + modelId).eq(index); - if (!$supplier.val() || $supplier.val() === '') { - layer.tips('采购量大于0时必须选择供应商', $supplier, { - tips: [1, '#f56c6c'], - time: 3000 - }); - } - } -}); - -// 监听利库量输入框(增强提示:实时+失焦双重提示,确保用户感知) -// 修复:选择器匹配修改后的输入框类名,确保监听生效 -$(document).on('input blur', '.lkNum, .lkNum' + objParam.modelId, function () { - let $this = $(this); - let modelId = $this.attr('modelId') || $this.closest('tr').attr('id') || $this.closest('tr').attr('class').match(/model(\S+)/)[1] || 'default_0'; - let index = $this.attr('index') || $this.closest('td').index() - 7 || 0; - let currentVal = parseInt($this.val() || 0); - let key = modelId + '_' + index; - let originalData = originalCgLkMap.get(key); - - if (!originalData) return; - - // 实时提示:输入时就给出反馈,修复第二条数据不提示问题 - if (currentVal < originalData.originalLkNum) { - layer.tips('利库量不可小于原始值:' + originalData.originalLkNum + '(当前值:' + currentVal + ')', $this, { - tips: [1, '#f56c6c'], - time: 3000 - }); - } -}); - // 空值处理函数(对齐参考文件) function setNullValue(val) { return val === undefined || val === null || val === '' ? '' : val; @@ -549,9 +438,8 @@ function setSelectData(modelId, value) { let targetValue = (value || '').toString().trim(); let supIdStr = (item.supId || item.id).toString().trim(); let selected = ''; - if (targetValue === supIdStr) { - selected = 'selected'; - } + // 强制置空:不选中任何供应商,始终显示"请选择供应商" + selected = ''; // 转义JSON中的双引号,避免HTML渲染异常 let itemJson = JSON.stringify(item).replace(/"/g, '"'); html += ""; @@ -559,26 +447,27 @@ function setSelectData(modelId, value) { return html; } -// 构建表单输入项(核心修复:出厂日期/检验日期/备注添加readonly属性,禁用编辑) +// 构建表单输入项(核心修改:将采购量、利库量、出厂日期、检验日期、备注的值强制置空) function setFormInput(value, type, id) { let html = '
'; - let safeValue = setNullValue(value); + // 核心修改:强制将所有指定字段的值置空 + let safeValue = ''; - if (type === 1) { // 采购量 + if (type === 1) { // 采购量 - 强制置空 html += ''; - } else if (type === 2) { // 利库量 - let oldValue = safeValue || 0; + } else if (type === 2) { // 利库量 - 强制置空 + let oldValue = 0; // 重置为0 html += ''; - } else if (type === 3) { // 供应商(核心:调用setSelectData构建下拉选) + } else if (type === 3) { // 供应商 - 强制置空(不选中任何选项) html += ''; - } else if (type === 4) { // 出厂日期:添加readonly属性,禁用编辑 - html += ''; - } else if (type === 5) { // 检验日期:添加readonly属性,禁用编辑 - html += ''; - } else if (type === 6) { // 备注:添加readonly属性,禁用编辑 - html += ''; + } else if (type === 4) { // 出厂日期 - 强制置空 + html += ''; + } else if (type === 5) { // 检验日期 - 强制置空 + html += ''; + } else if (type === 6) { // 备注 - 强制置空 + html += ''; } html += '
'; return html; @@ -597,40 +486,25 @@ function setBaseTable(data) { let itemIndex = index; if (index === 0) { // 主行:带rowspan合并单元格 - html += ""; + html += ""; // 重置historyLkNum为0 html += ''; html += "" + (i + 1) + ""; html += "" + (l.type || '') + ""; html += "" + (l.name || '') + ""; html += "" + (l.model || '') + ""; html += "" + (l.unit || '') + ""; - html += "" + (l.needNum || 0) + ""; + html += "" + (l.needNum-l.num || 0) + ""; // 采购量:添加index属性 - html += "" + setFormInput(item.cgNum, 1, l.modelId).replace('"; + html += "" + setFormInput(0, 1, l.modelId).replace('"; // 利库量:添加index属性 - html += "" + setFormInput(item.lkNum, 2, l.modelId).replace('"; - html += "" + setFormInput(item.supId, 3, l.modelId) + ""; - // 出厂日期:已通过setFormInput添加readonly - html += "" + setFormInput(item.ccDay, 4, l.modelId) + ""; - // 检验日期:已通过setFormInput添加readonly - html += "" + setFormInput(item.jyDay, 5, l.modelId) + ""; - // 备注:已通过setFormInput添加readonly - html += "" + setFormInput(item.remark, 6, l.modelId) + ""; - html += ""; - } else { - // 子行:不合并单元格 - html += ""; - // 采购量:添加index属性 - html += "" + setFormInput(item.cgNum, 1, l.modelId).replace('"; - // 利库量:添加index属性 - html += "" + setFormInput(item.lkNum, 2, l.modelId).replace('"; - html += "" + setFormInput(item.supId, 3, l.modelId) + ""; - // 出厂日期:已通过setFormInput添加readonly - html += "" + setFormInput(item.ccDay, 4, l.modelId) + ""; - // 检验日期:已通过setFormInput添加readonly - html += "" + setFormInput(item.jyDay, 5, l.modelId) + ""; - // 备注:已通过setFormInput添加readonly - html += "" + setFormInput(item.remark, 6, l.modelId) + ""; + html += "" + setFormInput(0, 2, l.modelId).replace('"; + html += "" + setFormInput('', 3, l.modelId) + ""; + // 出厂日期:强制置空 + html += "" + setFormInput('', 4, l.modelId) + ""; + // 检验日期:强制置空 + html += "" + setFormInput('', 5, l.modelId) + ""; + // 备注:强制置空 + html += "" + setFormInput('', 6, l.modelId) + ""; html += ""; } }); @@ -639,15 +513,19 @@ function setBaseTable(data) { html += "没有相关数据"; } $("#baseTable tbody").empty().append(html); - // 重新渲染日期选择器 + + // 修复核心:重新渲染日期选择器,移除trigger: 'none'配置 laydate.render({ - elem: '.cjDate', - trigger: 'none' // 再次确认日期选择器不可触发 + elem: '.cjDate', // 出厂日期 + trigger: 'click', // 显式指定点击触发 + type: 'date' // 指定日期类型 }); laydate.render({ - elem: '.jyDate', - trigger: 'none' // 再次确认日期选择器不可触发 + elem: '.jyDate', // 检验日期 + trigger: 'click', // 显式指定点击触发 + type: 'date' // 指定日期类型 }); + // 强制渲染layui表单,确保供应商下拉选生效 layui.form.render(); } diff --git a/page/aq_demand_plan/child/send_out_detail.html b/page/aq_demand_plan/child/send_out_detail.html index 14b02f8..6f6b001 100644 --- a/page/aq_demand_plan/child/send_out_detail.html +++ b/page/aq_demand_plan/child/send_out_detail.html @@ -29,6 +29,32 @@ width: 50px; height: 50px; } + + /* 批次标签样式 */ + .batch-tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; + } + .batch-tab { + padding: 6px 16px; + background-color: #f5f7fa; + border: 1px solid #e6e6e6; + border-radius: 4px; + cursor: pointer; + color: #333; + font-size: 14px; + transition: all 0.2s; + } + .batch-tab:hover { + background-color: #e8f4ff; + border-color: #409EFF; + } + .batch-tab.active { + background-color: #409EFF; + color: white; + border-color: #409EFF; + } @@ -116,6 +142,7 @@

采购发货明细

+
diff --git a/page/aq_demand_plan/child/send_out_supplemen.html b/page/aq_demand_plan/child/send_out_supplemen.html index a19c776..213d434 100644 --- a/page/aq_demand_plan/child/send_out_supplemen.html +++ b/page/aq_demand_plan/child/send_out_supplemen.html @@ -173,7 +173,7 @@
- +