补发货优化
This commit is contained in:
parent
fb8cf8c1bb
commit
268e41b540
|
|
@ -289,7 +289,7 @@ function setOperRecordInfo(list, obj) {
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div class="user-oper layout">' +
|
'<div class="user-oper layout">' +
|
||||||
'<div style="width: 100%">' +
|
'<div style="width: 100%">' +
|
||||||
'<span>' + item.auditName + '</span><span>(' + item.phone + ')</span><span>' + dept + '</span>' +
|
'<span>' + formatEmptyValue(item.auditName) + '</span><span>(' + formatEmptyValue(item.phone) + ')</span><span>' + formatEmptyValue(dept) + '</span>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div style="width: 100%">' +
|
'<div style="width: 100%">' +
|
||||||
'<span>' + operData + '</span>' +
|
'<span>' + operData + '</span>' +
|
||||||
|
|
@ -308,6 +308,11 @@ function setOperRecordInfo(list, obj) {
|
||||||
$('.layui-timeline').empty().append(html);
|
$('.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) {
|
function setCheckStatus(obj) {
|
||||||
$('#code').empty().html(obj.code);
|
$('#code').empty().html(obj.code);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
let objParam, dataObj;
|
let objParam, dataObj;
|
||||||
|
let batchData = {};
|
||||||
|
let currentBatch = '';
|
||||||
let form, table, upload, tableIns, layer;
|
let form, table, upload, tableIns, layer;
|
||||||
let pageNum = 1;
|
let pageNum = 1;
|
||||||
|
|
||||||
|
|
@ -70,19 +72,91 @@ function getPurchaseDetailsList() {
|
||||||
'id': objParam.id
|
'id': objParam.id
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList';
|
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsListBatch';
|
||||||
ajaxRequest(url, "POST", params, true, function () {
|
ajaxRequest(url, "POST", params, true, function () {
|
||||||
}, function (result) {
|
}, function (result) {
|
||||||
console.error(result);
|
console.error(result);
|
||||||
if (result.code === 200) {
|
if (result.code === 200) {
|
||||||
dataObj = result.data;
|
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) {
|
}, function (xhr, status, error) {
|
||||||
errorFn(xhr, status, error)
|
errorFn(xhr, status, error)
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 新增:处理批次数据,生成批次标签
|
||||||
|
function handleBatchData(data) {
|
||||||
|
// 1. 批次按外层数组索引区分(第1批次、第2批次...)
|
||||||
|
let batchCount = data.length;
|
||||||
|
if (batchCount === 0) {
|
||||||
|
$('#batch-tabs').html('<div style="color:#999;">暂无批次数据</div>');
|
||||||
|
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 += `<div class="batch-tab ${isActive}" data-batch="${i}">${batchName}</div>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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) {
|
function setSubInfos(list) {
|
||||||
$('#supplier-table-box tbody tr:not(:first)').remove();
|
$('#supplier-table-box tbody tr:not(:first)').remove();
|
||||||
|
|
@ -141,71 +215,63 @@ function handleFileType(value) {
|
||||||
|
|
||||||
// 查询
|
// 查询
|
||||||
function search() {
|
function search() {
|
||||||
let keyWord = $('#name').val();
|
let keyWord = $('#name').val().trim();
|
||||||
let keyWord2 = $('#model').val();
|
let keyWord2 = $('#model').val().trim();
|
||||||
|
// 获取当前批次的数据源
|
||||||
|
let currentData = currentBatch ? filterDataByBatch(dataObj, currentBatch) : mergeAllBatchData(dataObj);
|
||||||
|
|
||||||
if (!keyWord && !keyWord2) {
|
if (!keyWord && !keyWord2) {
|
||||||
setBaseTable(dataObj);
|
setBaseTable(currentData);
|
||||||
} else if (keyWord && !keyWord2) {
|
return;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 筛选逻辑(适配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() {
|
function resetSearch() {
|
||||||
$('#name').val('');
|
$('#name').val('');
|
||||||
$('#model').val('');
|
$('#model').val('');
|
||||||
setBaseTable(dataObj);
|
// 重置时显示当前批次的完整数据
|
||||||
|
let currentData = currentBatch ? filterDataByBatch(dataObj, currentBatch) : mergeAllBatchData(dataObj);
|
||||||
|
setBaseTable(currentData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function setBaseTable(results) {
|
function setBaseTable(results) {
|
||||||
let html = "";
|
let html = "";
|
||||||
if (results && results.length > 0) {
|
if (results && results.length > 0) {
|
||||||
for (var i = 0; i < results.length; i++) {
|
results.forEach((item, index) => {
|
||||||
var l = results[i];
|
html += "<tr id='" + (item.modelId || index) + "'>";
|
||||||
let list = l.supList;
|
html += "<td style='vertical-align:middle;' class='center'>" + (index + 1) + "</td>";
|
||||||
$.each(list, function (index, item) {
|
html += "<td class='center'>" + (item.type || '') + "</td>";
|
||||||
if (index === 0) {
|
html += "<td class='center'>" + (item.name || '') + "</td>";
|
||||||
html += "<tr id='" + l.modelId + "'>";
|
html += "<td class='center'>" + (item.model || '') + "</td>";
|
||||||
html += "<td style='vertical-align:middle;' rowspan=" + list.length + ">"
|
html += "<td class='center'>" + (item.unit || '') + "</td>";
|
||||||
+ (i + 1) + "</td>";
|
html += "<td class='center'>" + (item.needNum || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + l.type + "</td>";
|
html += "<td class='center'>" + (item.cgNum || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + l.name + "</td>";
|
html += "<td class='center'>" + (item.lkNum || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + l.model + "</td>";
|
html += "<td class='center'>" + (item.supName || '') + "</td>"; // 无数据则显示空
|
||||||
html += "<td rowspan=" + list.length + ">" + l.unit + "</td>";
|
html += "<td class='center'>" + (item.ccDay || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + l.needNum + "</td>";
|
html += "<td class='center'>" + (item.jyDay || '') + "</td>";
|
||||||
html += "<td>" + item.cgNum + "</td>";
|
html += "<td class='center'>" + (item.remark || '') + "</td>";
|
||||||
html += "<td>" + item.lkNum + "</td>";
|
html += "</tr>";
|
||||||
html += "<td>" + item.supName + "</td>";
|
});
|
||||||
html += "<td>" + item.ccDay + "</td>";
|
|
||||||
html += "<td>" + item.jyDay + "</td>";
|
|
||||||
html += "<td>" + item.remark + "</td>";
|
|
||||||
html += "</tr>";
|
|
||||||
} else {
|
|
||||||
html += "<tr>";
|
|
||||||
html += "<td>" + item.cgNum + "</td>";
|
|
||||||
html += "<td>" + item.lkNum + "</td>";
|
|
||||||
html += "<td>" + item.supName + "</td>";
|
|
||||||
html += "<td>" + item.ccDay + "</td>";
|
|
||||||
html += "<td>" + item.jyDay + "</td>";
|
|
||||||
html += "<td>" + item.remark + "</td>";
|
|
||||||
html += "</tr>";
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
html += "<tr><td colspan='12' class='center'>没有相关数据</td></tr>";
|
html += "<tr><td colspan='12' class='center'>没有相关数据</td></tr>";
|
||||||
}
|
}
|
||||||
|
|
@ -222,7 +288,8 @@ function exportExcel() {
|
||||||
let params = {
|
let params = {
|
||||||
'name': $('#name').val(),
|
'name': $('#name').val(),
|
||||||
'model': $('#model').val(),
|
'model': $('#model').val(),
|
||||||
'id': objParam.id
|
'id': objParam.id,
|
||||||
|
'batch': currentBatch // 传递当前选中批次
|
||||||
}
|
}
|
||||||
let url = dataUrl + "backstage/purchase/exportDetailsList";
|
let url = dataUrl + "backstage/purchase/exportDetailsList";
|
||||||
exportExcelUtil(url, '采购发货明细', JSON.stringify(params));
|
exportExcelUtil(url, '采购发货明细', JSON.stringify(params));
|
||||||
|
|
|
||||||
|
|
@ -46,10 +46,10 @@ function setParams(obj) {
|
||||||
}
|
}
|
||||||
$('.supplier' + modelId + '').each(function (index, item) {
|
$('.supplier' + modelId + '').each(function (index, item) {
|
||||||
let id = $(this).find('option:checked').val();
|
let id = $(this).find('option:checked').val();
|
||||||
if (id && id === value && !($(data.elem).is($(this)))) {
|
// if (id && id === value && !($(data.elem).is($(this)))) {
|
||||||
$(data.elem).val('');
|
// $(data.elem).val('');
|
||||||
return layer.msg('请勿重复选择供应商', { icon: 7 });
|
// return layer.msg('请勿重复选择供应商', { icon: 7 });
|
||||||
}
|
// }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -143,7 +143,7 @@ function getPurchaseDetailsList() {
|
||||||
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList';
|
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList';
|
||||||
ajaxRequest(url, "POST", params, true, function () {
|
ajaxRequest(url, "POST", params, true, function () {
|
||||||
}, function (result) {
|
}, function (result) {
|
||||||
console.error(result);
|
console.error("发货明细:",result);
|
||||||
if (result.code === 200) {
|
if (result.code === 200) {
|
||||||
setBaseTable(result.data);
|
setBaseTable(result.data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ let pageNum = 1, tableIns;
|
||||||
let supplierList = [];
|
let supplierList = [];
|
||||||
let delSupIdArr = [];
|
let delSupIdArr = [];
|
||||||
// 存储原始采购量/利库量(用于灵活校验,独立于DOM元素)
|
// 存储原始采购量/利库量(用于灵活校验,独立于DOM元素)
|
||||||
let originalCgLkMap = new Map(); // key: modelId_index, value: {originalCgNum: 0, originalLkNum: 0}
|
|
||||||
|
|
||||||
// 设置参数初始化
|
// 设置参数初始化
|
||||||
function setParams(obj) {
|
function setParams(obj) {
|
||||||
|
|
@ -24,15 +23,7 @@ function setParams(obj) {
|
||||||
// 渲染日期选择器(只读状态,不可修改)
|
// 渲染日期选择器(只读状态,不可修改)
|
||||||
laydate.render({
|
laydate.render({
|
||||||
elem: '#fhDay',
|
elem: '#fhDay',
|
||||||
trigger: 'none' // 禁止触发日期选择
|
trigger: 'click'
|
||||||
});
|
|
||||||
laydate.render({
|
|
||||||
elem: '.cjDate',
|
|
||||||
trigger: 'none'
|
|
||||||
});
|
|
||||||
laydate.render({
|
|
||||||
elem: '.jyDate',
|
|
||||||
trigger: 'none'
|
|
||||||
});
|
});
|
||||||
|
|
||||||
form.verify();
|
form.verify();
|
||||||
|
|
@ -128,13 +119,11 @@ function getPurchaseDetailsList() {
|
||||||
'id': objParam.id
|
'id': objParam.id
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsList';
|
let url = dataUrl + 'backstage/purchase/getPurchaseDetailsListBySupplement';
|
||||||
ajaxRequest(url, "POST", params, true, function () {
|
ajaxRequest(url, "POST", params, true, function () {
|
||||||
}, function (result) {
|
}, function (result) {
|
||||||
console.error(result);
|
console.error(result);
|
||||||
if (result.code === 200) {
|
if (result.code === 200) {
|
||||||
// 先存储原始采购量/利库量到全局Map(强制确保键值正确)
|
|
||||||
saveOriginalCgLkNum(result.data);
|
|
||||||
// 渲染表格
|
// 渲染表格
|
||||||
setBaseTable(result.data);
|
setBaseTable(result.data);
|
||||||
}
|
}
|
||||||
|
|
@ -143,28 +132,6 @@ function getPurchaseDetailsList() {
|
||||||
}, null);
|
}, 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) {
|
function handleFileType(index, file, result) {
|
||||||
let html = '', img = '';
|
let html = '', img = '';
|
||||||
|
|
@ -223,37 +190,12 @@ function beforeSubmitApply() {
|
||||||
cgNum += currentCgNum;
|
cgNum += currentCgNum;
|
||||||
lkNum += currentLkNum;
|
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时,供应商为必填项
|
// 新增校验:采购量>0时,供应商为必填项
|
||||||
if (currentCgNum > 0 && (!l.supId || l.supId === '')) {
|
if (currentCgNum > 0 && (!l.supId || l.supId === '')) {
|
||||||
layer.msg('序号为' + (i + 1) + '的数据,采购量大于0时必须选择供应商', { icon: 7 });
|
layer.msg('序号为' + (i + 1) + '的数据,采购量大于0时必须选择供应商', { icon: 7 });
|
||||||
hasError = true;
|
hasError = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasError) break;
|
if (hasError) break;
|
||||||
|
|
@ -338,7 +280,7 @@ function submitApply() {
|
||||||
console.log(data);
|
console.log(data);
|
||||||
formData.append('params', JSON.stringify(data));
|
formData.append('params', JSON.stringify(data));
|
||||||
let loadingMsg = layer.msg('正在提交补充,请稍等...', { icon: 16, shade: 0.01, time: '0' });
|
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 () {
|
ajaxRequestByUploadFile(url, formData, function () {
|
||||||
$('.save').addClass("layui-btn-disabled").attr("disabled", true);
|
$('.save').addClass("layui-btn-disabled").attr("disabled", true);
|
||||||
$('.cancel').addClass("layui-btn-disabled").attr("disabled", true);
|
$('.cancel').addClass("layui-btn-disabled").attr("disabled", true);
|
||||||
|
|
@ -384,9 +326,9 @@ function getSupplierList(callback) {
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 厂家校验(禁用,仅保留兼容,不限制供应商)
|
// 厂家校验(完全去除禁用限制,直接返回true)
|
||||||
function supCheck(modelId, contractId, value) {
|
function supCheck(modelId, contractId, value) {
|
||||||
return true; // 直接返回通过,不做校验
|
return true; // 直接返回通过,不做任何校验,完全去除禁用限制
|
||||||
}
|
}
|
||||||
|
|
||||||
// 库存数量校验(保留,不影响核心逻辑)
|
// 库存数量校验(保留,不影响核心逻辑)
|
||||||
|
|
@ -480,59 +422,6 @@ function closePage(data) {
|
||||||
parent.layer.close(index);
|
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) {
|
function setNullValue(val) {
|
||||||
return val === undefined || val === null || val === '' ? '' : val;
|
return val === undefined || val === null || val === '' ? '' : val;
|
||||||
|
|
@ -549,9 +438,8 @@ function setSelectData(modelId, value) {
|
||||||
let targetValue = (value || '').toString().trim();
|
let targetValue = (value || '').toString().trim();
|
||||||
let supIdStr = (item.supId || item.id).toString().trim();
|
let supIdStr = (item.supId || item.id).toString().trim();
|
||||||
let selected = '';
|
let selected = '';
|
||||||
if (targetValue === supIdStr) {
|
// 强制置空:不选中任何供应商,始终显示"请选择供应商"
|
||||||
selected = 'selected';
|
selected = '';
|
||||||
}
|
|
||||||
// 转义JSON中的双引号,避免HTML渲染异常
|
// 转义JSON中的双引号,避免HTML渲染异常
|
||||||
let itemJson = JSON.stringify(item).replace(/"/g, '"');
|
let itemJson = JSON.stringify(item).replace(/"/g, '"');
|
||||||
html += "<option value='" + (item.supId || item.id) + "' item='" + itemJson + "' modelId='" + modelId + "' " + selected + ">" + item.supName + "</option>";
|
html += "<option value='" + (item.supId || item.id) + "' item='" + itemJson + "' modelId='" + modelId + "' " + selected + ">" + item.supName + "</option>";
|
||||||
|
|
@ -559,26 +447,27 @@ function setSelectData(modelId, value) {
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建表单输入项(核心修复:出厂日期/检验日期/备注添加readonly属性,禁用编辑)
|
// 构建表单输入项(核心修改:将采购量、利库量、出厂日期、检验日期、备注的值强制置空)
|
||||||
function setFormInput(value, type, id) {
|
function setFormInput(value, type, id) {
|
||||||
let html = '<form class="layui-form layuimini-form"><div class="layui-inline">';
|
let html = '<form class="layui-form layuimini-form"><div class="layui-inline">';
|
||||||
let safeValue = setNullValue(value);
|
// 核心修改:强制将所有指定字段的值置空
|
||||||
|
let safeValue = '';
|
||||||
|
|
||||||
if (type === 1) { // 采购量
|
if (type === 1) { // 采购量 - 强制置空
|
||||||
html += '<input class="layui-input num' + id + '" modelId=' + id + ' name="num" onblur="checkValue(this,1)" value="' + safeValue + '" autocomplete="off" lay-verify="required" maxlength="9">';
|
html += '<input class="layui-input num' + id + '" modelId=' + id + ' name="num" onblur="checkValue(this,1)" value="' + safeValue + '" autocomplete="off" lay-verify="required" maxlength="9">';
|
||||||
} else if (type === 2) { // 利库量
|
} else if (type === 2) { // 利库量 - 强制置空
|
||||||
let oldValue = safeValue || 0;
|
let oldValue = 0; // 重置为0
|
||||||
html += '<input class="layui-input lkNum' + id + '" oldValue="' + oldValue + '" modelId=' + id + ' name="lkNum" onblur="checkValue(this,2)" value="' + safeValue + '" autocomplete="off" lay-verify="required" maxlength="9">';
|
html += '<input class="layui-input lkNum' + id + '" oldValue="' + oldValue + '" modelId=' + id + ' name="lkNum" onblur="checkValue(this,2)" value="' + safeValue + '" autocomplete="off" lay-verify="required" maxlength="9">';
|
||||||
} else if (type === 3) { // 供应商(核心:调用setSelectData构建下拉选)
|
} else if (type === 3) { // 供应商 - 强制置空(不选中任何选项)
|
||||||
html += '<select class="layui-select supplier' + id + '" modelId=' + id + ' name="supplier" lay-search lay-filter="supplier">' +
|
html += '<select class="layui-select supplier' + id + '" modelId=' + id + ' name="supplier" lay-search lay-filter="supplier">' +
|
||||||
setSelectData(id, safeValue) +
|
setSelectData(id, safeValue) +
|
||||||
'</select>';
|
'</select>';
|
||||||
} else if (type === 4) { // 出厂日期:添加readonly属性,禁用编辑
|
} else if (type === 4) { // 出厂日期 - 强制置空
|
||||||
html += '<input class="layui-input cjDate cjDate' + id + '" value="' + safeValue + '" modelId=' + id + ' name="cjDate" readonly lay-verify="required">';
|
html += '<input class="layui-input cjDate cjDate' + id + '" value="' + safeValue + '" modelId=' + id + ' name="cjDate" readonly autocomplete="off" lay-verify="required">';
|
||||||
} else if (type === 5) { // 检验日期:添加readonly属性,禁用编辑
|
} else if (type === 5) { // 检验日期 - 强制置空
|
||||||
html += '<input class="layui-input jyDate jyDate' + id + '" value="' + safeValue + '" modelId=' + id + ' name="jyDate" readonly lay-verify="required">';
|
html += '<input class="layui-input jyDate jyDate' + id + '" value="' + safeValue + '" modelId=' + id + ' name="jyDate" readonly autocomplete="off" lay-verify="required">';
|
||||||
} else if (type === 6) { // 备注:添加readonly属性,禁用编辑
|
} else if (type === 6) { // 备注 - 强制置空
|
||||||
html += '<input class="layui-input remark' + id + '" modelId=' + id + ' placeholder="请输入备注" name="remark" value="' + safeValue + '" maxLength="60" lay-affix="clear" readonly>';
|
html += '<input class="layui-input remark' + id + '" modelId=' + id + ' placeholder="请输入备注" name="remark" value="' + safeValue + '" maxLength="60" autocomplete="off" lay-affix="clear">';
|
||||||
}
|
}
|
||||||
html += '</div></form>';
|
html += '</div></form>';
|
||||||
return html;
|
return html;
|
||||||
|
|
@ -597,40 +486,25 @@ function setBaseTable(data) {
|
||||||
let itemIndex = index;
|
let itemIndex = index;
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
// 主行:带rowspan合并单元格
|
// 主行:带rowspan合并单元格
|
||||||
html += "<tr id='" + l.modelId + "' class='mainTr model" + l.modelId + "' dataId='" + item.id + "' detailId='" + l.id + "' historyLkNum='" + (item.lkNum ? item.lkNum : 0) + "'>";
|
html += "<tr id='" + l.modelId + "' class='mainTr model" + l.modelId + "' dataId='" + item.id + "' detailId='" + l.id + "' historyLkNum='" + 0 + "'>"; // 重置historyLkNum为0
|
||||||
html += '<td rowspan=' + list.length + '><input name="check" type="checkbox"></td>';
|
html += '<td rowspan=' + list.length + '><input name="check" type="checkbox"></td>';
|
||||||
html += "<td style='vertical-align:middle;' rowspan=" + list.length + ">" + (i + 1) + "</td>";
|
html += "<td style='vertical-align:middle;' rowspan=" + list.length + ">" + (i + 1) + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + (l.type || '') + "</td>";
|
html += "<td rowspan=" + list.length + ">" + (l.type || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + (l.name || '') + "</td>";
|
html += "<td rowspan=" + list.length + ">" + (l.name || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + (l.model || '') + "</td>";
|
html += "<td rowspan=" + list.length + ">" + (l.model || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + (l.unit || '') + "</td>";
|
html += "<td rowspan=" + list.length + ">" + (l.unit || '') + "</td>";
|
||||||
html += "<td rowspan=" + list.length + ">" + (l.needNum || 0) + "</td>";
|
html += "<td rowspan=" + list.length + ">" + (l.needNum-l.num || 0) + "</td>";
|
||||||
// 采购量:添加index属性
|
// 采购量:添加index属性
|
||||||
html += "<td>" + setFormInput(item.cgNum, 1, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
html += "<td>" + setFormInput(0, 1, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
||||||
// 利库量:添加index属性
|
// 利库量:添加index属性
|
||||||
html += "<td>" + setFormInput(item.lkNum, 2, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
html += "<td>" + setFormInput(0, 2, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
||||||
html += "<td>" + setFormInput(item.supId, 3, l.modelId) + "</td>";
|
html += "<td>" + setFormInput('', 3, l.modelId) + "</td>";
|
||||||
// 出厂日期:已通过setFormInput添加readonly
|
// 出厂日期:强制置空
|
||||||
html += "<td>" + setFormInput(item.ccDay, 4, l.modelId) + "</td>";
|
html += "<td>" + setFormInput('', 4, l.modelId) + "</td>";
|
||||||
// 检验日期:已通过setFormInput添加readonly
|
// 检验日期:强制置空
|
||||||
html += "<td>" + setFormInput(item.jyDay, 5, l.modelId) + "</td>";
|
html += "<td>" + setFormInput('', 5, l.modelId) + "</td>";
|
||||||
// 备注:已通过setFormInput添加readonly
|
// 备注:强制置空
|
||||||
html += "<td>" + setFormInput(item.remark, 6, l.modelId) + "</td>";
|
html += "<td>" + setFormInput('', 6, l.modelId) + "</td>";
|
||||||
html += "</tr>";
|
|
||||||
} else {
|
|
||||||
// 子行:不合并单元格
|
|
||||||
html += "<tr dataId='" + item.id + "' class='model" + l.modelId + "' historyLkNum='" + (item.lkNum ? item.lkNum : 0) + "'>";
|
|
||||||
// 采购量:添加index属性
|
|
||||||
html += "<td>" + setFormInput(item.cgNum, 1, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
|
||||||
// 利库量:添加index属性
|
|
||||||
html += "<td>" + setFormInput(item.lkNum, 2, l.modelId).replace('<input class="layui-input', '<input index="' + itemIndex + '" class="layui-input') + "</td>";
|
|
||||||
html += "<td>" + setFormInput(item.supId, 3, l.modelId) + "</td>";
|
|
||||||
// 出厂日期:已通过setFormInput添加readonly
|
|
||||||
html += "<td>" + setFormInput(item.ccDay, 4, l.modelId) + "</td>";
|
|
||||||
// 检验日期:已通过setFormInput添加readonly
|
|
||||||
html += "<td>" + setFormInput(item.jyDay, 5, l.modelId) + "</td>";
|
|
||||||
// 备注:已通过setFormInput添加readonly
|
|
||||||
html += "<td>" + setFormInput(item.remark, 6, l.modelId) + "</td>";
|
|
||||||
html += "</tr>";
|
html += "</tr>";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -639,15 +513,19 @@ function setBaseTable(data) {
|
||||||
html += "<tr><td colspan='13' class='center'>没有相关数据</td></tr>";
|
html += "<tr><td colspan='13' class='center'>没有相关数据</td></tr>";
|
||||||
}
|
}
|
||||||
$("#baseTable tbody").empty().append(html);
|
$("#baseTable tbody").empty().append(html);
|
||||||
// 重新渲染日期选择器
|
|
||||||
|
// 修复核心:重新渲染日期选择器,移除trigger: 'none'配置
|
||||||
laydate.render({
|
laydate.render({
|
||||||
elem: '.cjDate',
|
elem: '.cjDate', // 出厂日期
|
||||||
trigger: 'none' // 再次确认日期选择器不可触发
|
trigger: 'click', // 显式指定点击触发
|
||||||
|
type: 'date' // 指定日期类型
|
||||||
});
|
});
|
||||||
laydate.render({
|
laydate.render({
|
||||||
elem: '.jyDate',
|
elem: '.jyDate', // 检验日期
|
||||||
trigger: 'none' // 再次确认日期选择器不可触发
|
trigger: 'click', // 显式指定点击触发
|
||||||
|
type: 'date' // 指定日期类型
|
||||||
});
|
});
|
||||||
|
|
||||||
// 强制渲染layui表单,确保供应商下拉选生效
|
// 强制渲染layui表单,确保供应商下拉选生效
|
||||||
layui.form.render();
|
layui.form.render();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,32 @@
|
||||||
width: 50px;
|
width: 50px;
|
||||||
height: 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;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<body id="body">
|
<body id="body">
|
||||||
|
|
@ -116,6 +142,7 @@
|
||||||
<span style="font-weight:700;text-decoration:none;color:#409EFF;">▋</span>
|
<span style="font-weight:700;text-decoration:none;color:#409EFF;">▋</span>
|
||||||
<p>采购发货明细</p>
|
<p>采购发货明细</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="batch-tabs" class="batch-tabs" style="padding: 10px 10px 0 10px; display: none"></div>
|
||||||
<div class="layuimini-container">
|
<div class="layuimini-container">
|
||||||
<div class="layuimini-main">
|
<div class="layuimini-main">
|
||||||
<fieldset class="table-search-fieldset no-print">
|
<fieldset class="table-search-fieldset no-print">
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-box">
|
<div class="btn-box">
|
||||||
<button class="layui-btn layui-bg-blue save" onclick="saveData2()">确定补充</button>
|
<button class="layui-btn layui-bg-blue save" onclick="saveData2()">补充发货</button>
|
||||||
<button class="layui-btn layui-btn-primary cancel" onclick="closePage()">返回</button>
|
<button class="layui-btn layui-btn-primary cancel" onclick="closePage()">返回</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue