feat: 统一数值精度为三位小数并添加保养项目字段
- 将多个模块中的数值显示精度从两位小数改为三位小数,包括金额、百分比、数量等
- 在设备保养模块中新增保养项目字段,包括表单输入和表格展示
- 修复采购台账税率默认值和路由跳转路径问题
- 调整发票录入和销售台账的税率选项,增加0%选项
| | |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="保养项目"> |
| | | <el-input |
| | | style="width: 100%" |
| | | v-model="form.maintenanceItem" |
| | | placeholder="请输入保养项目" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </FormDialog> |
| | | </template> |
| | |
| | | value-format="HH:mm" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="保养项目" prop="maintenanceItem"> |
| | | <el-input v-model="form.maintenanceItem" placeholder="请输入保养项目" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType"> |
| | | <el-form-item label="日期" prop="frequencyDetail"> |
| | | <el-select v-model="form.week" placeholder="请选择" clearable style="width: 50%"> |
| | |
| | | }[cell] || "") |
| | | }, |
| | | { |
| | | prop: "maintenanceItem", |
| | | label: "保养项目", |
| | | minWidth: 150, |
| | | }, |
| | | { |
| | | prop: "frequencyDetail", |
| | | label: "开始日期与时间", |
| | | minWidth: 150, |
| | |
| | | align: "center", |
| | | prop: "createUserName", |
| | | }, |
| | | { |
| | | label: "保养项目", |
| | | align: "center", |
| | | prop: "maintenanceItem", |
| | | }, |
| | | // { |
| | | // label: "录入日期", |
| | | // align: "center", |
| | |
| | | |
| | | // 格式化货币 |
| | | const formatCurrency = (value) => { |
| | | if (!value) return '0.00'; |
| | | return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ','); |
| | | if (!value) return '0.000'; |
| | | return Number(value).toFixed(3).replace(/\B(?=(\d{3})+(?!\d))/g, ','); |
| | | }; |
| | | |
| | | // 获取状态标签类型 |
| | |
| | | align="right" |
| | | > |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.amount?.toFixed(2) }}</span> |
| | | <span>{{ scope.row.amount?.toFixed(3) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | |
| | | align="right" |
| | | > |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.liters?.toFixed(2) }}</span> |
| | | <span>{{ scope.row.liters?.toFixed(3) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | |
| | | <span |
| | | :style="scope.row.isAbnormal ? 'color:#F56C6C;font-weight:600;' : ''" |
| | | > |
| | | {{ scope.row.fuelConsumption != null ? scope.row.fuelConsumption.toFixed(2) : '-' }} |
| | | {{ scope.row.fuelConsumption != null ? scope.row.fuelConsumption.toFixed(3) : '-' }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | > |
| | | <template #default="scope"> |
| | | <span> |
| | | {{ scope.row.avgConsumption != null ? scope.row.avgConsumption.toFixed(2) : '-' }} |
| | | {{ scope.row.avgConsumption != null ? scope.row.avgConsumption.toFixed(3) : '-' }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | prop: "taxInclusiveUnitPrice", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : "-"; |
| | | return val ? parseFloat(val).toFixed(3) : "-"; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "taxInclusiveTotalPrice", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : "-"; |
| | | return val ? parseFloat(val).toFixed(3) : "-"; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "taxExclusiveTotalPrice", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : "-"; |
| | | return val ? parseFloat(val).toFixed(3) : "-"; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "ticketsAmount", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : "-"; |
| | | return val ? parseFloat(val).toFixed(3) : "-"; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "futureTicketsAmount", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : "-"; |
| | | return val ? parseFloat(val).toFixed(3) : "-"; |
| | | }, |
| | | }, |
| | | ], |
| | |
| | | prop: "taxInclusiveUnitPrice", |
| | | width: 150, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : 0; |
| | | return val ? parseFloat(val).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "taxInclusiveTotalPrice", |
| | | width: 150, |
| | | formatData: (val) => { |
| | | return parseFloat(val).toFixed(2) ?? 0; |
| | | return parseFloat(val).toFixed(3) ?? 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "taxExclusiveTotalPrice", |
| | | width: 150, |
| | | formatData: (val) => { |
| | | return parseFloat(val).toFixed(2) ?? 0; |
| | | return parseFloat(val).toFixed(3) ?? 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | ]; |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | if (cellValue == 0) { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | } |
| | | if (cellValue) { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | } else { |
| | | return cellValue; |
| | | } |
| | |
| | | item.ticketsNum = Number(item.tempFutureTickets || 0); |
| | | // 联动计算本次开票金额、未来票数、未来票金额 |
| | | const unitPrice = Number(item.taxInclusiveUnitPrice || 0); |
| | | item.ticketsAmount = Number((item.ticketsNum * unitPrice).toFixed(2)); |
| | | item.futureTickets = Number((item.tempFutureTickets - item.ticketsNum).toFixed(2)); |
| | | item.ticketsAmount = Number((item.ticketsNum * unitPrice).toFixed(3)); |
| | | item.futureTickets = Number((item.tempFutureTickets - item.ticketsNum).toFixed(3)); |
| | | item.futureTicketsAmount = Number( |
| | | (item.tempFutureTicketsAmount - item.ticketsAmount).toFixed(2) |
| | | (item.tempFutureTicketsAmount - item.ticketsAmount).toFixed(3) |
| | | ); |
| | | } |
| | | }); |
| | |
| | | const totalAmount = allProductData.reduce((sum, item) => { |
| | | return sum + (Number(item.ticketsAmount) || 0); |
| | | }, 0); |
| | | form.invoiceAmount = Number(totalAmount.toFixed(2)); |
| | | form.invoiceAmount = Number(totalAmount.toFixed(3)); |
| | | |
| | | // 存储选中的合同数据 |
| | | selectedContracts.value = selectedRows; |
| | |
| | | row.ticketsNum = Number(row.tempFutureTickets || 0); |
| | | } |
| | | // 计算本次来票金额 |
| | | row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(2)); |
| | | row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(3)); |
| | | // 计算未来票数 |
| | | row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(2)); |
| | | row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(3)); |
| | | // 计算未来票金额 |
| | | row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(2)); |
| | | row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(3)); |
| | | calculateinvoiceAmount(); |
| | | }; |
| | | |
| | |
| | | } |
| | | // 计算本次来票数 |
| | | row.ticketsNum = Number( |
| | | (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2) |
| | | (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(3) |
| | | ); |
| | | // 检查本次开票数是否大于未来票数 |
| | | if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) { |
| | | proxy.$modal.msgWarning("本次开票数不能大于未来票数"); |
| | | row.ticketsNum = Number(row.tempFutureTickets || 0); |
| | | // 重新计算本次来票金额 |
| | | row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(2)); |
| | | row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(3)); |
| | | } |
| | | // 计算未来票数 |
| | | row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(2)); |
| | | row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(3)); |
| | | // 计算未来票金额 |
| | | row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(2)); |
| | | row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(3)); |
| | | calculateinvoiceAmount(); |
| | | }; |
| | | |
| | |
| | | invoiceAmountTotal += Number(item.ticketsAmount); |
| | | } |
| | | }); |
| | | form.invoiceAmount = Number(invoiceAmountTotal.toFixed(2)); |
| | | form.invoiceAmount = Number(invoiceAmountTotal.toFixed(3)); |
| | | }; |
| | | |
| | | // 判断产品是否可以继续来票操作:如果未来票数和未来票金额都为0或小于等于0,则禁用 |
| | |
| | | prop: "contractAmount", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : 0; |
| | | return val ? parseFloat(val).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "receiptPaymentAmount", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : 0; |
| | | return val ? parseFloat(val).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "unReceiptPaymentAmount", |
| | | width:200, |
| | | formatData: (val) => { |
| | | return val ? parseFloat(val).toFixed(2) : 0; |
| | | return val ? parseFloat(val).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | label: "已付款金额(元)", |
| | | prop: "ticketsTotal", |
| | | formatData: (params) => { |
| | | return params ? parseFloat(params).toFixed(2) : 0; |
| | | return params ? parseFloat(params).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | | label: "待付款金额(元)", |
| | | prop: "pendingTicketsTotal", |
| | | formatData: (params) => { |
| | | return params ? parseFloat(params).toFixed(2) : 0; |
| | | return params ? parseFloat(params).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | ]); |
| | |
| | | |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | const val = Number(cellValue ?? 0); |
| | | return Number.isFinite(val) ? val.toFixed(2) : "0.00"; |
| | | return Number.isFinite(val) ? val.toFixed(3) : "0.00"; |
| | | }; |
| | | // 子表合计方法 |
| | | const summarizeMainTable1 = (param) => { |
| | |
| | | param, |
| | | ["ticketsTotal", "pendingTicketsTotal"], |
| | | { |
| | | ticketsTotal: { decimalPlaces: 3 }, |
| | | pendingTicketsTotal: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | // 子表合计方法 |
| | | const summarizeMainTable2 = (param) => { |
| | | return proxy.summarizeTable(param, ["currentPaymentAmount"], { |
| | | currentPaymentAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | }); |
| | |
| | | label: "付款金额", |
| | | prop: "currentPaymentAmount", |
| | | formatData: (params) => { |
| | | return params ? parseFloat(params).toFixed(2) : 0; |
| | | return params ? parseFloat(params).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | > |
| | | <template #payableAmountSlot="{ row }"> |
| | | <el-text type="danger"> |
| | | {{ parseFloat(row.payableAmount).toFixed(2) }} |
| | | {{ parseFloat(row.payableAmount).toFixed(3) }} |
| | | </el-text> |
| | | </template> |
| | | </PIMTable> |
| | |
| | | prop: "invoiceAmount", |
| | | width: 200, |
| | | formatData: (params) => { |
| | | return params ? parseFloat(params).toFixed(2) : 0; |
| | | return params ? parseFloat(params).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "paymentAmount", |
| | | width: 200, |
| | | formatData: (params) => { |
| | | return params ? parseFloat(params).toFixed(2) : 0; |
| | | return params ? parseFloat(params).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | param, |
| | | ["invoiceAmount", "paymentAmount", "payableAmount"], |
| | | { |
| | | invoiceAmount: { decimalPlaces: 3 }, |
| | | paymentAmount: { decimalPlaces: 3 }, |
| | | payableAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | param, |
| | | ["invoiceAmount", "paymentAmount"], |
| | | { |
| | | invoiceAmount: { decimalPlaces: 3 }, |
| | | paymentAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | summarizeTable[summarizeTable.length - 1] = |
| | | originalTableDataSon.value[ |
| | | originalTableDataSon.value.length - 1 |
| | | ].payableAmount.toFixed(2); |
| | | ].payableAmount.toFixed(3); |
| | | } else { |
| | | summarizeTable[summarizeTable.length - 1] = 0.0; |
| | | summarizeTable[summarizeTable.length - 1] = "0.000"; |
| | | } |
| | | return summarizeTable; |
| | | }; |
| | |
| | | }; |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | if (column.property !== "supplierName") { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | } else { |
| | | return cellValue; |
| | | } |
| | |
| | | <el-table-column label="规格型号" prop="specification" /> |
| | | <el-table-column label="供应商名称" prop="supplierName" /> |
| | | <el-table-column label="原价格" prop="oldPrice" width="120"> |
| | | <template #default="{ row }">¥{{ row.oldPrice.toFixed(2) }}</template> |
| | | <template #default="{ row }">¥{{ row.oldPrice.toFixed(3) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="新价格" prop="newPrice" width="120"> |
| | | <template #default="{ row }">¥{{ row.newPrice.toFixed(2) }}</template> |
| | | <template #default="{ row }">¥{{ row.newPrice.toFixed(3) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="调价幅度" prop="priceChange" width="120"> |
| | | <template #default="{ row }"> |
| | | <span :style="{ color: row.priceChange >= 0 ? '#f56c6c' : '#67c23a' }"> |
| | | {{ row.priceChange >= 0 ? '+' : '' }}{{ row.priceChange.toFixed(2) }}% |
| | | {{ row.priceChange >= 0 ? '+' : '' }}{{ row.priceChange.toFixed(3) }}% |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | form.createdAt = data.createdAt; |
| | | form.invoiceNumber = data.invoiceNumber; |
| | | form.ticketsNum = data.ticketsNum; |
| | | form.ticketsAmount = data.ticketsAmount.toFixed(2); |
| | | form.ticketsAmount = data.ticketsAmount.toFixed(3); |
| | | form.taxInclusiveUnitPrice = data.taxInclusiveUnitPrice; |
| | | form.futureTickets = data.futureTickets; |
| | | temFutureTickets.value = data.futureTickets; |
| | |
| | | Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice); |
| | | const futureTickets = |
| | | Number(temFutureTickets.value) - newTicketsNum; |
| | | form.futureTickets = Number(futureTickets.toFixed(2)); |
| | | form.ticketsAmount = Number(ticketsAmount.toFixed(2)); |
| | | form.futureTickets = Number(futureTickets.toFixed(3)); |
| | | form.ticketsAmount = Number(ticketsAmount.toFixed(3)); |
| | | }; |
| | | |
| | | const inputTicketsAmount = val => { |
| | |
| | | const maxAmount = maxTicketsNum.value * Number(form.taxInclusiveUnitPrice); |
| | | |
| | | if (Number(val) > maxAmount) { |
| | | proxy.$modal.msgWarning(`本次来票金额不得大于${maxAmount.toFixed(2)}元`); |
| | | form.ticketsAmount = maxAmount.toFixed(2); |
| | | proxy.$modal.msgWarning(`本次来票金额不得大于${maxAmount.toFixed(3)}元`); |
| | | form.ticketsAmount = maxAmount.toFixed(3); |
| | | form.ticketsNum = maxTicketsNum.value; |
| | | return; |
| | | } |
| | |
| | | if (ticketsNum > maxTicketsNum.value) { |
| | | proxy.$modal.msgWarning(`来票数不能大于${maxTicketsNum.value}`); |
| | | form.ticketsNum = maxTicketsNum.value; |
| | | form.ticketsAmount = maxAmount.toFixed(2); |
| | | form.ticketsAmount = maxAmount.toFixed(3); |
| | | return; |
| | | } |
| | | |
| | | form.ticketsNum = Number(ticketsNum.toFixed(2)); |
| | | form.ticketsNum = Number(ticketsNum.toFixed(3)); |
| | | |
| | | // 计算未来票数 |
| | | const newTicketsNum = form.ticketsNum - originalTicketsNum.value; |
| | | const futureTickets = Number(temFutureTickets.value) - newTicketsNum; |
| | | form.futureTickets = Number(futureTickets.toFixed(2)); |
| | | form.futureTickets = Number(futureTickets.toFixed(3)); |
| | | }; |
| | | |
| | | const open = async row => { |
| | |
| | | prop: "taxInclusiveTotalPrice", |
| | | width: 200, |
| | | formatData: (cell) => { |
| | | return cell ? parseFloat(cell).toFixed(2) : 0; |
| | | return cell ? parseFloat(cell).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "ticketsAmount", |
| | | width: 200, |
| | | formatData: (cell) => { |
| | | return cell ? parseFloat(cell).toFixed(2) : 0; |
| | | return cell ? parseFloat(cell).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | prop: "unTicketsPrice", |
| | | width: 200, |
| | | formatData: (cell) => { |
| | | return cell ? parseFloat(cell).toFixed(2) : 0; |
| | | return cell ? parseFloat(cell).toFixed(3) : 0; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | param, |
| | | ["ticketsAmount", "unTicketsPrice", "invoiceAmount"], |
| | | { |
| | | ticketsAmount: { decimalPlaces: 3 }, |
| | | unTicketsPrice: { decimalPlaces: 3 }, |
| | | invoiceAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, |
| | | futureTickets: { noDecimal: true }, |
| | | } |
| | |
| | | (c) => c.property === "taxInclusiveTotalPrice" |
| | | ); |
| | | if (taxInclusiveIndex !== -1) { |
| | | sums[taxInclusiveIndex] = taxInclusiveSum.toFixed(2); |
| | | sums[taxInclusiveIndex] = taxInclusiveSum.toFixed(3); |
| | | } |
| | | return sums; |
| | | }; |
| | |
| | | placeholder="请选择" |
| | | clearable |
| | | @change="mathNum"> |
| | | <el-option label="0" |
| | | :value="0" /> |
| | | <el-option label="1" |
| | | value="1" /> |
| | | :value="1" /> |
| | | <el-option label="6" |
| | | value="6" /> |
| | | :value="6" /> |
| | | <el-option label="13" |
| | | value="13" /> |
| | | :value="13" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | unit: "", |
| | | quantity: "", |
| | | taxInclusiveUnitPrice: "", |
| | | taxRate: "", |
| | | taxRate: 0, |
| | | taxInclusiveTotalPrice: "", |
| | | taxExclusiveTotalPrice: "", |
| | | invoiceType: "", |
| | |
| | | const openProductForm = async (type, row, index) => { |
| | | productOperationType.value = type; |
| | | productOperationIndex.value = index; |
| | | productForm.value = {}; |
| | | productForm.value = { |
| | | taxRate: 0, |
| | | invoiceType: "增普票" |
| | | }; |
| | | proxy.resetForm("productFormRef"); |
| | | productFormVisible.value = true; |
| | | |
| | |
| | | label: '采购金额', |
| | | prop: 'purchaseAmount', |
| | | formatData: (val) => { |
| | | return val ? `¥${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '¥0.00' |
| | | return val ? `¥${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 3, maximumFractionDigits: 3 })}` : '¥0.000' |
| | | } |
| | | }, |
| | | { |
| | |
| | | prop: 'averagePrice', |
| | | width: 120, |
| | | formatData: (val) => { |
| | | return val ? `¥${parseFloat(val).toFixed(2)}` : '¥0.00' |
| | | return val ? `¥${parseFloat(val).toFixed(3)}` : '¥0.000' |
| | | } |
| | | }, |
| | | { |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="总金额" prop="totalAmount" width="120"> |
| | | <template #default="{ row }">¥{{ row.totalAmount.toFixed(2) }}</template> |
| | | <template #default="{ row }">¥{{ row.totalAmount.toFixed(3) }}</template> |
| | | </el-table-column> |
| | | <el-table-column label="创建时间" prop="createTime" width="180" /> |
| | | <el-table-column label="操作" width="200" align="center"> |
| | |
| | | }); |
| | | |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | }; |
| | | |
| | | const closeModal = () => { |
| | |
| | | }) |
| | | const total = ref(0) |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | }; |
| | | |
| | | const paginationChange = (obj) => { |
| | |
| | | const unitPrice = Number(form.value.unitPrice ?? 0); |
| | | |
| | | if (quantity > 0 && unitPrice > 0) { |
| | | form.value.totalPrice = (quantity * unitPrice).toFixed(2); |
| | | form.value.totalPrice = (quantity * unitPrice).toFixed(3); |
| | | } else { |
| | | form.value.totalPrice = '0.00'; |
| | | } |
| | |
| | | </div> |
| | | <div class="sensor-data"> |
| | | <div class="data-item"> |
| | | <span>甲烷: {{ sensor.methane.toFixed(2) }}%</span> |
| | | <span>甲烷: {{ sensor.methane.toFixed(3) }}%</span> |
| | | <el-progress |
| | | :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)" |
| | | :color="getProgressColor(Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100), 80)" |
| | |
| | | /> |
| | | </div> |
| | | <div class="data-item"> |
| | | <span>硫化氢: {{ sensor.h2s.toFixed(2) }}ppm</span> |
| | | <span>硫化氢: {{ sensor.h2s.toFixed(3) }}ppm</span> |
| | | <el-progress |
| | | :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)" |
| | | :color="getProgressColor(Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100), 80)" |
| | |
| | | </div> |
| | | <div class="sensor-data"> |
| | | <div class="data-item"> |
| | | <span>甲烷: {{ sensor.methane.toFixed(2) }}%</span> |
| | | <span>甲烷: {{ sensor.methane.toFixed(3) }}%</span> |
| | | <el-progress |
| | | :percentage="Math.min(Math.round(sensor.methane * 40 * 100) / 100, 100)" |
| | | :color="getProgressColor(sensor.methane, 2.5)" |
| | |
| | | /> |
| | | </div> |
| | | <div class="data-item"> |
| | | <span>硫化氢: {{ sensor.h2s.toFixed(2) }}ppm</span> |
| | | <span>硫化氢: {{ sensor.h2s.toFixed(3) }}ppm</span> |
| | | <el-progress |
| | | :percentage="Math.min(Math.round((sensor.h2s / 20) * 100 * 100) / 100, 100)" |
| | | :color="getProgressColor(sensor.h2s, 10)" |
| | |
| | | formatProgress(percentage) { |
| | | if (percentage == null || isNaN(percentage)) return '0.00%' |
| | | const val = Math.round(Number(percentage) * 100) / 100 |
| | | return `${val.toFixed(2)}%` |
| | | return `${val.toFixed(3)}%` |
| | | }, |
| | | // 初始化图表 |
| | | initChart() { |
| | |
| | | <el-col :span="12"> |
| | | <el-form-item label="税率(%):" prop="taxRate"> |
| | | <el-select v-model="productForm.taxRate" placeholder="请选择" clearable @change="calculateFromTaxRate"> |
| | | <el-option label="1" value="1" /> |
| | | <el-option label="6" value="6" /> |
| | | <el-option label="13" value="13" /> |
| | | <el-option label="0" :value="0" /> |
| | | <el-option label="1" :value="1" /> |
| | | <el-option label="6" :value="6" /> |
| | | <el-option label="13" :value="13" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | unit: '', |
| | | quantity: '', |
| | | taxInclusiveUnitPrice: '', |
| | | taxRate: '', |
| | | taxRate: 0, |
| | | taxInclusiveTotalPrice: '', |
| | | taxExclusiveTotalPrice: '', |
| | | invoiceType: '' |
| | | invoiceType: '增普票' |
| | | }, |
| | | productRules: { |
| | | productCategoryId: [{ required: true, message: '请选择', trigger: 'change' }], |
| | |
| | | unit: '', |
| | | quantity: '', |
| | | taxInclusiveUnitPrice: '', |
| | | taxRate: '', |
| | | taxRate: 0, |
| | | taxInclusiveTotalPrice: '', |
| | | taxExclusiveTotalPrice: '', |
| | | invoiceType: '' |
| | | invoiceType: '增普票' |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | const formatPercent = (val) => { |
| | | const num = Number(val) || 0 |
| | | return `${num.toFixed(2)}%` |
| | | return `${num.toFixed(3)}%` |
| | | } |
| | | |
| | | const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down') |
| | |
| | | |
| | | const formatPercent = (val) => { |
| | | const num = Number(val) || 0 |
| | | return `${Math.abs(num).toFixed(2)}%` |
| | | return `${Math.abs(num).toFixed(3)}%` |
| | | } |
| | | |
| | | const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down') |
| | |
| | | const formatAmountWanNumber = (val) => { |
| | | const num = Number(val) || 0 |
| | | if (Math.abs(num) >= 10000) { |
| | | return (num / 10000).toFixed(2) |
| | | return (num / 10000).toFixed(3) |
| | | } |
| | | return num.toFixed(2) |
| | | return num.toFixed(3) |
| | | } |
| | | |
| | | const formatPercent = (val) => { |
| | | const num = Number(val) || 0 |
| | | // 百分比展示始终用绝对值,小数保留两位 |
| | | return `${Math.abs(num).toFixed(2)}%` |
| | | return `${Math.abs(num).toFixed(3)}%` |
| | | } |
| | | |
| | | const metricClass = (metric) => { |
| | |
| | | // 点击跳转页面 |
| | | console.log('点击了', item) |
| | | router.push({ |
| | | path: '/productionManagement/productionOrder', |
| | | path: '/productionManagement/productionManagement/workOrder/index', |
| | | query: { |
| | | name: item.name, |
| | | } |
| | |
| | | |
| | | const formatPercent = (val) => { |
| | | const num = Number(val) || 0 |
| | | return `${num.toFixed(2)}%` |
| | | return `${num.toFixed(3)}%` |
| | | } |
| | | |
| | | const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down') |
| | |
| | | return { |
| | | rank: `Top${index + 1}`, |
| | | productName: item.productName || `产品${index + 1}`, |
| | | total: total.toFixed(2), |
| | | finished: finished.toFixed(2), |
| | | qualifiedRate: passRate.toFixed(2), |
| | | total: total.toFixed(3), |
| | | finished: finished.toFixed(3), |
| | | qualifiedRate: passRate.toFixed(3), |
| | | percentage: Math.min(100, Math.max(0, passRate)), // 确保百分比在0-100之间 |
| | | } |
| | | }) |
| | |
| | | }); |
| | | }; |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | }; |
| | | // 主表合计方法 |
| | | const summarizeMainTable = param => { |
| | |
| | | item => item.id == customerId.value |
| | | ); |
| | | summarizeTable[summarizeTable.length - 1] = |
| | | tableData.value[index].unReceiptPaymentAmount.toFixed(2); |
| | | tableData.value[index].unReceiptPaymentAmount.toFixed(3); |
| | | } else { |
| | | summarizeTable[summarizeTable.length - 1] = 0.0; |
| | | } |
| | |
| | | <el-form-item :label="`发票金额(元): `" prop="invoiceTotal"> |
| | | <el-input-number :step="0.01" :min="0" :max="maxInvoiceAmount || form.taxInclusiveTotalPrice" style="width: 100%" v-model="form.invoiceTotal" placeholder="请输入" clearable :precision="2"/> |
| | | <div v-if="maxInvoiceAmount > 0" style="color: #909399; font-size: 12px; margin-top: 5px;"> |
| | | 可填最大金额为:¥{{ maxInvoiceAmount.toFixed(2) }}元 |
| | | 可填最大金额为:¥{{ maxInvoiceAmount.toFixed(3) }}元 |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | if (cellValue == 0) { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | } |
| | | if (cellValue) { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | } else { |
| | | return cellValue; |
| | | } |
| | | }; |
| | | |
| | | const formattedInputNumber = (value) => { |
| | | return value ? parseFloat(value).toFixed(2) : 0; |
| | | return value ? parseFloat(value).toFixed(3) : 0; |
| | | }; |
| | | |
| | | // 判断是否可以开票(基于选中的台账数据) |
| | |
| | | "contractAmount", |
| | | "invoiceTotal", |
| | | "noInvoiceAmountTotal", |
| | | ]); |
| | | ], { |
| | | contractAmount: { decimalPlaces: 3 }, |
| | | invoiceTotal: { decimalPlaces: 3 }, |
| | | noInvoiceAmountTotal: { decimalPlaces: 3 }, |
| | | }); |
| | | }; |
| | | // 子表合计方法 |
| | | const summarizeChildrenTable = (param) => { |
| | |
| | | "noInvoiceNum", |
| | | "noInvoiceAmount", |
| | | "currentInvoiceNum", |
| | | ]); |
| | | ], { |
| | | taxInclusiveUnitPrice: { decimalPlaces: 3 }, |
| | | taxInclusiveTotalPrice: { decimalPlaces: 3 }, |
| | | taxExclusiveTotalPrice: { decimalPlaces: 3 }, |
| | | invoiceNum: { decimalPlaces: 3 }, |
| | | invoiceAmount: { decimalPlaces: 3 }, |
| | | currentInvoiceAmount: { decimalPlaces: 3 }, |
| | | noInvoiceNum: { decimalPlaces: 3 }, |
| | | noInvoiceAmount: { decimalPlaces: 3 }, |
| | | currentInvoiceNum: { decimalPlaces: 3 }, |
| | | }); |
| | | }; |
| | | // 打开弹框 |
| | | const openForm = () => { |
| | |
| | | // 计算本次开票金额 |
| | | row.currentInvoiceAmount = ( |
| | | row.currentInvoiceNum * row.taxInclusiveUnitPrice |
| | | ).toFixed(2); |
| | | ).toFixed(3); |
| | | // 计算未开票数 |
| | | row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed( |
| | | 2 |
| | |
| | | // 计算未开票金额 |
| | | row.noInvoiceAmount = ( |
| | | row.tempnoInvoiceAmount - row.currentInvoiceAmount |
| | | ).toFixed(2); |
| | | ).toFixed(3); |
| | | }; |
| | | // 本次开票金额失焦操作 |
| | | const invoiceAmountBlur = (row) => { |
| | |
| | | // 计算本次开票数 |
| | | row.currentInvoiceNum = ( |
| | | row.currentInvoiceAmount / row.taxInclusiveUnitPrice |
| | | ).toFixed(2); |
| | | ).toFixed(3); |
| | | console.log("row.currentInvoiceNum ", row.currentInvoiceNum); |
| | | console.log(" row.originalNoInvoiceNum ", row.originalNoInvoiceNum); |
| | | // 计算未开票数 |
| | |
| | | // 计算未开票金额 |
| | | row.noInvoiceAmount = ( |
| | | row.tempnoInvoiceAmount - row.currentInvoiceAmount |
| | | ).toFixed(2); |
| | | ).toFixed(3); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | |
| | | param, |
| | | ["receiptPaymentAmountTotal", "noReceiptAmount"], |
| | | { |
| | | receiptPaymentAmountTotal: { decimalPlaces: 3 }, |
| | | noReceiptAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | }; |
| | | // 子表合计方法 |
| | | const summarizeChildrenTable = (param) => { |
| | | return proxy.summarizeTable(param, ["receiptPaymentAmount"]); |
| | | return proxy.summarizeTable(param, ["receiptPaymentAmount"], { |
| | | receiptPaymentAmount: { decimalPlaces: 3 }, |
| | | }); |
| | | }; |
| | | // 打开弹框 |
| | | const openForm = () => { |
| | |
| | | }); |
| | | }; |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | return parseFloat(cellValue).toFixed(3); |
| | | }; |
| | | // 主表合计方法 |
| | | const summarizeMainTable = (param) => { |
| | |
| | | param, |
| | | ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"], |
| | | { |
| | | invoiceTotal: { decimalPlaces: 3 }, |
| | | receiptPaymentAmount: { decimalPlaces: 3 }, |
| | | unReceiptPaymentAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | param, |
| | | ["invoiceAmount", "receiptAmount", "unReceiptAmount"], |
| | | { |
| | | invoiceAmount: { decimalPlaces: 3 }, |
| | | receiptAmount: { decimalPlaces: 3 }, |
| | | unReceiptAmount: { decimalPlaces: 3 }, |
| | | ticketsNum: { noDecimal: true }, // 不保留小数 |
| | | futureTickets: { noDecimal: true }, // 不保留小数 |
| | | } |
| | |
| | | (item) => item.id == customerId.value |
| | | ); |
| | | summarizeTable[summarizeTable.length - 1] = |
| | | tableData.value[index].unReceiptPaymentAmount.toFixed(2); |
| | | tableData.value[index].unReceiptPaymentAmount.toFixed(3); |
| | | } else { |
| | | summarizeTable[summarizeTable.length - 1] = 0.0; |
| | | summarizeTable[summarizeTable.length - 1] = "0.000"; |
| | | } |
| | | return summarizeTable; |
| | | }; |
| | |
| | | <el-col :span="12"> |
| | | <el-form-item label="税率(%):" prop="taxRate"> |
| | | <el-select v-model="productForm.taxRate" placeholder="请选择" clearable @change="calculateFromTaxRate"> |
| | | <el-option label="1" value="1" /> |
| | | <el-option label="6" value="6" /> |
| | | <el-option label="13" value="13" /> |
| | | <el-option label="0" :value="0" /> |
| | | <el-option label="1" :value="1" /> |
| | | <el-option label="6" :value="6" /> |
| | | <el-option label="13" :value="13" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | unit: "", |
| | | quantity: "", |
| | | taxInclusiveUnitPrice: "", |
| | | taxRate: "", |
| | | taxRate: 0, |
| | | taxInclusiveTotalPrice: "", |
| | | taxExclusiveTotalPrice: "", |
| | | invoiceType: "", |
| | |
| | | productData.value = products.map((p) => { |
| | | const quantity = Number(p.quantity ?? 0) || 0; |
| | | const unitPrice = Number(p.unitPrice ?? 0) || 0; |
| | | const taxRate = "0"; // 默认 13%,便于直接提交(如需可在产品中自行修改) |
| | | const taxRate = Number(p.taxRate ?? 0) || 0; // 默认 13%,便于直接提交(如需可在产品中自行修改) |
| | | const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3); |
| | | const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate, 3); |
| | | return { |
| | |
| | | } |
| | | |
| | | productOperationType.value = type; |
| | | productForm.value = {}; |
| | | productForm.value = { |
| | | taxRate: 0, |
| | | invoiceType: "增普票" |
| | | }; |
| | | proxy.resetForm("productFormRef"); |
| | | if (type === "edit") { |
| | | productForm.value = { ...row }; |
| | |
| | | const submitProduct = () => { |
| | | proxy.$refs["productFormRef"].validate((valid) => { |
| | | if (valid) { |
| | | productForm.value.taxRate = productForm.value.taxRate?productForm.value.taxRate:0; |
| | | if (operationType.value === "edit") { |
| | | submitProductEdit(); |
| | | } else { |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="totalAmount" label="报价金额" width="120"> |
| | | <template #default="scope"> |
| | | ¥{{ scope.row.totalAmount.toFixed(2) }} |
| | | ¥{{ scope.row.totalAmount.toFixed(3) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" width="200" fixed="right" align="center"> |
| | |
| | | <el-table-column prop="unitPrice" label="单价"> |
| | | <template #default="scope"> |
| | | <el-form-item :prop="`products.${scope.$index}.unitPrice`" class="product-table-form-item"> |
| | | <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" /> |
| | | <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="3" style="width: 100%" /> |
| | | </el-form-item> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <!-- <el-tag :type="getStatusType(currentQuotation.status)">{{ currentQuotation.status }}</el-tag>--> |
| | | <!-- </el-descriptions-item>--> |
| | | <el-descriptions-item label="报价总额" :span="2"> |
| | | <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">¥{{ currentQuotation.totalAmount?.toFixed(2) }}</span> |
| | | <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">¥{{ currentQuotation.totalAmount?.toFixed(3) }}</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | |
| | | <el-table-column prop="unit" label="单位" /> |
| | | <el-table-column prop="unitPrice" label="单价"> |
| | | <template #default="scope"> |
| | | ¥{{ scope.row.unitPrice.toFixed(2) }} |
| | | ¥{{ scope.row.unitPrice.toFixed(3) }} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |