From 16c55c8b1939e2c5ac7f6cdaa34b273657e743e4 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 03 四月 2026 11:33:47 +0800
Subject: [PATCH] 添加发货状态筛选和优化发货逻辑

---
 src/views/salesManagement/salesLedger/index.vue |  208 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 174 insertions(+), 34 deletions(-)

diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index f4643a5..09bd7fe 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -18,6 +18,14 @@
           <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
             placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
         </el-form-item>
+        <el-form-item label="鍙戣揣鐘舵�侊細">
+          <el-select v-model="searchForm.deliveryStatus" placeholder="璇烽�夋嫨" clearable style="width: 140px">
+            <el-option label="鏈彂璐�" :value="1" />
+            <el-option label="瀹℃壒涓�" :value="2" />
+            <el-option label="瀹℃壒澶辫触" :value="3" />
+            <el-option label="宸插彂璐�" :value="4" />
+          </el-select>
+        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
         </el-form-item>
@@ -68,6 +76,7 @@
           <template #default="props">
             <el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
               <el-table-column align="center" label="搴忓彿" type="index"/>
+			<el-table-column label="妤煎眰缂栧彿" prop="floorCode" min-width="100" show-overflow-tooltip />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鍘氬害" prop="thickness" min-width="90">
@@ -75,6 +84,34 @@
                   {{ scope.row.thickness ?? "" }}
                 </template>
               </el-table-column>
+							<el-table-column label="瀹�(mm)" prop="width" min-width="80">
+								<template #default="scope">
+									{{ scope.row.width ?? "" }}
+								</template>
+							</el-table-column>
+							<el-table-column label="楂�(mm)" prop="height" min-width="80">
+								<template #default="scope">
+									{{ scope.row.height ?? "" }}
+								</template>
+							</el-table-column>
+							<el-table-column label="鍛ㄩ暱(cm)" prop="perimeter" min-width="90">
+								<template #default="scope">
+									{{ scope.row.perimeter ?? "" }}
+								</template>
+							</el-table-column>
+							<el-table-column label="鎬婚潰绉�(cm虏)" prop="actualTotalArea" min-width="100">
+								<template #default="scope">
+									{{ scope.row.actualTotalArea ?? "" }}
+								</template>
+							</el-table-column>
+							<el-table-column label="鍔犲伐瑕佹眰" prop="processRequirement" min-width="120"
+								show-overflow-tooltip />
+							<el-table-column label="澶囨敞" prop="remark" min-width="120" show-overflow-tooltip />
+							<el-table-column label="閲嶇" prop="heavyBox" min-width="80">
+								<template #default="scope">
+									{{ scope.row.heavyBox ?? "" }}
+								</template>
+							</el-table-column>
 							<el-table-column label="浜у搧鐘舵��"
 															 width="100px"
 															 align="center">
@@ -87,13 +124,13 @@
 									<el-tag v-else type="danger">涓嶈冻</el-tag>
                 </template>
               </el-table-column>
-							<el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
+							<!-- <el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
 								<template #default="scope">
 									<el-tag :type="getShippingStatusType(scope.row)" size="small">
 										{{ getShippingStatusText(scope.row) }}
 									</el-tag>
 								</template>
-							</el-table-column>
+							</el-table-column> -->
 							<el-table-column label="蹇�掑叕鍙�" prop="expressCompany" show-overflow-tooltip />
 							<el-table-column label="蹇�掑崟鍙�" prop="expressNumber" show-overflow-tooltip />
               <el-table-column label="鍙戣揣杞︾墝" minWidth="100px" align="center">
@@ -143,6 +180,15 @@
         <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
         <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
           :formatter="formattedNumber" />
+		  <el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
+			<template #default="scope">
+				<el-tag v-if="Number(scope.row.deliveryStatus) === 1" type="info">鏈彂璐�</el-tag>
+				<el-tag v-else-if="Number(scope.row.deliveryStatus) === 2" type="warning">瀹℃壒涓�</el-tag>
+				<el-tag v-else-if="Number(scope.row.deliveryStatus) === 3" type="danger">瀹℃壒澶辫触</el-tag>
+				<el-tag v-else-if="Number(scope.row.deliveryStatus) === 4" type="success">宸插彂璐�</el-tag>
+				<el-tag v-else type="info">-</el-tag>
+			</template>
+		  </el-table-column>
         <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 />
@@ -258,6 +304,21 @@
 					<el-table-column label="鍘氬害" prop="thickness" min-width="90">
 						<template #default="scope">
 							{{ scope.row.thickness ?? "" }}
+						</template>
+					</el-table-column>
+					<el-table-column label="瀹�(mm)" prop="width" min-width="80">
+						<template #default="scope">
+							{{ scope.row.width ?? "" }}
+						</template>
+					</el-table-column>
+					<el-table-column label="楂�(mm)" prop="height" min-width="80">
+						<template #default="scope">
+							{{ scope.row.height ?? "" }}
+						</template>
+					</el-table-column>
+					<el-table-column label="闈㈢Н(m虏)" prop="actualTotalArea" min-width="100">
+						<template #default="scope">
+							{{ scope.row.actualTotalArea ?? "" }}
 						</template>
 					</el-table-column>
 					<el-table-column label="鏁伴噺" prop="quantity" />
@@ -677,11 +738,12 @@
 											<el-input-number
 												v-model="item.quantity"
 												:min="0"
-												:step="0.1"
-												:precision="2"
+												:step="1"
+												:precision="0"
 												style="width: 100%;"
 												placeholder="璇疯緭鍏ユ暟閲�"
 												:disabled="operationType === 'view'"
+												@change="calculateFromUnitPrice(true)"
 											/>
 										</div>
 										<el-button
@@ -942,6 +1004,7 @@
 		entryDate: null, // 褰曞叆鏃ユ湡
 		entryDateStart: undefined,
 		entryDateEnd: undefined,
+		deliveryStatus: undefined, // 鍙戣揣鐘舵�侊細1鏈彂璐� 2瀹℃壒涓� 3瀹℃壒澶辫触 4宸插彂璐�
 	},
 	form: {
 		salesContractNo: "",
@@ -1049,7 +1112,7 @@
     type: "璐ц溅", // 璐ц溅, 蹇��
   },
   deliveryRules: {
-    type: [
+    type: [	
       { required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }
     ]
   },
@@ -1075,6 +1138,7 @@
 		otherAmountSelectOptions.value = records.map((item) => ({
 			id: item.id,
 			processName: item.processName ?? "",
+			unitPrice: item.unitPrice ?? 0,
 		}));
 	} finally {
 		otherAmountSelectOptionsLoading.value = false;
@@ -1146,6 +1210,7 @@
 		return {
 			id: s.id,
 			processName: opt?.processName ?? s.processName ?? "",
+			unitPrice: opt?.unitPrice ?? s.unitPrice ?? 0,
 			quantity: Number(s.quantity ?? 0) || 0,
 		};
 	});
@@ -1201,8 +1266,10 @@
 	productForm.value.salesProductProcessList.push({
 		id: opt.id,
 		processName: opt.processName,
+		unitPrice: opt.unitPrice ?? 0,
 		quantity: 0,
 	});
+	calculateFromUnitPrice(true);
 
 	// 閫夋嫨瀹屾垚鍚庡叧闂脊绐楋紝涓嬩竴娆″彲鍐嶆鐐瑰嚮鈥滄柊澧炩�濈户缁坊鍔�
 	otherAmountAddDialogVisible.value = false;
@@ -1217,6 +1284,7 @@
 	if (operationType.value === "view") return;
 	if (!Array.isArray(productForm.value?.salesProductProcessList)) return;
 	productForm.value.salesProductProcessList.splice(index, 1);
+	calculateFromUnitPrice(true);
 };
 
 // 鍙戣揣瀹℃壒浜鸿妭鐐癸紙浠垮崗鍚屽鎵� infoFormDia.vue锛�
@@ -1843,15 +1911,16 @@
 			recalcAreaTotals();
 			// 鍏朵粬閲戦鍙彁浜� {id, processName, quantity}锛堝悗绔瓧娈碉細salesProductProcessList锛�
 			productForm.value.salesProductProcessList = (Array.isArray(productForm.value.salesProductProcessList)
-				? productForm.value.salesProductProcessList
-				: []
-			)
-				.map((it) => ({
-					id: it?.id,
-					processName: it?.processName ?? "",
-					quantity: Number(it?.quantity ?? 0) || 0,
-				}))
-				.filter((it) => it.id !== null && it.id !== undefined && it.id !== "");
+			? productForm.value.salesProductProcessList
+			: []
+		)
+			.map((it) => ({
+				id: it?.id,
+				processName: it?.processName ?? "",
+				unitPrice: Number(it?.unitPrice ?? 0) || 0,
+				quantity: Number(it?.quantity ?? 0) || 0,
+			}))
+			.filter((it) => it.id !== null && it.id !== undefined && it.id !== "");
 
 			if (operationType.value === "edit") {
 				submitProductEdit();
@@ -2155,12 +2224,15 @@
 		return;
 	}
 	const settlePieceArea = parseFloat(productForm.value.settlePieceArea) || 1;
-	// 鍚◣鎬讳环璁$畻 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
-	productForm.value.taxInclusiveTotalPrice =
-		proxy.calculateTaxIncludeTotalPrice(
-			productForm.value.taxInclusiveUnitPrice * settlePieceArea,
-			productForm.value.quantity
-		);
+	// 鍚◣鎬讳环璁$畻 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺 + 鍏朵粬閲戦鎬诲拰
+	const basePrice = proxy.calculateTaxIncludeTotalPrice(
+		productForm.value.taxInclusiveUnitPrice * settlePieceArea,
+		productForm.value.quantity
+	);
+	const otherAmountTotal = (productForm.value.salesProductProcessList || []).reduce((total, item) => {
+		return total + (Number(item.unitPrice) || 0) * (Number(item.quantity) || 0);
+	}, 0);
+	productForm.value.taxInclusiveTotalPrice = (parseFloat(basePrice) + otherAmountTotal).toFixed(2);
 	if (productForm.value.taxRate) {
 		// 涓嶅惈绋庢�讳环璁$畻
 		productForm.value.taxExclusiveTotalPrice =
@@ -2242,8 +2314,12 @@
 	
 	isCalculating.value = true;
 	
-	// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
-	productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
+	// 璁$畻鍚◣鍗曚环 = (鍚◣鎬讳环 - 鍏朵粬閲戦鎬诲拰) / 鏁伴噺
+	const otherAmountTotal = (productForm.value.salesProductProcessList || []).reduce((total, item) => {
+		return total + (Number(item.unitPrice) || 0) * (Number(item.quantity) || 0);
+	}, 0);
+	const basePrice = totalPrice - otherAmountTotal;
+	productForm.value.taxInclusiveUnitPrice = (basePrice / quantity).toFixed(2);
 	
 	// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
 	if (productForm.value.taxRate) {
@@ -2280,8 +2356,12 @@
 	const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
 	productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
 	
-	// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
-	productForm.value.taxInclusiveUnitPrice = (inclusiveTotalPrice / quantity).toFixed(2);
+	// 璁$畻鍚◣鍗曚环 = (鍚◣鎬讳环 - 鍏朵粬閲戦鎬诲拰) / 鏁伴噺
+	const otherAmountTotal = (productForm.value.salesProductProcessList || []).reduce((total, item) => {
+		return total + (Number(item.unitPrice) || 0) * (Number(item.quantity) || 0);
+	}, 0);
+	const basePrice = inclusiveTotalPrice - otherAmountTotal;
+	productForm.value.taxInclusiveUnitPrice = (basePrice / quantity).toFixed(2);
 	
 	isCalculating.value = false;
 };
@@ -2304,8 +2384,12 @@
 
 	isCalculating.value = true;
 
-	// 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
-	productForm.value.taxInclusiveTotalPrice = (unitPrice * settlePieceArea * quantity).toFixed(2);
+	// 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺 + 鍏朵粬閲戦鎬诲拰
+	const basePrice = unitPrice * settlePieceArea * quantity;
+	const otherAmountTotal = (productForm.value.salesProductProcessList || []).reduce((total, item) => {
+		return total + (Number(item.unitPrice) || 0) * (Number(item.quantity) || 0);
+	}, 0);
+	productForm.value.taxInclusiveTotalPrice = (basePrice + otherAmountTotal).toFixed(2);
 
 	// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
 	if (productForm.value.taxRate) {
@@ -2337,8 +2421,12 @@
 
 	isCalculating.value = true;
 
-	// 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
-	productForm.value.taxInclusiveTotalPrice = (unitPrice * settlePieceArea * quantity).toFixed(2);
+	// 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺 + 鍏朵粬閲戦鎬诲拰
+	const basePrice = unitPrice * settlePieceArea * quantity;
+	const otherAmountTotal = (productForm.value.salesProductProcessList || []).reduce((total, item) => {
+		return total + (Number(item.unitPrice) || 0) * (Number(item.quantity) || 0);
+	}, 0);
+	productForm.value.taxInclusiveTotalPrice = (basePrice + otherAmountTotal).toFixed(2);
 
 	// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
 	if (productForm.value.taxRate) {
@@ -2446,11 +2534,23 @@
  * @param row 琛屾暟鎹�
  */
 const canShip = (row) => {
+
 	// 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
 	if (row.approveStatus !== 1) {
 		return false;
 	}
 	
+	// 濡傛灉鍚庣杩斿洖浜嗗彴璐︾骇鍙戣揣鐘舵�侊紙deliveryStatus锛�
+	// 1=宸插彂璐э紝鍒欑姝㈠啀娆″彂璐�
+	const deliveryStatus = row.deliveryStatus;
+	if (
+		deliveryStatus !== null &&
+		deliveryStatus !== undefined &&
+		String(deliveryStatus).trim() !== ""
+	) {
+		if (Number(deliveryStatus) === 1) return false;
+	}
+
 	// 鑾峰彇鍙戣揣鐘舵��
 	const shippingStatus = row.shippingStatus;
 	
@@ -2468,6 +2568,44 @@
 	if (selectedRows.value.length === 0) {
 		proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
 		return;
+	}
+
+	// 鍙厑璁搞�愭湭鍙戣揣/瀹℃壒澶辫触銆戣繘鍏ュ彂璐ф祦绋�
+	const canDeliveryLedgers = selectedRows.value.filter((r) => {
+		const status = Number(r.deliveryStatus);
+		return status === 1 || status === 3;
+	});
+	if (canDeliveryLedgers.length === 0) {
+		proxy.$modal.msgWarning("浠呮湭鍙戣揣鎴栧鎵瑰け璐ョ殑鍙拌处鍙互鍙戣揣");
+		return;
+	}
+
+	// 宸插彂璐у彴璐︼細寮圭獥鎻愰啋锛屼笉鑳藉啀娆″彂璐э紙4 瑙嗕负宸插彂璐э級
+	const shippedLedgers = selectedRows.value.filter((r) => Number(r.deliveryStatus) === 4);
+	if (shippedLedgers.length === selectedRows.value.length) {
+		try {
+			await ElMessageBox.alert("鎵�閫夐攢鍞彴璐﹀潎宸插彂璐э紝涓嶈兘鍐嶆鍙戣揣銆�", "鎻愮ず", {
+				type: "warning",
+				confirmButtonText: "鐭ラ亾浜�",
+			});
+		} catch {
+			/* 鍏抽棴寮圭獥 */
+		}
+		return;
+	}
+	if (shippedLedgers.length > 0) {
+		try {
+			await ElMessageBox.alert(
+				"閫変腑鐨勯攢鍞彴璐︿腑鍖呭惈宸插彂璐ц褰曪紝宸插彂璐х殑涓嶈兘鍐嶆鍙戣揣锛岀郴缁熷皢浠呬负鏈彂璐у彴璐﹀鐞嗐��",
+				"鎻愮ず",
+				{
+					type: "warning",
+					confirmButtonText: "鐭ラ亾浜�",
+				}
+			);
+		} catch {
+			return;
+		}
 	}
 
 	const customerNames = selectedRows.value.map((r) => String(r.customerName || "").trim());
@@ -2497,6 +2635,8 @@
 	try {
 		const targets = [];
 		for (const ledger of selectedRows.value) {
+			// 鍙拌处宸插彂璐э細涓嶅厑璁稿啀娆″彂璐�
+			if (Number(ledger.deliveryStatus) === 1) continue;
 			let products = [];
 			try {
 				const res = await productList({ salesLedgerId: ledger.id, type: 1 });
@@ -2504,7 +2644,6 @@
 			} catch {
 				products = [];
 			}
-
 			for (const product of products) {
 				if (!canShip(product)) continue;
 				targets.push({
@@ -2545,14 +2684,15 @@
 	});
 }
 
-// 鎵撳紑鍙戣揣寮规
+// 鎵撳紑鍙戣揣寮规锛堝崟鏉★級
 const openDeliveryForm = (row) => {
-	// 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
-	if (!canShip(row)) {
-		proxy.$modal.msgWarning("鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣");
+	// 鍙厑璁搞�愭湭鍙戣揣/瀹℃壒澶辫触銆戝彂璐э紱宸插彂璐�/瀹℃壒涓笉鍏佽
+	const status = Number(row.deliveryStatus);
+	if (status !== 1 && status !== 3) {
+		proxy.$modal.msgWarning("鍙湁鍙戣揣鐘舵�佷负鏈彂璐ф垨瀹℃壒澶辫触鐨勮褰曟墠鍙互鍙戣揣");
 		return;
 	}
-	
+
 	currentDeliveryRows.value = [row];
   deliveryForm.value = {
     type: "璐ц溅",

--
Gitblit v1.9.3