' +
'
' + 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 = '
';
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 @@
▋
采购发货明细