From dc8cd97d8c3c565a80e2651efa63f41c4661ee2b Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期二, 21 四月 2026 16:37:56 +0800
Subject: [PATCH] 阳光彩印web 营销台账明细数据脱敏

---
 src/views/salesManagement/salesLedger/index.vue |  244 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 161 insertions(+), 83 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 6524daa..d5da657 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -42,7 +42,7 @@
         <el-table-column align="center" type="selection" width="55" fixed="left"/>
         <el-table-column type="expand" width="60" fixed="left">
           <template #default="props">
-            <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
+            <el-table :data="props.row.children" border show-summary :summary-method="(param) => summarizeChildrenTable(param, props.row)">
               <el-table-column align="center" label="搴忓彿" type="index"/>
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
@@ -53,7 +53,7 @@
                 <template #default="scope">
 					<el-tag v-if="getShippingStatusText(scope.row) === '宸插彂璐�'"
 													type="success">宸插嚭搴�</el-tag>
-									<el-tag v-else-if="scope.row.approveStatus === 2"
+									<el-tag v-else-if="scope.row.hasSufficientStock"
 													type="success">鍏呰冻</el-tag>
 									<el-tag v-else
 													type="danger">涓嶈冻</el-tag>
@@ -89,15 +89,15 @@
               </el-table-column>
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
-              <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 label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="sensitiveAmountFormatter" />
+              <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="sensitiveAmountFormatter" />
+              <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="sensitiveAmountFormatter" />
             <!--鎿嶄綔-->
               <el-table-column Width="60px" label="鎿嶄綔" align="center">
                 <template #default="scope">
                   <el-button 
                     link 
-                    type="primary" 
+                    type="primary"
                     size="small"
                     :disabled="!canShip(scope.row)"
                     @click="openDeliveryForm(scope.row)">
@@ -123,11 +123,8 @@
         <el-table-column label="鍏跺畠璇存槑浜嬮」" prop="remarks" width="200" show-overflow-tooltip />
         <el-table-column fixed="right" label="鎿嶄綔" min-width="200" align="center">
           <template #default="scope">
-            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)" :disabled="!scope.row.isEdit">缂栬緫</el-button>
-			<el-button link type="primary" size="small" @click="exportSalesContracts(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>
-<!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">鍙戣揣</el-button>-->
+            <el-button link type="primary" @click="openForm('edit', scope.row)" :disabled="!scope.row.isEdit || scope.row.hasProductionRecord || !canEditLedger(scope.row)">缂栬緫</el-button>
+            <el-button link type="primary" @click="downLoadFile(scope.row)">闄勪欢</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -153,7 +150,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 +160,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 + "鈥斺��" + item.taxpayerIdentificationNumber
@@ -317,7 +314,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 +349,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>
@@ -378,9 +372,10 @@
 					<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>
@@ -389,14 +384,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 +502,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>
@@ -640,7 +635,6 @@
                   <div>
                     <el-button
                       type="danger"
-                      size="small"
                       @click="removeApproverNode(index)"
                       v-if="approverNodes.length > 1"
                     >鍒犻櫎</el-button>
@@ -689,6 +683,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();
@@ -753,7 +748,7 @@
 		unit: "",
 		quantity: "",
 		taxInclusiveUnitPrice: "",
-		taxRate: "",
+		taxRate: 0,
 		taxInclusiveTotalPrice: "",
 		taxExclusiveTotalPrice: "",
 		invoiceType: "",
@@ -769,14 +764,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 +933,49 @@
 	});
 };
 const formattedNumber = (row, column, cellValue) => {
-	return parseFloat(cellValue).toFixed(2);
+	if (cellValue === undefined || cellValue === null || cellValue === "") {
+		return "0.00";
+	}
+	return parseFloat(cellValue).toFixed(3);
+};
+const findLedgerRecordByRow = (row) => {
+	if (!row) return null;
+	if (
+		row.maintainer !== undefined ||
+		row.maintainerName !== undefined ||
+		row.entryPerson !== undefined ||
+		row.entryPersonName !== undefined
+	) {
+		return row;
+	}
+	if (row.salesLedgerId !== undefined && row.salesLedgerId !== null) {
+		return tableData.value.find((item) => String(item.id) === String(row.salesLedgerId)) || null;
+	}
+	return null;
+};
+const isCurrentUserMaintainer = (row) => {
+	const ledgerRecord = findLedgerRecordByRow(row);
+	if (!ledgerRecord) return true;
+	const currentUserId = String(userStore.id ?? "");
+	const currentNickName = String(userStore.nickName ?? "").trim();
+	const maintainerId = ledgerRecord.maintainerId ?? ledgerRecord.entryPerson;
+	const maintainerName =
+		ledgerRecord.maintainerName ?? ledgerRecord.maintainer ?? ledgerRecord.entryPersonName;
+	if (maintainerId !== undefined && maintainerId !== null && String(maintainerId) !== "") {
+		return String(maintainerId) === currentUserId;
+	}
+	if (maintainerName !== undefined && maintainerName !== null && String(maintainerName).trim() !== "") {
+		return String(maintainerName).trim() === currentNickName;
+	}
+	return true;
+};
+const canEditLedger = (row) => isCurrentUserMaintainer(row);
+const canDeleteLedger = (row) => isCurrentUserMaintainer(row);
+const sensitiveAmountFormatter = (row, column, cellValue) => {
+	if (!isCurrentUserMaintainer(row)) {
+		return "*****";
+	}
+	return formattedNumber(row, column, cellValue);
 };
 // 鑾峰彇tree瀛愭暟鎹�
 const getModels = (value) => {
@@ -1050,26 +1087,50 @@
 		"contractAmount",
 		"taxInclusiveTotalPrice",
 		"taxExclusiveTotalPrice",
-	]);
+	], {
+		contractAmount: { decimalPlaces: 3 },
+		taxInclusiveTotalPrice: { decimalPlaces: 3 },
+		taxExclusiveTotalPrice: { decimalPlaces: 3 },
+	});
 };
 // 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
+const summarizeChildrenTable = (param, parentRow) => {
+	if (!isCurrentUserMaintainer(parentRow)) {
+		const { columns } = param;
+		return columns.map((column, index) => {
+			if (index === 0) {
+				return "鍚堣";
+			}
+			if (["taxInclusiveUnitPrice", "taxInclusiveTotalPrice", "taxExclusiveTotalPrice"].includes(column.property)) {
+				return "*****";
+			}
+			return "";
+		});
+	}
 	return proxy.summarizeTable(param, [
 		"taxInclusiveUnitPrice",
 		"taxInclusiveTotalPrice",
 		"taxExclusiveTotalPrice",
-	]);
+	], {
+    taxInclusiveUnitPrice: { decimalPlaces: 3 },
+    taxInclusiveTotalPrice: { decimalPlaces: 3 },
+    taxExclusiveTotalPrice: { decimalPlaces: 3 },
+  });
 };
 // 鎵撳紑寮规
 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 +1166,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 +1234,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 = Number(p.taxRate ?? 0) || 0; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
+		const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(3);
+		const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate, 3);
 		return {
 			// 鍙拌处瀛楁
 			productCategory: p.product || p.productName || "",
@@ -1182,7 +1244,7 @@
 			unit: p.unit || "",
 			quantity: quantity,
 			taxRate: taxRate,
-			taxInclusiveUnitPrice: unitPrice.toFixed(2),
+			taxInclusiveUnitPrice: unitPrice.toFixed(3),
 			taxInclusiveTotalPrice: taxInclusiveTotalPrice,
 			taxExclusiveTotalPrice: taxExclusiveTotalPrice,
 			invoiceType: "澧炴櫘绁�",
@@ -1250,6 +1312,7 @@
 			addOrUpdateSalesLedger(form.value).then((res) => {
 				proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
 				closeDia();
+				expandedRowKeys.value = [];
 				getList();
 			});
 		}
@@ -1271,7 +1334,10 @@
 	}
 	
 	productOperationType.value = type;
-	productForm.value = {};
+	productForm.value = {
+		taxRate: 0,
+		invoiceType: "澧炴櫘绁�"
+	};
 	proxy.resetForm("productFormRef");
 	if (type === "edit") {
 		productForm.value = { ...row };
@@ -1306,6 +1372,7 @@
 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 {
@@ -1421,7 +1488,6 @@
 /** 鍒ゆ柇鍗曚釜浜у搧鏄惁宸插彂璐э紙鏍规嵁shippingStatus鍒ゆ柇锛屽凡鍙戣揣鎴栧鏍搁�氳繃涓嶅彲缂栬緫鍜屽垹闄わ級 */
 const isProductShipped = (product) => {
 	if (!product) return false;
-	
 	const status = String(product.shippingStatus || "").trim();
 	// 濡傛灉鍙戣揣鐘舵�佹槸"宸插彂璐�"鎴�"瀹℃牳閫氳繃"锛屽垯涓嶅彲缂栬緫鍜屽垹闄�
 	return status === "宸插彂璐�" || status === "瀹℃牳閫氳繃";
@@ -1443,6 +1509,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);
@@ -1681,7 +1752,6 @@
       <div class="print-page">
         <div class="delivery-note">
           <div class="header">
-            <div class="company-name">闃冲厜褰╁嵃鏈夐檺璐d换鍏徃</div>
             <div class="document-title">闆跺敭鍙戣揣鍗�</div>
           </div>
           
@@ -1693,7 +1763,7 @@
               </div>
               <div>
                 <span class="label">瀹㈡埛鍚嶇О锛�</span>
-                <span class="value">${item.customerName || '寮犵埍鏈�'}</span>
+                <span class="value">${item.customerName}</span>
               </div>
             </div>
             <div class="info-row">
@@ -1816,7 +1886,7 @@
 	const total = products.reduce((sum, product) => {
 		return sum + (parseFloat(product.quantity) || 0);
 	}, 0);
-	return total.toFixed(2);
+	return total.toFixed(3);
 };
 
 // 璁$畻浜у搧鎬婚噾棰�
@@ -1825,7 +1895,7 @@
 	const total = products.reduce((sum, product) => {
 		return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
 	}, 0);
-	return total.toFixed(2);
+	return total.toFixed(3);
 };
 
 // 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
@@ -1834,7 +1904,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 +1912,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 +1927,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 +1955,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 +1972,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 +1991,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 +2017,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 +2052,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 +2069,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 +2088,8 @@
 	productForm.value.taxExclusiveTotalPrice =
 		proxy.calculateTaxExclusiveTotalPrice(
 			inclusiveTotalPrice,
-			taxRate
+			taxRate,
+			3
 		);
 	
 	isCalculating.value = false;
@@ -2084,8 +2162,8 @@
  * @param row 琛屾暟鎹�
  */
 const canShip = (row) => {
-	// 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
-	if (row.approveStatus !== 1) {
+	// 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛堝熀浜� hasSufficientStock 鍒ゆ柇锛�
+	if (!row || !row.hasSufficientStock) {
 		return false;
 	}
 	
@@ -2235,19 +2313,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