From 388e286dc8a5b3b8c4717cc74bf128c807eba6b7 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期一, 20 四月 2026 14:07:58 +0800
Subject: [PATCH] fix: 阳光彩印-修复总价计算中的数值处理并调整税率验证逻辑
---
src/views/salesManagement/salesLedger/index.vue | 164 ++++++++++++++++++++++++++++++++++--------------------
1 files changed, 103 insertions(+), 61 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index e1089fd..d3daec6 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -87,7 +87,7 @@
</div>
</template>
</el-table-column>
- <el-table-column label="鏁伴噺" prop="quantity" />
+ <el-table-column label="鏁伴噺" prop="quantity" :formatter="formattedNumber" />
<el-table-column label="绋庣巼(%)" prop="taxRate" />
<el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
<el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
@@ -153,7 +153,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="涓氬姟鍛橈細" prop="salesman">
- <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
+ <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" filterable>
<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
:value="item.nickName" />
</el-select>
@@ -163,7 +163,7 @@
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
- <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
+ <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" filterable>
<el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
{{
item.customerName
@@ -317,7 +317,7 @@
<el-table-column prop="status" label="瀹℃壒鐘舵��" width="120" align="center" />
<el-table-column prop="totalAmount" label="鎶ヤ环閲戦(鍏�)" width="160" align="right">
<template #default="scope">
- {{ Number(scope.row.totalAmount ?? 0).toFixed(2) }}
+ {{ Number(scope.row.totalAmount ?? 0).toFixed(3) }}
</template>
</el-table-column>
<el-table-column fixed="right" label="鎿嶄綔" width="120" align="center">
@@ -352,11 +352,8 @@
<el-row :gutter="30">
<el-col :span="24">
<el-form-item label="浜у搧澶х被锛�" prop="productCategory">
- <!-- <el-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable>
- <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
- </el-select> -->
- <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable check-strictly
- @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
+ <el-tree-select v-model="productForm.productCategory" placeholder="璇烽�夋嫨" clearable filterable check-strictly
+ @change="getModels" :data="productOptions" :render-after-expand="false" style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
@@ -389,14 +386,14 @@
<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%"
- :precision="2"
+ :precision="3"
placeholder="璇疯緭鍏�" clearable @change="calculateFromUnitPrice" />
</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
- :precision="2"
+ :precision="3"
@change="calculateFromQuantity" style="width: 100%" />
</el-form-item>
</el-col>
@@ -507,7 +504,7 @@
<div class="info-row">
<div>
<span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">{{ item.customerName || '寮犵埍鏈�' }}</span>
+ <span class="value">{{ item.customerName }}</span>
</div>
<span class="label">鍗曞彿锛�</span>
<span class="value">{{ item.salesContractNo }}</span>
@@ -689,6 +686,7 @@
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import { getCurrentDate } from "@/utils/index.js";
+import {listCustomerPrivatePool} from "@/api/basicData/customerFile.js";
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
@@ -769,14 +767,14 @@
taxInclusiveUnitPrice: [
{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
- taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ // taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
taxInclusiveTotalPrice: [
{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
taxExclusiveTotalPrice: [
{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
],
- invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ // invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
},
});
const { productForm, productRules } = toRefs(productFormData);
@@ -938,7 +936,7 @@
});
};
const formattedNumber = (row, column, cellValue) => {
- return parseFloat(cellValue).toFixed(2);
+ return parseFloat(cellValue).toFixed(3);
};
// 鑾峰彇tree瀛愭暟鎹�
const getModels = (value) => {
@@ -1050,7 +1048,11 @@
"contractAmount",
"taxInclusiveTotalPrice",
"taxExclusiveTotalPrice",
- ]);
+ ], {
+ contractAmount: { decimalPlaces: 3 },
+ taxInclusiveTotalPrice: { decimalPlaces: 3 },
+ taxExclusiveTotalPrice: { decimalPlaces: 3 },
+ });
};
// 瀛愯〃鍚堣鏂规硶
const summarizeChildrenTable = (param) => {
@@ -1058,18 +1060,43 @@
"taxInclusiveUnitPrice",
"taxInclusiveTotalPrice",
"taxExclusiveTotalPrice",
- ]);
+ ], {
+ taxInclusiveUnitPrice: { decimalPlaces: 3 },
+ taxInclusiveTotalPrice: { decimalPlaces: 3 },
+ taxExclusiveTotalPrice: { decimalPlaces: 3 },
+ });
};
+// 鍒ゆ柇鏄惁鑳界紪杈�
+const canEditLedger = (row) => {
+ // 濡傛灉鏄淮鎶や汉锛屽垯鍙互缂栬緫
+ return Number(row.entryPerson) === Number(userStore.id);
+};
+
+// 鍒ゆ柇鏄惁鑳藉垹闄�
+const canDeleteLedger = (row) => {
+ // 濡傛灉鏄淮鎶や汉锛屽垯鍙互鍒犻櫎
+ return Number(row.entryPerson) === Number(userStore.id);
+};
+
+// 鍒ゆ柇鏄惁鏄淮鎶や汉锛堢敤浜庢潈闄愭牎楠岋級
+const isMaintainer = (row) => {
+ return row.entryPerson === userStore.id;
+};
+
// 鎵撳紑寮规
const openForm = async (type, row) => {
+ if (type === "edit" && row && !canEditLedger(row)) {
+ proxy.$modal.msgWarning("褰撳墠绯荤粺鐧诲綍浜轰笉鏄淮鎶や汉锛屼笉鑳界紪杈戞暟鎹�");
+ return;
+ }
operationType.value = type;
form.value = {};
productData.value = [];
selectedQuotation.value = null;
let userLists = await userListNoPage();
userList.value = userLists.data;
- customerList().then((res) => {
- customerOption.value = res;
+ listCustomerPrivatePool({current: -1,size:-1}).then((res) => {
+ customerOption.value = res.data.records;
});
form.value.entryPerson = userStore.id;
if (type === "add") {
@@ -1105,8 +1132,9 @@
// 鍏堢‘淇濆鎴峰垪琛ㄥ凡鍔犺浇锛屼究浜庡悗缁洖濉� customerId
if (!customerOption.value || customerOption.value.length === 0) {
try {
- const res = await customerList();
- customerOption.value = res;
+ listCustomerPrivatePool({current: -1,size:-1}).then((res) => {
+ customerOption.value = res.data.records;
+ });
} catch (e) {
// ignore锛屽厑璁哥敤鎴峰悗缁墜鍔ㄩ�夋嫨瀹㈡埛
}
@@ -1172,9 +1200,9 @@
productData.value = products.map((p) => {
const quantity = Number(p.quantity ?? 0) || 0;
const unitPrice = Number(p.unitPrice ?? 0) || 0;
- const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
- const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
- const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate);
+ const taxRate = "0"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
+ const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
+ const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate, 3);
return {
// 鍙拌处瀛楁
productCategory: p.product || p.productName || "",
@@ -1182,7 +1210,7 @@
unit: p.unit || "",
quantity: quantity,
taxRate: taxRate,
- taxInclusiveUnitPrice: unitPrice.toFixed(2),
+ taxInclusiveUnitPrice: unitPrice.toFixed(3),
taxInclusiveTotalPrice: taxInclusiveTotalPrice,
taxExclusiveTotalPrice: taxExclusiveTotalPrice,
invoiceType: "澧炴櫘绁�",
@@ -1250,6 +1278,7 @@
addOrUpdateSalesLedger(form.value).then((res) => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
closeDia();
+ expandedRowKeys.value = [];
getList();
});
}
@@ -1443,6 +1472,11 @@
const handleDelete = async () => {
if (selectedRows.value.length === 0) {
proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+ return;
+ }
+ const unauthorizedRows = selectedRows.value.filter((row) => !canDeleteLedger(row));
+ if (unauthorizedRows.length > 0) {
+ proxy.$modal.msgWarning("褰撳墠鐧诲綍鐢ㄦ埛涓嶆槸褰曞叆浜猴紝涓嶈兘鍒犻櫎璇ユ暟鎹�");
return;
}
const ids = selectedRows.value.map((item) => item.id);
@@ -1816,7 +1850,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.quantity) || 0);
}, 0);
- return total.toFixed(2);
+ return total.toFixed(3);
};
// 璁$畻浜у搧鎬婚噾棰�
@@ -1825,7 +1859,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
}, 0);
- return total.toFixed(2);
+ return total.toFixed(3);
};
// 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
@@ -1834,7 +1868,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.quantity) || 0);
}, 0);
- return total.toFixed(2);
+ return total.toFixed(3);
};
const getTotalAmountForPrint = (products) => {
@@ -1842,7 +1876,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
}, 0);
- return total.toFixed(2);
+ return total.toFixed(3);
};
const mathNum = () => {
@@ -1857,14 +1891,16 @@
productForm.value.taxInclusiveTotalPrice =
proxy.calculateTaxIncludeTotalPrice(
productForm.value.taxInclusiveUnitPrice,
- productForm.value.quantity
+ productForm.value.quantity,
+ 3
);
if (productForm.value.taxRate) {
// 涓嶅惈绋庢�讳环璁$畻
productForm.value.taxExclusiveTotalPrice =
proxy.calculateTaxExclusiveTotalPrice(
productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
+ productForm.value.taxRate,
+ 3
);
}
};
@@ -1883,14 +1919,15 @@
isCalculating.value = true;
// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
+ productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(3);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
proxy.calculateTaxExclusiveTotalPrice(
totalPrice,
- productForm.value.taxRate
+ productForm.value.taxRate,
+ 3
);
}
@@ -1899,10 +1936,10 @@
// 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
const calculateFromExclusiveTotalPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
+ // if (!productForm.value.taxRate) {
+ // proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+ // return;
+ // }
if (isCalculating.value) return;
const exclusiveTotalPrice = parseFloat(productForm.value.taxExclusiveTotalPrice);
@@ -1918,20 +1955,20 @@
// 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
const taxRateDecimal = taxRate / 100;
const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
- productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(3);
// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2);
+ productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(3);
isCalculating.value = false;
};
// 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
const calculateFromQuantity = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
+ // if (!productForm.value.taxRate) {
+ // proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+ // return;
+ // }
if (isCalculating.value) return;
const quantity = parseFloat(productForm.value.quantity);
@@ -1944,26 +1981,29 @@
isCalculating.value = true;
// 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
proxy.calculateTaxExclusiveTotalPrice(
productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
+ productForm.value.taxRate,
+ 3
);
- }
+ }else{
+ productForm.value.taxExclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
+ }
isCalculating.value = false;
};
// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
const calculateFromUnitPrice = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
+ // if (!productForm.value.taxRate) {
+ // proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+ // return;
+ // }
if (isCalculating.value) return;
const quantity = parseFloat(productForm.value.quantity);
@@ -1976,14 +2016,15 @@
isCalculating.value = true;
// 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
proxy.calculateTaxExclusiveTotalPrice(
productForm.value.taxInclusiveTotalPrice,
- productForm.value.taxRate
+ productForm.value.taxRate,
+ 3
);
}
@@ -1992,10 +2033,10 @@
// 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
const calculateFromTaxRate = () => {
- if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
- return;
- }
+ // if (!productForm.value.taxRate) {
+ // proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+ // return;
+ // }
if (isCalculating.value) return;
const inclusiveTotalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
@@ -2011,7 +2052,8 @@
productForm.value.taxExclusiveTotalPrice =
proxy.calculateTaxExclusiveTotalPrice(
inclusiveTotalPrice,
- taxRate
+ taxRate,
+ 3
);
isCalculating.value = false;
@@ -2235,19 +2277,19 @@
margin-left: 10px;
}
-::v-deep .yellow {
+:deep(.yellow) {
background-color: #FAF0DE;
}
-::v-deep .pink {
+:deep(.pink) {
background-color: #FAE1DE;
}
-::v-deep .red {
+:deep(.red) {
background-color: #FAE1DE;
}
-::v-deep .purple{
+:deep(.purple){
background-color: #F4DEFA;
}
--
Gitblit v1.9.3