diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysCustomerQuoteChild.java b/ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysCustomerQuoteChild.java index 6c852cb3..6600c658 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysCustomerQuoteChild.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/domain/SysCustomerQuoteChild.java @@ -70,12 +70,12 @@ public class SysCustomerQuoteChild extends BaseEntity @Excel(name = "物料的对外售价") private BigDecimal materialSole; - /** 物料的不含税单价(RMB) */ - @Excel(name = "物料的不含税单价(RMB) ") + /** 物料的含税单价(RMB) */ + @Excel(name = "物料的含税单价(RMB) ") private BigDecimal materialRmb; - /** 物料的含税单价(RMB) */ - @Excel(name = "物料的含税单价(RMB)") + /** 物料的不含税单价(RMB) */ + @Excel(name = "物料的不含税单价(RMB)") private BigDecimal materialNoRmb; /** 物料的不含税单价(USD) */ @@ -94,12 +94,12 @@ public class SysCustomerQuoteChild extends BaseEntity @Excel(name = "物料的不含税总价(USD)") private BigDecimal materialNoUsdSum; - /** 物料的含税总价(RMB) */ - @Excel(name = "物料的含税总价(RMB)") - private BigDecimal materialNoRmbSum; - /** 物料的不含税总价(RMB) */ @Excel(name = "物料的不含税总价(RMB)") + private BigDecimal materialNoRmbSum; + + /** 物料的含税总价(RMB) */ + @Excel(name = "物料的含税总价(RMB)") private BigDecimal materialRmbSum; /** 审核状态 */ diff --git a/ruoyi-admin/src/main/resources/templates/system/customerQuote/add.html b/ruoyi-admin/src/main/resources/templates/system/customerQuote/add.html index f81c34f4..5d218ee8 100644 --- a/ruoyi-admin/src/main/resources/templates/system/customerQuote/add.html +++ b/ruoyi-admin/src/main/resources/templates/system/customerQuote/add.html @@ -49,9 +49,9 @@
- +
- +
@@ -124,7 +124,7 @@ 添加物料 - + 添加无料号物料
@@ -255,6 +255,43 @@ commonCurrency = $("#commonCurrency_add option:selected").val(); console.log("commonCurrency",commonCurrency); }); + + + + //添加收款明细 + function insertNoMaterialNoRow() { + // 生成一个简单的唯一标识,这里使用时间戳作为示例 + var uniqueId = new Date().getTime(); + // 创建一个新行数据模板,这里仅为示例,具体根据表格列来定义 + var newRow = { + materialId:uniqueId, + materialCode: "", + materialName: "", + materialType: "", + describe: "", + brand: "", + unit: "", + processMethod: "", + photoUrl: "", + }; + + // 使用Bootstrap Table的API插入新行 + $('#bootstrap-sub-table-quoteChild').bootstrapTable('append', newRow); + + } + + // // 逻辑删除收款凭证前端的一行数据 + // function removeRow(receivablesRecordsId){ + // console.log(receivablesRecordsId); + // // 直接使用 receivablesRecordsId 值进行删除操作 + // $("#bootstrap-receivablesVoucher-table").bootstrapTable('remove', { + // field: 'receivablesRecordsId', + // values: receivablesRecordsId + // }); + // } + + + $(function() { var options = { id:'bootstrap-sub-table-quoteChild', @@ -333,21 +370,6 @@ {title: '国内税率',field: 'countTax',align: 'center',}, { title: '美元汇率',field: 'usdTax', align: 'center',}, - {field: 'materialNum',align: 'center',title: '物料的数量', - editable:{ - type : 'text', - mode: 'inline', - title : '物料的数量', - validate : function(value) { - if (!value) { - return '用量不能为空'; - } - if (isNaN(value)) { - return '用量必须为数字'; - } - } - }, - }, { title: '物料的不含税单价(RMB)', field: 'materialNoRmb', align: 'center', @@ -376,6 +398,24 @@ } } }, + { title: '物料的含税单价(RMB)',field: 'materialRmb',align: 'center',}, + {field: 'materialNum',align: 'center',title: '物料的数量', + editable:{ + type : 'text', + mode: 'inline', + title : '物料的数量', + validate : function(value) { + if (!value) { + return '用量不能为空'; + } + if (isNaN(value)) { + return '用量必须为数字'; + } + } + }, + }, + {title: '物料的不含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',}, + { title: '物料的含税总价(RMB)',field: 'materialRmbSum',align: 'center',}, {title: '物料的不含税单价(美元)', field: 'materialNoUsd', align: 'center', @@ -407,9 +447,6 @@ { title: '物料的含税单价(美元)',field: 'materialUsd',align: 'center',}, { title: '物料的含税总价(美元)',field: 'materialUsdSum', align: 'center',}, { title: '物料的不含税总价(美元)',field: 'materialNoUsdSum',align: 'center',}, - { title: '物料的含税总价(RMB)',field: 'materialRmb',align: 'center',}, - { title: '物料的含税总价(RMB)',field: 'materialNoRmbSum',align: 'center',}, - {title: '物料的不含税总价(RMB)',field: 'materialRmbSum',align: 'center',}, {field: 'createBy', align: 'center',title: '录入人',visible: false}, {field: 'createTime',align: 'center',title: '录入时间',visible: false}, {field: 'updateBy',align: 'center',title: '更新人',visible: false}, @@ -427,45 +464,75 @@ } } ], - onEditableSave:function(field, row, oldValue, $el){ - var commonCurrency1 = $("#commonCurrency_add option:selected").val(); - var rmb1 = $("#rmbTax_add").val(); - if (rmb1 =='' || rmb1== null){ - rmb1 = 0; - }else{ - rmb1 = $("#rmbTax_add").val(); - } - var rmb = parseFloat(rmb1); - var usd = $("#usdTax_add").val(); - if (usd =='' || usd== null){ - usd = 0; - }else{ - usd = parseFloat(usd); + + onClickCell: function(field, value, row, $element) { + // 根据物料号是否存在决定是否允许编辑 + if (field !== 'index' && field !== 'materialCode' && field !== 'photoUrl' && field !== 'operation') { + var isEditable = !row.materialCode; // 如果物料号不存在,则允许编辑 + // 判断是否已有编辑框,避免重复打开 + if (isEditable && !$element.find('.editable-input').length) { + // 模拟开启编辑 + var input = $(''); + $element.empty().append(input); + input.focus(); + input.blur(function() { + // 用户离开输入框时,手动保存编辑值并关闭编辑状态 + var newValue = input.val(); + // 这里你需要添加代码来实际更新表格数据和关闭编辑状态 + row[field] = newValue; // 更新数据模型 + $element.text(newValue).removeClass('editing'); + }); + $element.addClass('editing'); + } } - console.log(commonCurrency1); - if(commonCurrency1 == 1){ - row.materialNoRmb = parseFloat(row.materialNoRmb).toFixed(2); - row.materialRmb = parseFloat(row.materialNoRmb * parseFloat(1 + rmb)).toFixed(2); - row.materialNoRmbSum = parseFloat(row.materialNum * parseFloat(row.materialNoRmb)).toFixed(2); - row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2); - row.materialNoUsd = parseFloat(row.materialNoRmb / usd).toFixed(2); - row.materialNoUsdSum = parseFloat(row.materialNum * row.materialNoUsd).toFixed(2); - row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2); - row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2); + }, + + onEditableSave: function(field, row, oldValue, $el) { + var commonCurrency1 = $("#commonCurrency_add option:selected").val(); + //把上面输入的百分比国内汇率由整数转换成小数 + var rmbRateInput = parseFloat($("#rmbTax_add").val()) || 0; + var rmbRate = rmbRateInput / 100; // 将输入的百分比转换为小数 + rmbRate = parseFloat(rmbRate.toFixed(2)); // 确保rmbRate转换为两位小数的浮点数 + var usdRate = parseFloat($("#usdTax_add").val()) || 0; + + var testMaterialNum = parseFloat(row.materialNum) || 0; + + console.log("rmbRate:",rmbRate) + console.log("usdRate:",usdRate) + + console.log("testMaterialNum:",testMaterialNum) + // // 确保计算使用的是正确的数值类型 + // var noTaxValue = field === 'materialNoRmb' ? parseFloat(row.materialNoRmb) : parseFloat(row.materialNoUsd); + // + // // 计算不含税价格 + // var noTaxPrice = noTaxValue.toFixed(2); + // 根据选择的货币类型计算其他值 + if (commonCurrency1 === '1') { + // RMB为基准货币 + row.materialRmb = (parseFloat(row.materialNoRmb) * (1 + rmbRate)).toFixed(2); + row.materialRmbSum = (parseFloat(row.materialRmb) * testMaterialNum).toFixed(2); + row.materialNoRmbSum = (parseFloat(row.materialNoRmb) * testMaterialNum).toFixed(2); + row.materialNoUsd = (parseFloat(row.materialNoRmb) / usdRate).toFixed(2); + row.materialUsd = row.materialNoUsd; // 保持一致,除非有特别的计算逻辑 + row.materialUsdSum = (parseFloat(row.materialUsd) * testMaterialNum).toFixed(2); + row.materialNoUsdSum = (parseFloat(row.materialNoUsd) * testMaterialNum).toFixed(2); + } else if (commonCurrency1 === '2') { + // USD为基准货币 + row.materialUsd = row.materialNoUsd + row.materialUsdSum = (parseFloat(row.materialUsd) * testMaterialNum).toFixed(2); + row.materialNoUsdSum = (parseFloat(row.materialNoUsd) * testMaterialNum).toFixed(2); + row.materialNoRmb = (parseFloat(row.materialNoUsd) * usdRate).toFixed(2); + row.materialRmb = (parseFloat(row.materialNoRmb) * (1 + rmbRate)).toFixed(2); + row.materialNoRmbSum = (parseFloat(row.materialNoRmb) * testMaterialNum).toFixed(2); + row.materialRmbSum = (parseFloat(row.materialRmb) * testMaterialNum).toFixed(2); } - else if( commonCurrency1 == 2){ - row.materialNoUsd = parseFloat(row.materialNoUsd).toFixed(2); - row.materialUsd = parseFloat(row.materialNoUsd).toFixed(2); - row.materialUsdSum = parseFloat(row.materialNum * row.materialUsd).toFixed(2); - row.materialNoUsdSum = parseFloat(row.materialNoUsd * row.materialNum).toFixed(2); - row.materialNoRmb = parseFloat(row.materialNoUsd * usd).toFixed(2); - row.materialRmb = parseFloat(row.materialNoRmb * (1 + rmb)).toFixed(2); - row.materialNoRmbSum = parseFloat(row.materialNoRmb * row.materialNum).toFixed(2); - row.materialRmbSum = parseFloat(row.materialRmb * row.materialNum).toFixed(2); + + // 确保getTotalAmount函数存在且正确引用 + if (typeof getTotalAmount === 'function') { + getTotalAmount(); } - getTotalAmount() - }, + } }; $.table.init(options); }); @@ -548,10 +615,18 @@ $.modal.alertWarning("请先选择客户"); return; } + + if ($("#usdTax_add").val() == null || $("#usdTax_add").val() == '') { + $.modal.alertWarning("请输入美元汇率"); + return; + } + if ($("#rmbTax_add").val() == null || $("#rmbTax_add").val() == '') { - $.modal.alertWarning("请先选择输入国内的税率"); + $.modal.alertWarning("请输入国内的税率"); return; } + + var url = ctx + "erp/material/select"; var options = { title: '选择料号', @@ -573,96 +648,148 @@ autoclose: true }); //计算金额 + // function getTotalAmount() { + // // 获取表格数据 + // const data = $("#bootstrap-sub-table-quoteChild").bootstrapTable('getData', true); + // // 初始化汇总对象,减少代码重复并提高清晰度 + // const sums = { + // enterprise: "", // 用于拼接物料名称和数量 + // enterpriseSum: 0, // 物料总数量 + // currencies: { + // noRmb: { total: 0, single: 0 }, // 非人民币数量与总金额 + // rmb: { total: 0, single: 0 }, // 人民币 + // noUsd: { total: 0, single: 0 }, // 非美元 + // usd: { total: 0, single: 0 } // 美元 + // } + // }; + // // 遍历数据进行计算 + // for (let i = 0; i < data.length; i++) { + // const item = data[i]; + // // 拼接物料信息 + // sums.enterprise += "" + item.materialName + ": 数量 : " + item.materialNum; + // sums.enterpriseSum += parseFloat(item.materialNum); // 累加物料数量 + // // 分别累加各货币的单个金额和总金额 + // ['noRmb', 'rmb', 'noUsd', 'usd'].forEach(currency => { + // sums.currencies[currency].single += parseFloat(item['material' + [currency] ]); + // sums.currencies[currency].total += parseFloat(item['material' + [currency] + 'Sum']); + // }); + // } + // updateFormValues(sums); + // } + // function updateFormValues(sums) { + // // 物料合计与数量合计没有在sums中直接给出,这里假设它们需要单独处理或已存在于页面其他部分 + // $("#enterprise_add").val(sums.enterprise); + // $("#enterpriseSum_add").val(sums.enterpriseSum); + // + // // 更新不含税单价和总价 + // $("#noRmb_add").val(sums.currencies.noRmb.single); + // $("#noRmbSum_add").val(sums.currencies.noRmb.total); + // + // $("#rmb_add").val(sums.currencies.rmb.single); + // $("#rmbSum_add").val(sums.currencies.rmb.total); + // + // $("#noUsd_add").val(sums.currencies.noUsd.single); + // $("#noUsdSum_add").val(sums.currencies.noUsd.total); + // + // $("#usd_add").val(sums.currencies.usd.single); + // $("#usdSum_add").val(sums.currencies.usd.total); + // } + // $(document).ready(function() { + // // 监听货币选项变化 + // $("#commonCurrency_add").on("change", function() { + // var isEditable = $(this).val() === "1"; + // var fieldName = ""; + // var materialColumnCells = $('#bootstrap-sub-table-quoteChild tbody tr td [field=" '+ fieldName+' "]'); + // // 根据是否可编辑,添加或移除xEditable + // materialColumnCells.each(function() { + // var cell = $(this); + // var currentValue = cell.text().trim(); // 获取当前单元格的值 + // + // if (isEditable) { + // // 如果允许编辑且尚未添加xEditable + // if (!cell.hasClass('editable')) { + // cell.addClass('editable'); // 添加标记类,以便跟踪状态 + // cell.editable({ + // type: 'text', + // pk: cell.closest('tr').data('id'), // 假设每行有唯一ID + // title: '物料的数量', + // validate: function(value) { + // if (!value) return '金额不能为空'; + // if (isNaN(value)) return '金额必须为数字'; + // return true; + // }, + // success: function(response, newValue) { + // // 成功后的回调,这里可以根据需要处理服务器响应 + // } + // }); + // } + // } else { + // // 如果不允许编辑且已添加了xEditable + // if (cell.hasClass('editable')) { + // cell.removeClass('editable'); + // // 这里简化处理,实际中可能需要更复杂的逻辑来销毁xEditable实例 + // cell.off('.editable'); // 移除xEditable绑定的事件 + // cell.text(currentValue); // 还原原始文本 + // } + // } + // }); + // }); + // + // // 初始化时触发一次,根据默认状态设置可编辑性 + // $("#commonCurrency_add").trigger("change"); + // }); function getTotalAmount() { - // 获取表格数据 - const data = $("#bootstrap-sub-table-quoteChild").bootstrapTable('getData', true); - // 初始化汇总对象,减少代码重复并提高清晰度 - const sums = { - enterprise: "", // 用于拼接物料名称和数量 - enterpriseSum: 0, // 物料总数量 - currencies: { - noRmb: { total: 0, single: 0 }, // 非人民币数量与总金额 - rmb: { total: 0, single: 0 }, // 人民币 - noUsd: { total: 0, single: 0 }, // 非美元 - usd: { total: 0, single: 0 } // 美元 - } - }; - // 遍历数据进行计算 - for (let i = 0; i < data.length; i++) { - const item = data[i]; - // 拼接物料信息 - sums.enterprise += "" + item.materialName + ": 数量 : " + item.materialNum; - sums.enterpriseSum += parseFloat(item.materialNum); // 累加物料数量 - // 分别累加各货币的单个金额和总金额 - ['noRmb', 'rmb', 'noUsd', 'usd'].forEach(currency => { - sums.currencies[currency].single += parseFloat(item['material' + [currency] ]); - sums.currencies[currency].total += parseFloat(item['material' + [currency] + 'Sum']); - }); - } - updateFormValues(sums); - } - function updateFormValues(sums) { - // 物料合计与数量合计没有在sums中直接给出,这里假设它们需要单独处理或已存在于页面其他部分 - $("#enterprise_add").val(sums.enterprise); - $("#enterpriseSum_add").val(sums.enterpriseSum); + var getData = $("#bootstrap-sub-table-quoteChild").bootstrapTable('getData'); + var enterprise = 0; + var enterpriseSum = 0; + var noRmb = 0; + var rmb = 0; + var noRmbSum = 0; + var rmbSum = 0; + var noUsd = 0; + var usd = 0; + var noUsdSum = 0; + var usdSum = 0; - // 更新不含税单价和总价 - $("#noRmb_add").val(sums.currencies.noRmb.single); - $("#noRmbSum_add").val(sums.currencies.noRmb.total); + // 计算企业数量和物料数量总和 + enterprise = getData.length; // 直接获取数据长度 + enterpriseSum = getData.reduce((sum, item) => sum + (parseInt(item.materialNum) || 0), 0); - $("#rmb_add").val(sums.currencies.rmb.single); - $("#rmbSum_add").val(sums.currencies.rmb.total); + // 先累加数值,toFixed在累加后应用以避免精度损失 + for (let i = 0; i < getData.length; i++) { + noRmb += parseFloat(getData[i].materialNoRmb) || 0; + rmb += parseFloat(getData[i].materialRmb) || 0; + noRmbSum += parseFloat(getData[i].materialNoRmbSum) || 0; + rmbSum += parseFloat(getData[i].materialRmbSum) || 0; + noUsd += parseFloat(getData[i].materialNoUsd) || 0; + usd += parseFloat(getData[i].materialUsd) || 0; + noUsdSum += parseFloat(getData[i].materialNoUsdSum) || 0; + usdSum += parseFloat(getData[i].materialUsdSum) || 0; + } - $("#noUsd_add").val(sums.currencies.noUsd.single); - $("#noUsdSum_add").val(sums.currencies.noUsd.total); + // 将累加的结果格式化为两位小数 + noRmb = noRmb.toFixed(2); + rmb = rmb.toFixed(2); + noRmbSum = noRmbSum.toFixed(2); + rmbSum = rmbSum.toFixed(2); + noUsd = noUsd.toFixed(2); + usd = usd.toFixed(2); + noUsdSum = noUsdSum.toFixed(2); + usdSum = usdSum.toFixed(2); - $("#usd_add").val(sums.currencies.usd.single); - $("#usdSum_add").val(sums.currencies.usd.total); + // 设置表单输入值 + $("input[name='enterprise']").val(enterprise); + $("input[name='enterpriseSum']").val(enterpriseSum); + $("input[name='noRmb']").val(noRmb); + $("input[name='noRmbSum']").val(noRmbSum); + $("input[name='rmb']").val(rmb); + $("input[name='rmbSum']").val(rmbSum); + $("input[name='noUsd']").val(noUsd); + $("input[name='noUsdSum']").val(noUsdSum); + $("input[name='usd']").val(usd); + $("input[name='usdSum']").val(usdSum); } - $(document).ready(function() { - // 监听货币选项变化 - $("#commonCurrency_add").on("change", function() { - var isEditable = $(this).val() === "1"; - var fieldName = ""; - var materialColumnCells = $('#bootstrap-sub-table-quoteChild tbody tr td [field=" '+ fieldName+' "]'); - // 根据是否可编辑,添加或移除xEditable - materialColumnCells.each(function() { - var cell = $(this); - var currentValue = cell.text().trim(); // 获取当前单元格的值 - - if (isEditable) { - // 如果允许编辑且尚未添加xEditable - if (!cell.hasClass('editable')) { - cell.addClass('editable'); // 添加标记类,以便跟踪状态 - cell.editable({ - type: 'text', - pk: cell.closest('tr').data('id'), // 假设每行有唯一ID - title: '物料的数量', - validate: function(value) { - if (!value) return '金额不能为空'; - if (isNaN(value)) return '金额必须为数字'; - return true; - }, - success: function(response, newValue) { - // 成功后的回调,这里可以根据需要处理服务器响应 - } - }); - } - } else { - // 如果不允许编辑且已添加了xEditable - if (cell.hasClass('editable')) { - cell.removeClass('editable'); - // 这里简化处理,实际中可能需要更复杂的逻辑来销毁xEditable实例 - cell.off('.editable'); // 移除xEditable绑定的事件 - cell.text(currentValue); // 还原原始文本 - } - } - }); - }); - // 初始化时触发一次,根据默认状态设置可编辑性 - $("#commonCurrency_add").trigger("change"); - }); \ No newline at end of file