// 全局变量
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");
// 从 suffix 取文件后缀
const ext = f.suffix ? f.suffix.replace('.', '').toLowerCase() : '';
fileList.push({uid, name: f.fileName, isExist: true, fileId: f.id, file: null});
$('#uploader-list').append(`
x
${handleFileType(i, {name: f.fileName, ext: ext}, 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} |
${item.remark} |
`;
});
$('#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} |
${item.remark} |
`;
});
$('#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 > 100000) this.value = (100000).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);
}