From e44ce4501ea4cf30e79b2181fda84cd3faf8ec8a Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期六, 12 七月 2025 15:34:02 +0800 Subject: [PATCH] 1.销售台账筛选时,展开的内容需收回 --- src/views/salesManagement/salesLedger/index.vue | 256 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 205 insertions(+), 51 deletions(-) diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue index 3ec809b..55dcf14 100644 --- a/src/views/salesManagement/salesLedger/index.vue +++ b/src/views/salesManagement/salesLedger/index.vue @@ -64,14 +64,15 @@ <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip /> <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip /> <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip /> - <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="180" show-overflow-tooltip + <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip :formatter="formattedNumber" /> <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip /> <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip /> <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip /> - <el-table-column fixed="right" label="鎿嶄綔" min-width="100" align="center"> + <el-table-column fixed="right" label="鎿嶄綔" min-width="140" align="center"> <template #default="scope"> - <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button> + <el-button link type="primary" size="small" :disabled="scope.row.invoiceTotal>0 || scope.row.entryPersonName !== userStore.nickName" @click="openForm('edit', scope.row)">缂栬緫</el-button> +<!-- <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>--> <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button> </template> </el-table-column> @@ -90,7 +91,7 @@ </el-col> <el-col :span="12"> <el-form-item label="涓氬姟鍛橈細" prop="salesman"> - <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable> + <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'"> <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" /> </el-select> @@ -100,12 +101,12 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo"> - <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable /> + <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'"/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId"> - <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable> + <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'"> <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"> {{ item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber @@ -118,47 +119,47 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName"> - <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable /> + <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="褰曞叆浜猴細" prop="entryPerson"> - <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled> - <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> - </el-select> - </el-form-item> - </el-col> + <el-col :span="12"> + <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate"> + <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" + format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" /> + </el-form-item> + </el-col> </el-row> <el-row :gutter="30"> + <el-col :span="12"> + <el-form-item label="褰曞叆浜猴細" prop="entryPerson"> + <el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled> + <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> + </el-select> + </el-form-item> + </el-col> <el-col :span="12"> <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate"> <el-date-picker style="width: 100%" v-model="form.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable disabled /> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate"> - <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" - format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable /> - </el-form-item> - </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="浠樻鏂瑰紡"> - <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable /> + <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" /> </el-form-item> </el-col> </el-row> <el-row> <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> - <el-button type="primary" @click="openProductForm('add')">娣诲姞</el-button> - <el-button plain type="danger" @click="deleteProduct">鍒犻櫎</el-button> + <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">娣诲姞</el-button> + <el-button v-if="operationType !== 'view'" plain type="danger" @click="deleteProduct" >鍒犻櫎</el-button> </el-form-item> </el-row> <el-table :data="productData" border @selection-change="productSelected" show-summary :summary-method="summarizeMainTable"> - <el-table-column align="center" type="selection" width="55" /> + <el-table-column align="center" type="selection" width="55" v-if="operationType !== 'view'" /> <el-table-column align="center" label="搴忓彿" type="index" width="60" /> <el-table-column label="浜у搧澶х被" prop="productCategory" /> <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" /> @@ -168,7 +169,7 @@ <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> - <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center"> + <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center" v-if="operationType !== 'view'"> <template #default="scope"> <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row)">缂栬緫</el-button> </template> @@ -177,7 +178,7 @@ <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="澶囨敞路锛�" prop="remark"> - <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" /> + <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" /> </el-form-item> </el-col> </el-row> @@ -187,8 +188,8 @@ <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove"> - <el-button type="primary">涓婁紶</el-button> - <template #tip> + <el-button type="primary" v-if="operationType !== 'view'">涓婁紶</el-button> + <template #tip v-if="operationType !== 'view'"> <div class="el-upload__tip"> 鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z @@ -235,38 +236,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 type="number" :step="0.1" :min="0" v-model="productForm.quantity" placeholder="璇疯緭鍏�" clearable - @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="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 v-model="productForm.taxInclusiveUnitPrice" 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 +415,8 @@ }, }); const { productForm, productRules } = toRefs(productFormData); +// 闃叉寰幆璁$畻鐨勬爣蹇� +const isCalculating = ref(false); const upload = reactive({ // 涓婁紶鐨勫湴鍧� url: import.meta.env.VITE_APP_BASE_API + "/file/upload", @@ -435,6 +439,7 @@ /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { page.current = 1; + expandedRowKeys.value = []; getList(); }; const paginationChange = (obj) => { @@ -493,7 +498,7 @@ if (nodes[i].children && nodes[i].children.length > 0) { const foundNode = findNodeById(nodes[i].children, productId); if (foundNode) { - return foundNode.label; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐� + return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐� } } } @@ -568,9 +573,8 @@ customerList().then((res) => { customerOption.value = res; }); - console.log("userStore.id", userStore.id); form.value.entryPerson = userStore.id; - if (type === "edit") { + if (type !== "add") { currentId.value = row.id; getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => { form.value = { ...res }; @@ -631,14 +635,15 @@ const submitForm = () => { proxy.$refs["formRef"].validate((valid) => { if (valid) { - if (productData.value.length > 0) { + console.log('productData.value--', productData.value) + if (productData.value !== null && productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value); } else { proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�"); return; } let tempFileIds = []; - if (fileList.value.length > 0) { + if (fileList.value !== null && fileList.value.length > 0) { tempFileIds = fileList.value.map((item) => item.tempId); } form.value.tempFileIds = tempFileIds; @@ -682,6 +687,7 @@ }; const submitProductEdit = () => { productForm.value.salesLedgerId = currentId.value; + productForm.value.type = 1 addOrUpdateSalesLedgerProduct(productForm.value).then((res) => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); closeProductDia(); @@ -806,6 +812,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