From fd3e3b19aaf23c4f68d8b98d514499510b152e39 Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期五, 11 七月 2025 15:54:47 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- src/views/procurementManagement/procurementInvoiceLedger/index.vue | 4 src/views/procurementManagement/procurementLedger/index.vue | 101 ++++++++++---- src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue | 34 ++++ src/store/modules/user.js | 2 src/views/procurementManagement/invoiceEntry/index.vue | 14 + src/views/salesManagement/salesLedger/index.vue | 187 ++++++++++++++++++++++++-- src/views/procurementManagement/invoiceEntry/components/Modal.vue | 45 +++++- src/views/salesManagement/invoiceRegistration/index.vue | 5 src/api/qualityManagement/qualityInspectFile.js | 4 9 files changed, 325 insertions(+), 71 deletions(-) diff --git a/src/api/qualityManagement/qualityInspectFile.js b/src/api/qualityManagement/qualityInspectFile.js index 1039755..36b72cb 100644 --- a/src/api/qualityManagement/qualityInspectFile.js +++ b/src/api/qualityManagement/qualityInspectFile.js @@ -8,7 +8,7 @@ params: query, }) } -// 鏌ヨ闄勪欢鍒楄〃 +// 淇濆瓨闄勪欢鍒楄〃 export function qualityInspectFileAdd(query) { return request({ url: '/quality/qualityInspectFile/add', @@ -16,7 +16,7 @@ data: query, }) } -// 鏌ヨ闄勪欢鍒楄〃 +// 鍒犻櫎闄勪欢鍒楄〃 export function qualityInspectFileDel(query) { return request({ url: '/quality/qualityInspectFile/del', diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 2dd2797..89e9c2b 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -52,7 +52,7 @@ this.avatar = avatar this.currentFactoryName = user.currentFactoryName this.nickName = user.nickName - this.currentDeptId = user.currentDeptId + this.currentDeptId = user.tenantId resolve(res) }).catch(error => { reject(error) diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue index e3d96af..ae6a79f 100644 --- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue +++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue @@ -113,12 +113,14 @@ rowKey="id" :column="columns" :tableData="form.productData" + :summaryMethod="summarizeChildrenTable" + :isShowSummary="true" height="auto" > <template #ticketsNumRef="{ row }"> <el-input-number v-model="row.ticketsNum" - placeholder="璇烽�夋嫨" + placeholder="璇疯緭鍏�" :min="0" :step="0.1" clearable @@ -129,7 +131,7 @@ <template #ticketsAmountRef="{ row }"> <el-input-number v-model="row.ticketsAmount" - placeholder="璇烽�夋嫨" + placeholder="璇疯緭鍏�" :min="0" :step="0.1" clearable @@ -150,6 +152,7 @@ <script setup> import { ref, getCurrentInstance } from "vue"; +import { defineEmits } from 'vue'; import { useModal } from "@/hooks/useModal"; import useFormData from "@/hooks/useFormData"; import FileUpload from "@/components/Upload/FileUpload.vue"; @@ -210,6 +213,8 @@ } = useModal({ title: "鏉ョエ鐧昏", }); + +const emit = defineEmits(['refreshList']); const columns = [ { @@ -283,10 +288,12 @@ { label: "鏈潵绁ㄦ暟", prop: "futureTickets", + width: 100, }, { label: "鏈潵绁ㄩ噾棰�(鍏�)", prop: "futureTicketsAmount", + width: 200, }, ]; @@ -316,7 +323,19 @@ form.productData = data.productData; } }; - +// 瀛愯〃鍚堣鏂规硶 +const summarizeChildrenTable = (param) => { + return proxy.summarizeTable(param, [ + "taxInclusiveUnitPrice", + "taxInclusiveTotalPrice", + "taxExclusiveTotalPrice", + "ticketsNum", + "ticketsAmount", + "ticketsAmountRef", + "futureTickets", + "futureTicketsAmount", + ]); +}; //鏈鏉ョエ鏁板け鐒︽搷浣� const invoiceNumBlur = (row) => { if (!row.ticketsNum || row.ticketsNum === "") { @@ -328,11 +347,11 @@ return; } // 璁$畻鏈鏉ョエ閲戦 - row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice; + row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2) // 璁$畻鏈潵绁ㄦ暟 - row.futureTickets = row.tempFutureTickets - row.ticketsNum; + row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2) // 璁$畻鏈潵绁ㄩ噾棰� - row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2) calculateinvoiceAmount(); }; @@ -351,9 +370,9 @@ (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2) ); // 璁$畻鏈潵绁ㄦ暟 - row.futureTickets = row.tempFutureTickets - row.ticketsNum; + row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2) // 璁$畻鏈潵绁ㄩ噾棰� - row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount; + row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2) calculateinvoiceAmount(); }; @@ -361,7 +380,7 @@ let invoiceAmountTotal = 0; form.productData.forEach((item) => { if (item.ticketsAmount) { - invoiceAmountTotal += item.ticketsAmount; + invoiceAmountTotal += Number(item.ticketsAmount); } }); form.invoiceAmount = invoiceAmountTotal.toFixed(2); @@ -381,6 +400,11 @@ const removeFile = (file) => { const { tempId } = file.response.data; form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId); +}; + +const closeAndRefresh = () => { + closeModal(); + emit('refreshList'); }; const submitForm = () => { @@ -406,7 +430,7 @@ }); modalLoading.value = false; if (code == 200) { - closeModal(); + closeAndRefresh(); } } else { modalLoading.value = false; @@ -416,6 +440,7 @@ defineExpose({ open, + closeAndRefresh, }); </script> diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue index 6df5636..0a22685 100644 --- a/src/views/procurementManagement/invoiceEntry/index.vue +++ b/src/views/procurementManagement/invoiceEntry/index.vue @@ -24,8 +24,8 @@ <el-button type="primary" @click="handleAdd('add')"> 鏂板鐧昏 </el-button> - <el-button @click="handleOut">瀵煎嚭</el-button> - <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> +<!-- <el-button @click="handleOut">瀵煎嚭</el-button>--> +<!-- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>--> </div> </div> <PIMTable @@ -61,7 +61,7 @@ </template> </PIMTable> </div> - <Modal ref="modalRef"></Modal> + <Modal ref="modalRef" @refreshList="getTableData"></Modal> </div> </template> @@ -203,7 +203,13 @@ const handleDelete = () => { let ids = []; if (selectedRows.value.length > 0) { - ids = selectedRows.value.map((item) => item.id); + // 鏂板鍒ゆ柇锛氬鏋滄湁閫変腑鐨勬暟鎹病鏈塼icketRegistrationId锛屾彁绀哄苟缁堟 + const noTicket = selectedRows.value.some(item => !item.ticketRegistrationId); + if (noTicket) { + proxy.$modal.msgWarning("閲囪喘鍙拌处杩樻湭杩涜鏉ョエ鐧昏,鏃犳硶杩涜鍒犻櫎鎿嶄綔"); + return; + } + ids = selectedRows.value.map((item) => item.ticketRegistrationId); } else { proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); return; diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue b/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue index 12da5e7..ba4ae28 100644 --- a/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue +++ b/src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue @@ -28,12 +28,12 @@ </el-col> <el-col :span="12"> <el-form-item label="鏉ョエ鏁帮細"> - <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.ticketsNum" @input="inputTicketsNum" /> + <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsNum" @change="inputTicketsNum" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鏈鏉ョエ閲戦(鍏�)锛�"> - <el-text type="success">{{ form.ticketsAmount }}</el-text> + <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="form.ticketsAmount" @change="inputTicketsAmount" /> </el-form-item> </el-col> <el-col :span="12"> @@ -81,12 +81,40 @@ }; const inputTicketsNum = (val) => { + // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂 + if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) { + proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟"); + return; + } + if (Number(form.ticketsNum) > Number(form.futureTickets)) { proxy.$modal.msgWarning("寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟"); form.ticketsNum = form.futureTickets return; } - form.ticketsAmount = (val * form.taxInclusiveUnitPrice).toFixed(2); + + // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠� + const ticketsAmount = Number(val) * Number(form.taxInclusiveUnitPrice); + form.ticketsAmount = Number(ticketsAmount.toFixed(2)); +}; +const inputTicketsAmount = (val) => { + // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂 + if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) { + proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟"); + return; + } + + if (Number(val) > Number(form.futureTickets*form.taxInclusiveUnitPrice)) { + proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鎬婚噾棰�"); + form.ticketsAmount = (form.futureTickets*form.taxInclusiveUnitPrice).toFixed(2) + const ticketsNum = Number(form.ticketsAmount) / Number(form.taxInclusiveUnitPrice); + form.ticketsNum = Number(ticketsNum.toFixed(2)) + return; + } + + // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠� + const ticketsNum = Number(val) / Number(form.taxInclusiveUnitPrice); + form.ticketsNum = Number(ticketsNum.toFixed(2)); }; defineExpose({ diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue index f969167..06fe153 100644 --- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue +++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue @@ -193,7 +193,7 @@ { label: "涓嶅惈绋庨噾棰�", prop: "unTicketsPrice", - width: 100, + width: 200, formatData: (cell) => { return cell ? parseFloat(cell).toFixed(2) : 0; }, @@ -201,7 +201,7 @@ { label: "澧炲�肩◣", prop: "invoiceAmount", - width: 100, + width: 200, }, { label: "闄勪欢", diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue index 457abe0..6376816 100644 --- a/src/views/procurementManagement/procurementLedger/index.vue +++ b/src/views/procurementManagement/procurementLedger/index.vue @@ -429,18 +429,20 @@ /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="鏁伴噺锛�" prop="quantity"> - <el-input-number - :step="0.1" - clearable - style="width: 100%" - v-model="productForm.quantity" - placeholder="璇疯緭鍏�" - @change="mathNum" - /> - </el-form-item> - </el-col> + <el-col :span="12"> + <el-form-item label="绋庣巼(%)锛�" prop="taxRate"> + <el-select + v-model="productForm.taxRate" + placeholder="璇烽�夋嫨" + clearable + @change="mathNum" + > + <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> </el-row> <el-row :gutter="30"> <el-col :span="12"> @@ -455,20 +457,18 @@ /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="绋庣巼(%)锛�" prop="taxRate"> - <el-select - v-model="productForm.taxRate" - placeholder="璇烽�夋嫨" - clearable - @change="mathNum" - > - <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> + <el-col :span="12"> + <el-form-item label="鏁伴噺锛�" prop="quantity"> + <el-input-number + :step="0.1" + clearable + style="width: 100%" + v-model="productForm.quantity" + placeholder="璇疯緭鍏�" + @change="mathNum" + /> + </el-form-item> + </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> @@ -479,7 +479,7 @@ :step="0.1" clearable style="width: 100%" - disabled + @change="reverseMathNum('taxInclusiveTotalPrice')" /> </el-form-item> </el-col> @@ -488,7 +488,10 @@ label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice" > - <el-input v-model="productForm.taxExclusiveTotalPrice" disabled /> + <el-input + v-model="productForm.taxExclusiveTotalPrice" + @change="reverseMathNum('taxExclusiveTotalPrice')" + /> </el-form-item> </el-col> </el-row> @@ -1010,7 +1013,10 @@ return `${year}-${month}-${day}`; } const mathNum = () => { - console.log("productForm.value", productForm.value); + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } if (!productForm.value.taxInclusiveUnitPrice) { return; } @@ -1032,6 +1038,43 @@ ); } }; +const reverseMathNum = (field) => { + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } + const taxRate = Number(productForm.value.taxRate); + if (!taxRate) return; + if (field === 'taxInclusiveTotalPrice') { + // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环 + if (productForm.value.quantity) { + productForm.value.taxInclusiveUnitPrice = + (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2); + } + // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺 + else if (productForm.value.taxInclusiveUnitPrice) { + productForm.value.quantity = + (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2); + } + // 鍙嶇畻涓嶅惈绋庢�讳环 + productForm.value.taxExclusiveTotalPrice = + (Number(productForm.value.taxInclusiveTotalPrice) / (1 + taxRate / 100)).toFixed(2); + } else if (field === 'taxExclusiveTotalPrice') { + // 鍙嶇畻鍚◣鎬讳环 + productForm.value.taxInclusiveTotalPrice = + (Number(productForm.value.taxExclusiveTotalPrice) * (1 + taxRate / 100)).toFixed(2); + // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠� + if (productForm.value.quantity) { + productForm.value.taxInclusiveUnitPrice = + (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2); + } + // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲� + else if (productForm.value.taxInclusiveUnitPrice) { + productForm.value.quantity = + (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2); + } + } +}; // 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶 const salesLedgerChange = async (row) => { console.log("row", row); diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue index e9dd49e..f5c293c 100644 --- a/src/views/salesManagement/invoiceRegistration/index.vue +++ b/src/views/salesManagement/invoiceRegistration/index.vue @@ -320,7 +320,7 @@ <template #default="scope"> <el-input-number :step="0.1" :min="0" style="width: 100%" v-model="scope.row.currentInvoiceNum" - @blur="invoiceNumBlur(scope.row)" + @change="invoiceNumBlur(scope.row)" ></el-input-number> </template> </el-table-column> @@ -332,7 +332,7 @@ <template #default="scope"> <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.currentInvoiceAmount" - @blur="invoiceAmountBlur(scope.row)" + @change="invoiceAmountBlur(scope.row)" ></el-input-number> </template> </el-table-column> @@ -539,6 +539,7 @@ "currentInvoiceAmount", "noInvoiceNum", "noInvoiceAmount", + "currentInvoiceNum", ]); }; // 鎵撳紑寮规 diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index c2ebd2c..b49a6d8 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/src/views/salesManagement/salesLedger/index.vue @@ -235,38 +235,39 @@ <el-input v-model="productForm.unit" placeholder="璇疯緭鍏�" clearable /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="鏁伴噺锛�" prop="quantity"> - <el-input-number :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable - @change="mathNum" style="width: 100%" /> - </el-form-item> - </el-col> + <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-select> + </el-form-item> + </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice"> - <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%" placeholder="璇疯緭鍏�" clearable @change="mathNum" /> + <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%" + placeholder="璇疯緭鍏�" clearable @change="calculateFromUnitPrice" /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="绋庣巼(%)锛�" prop="taxRate"> - <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="mathNum"> - <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> + <el-col :span="12"> + <el-form-item label="鏁伴噺锛�" prop="quantity"> + <el-input-number :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable + @change="calculateFromQuantity" style="width: 100%" /> + </el-form-item> + </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice"> - <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled /> + <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromTotalPrice" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�" prop="taxExclusiveTotalPrice"> - <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable disabled /> + <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="璇疯緭鍏�" clearable @change="calculateFromExclusiveTotalPrice" /> </el-form-item> </el-col> </el-row> @@ -413,6 +414,8 @@ }, }); const { productForm, productRules } = toRefs(productFormData); +// 闃叉寰幆璁$畻鐨勬爣蹇� +const isCalculating = ref(false); const upload = reactive({ // 涓婁紶鐨勫湴鍧� url: import.meta.env.VITE_APP_BASE_API + "/file/upload", @@ -808,6 +811,154 @@ ); } }; + +// 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲� +const calculateFromTotalPrice = () => { + if (isCalculating.value) return; + + const totalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice); + const quantity = parseFloat(productForm.value.quantity); + + if (!totalPrice || !quantity || quantity <= 0) { + return; + } + + isCalculating.value = true; + + // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺 + productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2); + + // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环 + if (productForm.value.taxRate) { + productForm.value.taxExclusiveTotalPrice = + proxy.calculateTaxExclusiveTotalPrice( + totalPrice, + productForm.value.taxRate + ); + } + + isCalculating.value = false; +}; + +// 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲� +const calculateFromExclusiveTotalPrice = () => { + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } + if (isCalculating.value) return; + + const exclusiveTotalPrice = parseFloat(productForm.value.taxExclusiveTotalPrice); + const quantity = parseFloat(productForm.value.quantity); + const taxRate = parseFloat(productForm.value.taxRate); + + if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) { + return; + } + + isCalculating.value = true; + + // 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100) + const taxRateDecimal = taxRate / 100; + const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal); + productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2); + + // 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺 + productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2); + + isCalculating.value = false; +}; + +// 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环 +const calculateFromQuantity = () => { + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } + if (isCalculating.value) return; + + const quantity = parseFloat(productForm.value.quantity); + const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice); + + if (!quantity || quantity <= 0 || !unitPrice) { + return; + } + + isCalculating.value = true; + + // 璁$畻鍚◣鎬讳环 + productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2); + + // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环 + if (productForm.value.taxRate) { + productForm.value.taxExclusiveTotalPrice = + proxy.calculateTaxExclusiveTotalPrice( + productForm.value.taxInclusiveTotalPrice, + productForm.value.taxRate + ); + } + + isCalculating.value = false; +}; + +// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环 +const calculateFromUnitPrice = () => { + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } + if (isCalculating.value) return; + + const quantity = parseFloat(productForm.value.quantity); + const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice); + + if (!quantity || quantity <= 0 || !unitPrice) { + return; + } + + isCalculating.value = true; + + // 璁$畻鍚◣鎬讳环 + productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2); + + // 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环 + if (productForm.value.taxRate) { + productForm.value.taxExclusiveTotalPrice = + proxy.calculateTaxExclusiveTotalPrice( + productForm.value.taxInclusiveTotalPrice, + productForm.value.taxRate + ); + } + + isCalculating.value = false; +}; + +// 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环 +const calculateFromTaxRate = () => { + if (!productForm.value.taxRate) { + proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼"); + return; + } + if (isCalculating.value) return; + + const inclusiveTotalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice); + const taxRate = parseFloat(productForm.value.taxRate); + + if (!inclusiveTotalPrice || !taxRate) { + return; + } + + isCalculating.value = true; + + // 璁$畻涓嶅惈绋庢�讳环 + productForm.value.taxExclusiveTotalPrice = + proxy.calculateTaxExclusiveTotalPrice( + inclusiveTotalPrice, + taxRate + ); + + isCalculating.value = false; +}; /** * 涓嬭浇鏂囦欢 * -- Gitblit v1.9.3