// 全局变量 let idParam, objParam; let fileList = []; // 附件列表 let delIdArr = []; // 删除旧附件ID let jjDataArr = []; // 计划明细 let allDataList = []; // 派车明细 let planId = ''; // 当前选择计划ID let form, laydate, layer, upload, table, util; let pageNum = 1, tableIns; // ------------------- 初始化参数 ------------------- function setParams(obj) { objParam = JSON.parse(obj); delIdArr = []; 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; laydate.render({elem:'#fkTime'}); form.verify(); form.on('submit(formData)', function(data){ submitApply(data); }); form.render(); // 初始化上传 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: 10240, auto: false, bindAction: '#hideUpload', choose: function(obj){ let existCount = fileList.length; if(existCount >=5){ return layer.msg('最多上传5个附件证明',{icon:7}); } uploadObj.config.elem.next()[0].value = ''; obj.preview(function(index, file, result){ if(fileList.length >=5) return; const uid = 'new_' + Date.now() + '_' + Math.random(); fileList.push({uid,name:file.name,file,isExist:false,fileId:null}); $('#uploader-list').append(`
x
${handleFileType(index,file,result)}
`); }); } }); getBalanceDataDetails(); }); } // ------------------- 获取数据详情 ------------------- function getBalanceDataDetails(){ let encryptedData = {id: objParam.id}; let url = dataUrl+'backstage/carBalance/getBalanceDataDetails?encryptedData='+encodeURIComponent(JSON.stringify(encryptedData)); ajaxRequest(url,"GET",null,true,null,function(result){ if(result.code===200){ let dataObj = result.data; // 基本信息回显 $('#supId').val(dataObj.supId); $('#supName').val(dataObj.supName); $('#fkTime').val(util.toDateString(dataObj.fkTime,'yyyy-MM-dd')); $('#money').val(dataObj.money); $('#remark').val(dataObj.remark); $('#planListNum').val(dataObj.planList.length); // 附件回显 fileList = []; delIdArr = []; $('#uploader-list').html(''); if(dataObj.fileList && dataObj.fileList.length>0){ dataObj.fileList.forEach((f,i)=>{ const uid = 'old_'+f.id; const path = fileUrl+f.fileUrl+'?token='+sessionStorage.getItem("gz-token"); fileList.push({uid,name:f.fileName,isExist:true,fileId:f.id,file:null}); $('#uploader-list').append(`
x
${handleFileType(i,{name:f.fileName,ext:f.type},path)}
`); }); } // 计划明细回显 planDetail(dataObj.planList); // 用车明细回显 carDetail(dataObj.detailsList); // 初始化全局数据 allDataList = dataObj.detailsList || []; jjDataArr = dataObj.planList || []; } },function(xhr,status,error){ errorFn(xhr,status,error); },null); } // ------------------- 计划明细 ------------------- function planDetail(list){ $('#plan-detail-table tr:not(:first)').remove(); if(list.length>0){ let html = ''; list.forEach((item,index)=>{ html+=` ${index+1} ${item.proName} ${item.code} ${item.supName} ${item.carNum} ${item.money} ${item.ygMoney}
删除
`; }); $('#plan-detail-table').append(html); } } // ------------------- 删除计划明细 ------------------- function delPlanDetail(index){ let planList = $('#plan-detail-table tr:not(:first)'); if(planList.length<=1){ return layer.msg('计划明细至少保留1条数据,无法删除!',{icon:7}); } let currentTr = planList.eq(index); let delCode = currentTr.find('td:eq(2)').text().trim(); if(!delCode) return layer.msg('未获取到需求计划编号,无法删除!',{icon:2}); layer.confirm('确定删除该计划明细及对应的用车明细数据吗?',{icon:3,title:'提示'},function(layIndex){ currentTr.remove(); $('#plan-detail-table tr:not(:first)').each(function(i){ $(this).find('td:eq(0)').text(i+1); }); deleteCarDetailByCode(delCode); jjDataArr = jjDataArr.filter(item=>item.code!==delCode); allDataList = allDataList.filter(item=>item.planCode!==delCode); layer.close(layIndex); }); } // ------------------- 删除用车明细 ------------------- function deleteCarDetailByCode(delCode){ ['#dispatch-car-table','#dispatch-car-table2'].forEach(tableId=>{ $(`${tableId} tr:not(:first)`).each(function(){ let $tr=$(this); let code = $tr.find('td:last a').text().trim() || $tr.find('td:last').text().replace(/<.*?>/g,'').trim(); if(code===delCode) $tr.remove(); }); if($(`${tableId} tr:not(:first)`).length===0){ $(`${tableId}`).css('display','none'); } }); } // ------------------- 用车明细 ------------------- function carDetail(list){ const carList = list.filter(item=>item.type==='车辆'); const dcList = list.filter(item=>item.type==='吊车'); setDispatchCarTable(carList); setDispatchCarTable2(dcList); function setDispatchCarTable(list){ $('#dispatch-car-table tr:not(:first)').remove(); if(list.length>0){ let html=''; list.forEach(item=>{ const imgNum = (item.carImage.filter(i=>i.type!=='6').length)+(item.driverUserImage.filter(i=>i.type!=='6').length)+item.fileList.length; const actualGls = formatToTwoDecimals(item.exeGls||0); html+=` ${item.type} ${item.name} ${item.model} ${item.carNum} ${item.ton}吨 ${item.goodsName} ${item.startAddress} ${item.endAddress} ${item.glsPrice} ¥ ${item.glsMoney||0} ${imgNum}查看附件>> ${item.planCode} `; }); $('#dispatch-car-table').removeAttr('style').append(html); }else{ $('#dispatch-car-table').css('display','none'); } } function setDispatchCarTable2(list){ $('#dispatch-car-table2 tr:not(:first)').remove(); if(list.length>0){ let html=''; list.forEach(item=>{ const imgNum = item.driverUserImage.filter(i=>['2','3'].includes(i.type)).length + item.operaImage.filter(i=>['2','3','6'].includes(i.type)).length + item.fileList.length; const actualPlanDay = item.exeDay||0; const actualDcMoney = formatToTwoDecimals(item.money||0); html+=` ${item.type} ${item.name} ${item.model} ${item.carNum} ${item.useAddress} ${item.dcUnit==='元/月/台'?item.monthPrice+'('+item.dcUnit+')':item.dayPrice+'('+item.dcUnit+')'}${item.isOutSet===1?'
'+(item.jcMoney||0)+'(进出场费)':''} ¥ ${item.dcMoney} ${imgNum}查看附件>> ${item.planCode} `; }); $('#dispatch-car-table2').removeAttr('style').append(html); }else{ $('#dispatch-car-table2').css('display','none'); } } } // ------------------- 安全序列化 ------------------- function safeStringify(obj){ const cache = new Set(); return JSON.stringify(obj,(key,value)=>{ if(typeof value==='object' && value!==null){ if(cache.has(value)) return; cache.add(value); } return value; }); } // ------------------- 文件类型显示 ------------------- 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 ``; } html=`

${file.name}

`; return html; } // ------------------- 删除附件 ------------------- $(document).on("click",".file-iteme .handle",function(e){ e.stopPropagation(); const $item=$(this).closest('.file-iteme'); const uid = $item.attr('data-uid'); const fileId = $item.attr('data-file-id'); if(fileId && !delIdArr.includes(fileId)) delIdArr.push(fileId); fileList = fileList.filter(f=>f.uid!==uid); $item.remove(); }); // ------------------- 获取编辑后的实际值 ------------------- function getEditedActualValues(){ let actualValues={carActualList:[],craneActualList:[]}; $('#dispatch-car-table .actual-gls').each(function(){ const id=$(this).data('id'); const val=formatToTwoDecimals($(this).val()); actualValues.carActualList.push({outDetailId:id,exeGls:val,inMoney:0}); }); $('#dispatch-car-table2 tr:not(:first)').each(function(){ const id=$(this).find('.actual-dc-money').data('id'); if(!id) return; const day=$(this).find('.actual-dc-planDay').val()||0; const money=formatToTwoDecimals($(this).find('.actual-dc-money').val()); actualValues.craneActualList.push({outDetailId:id,exeDay:day,inMoney:money}); }); return actualValues; } // ------------------- 格式化两位小数 ------------------- function formatToTwoDecimals(num){ return isNaN(Number(num))? '0.00': Number(num).toFixed(2); } // ------------------- 正则校验输入框 ------------------- $(document).on('input','.actual-gls,.actual-money,.actual-dc-money',function(){ this.value=this.value.replace(/[^0-9.]/g,'').replace(/\.{2,}/g,'.').replace(/^0+(?=\d)/,''); if(this.value.indexOf('.')!==-1){ const parts=this.value.split('.'); this.value=parts[0]+'.'+parts[1].substring(0,2);} const numValue=Number(this.value||0); if(numValue>100000000) this.value=(100000000).toFixed(2); }); $(document).on('blur','.actual-gls,.actual-money,.actual-dc-money',function(){ this.value=formatToTwoDecimals(this.value); }); // ------------------- 提交 ------------------- function submitApply(data){ if(fileList.length===0) return layer.msg('请上传付款单',{icon:7}); if(jjDataArr.length===0) return layer.msg('请选择需求计划',{icon:7}); if(allDataList.length===0) return layer.msg('用车明细数据为空,无法提交',{icon:7}); data.field.supId=objParam.supId; data.field.id=objParam.id; data.field.delFileId=delIdArr.join(','); let planList=[],detailsList=[]; jjDataArr.forEach(item=>{ planList.push({ id:item.id||'', planId:item.planId||item.id, supId:item.supId, money:item.money, type:item.type||'1', proId:item.proId||'', carNum:item.carNum||item.needNum||0 }); }); const actualValues = getEditedActualValues(); allDataList.forEach(item=>{ const carActual = actualValues.carActualList.find(v=>v.outDetailId==item.id); const craneActual = actualValues.craneActualList.find(v=>v.outDetailId==item.id); detailsList.push({ id:item.id||'', planId:item.planId||'', type:item.type||'车辆', supId:item.supId||objParam.supId, proId:item.proId||'', money:item.cost||item.money||0, outId:item.outId||'', exeGls:carActual?.exeGls||item.exeGls||'', inMoney:carActual?.inMoney||craneActual?.inMoney||'', exeDay:craneActual?.exeDay||item.exeDay||'', outDetailId:item.outDetailId||'', modelId:item.modelId||'', ton:item.ton||0 }); }); data.field.planList=planList; data.field.detailsList=detailsList; let formData = new FormData(); fileList.forEach(item=>{ if(!item.isExist && item.file) formData.append("file[]",item.file); }); formData.append('params',JSON.stringify(data.field)); let loadingMsg = layer.msg('正在提交保存,请稍等...',{icon:16,shade:0.01,time:'0'}); let url = dataUrl+'backstage/carBalance/updateBalanceData'; ajaxRequestByUploadFile(url, formData, function(){ $('.save,.cancel').addClass("layui-btn-disabled").attr("disabled",true); }, function(result){ layer.close(loadingMsg); $('.save,.cancel').removeClass("layui-btn-disabled").attr("disabled",false); if(result.code===200){ parent.layer.msg(result.msg,{icon:1}); closePage(1);} else layer.msg(result.msg,{icon:2}); }, function(xhr,status,error){ layer.close(loadingMsg); layer.msg('服务异常,请稍后重试',{icon:16,scrollbar:false,time:2000}); $('.save,.cancel').removeClass("layui-btn-disabled").attr("disabled",false); errorFn(xhr,status,error); }, null); } function saveData2() { $('#formSubmit').trigger('click') } // ------------------- 关闭页面 ------------------- function closePage(type){ let index = parent.layer.getFrameIndex(window.name); if(type==1) window.parent.reloadData(); parent.layer.close(index); }