采购发货加设备发货单

This commit is contained in:
lSun 2025-03-24 14:45:47 +08:00
parent a1830be709
commit 4f7d815a46
5 changed files with 575 additions and 2 deletions

View File

@ -388,7 +388,7 @@ function importExcel() {
}
formData.append("file[]", $("#articleImageFile")[0].files[0]);
let loadingMsg = layer.msg('正在提交,请稍等...', { icon: 16, shade: 0.01, time: '0' });
let url = dataUrlDevice + "backstage/planApply/importExcelTools";
let url = dataUrl + "backstage/planApply/importExcelTools";
ajaxRequestByUploadFile(url, formData, function () {
$('.save').addClass("layui-btn-disabled").attr("disabled", true);
$('.cancel').addClass("layui-btn-disabled").attr("disabled", true);

View File

@ -0,0 +1,423 @@
let objParam, dataObj, fileList = new Array(), imgListUp = new Array();
let form, laydate, layer, upload, table, util;
let pageNum = 1, tableIns; // 定义分页
let supplierList = []; // 供应商下拉选
function setParams(obj) {
objParam = JSON.parse(obj);
console.error(objParam);
$('#proName').html(objParam.proName);
layui.use(['form', 'layer', 'laydate', 'upload', 'table'], function () {
form = layui.form;
layer = layui.layer;
laydate = layui.laydate;
upload = layui.upload;
table = layui.table;
util = layui.util;
var userData = JSON.parse(sessionStorage.getItem("us"));
$('#jbUser').val(userData.username);
laydate.render({
elem: '#fhDay'
});
laydate.render({
elem: '.cjDate'
});
laydate.render({
elem: '.jyDate'
});
form.verify();
form.on('submit(formData)', function (data) {
// 提交前确认
beforeSubmitApply(data);
});
form.render();
form.on('select(supplier)', function (data) {
if (data.value) {
let value = $(data.elem).val();
let item = JSON.parse($(data.elem).find('option:checked').attr('item'));
let modelId = $(data.elem).find('option:checked').attr('modelId');
// 安全工器具类型、合同ID、厂家ID 进行校验
let flag = supCheck(modelId, item.contractId, value);
if (!flag) {
$(data.elem).val('');
return layer.msg('该厂家合同无此工器具,请重新选择', { icon: 7 });
}
$('.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 });
}
})
}
});
let uploadObj = upload.render({
elem: '#test2',
multiple: true,
dataType: "json",
exts: 'jpg|png|jpeg|doc|docx|pdf|xlsx|xls',
acceptMime: 'image/jpg,image/png,image/jpeg,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
number: 5, //最大上传数量
size: 1024 * 10, //最大文件大小单位k
auto: false, //是否自动上传 默认为true
bindAction: '#hideUpload', //绑定的按钮
choose: function (obj) {
let length = $('.file-iteme').length;
if (length >= 5) {
return layer.msg('最多上传5个发货附件', { icon: 7 });
}
uploadObj.config.elem.next()[0].value = '';
let num = 0;
obj.preview(function (index, file, result) {
num ++;
if(num <= (5-length)){
$('#uploader-list').append(
'<div id="" class="file-iteme">' +
'<div class="handle"><p>x</p></div>' +
handleFileType(index, file, result) +
'</div>'
);
let map = new Map();//将选择的图片索引和图片写成对象存入集合
map.index = index;
map.file = file;
fileList.push(map);
}
});
}
});
});
getSupplierList();
getOutApplyDetails();
}
// 设置文件类型
function handleFileType(index, file, result) {
let html = '', img = '';
if(file.ext){
file.ext = file.ext.toLowerCase();
}
if(file.name){
file.name = file.name.toLowerCase();
}
if (file.ext === 'doc' || file.ext === 'docx') {
img = '../../../images/docx.png';
} else if (file.ext === 'xls' || file.ext === 'xlsx') {
img = '../../../images/xlsx.png';
} else if (file.ext === 'pdf') {
img = '../../../images/pdf.png';
} else {
return '<img class="img" style="width: 130px;height: 120px;" data-index=' + index + ' data-name=' + file.name + ' src=' + result + '>';
}
html += '<div class="layout upload-file" data-index=' + index + '>' +
'<img src="' + img + '">' +
'<p style="text-align: center;font-size:12px;">' + file.name + '</p>' +
'</div>';
return html;
}
// 删除文件
$(document).on("click", ".file-iteme .handle", function (event) {
imgListUp.splice(0, imgListUp.length);
let index = $(this).next().attr('data-index');
$.each(fileList, function (inx, ele) {
//对比删除文件索引
//将未删除的存入新集合
if (index != ele.index) {
imgListUp.push(ele);
}
});
$(this).parent().remove();
//将新文件集合替换老集合
fileList.splice(0, fileList.length);
$.each(imgListUp, function (inx, ele) {
fileList.push(ele)
});
});
function saveData2() {
$('#formSubmit').trigger('click')
}
// 提交前确认
function beforeSubmitApply() {
// 校验发货附件是否上传
if (fileList.length === 0) {
return layer.msg('请上传发货附件', { icon: 7 });
}
let dataList = getBaseTableData();
// 校验 发货明细数据
for (let i = 0; i < dataList.length; i++) {
let o = dataList[i];
let list = o.supList;
let cgNum = 0,lkNum = 0; // 采购量、利库量
for (let j = 0; j < list.length; j++) {
let l = list[j];
cgNum += (l.cgNum ? parseInt(l.cgNum) : 0);
lkNum += (l.lkNum ? parseInt(l.lkNum) : 0);
if (!l.supId) {
return layer.msg('序号为' + (i + 1) + '的数据,未选择供应商', { icon: 7 });
}
if (!l.ccDay) {
return layer.msg('序号为' + (i + 1) + '的数据,未选择出厂日期', { icon: 7 });
}
if (!l.jyDay) {
return layer.msg('序号为' + (i + 1) + '的数据,未选择检验日期', { icon: 7 });
}
}
// if (parseInt(o.needNum) < (cgNum + lkNum)) { // 采购量 大于需求量
// return layer.msg('序号为' + (i + 1) + '的数据,采购量和利库量不能大于需要量', { icon: 7 });
// }
}
openIframeByParamObj("quickAddForm", "采购发货确认", "./send_out_confirm.html", "92%", "92%", dataList);
}
// 提交
function submitApply() {
let data = form.val('formInfo'); // form 表单的值
let dataList = getBaseTableData();
data.detailsList = dataList;
data.planId = dataObj.planId;
data.proId = objParam.proId;
let formData = new FormData();
//遍历最终文件集合
for (let i = 0; i < fileList.length; i++) {
formData.append("file[]", fileList[i].file)
}
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/addPurchaseData';
ajaxRequestByUploadFile(url, formData, function () {
$('.save').addClass("layui-btn-disabled").attr("disabled", true);
$('.cancel').addClass("layui-btn-disabled").attr("disabled", true);
}, function (result) {
layer.close(loadingMsg);
$('.save').removeClass("layui-btn-disabled").attr("disabled", false);
$('.cancel').removeClass("layui-btn-disabled").attr("disabled", false);
if (result.code === 200) {
parent.layer.msg(result.msg, { icon: 1 });
closePage(result.data);
} else {
layer.msg(result.msg, { icon: 2 });
}
}, function (xhr, status, error) {
layer.close(loadingMsg); // 关闭提示层
layer.msg('服务异常,请稍后重试', { icon: 16, scrollbar: false, time: 2000 });
$('.save').removeClass("layui-btn-disabled").attr("disabled", false);
$('.cancel').removeClass("layui-btn-disabled").attr("disabled", false);
errorFn(xhr, status, error)
}, null);
}
// 供应商下拉选
function getSupplierList() {
supplierList.splice(0, supplierList.length);
let encryptedData = {};
let url = dataUrl + 'backstage/sup/getSelected?encryptedData=' + encodeURIComponent(JSON.stringify(encryptedData));
ajaxRequest(url, "GET", null, false, function () {
}, function (result) {
if (result.code === 200) {
supplierList = result.data;
}
}, function (xhr, status, error) {
errorFn(xhr, status, error)
}, null);
}
// 发货明细
function getOutApplyDetails() {
let params = {
encryptedData: JSON.stringify({
'id': objParam.id
})
};
let url = dataUrl + 'backstage/purchase/getOutApplyDetails';
ajaxRequest(url, "POST", params, true, function () {
}, function (result) {
console.error(result);
if (result.code === 200) {
dataObj = result.data.data;
$('#code').html(result.data.data.planCode);
$('#planCode').val(result.data.data.planCode);
setBaseTable(result.data.list);
}
}, function (xhr, status, error) {
errorFn(xhr, status, error)
}, null);
}
// 厂家校验
function supCheck(modelId, contractId, value) {
let flag = false;
let params = {
encryptedData: JSON.stringify({
'supId': value,
'contractId': contractId,
'modelId': modelId
})
};
let url = dataUrl + 'backstage/sup/supCheck';
ajaxRequest(url, "POST", params, false, function () {
}, function (result) {
if (result.code === 200) {
flag = true;
}
}, function (xhr, status, error) {
errorFn(xhr, status, error)
}, null);
return flag;
}
// 库存数量校验 进行合同校验
function maTypeCheck(modelId) {
let num = 0;
let params = {
encryptedData: JSON.stringify({
'modelId': modelId
})
};
let url = dataUrl + 'backstage/maType/maTypeCheck';
ajaxRequest(url, "POST", params, false, function () {
}, function (result) {
if (result.code === 200) {
num = result.data;
}
}, function (xhr, status, error) {
errorFn(xhr, status, error)
}, null);
return num;
}
// 获取发货明细数据
function getBaseTableData() {
let dataList = [];
$('#baseTable tbody tr.mainTr').each(function () {
let obj = {};
// 基本信息
let modelId = $(this).attr('id');
let planId = $(this).attr('planId');
let detailId = $(this).attr('detailId');
let type = $(this).find('td').eq(2).html();
let name = $(this).find('td').eq(3).html();
let model = $(this).find('td').eq(4).html();
let unit = $(this).find('td').eq(5).html();
let needNum = $(this).find('td').eq(6).html();
// 表格表单数据
let formList = [];
let idx = $('.model' + modelId).length;
for (let i = 0; i < idx; i++) {
let formObj = {};
let num = $('.num' + modelId).eq(i).val();
let lkNum = $('.lkNum' + modelId).eq(i).val();
let supplier = $('.supplier' + modelId).eq(i).val();
let supplierName = $('.supplier' + modelId).eq(i).find('option:checked').text();
let contractId = '';
if (supplier) {
// 合同ID
let item = JSON.parse($('.supplier' + modelId).eq(i).find('option:checked').attr('item'));
contractId = item.contractId;
}
let cjDate = $('.cjDate' + modelId).eq(i).val();
let jyDate = $('.jyDate' + modelId).eq(i).val();
let remark = $('.remark' + modelId).eq(i).val();
formObj.cgNum = num;
formObj.lkNum = lkNum;
formObj.supId = supplier;
formObj.supName = supplierName;
formObj.ccDay = cjDate;
formObj.jyDay = jyDate;
formObj.remark = remark;
formObj.detailId = detailId;
formObj.planId = planId;
formObj.modelId = modelId;
formObj.contractId = contractId;
formList.push(formObj);
}
obj.modelId = modelId;
obj.planId = planId;
obj.detailId = detailId;
obj.type = type;
obj.name = name;
obj.model = model;
obj.unit = unit;
obj.needNum = needNum;
obj.supList = formList;
dataList.push(obj);
})
return dataList;
}
// 关闭页面
function closePage(data) {
let index = parent.layer.getFrameIndex(window.name); // 先得到当前 iframe层的索引
if (data) {
let obj = {
resultData:data.resultData,
resultData2:data.resultData2,
id:data.planId
};
let frameId = parent.document.getElementById('sendOutProDetail').getElementsByTagName("iframe")[0];
frameId.contentWindow.sendOutSuccess(JSON.stringify(obj));
}
parent.layer.close(index); // 再执行关闭
}
function exportTableToExcel() {
const rows = document.querySelectorAll("#baseTable tbody tr");
const tableData = [];
rows.forEach(row => {
const cells = row.querySelectorAll("td");
const rowData = {};
if (cells.length > 0) {
rowData["序号"] = cells[1].innerText.trim();
rowData["类型"] = cells[2].innerText.trim();
rowData["名称"] = cells[3].innerText.trim();
rowData["型号"] = cells[4].innerText.trim();
rowData["单位"] = cells[5].innerText.trim();
rowData["需求数量"] = cells[6].innerText.trim();
// 获取动态输入框的值
rowData["采购量"] = cells[7].querySelector("input")?.value || "";
rowData["利库量"] = cells[8].querySelector("input")?.value || "";
rowData["供应商"] = cells[9].querySelector("input")?.value || "";
rowData["出厂日期"] = cells[10].querySelector("input")?.value || "";
rowData["检验日期"] = cells[11].querySelector("input")?.value || "";
rowData["备注"] = cells[12].querySelector("input")?.value || "";
tableData.push(rowData);
}
});
// 创建工作簿和工作表
const worksheet = XLSX.utils.json_to_sheet(tableData);
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
// 导出 Excel 文件
XLSX.writeFile(workbook, '设备发货单.xlsx');
}
function printTable() {
disNoe();
Print('#body', {
onStart: function () {
console.log('onStart', new Date())
disPlay();
},
onEnd: function () {
console.log('onEnd', new Date())
disPlay();
}
})
}
function disNoe(){
document.getElementById("btn-box").style.display="none"
document.getElementById("layout").style.display="none"
document.getElementById("fhmx").style.display="none"
document.getElementById("fieldset").style.display="none"
}
function disPlay(){
document.getElementById("btn-box").style.display="";
document.getElementById("layout").style.display="";
document.getElementById("fhmx").style.display="";
document.getElementById("fieldset").style.display="";
}

View File

@ -250,6 +250,7 @@ function initTable() {
let html = "";
if (d.status === '未发货') {
html += "<a onclick='sendOutForm(" + JSON.stringify(d) + ",1)'>发货</a>";
html += "<div class='splitLine'>|</div><a onclick='sendOutDeviceForm(" + JSON.stringify(d) + ")'>设备发货</a>";
}
if (d.status === '已发货') {
html += "<a onclick='sendOutDetail(" + JSON.stringify(d) + ")'>详情</a>";
@ -293,6 +294,13 @@ function sendOutForm(obj, type) {
openIframeByParamObj2("sendOutForm", "采购发货", content, "92%", "95%", obj);
}
function sendOutDeviceForm(obj) {
obj.proName = objParam.proName;
let content = '../aq_demand_plan/child/send_out_form_device.html';
openIframeByParamObj2("sendOutForm", "设备发货", content, "92%", "95%", obj);
}
// 采购发货成功
function sendOutSuccess(data) {
let obj = JSON.parse(data);
@ -319,4 +327,4 @@ function viewPlanDetail(obj) {
function refreshAllData() {
getProDetails();
reloadData();
}
}

22
js/xlsx.full.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>设备发货</title>
<link rel="stylesheet" href="../../../lib/layui-v2.9.18/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../../css/font.css" media="all">
<link rel="stylesheet" href="../../../css/data_form.css" media="all">
<link rel="stylesheet" href="../../../css/aq_demand_plan/send_out_form.css" media="all">
</head>
<body id="body">
<div id="main-box">
<div id="basic-box">
<div class="layout" style="justify-content: start;" id="layout">
<img src="../../../images/svg/u702.svg" width="40px" height="40px" style="margin-right: 20px;">
<div class="layout" style="flex-direction: column;align-items: start;margin-left: 10px;">
<p style="font-size: 18px;font-weight: bold;" id="proName"></p>
<p id="code"></p>
</div>
</div>
<hr>
<div class="title layout" id="fhmx">
<span style="font-weight:700;text-decoration:none;color:#409EFF;"></span>
<p>发货明细</p>
</div>
<fieldset class="table-search-fieldset" style="border-width: 1px;margin-bottom: 10px;" id="fieldset">
<legend>搜索信息</legend>
<div style="margin: 10px 10px 10px 10px">
<form class="layui-form layui-form-pane" action="#" onsubmit="return false;">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline" style="width: 200px;">
<input type="text" name="name" id="name" autocomplete="off" class="layui-input"
lay-affix="clear" placeholder="输入名称" maxlength="30">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline" style="width: 200px;">
<input type="text" name="model" id="model" autocomplete="off" class="layui-input"
lay-affix="clear" placeholder="输入规格" maxlength="30">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layui-bg-blue" onclick="search()"><i
class="layui-icon"></i> 搜 索</button>
<button class="layui-btn layui-btn-primary" onclick="resetSearch()"><i
class="layui-icon layui-icon-refresh"></i> 重 置</button>
</div>
<div class="layui-inline">
<button class="layui-btn layui-btn-primary" onclick="exportTableToExcel()"><i class="layui-icon layui-icon-export"></i> 导出</button>
<button class="layui-btn layui-btn-primary" onclick="printTable()"><i class="layui-icon layui-icon-print"></i> 打印</button>
</div>
<div class="layui-inline">
<div class="layout">
<div class="layout" style="cursor: pointer;" onclick="split()">
<img src="../../../images/add_icon.png">
<p style="color: #0000ff;margin: 0 5px;">拆分</p>
</div>
<p>(一条物品采购多家时,请勾选后点击拆分)</p>
<p style="color: #f56c6c;margin: 0 5px;cursor: pointer;" onclick="cancelSplit()">
取消拆分</p>
</div>
</div>
<div class="layui-inline">
<div class="layout">
<div class="layout" style="cursor: pointer;" onclick="quickAdd()">
<img src="../../../images/quick_add_icon.png">
<p style="color: #19be6b;margin: 0 5px;">快捷录入</p>
</div>
<p>(点击一键录入全部信息)</p>
</div>
</div>
</div>
</form>
</div>
</fieldset>
<div class="table-box" table-responsive style="z-index: 1;">
<table id="baseTable" class="classTable table-hover">
<thead>
<tr>
<th style="width: 4%" class="center">
<input id="allCheck" onclick="selectAll(this.checked)" type="checkbox">
</th>
<th style="width: 5%" class="center">序号</th>
<th style="width: 8%" class="center">类型</th>
<th style="width: 8%" class="center">名称</th>
<th style="width: 8%" class="center">规格</th>
<th style="width: 6%" class="center">单位</th>
<th style="width: 6%" class="center">需要量</th>
<th style="width: 6%" class="center"><span style="color: red;">*</span>采购量</th>
<th style="width: 6%" class="center"><span style="color: red;">*</span>利库量</th>
<th style="width: 15%" class="center"><span style="color: red;">*</span>供应商</th>
<th style="width: 9%" class="center"><span style="color: red;">*</span>出厂日期</th>
<th style="width: 9%" class="center"><span style="color: red;">*</span>检验日期</th>
<th style="width: 10%" class="center">备注</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<div class="btn-box" id="btn-box">
<!-- <button class="layui-btn layui-bg-blue save" onclick="saveData2()">确定发货</button>-->
<button class="layui-btn layui-btn-primary cancel" onclick="closePage()">返回</button>
</div>
</div>
</body>
<script src="../../../lib/jquery-3.4.1/jquery-3.4.1.min.js" charset="utf-8"></script>
<script src="../../../js/public.js" charset="utf-8"></script>
<script src="../../../lib/layui-v2.9.18/layui/layui.js" charset="utf-8"></script>
<script src="../../../js/openIframe.js" charset="utf-8"></script>
<script src="../../../js/Print.js" charset="utf-8"></script>
<script src="../../../js/xlsx.full.min.js"></script>
<script src="../../../js/aq_demand_plan/child/send_out_form_table.js" charset="utf-8"></script>
<script src="../../../js/aq_demand_plan/child/send_out_form_device.js" charset="utf-8"></script>
</html>