From 677cdf1dcb7a0f5f9f1b08e384e5727e22378647 Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期三, 21 一月 2026 19:34:44 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs |    2 
 项目代码/WIDESEA_WMSClient/src/views/basic/Dt_MesReturnRecord.vue                          |   45 +-
 项目代码/WIDESEA_WMSClient/src/views/Home.vue                                              |   46 +-
 项目代码/Dashboard/src/views/Dashboard.vue                                                 |  836 +++++++++++++++++++++++++++++-----------------
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs                |   13 
 项目代码/WIDESEA_WMSClient/src/views/Index.vue                                             |    2 
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs    |  123 +++---
 项目代码/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue                             |    4 
 8 files changed, 649 insertions(+), 422 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/Dashboard/src/views/Dashboard.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/Dashboard/src/views/Dashboard.vue"
index d322a88..3f99dbb 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/Dashboard/src/views/Dashboard.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/Dashboard/src/views/Dashboard.vue"
@@ -36,11 +36,13 @@
               <Box v-if="index === 0" />
               <Download v-else-if="index === 1" />
               <Upload v-else-if="index === 2" />
-              <List v-else />
+              <List v-else-if="index === 3" />
+              <Box v-else-if="index === 4" />
+              <Box v-else />
             </el-icon>
           </div>
           <div class="metric-content">
-            <div class="metric-value">{{ item.value }}</div>
+            <div class="metric-value">{{ formatNumber(item.value) }}</div>
             <div class="metric-label">{{ item.label }}</div>
             <div class="metric-trend" :class="item.trend > 0 ? 'up' : 'down'">
               <el-icon>
@@ -71,12 +73,32 @@
           <div ref="categoryChartRef" class="chart-container"></div>
         </div>
 
-        <!-- 浣滀笟鏁堢巼 -->
+        <!-- 鐗╂枡涓存湡鏁版嵁 -->
         <div class="chart-card">
           <div class="card-title">
-            <span>浣滀笟鏁堢巼缁熻</span>
+            <span>鐗╂枡涓存湡鏁版嵁</span>
+            <span class="task-count">鍏� {{ nearExpirationList.length }} 鏉¤褰�</span>
           </div>
-          <div ref="efficiencyChartRef" class="chart-container"></div>
+          <el-table
+            :data="showNearExpirationList"
+            style="width: 100%"
+            :height="250"
+            :empty-text="nearExpirationList.length === 0 ? '鏆傛棤涓存湡鏁版嵁' : ''"
+          >
+            <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" min-width="120" />
+            <el-table-column prop="batchNo" label="鎵规鍙�" min-width="100" />
+            <el-table-column prop="palletCode" label="鎵樼洏缂栧彿" min-width="100" />
+            <el-table-column prop="locationCode" label="搴撲綅" min-width="100" />
+            <el-table-column prop="stockQuantity" label="搴撳瓨鏁伴噺" width="100" />
+            <el-table-column prop="daysToExpiration" label="涓存湡澶╂暟" width="100">
+              <template #default="{ row }">
+                <div :class="getExpirationClass(row.daysToExpiration)">
+                  {{ row.daysToExpiration }}澶�
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="validDate" label="鏈夋晥鏈熻嚦" width="160" />
+          </el-table>
         </div>
       </div>
 
@@ -85,10 +107,16 @@
         <div class="table-card">
           <div class="card-title">
             <span>瀹炴椂浣滀笟浠诲姟</span>
+            <span class="task-count">鍏� {{ taskList.length }} 鏉′换鍔�</span>
           </div>
-          <el-table :data="showTaskList" style="width: 100%" :height="tableHeight">
-            <el-table-column prop="taskNum" label="浠诲姟鍙�" />
-            <el-table-column prop="taskStatus" label="浠诲姟鐘舵��" width="120">
+          <el-table 
+            :data="showTaskList" 
+            style="width: 100%" 
+            :height="tableHeight"
+            :empty-text="taskList.length === 0 ? '鏆傛棤浣滀笟浠诲姟鏁版嵁' : ''"
+          >
+            <el-table-column prop="taskNum" label="浠诲姟鍙�" min-width="120" />
+            <el-table-column prop="taskStatus" label="浠诲姟鐘舵��" width="140">
               <template #default="{ row }">
                 <div class="status-container" :class="getStatusClass(row.taskStatus)">
                   <div class="status-dot"></div>
@@ -96,7 +124,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="taskType" label="浠诲姟绫诲瀷" width="100">
+            <el-table-column prop="taskType" label="浠诲姟绫诲瀷" width="120">
               <template #default="{ row }">
                 <div class="type-container" :class="getTypeClass(row.taskType)">
                   <el-icon class="type-icon">
@@ -109,10 +137,10 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="palletCode" label="鎵樼洏缂栧彿" />
-            <el-table-column prop="sourceAddress" label="璧风偣浣嶇疆"/>
-            <el-table-column prop="targetAddress" label="缁堢偣浣嶇疆"/>
-            <el-table-column prop="createDate" label="鍒涘缓鏃堕棿"/>
+            <el-table-column prop="palletCode" label="鎵樼洏缂栧彿" min-width="100" />
+            <el-table-column prop="sourceAddress" label="璧风偣浣嶇疆" min-width="100"/>
+            <el-table-column prop="targetAddress" label="缁堢偣浣嶇疆" min-width="100"/>
+            <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" width="180"/>
           </el-table>
         </div>
       </div>
@@ -121,7 +149,7 @@
 </template>
 
 <script>
-import { ref, onMounted, onUnmounted, nextTick } from 'vue'
+import { ref, onMounted, onUnmounted, nextTick, watch } from 'vue'
 import * as echarts from 'echarts'
 import { http } from '@/utils/http'
 import { formatDateTime } from '@/utils'
@@ -190,35 +218,49 @@
       110: "鎻愬崌鏈烘墽琛屼腑"
     }
 
-    // 鍏抽敭鎸囨爣锛堝搷搴斿紡锛�
+    // 鍏抽敭鎸囨爣锛堝搷搴斿紡锛�- 淇鏄犲皠鍏崇郴
     const metrics = ref([
       { 
-        label: '鎬诲簱瀛橀噺', 
+        label: '寰呭叆搴撹鍗�', 
         value: 0, 
         icon: 'Box', 
         color: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', 
         trend: 8.5 
       },
       { 
-        label: '浠婃棩鍏ュ簱', 
+        label: '寰呭嚭搴撹鍗�', 
         value: 0, 
         icon: 'Download', 
         color: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', 
         trend: 12.3 
       },
       { 
-        label: '浠婃棩鍑哄簱', 
+        label: '浠婃棩鍏ュ簱瀹屾垚鏁�', 
         value: 0, 
         icon: 'Upload', 
         color: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', 
         trend: -3.2 
       },
       { 
-        label: '寰呭鐞嗕换鍔�', 
+        label: '浠婃棩鍑哄簱瀹屾垚鏁�', 
         value: 0, 
         icon: 'List', 
         color: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', 
         trend: 5.7 
+      },
+      { 
+        label: '鏈夎揣鏂欑', 
+        value: 0, 
+        icon: 'List', 
+        color: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)', 
+        trend: 2.1 
+      },
+      { 
+        label: '绌虹鏁伴噺', 
+        value: 0, 
+        icon: 'List', 
+        color: 'linear-gradient(135deg, #8176af 0%, #c0b7e8 100%)', 
+        trend: -1.8 
       }
     ])
 
@@ -228,6 +270,12 @@
     const currentTaskIndex = ref(7) // 鍒濆浠庣8鏉″紑濮嬶紙鍓�7鏉¢粯璁ゆ樉绀猴級
     let taskCarouselTimer = null
 
+    // 涓存湡鐗╂枡鍒楄〃鐩稿叧
+    const nearExpirationList = ref([])
+    const showNearExpirationList = ref([])
+    const currentExpirationIndex = ref(7) // 鍒濆浠庣8鏉″紑濮嬶紙鍓�7鏉¢粯璁ゆ樉绀猴級
+    let expirationCarouselTimer = null
+
     // 鑷姩鍒锋柊鐩稿叧閰嶇疆
     const lastInboundToday = ref(0)  // 涓婁竴娆″綋澶╁叆搴撻噺
     const lastOutboundToday = ref(0) // 涓婁竴娆″綋澶╁嚭搴撻噺
@@ -236,24 +284,38 @@
     let lastRefreshTime = ref(0) // 涓婁竴娆″埛鏂版椂闂�
     let autoRefreshTimer = null // 鑷姩鍒锋柊瀹氭椂鍣�
 
+    // 鏁板瓧鏍煎紡鍖�
+    const formatNumber = (num) => {
+      if (num === undefined || num === null || isNaN(num)) return '0';
+      return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+    }
+
     // 鑾峰彇浠诲姟鐘舵�佹枃鏈�
     const getTaskStatusText = (statusNum) => {
       if (statusNum === undefined || statusNum === null || isNaN(statusNum)) {
         return "鏈煡鐘舵��";
       }
-      return taskStatusMap[statusNum] || "鏈煡鐘舵��";
+      return taskStatusMap[statusNum] || `鏈煡鐘舵��(${statusNum})`;
     }
 
     // 鍚姩浠诲姟杞挱
     const startTaskCarousel = () => {
+      // 娓呴櫎鏃у畾鏃跺櫒
       if (taskCarouselTimer) clearInterval(taskCarouselTimer);
 
-      const totalTask = bigscreendata.value.taskList.length;
-      if (totalTask <= 7) { // 浠诲姟鏁�<=7鏃朵笉杞挱
-        showTaskList.value = [...bigscreendata.value.taskList];
+      const totalTask = taskList.value.length;
+      // 浠诲姟鏁�<=7鏃朵笉杞挱
+      if (totalTask <= 7) { 
+        showTaskList.value = [...taskList.value];
         return;
       }
 
+      // 閲嶇疆绱㈠紩
+      currentTaskIndex.value = 7;
+      // 鍒濆鏄剧ず鍓�7鏉�
+      showTaskList.value = taskList.value.slice(0, 7);
+
+      // 鍚姩杞挱
       taskCarouselTimer = setInterval(() => {
         const tableElement = document.querySelector('.el-table');
         if (tableElement) {
@@ -264,7 +326,7 @@
         }
         
         // 鏂板涓�1鏉★紝鍒犻櫎鏈�鍓�1鏉★紙淇濇寔7鏉℃樉绀猴級
-        showTaskList.value.push(bigscreendata.value.taskList[currentTaskIndex.value]);
+        showTaskList.value.push(taskList.value[currentTaskIndex.value]);
         showTaskList.value.shift();
         
         // 寰幆绱㈠紩
@@ -273,6 +335,62 @@
           currentTaskIndex.value = 0;
         }
       }, 5000); // 5绉掕疆鎾竴娆�
+    }
+
+    // 鍋滄浠诲姟杞挱
+    const stopTaskCarousel = () => {
+      if (taskCarouselTimer) {
+        clearInterval(taskCarouselTimer);
+        taskCarouselTimer = null;
+      }
+    }
+
+    // 鍚姩涓存湡鐗╂枡杞挱
+    const startExpirationCarousel = () => {
+      // 娓呴櫎鏃у畾鏃跺櫒
+      if (expirationCarouselTimer) clearInterval(expirationCarouselTimer);
+
+      const totalExpiration = nearExpirationList.value.length;
+      // 璁板綍鏁�<=7鏃朵笉杞挱
+      if (totalExpiration <= 7) {
+        showNearExpirationList.value = [...nearExpirationList.value];
+        return;
+      }
+
+      // 閲嶇疆绱㈠紩
+      currentExpirationIndex.value = 7;
+      // 鍒濆鏄剧ず鍓�7鏉�
+      showNearExpirationList.value = nearExpirationList.value.slice(0, 7);
+
+      // 鍚姩杞挱
+      expirationCarouselTimer = setInterval(() => {
+        // 鏂板涓�1鏉★紝鍒犻櫎鏈�鍓�1鏉★紙淇濇寔7鏉℃樉绀猴級
+        showNearExpirationList.value.push(nearExpirationList.value[currentExpirationIndex.value]);
+        showNearExpirationList.value.shift();
+
+        // 寰幆绱㈠紩
+        currentExpirationIndex.value++;
+        if (currentExpirationIndex.value >= totalExpiration) {
+          currentExpirationIndex.value = 0;
+        }
+      }, 5000); // 5绉掕疆鎾竴娆�
+    }
+
+    // 鍋滄涓存湡鐗╂枡杞挱
+    const stopExpirationCarousel = () => {
+      if (expirationCarouselTimer) {
+        clearInterval(expirationCarouselTimer);
+        expirationCarouselTimer = null;
+      }
+    }
+
+    // 鑾峰彇涓存湡澶╂暟鏍峰紡绫�
+    const getExpirationClass = (days) => {
+      if (days === undefined || days === null || isNaN(days)) return "exp-unknown";
+      if (days <= 0) return "exp-expired"; // 宸茶繃鏈�
+      if (days <= 7) return "exp-critical"; // 7澶╁唴涓存湡
+      if (days <= 30) return "exp-warning"; // 30澶╁唴涓存湡
+      return "exp-normal"; // 姝e父
     }
 
     // 鑾峰彇浠诲姟绫诲瀷鏂囨湰
@@ -291,14 +409,12 @@
         return "status-unknown";
       }
       
-      if (statusNum >= 900) return "status-completed"; // 瀹屾垚
-      if (statusNum >= 400) return "status-processing"; // 杈撻�佺嚎鎵ц涓�
-      if (statusNum >= 300) return "status-processing"; // AGV鎵ц涓�
-      if (statusNum >= 200) return "status-processing"; // 鍫嗗灈鏈烘墽琛屼腑
-      if (statusNum >= 100) return "status-pending"; // 鏂板缓銆佸凡鍙戦��
+      if (statusNum === 900) return "status-completed"; // 瀹屾垚
       if (statusNum === 970) return "status-suspended"; // 鎸傝捣
       if (statusNum === 980) return "status-canceled"; // 鍙栨秷
       if (statusNum === 990) return "status-error"; // 寮傚父
+      if (statusNum >= 200 && statusNum < 900) return "status-processing"; // 鎵ц涓�
+      if (statusNum >= 100 && statusNum < 200) return "status-pending"; // 鏂板缓銆佸凡鍙戦��
       
       return "status-unknown";
     }
@@ -316,35 +432,50 @@
 
     // 浠庡悗绔幏鍙栨暟鎹�
     const fetchBigGreenData = async () => {
-  try {
-    const res = await http.get('/api/BigScreen/GetBigGreenData');
-    console.log('澶у睆鏁版嵁', res);
-    bigscreendata.value = res.data || res;
+      try {
+        // 闃叉姈澶勭悊锛氶伩鍏嶇煭鏃堕棿鍐呭娆¤姹�
+        const now = Date.now();
+        if (now - lastRefreshTime.value < minRefreshGap.value) {
+          return;
+        }
+        lastRefreshTime.value = now;
 
-    updateMetrics();
+        const res = await http.get('/api/BigScreen/GetBigGreenData');
+        console.log('澶у睆鏁版嵁', res);
+        bigscreendata.value = res.data || res;
 
-    taskList.value = bigscreendata.value.taskList || [];
-    showTaskList.value = taskList.value.slice(0, 7);
-    startTaskCarousel();
+        updateMetrics();
 
-    // 鏁版嵁鍔犺浇瀹屾垚鍚庡垵濮嬪寲鍥捐〃
-    nextTick(() => {
-      initEfficiencyChart();
-      initTrendChart();
-      initCategoryChart();
-    });
-  } catch (error) {
-    console.error('鑾峰彇澶у睆鏁版嵁澶辫触:', error);
-    ElMessage.error('鑾峰彇鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯');
-  }
-};
+        // 鏇存柊浠诲姟鍒楄〃
+        taskList.value = Array.isArray(bigscreendata.value.taskList) ? bigscreendata.value.taskList : [];
+        // 閲嶅惎杞挱
+        stopTaskCarousel();
+        startTaskCarousel();
 
-    // 鏇存柊鍏抽敭鎸囨爣
+        // 鏇存柊涓存湡鐗╂枡鍒楄〃
+        nearExpirationList.value = Array.isArray(bigscreendata.value.nearExpirationList) ? bigscreendata.value.nearExpirationList : [];
+        // 閲嶅惎涓存湡鐗╂枡杞挱
+        stopExpirationCarousel();
+        startExpirationCarousel();
+
+        // 鏁版嵁鍔犺浇瀹屾垚鍚庡埛鏂板浘琛�
+        nextTick(() => {
+          refreshCharts(true);
+        });
+      } catch (error) {
+        console.error('鑾峰彇澶у睆鏁版嵁澶辫触:', error);
+        ElMessage.error('鑾峰彇鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯');
+      }
+    };
+
+    // 鏇存柊鍏抽敭鎸囨爣 - 淇鏁版嵁鏄犲皠
     const updateMetrics = () => {
-      metrics.value[0].value = bigscreendata.value.totalStockQuantity || 0
-      metrics.value[1].value = bigscreendata.value.inboundCount || 0
-      metrics.value[2].value = bigscreendata.value.outboundCount || 0
-      metrics.value[3].value = bigscreendata.value.unOutBoundOrderCount || 0
+      metrics.value[0].value = bigscreendata.value.unInBoundOrderCount || 0; // 寰呭叆搴撹鍗�
+      metrics.value[1].value = bigscreendata.value.unOutBoundOrderCount || 0; // 寰呭嚭搴撹鍗�
+      metrics.value[2].value = bigscreendata.value.inboundCount || 0; // 浠婃棩鍏ュ簱瀹屾垚鏁�
+      metrics.value[3].value = bigscreendata.value.outboundCount || 0; // 浠婃棩鍑哄簱瀹屾垚鏁�
+      metrics.value[4].value = bigscreendata.value.inStockPallet || 0; // 鏈夎揣鏂欑
+      metrics.value[5].value = bigscreendata.value.freeStockPallet || 0; // 绌虹鏁伴噺
     }
 
     // 鏇存柊鏃堕棿
@@ -353,32 +484,42 @@
       currentTime.value = formatDateTime(new Date())
     }
 
-    // 鍒濆鍖栬秼鍔垮浘锛堢洿鎺ヤ娇鐢ㄥ悗绔棩鏈燂級
+    // 鍒濆鍖栬秼鍔垮浘
     const initTrendChart = () => {
-      if (!trendChartRef.value) return
+      if (!trendChartRef.value) return;
 
-      trendChart.value = echarts.init(trendChartRef.value)
-
-      // 鐩存帴浠庡悗绔幏鍙栨棩鏈熷拰鏁版嵁
-      const dates = []
-      const inboundData = []
-      const outboundData = []
-
-      if (bigscreendata.value.dailyInOutBoundList && bigscreendata.value.dailyInOutBoundList.length > 0) {
-        bigscreendata.value.dailyInOutBoundList.forEach(item => {
-          dates.push(item.date) // 鐩存帴浣跨敤鍚庣杩斿洖鐨勬棩鏈�
-          inboundData.push(item.dailyInboundQuantity || 0)
-          outboundData.push(item.dailyOutboundQuantity || 0)
-        })
+      // 閿�姣佹棫瀹炰緥
+      if (trendChart.value) {
+        trendChart.value.dispose();
       }
 
-      const hasData = dates.length > 0
+      trendChart.value = echarts.init(trendChartRef.value);
+
+      // 鐩存帴浠庡悗绔幏鍙栨棩鏈熷拰鏁版嵁
+      const dates = [];
+      const inboundData = [];
+      const outboundData = [];
+
+      if (Array.isArray(bigscreendata.value.dailyInOutBoundList) && bigscreendata.value.dailyInOutBoundList.length > 0) {
+        bigscreendata.value.dailyInOutBoundList.forEach(item => {
+          dates.push(item.date || ''); // 鐩存帴浣跨敤鍚庣杩斿洖鐨勬棩鏈�
+          inboundData.push(item.dailyInboundQuantity || 0);
+          outboundData.push(item.dailyOutboundQuantity || 0);
+        });
+      }
+
+      const hasData = dates.length > 0;
 
       const option = {
-        
+        backgroundColor: 'transparent',
+        tooltip: {
+          trigger: 'axis',
+          textStyle: { color: '#fff', fontSize: 12 },
+          backgroundColor: 'rgba(0,0,0,0.7)'
+        },
         legend: {
           data: ['鍏ュ簱閲�', '鍑哄簱閲�'],
-          textStyle: { color: '#fff' }
+          textStyle: { color: '#e0e0e0', fontSize: 12 }
         },
         grid: {
           left: '3%',
@@ -390,15 +531,15 @@
         xAxis: {
           type: 'category',
           boundaryGap: false,
-          data: dates, 
-          axisLine: { lineStyle: { color: '#fff' } },
-          axisLabel: { color: '#fff' }
+          data: hasData ? dates : ['鏆傛棤鏁版嵁'],
+          axisLine: { lineStyle: { color: '#666' } },
+          axisLabel: { color: '#e0e0e0', fontSize: 11 }
         },
         yAxis: {
           type: 'value',
-          axisLine: { lineStyle: { color: '#fff' } },
+          axisLine: { lineStyle: { color: '#666' } },
           splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } },
-          axisLabel: { color: '#fff' },
+          axisLabel: { color: '#e0e0e0', fontSize: 11 },
           min: 0
         },
         series: [
@@ -406,7 +547,7 @@
             name: '鍏ュ簱閲�',
             type: 'line',
             smooth: true,
-            data: inboundData,
+            data: hasData ? inboundData : [0],
             itemStyle: { color: '#5470c6' },
             lineStyle: { color: '#5470c6' },
             areaStyle: {
@@ -423,7 +564,7 @@
             name: '鍑哄簱閲�',
             type: 'line',
             smooth: true,
-            data: outboundData,
+            data: hasData ? outboundData : [0],
             itemStyle: { color: '#91cc75' },
             lineStyle: { color: '#91cc75' },
             areaStyle: {
@@ -436,27 +577,46 @@
             symbol: 'circle',
             symbolSize: 6
           }
-        ],
-        
-      }
+        ]
+      };
 
-      trendChart.value.setOption(option)
-      return trendChart.value
+      trendChart.value.setOption(option);
+      return trendChart.value;
     }
 
     // 鍒濆鍖栧垎绫诲崰姣斿浘
     const initCategoryChart = () => {
-      if (!categoryChartRef.value) return
+      if (!categoryChartRef.value) return;
       
-      categoryChart.value = echarts.init(categoryChartRef.value)
+      // 閿�姣佹棫瀹炰緥
+      if (categoryChart.value) {
+        categoryChart.value.dispose();
+      }
+      
+      categoryChart.value = echarts.init(categoryChartRef.value);
+      
+      const chartData = Array.isArray(bigscreendata.value.inventoryLocationDist) && bigscreendata.value.inventoryLocationDist.length > 0 
+        ? bigscreendata.value.inventoryLocationDist 
+        : [
+            { value: 3580, name: '鍘熸潗鏂�', itemStyle: { color: '#5470c6' } },
+            { value: 2840, name: '鍗婃垚鍝�', itemStyle: { color: '#91cc75' } },
+            { value: 4120, name: '鎴愬搧', itemStyle: { color: '#fac858' } },
+            { value: 2040, name: '杈呮枡', itemStyle: { color: '#ee6666' } }
+          ];
       
       const option = {
-        tooltip: { trigger: 'item' },
+        backgroundColor: 'transparent',
+        tooltip: { 
+          trigger: 'item',
+          textStyle: { color: '#fff', fontSize: 12 },
+          backgroundColor: 'rgba(0,0,0,0.7)',
+          formatter: '{b}: {c} ({d}%)'
+        },
         legend: {
           orient: 'vertical',
           right: '10%',
           top: 'center',
-          textStyle: { color: '#fff' }
+          textStyle: { color: '#e0e0e0', fontSize: 12 }
         },
         series: [
           {
@@ -472,230 +632,241 @@
             },
             label: { show: false },
             emphasis: {
-              label: { show: true, fontSize: 16, fontWeight: 'bold' }
+              label: { show: true, fontSize: 14, fontWeight: 'bold', color: '#fff' }
             },
-            data: bigscreendata.value.inventoryLocationDist.length > 0 
-              ? bigscreendata.value.inventoryLocationDist 
-              : [
-                  { value: 3580, name: '鍘熸潗鏂�', itemStyle: { color: '#5470c6' } },
-                  { value: 2840, name: '鍗婃垚鍝�', itemStyle: { color: '#91cc75' } },
-                  { value: 4120, name: '鎴愬搧', itemStyle: { color: '#fac858' } },
-                  { value: 2040, name: '杈呮枡', itemStyle: { color: '#ee6666' } }
-                ]
+            data: chartData
           }
         ]
-      }
+      };
       
-      categoryChart.value.setOption(option)
-      return categoryChart.value
+      categoryChart.value.setOption(option);
+      return categoryChart.value;
     }
 
     // 鍒濆鍖栨晥鐜囩粺璁″浘
-    // 鍒濆鍖栨晥鐜囩粺璁″浘
-// 鍒濆鍖栨晥鐜囩粺璁″浘锛堜慨澶嶇増锛�
-const initEfficiencyChart = () => {
-  if (!efficiencyChartRef.value) {
-    console.warn('鏁堢巼鍥捐〃瀹瑰櫒涓嶅瓨鍦紒');
-    return;
-  }
-
-  // 纭繚瀹瑰櫒鏈夐珮搴�
-  efficiencyChartRef.value.style.height = '250px';
-  efficiencyChartRef.value.style.width = '100%';
-
-  // 閿�姣佹棫瀹炰緥
-  if (efficiencyChart.value) {
-    efficiencyChart.value.dispose();
-  }
-
-  // 鍒濆鍖� ECharts
-  efficiencyChart.value = echarts.init(efficiencyChartRef.value);
-
-  // 鏁版嵁澶勭悊
-  const taskData = {
-    '鍏ュ簱': 0,
-    '鍑哄簱': 0
-  };
-  bigscreendata.value.completeTask.forEach(item => {
-    if (item.taskType && typeof item.count === 'number') {
-      taskData[item.taskType] = item.count;
-    }
-  });
-
-  const option = {
-    tooltip: {
-      trigger: 'axis',
-      axisPointer: { type: 'shadow' },
-      formatter: params => {
-        return params.map(p => `${p.seriesName}: ${p.value || 0} 鍗昤).join('<br/>');
+    const initEfficiencyChart = () => {
+      if (!efficiencyChartRef.value) {
+        console.warn('鏁堢巼鍥捐〃瀹瑰櫒涓嶅瓨鍦紒');
+        return;
       }
-    },
-    grid: {
-      left: '5%',
-      right: '5%',
-      bottom: '10%',
-      top: '15%',
-      containLabel: true
-    },
-    xAxis: {
-      type: 'category',
-      data: ['鍏ュ簱浣滀笟', '鍑哄簱浣滀笟'],
-      axisLine: { lineStyle: { color: '#fff' } },
-      axisLabel: { color: '#fff' }
-    },
-    yAxis: {
-      type: 'value',
-      name: '瀹屾垚鏁伴噺(鍗�)',
-      nameTextStyle: { color: '#fff' },
-      axisLine: { lineStyle: { color: '#fff' } },
-      splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } },
-      axisLabel: { color: '#fff' },
-      min: 0
-    },
-    series: [
-      {
-        name: '浣滀笟鏁伴噺',
-        data: [taskData['鍏ュ簱'], taskData['鍑哄簱']],
-        type: 'bar',
-        barWidth: '40%',
-        itemStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            { offset: 0, color: '#83bff6' },
-            { offset: 1, color: '#188df0' }
-          ]),
-          borderRadius: [5, 5, 0, 0]
+
+      // 纭繚瀹瑰櫒鏈夐珮搴�
+      efficiencyChartRef.value.style.height = '250px';
+      efficiencyChartRef.value.style.width = '100%';
+
+      // 閿�姣佹棫瀹炰緥
+      if (efficiencyChart.value) {
+        efficiencyChart.value.dispose();
+      }
+
+      // 鍒濆鍖� ECharts
+      efficiencyChart.value = echarts.init(efficiencyChartRef.value);
+
+      // 鏁版嵁澶勭悊
+      const taskData = {
+        '鍏ュ簱': 0,
+        '鍑哄簱': 0
+      };
+      
+      if (Array.isArray(bigscreendata.value.completeTask)) {
+        bigscreendata.value.completeTask.forEach(item => {
+          if (item.taskType && typeof item.count === 'number') {
+            taskData[item.taskType] = item.count;
+          }
+        });
+      }
+
+      const hasData = taskData.鍏ュ簱 > 0 || taskData.鍑哄簱 > 0;
+
+      const option = {
+        backgroundColor: 'transparent',
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: { type: 'shadow' },
+          textStyle: { color: '#fff', fontSize: 12 },
+          backgroundColor: 'rgba(0,0,0,0.7)',
+          formatter: params => {
+            return params.map(p => `${p.seriesName}: ${p.value || 0} 鍗昤).join('<br/>');
+          }
         },
-        label: {
-          show: true,
-          position: 'top',
-          color: '#fff',
-          fontSize: 12
-        }
-      }
-    ]
-  };
+        grid: {
+          left: '5%',
+          right: '5%',
+          bottom: '10%',
+          top: '15%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          data: hasData ? ['鍏ュ簱浣滀笟', '鍑哄簱浣滀笟'] : ['鏆傛棤鏁版嵁'],
+          axisLine: { lineStyle: { color: '#666' } },
+          axisLabel: { color: '#e0e0e0', fontSize: 11 }
+        },
+        yAxis: {
+          type: 'value',
+          name: '瀹屾垚鏁伴噺(鍗�)',
+          nameTextStyle: { color: '#e0e0e0', fontSize: 12 },
+          axisLine: { lineStyle: { color: '#666' } },
+          splitLine: { lineStyle: { color: 'rgba(255,255,255,0.1)' } },
+          axisLabel: { color: '#e0e0e0', fontSize: 11 },
+          min: 0
+        },
+        series: [
+          {
+            name: '浣滀笟鏁伴噺',
+            data: hasData ? [taskData['鍏ュ簱'], taskData['鍑哄簱']] : [0],
+            type: 'bar',
+            barWidth: '40%',
+            itemStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#83bff6' },
+                { offset: 1, color: '#188df0' }
+              ]),
+              borderRadius: [5, 5, 0, 0]
+            },
+            label: {
+              show: hasData,
+              position: 'top',
+              color: '#ffffff',
+              fontSize: 12,
+              fontWeight: 600
+            }
+          }
+        ]
+      };
 
-  efficiencyChart.value.setOption(option, true);
-  console.log('鏁堢巼鍥捐〃娓叉煋瀹屾垚锛屾暟鎹細', taskData);
-};
+      efficiencyChart.value.setOption(option, true);
+      console.log('鏁堢巼鍥捐〃娓叉煋瀹屾垚锛屾暟鎹細', taskData);
+    };
 
-    // 鍒锋柊鍥捐〃鏁版嵁锛坕sDataChange锛氭槸鍚︽槸鏁版嵁鍙樺寲瀵艰嚧鐨勫埛鏂帮級
+    // 鍒锋柊鍥捐〃鏁版嵁
     const refreshCharts = (isDataChange = false) => {
       // 鏁版嵁鍙樺寲鏃舵坊鍔犻棯鐑佹晥鏋�
       if (isDataChange) {
-        const chartElements = [trendChartRef.value, categoryChartRef.value, efficiencyChartRef.value]
+        const chartElements = [trendChartRef.value, categoryChartRef.value, efficiencyChartRef.value];
         chartElements.forEach(el => {
           if (el) {
             el.classList.add('flash-effect');
             setTimeout(() => el.classList.remove('flash-effect'), 600);
           }
-        })
+        });
       }
 
-      // 閿�姣佹棫鍥捐〃瀹炰緥
-      if (trendChart.value) trendChart.value.dispose()
-      if (categoryChart.value) categoryChart.value.dispose()
-      if (efficiencyChart.value) efficiencyChart.value.dispose()
-      
       // 閲嶆柊鍒濆鍖栧浘琛�
-      initTrendChart()
-      initCategoryChart()
-      initEfficiencyChart()
+      initTrendChart();
+      initCategoryChart();
+      initEfficiencyChart();
     }
 
     // 鎵嬪姩鍒锋柊鏁版嵁
     const refreshData = () => {
-      fetchBigGreenData()
+      fetchBigGreenData();
     }
 
     // 鍚姩鑷姩鍒锋柊
     const startAutoRefresh = () => {
-      if (autoRefreshTimer) clearInterval(autoRefreshTimer)
+      if (autoRefreshTimer) clearInterval(autoRefreshTimer);
       autoRefreshTimer = setInterval(() => {
-        console.log('瀹氭椂鍒锋柊鏁版嵁:', new Date().toLocaleString())
-        fetchBigGreenData()
-      }, refreshInterval.value)
+        console.log('瀹氭椂鍒锋柊鏁版嵁:', new Date().toLocaleString());
+        fetchBigGreenData();
+      }, refreshInterval.value);
+    }
+
+    // 鍋滄鑷姩鍒锋柊
+    const stopAutoRefresh = () => {
+      if (autoRefreshTimer) {
+        clearInterval(autoRefreshTimer);
+        autoRefreshTimer = null;
+      }
     }
 
     // 绐楀彛澶у皬鏀瑰彉鏃堕噸缁樺浘琛ㄥ拰璋冩暣琛ㄦ牸楂樺害
     const handleResize = () => {
       try {
-        const windowHeight = window.innerHeight
-        const headerHeight = 60
-        const navHeight = 50
-        const metricsHeight = 120
-        const chartsHeight = 300
-        const padding = 80
+        const windowHeight = window.innerHeight;
+        const headerHeight = 60;
+        const navHeight = 50;
+        const metricsHeight = 120;
+        const chartsHeight = 300;
+        const padding = 80;
         
-        const availableHeight = windowHeight - headerHeight - navHeight - metricsHeight - chartsHeight - padding
-        tableHeight.value = Math.max(200, Math.min(availableHeight, 400))
+        const availableHeight = windowHeight - headerHeight - navHeight - metricsHeight - chartsHeight - padding;
+        tableHeight.value = Math.max(200, Math.min(availableHeight, 400));
         
         // 閲嶇粯鍥捐〃
-        const charts = [trendChart.value, categoryChart.value, efficiencyChart.value]
+        const charts = [trendChart.value, categoryChart.value, efficiencyChart.value];
         charts.forEach(chart => {
-          if (chart) chart.resize()
-        })
+          if (chart) chart.resize();
+        });
       } catch (error) {
-        console.warn('鍥捐〃閲嶇粯鏃跺嚭閿�:', error)
+        console.warn('鍥捐〃閲嶇粯鏃跺嚭閿�:', error);
       }
     }
 
     onMounted(() => {
       // 鍒濆鍖栨椂闂�
-      updateTime()
-      timer = setInterval(updateTime, 1000)
+      updateTime();
+      timer = setInterval(updateTime, 1000);
 
-      // 鍒濆鍖栨暟鎹拰鍥捐〃
-      fetchBigGreenData()
+      // 鍒濆鍖栨暟鎹�
+      fetchBigGreenData();
       
       nextTick(() => {
-        initTrendChart()
-        initCategoryChart()
-        initEfficiencyChart()
-        handleResize()
-        startAutoRefresh() // 鍚姩鑷姩鍒锋柊
-      })
+        handleResize();
+        startAutoRefresh(); // 鍚姩鑷姩鍒锋柊
+      });
       
       // 鐩戝惉绐楀彛澶у皬鍙樺寲
-      window.addEventListener('resize', handleResize)
-    })
+      window.addEventListener('resize', handleResize);
+    });
 
     onUnmounted(() => {
       // 娓呴櫎鎵�鏈夊畾鏃跺櫒
-      clearInterval(timer)
-      if (taskCarouselTimer) clearInterval(taskCarouselTimer)
-      if (autoRefreshTimer) clearInterval(autoRefreshTimer)
+      clearInterval(timer);
+      stopTaskCarousel();
+      stopExpirationCarousel();
+      stopAutoRefresh();
       
       // 绉婚櫎绐楀彛鐩戝惉
-      window.removeEventListener('resize', handleResize)
+      window.removeEventListener('resize', handleResize);
 
       // 閿�姣佸浘琛ㄥ疄渚�
       try {
-        if (trendChart.value) trendChart.value.dispose()
-        if (categoryChart.value) categoryChart.value.dispose()
-        if (efficiencyChart.value) efficiencyChart.value.dispose()
+        if (trendChart.value) trendChart.value.dispose();
+        if (categoryChart.value) categoryChart.value.dispose();
+        if (efficiencyChart.value) efficiencyChart.value.dispose();
       } catch (error) {
-        console.warn('鍥捐〃閿�姣佹椂鍑洪敊:', error)
+        console.warn('鍥捐〃閿�姣佹椂鍑洪敊:', error);
       }
-    })
+    });
+
+    // 鐩戝惉浠诲姟鍒楄〃鍙樺寲锛岃嚜鍔ㄩ噸鍚疆鎾�
+    watch(taskList, () => {
+      stopTaskCarousel();
+      startTaskCarousel();
+    }, { deep: true });
 
     return {
       currentTime,
       metrics,
       taskList,
       showTaskList,
+      nearExpirationList,
+      showNearExpirationList,
       trendChartRef,
       categoryChartRef,
       efficiencyChartRef,
       tableHeight,
+      formatNumber,
       getTaskTypeText,
       getTaskStatusText,
       getStatusClass,
       getTypeClass,
+      getExpirationClass,
       refreshData
-    }
+    };
   }
-}
+};
 </script>
 
 <style scoped>
@@ -718,7 +889,7 @@
   height: 60px;
   background: linear-gradient(90deg, rgba(30, 58, 138, 0.5) 0%, rgba(30, 58, 138, 0.1) 100%);
   border-radius: 10px;
-  border: 1px solid rgba(255, 255, 255, 0.1);
+  border: 1px solid rgba(255, 255, 255, 0.15);
 }
 
 .title {
@@ -727,11 +898,14 @@
   background: linear-gradient(90deg, #4facfe 0%, #00f2fe 100%);
   -webkit-background-clip: text;
   -webkit-text-fill-color: transparent;
+  margin: 0;
 }
 
 .datetime {
   font-size: 16px;
   color: #4facfe;
+  font-weight: 600;
+  font-family: 'Consolas', monospace;
 }
 
 .nav-menu {
@@ -746,9 +920,9 @@
   gap: 8px;
   padding: 10px 25px;
   background: rgba(255, 255, 255, 0.05);
-  border: 1px solid rgba(255, 255, 255, 0.1);
+  border: 1px solid rgba(255, 255, 255, 0.15);
   border-radius: 8px;
-  color: #fff;
+  color: #e0e0e0;
   text-decoration: none;
   transition: all 0.3s;
   cursor: pointer;
@@ -757,11 +931,14 @@
 .nav-item:hover {
   background: rgba(79, 172, 254, 0.2);
   border-color: #4facfe;
+  transform: translateY(-1px);
 }
 
 .nav-item.active {
   background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
   border-color: transparent;
+  color: #fff;
+  box-shadow: 0 4px 12px rgba(79, 172, 254, 0.3);
 }
 
 .main-content {
@@ -771,9 +948,10 @@
   gap: 15px;
 }
 
+/* 鍏抽敭鎸囨爣鍗$墖 - 浼樺寲缃戞牸甯冨眬鍜屾牱寮忓姣斿害 */
 .metrics-row {
   display: grid;
-  grid-template-columns: repeat(4, 1fr);
+  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
   gap: 15px;
 }
 
@@ -783,7 +961,7 @@
   gap: 20px;
   padding: 20px;
   background: rgba(255, 255, 255, 0.05);
-  border: 1px solid rgba(255, 255, 255, 0.1);
+  border: 1px solid rgba(255, 255, 255, 0.15);
   border-radius: 10px;
   transition: all 0.3s;
 }
@@ -791,6 +969,7 @@
 .metric-card:hover {
   transform: translateY(-5px);
   box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
+  border-color: rgba(79, 172, 254, 0.5);
 }
 
 .metric-icon {
@@ -808,23 +987,26 @@
 }
 
 .metric-value {
-  font-size: 28px;
-  font-weight: bold;
-  color: #fff;
+  font-size: 32px;
+  font-weight: 700;
+  color: #ffffff;
   margin-bottom: 5px;
+  text-shadow: 0 0 8px rgba(255,255,255,0.2);
 }
 
 .metric-label {
   font-size: 14px;
-  color: rgba(255, 255, 255, 0.6);
+  color: #cccccc;
   margin-bottom: 5px;
+  font-weight: 500;
 }
 
 .metric-trend {
   display: flex;
   align-items: center;
   gap: 5px;
-  font-size: 12px;
+  font-size: 13px;
+  font-weight: 600;
 }
 
 .metric-trend.up {
@@ -835,17 +1017,20 @@
   color: #f56c6c;
 }
 
+/* 鍥捐〃鍖哄煙 - 浼樺寲甯冨眬鍜屾牱寮� */
 .charts-row {
   display: grid;
-  grid-template-columns: repeat(3, 1fr);
+  grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
   gap: 15px;
 }
 
 .chart-card {
   padding: 20px;
   background: rgba(255, 255, 255, 0.05);
-  border: 1px solid rgba(255, 255, 255, 0.1);
+  border: 1px solid rgba(255, 255, 255, 0.15);
   border-radius: 10px;
+  display: flex;
+  flex-direction: column;
 }
 
 .card-title {
@@ -854,15 +1039,23 @@
   align-items: center;
   margin-bottom: 15px;
   font-size: 16px;
-  font-weight: bold;
+  font-weight: 600;
   color: #4facfe;
 }
 
-.chart-container {
-  width: 100%;
-  height: 250px;
+.task-count {
+  font-size: 12px;
+  color: #cccccc;
+  font-weight: normal;
 }
 
+.chart-container {
+  flex: 1;
+  width: 100%;
+  min-height: 250px;
+}
+
+/* 琛ㄦ牸鍖哄煙 */
 .table-row {
   flex: 1;
 }
@@ -871,24 +1064,31 @@
   height: 100%;
   padding: 20px;
   background: rgba(255, 255, 255, 0.05);
-  border: 1px solid rgba(255, 255, 255, 0.1);
+  border: 1px solid rgba(255, 255, 255, 0.15);
   border-radius: 10px;
+  display: flex;
+  flex-direction: column;
 }
 
-/* Element Plus Table 鏍峰紡瑕嗙洊 */
+/* Element Plus Table 鏍峰紡娣卞害浼樺寲 */
 :deep(.el-table) {
   background: transparent !important;
+  color: #e0e0e0;
+  font-size: 13px;
 }
 
 :deep(.el-table th) {
-  background: rgba(255, 255, 255, 0.1) !important;
-  color: #fff !important;
-  border-color: rgba(255, 255, 255, 0.1) !important;
+  background: rgba(255, 255, 255, 0.15) !important;
+  color: #ffffff !important;
+  border-color: rgba(255, 255, 255, 0.2) !important;
+  font-weight: 600;
+  padding: 10px 0;
 }
 
 :deep(.el-table td) {
   border-color: rgba(255, 255, 255, 0.1) !important;
-  color: rgba(255, 255, 255, 0.9) !important;
+  color: #e0e0e0 !important;
+  padding: 12px 0;
 }
 
 :deep(.el-table tr) {
@@ -896,14 +1096,18 @@
 }
 
 :deep(.el-table__row:hover td) {
-  background: rgba(255, 255, 255, 0.05) !important;
+  background: rgba(255, 255, 255, 0.08) !important;
 }
 
-:deep(.el-table--enable-row-hover .el-table__body tr:hover > td) {
-  background: rgba(255, 255, 255, 0.05) !important;
+:deep(.el-table--border) {
+  border: 1px solid rgba(255,255,255,0.15) !important;
 }
 
-/* 浠诲姟鐘舵�佹牱寮� */
+:deep(.el-table__empty-text) {
+  color: #cccccc !important;
+}
+
+/* 浠诲姟鐘舵�佹牱寮� - 楂樺姣斿害浼樺寲 */
 .status-container {
   display: flex;
   align-items: center;
@@ -912,7 +1116,7 @@
   position: relative;
   overflow: hidden;
   font-size: 12px;
-  font-weight: 500;
+  font-weight: 600;
 }
 
 .status-dot {
@@ -936,7 +1140,7 @@
   white-space: nowrap;
 }
 
-/* 涓嶅悓鐘舵�佺殑棰滆壊 */
+/* 涓嶅悓鐘舵�佺殑棰滆壊 - 娣辫壊涓婚楂樺姣斿害 */
 .status-completed {
   background: rgba(103, 194, 58, 0.15);
   color: #67c23a;
@@ -1015,7 +1219,20 @@
   background: rgba(245, 108, 108, 0.5);
 }
 
-/* 浠诲姟绫诲瀷鏍峰紡 */
+.status-unknown {
+  background: rgba(75, 85, 99, 0.15);
+  color: #9ca3af;
+}
+
+.status-unknown .status-dot {
+  background: #9ca3af;
+}
+
+.status-unknown .status-dot::after {
+  background: rgba(156, 163, 175, 0.5);
+}
+
+/* 浠诲姟绫诲瀷鏍峰紡 - 楂樺姣斿害浼樺寲 */
 .type-container {
   display: flex;
   align-items: center;
@@ -1023,7 +1240,7 @@
   border-radius: 20px;
   position: relative;
   font-size: 12px;
-  font-weight: 500;
+  font-weight: 600;
 }
 
 .type-icon {
@@ -1054,6 +1271,37 @@
 .type-other {
   background: rgba(144, 147, 153, 0.15);
   color: #909399;
+}
+
+.type-unknown {
+  background: rgba(75, 85, 99, 0.15);
+  color: #9ca3af;
+}
+
+/* 涓存湡澶╂暟鏍峰紡 */
+.exp-expired {
+  color: #f56c6c;
+  font-weight: 600;
+}
+
+.exp-critical {
+  color: #e6a23c;
+  font-weight: 600;
+}
+
+.exp-warning {
+  color: #f0ad4e;
+  font-weight: 500;
+}
+
+.exp-normal {
+  color: #67c23a;
+  font-weight: 500;
+}
+
+.exp-unknown {
+  color: #909399;
+  font-weight: 400;
 }
 
 /* 鍔ㄧ敾鏁堟灉 */
@@ -1098,36 +1346,28 @@
   }
 }
 
-/* 鍝嶅簲寮忛�傞厤 */
+/* 鍝嶅簲寮忛�傞厤澧炲己 */
 @media screen and (max-width: 1920px) {
   .metric-value {
-    font-size: 24px;
+    font-size: 28px;
   }
 
   .chart-container {
-    height: 220px;
+    min-height: 220px;
   }
 }
 
 @media screen and (max-width: 1600px) {
-  .metrics-row {
-    grid-template-columns: repeat(2, 1fr);
-  }
-
-  .charts-row {
-    grid-template-columns: repeat(2, 1fr);
-  }
-
   .title {
     font-size: 20px;
   }
 
   .metric-value {
-    font-size: 20px;
+    font-size: 24px;
   }
 
   .chart-container {
-    height: 200px;
+    min-height: 200px;
   }
 }
 
@@ -1150,22 +1390,12 @@
     font-size: 14px;
   }
 
-  .metrics-row {
-    grid-template-columns: repeat(2, 1fr);
-    gap: 10px;
-  }
-
   .metric-card {
     padding: 15px;
   }
 
   .metric-value {
-    font-size: 18px;
-  }
-
-  .charts-row {
-    grid-template-columns: 1fr;
-    gap: 10px;
+    font-size: 22px;
   }
 
   .chart-card {
@@ -1173,23 +1403,7 @@
   }
 
   .chart-container {
-    height: 180px;
-  }
-}
-
-@media screen and (max-width: 1024px) {
-  .metrics-row {
-    grid-template-columns: 1fr 1fr;
-  } 
-
-  .nav-menu {
-    flex-wrap: wrap;
-  }
-
-  .nav-item {
-    flex: 1;
-    min-width: 100px;
-    justify-content: center;
+    min-height: 180px;
   }
 }
 
@@ -1216,17 +1430,17 @@
   .nav-menu {
     gap: 8px;
     padding: 0;
+    flex-wrap: wrap;
   }
 
   .nav-item {
     padding: 6px 12px;
     font-size: 12px;
+    flex: 1;
+    min-width: 80px;
+    justify-content: center;
     flex-direction: column;
     gap: 4px;
-  }
-
-  .metrics-row {
-    grid-template-columns: 1fr;
   }
 
   .metric-card {
@@ -1240,8 +1454,8 @@
     height: 45px;
   }
 
-  .chart-container {
-    height: 150px;
+  .metric-trend {
+    justify-content: center;
   }
 }
 </style>
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Home.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Home.vue"
index f3b4fb6..d941502 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Home.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Home.vue"
@@ -31,7 +31,7 @@
               <Download />
             </el-icon>
           </div>
-          <div class="card-title">浠婃棩鍏ュ簱瀹屾垚鏁�</div>
+          <div class="card-title">浠婃棩鍏ュ簱瀹屾垚绠辨暟</div>
           <div class="card-value">{{ bigscreendata.inboundCount }}</div>
         </div>
       </el-col>
@@ -42,7 +42,7 @@
               <Upload />
             </el-icon>
           </div>
-          <div class="card-title">浠婃棩鍑哄簱瀹屾垚鏁�</div>
+          <div class="card-title">浠婃棩鍑哄簱瀹屾垚绠辨暟</div>
           <div class="card-value">{{ bigscreendata.outboundCount }}</div>
         </div>
       </el-col>
@@ -114,7 +114,7 @@
       </el-col>
       <el-col :span="8">
         <div class="chart-card">
-          <div class="chart-title">杩�7鏃ュ嚭鍏ュ簱瓒嬪娍锛堝浘鍍忓寲璧板娍锛�</div>
+          <div class="chart-title">杩�7鏃ュ嚭鍏ュ簱鍗曟嵁瓒嬪娍锛堝浘鍍忓寲璧板娍锛�</div>
           <div ref="stockTrendRef" class="chart-container"></div>
         </div>
       </el-col>
@@ -203,9 +203,9 @@
   const uniqueMap = new Map();
   expirationList.forEach(item => {
     const uniqueKey = [
-      item.materielCode || '鏈煡缂栫爜',
-      item.batchNo || '鏈煡鎵规',
-      item.palletCode || '鏈煡鎵樼洏',
+      item.materielCode,
+      item.batchNo,
+      item.palletCode,
     ].join('|');
     if (!uniqueMap.has(uniqueKey)) {
       uniqueMap.set(uniqueKey, item);
@@ -227,16 +227,16 @@
       expireLevel = '30澶╀互涓�';
     }
     return {
-      materielCode: item.materielCode || '鏈煡缂栫爜',
-      materielName: item.materielName || '鏈煡鍚嶇О',
-      batchNo: item.batchNo || '鏈煡鎵规',
-      validDate: item.validDate || '鏈煡鏈夋晥鏈�',
+      materielCode: item.materielCode,
+      materielName: item.materielName,
+      batchNo: item.batchNo,
+      validDate: item.validDate,
       daysToExpiration: daysToExpiration,
       expireLevel: expireLevel,
       stockQuantity: item.stockQuantity || 0,
-      locationCode: item.locationCode || '鏈煡搴撲綅',
-      palletCode: item.palletCode || '鏈煡鎵樼洏',
-      unit: item.unit || 'PCS'
+      locationCode: item.locationCode,
+      palletCode: item.palletCode,
+      unit: item.unit
     };
   });
 });
@@ -293,28 +293,28 @@
 
   // 鏍煎紡鍖栧叆搴撹鍗�
   const formattedInbound = inboundOrders.map(item => ({
-    upperOrderNo: item.upperOrderNo || item.inboundOrderNo || '鏈煡鍗曞彿',
+    upperOrderNo: item.upperOrderNo || item.inboundOrderNo,
     taskStatus: item.orderStatus || 0,
     taskType: 'inbound',
     businessType: item.businessType || '',
     returnToMESStatus: item.returnToMESStatus || 0,
-    factoryArea: item.factoryArea || '鏈煡鍘傚尯',
-    modifier: item.modifier || '鏈煡淇敼浜�',
-    createDate: item.createDate || '鏈煡鏃堕棿',
-    modifyDate: item.modifyDate || '鏈煡鏃堕棿'
+    factoryArea: item.factoryArea,
+    modifier: item.modifier,
+    createDate: item.createDate,
+    modifyDate: item.modifyDate
   }));
 
   // 鏍煎紡鍖栧嚭搴撹鍗�
   const formattedOutbound = outboundOrders.map(item => ({
-    upperOrderNo: item.upperOrderNo || item.orderNo || '鏈煡鍗曞彿',
+    upperOrderNo: item.upperOrderNo || item.orderNo,
     taskStatus: item.orderStatus || 0,
     taskType: 'outbound',
     businessType: item.businessType || '',
     returnToMESStatus: item.returnToMESStatus || 0,
-    factoryArea: item.factoryArea || '鏈煡鍘傚尯',
-    modifier: item.modifier || '鏈煡淇敼浜�',
-    createDate: item.createDate || '鏈煡鏃堕棿',
-    modifyDate: item.modifyDate || '鏈煡鏃堕棿'
+    factoryArea: item.factoryArea,
+    modifier: item.modifier,
+    createDate: item.createDate,
+    modifyDate: item.modifyDate
   }));
 
   const merged = [...formattedInbound, ...formattedOutbound];
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Index.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Index.vue"
index eaa6fba..66a38ce 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Index.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/Index.vue"
@@ -270,7 +270,7 @@
       { name: "white", color: "#fff" },
     ]);
     const links = ref([
-      { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
+      // { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
       {
         text: "瀹夊叏閫�鍑�",
         path: "/login",
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/basic/Dt_MesReturnRecord.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/basic/Dt_MesReturnRecord.vue"
index 7c56a14..47d7e9c 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/basic/Dt_MesReturnRecord.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/basic/Dt_MesReturnRecord.vue"
@@ -171,23 +171,16 @@
       [
         { title: "鍗曟嵁缂栧彿", field: "orderNo", type: "like" },
         {
-          title: "鍥炰紶绫诲瀷",
-          field: "returnType",
-          type: "select",
-          data: [
-            { label: "鏁村崟", value: 1 },
-            { label: "鍒嗘壒", value: 2 },
-          ],
+          title: "APi璇锋眰鍦板潃",
+          field: "apiUrl",
+          type: "like",
         },
         {
           title: "鍥炰紶鎺ュ彛绫诲瀷",
           field: "interfaceType",
           type: "select",
-          data: [
-            { label: "鍑哄簱", value: 1 },
-            { label: "鍏ュ簱", value: 2 },
-            { label: "璋冩嫧", value: 3 },
-          ],
+          dataKey:"interfaceType",
+          data: [],
         },
       ],
       [
@@ -195,12 +188,28 @@
           title: "鍥炰紶鐘舵��",
           field: "returnStatus",
           type: "select",
-          data: [
-            { label: "鍥炰紶鎴愬姛", value: 1 },
-            { label: "鍥炰紶澶辫触", value: 2 },
-          ],
+          dataKey:"returnStatus",
+          data: [],
+        },
+        {
+          title: "http鐘舵�佺爜",
+          field: "httpStatusCode",
+          type: "int",
         },
         { title: "璇锋眰浠g爜", field: "requestCode", type: "like" },
+      ],
+      [
+        {
+          title: "鏈�鍚庡洖浼犳椂闂�",
+          field: "lastReturnTime",
+          type: "datetime",
+        },
+        {
+          title: "鎴愬姛鏃堕棿",
+          field: "successTime",
+          type: "datetime",
+        },
+        { title: "鍥炰紶鏁版嵁", field: "requestData", type: "like" },
       ],
     ]);
 
@@ -229,7 +238,6 @@
         width: 120,
         align: "left",
       },
-      
       {
         field: "interfaceType",
         title: "鎺ュ彛绫诲瀷",
@@ -297,7 +305,7 @@
       },
       {
         field: "failureReason",
-        title: "澶辫触鍘熷洜",
+        title: "绗竴娆″け璐ュ師鍥�",
         type: "string",
         width: 200,
         align: "left",
@@ -309,7 +317,6 @@
         type: "string",
         width: 150,
         align: "left",
-        hidden: true, // 澶ф枃鏈粯璁ら殣钘忥紝鍙�氳繃鍒楅厤缃樉绀�
       },
       {
         field: "responseData",
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue"
index 51df000..1ad9657 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue"
@@ -72,8 +72,8 @@
     });
     const searchFormOptions = ref([
       [
-        { title: "瀛楀吀缂栧彿", field: "dicNo" },
-        { title: "瀛楀吀鍚嶇О", field: "dicName", type: "textarea" },
+        { title: "瀛楀吀缂栧彿", field: "dicNo" ,type:"like"},
+        { title: "瀛楀吀鍚嶇О", field: "dicName", type: "like" },
         { title: "鐖剁骇ID", field: "parentId", type: "number" },
       ],
       [
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs"
index cc34fe3..2e733c2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs"
@@ -497,7 +497,7 @@
                 Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
                 {
                     ApiUrl = httpResponseResult.ApiUrl,
-                    InterfaceType = 1,
+                    InterfaceType = 4,
                     OrderId = materialCodeInfo.OrderId ?? 0,
                     OrderNo = materialCodeInfo.OrderNo ?? "",
                     RequestCode = reqCode,
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
index 2be3d60..5990115 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_InboundService/InboundService.cs"
@@ -3,6 +3,7 @@
 using MailKit.Search;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
 using Org.BouncyCastle.Asn1.X509;
+using Org.BouncyCastle.Bcpg;
 using SixLabors.ImageSharp;
 using SqlSugar;
 using System;
@@ -54,7 +55,8 @@
         private readonly IRepository<Dt_MesReturnRecord> _mesReturnRecord;
         private readonly ILocationInfoService _locationInfoService;
         private readonly IRepository<Dt_TakeStockOrder> _takeStockOrder;
-        public InboundService(IUnitOfWorkManage unitOfWorkManage, IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IStockService stockService, IRepository<Dt_Task> taskRepository,IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfo, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord,ILocationInfoService locationInfoService,IRepository<Dt_TakeStockOrder> takeStockOrder)
+        private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
+        public InboundService(IUnitOfWorkManage unitOfWorkManage, IInboundOrderDetailService inboundOrderDetailService, IInboundOrderService inbounOrderService, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IStockService stockService, IRepository<Dt_Task> taskRepository,IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfo, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord,ILocationInfoService locationInfoService,IRepository<Dt_TakeStockOrder> takeStockOrder,IRepository<Dt_StockInfoDetail> stockInfoDetailRepository)
         {
             _unitOfWorkManage = unitOfWorkManage;
             InboundOrderDetailService = inboundOrderDetailService;
@@ -71,6 +73,7 @@
             _mesReturnRecord = mesReturnRecord;
             _locationInfoService = locationInfoService;
             _takeStockOrder = takeStockOrder;
+            _stockInfoDetailRepository = stockInfoDetailRepository;
         }
 
         public async Task<WebResponseContent> GroupPallet(GroupPalletDto palletDto)
@@ -117,7 +120,13 @@
                     d.SupplyCode,
                     d.WarehouseCode
                 }).ToList();
-                    return content.Error($"璇风‘璁ゆ潯鐮亄palletDto.Barcode}鏄惁宸茬粡缁勭洏",detail);   
+                   var palletId = _stockInfoDetailRepository.QueryFirst(x => x.Barcode == palletDto.Barcode);
+                    if (palletId == null)
+                    {
+                        return content.Error($"鏉$爜鏉$爜{palletDto.Barcode}涓嶅瓨鍦�");
+                    }
+                    var pallet =_stockInfoRepository.QueryFirst(x => x.Id == palletId.StockId);
+                    return content.Error($"鏉$爜{palletDto.Barcode}宸茬粡缁勫埌{pallet.PalletCode}",detail);   
                 }
                 inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Includes(x=>x.Details).Where(x => x.Id == details.First().OrderId).First();
 
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs"
index 44be98d..3f1ee11 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_StockService/StockDetailByMaterielService.cs"
@@ -30,11 +30,11 @@
         {
             try
             {
-
                 List<StockDetailByMateriel> materielnfoStatistics = new List<StockDetailByMateriel>();
                 ISugarQueryable<Dt_StockInfoDetail> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfoDetail>();
-
                 ISugarQueryable<Dt_StockInfo> sugarQueryable = _dbBase.Queryable<Dt_StockInfo>();
+                ISugarQueryable<Dt_MaterielInfo> sugarQueryable3 = _dbBase.Queryable<Dt_MaterielInfo>();
+
                 if (!string.IsNullOrEmpty(options.Wheres))
                 {
                     try
@@ -42,85 +42,80 @@
                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
                         if (searchParametersList.Count > 0)
                         {
+                           
+                            SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
+                            if (searchParameters != null)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielCode.Contains(searchParameters.Value));
-                                }
+                                sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielCode.Contains(searchParameters.Value));
                             }
+                            
+                            searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.WarehouseCode).FirstLetterToLower());
+                            if (searchParameters != null)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.WarehouseCode).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.WarehouseCode.Contains(searchParameters.Value));
-                                }
+                                sugarQueryable1 = sugarQueryable1.Where(x => x.WarehouseCode.Contains(searchParameters.Value));
                             }
+                            
+                            searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielName).FirstLetterToLower());
+                            if (searchParameters != null)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielName).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielName.Equals(searchParameters.Value));
-                                }
+                               
+                                sugarQueryable1 = sugarQueryable1.LeftJoin(sugarQueryable3, (d, m) => d.MaterielCode == m.MaterielCode)
+                                                                 .Where((d, m) => m.MaterielName.Equals(searchParameters.Value));
                             }
+                           
+                            searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
+                            if (searchParameters != null)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.BatchNo.Equals(searchParameters.Value));
-                                }
+                                sugarQueryable1 = sugarQueryable1.Where(x => x.BatchNo.Equals(searchParameters.Value));
                             }
+                            
+                            searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.SupplyCode).FirstLetterToLower());
+                            if (searchParameters != null)
                             {
-                                SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.SupplyCode).FirstLetterToLower());
-                                if (searchParameters != null)
-                                {
-                                    sugarQueryable1 = sugarQueryable1.Where(x => x.SupplyCode.Contains(searchParameters.Value));
-                                }
+                                sugarQueryable1 = sugarQueryable1.Where(x => x.SupplyCode.Contains(searchParameters.Value));
                             }
-
                         }
-
                     }
                     catch (Exception ex)
                     {
-
+                       
                     }
                 }
 
-
-                ISugarQueryable<StockDetailByMateriel> sugarQueryable2 = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => b.StockId == a.Id).Where((b, a) => a.LocationCode != "" && a.LocationCode != null).Select((b, a)
-                    => new StockDetailByMateriel
+                ISugarQueryable<StockDetailByMateriel> sugarQueryable2 = sugarQueryable1
+                    .InnerJoin(sugarQueryable, (detail, stock) => detail.StockId == stock.Id)
+                    .LeftJoin(sugarQueryable3, (detail, stock, materiel) => detail.MaterielCode == materiel.MaterielCode)
+                    .Where((detail, stock, materiel) => !string.IsNullOrEmpty(stock.LocationCode))
+                    .Select((detail, stock, materiel) => new StockDetailByMateriel
                     {
-                       StockId = b.StockId,
-                        MaterielCode = b.MaterielCode,
-                        MaterielName = b.MaterielName,
-                        StockQuantity = (decimal)b.StockQuantity,
-                        OutboundQuantity = (decimal)b.OutboundQuantity,
-                        OrderNo = b.OrderNo,
-                        BatchNo = b.BatchNo,
-                        SerialNumber = b.SerialNumber,
-                        SupplyCode = b.SupplyCode,
-                        WarehouseCode = b.WarehouseCode,
-                        Barcode = b.Barcode,
-                        Unit = b.Unit,
-                        Creater = b.Creater,
-                        CreateDate= b.CreateDate,
-                        Modifier = b.Modifier,
-                        ModifyDate = b.ModifyDate,
-                        Remark = a.Remark,
-
+                        StockId = detail.StockId,
+                        MaterielCode = detail.MaterielCode,
+                        MaterielName = materiel.MaterielName ==null ?detail.MaterielName:materiel.MaterielName,
+                        StockQuantity = (decimal)detail.StockQuantity,
+                        OutboundQuantity = (decimal)detail.OutboundQuantity,
+                        OrderNo = detail.OrderNo,
+                        BatchNo = detail.BatchNo,
+                        SerialNumber = detail.SerialNumber,
+                        SupplyCode = detail.SupplyCode,
+                        WarehouseCode = detail.WarehouseCode,
+                        Barcode = detail.Barcode,
+                        Unit = detail.Unit,
+                        Creater = detail.Creater,
+                        CreateDate = detail.CreateDate,
+                        Modifier = detail.Modifier,
+                        ModifyDate = detail.ModifyDate,
+                        Remark = stock.Remark
                     });
-                // 鑾峰彇鎵�鏈夋暟鎹�
+
+                
                 var allData = sugarQueryable2.ToList();
 
-                // 浣跨敤瀛楀吀杩涜鍒嗙粍姹囨��
+                
                 var groupedData = new Dictionary<string, StockDetailByMateriel>();
                 foreach (var item in allData)
                 {
-
                     string groupKey = $"{item.MaterielCode}|{item.SupplyCode}|{item.BatchNo}|{item.WarehouseCode}";
 
-                    // 纭繚鍒濆鍊间负decimal绫诲瀷
                     if (groupedData.ContainsKey(groupKey))
                     {
                         groupedData[groupKey].StockQuantity += Convert.ToDecimal(item.StockQuantity);
@@ -151,24 +146,26 @@
                     }
                 }
 
-                // 杞崲涓哄垪琛�
+                
                 materielnfoStatistics = groupedData.Values.ToList();
-
-                // 鍒嗛〉澶勭悊
                 int startIndex = (options.Page - 1) * options.Rows;
                 int endIndex = Math.Min(startIndex + options.Rows, materielnfoStatistics.Count);
-                materielnfoStatistics = materielnfoStatistics.GetRange(startIndex, endIndex - startIndex);
+                if (startIndex < materielnfoStatistics.Count)
+                {
+                    materielnfoStatistics = materielnfoStatistics.GetRange(startIndex, endIndex - startIndex);
+                }
+                else
+                {
+                    materielnfoStatistics = new List<StockDetailByMateriel>();
+                }
 
                 int count = groupedData.Count;
-
                 return new PageGridData<StockDetailByMateriel>(count, materielnfoStatistics);
-
             }
             catch (Exception ex)
             {
-
+                return new PageGridData<StockDetailByMateriel>();
             }
-            return new PageGridData<StockDetailByMateriel>();
         }
     }
 }

--
Gitblit v1.9.3