From 47e1cecb6f5cd01c029ff1a2f1658326a33025f4 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 15 十一月 2025 11:51:35 +0800
Subject: [PATCH] 生产管控-左右页面逻辑修改

---
 src/pages/productionManagement/productionDispatching/index.vue |  580 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 348 insertions(+), 232 deletions(-)

diff --git a/src/pages/productionManagement/productionDispatching/index.vue b/src/pages/productionManagement/productionDispatching/index.vue
index 87c3da0..6168994 100644
--- a/src/pages/productionManagement/productionDispatching/index.vue
+++ b/src/pages/productionManagement/productionDispatching/index.vue
@@ -2,7 +2,7 @@
 	<view class="production-dispatching">
 		<!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 -->
 		<PageHeader title="鐢熶骇娲惧伐" @back="goBack" />
-		
+
 		<!-- 鐐掓満鐘舵�佸睍绀� -->
 		<view class="machines-section">
 			<view class="section-title">鐐掓満鐘舵��</view>
@@ -33,6 +33,28 @@
 					</view>
 				</view>
 			</view>
+			<!-- 鎹熻�楃巼璁剧疆 -->
+		<view class="loss-rate-section">
+			<view class="section-title">鎹熻�楃巼璁剧疆</view>
+			<view class="loss-rate-content">
+				<view class="loss-rate-item">
+					<up-button 
+						class="loss-rate-btn" 
+						type="primary" 
+						plain
+						size="small"
+						@click="showLossRateSheet = true"
+					>{{ lossRate ? `鎹熻�楃巼: ${lossRate}%` : '璇烽�夋嫨鎹熻�楃巼' }}</up-button>
+					<up-action-sheet 
+					:show="showLossRateSheet"
+					:actions="lossRateOptions" 
+					@select="onLossRateSelect"
+					title="閫夋嫨鎹熻�楃巼"
+					@close="showLossRateSheet = false"
+				/>
+				</view>
+			</view>
+		</view>
 			<view class="save-section">
 				<up-button type="primary" @click="saveMachineTotals" size="normal" class="save-btn">淇濆瓨鐐掓満璁剧疆</up-button>
 			</view>
@@ -71,46 +93,41 @@
 		</view>
 		
 		<!-- 鎵归噺鎿嶄綔鍖哄煙 -->
-		<view v-if="showBatchActions" class="batch-actions-section">
+		<view class="batch-actions-section" v-if="showBatchActions">
 			<view class="batch-info">
-				<text class="batch-count">宸查�夋嫨 {{ selectedItems.length }} 涓」鐩�</text>
+				<text class="batch-text">宸查�夋嫨 {{ selectedItems.length }} 涓」鐩�</text>
 			</view>
 			<view class="batch-buttons">
-				<up-button type="primary" size="small" @click="handleAutoDispatch" class="batch-btn">
-					<up-icon name="play-circle" size="16" color="#ffffff"></up-icon>
-					鑷姩娲惧崟
-				</up-button>
-				<up-button type="default" size="small" @click="clearSelection" class="batch-btn">
-					<up-icon name="close-circle" size="16" color="#6c757d"></up-icon>
-					鍙栨秷閫夋嫨
-				</up-button>
+				<up-button type="primary" size="small" @click="handleAutoDispatch" class="batch-btn">鑷姩娲惧崟</up-button>
+				<up-button type="default" size="small" @click="clearSelection" class="batch-btn">鍙栨秷閫夋嫨</up-button>
 			</view>
 		</view>
-		
+
 		<!-- 鍏ㄩ�夋搷浣滃尯鍩� -->
-		<view v-if="tableData.length > 0" class="select-all-section">
-			<view class="select-all-checkbox" @click="toggleAllSelection">
-				<up-icon 
-					:name="isAllSelected ? 'checkbox-mark' : 'circle'" 
-					:color="isAllSelected ? '#409eff' : '#c0c4cc'"
-					size="18"
-				></up-icon>
-				<text class="select-all-text">{{ isAllSelected ? '鍙栨秷鍏ㄩ��' : '鍏ㄩ��' }}</text>
+		<view class="select-all-section" v-if="tableData.length > 0">
+			<view class="select-all-content">
+				<up-checkbox 
+				v-model="isAllSelected" 
+				@change="toggleAllSelection"
+				label="鍏ㄩ��"
+				class="select-all-checkbox"
+				:disabled="tableData.length === 0 || tableData.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName).length === 0"
+			/>
 			</view>
-			<text class="select-all-hint">锛堜粎閫夋嫨寰呮帓鏁伴噺澶т簬0鐨勯」鐩級</text>
 		</view>
-		
+
 		<!-- 鐢熶骇娲惧伐鍒楄〃 -->
 		<view class="ledger-list" v-if="tableData.length > 0">
 			<view v-for="(item, index) in tableData" :key="item.id || index" class="list-item">
 				<view class="ledger-item">
 					<!-- 閫夋嫨澶嶉�夋 -->
-					<view class="item-checkbox" @click="toggleItemSelection(item)">
-						<up-icon 
-							:name="selectedItems.includes(item.id) ? 'checkbox-mark' : 'circle'" 
-							:color="selectedItems.includes(item.id) ? '#409eff' : '#c0c4cc'"
-							size="18"
-						></up-icon>
+					<view class="item-checkbox">
+						<up-checkbox 
+					:model-value="selectedItems.some(selected => selected.id === item.id)"
+					@change="(checked) => toggleItemSelection(item, checked)"
+					:disabled="item.pendingQuantity <= 0 || !item.speculativeTradingName"
+					shape="circle"
+				/>
 					</view>
 					
 					<view class="item-content">
@@ -146,6 +163,10 @@
 								<text class="detail-value">{{ item.specificationModel }}</text>
 							</view>
 							<view class="detail-row">
+								<text class="detail-label">缁戝畾鏈哄櫒</text>
+								<text class="detail-value">{{ item.speculativeTradingName }}</text>
+							</view>
+							<view class="detail-row">
 								<text class="detail-label">鍗曚綅</text>
 								<text class="detail-value">{{ item.unit }}</text>
 							</view>
@@ -165,14 +186,14 @@
 							<!-- 鎿嶄綔鎸夐挳鍖哄煙 -->
 							<view class="action-buttons">
 								<up-button
-									type="primary"
-									size="small"
-									@click="handleDispatch(item)"
-									class="action-btn"
-									:disabled="item.pendingQuantity <= 0"
-								>
-									{{ item.pendingQuantity <= 0 ? '鏃犻渶娲惧伐' : '鐢熶骇娲惧伐' }}
-								</up-button>
+						type="primary"
+						size="small"
+						@click="handleDispatch(item)"
+						class="action-btn"
+						:disabled="item.pendingQuantity <= 0 || !item.speculativeTradingName"
+					>
+						{{ item.pendingQuantity <= 0 ? '鏃犻渶娲惧伐' : !item.speculativeTradingName ? '鏈粦瀹氭満鍣�' : '鐢熶骇娲惧伐' }}
+					</up-button>
 							</view>
 						</view>
 					</view>
@@ -188,16 +209,20 @@
 		
 		<!-- 娲惧伐寮圭獥 -->
 		<DispatchModal ref="dispatchModalRef" @confirm="handleDispatchConfirm" />
+		
+		<!-- 鑷姩娲惧崟寮圭獥 -->
+		<AutoDispatchDia ref="autoDispatchDia" />
 	</view>
 </template>
 
 <script setup>
-import { ref, reactive, toRefs, getCurrentInstance } from "vue";
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
 import { onShow } from '@dcloudio/uni-app';
 import dayjs from "dayjs";
-import {schedulingListPage, schedulingList, addSpeculatTrading, updateSpeculatTrading} from "@/api/productionManagement/productionOrder.js";
+import {schedulingListPage, schedulingList, addSpeculatTrading, updateSpeculatTrading, getLossRate, addLossRate, updateLossRate} from "@/api/productionManagement/productionOrder.js";
 import PageHeader from "@/components/PageHeader.vue";
 import DispatchModal from "./components/DispatchModal.vue";
+import AutoDispatchDia from "./components/autoDispatchDia.vue";
 
 const { proxy } = getCurrentInstance();
 
@@ -207,10 +232,10 @@
 // 鍒楄〃鏁版嵁
 const tableData = ref([]);
 
-// 鎵归噺閫夋嫨鐩稿叧鏁版嵁
-const selectedItems = ref([]); // 閫変腑鐨勯」鐩甀D鏁扮粍
-const isAllSelected = ref(false); // 鏄惁鍏ㄩ��
-const showBatchActions = ref(false); // 鏄惁鏄剧ず鎵归噺鎿嶄綔鍖哄煙
+// 閫夋嫨鐩稿叧鏁版嵁
+const selectedItems = ref([]);
+const isAllSelected = ref(false);
+const showBatchActions = ref(false);
 
 // 鎼滅储琛ㄥ崟鏁版嵁
 const data = reactive({
@@ -261,8 +286,23 @@
 // 鏄惁鏈夋煡璇㈡暟鎹紙鐢ㄤ簬鍒ゆ柇鏄柊澧炶繕鏄慨鏀癸級
 const hasQueryData = ref(false);
 
+// 鎹熻�楃巼鐩稿叧鏁版嵁
+const lossRate = ref(""); // 褰撳墠閫夋嫨鐨勬崯鑰楃巼
+const showLossRateSheet = ref(false); // 鎺у埗鎹熻�楃巼閫夋嫨闈㈡澘鏄剧ず
+const lossRateOptions = ref([
+	{ name: "6%", value: "6" },
+	{ name: "7%", value: "7" },
+	{ name: "8%", value: "8" },
+	{ name: "9%", value: "9" },
+	{ name: "10%", value: "10" }
+]);
+const lossRateData = ref(null); // 鎹熻�楃巼鏌ヨ杩斿洖鐨勬暟鎹�
+
 // 娲惧伐寮圭獥寮曠敤
 const dispatchModalRef = ref();
+
+// 鑷姩娲惧崟寮圭獥寮曠敤
+const autoDispatchDia = ref();
 
 // 閫氱敤鎻愮ず鍑芥暟
 const showLoadingToast = (message) => {
@@ -328,6 +368,28 @@
 	});
 };
 
+// 鎹熻�楃巼閫夋嫨浜嬩欢
+const onLossRateSelect = (action) => {
+	lossRate.value = action.value;
+	showLossRateSheet.value = false;
+	console.log('閫夋嫨浜嗘崯鑰楃巼:', action.name, '鍊�:', action.value);
+};
+
+// 鑾峰彇鎹熻�楃巼鏁版嵁
+const getLossRateData = () => {
+	getLossRate().then((res) => {
+		if (res.data) {
+			lossRateData.value = res.data;
+			// 璁剧疆褰撳墠閫夋嫨鐨勬崯鑰楃巼
+			if (res.data.rate !== null && res.data.rate !== undefined) {
+				lossRate.value = res.data.rate.toString();
+			}
+		}
+	}).catch(err => {
+		console.error('鑾峰彇鎹熻�楃巼澶辫触:', err);
+	});
+};
+
 // 鑾峰彇鍒楄〃鏁版嵁
 const getList = () => {
 	loading.value = true;
@@ -340,14 +402,17 @@
 		closeToast();
 		
 		tableData.value = (res.data.records || []).map(item => ({
-			...item,
-			pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
-		}));
+				...item,
+				pendingQuantity: (Number(item.quantity) || 0) - (Number(item.schedulingNum) || 0)
+			})).filter(item => item.pendingQuantity > 0);
 		
 		page.total = res.data.total || 0;
 		
 		// 鑾峰彇鐐掓満鏁版嵁
 		getMachineProductionData();
+		
+		// 鑾峰彇鎹熻�楃巼鏁版嵁
+		getLossRateData();
 		
 	}).catch(() => {
 		loading.value = false;
@@ -364,6 +429,14 @@
 	if (item.pendingQuantity <= 0) {
 		uni.showToast({
 			title: '璇ラ」鐩棤闇�鍐嶆淳宸�',
+			icon: 'none'
+		});
+		return;
+	}
+	
+	if (!item.speculativeTradingName) {
+		uni.showToast({
+			title: '璇ラ」鐩湭缁戝畾鏈哄櫒锛屾棤娉曟淳宸�',
 			icon: 'none'
 		});
 		return;
@@ -392,6 +465,51 @@
 		workLoad: machineTotal[`m${machineId}`] || 0,
 		currentWorkLoad: machineInProduction[`m${machineId}`] || 0
 	};
+};
+
+// 淇濆瓨鎹熻�楃巼璁剧疆
+const saveLossRate = () => {
+	if (!lossRate.value) {
+		console.log('鏈�夋嫨鎹熻�楃巼锛岃烦杩囦繚瀛�');
+		return Promise.resolve();
+	}
+	
+	const lossRateDataToSave = {
+		rate: parseFloat(lossRate.value) || 0
+	};
+	
+	// 濡傛灉鏈夋煡璇㈠埌鐨勬崯鑰楃巼鏁版嵁锛岃鏄庢槸淇敼鎿嶄綔锛岄渶瑕佷紶閫抜d
+	if (lossRateData.value && lossRateData.value.id) {
+		lossRateDataToSave.id = lossRateData.value.id;
+	}
+	
+	console.log('淇濆瓨鎹熻�楃巼鏁版嵁:', lossRateDataToSave);
+	
+	// 鏍规嵁鏄惁鏈夋崯鑰楃巼鏁版嵁鍐冲畾璋冪敤鏂板鎺ュ彛杩樻槸淇敼鎺ュ彛
+	const saveLossApi = lossRateData.value && lossRateData.value.id ? updateLossRate : addLossRate;
+	const successMessage = lossRateData.value && lossRateData.value.id ? '鎹熻�楃巼淇敼鎴愬姛' : '鎹熻�楃巼鏂板鎴愬姛';
+	
+	return saveLossApi(lossRateDataToSave).then(res => {
+		console.log('鎹熻�楃巼淇濆瓨鎴愬姛:', res);
+		uni.showToast({
+			title: successMessage,
+			icon: 'success'
+		});
+		
+		// 鏇存柊鎹熻�楃巼鏁版嵁
+		if (res.data) {
+			lossRateData.value = res.data;
+		}
+		
+		return res;
+	}).catch(err => {
+		console.error('鎹熻�楃巼淇濆瓨澶辫触:', err);
+		uni.showToast({
+			title: '鎹熻�楃巼淇濆瓨澶辫触',
+			icon: 'none'
+		});
+		throw err;
+	});
 };
 
 // 淇濆瓨鐐掓満鎬婚噺璁剧疆
@@ -425,9 +543,15 @@
 	
 	console.log(`璋冪敤鎺ュ彛: ${hasQueryData.value ? '淇敼' : '鏂板'}`);
 	
-	// 璋冪敤鍚庣API淇濆瓨
-	saveApi(saveData).then(res => {
-		proxy.$message.success(successMessage);
+	// 鍏堜繚瀛樻崯鑰楃巼锛屽啀淇濆瓨鐐掓満璁剧疆
+	saveLossRate().then(() => {
+		// 璋冪敤鍚庣API淇濆瓨鐐掓満璁剧疆
+		return saveApi(saveData);
+	}).then(res => {
+		uni.showToast({
+			title: successMessage,
+			icon: 'success'
+		});
 		console.log('淇濆瓨鎴愬姛:', res);
 		
 		// 淇濆瓨鎴愬姛鍚庯紝璁剧疆hasQueryData涓簍rue锛屼笅娆′繚瀛樺皢璋冪敤淇敼鎺ュ彛
@@ -435,61 +559,69 @@
 			hasQueryData.value = true;
 		}
 	}).catch(err => {
-		proxy.$message.error('淇濆瓨澶辫触');
+		uni.showToast({
+			title: '淇濆瓨澶辫触',
+			icon: 'none'
+		});
 		console.error('淇濆瓨澶辫触:', err);
 	});
 };
 
-// 鎵归噺閫夋嫨鐩稿叧鍑芥暟
-
-// 鍒囨崲鍗曚釜椤圭洰鐨勯�夋嫨鐘舵��
-const toggleItemSelection = (item) => {
-	const itemId = item.id;
-	const index = selectedItems.value.indexOf(itemId);
+// 鍒囨崲鍗曚釜椤圭洰閫夋嫨鐘舵��
+const toggleItemSelection = (item, checked) => {
+	// 浠呭厑璁搁�夋嫨宸茬粦瀹氭満鍣ㄤ笖寰呮淳鏁伴噺>0鐨勯」鐩�
+	if (!item.speculativeTradingName || item.pendingQuantity <= 0) return;
 	
-	if (index > -1) {
-		// 濡傛灉宸查�変腑锛屽垯鍙栨秷閫夋嫨
-		selectedItems.value.splice(index, 1);
+	console.log('鍒囨崲閫夋嫨鐘舵��:', item.id, checked);
+	
+	// 浣跨敤鏇翠弗鏍肩殑姣旇緝閫昏緫锛岀‘淇滻D鍞竴鎬�
+	const index = selectedItems.value.findIndex(selected => {
+		// 娣卞害姣旇緝瀵硅薄锛岀‘淇濇槸鍚屼竴涓」鐩�
+		return JSON.stringify(selected) === JSON.stringify(item);
+	});
+	
+	if (checked) {
+		// 濡傛灉閫変腑涓斾笉鍦ㄩ�変腑鍒楄〃涓紝鍒欐坊鍔�
+		if (index === -1) {
+			selectedItems.value.push({...item}); // 鍒涘缓鏂板璞★紝閬垮厤寮曠敤闂
+			console.log('娣诲姞椤圭洰鍚庨�変腑鏁伴噺:', selectedItems.value.length);
+		}
 	} else {
-		// 濡傛灉鏈�変腑锛屽垯娣诲姞閫夋嫨
-		selectedItems.value.push(itemId);
+		// 濡傛灉鍙栨秷閫変腑涓斿湪閫変腑鍒楄〃涓紝鍒欑Щ闄�
+		if (index > -1) {
+			selectedItems.value.splice(index, 1);
+			console.log('绉婚櫎椤圭洰鍚庨�変腑鏁伴噺:', selectedItems.value.length);
+		}
 	}
 	
-	// 鏇存柊鍏ㄩ�夌姸鎬�
+	console.log('褰撳墠閫変腑椤圭洰鍒楄〃:', selectedItems.value.map(s => s.id));
 	updateAllSelectedStatus();
-	// 鏇存柊鎵归噺鎿嶄綔鍖哄煙鏄剧ず鐘舵��
 	updateBatchActionsVisibility();
 };
 
 // 鍒囨崲鍏ㄩ�夌姸鎬�
 const toggleAllSelection = () => {
 	if (isAllSelected.value) {
-		// 鍙栨秷鍏ㄩ��
 		selectedItems.value = [];
 	} else {
-		// 鍏ㄩ��
-		selectedItems.value = tableData.value
-			.filter(item => item.pendingQuantity > 0) // 鍙�夋嫨寰呮帓鏁伴噺澶т簬0鐨勯」鐩�
-			.map(item => item.id);
+		selectedItems.value = tableData.value.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName).map(item => ({ ...item }));
 	}
-	
 	isAllSelected.value = !isAllSelected.value;
 	updateBatchActionsVisibility();
 };
 
 // 鏇存柊鍏ㄩ�夌姸鎬�
 const updateAllSelectedStatus = () => {
-	const selectableItems = tableData.value.filter(item => item.pendingQuantity > 0);
-	if (selectableItems.length === 0) {
+	const selectableItems = tableData.value.filter(item => item.pendingQuantity > 0 && item.speculativeTradingName);
+	if (selectableItems.length > 0 && selectedItems.value.length === selectableItems.length && 
+		selectableItems.every(item => selectedItems.value.some(selected => selected.id === item.id))) {
+		isAllSelected.value = true;
+	} else {
 		isAllSelected.value = false;
-		return;
 	}
-	
-	isAllSelected.value = selectedItems.value.length === selectableItems.length && 
-		selectableItems.every(item => selectedItems.value.includes(item.id));
 };
 
-// 鏇存柊鎵归噺鎿嶄綔鍖哄煙鏄剧ず鐘舵��
+// 鏇存柊鎵归噺鎿嶄綔鏄剧ず鐘舵��
 const updateBatchActionsVisibility = () => {
 	showBatchActions.value = selectedItems.value.length > 0;
 };
@@ -503,80 +635,36 @@
 
 // 鑾峰彇閫変腑鐨勯」鐩�
 const getSelectedItems = () => {
-	return tableData.value.filter(item => selectedItems.value.includes(item.id));
+	return selectedItems.value;
 };
 
-// 鑷姩娲惧崟鍔熻兘
+// 澶勭悊鑷姩娲惧崟
 const handleAutoDispatch = () => {
-	const selectedItemsList = getSelectedItems();
-	
-	if (selectedItemsList.length === 0) {
+	if (selectedItems.value.length === 0) {
 		uni.showToast({
-			title: '璇峰厛閫夋嫨瑕佹淳宸ョ殑椤圭洰',
+			title: '璇烽�夋嫨瑕佹淳宸ョ殑椤圭洰',
 			icon: 'none'
 		});
 		return;
 	}
 	
-	// 妫�鏌ユ槸鍚︽湁椤圭洰寰呮帓鏁伴噺涓嶈冻
-	const invalidItems = selectedItemsList.filter(item => item.pendingQuantity <= 0);
-	if (invalidItems.length > 0) {
+	// 妫�鏌ユ槸鍚︽墍鏈夐�変腑椤圭洰閮芥湁缁戝畾鏈哄櫒
+	const unboundItems = selectedItems.value.filter(item => !item.speculativeTradingName);
+	if (unboundItems.length > 0) {
 		uni.showToast({
-			title: `鏈�${invalidItems.length}涓」鐩棤闇�娲惧伐锛屽凡鑷姩杩囨护`,
-			icon: 'none'
-		});
-	}
-	
-	// 杩囨护鎺夊緟鎺掓暟閲忎笉瓒崇殑椤圭洰
-	const validItems = selectedItemsList.filter(item => item.pendingQuantity > 0);
-	
-	if (validItems.length === 0) {
-		uni.showToast({
-			title: '娌℃湁鍙淳宸ョ殑椤圭洰',
+			title: '鎵�閫夐」鐩腑鏈夋湭缁戝畾鏈哄櫒鐨勯」鐩紝鏃犳硶鑷姩娲惧崟',
 			icon: 'none'
 		});
 		return;
 	}
 	
-	uni.showModal({
-		title: '纭鑷姩娲惧崟',
-		content: `纭畾瑕佸閫変腑鐨�${validItems.length}涓」鐩繘琛岃嚜鍔ㄦ淳鍗曞悧锛焋,
-		success: (res) => {
-			if (res.confirm) {
-				executeAutoDispatch(validItems);
-			}
-		}
-	});
-};
-
-// 鎵ц鑷姩娲惧崟
-const executeAutoDispatch = (items) => {
-	showLoadingToast('鑷姩娲惧崟涓�...');
-	
-	// 妯℃嫙鑷姩娲惧崟杩囩▼
-	setTimeout(() => {
-		closeToast();
-		
-		// 杩欓噷搴旇璋冪敤瀹為檯鐨勮嚜鍔ㄦ淳鍗旳PI
-		// 鏆傛椂浣跨敤妯℃嫙鎴愬姛
-		uni.showToast({
-			title: `鎴愬姛涓�${items.length}涓」鐩畬鎴愯嚜鍔ㄦ淳鍗昤,
-			icon: 'success'
-		});
-		
-		// 娓呯┖閫夋嫨
-		clearSelection();
-		// 鍒锋柊鍒楄〃
-		getList();
-		
-		console.log('鑷姩娲惧崟椤圭洰:', items);
-	}, 1500);
+	// 纭繚浼犻�掔殑鏄畬鏁寸殑閫変腑椤圭洰鏁扮粍
+	autoDispatchDia.value?.openDialog([...selectedItems.value]);
 };
 
 // 椤甸潰鏄剧ず鏃跺姞杞芥暟鎹�
 onShow(() => {
 	getList();
-	// 娓呯┖閫夋嫨鐘舵��
 	clearSelection();
 });
 </script>
@@ -588,16 +676,63 @@
 	padding: 20rpx;
 }
 
+// 鎹熻�楃巼璁剧疆鍖哄煙
+.loss-rate-section {
+	background: #ffffff;
+	border: 1rpx solid #e4e7ed;
+	border-radius: 12rpx;
+	padding: 32rpx;
+	margin-top: 24rpx;
+	margin-bottom: 32rpx;
+	box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
+}
+
+.loss-rate-section .section-title {
+	font-size: 32rpx;
+	font-weight: 600;
+	color: #303133;
+	margin-bottom: 20rpx;
+}
+
+.loss-rate-section .loss-rate-content {
+	display: flex;
+	flex-direction: column;
+	gap: 24rpx;
+}
+
+.loss-rate-section .loss-rate-content .loss-rate-item {
+	display: flex;
+	align-items: center;
+	gap: 24rpx;
+}
+
+.loss-rate-section .loss-rate-content .loss-rate-label {
+	font-size: 30rpx;
+	font-weight: 500;
+	color: #303133;
+	min-width: 140rpx;
+	white-space: nowrap;
+}
+
+.loss-rate-section .loss-rate-content .loss-rate-btn {
+	min-width: 260rpx;
+	font-size: 28rpx;
+	height: 64rpx;
+	line-height: 64rpx;
+	border-radius: 8rpx;
+	font-weight: 500;
+}
+
 // 鐐掓満鐘舵�佸尯鍩�
 .machines-section {
 	margin-bottom: 30rpx;
-	
-	.section-title {
-		font-size: 32rpx;
-		font-weight: 600;
-		color: #303133;
-		margin-bottom: 20rpx;
-	}
+}
+
+.machines-section .section-title {
+	font-size: 32rpx;
+	font-weight: 600;
+	color: #303133;
+	margin-bottom: 20rpx;
 }
 
 .machines-grid {
@@ -771,10 +906,10 @@
 	align-items: center;
 	padding: 12rpx 0;
 	border-bottom: 1rpx solid #f5f5f5;
-	
-	&:last-child {
-		border-bottom: none;
-	}
+}
+
+.detail-row:last-child {
+	border-bottom: none;
 }
 
 .detail-label {
@@ -786,16 +921,16 @@
 	font-size: 26rpx;
 	color: #303133;
 	font-weight: 500;
-	
-	&.highlight {
-		color: #ff6b35;
-		font-weight: 600;
-	}
-	
-	&.danger {
-		color: #ee0a24;
-		font-weight: 600;
-	}
+}
+
+.detail-value.highlight {
+	color: #ff6b35;
+	font-weight: 600;
+}
+
+.detail-value.danger {
+	color: #ee0a24;
+	font-weight: 600;
 }
 
 .action-buttons {
@@ -808,6 +943,69 @@
 	min-width: 180rpx;
 }
 
+// 鎵归噺鎿嶄綔鍖哄煙鏍峰紡
+.batch-actions-section {
+	background: #e8f4ff;
+	border: 1rpx solid #409eff;
+	border-radius: 12rpx;
+	padding: 20rpx 24rpx;
+	margin-bottom: 24rpx;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+}
+
+.batch-actions-section .batch-text {
+	font-size: 28rpx;
+	font-weight: 600;
+	color: #409eff;
+}
+
+.batch-actions-section .batch-buttons {
+	display: flex;
+	gap: 16rpx;
+}
+
+.batch-actions-section .batch-btn {
+	min-width: 140rpx;
+}
+
+// 鍏ㄩ�夋搷浣滃尯鍩熸牱寮�
+.select-all-section {
+	background: #ffffff;
+	border-radius: 12rpx;
+	padding: 20rpx 24rpx;
+	margin-bottom: 16rpx;
+	border: 1rpx solid #e4e7ed;
+}
+
+.select-all-section .select-all-content {
+	display: flex;
+	align-items: center;
+}
+
+.select-all-section .select-all-checkbox {
+	font-size: 28rpx;
+	font-weight: 500;
+}
+
+// 鍒楄〃椤归�夋嫨妗嗘牱寮�
+.ledger-item {
+	display: flex;
+	align-items: flex-start;
+	padding: 0;
+}
+
+.item-checkbox {
+	padding: 24rpx 16rpx 0 24rpx;
+	display: flex;
+	align-items: center;
+}
+
+.item-content {
+	flex: 1;
+}
+
 // 绌虹姸鎬�
 .no-data {
 	padding: 100rpx 0;
@@ -818,88 +1016,6 @@
 	font-size: 28rpx;
 	color: #909399;
 	margin-top: 20rpx;
-}
-
-// 鎵归噺鎿嶄綔鍖哄煙鏍峰紡
-.batch-actions-section {
-	background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-	border-radius: 16rpx;
-	padding: 24rpx;
-	margin-bottom: 24rpx;
-	box-shadow: 0 8rpx 24rpx rgba(102, 126, 234, 0.3);
-	color: #ffffff;
-}
-
-.batch-info {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-	margin-bottom: 20rpx;
-}
-
-.batch-count {
-	font-size: 28rpx;
-	font-weight: 600;
-}
-
-.batch-buttons {
-	display: flex;
-	gap: 20rpx;
-	justify-content: flex-end;
-}
-
-.batch-btn {
-	min-width: 180rpx;
-}
-
-// 鍏ㄩ�夋搷浣滃尯鍩熸牱寮�
-.select-all-section {
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
-	background: #f8f9fa;
-	border-radius: 12rpx;
-	padding: 20rpx 24rpx;
-	margin-bottom: 20rpx;
-	border: 1rpx solid #e9ecef;
-}
-
-.select-all-checkbox {
-	display: flex;
-	align-items: center;
-	gap: 12rpx;
-	cursor: pointer;
-}
-
-.select-all-text {
-	font-size: 26rpx;
-	color: #606266;
-	font-weight: 500;
-}
-
-.select-all-hint {
-	font-size: 22rpx;
-	color: #909399;
-}
-
-// 鍒楄〃椤归�夋嫨鏍峰紡
-.ledger-item {
-	display: flex;
-	align-items: flex-start;
-	padding: 0;
-}
-
-.item-checkbox {
-	padding: 24rpx 16rpx 0 24rpx;
-	cursor: pointer;
-	display: flex;
-	align-items: center;
-	min-height: 48rpx;
-}
-
-.item-content {
-	flex: 1;
-	padding: 0;
 }
 
 // 鐐瑰嚮缂栬緫鍖哄煙鏍峰紡

--
Gitblit v1.9.3