From 2403e0b0a127278d40e2fc780311d93262bef52c Mon Sep 17 00:00:00 2001
From: liulijun <liulijun@hnkhzn.com>
Date: 星期三, 25 三月 2026 16:47:03 +0800
Subject: [PATCH] 修复库位平面图三四五巷道部分货位没有按列显示的问题

---
 项目代码/WMS/WMSClient/src/main.js                         |   13 
 项目代码/WMS/WMSClient/src/services/taskTimeout.js         |  259 ++++++++++++++++
 项目代码/WMS/WMSClient/src/views/Home.vue                  |  143 ++++++--
 项目代码/WMS/WMSClient/src/views/stock/ProStockView.vue    |    1 
 项目代码/WMS/WMSClient/src/services/emptyPalletWarning.js  |  144 +++++++++
 项目代码/WMS/WMSClient/src/views/Index.vue                 |   27 +
 项目代码/WMS/WMSClient/src/extension/stock/ProStockView.js |   99 ------
 项目代码/WMS/WMSClient/src/extension/taskinfo/task.js      |  204 ------------
 项目代码/WMS/WMSClient/src/store/index.js                  |   18 -
 项目代码/WMS/WMSClient/src/views/outbound/outSGOrder.vue   |    1 
 10 files changed, 550 insertions(+), 359 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/stock/ProStockView.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/stock/ProStockView.js"
index 7fecdb4..ca4c8fe 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/stock/ProStockView.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/stock/ProStockView.js"
@@ -19,12 +19,6 @@
   methods: {
     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
     onInit() {
-      // 鍒濆鍖栫┖鎵樻鏌ュ畾鏃跺櫒
-      // 璁剧疆瀹氭椂鍣紝姣�60绉掓鏌ヤ竴娆�
-      this.checkEmptyPalletTimer = setInterval(() => {
-        this.checkEmptyPalletWarning();
-      }, 10000); // 姣�10绉掓鏌ヤ竴娆�
-
       // 鍘熸湁浠g爜...
       // let InOrder = this.buttons.find(x => x.value == 'StockOutbound');
       // if (InOrder) {
@@ -151,98 +145,7 @@
       //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
     },
     
-    // 妫�鏌ョ┖鎵樻暟閲�
-    checkEmptyPalletWarning() {
-      // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore锛屾鏌ユ槸鍚﹀瓨鍦ㄧ浉鍚岀殑璀﹀憡娑堟伅
-      const globalObj = this.$global || window.$global || {};
-      const store = this.$store || window.$store;
-      const globalMessageList = globalObj.messageList || [];
-      const storeMessageList = store?.state?.messageList || [];
-      
-      // 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦ㄦ湭娓呴櫎鐨勭┖鎵橀璀︽秷鎭�
-      const hasExistingWarning = [...globalMessageList, ...storeMessageList].some(msg => 
-        msg.businessType === 'pallet_warning' && msg.type === 'warning'
-      );
-      
-      if (hasExistingWarning) return;
-      
-      // 鑾峰彇褰撳墠鎵�鏈夊簱瀛樻暟鎹�
-      const stockData = this.$refs.table?.rowData || this.$refs.table?.tableData || [];
-      
-      // 璁$畻绌烘墭鎬绘暟閲忥細鍙绠梡roStockAttribute涓�5鐨勮褰�
-      let totalEmptyPalletCount = 0;
-      
-      // 閬嶅巻鎵�鏈夊簱瀛樿褰曪紝绱姞绌烘墭鏁伴噺
-      stockData.forEach(stock => {
-        const proStockAttribute = stock.proStockAttribute || stock.ProStockAttribute || 0;
-        if (proStockAttribute === 5) {
-          // 瑙f瀽sumStock鐨勫�硷紝鎻愬彇鏁板瓧閮ㄥ垎
-          const sumStocks = stock.sumStocks || stock.sumStock || 0;
-          const stockQuantity = typeof sumStocks === 'string' 
-            ? parseInt(sumStocks.match(/\d+/)?.[0] || 0) 
-            : parseInt(sumStocks || 0);
-          totalEmptyPalletCount += stockQuantity;
-        }
-      });
-      
-      // 绌烘墭棰勮闃堝�间负50涓�
-      const warningThreshold = 50;
-      
-      // 濡傛灉绌烘墭鎬绘暟閲忓皬浜庨槇鍊硷紝鍙戦�佽鍛婃秷鎭�
-      if (totalEmptyPalletCount < warningThreshold) {
-        this.sendPalletWarningMessage(totalEmptyPalletCount, warningThreshold);
-      }
-    },
-    
-    // 鍙戦�佺┖鎵樿鍛婃秷鎭�
-    sendPalletWarningMessage(emptyPalletCount, warningThreshold) {
-      // 鍒涘缓璀﹀憡娑堟伅
-      const warningMessage = {
-        id: Date.now(),
-        title: '绌烘墭鏁伴噺棰勮',
-        message: `鎴愬搧搴撶┖鎵樻暟閲忎笉瓒筹紝褰撳墠鎬绘暟閲忥細${emptyPalletCount}锛屼綆浜庨璀﹂槇鍊硷細${warningThreshold}锛屽缓璁強鏃惰ˉ鍏咃紒`,
-        type: 'warning',
-        businessType: 'pallet_warning',
-        createTime: new Date().toLocaleString(),
-        relatedData: {
-          EmptyPalletCount: emptyPalletCount,
-          Threshold: warningThreshold
-        }
-      };
-      
-      // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore
-      const globalObj = this.$global || window.$global || {};
-      const store = this.$store || window.$store;
-      
-      // 娣诲姞娑堟伅鍒皊tore
-      if (store) {
-        store.commit('addMessage', warningMessage);
-      }
-      
-      // 娣诲姞娑堟伅鍒板叏灞�娑堟伅鍒楄〃锛岀‘淇濆垪琛ㄥ瓨鍦�
-      if (!globalObj.messageList) {
-        globalObj.messageList = [];
-      }
-      globalObj.messageList.push(warningMessage);
-      
-      // 鏄剧ず鎻愮ず妗�
-      // const $alert = this.$alert;
-      // const $message = this.$message;
-      
-      // if ($alert) {
-      //   $alert(warningMessage.message, warningMessage.title, {
-      //     confirmButtonText: '纭畾',
-      //     type: warningMessage.type,
-      //     closeOnClickModal: false,
-      //     closeOnPressEscape: false,
-      //     showCancelButton: false
-      //   });
-      // } else if ($message) {
-      //   $message.warning(warningMessage.message);
-      // } else {
-      //   alert(`${warningMessage.title}: ${warningMessage.message}`);
-      // }
-    },
+
     
     // 鍦ㄦ煡璇㈠悗澶勭悊鏁版嵁
     searchAfter(result) {
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/taskinfo/task.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/taskinfo/task.js"
index 8a6c791..a14069a 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/taskinfo/task.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/extension/taskinfo/task.js"
@@ -95,186 +95,7 @@
         }
       }
 
-      // 鍒濆鍖栦换鍔$姸鎬佹鏌ュ畾鏃跺櫒
-      this.taskStatusMap = {}; // 瀛樺偍浠诲姟鐘舵�佸紑濮嬫椂闂�
-      this.taskTimeoutMinutes = 10; // 浠诲姟瓒呮椂鏃堕棿锛屽崟浣嶄负鍒嗛挓
-      this.checkTaskStatusTimer = setInterval(() => {
-        this.checkTaskStatus();
-      }, 1000); // 姣�1绉掓鏌ヤ竴娆★紝鎻愰珮妫�鏌ョ簿搴︼紝鍑忓皯寤惰繜
-    },
-
-    // 妫�鏌ヤ换鍔$姸鎬�
-    checkTaskStatus() {
-      // 鑾峰彇褰撳墠鎵�鏈変换鍔℃暟鎹�
-      const taskData = this.$refs.table?.rowData || this.$refs.table?.tableData || [];
-      const now = new Date();
-
-      // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore
-      const globalObj = this.$global || window.$global || {};
-      const store = this.$store || window.$store;
-
-      // 澶勭悊娑堟伅鍒犻櫎閫昏緫锛岄噸缃搴斾换鍔$殑瀹氭椂鍣�
-      const deletedMessages = globalObj.messageDeleted || [];
-
-      if (deletedMessages.length > 0) {
-        const storeMessageList = store?.state?.messageList || [];
-
-        // 閬嶅巻琚垹闄ょ殑娑堟伅ID锛岄噸缃搴斾换鍔$殑瀹氭椂鍣�
-        deletedMessages.forEach(deletedId => {
-          const deletedMessage = storeMessageList.find(msg => msg.id === deletedId);
-          if (deletedMessage?.businessType === 'task_timeout' && deletedMessage.taskNum && this.taskStatusMap[deletedMessage.taskNum]) {
-            this.taskStatusMap[deletedMessage.taskNum] = now;
-          }
-        });
-
-        // 娓呯┖宸插鐞嗙殑鍒犻櫎娑堟伅鍒楄〃
-        globalObj.messageDeleted = [];
-      }
-
-      // 鑾峰彇褰撳墠鎵�鏈変换鍔″彿鍜岀姸鎬�
-      const currentTaskStatuses = {};
-      taskData.forEach(task => {
-        currentTaskStatuses[task.taskNum] = task.taskStatus;
-      });
-
-      // 妫�鏌ヤ换鍔$姸鎬�
-      taskData.forEach(task => {
-        if (task.taskStatus === 210) {
-          // 鍫嗗灈鏈烘墽琛屼腑鐘舵��
-          if (!this.taskStatusMap[task.taskNum]) {
-            this.taskStatusMap[task.taskNum] = now;
-          } else {
-            // 璁$畻鎸佺画鏃堕棿锛堝垎閽燂級
-            const duration = (now - this.taskStatusMap[task.taskNum]) / 60000;
-            if (duration >= this.taskTimeoutMinutes) {
-              this.sendTaskWarningMessage(task, duration);
-              delete this.taskStatusMap[task.taskNum];
-            }
-          }
-        } else {
-          // 浠诲姟鐘舵�佸凡鏀瑰彉锛屾竻闄よ褰�
-          delete this.taskStatusMap[task.taskNum];
-        }
-      });
-
-      // 娓呴櫎宸茶В鍐崇殑浠诲姟瓒呮椂娑堟伅
-      this.clearResolvedTaskMessages(currentTaskStatuses);
-    },
-
-    // 娓呴櫎宸茶В鍐崇殑浠诲姟瓒呮椂娑堟伅
-      clearResolvedTaskMessages(currentTaskStatuses) {
-        // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore
-        const globalObj = this.$global || window.$global || {};
-        const store = this.$store || window.$store;
-        
-        // 鑾峰彇鎵�鏈夋秷鎭垪琛�
-        const globalMessageList = globalObj.messageList || [];
-        const storeMessageList = store?.state?.messageList || [];
-        
-        // 鍚堝苟鎵�鏈夋秷鎭紝鎵惧嚭闇�瑕佹竻闄ょ殑浠诲姟瓒呮椂娑堟伅
-        const allMessages = [...globalMessageList, ...storeMessageList];
-        const taskTimeoutMessages = allMessages.filter(msg => msg.businessType === 'task_timeout');
-        
-        // 閬嶅巻鎵�鏈変换鍔¤秴鏃舵秷鎭�
-        taskTimeoutMessages.forEach(msg => {
-          const taskNum = msg.taskNum;
-          // 妫�鏌ユ潯浠讹細
-          // 1. 浠诲姟涓嶅湪褰撳墠浠诲姟鍒楄〃涓紙宸插畬鎴愭垨琚Щ闄わ級
-          // 2. 浠诲姟鍦ㄥ綋鍓嶄换鍔″垪琛ㄤ腑锛屼絾鐘舵�佸凡涓嶅啀鏄爢鍨涙満鎵ц涓�
-          if (!currentTaskStatuses[taskNum] || currentTaskStatuses[taskNum] !== 210) {
-            // 浠诲姟宸插畬鎴愭垨鐘舵�佸凡鏀瑰彉锛屾竻闄よ娑堟伅
-            this.handleDeleteTaskMessage(msg);
-          }
-        });
-      },
-
-    // 澶勭悊鍒犻櫎鍗曚釜浠诲姟娑堟伅
-    handleDeleteTaskMessage(message) {
-      // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore
-      const globalObj = this.$global || window.$global || {};
-      const store = this.$store || window.$store;
-
-      // 浠庡叏灞�娑堟伅鍒楄〃涓垹闄よ娑堟伅
-      if (globalObj.messageList) {
-        const index = globalObj.messageList.findIndex(msg => msg.id === message.id);
-        if (index !== -1) {
-          globalObj.messageList.splice(index, 1);
-        }
-      }
-
-      // 浠巗tore涓垹闄よ娑堟伅
-      if (store) {
-        store.commit('removeMessage', message.id);
-      }
-    },
-
-    // 鍙戦�佷换鍔¤鍛婃秷鎭�
-    sendTaskWarningMessage(task, duration) {
-      // 鍒涘缓璀﹀憡娑堟伅
-      const warningMessage = {
-        id: Date.now(),
-        title: '浠诲姟寮傚父璀﹀憡',
-        message: `浠诲姟鍙� ${task.taskNum} 宸插湪鍫嗗灈鏈烘墽琛屼腑鐘舵�佽秴杩�${Math.round(duration)}鍒嗛挓锛岃鍙婃椂澶勭悊锛乣,
-        type: 'warning',
-        businessType: 'task_timeout',
-        taskNum: task.taskNum,
-        createTime: new Date().toLocaleString()
-      };
-
-      // 鑾峰彇鍏ㄥ眬瀵硅薄鍜宻tore锛屾鏌ユ槸鍚﹀瓨鍦ㄧ浉鍚岀殑璀﹀憡娑堟伅
-      const globalObj = this.$global || window.$global || {};
-      const store = this.$store || window.$store;
-      const globalMessageList = globalObj.messageList || [];
-      const storeMessageList = store?.state?.messageList || [];
-
-      // 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦ㄧ浉鍚岀殑浠诲姟瓒呮椂璀﹀憡
-      const hasExistingWarning = [...globalMessageList, ...storeMessageList].some(msg =>
-        msg.businessType === 'task_timeout' && msg.taskNum === task.taskNum
-      );
-
-      if (hasExistingWarning) return;
-
-      // 鍙戦�佹秷鎭埌娑堟伅鍒楄〃
-      try {
-        // 娣诲姞娑堟伅鍒皊tore
-        const $store = this.$store || window.$store;
-        if ($store) {
-          $store.commit('addMessage', warningMessage);
-        }
-
-        // 娣诲姞娑堟伅鍒板叏灞�娑堟伅鍒楄〃
-        if (globalObj.messageList) {
-          globalObj.messageList.push(warningMessage);
-        }
-
-        // 鏄剧ず璀﹀憡瀵硅瘽妗嗭紝浼樺厛浣跨敤$alert
-        // const $global = this.$global || window.$global;
-        // const alertOptions = {
-        //   confirmButtonText: '纭畾',
-        //   type: warningMessage.type,
-        //   closeOnClickModal: false,
-        //   closeOnPressEscape: false,
-        //   showCancelButton: false
-        // };
-
-        // if (this.$alert || window.$alert) {
-        //   const $alert = this.$alert || window.$alert;
-        //   $alert(warningMessage.message, warningMessage.title, alertOptions);
-        // } else if (this.$confirm || window.$confirm) {
-        //   const $confirm = this.$confirm || window.$confirm;
-        //   $confirm(warningMessage.message, warningMessage.title, alertOptions);
-        // } else {
-        //   // 浣跨敤娴忚鍣ㄥ師鐢焌lert浣滀负澶囬��
-        //   alert(`${warningMessage.title}: ${warningMessage.message}`);
-        // }
-      } catch (error) {
-        // 鍑洪敊鏃朵娇鐢ㄦ祻瑙堝櫒鍘熺敓alert浣滀负鏈�缁堝閫�
-        try {
-          alert(`浠诲姟寮傚父璀﹀憡: 浠诲姟鍙� ${task.taskNum} 宸插湪鍫嗗灈鏈烘墽琛屼腑鐘舵�佽秴杩�${Math.round(duration)}鍒嗛挓锛岃鍙婃椂澶勭悊锛乣);
-        } catch (e) {
-          // 蹇界暐鎵�鏈夐敊璇�
-        }
-      }
+      // 涓嶅啀闇�瑕佹敞鍐屼换鍔℃暟鎹簮锛屽叏灞�浠诲姟瓒呮椂鏈嶅姟宸叉敼涓虹洿鎺ヤ粠API鑾峰彇鏁版嵁
     },
     onInited() {
       //妗嗘灦鍒濆鍖栭厤缃悗
@@ -288,24 +109,6 @@
     },
     searchAfter(result) {
       // 鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      
-      // 澶勭悊浠诲姟鍒楄〃鍒锋柊鍚庣殑浠诲姟瓒呮椂娑堟伅娓呯悊
-      // 鎻愬彇褰撳墠浠诲姟鐘舵��
-      const currentTaskStatuses = {};
-      if (result && Array.isArray(result)) {
-        result.forEach(task => {
-          currentTaskStatuses[task.taskNum] = task.taskStatus;
-        });
-      } else if (result && result.result && Array.isArray(result.result)) {
-        // 澶勭悊鍒嗛〉杩斿洖鐨勬暟鎹牸寮�
-        result.result.forEach(task => {
-          currentTaskStatuses[task.taskNum] = task.taskStatus;
-        });
-      }
-      
-      // 娓呴櫎宸茶В鍐崇殑浠诲姟瓒呮椂娑堟伅
-      this.clearResolvedTaskMessages(currentTaskStatuses);
-      
       return true;
     },
     addBefore(formData) {
@@ -327,6 +130,11 @@
       //(3)this.editFormFields.瀛楁='xxx';
       //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
       //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    },
+    
+    // 缁勪欢閿�姣佹椂娓呯悊璧勬簮
+    onDestroyed() {
+      // 涓嶅啀闇�瑕佹竻鐞嗕换鍔℃暟鎹簮锛屽叏灞�浠诲姟瓒呮椂鏈嶅姟宸叉敼涓虹洿鎺ヤ粠API鑾峰彇鏁版嵁
     }
   }
 };
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/main.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/main.js"
index 8330f07..c47c658 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/main.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/main.js"
@@ -11,6 +11,10 @@
 // import 'dayjs/locale/zh-cn'
 // import locale from 'element-plus/lib/locale/lang/zh-cn'
 import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+// 寮曞叆绌烘墭棰勮鏈嶅姟
+import emptyPalletWarning from './services/emptyPalletWarning'
+// 寮曞叆鍏ㄥ眬浠诲姟瓒呮椂鏈嶅姟
+import taskTimeoutService from './services/taskTimeout'
 
 
 
@@ -71,3 +75,12 @@
     .mount('#app');
 app.config.globalProperties.$Message = app.config.globalProperties.$message;
 
+// 鍒濆鍖栫┖鎵橀璀︽湇鍔�
+emptyPalletWarning.init(app);
+// 鍒濆鍖栧叏灞�浠诲姟瓒呮椂鏈嶅姟
+taskTimeoutService.init(app);
+// 灏嗕换鍔¤秴鏃舵湇鍔℃寕杞藉埌鍏ㄥ眬灞炴�т笂
+app.config.globalProperties.$taskTimeoutService = taskTimeoutService;
+// 灏嗕换鍔¤秴鏃舵湇鍔℃寕杞藉埌window瀵硅薄涓婏紝鏂逛究鍦ㄦ墿灞曠粍浠朵腑璁块棶
+window.$taskTimeoutService = taskTimeoutService;
+
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/emptyPalletWarning.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/emptyPalletWarning.js"
new file mode 100644
index 0000000..b4a839e
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/emptyPalletWarning.js"
@@ -0,0 +1,144 @@
+// 绌烘墭棰勮鏈嶅姟
+import http from '../api/http';
+
+// 绌烘墭棰勮闃堝��
+const WARNING_THRESHOLD = 50;
+
+// 妫�鏌ョ┖鎵樻暟閲忕殑鏈嶅姟
+const checkEmptyPalletWarning = async (globalState, store) => {
+  try {
+    // 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦ㄦ湭娓呴櫎鐨勭┖鎵橀璀︽秷鎭�
+    const globalMessageList = globalState.messageList || [];
+    
+    const hasExistingWarning = globalMessageList.some(msg => 
+      msg.businessType === 'pallet_warning' && msg.type === 'warning'
+    );
+    
+    if (hasExistingWarning) {
+      return;
+    }
+    
+    // 璋冪敤API鑾峰彇鎴愬搧搴撶┖鎵樻暟閲忥紝娣诲姞proStockAttribute绛変簬5鐨勮繃婊ゆ潯浠�
+    const requestData = {
+      Page: 1,
+      Rows: 9999,
+      Filter: [
+        {
+          Name: 'proStockAttribute',
+          Value: 5,
+          Operator: 'eq'
+        }
+      ],
+      Wheres: '',
+      Sort: '',
+      Order: 'desc'
+    };
+    
+    let apiData = null;
+    let apiSuccess = false;
+    
+    try {
+      // 璋冪敤API鑾峰彇鎴愬搧搴撶┖鎵樻暟閲�
+      apiData = await http.post('/api/ProStockView/GetPageData', requestData);
+      apiSuccess = true;
+    } catch (error) {
+      console.error('API璇锋眰澶辫触:', error);
+    }
+    
+    // 濡傛灉API澶辫触锛屼笉浣跨敤妯℃嫙鏁版嵁锛岀洿鎺ヨ繑鍥�
+    if (!apiSuccess || !apiData) {
+      return;
+    }
+    
+    let totalEmptyPalletCount = 0;
+    
+    if (apiData && apiData.rows) {
+      const stockData = apiData.rows;
+      
+      // 閬嶅巻鎵�鏈夎繑鍥炶褰曪紝鐩存帴绱姞搴撳瓨鏁伴噺锛圓PI宸茶繃婊ょ┖鎵橈級
+      for (const stock of stockData) {
+        // 鑾峰彇搴撳瓨鏁伴噺锛屽皾璇曟墍鏈夊彲鑳界殑瀛楁
+        let stockQuantity = 0;
+        
+        // 灏濊瘯浠庢墍鏈夊彲鑳界殑瀛楁鑾峰彇搴撳瓨鏁伴噺
+        const quantityFields = ['sumStocks', '搴撳瓨鏁伴噺', 'quantity', 'stockCount', 'sumStock', '搴撳瓨鏁�', 'count'];
+        for (const field of quantityFields) {
+          if (stock[field] !== undefined && stock[field] !== null) {
+            // 灏濊瘯瑙f瀽涓烘暟瀛�
+            const parsedQuantity = typeof stock[field] === 'number' ? stock[field] : parseInt(stock[field]);
+            if (!isNaN(parsedQuantity)) {
+              stockQuantity = parsedQuantity;
+              break;
+            }
+          }
+        }
+        
+        // 绱姞绌烘墭鏁伴噺
+        totalEmptyPalletCount += stockQuantity;
+      }
+      
+      // 鍙湁褰撶┖鎵樻暟閲忓皯浜�50鏃舵墠鍙戦�侀璀�
+      if (totalEmptyPalletCount < WARNING_THRESHOLD) {
+        sendPalletWarningMessage(globalState, store, totalEmptyPalletCount, WARNING_THRESHOLD);
+      }
+    }
+  } catch (error) {
+    console.error('妫�鏌ョ┖鎵樻暟閲忓け璐�:', error);
+    console.error('閿欒鍫嗘爤:', error.stack);
+  }
+};
+
+// 鍙戦�佺┖鎵樿鍛婃秷鎭�
+const sendPalletWarningMessage = (globalState, store, emptyPalletCount, warningThreshold) => {
+  // 鍒涘缓璀﹀憡娑堟伅
+  const warningMessage = {
+    id: Date.now(),
+    title: '绌烘墭鏁伴噺棰勮',
+    message: `鎴愬搧搴撶┖鎵樻暟閲忎笉瓒筹紝褰撳墠鎬绘暟閲忥細${emptyPalletCount}锛屼綆浜庨璀﹂槇鍊硷細${warningThreshold}锛屽缓璁強鏃惰ˉ鍏咃紒`,
+    type: 'warning',
+    businessType: 'pallet_warning',
+    createTime: new Date().toLocaleString(),
+    relatedData: {
+      EmptyPalletCount: emptyPalletCount,
+      Threshold: warningThreshold
+    }
+  };
+  
+  // 鐩存帴娣诲姞娑堟伅鍒板叏灞�娑堟伅鍒楄〃
+  if (globalState && globalState.messageList) {
+    // 妫�鏌ユ秷鎭槸鍚﹀凡瀛樺湪
+    const isNewMessage = !globalState.messageList.some(m => m.id === warningMessage.id);
+    globalState.messageList.push(warningMessage);
+    
+
+  }
+};
+
+// 鍒濆鍖栫┖鎵橀璀︽湇鍔�
+const initEmptyPalletWarning = (app) => {
+  const globalState = app.config.globalProperties.$global;
+  const store = app.config.globalProperties.$store;
+  
+  // 璁剧疆瀹氭椂鍣紝姣�60绉掓鏌ヤ竴娆�
+  const checkEmptyPalletTimer = setInterval(() => {
+    checkEmptyPalletWarning(globalState, store);
+  }, 30000); // 姣�30绉掓鏌ヤ竴娆�
+  
+  // 20绉掑悗鎵ц鍒濆妫�鏌�
+  setTimeout(() => {
+    checkEmptyPalletWarning(globalState, store);
+  }, 10000); // 10绉掑悗鎵ц鍒濆妫�鏌�
+  
+  // 淇濆瓨瀹氭椂鍣ㄥ紩鐢紝鏂逛究鍚庣画娓呯悊
+  app.config.globalProperties.$global.checkEmptyPalletTimer = checkEmptyPalletTimer;
+  
+  // 鏂逛究鎵嬪姩娴嬭瘯锛屽皢check鏂规硶鎸傝浇鍒皐indow瀵硅薄
+  window.testEmptyPalletWarning = () => {
+    checkEmptyPalletWarning(globalState, store);
+  };
+};
+
+export default {
+  init: initEmptyPalletWarning,
+  check: checkEmptyPalletWarning
+};
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/taskTimeout.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/taskTimeout.js"
new file mode 100644
index 0000000..a56394b
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/services/taskTimeout.js"
@@ -0,0 +1,259 @@
+// 鍏ㄥ眬浠诲姟瓒呮椂鏈嶅姟
+import http from '../api/http';
+
+// 浠诲姟瓒呮椂鏈嶅姟绫�
+class TaskTimeoutService {
+  constructor() {
+    this.taskStatusMap = {}; // 瀛樺偍浠诲姟鐘舵�佸紑濮嬫椂闂�
+    this.taskTimeoutMinutes = 10; // 浠诲姟瓒呮椂鏃堕棿锛屽崟浣嶄负鍒嗛挓锛岃皟鏁翠负10鍒嗛挓渚夸簬娴嬭瘯
+    this.checkTaskStatusTimer = null;
+    this.apiTaskData = []; // 瀛樺偍閫氳繃API鑾峰彇鐨勪换鍔℃暟鎹�
+    this.apiRefreshTimer = null; // API鏁版嵁鍒锋柊瀹氭椂鍣�
+    this.apiRefreshInterval = 10000; // API鏁版嵁鍒锋柊闂撮殧锛岃皟鏁翠负10绉掍究浜庢祴璇�
+  }
+
+  // 鍒濆鍖栦换鍔¤秴鏃舵湇鍔�
+  init(app) {
+    // 璁剧疆瀹氭椂鍣紝姣�10绉掓鏌ヤ竴娆★紝璋冩暣涓轰究浜庢祴璇曠殑棰戠巼
+    this.checkTaskStatusTimer = setInterval(() => {
+      this.checkTaskStatus();
+    }, 10000);
+
+    // 璁剧疆API鏁版嵁鍒锋柊瀹氭椂鍣紝姣�10绉掑埛鏂颁竴娆′换鍔℃暟鎹�
+    this.apiRefreshTimer = setInterval(() => {
+      this.refreshTaskDataFromApi();
+    }, this.apiRefreshInterval);
+
+    // 鍒濆鍒锋柊涓�娆′换鍔℃暟鎹�
+    this.refreshTaskDataFromApi();
+
+    // 淇濆瓨瀹氭椂鍣ㄥ紩鐢紝鏂逛究鍚庣画娓呯悊
+    if (app && app.config) {
+      app.config.globalProperties.$global.taskTimeoutTimer = this.checkTaskStatusTimer;
+      app.config.globalProperties.$global.taskTimeoutApiTimer = this.apiRefreshTimer;
+    }
+
+    // 鏂逛究鎵嬪姩娴嬭瘯锛屽皢check鏂规硶鎸傝浇鍒皐indow瀵硅薄
+    window.testTaskTimeout = () => {
+      this.checkTaskStatus();
+    };
+  }
+
+  // 浠嶢PI鍒锋柊浠诲姟鏁版嵁
+  async refreshTaskDataFromApi() {
+    try {
+      // 鏋勫缓鏌ヨ鍙傛暟锛岃幏鍙栨墍鏈変换鍔★紝涓嶉檺鍒剁姸鎬侊紝鍦ㄥ悗缁鐞嗕腑杩囨护
+      const requestData = {
+        Page: 1,
+        Rows: 9999,
+        Filter: [],
+        Wheres: '',
+        Sort: 'CreateDate',
+        Order: 'desc'
+      };
+
+      // 璋冪敤API鑾峰彇浠诲姟鏁版嵁
+      const apiData = await http.post('/api/Task/GetPageData', requestData);
+
+      if (apiData && apiData.rows) {
+        this.apiTaskData = apiData.rows;
+      } else {
+        this.apiTaskData = [];
+      }
+    } catch (error) {
+      console.error('浠嶢PI鑾峰彇浠诲姟鏁版嵁澶辫触:', error);
+      this.apiTaskData = [];
+    }
+  }
+
+  // 妫�鏌ヤ换鍔$姸鎬�
+  checkTaskStatus() {
+    // 鐩存帴浣跨敤浠嶢PI鑾峰彇鐨勬暟鎹�
+    const allTaskData = this.apiTaskData || [];
+
+    // 鍘婚噸锛岀‘淇濇瘡涓换鍔″彧澶勭悊涓�娆�
+    const uniqueTaskData = [];
+    const taskNumSet = new Set();
+    
+    allTaskData.forEach(task => {
+      if (task && task.taskNum && !taskNumSet.has(task.taskNum)) {
+        uniqueTaskData.push(task);
+        taskNumSet.add(task.taskNum);
+      }
+    });
+
+    if (uniqueTaskData.length === 0) {
+      return;
+    }
+
+    const now = new Date();
+
+    // 鑾峰彇鍏ㄥ眬瀵硅薄
+    const globalObj = window.$global || {};
+
+    // 澶勭悊娑堟伅鍒犻櫎閫昏緫锛岄噸缃搴斾换鍔$殑瀹氭椂鍣�
+    const deletedMessages = globalObj.messageDeleted || [];
+
+    if (deletedMessages.length > 0) {
+      const globalMessageList = globalObj.messageList || [];
+
+      // 閬嶅巻琚垹闄ょ殑娑堟伅ID锛岄噸缃搴斾换鍔$殑瀹氭椂鍣�
+      deletedMessages.forEach(deletedId => {
+        const deletedMessage = globalMessageList.find(msg => msg.id === deletedId);
+        if (deletedMessage?.businessType === 'task_timeout' && deletedMessage.taskNum && this.taskStatusMap[deletedMessage.taskNum]) {
+          this.taskStatusMap[deletedMessage.taskNum] = now;
+        }
+      });
+
+      // 娓呯┖宸插鐞嗙殑鍒犻櫎娑堟伅鍒楄〃
+      globalObj.messageDeleted = [];
+    }
+
+    // 鑾峰彇褰撳墠鎵�鏈変换鍔″彿鍜岀姸鎬�
+    const currentTaskStatuses = {};
+    uniqueTaskData.forEach(task => {
+      currentTaskStatuses[task.taskNum] = task.taskStatus;
+    });
+
+    // 妫�鏌ヤ换鍔$姸鎬�
+    uniqueTaskData.forEach(task => {
+      if (task.taskStatus === 210) {
+        // 鍫嗗灈鏈烘墽琛屼腑鐘舵��
+        if (!this.taskStatusMap[task.taskNum]) {
+          this.taskStatusMap[task.taskNum] = now;
+        } else {
+          // 璁$畻鎸佺画鏃堕棿锛堝垎閽燂級
+          const duration = (now - this.taskStatusMap[task.taskNum]) / 60000;
+          if (duration >= this.taskTimeoutMinutes) {
+            this.sendTaskWarningMessage(task, duration);
+            delete this.taskStatusMap[task.taskNum];
+          }
+        }
+      } else {
+        // 浠诲姟鐘舵�佸凡鏀瑰彉锛屾竻闄よ褰�
+        delete this.taskStatusMap[task.taskNum];
+      }
+    });
+
+    // 娓呴櫎宸茶В鍐崇殑浠诲姟瓒呮椂娑堟伅
+    this.clearResolvedTaskMessages(currentTaskStatuses);
+  }
+
+  // 娓呴櫎宸茶В鍐崇殑浠诲姟瓒呮椂娑堟伅
+  clearResolvedTaskMessages(currentTaskStatuses) {
+    // 鑾峰彇鍏ㄥ眬瀵硅薄
+    const globalObj = window.$global || {};
+    
+    // 鑾峰彇鍏ㄥ眬娑堟伅鍒楄〃
+    const globalMessageList = globalObj.messageList || [];
+    
+    // 鎵惧嚭闇�瑕佹竻闄ょ殑浠诲姟瓒呮椂娑堟伅
+    const taskTimeoutMessages = globalMessageList.filter(msg => msg.businessType === 'task_timeout');
+    
+    // 閬嶅巻鎵�鏈変换鍔¤秴鏃舵秷鎭�
+    taskTimeoutMessages.forEach(msg => {
+      const taskNum = msg.taskNum;
+      // 妫�鏌ユ潯浠讹細
+      // 1. 浠诲姟涓嶅湪褰撳墠浠诲姟鍒楄〃涓紙宸插畬鎴愭垨琚Щ闄わ級
+      // 2. 浠诲姟鍦ㄥ綋鍓嶄换鍔″垪琛ㄤ腑锛屼絾鐘舵�佸凡涓嶅啀鏄爢鍨涙満鎵ц涓�
+      if (!currentTaskStatuses[taskNum] || currentTaskStatuses[taskNum] !== 210) {
+        // 浠诲姟宸插畬鎴愭垨鐘舵�佸凡鏀瑰彉锛屾竻闄よ娑堟伅
+        this.handleDeleteTaskMessage(msg);
+      }
+    });
+  }
+
+  // 澶勭悊鍒犻櫎鍗曚釜浠诲姟娑堟伅
+  handleDeleteTaskMessage(message) {
+    // 鑾峰彇鍏ㄥ眬瀵硅薄
+    const globalObj = window.$global || {};
+
+    // 鐩存帴浠庡叏灞�娑堟伅鍒楄〃涓垹闄よ娑堟伅
+    if (globalObj.messageList) {
+      const index = globalObj.messageList.findIndex(msg => msg.id === message.id);
+      if (index !== -1) {
+        globalObj.messageList.splice(index, 1);
+      }
+    }
+  }
+
+  // 鍙戦�佷换鍔¤鍛婃秷鎭�
+  sendTaskWarningMessage(task, duration) {
+    // 鍒涘缓璀﹀憡娑堟伅
+    const warningMessage = {
+      id: Date.now(),
+      title: '浠诲姟寮傚父璀﹀憡',
+      message: `浠诲姟鍙� ${task.taskNum} 宸插湪鍫嗗灈鏈烘墽琛屼腑鐘舵�佽秴杩�${Math.round(duration)}鍒嗛挓锛岃鍙婃椂澶勭悊锛乣,
+      type: 'warning',
+      businessType: 'task_timeout',
+      taskNum: task.taskNum,
+      createTime: new Date().toLocaleString()
+    };
+
+    // 鑾峰彇鍏ㄥ眬瀵硅薄
+    const globalObj = window.$global || {};
+
+    // 妫�鏌ユ槸鍚﹀凡缁忓瓨鍦ㄧ浉鍚岀殑浠诲姟瓒呮椂璀﹀憡
+    const globalMessageList = globalObj.messageList || [];
+
+    const hasExistingWarning = globalMessageList.some(msg =>
+      msg.businessType === 'task_timeout' && msg.taskNum === task.taskNum
+    );
+
+    if (hasExistingWarning) return;
+
+    // 鍙戦�佹秷鎭埌鍏ㄥ眬娑堟伅鍒楄〃
+    try {
+      if (globalObj.messageList) {
+        globalObj.messageList.push(warningMessage);
+
+      }
+    } catch (error) {
+      // 鍑洪敊鏃朵娇鐢ㄦ祻瑙堝櫒鍘熺敓alert浣滀负鏈�缁堝閫�
+      try {
+        alert(`浠诲姟寮傚父璀﹀憡: 浠诲姟鍙� ${task.taskNum} 宸插湪鍫嗗灈鏈烘墽琛屼腑鐘舵�佽秴杩�${Math.round(duration)}鍒嗛挓锛岃鍙婃椂澶勭悊锛乣);
+      } catch (e) {
+        // 蹇界暐鎵�鏈夐敊璇�
+      }
+    }
+  }
+
+  // 鎵嬪姩妫�鏌ヤ换鍔$姸鎬侊紙鐢ㄤ簬澶栭儴璋冪敤锛�
+  manualCheckTaskStatus() {
+    this.checkTaskStatus();
+  }
+
+  // 璁剧疆浠诲姟瓒呮椂鏃堕棿
+  setTaskTimeoutMinutes(minutes) {
+    if (typeof minutes === 'number' && minutes > 0) {
+      this.taskTimeoutMinutes = minutes;
+    }
+  }
+
+  // 鑾峰彇褰撳墠浠诲姟瓒呮椂鏃堕棿
+  getTaskTimeoutMinutes() {
+    return this.taskTimeoutMinutes;
+  }
+
+  // 娓呯悊璧勬簮
+  cleanup() {
+    if (this.checkTaskStatusTimer) {
+      clearInterval(this.checkTaskStatusTimer);
+      this.checkTaskStatusTimer = null;
+    }
+    
+    if (this.apiRefreshTimer) {
+      clearInterval(this.apiRefreshTimer);
+      this.apiRefreshTimer = null;
+    }
+    
+    this.taskStatusMap = {};
+    this.apiTaskData = [];
+    delete window.testTaskTimeout;
+  }
+}
+
+// 鍒涘缓鍗曚緥瀹炰緥
+const taskTimeoutService = new TaskTimeoutService();
+
+export default taskTimeoutService;
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/store/index.js" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/store/index.js"
index a87385b..dcf13e4 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/store/index.js"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/store/index.js"
@@ -14,8 +14,7 @@
     permission: [],
     isLoading: false,//2020.06.03澧炲姞璺敱鍒囨崲鏃跺姞杞芥彁绀�
     userInfo: null,
-    websocke: null,//websocket
-    messageList: [],//娑堟伅鍒楄〃
+    websocke: null//websocket
     // wcsState: true//wcs鏈嶅姟鐘舵��
   },
   mutations: {
@@ -43,15 +42,6 @@
     },
     setWebsocket(state, data) {
       state.websocke = data;
-    },
-    addMessage(state, message) {
-      state.messageList.push(message);
-    },
-    removeMessage(state, messageId) {
-      state.messageList = state.messageList.filter(message => message.id !== messageId);
-    },
-    clearMessages(state) {
-      state.messageList = [];
     }
   }, getters: {
     getPermission: (state) => (path) => {  //璋冪敤鏂瑰紡 store.getters.getPermission('sys_User')
@@ -89,9 +79,6 @@
     },
     getData: (state) => () => {
       return state.data;
-    },
-    getMessageList: (state) => () => {
-      return state.messageList;
     }
   }, actions: {
     setPermission(context, data) {
@@ -102,9 +89,6 @@
     },
     onLoading(context, flag) {
       context.commit("updateLoadingState", flag);
-    },
-    addMessage(context, message) {
-      context.commit('addMessage', message);
     }
   }
 })
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Home.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Home.vue"
index daeffe0..dc15e1f 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Home.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Home.vue"
@@ -65,10 +65,15 @@
             <div class="roadway-section">
               <h2 class="roadway-title">{{ Area.roadwayNo }} 绗�1宸烽亾绗�1鎺�(涓滈潰:鍖�>鍗�)</h2>
               <div class="row" v-for="(item, index) in locationData.row1" :key="'row1-' + index">
-                <div class="location-cell" :style="{ 'background-color': GetBgColor(column) }"
-                  v-for="(column, colIndex) in item.locationObj" :key="'row1-' + item.layer + '-' + colIndex"
-                  @mouseenter="showTooltip(column, $event)" @mouseleave="hideTooltip">
-                  {{ getRoadwayNo(column) }}-{{ column.column }}-{{ column.layer }}
+                <div 
+                  class="location-cell" 
+                  :class="{ 'empty-cell': column.location_lock === -1 }"
+                  :style="{ 'background-color': column.location_lock === -1 ? 'transparent' : GetBgColor(column) }"
+                  v-for="(column, colIndex) in item.locationObj" 
+                  :key="'row1-' + item.layer + '-' + colIndex"
+                  @mouseenter="column.location_lock !== -1 && showTooltip(column, $event)" 
+                  @mouseleave="hideTooltip">
+                  <span v-if="column.location_lock !== -1">{{ getRoadwayNo(column) }}-{{ column.column }}-{{ column.layer }}</span>
                 </div>
               </div>
             </div>
@@ -77,10 +82,15 @@
             <div class="roadway-section">
               <h2 class="roadway-title">{{ Area.roadwayNo }} 绗�1宸烽亾绗�2鎺�(瑗块潰:鍖�>鍗�)</h2>
               <div class="row" v-for="(item, index) in locationData.row2" :key="'row2-' + index">
-                <div class="location-cell" :style="{ 'background-color': GetBgColor(column) }"
-                  v-for="(column, colIndex) in item.locationObj" :key="'row2-' + item.layer + '-' + colIndex"
-                  @mouseenter="showTooltip(column, $event)" @mouseleave="hideTooltip">
-                  {{ getRoadwayNo(column) }}-{{ column.column }}-{{ column.layer }}
+                <div 
+                  class="location-cell" 
+                  :class="{ 'empty-cell': column.location_lock === -1 }"
+                  :style="{ 'background-color': column.location_lock === -1 ? 'transparent' : GetBgColor(column) }"
+                  v-for="(column, colIndex) in item.locationObj" 
+                  :key="'row2-' + item.layer + '-' + colIndex"
+                  @mouseenter="column.location_lock !== -1 && showTooltip(column, $event)" 
+                  @mouseleave="hideTooltip">
+                  <span v-if="column.location_lock !== -1">{{ getRoadwayNo(column) }}-{{ column.column }}-{{ column.layer }}</span>
                 </div>
               </div>
             </div>
@@ -97,7 +107,7 @@
               <!-- 鍘熸枡搴撴樉绀哄唴瀹� -->
               <div v-if="Area.warehouse === '鍘熸枡搴�'">
                 <p><strong>绾稿嵎:</strong><span>{{ currentLocation.paperRoll || "鏃�" }}</span></p>
-                <p><strong>闂ㄥ箙:</strong><span>{{ currentLocation.width ? currentLocation.width + "m" : "鏃�" }}</span></p>
+                <p><strong>闂ㄥ箙:</strong><span>{{ currentLocation.width ? currentLocation.width : "鏃�" }}</span></p>
                 <p><strong>鏉$爜:</strong><span>{{ currentLocation.barcode || "鏃�" }}</span></p>
                 <p><strong>RFID:</strong><span>{{ currentLocation.rfid || "鏃�" }}</span></p>
               </div>
@@ -317,37 +327,71 @@
           if (x.data) {
             this.locationData = x.data;
 
-            // 瀵圭1鎺掓暟鎹繘琛屾帓搴�
-            if (this.locationData.row1) {
+            // 纭繚璐т綅鎸夊垪鍙锋帓搴忓苟璁$畻鏈�澶у垪鏁帮紝鐢ㄤ簬瀵归綈
+            const ensureColumnsAlignment = (rowData) => {
+              if (!rowData || rowData.length === 0) return;
+              
               // 鎸夊眰鍙蜂粠楂樺埌浣庢帓搴�
-              this.locationData.row1.sort((a, b) => parseInt(b.layer) - parseInt(a.layer));
-
-              // 瀵规瘡灞傚唴鐨勮揣浣嶆寜鍒楀彿浠庡寳鍒板崡鎺掑簭锛�01-64锛�
-              this.locationData.row1.forEach(layer => {
+              rowData.sort((a, b) => parseInt(b.layer) - parseInt(a.layer));
+              
+              // 纭畾鏈�澶у垪鏁帮紙鍋囪鏄�64鍒楋紝浠�01-64锛�
+              const maxColumns = 64;
+              
+              // 澶勭悊姣忓眰鏁版嵁
+              rowData.forEach(layer => {
+                // 瀵规瘡灞傚唴鐨勮揣浣嶆寜鍒楀彿浠庡寳鍒板崡鎺掑簭锛�01-64锛�
                 layer.locationObj.sort((a, b) => {
                   // 纭繚鍒楀彿鎸夋暟瀛楅『搴忔帓鍒�
                   const colA = parseInt(a.column);
                   const colB = parseInt(b.column);
                   return colA - colB;
                 });
-              });
-            }
-
-            // 瀵圭2鎺掓暟鎹繘琛屽悓鏍风殑鎺掑簭
-            if (this.locationData.row2) {
-              // 鎸夊眰鍙蜂粠楂樺埌浣庢帓搴�
-              this.locationData.row2.sort((a, b) => parseInt(b.layer) - parseInt(a.layer));
-
-              // 瀵规瘡灞傚唴鐨勮揣浣嶆寜鍒楀彿浠庡寳鍒板崡鎺掑簭锛�01-64锛�
-              this.locationData.row2.forEach(layer => {
-                layer.locationObj.sort((a, b) => {
-                  // 纭繚鍒楀彿鎸夋暟瀛楅『搴忔帓鍒�
-                  const colA = parseInt(a.column);
-                  const colB = parseInt(b.column);
-                  return colA - colB;
+                
+                // 鍒涘缓瀹屾暣鐨勫垪鏁扮粍
+                const completeColumns = [];
+                
+                // 褰撳墠宸叉湁鐨勮揣浣嶏紝鎸夊垪鍙锋槧灏�
+                const existingLocations = {};
+                layer.locationObj.forEach(loc => {
+                  existingLocations[parseInt(loc.column)] = loc;
                 });
+                
+                // 閬嶅巻鎵�鏈夊彲鑳界殑鍒楀彿锛�1-64锛�
+                for (let col = 1; col <= maxColumns; col++) {
+                  if (existingLocations[col]) {
+                    // 濡傛灉璇ュ垪鏈夎揣浣嶆暟鎹紝鐩存帴浣跨敤
+                    completeColumns.push(existingLocations[col]);
+                  } else {
+                    // 濡傛灉璇ュ垪娌℃湁璐т綅鏁版嵁锛屾坊鍔犵┖鍗犱綅绗�
+                    completeColumns.push({
+                      locationCode: `empty-${layer.row}-${String(col).padStart(2, '0')}-${layer.layer}`,
+                      row: layer.row,
+                      column: String(col).padStart(2, '0'),
+                      layer: layer.layer,
+                      location_lock: -1, // 鐗规畩鏍囪锛岀敤浜庤〃绀虹┖鍗犱綅绗�
+                      paperRoll: '',
+                      productName: '',
+                      width: 0,
+                      quantity: 0,
+                      barcode: '',
+                      rfid: '',
+                      rfidCode: '',
+                      inDate: null,
+                      warehouseId: layer.warehouseId || 0
+                    });
+                  }
+                }
+                
+                // 鏇存柊璇ュ眰鐨勮揣浣嶆暟鎹负瀹屾暣鍒�
+                layer.locationObj = completeColumns;
               });
-            }
+            };
+            
+            // 澶勭悊绗�1鎺掓暟鎹�
+            ensureColumnsAlignment(this.locationData.row1);
+            
+            // 澶勭悊绗�2鎺掓暟鎹�
+            ensureColumnsAlignment(this.locationData.row2);
           }
 
           // 鎻愬彇鎵�鏈夎揣浣嶇紪鍙�
@@ -654,8 +698,8 @@
 
 .location-view {
   flex: 1;
-  width: 470%;
-  max-width: 470%;
+  width: 360%;
+  max-width: 360%;
   overflow: auto;
   padding: 20px;
   background-color: #f5f7fa;
@@ -667,12 +711,13 @@
   margin-bottom: 8px;
   cursor: pointer;
   flex-wrap: nowrap;
+  width: 100%;
+  min-width: max-content;
 }
 
 .location-cell {
-  width: 120px;
+  flex: 0 0 120px;
   height: 50px;
-  margin: 5px;
   text-align: center;
   font-size: 16px;
   border-radius: 4px;
@@ -680,6 +725,34 @@
   box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
   border: 1px solid #ccc;
   background-color: #f9f9f9;
+  margin: 0 5px;
+}
+
+/* 绌哄崰浣嶇鏍峰紡 */
+.location-cell.empty-cell {
+  background-color: transparent;
+  border: none;
+  box-shadow: none;
+  cursor: default;
+}
+
+/* 娣诲姞璐т綅缃戞牸瀹瑰櫒鏍峰紡锛岀‘淇濇墍鏈夎瀵归綈 */
+.roadway-section {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+
+.location-cell {
+  width: 120px;
+  height: 50px;
+  text-align: center;
+  font-size: 16px;
+  border-radius: 4px;
+  line-height: 50px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+  border: 1px solid #ccc;
+  background-color: #f9f9f9;
+  margin: 0;
 }
 
 /* 宸烽亾鍖哄煙鏍峰紡 */
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Index.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Index.vue"
index 1050623..030d029 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Index.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/Index.vue"
@@ -332,8 +332,21 @@
 
     const handleMessage = (e) => {
       let data = JSON.parse(e.data);
-      // 浣跨敤store鐨刟ddMessage mutation娣诲姞娑堟伅
-      store.commit('addMessage', data);
+      // 鐩存帴娣诲姞鍒板叏灞�娑堟伅鍒楄〃
+      if (_config.$global.messageList) {
+        // 纭繚娑堟伅鏈夊敮涓�ID
+        const messageWithId = {
+          ...data,
+          id: data.id || Date.now() + Math.random().toString(36).substr(2, 9)
+        };
+        
+        // 妫�鏌ユ秷鎭槸鍚﹀凡瀛樺湪
+        const isNewMessage = !_config.$global.messageList.some(m => m.id === messageWithId.id);
+        _config.$global.messageList.push(messageWithId);
+        
+
+      }
+      
       ElNotification({
         title: data.title,
         message: h("i", { style: "color: teal" }, data.message),
@@ -679,12 +692,6 @@
         _config.$global.messageList = _config.$global.messageList.filter(msg => msg.id !== item.id);
       }
       
-      // 浠巗tore涓垹闄よ娑堟伅
-      if (store) {
-        // 浣跨敤mutation鍒犻櫎鍗曚釜娑堟伅
-        store.commit('removeMessage', item.id);
-      }
-      
       // 灏嗗垹闄ょ殑娑堟伅ID娣诲姞鍒癿essageDeleted鏁扮粍锛岀敤浜庨�氱煡缁勪欢閲嶇疆瀹氭椂鍣�
       if (_config.$global.messageDeleted && Array.isArray(_config.$global.messageDeleted)) {
         _config.$global.messageDeleted.push(item.id);
@@ -705,9 +712,7 @@
       // 鑾峰彇鎵�鏈夊綋鍓嶆秷鎭殑ID锛岀敤浜庨噸缃畾鏃跺櫒
       const messageIds = _config.$global.messageList.map(msg => msg.id);
       
-      // 鍏堟竻绌簊tore涓殑娑堟伅鍒楄〃
-      store.commit('clearMessages');
-      // 鐒跺悗娓呯┖鍏ㄥ眬娑堟伅鍒楄〃锛屼娇鐢ㄩ噸鏂拌祴鍊肩殑鏂瑰紡纭繚鍝嶅簲寮忔洿鏂�
+      // 娓呯┖鍏ㄥ眬娑堟伅鍒楄〃锛屼娇鐢ㄩ噸鏂拌祴鍊肩殑鏂瑰紡纭繚鍝嶅簲寮忔洿鏂�
       _config.$global.messageList = [];
       
       // 灏嗘墍鏈夊垹闄ょ殑娑堟伅ID娣诲姞鍒癿essageDeleted鏁扮粍锛岀敤浜庨�氱煡缁勪欢閲嶇疆瀹氭椂鍣�
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/outbound/outSGOrder.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/outbound/outSGOrder.vue"
index b43a08a..3097896 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/outbound/outSGOrder.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/outbound/outSGOrder.vue"
@@ -54,6 +54,7 @@
       [
         { title: "浠撳簱", field: "warehouseId", type: "selectList", dataKey: "warehouses", data: [], },
         { title: "瀹㈡埛绠�绉�", field: "shortName", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime", },
       ],
     ]);
     const columns = ref([
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/stock/ProStockView.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/stock/ProStockView.vue"
index 250cbcd..69c3a65 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/stock/ProStockView.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/stock/ProStockView.vue"
@@ -50,6 +50,7 @@
         [
           { title: "鎵�灞炰粨搴�", field: "warehouseId",type: "select",dataKey: "warehouses",data: []},
           { title: "搴撳瓨灞炴��", field: "proStockAttribute" ,type: "selectList",dataKey: "proStockAttributeEnum",data: [],},
+          { title: "鍒涘缓鏃堕棿", field: "createDate",type: "datetime",},
         ],
       ]);
       const columns = ref([

--
Gitblit v1.9.3