From 98a69d51981ee6a49136024c8b005f134d3313cd Mon Sep 17 00:00:00 2001
From: liulijun <liulijun@hnkhzn.com>
Date: 星期四, 05 三月 2026 17:29:34 +0800
Subject: [PATCH] 增加任务异常提示和空托数量预警

---
 项目代码/WMS/WMSClient/src/main.js                         |   18 +
 项目代码/WMS/WMSClient/src/views/Home.vue                  |    6 
 项目代码/WMS/WMSClient/src/views/Index.vue                 |   86 +++++++
 项目代码/WMS/WMSClient/src/views/index/Message.vue         |  197 +++++++++++++----
 项目代码/WMS/WMSClient/src/extension/stock/ProStockView.js |  123 +++++++++++
 项目代码/WMS/WMSClient/src/extension/taskinfo/task.js      |  181 ++++++++++++++++
 项目代码/WMS/WMSClient/src/store/index.js                  |   16 +
 7 files changed, 560 insertions(+), 67 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 92ad623..7fecdb4 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,6 +19,13 @@
   methods: {
     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
     onInit() {
+      // 鍒濆鍖栫┖鎵樻鏌ュ畾鏃跺櫒
+      // 璁剧疆瀹氭椂鍣紝姣�60绉掓鏌ヤ竴娆�
+      this.checkEmptyPalletTimer = setInterval(() => {
+        this.checkEmptyPalletWarning();
+      }, 10000); // 姣�10绉掓鏌ヤ竴娆�
+
+      // 鍘熸湁浠g爜...
       // let InOrder = this.buttons.find(x => x.value == 'StockOutbound');
       // if (InOrder) {
       //   InOrder.onClick = function () {
@@ -73,7 +80,14 @@
               const daysSinceClosest = Math.ceil(Math.abs((today - closestDate) / (1000 * 60 * 60 * 24)));
               return '<span style="color: #F56C6C">' + daysSinceClosest + "澶�" + '</span>';
             } else {
-              return '<span style="color: #F56C6C">' + "鏃犱繚璐ㄦ湡" + '</span>';
+              // 绌烘墭璁板綍浼氳繘鍏ヨ繖涓垎鏀紝杩斿洖"1涓�"鎴�"10涓�"杩欐牱鐨勫瓧绗︿覆
+              // 鍦ㄨ繖閲岃褰曠┖鎵樻暟閲�
+              const emptyPalletCount = 1; // 姣忔潯绌烘墭璁板綍浠h〃1涓┖鎵�
+              
+              // 淇濆瓨鍒皉ow瀵硅薄锛屾柟渚垮悗缁璫heckEmptyPalletWarning鏂规硶浣跨敤
+              row.emptyPalletCount = emptyPalletCount;
+              
+              return '<span style="color: #F56C6C">' + emptyPalletCount + "涓�" + '</span>';
             }
 
           }
@@ -88,7 +102,14 @@
                 })
               return '<span style="color: #F56C6C">' + sum + row.details[0].unit + '</span>';
             } else {
-              return '<span style="color: #F56C6C">' + "1涓�" + '</span>';
+              // 绌烘墭璁板綍浼氳繘鍏ヨ繖涓垎鏀紝杩斿洖"1涓�"鎴�"10涓�"杩欐牱鐨勫瓧绗︿覆
+              // 鍦ㄨ繖閲岃褰曠┖鎵樻暟閲�
+              const emptyPalletCount = 1; // 姣忔潯绌烘墭璁板綍浠h〃1涓┖鎵�
+              
+              // 淇濆瓨鍒皉ow瀵硅薄锛屾柟渚垮悗缁璫heckEmptyPalletWarning鏂规硶浣跨敤
+              row.emptyPalletCount = emptyPalletCount;
+              
+              return '<span style="color: #F56C6C">' + emptyPalletCount + "涓�" + '</span>';
             }
 
           }
@@ -128,6 +149,104 @@
       //(3)this.editFormFields.瀛楁='xxx';
       //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
       //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝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) {
+      return true;
     }
   }
 };
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 dc4970b..495f876 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"
@@ -94,6 +94,185 @@
           this.$refs.gridHeader.open();
         }
       }
+      
+      // 鍒濆鍖栦换鍔$姸鎬佹鏌ュ畾鏃跺櫒
+      this.taskStatusMap = {}; // 瀛樺偍浠诲姟鐘舵�佸紑濮嬫椂闂�
+      this.taskTimeoutMinutes = 1; // 浠诲姟瓒呮椂鏃堕棿锛屽崟浣嶄负鍒嗛挓
+      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;
+          // 妫�鏌ヨ浠诲姟鏄惁浠嶇劧澶勪簬鍫嗗灈鏈烘墽琛屼腑鐘舵��
+          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) {
+            // 蹇界暐鎵�鏈夐敊璇�
+          }
+        }
       },
       onInited() {
         //妗嗘灦鍒濆鍖栭厤缃悗
@@ -106,7 +285,7 @@
         return true;
       },
       searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+        // 鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
         return true;
       },
       addBefore(formData) {
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 40c4c4f..8330f07 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"
@@ -1,4 +1,4 @@
-import { createApp } from 'vue'
+import { createApp, reactive } from 'vue'
 import App from './App.vue'
 import router from './router'
 import store from './store'
@@ -24,7 +24,9 @@
 app.config.globalProperties.http = http;
 app.config.globalProperties.$tabs = {};
 app.config.globalProperties.permission = permission;
-app.config.globalProperties.$global = {
+app.config.globalProperties.$store = store;
+// 鍒涘缓鍝嶅簲寮忕殑鍏ㄥ眬瀵硅薄
+const globalState = reactive({
     signalR: false, //鏄惁寮�鍚痵ignalR
     table: {
         //vol-table甯︽暟鎹簮鐨勫崟鍏冩牸鏄惁鍚敤tag鏍囩(涓嬫媺妗嗙瓑鍗曞厓鏍间互tag鏍囩鏄剧ず)
@@ -42,8 +44,16 @@
         // 瀹℃牳涓� = 2,
         // 瀹℃牳鏈�氳繃 = 3,
         // 椹冲洖 = 4
-    }
-}
+    },
+    messageList: [], //鍏ㄥ眬娑堟伅鍒楄〃
+    messageDeleted: [] //瀛樺偍琚垹闄ょ殑娑堟伅ID锛岀敤浜庨�氱煡缁勪欢閲嶇疆瀹氭椂鍣�
+});
+
+app.config.globalProperties.$global = globalState;
+
+// 灏唖tore鎸傝浇鍒皐indow瀵硅薄涓婏紝鏂逛究鍦ㄦ墿灞曠粍浠朵腑璁块棶
+window.$store = store;
+window.$global = app.config.globalProperties.$global;
 //2023.03.13锛�
 //淇敼瑙侊細volupload.vue锛屽悗鍙癆liOSSController.cs锛岄樋閲屼簯OSS閰嶇疆.doc
 window.oss = {
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 5e02795..a87385b 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"
@@ -15,6 +15,7 @@
     isLoading: false,//2020.06.03澧炲姞璺敱鍒囨崲鏃跺姞杞芥彁绀�
     userInfo: null,
     websocke: null,//websocket
+    messageList: [],//娑堟伅鍒楄〃
     // wcsState: true//wcs鏈嶅姟鐘舵��
   },
   mutations: {
@@ -42,6 +43,15 @@
     },
     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')
@@ -80,6 +90,9 @@
     getData: (state) => () => {
       return state.data;
     },
+    getMessageList: (state) => () => {
+      return state.messageList;
+    }
   }, actions: {
     setPermission(context, data) {
       context.commit('setPermission', data); //璋冪敤鏂瑰紡 store.dispatch('push')
@@ -89,6 +102,9 @@
     },
     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 c00bb5d..ce24a69 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"
@@ -139,6 +139,8 @@
           { bgcolor: "lightgreen", msg: "绌洪棽", state: 0 },
           { bgcolor: "orange", msg: "鏈夎揣", state: 100 },
           { bgcolor: "#2BB3D5", msg: "閿佸畾", state: 1 },
+          { bgcolor: "yellow", msg: "绌洪棽閿佸畾", state: 20 },
+          { bgcolor: "purple", msg: "鏈夎揣閿佸畾", state: 10 },
         ],
         locationData: [],
         showTooltipFlag: false,
@@ -285,6 +287,8 @@
       if (location.location_lock === 0) return "绌洪棽";
       if (location.location_lock === 1) return "閿佸畾";
       if (location.location_lock === 100) return "鏈夎揣";
+      if (location.location_lock === 20) return "绌洪棽閿佸畾";
+      if (location.location_lock === 10) return "鏈夎揣閿佸畾";
       // if (location.location_state > 0 && location.location_state < 100)
       //   return "閿佸畾";
       return "鍏朵粬";
@@ -407,7 +411,7 @@
 }
 
 .location-cell {
-  width: 80px;
+  width: 85px;
   height: 38px;
   margin: 3px;
   text-align: center;
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 a882a94..1050623 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"
@@ -191,12 +191,29 @@
       destroy-on-close
       size="40%"
     >
-      <Message :list="messageList"></Message>
+      <div style="margin-bottom: 20px;">
+        <el-button type="danger" @click="clearAllMessages">鍏ㄩ儴娓呴櫎</el-button>
+      </div>
+      <Message :list="messageList" @delete-message="handleDeleteMessage"></Message>
     </el-drawer>
   </div>
 </template>
 <style lang="less" scoped>
 @import "./index/index.less";
+
+/* 涓烘秷鎭垪琛ㄧ殑drawer娣诲姞鍦嗚 */
+:deep(.el-drawer__header) {
+  padding: 20px;
+}
+
+:deep(.el-drawer__body) {
+  padding: 0 20px 20px 20px;
+}
+
+:deep(.el-drawer) {
+  border-radius: 12px 0 0 12px !important;
+  overflow: hidden;
+}
 </style>
 <script>
 import loading from "@/components/basic/RouterLoading";
@@ -297,7 +314,6 @@
     const theme = ref("blue2");
     const menuOptions = ref([]);
     const permissionInited = ref(false);
-    const messageList = reactive([]);
     let _config = getCurrentInstance().appContext.config.globalProperties;
     let router = useRouter();
     const toggleLeft = () => {
@@ -316,7 +332,8 @@
 
     const handleMessage = (e) => {
       let data = JSON.parse(e.data);
-      messageList.push(data);
+      // 浣跨敤store鐨刟ddMessage mutation娣诲姞娑堟伅
+      store.commit('addMessage', data);
       ElNotification({
         title: data.title,
         message: h("i", { style: "color: teal" }, data.message),
@@ -626,7 +643,8 @@
         //寮�鍚秷鎭帹閫侊紙main.js涓缃槸鍚﹀紑鍚痵ignalR锛�2022.05.05
         if (_config.$global.signalR) {
           MessageConfig(http, (result) => {
-            messageList.unshift(result);
+            // 浣跨敤store鐨刟ddMessage mutation娣诲姞娑堟伅
+            store.commit('addMessage', result);
             //    console.log(result)
           });
         }
@@ -654,6 +672,59 @@
       });
     };
     created();
+    // 澶勭悊鍒犻櫎鍗曟潯娑堟伅
+    const handleDeleteMessage = ({ item, index }) => {
+      // 浠庡叏灞�娑堟伅鍒楄〃涓垹闄よ娑堟伅
+      if (_config.$global.messageList && Array.isArray(_config.$global.messageList)) {
+        _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);
+      }
+      
+      // 鏄剧ず鎴愬姛鎻愮ず
+      _config.$message.success('娑堟伅宸插垹闄�');
+      
+      // 寮哄埗缁勪欢鏇存柊锛岀‘淇濇秷鎭垪琛ㄧ珛鍗冲埛鏂�
+      proxy.$nextTick(() => {
+        // 瑙﹀彂閲嶆覆鏌�
+        _config.$forceUpdate && _config.$forceUpdate();
+      });
+    };
+    
+    // 娓呯悊鍏ㄩ儴娑堟伅
+    const clearAllMessages = () => {
+      // 鑾峰彇鎵�鏈夊綋鍓嶆秷鎭殑ID锛岀敤浜庨噸缃畾鏃跺櫒
+      const messageIds = _config.$global.messageList.map(msg => msg.id);
+      
+      // 鍏堟竻绌簊tore涓殑娑堟伅鍒楄〃
+      store.commit('clearMessages');
+      // 鐒跺悗娓呯┖鍏ㄥ眬娑堟伅鍒楄〃锛屼娇鐢ㄩ噸鏂拌祴鍊肩殑鏂瑰紡纭繚鍝嶅簲寮忔洿鏂�
+      _config.$global.messageList = [];
+      
+      // 灏嗘墍鏈夊垹闄ょ殑娑堟伅ID娣诲姞鍒癿essageDeleted鏁扮粍锛岀敤浜庨�氱煡缁勪欢閲嶇疆瀹氭椂鍣�
+      if (_config.$global.messageDeleted && Array.isArray(_config.$global.messageDeleted)) {
+        _config.$global.messageDeleted.push(...messageIds);
+      }
+      
+      // 鏄剧ず鎴愬姛鎻愮ず
+      _config.$message.success('娑堟伅宸插叏閮ㄦ竻闄�');
+      
+      // 寮哄埗缁勪欢鏇存柊锛岀‘淇濇秷鎭垪琛ㄧ珛鍗冲埛鏂�
+      proxy.$nextTick(() => {
+        // 瑙﹀彂閲嶆覆鏌�
+        _config.$forceUpdate && _config.$forceUpdate();
+      });
+    };
+
     return {
       menuWidth,
       isCollapse,
@@ -681,12 +752,17 @@
       to,
       toggleLeft,
       messageModel,
-      messageList,
+      // 浠庡叏灞�瀵硅薄涓幏鍙栨秷鎭垪琛�
+      get messageList() {
+        return _config.$global.messageList;
+      },
       contextMenuVisible,
       visibleItem,
       closeTabsMenu,
       closeTabs,
       currentMenuId,
+      clearAllMessages,
+      handleDeleteMessage,
     };
   },
   /**
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/index/Message.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/index/Message.vue"
index e051ab6..4809a27 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/index/Message.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WMSClient/src/views/index/Message.vue"
@@ -1,57 +1,80 @@
 <template>
   <div class="message-container">
-    <div class="item" v-for="(item, index) in list" :key="index">
-      <div class="title">{{ item.title }}({{ item.date }})</div>
+    <div class="item" v-for="(item, index) in list" :key="item.id || index">
+      <div class="title-container">
+        <div class="title">{{ item.title }}({{ item.createTime || item.date }})</div>
+        <el-button 
+          type="text" 
+          class="delete-btn"
+          @click="handleDeleteMessage(item, index)"
+          size="small"
+        >
+          <i class="el-icon-close"></i>
+        </el-button>
+      </div>
       <div class="content">
-        <el-row>
-          <el-col :span="8">
-            <label>鏀惰揣鍗曞彿锛歿{ item.formData.receiveOrderNo }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>璐ㄦ鍗曞彿锛歿{ item.formData.checkOrderNo }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>鏀惰揣鏄庣粏琛屽彿锛歿{ item.formData.receiveDetailRowNo }}</label>
-          </el-col>
-        </el-row>
+        <!-- 濡傛灉鏈塮ormData锛屾樉绀鸿川妫�瀹℃壒鐩稿叧鍐呭 -->
+        <template v-if="item.formData">
+          <el-row>
+            <el-col :span="8">
+              <label>鏀惰揣鍗曞彿锛歿{ item.formData.receiveOrderNo }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>璐ㄦ鍗曞彿锛歿{ item.formData.checkOrderNo }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>鏀惰揣鏄庣粏琛屽彿锛歿{ item.formData.receiveDetailRowNo }}</label>
+            </el-col>
+          </el-row>
 
-        <el-row>
-          <el-col :span="8">
-            <label>鐗╂枡缂栧彿锛歿{ item.formData.materielCode }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>鍚堟牸鏁伴噺锛歿{ item.formData.qualifiedQuantity }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>鐗归噰鏁伴噺锛歿{ item.formData.defectedQuantity }}</label>
-          </el-col>
-        </el-row>
+          <el-row>
+            <el-col :span="8">
+              <label>鐗╂枡缂栧彿锛歿{ item.formData.materielCode }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>鍚堟牸鏁伴噺锛歿{ item.formData.qualifiedQuantity }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>鐗归噰鏁伴噺锛歿{ item.formData.defectedQuantity }}</label>
+            </el-col>
+          </el-row>
 
-        <el-row>
-          <el-col :span="8">
-            <label>閫�璐ф暟閲忥細{{ item.formData.returnQuantity }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>鎶ュ簾鏁伴噺锛歿{ item.formData.scrappedQuantity }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>璐ㄦ鎬绘暟锛歿{ item.formData.receivedQuantity }}</label>
-          </el-col>
-        </el-row>
-        
-        <el-row>
-          <el-col :span="16">
-            <label>鐗归噰璇存槑锛歿{ item.formData.defectedNote }}</label>
-          </el-col>
-          <el-col :span="8">
-            <label>妫�楠屼汉锛歿{ item.formData.checkUserName }}</label>
-          </el-col>
-        </el-row>
+          <el-row>
+            <el-col :span="8">
+              <label>閫�璐ф暟閲忥細{{ item.formData.returnQuantity }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>鎶ュ簾鏁伴噺锛歿{ item.formData.scrappedQuantity }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>璐ㄦ鎬绘暟锛歿{ item.formData.receivedQuantity }}</label>
+            </el-col>
+          </el-row>
+          
+          <el-row>
+            <el-col :span="16">
+              <label>鐗归噰璇存槑锛歿{ item.formData.defectedNote }}</label>
+            </el-col>
+            <el-col :span="8">
+              <label>妫�楠屼汉锛歿{ item.formData.checkUserName }}</label>
+            </el-col>
+          </el-row>
+          <div style="margin-top: 20px">
+            <el-button type="primary">鍚屾剰</el-button
+            ><el-button type="danger">椹冲洖</el-button>
+          </div>
+        </template>
+        <!-- 鍚﹀垯鏄剧ず鏅�氭秷鎭唴瀹� -->
+        <template v-else>
+          <div class="simple-message">
+            {{ item.message || '鏃犳秷鎭唴瀹�' }}
+          </div>
+        </template>
       </div>
-      <div style="margin-top: 20px">
-        <el-button type="primary">鍚屾剰</el-button
-        ><el-button type="danger">椹冲洖</el-button>
-      </div>
+    </div>
+    <!-- 濡傛灉娌℃湁娑堟伅锛屾樉绀烘彁绀� -->
+    <div v-if="list.length === 0" class="no-message">
+      鏆傛棤娑堟伅
     </div>
   </div>
 </template>
@@ -88,21 +111,87 @@
     //   });
     // }
   },
+  methods: {
+    // 澶勭悊纭鎸夐挳鐐瑰嚮浜嬩欢
+    handleConfirm(item) {
+      console.log('纭娑堟伅:', item);
+      // 杩欓噷鍙互娣诲姞纭鍚庣殑閫昏緫锛屾瘮濡備粠娑堟伅鍒楄〃涓Щ闄よ娑堟伅
+      // 鐢变簬props鏄崟鍚戞暟鎹祦锛岄渶瑕侀�氳繃浜嬩欢閫氱煡鐖剁粍浠跺鐞�
+      this.$emit('confirm', item);
+    },
+    // 澶勭悊鍒犻櫎鍗曟潯娑堟伅
+    handleDeleteMessage(item, index) {
+      // 閫氳繃浜嬩欢閫氱煡鐖剁粍浠跺垹闄よ娑堟伅
+      this.$emit('delete-message', { item, index });
+    }
+  }
 };
 </script>
 <style scoped lang="less">
 .message-container {
-  .title {
-    padding-bottom: 10px;
-    font-weight: bold;
-  }
+  padding: 10px;
+  background-color: #fafafa;
+  border-radius: 12px;
+  
   .item {
-    border-bottom: 1px solid #eee;
-    padding: 10px 20px;
+    background-color: white;
+    border: 1px solid #e4e7ed;
+    border-radius: 12px;
+    padding: 15px 20px;
+    margin-bottom: 15px;
+    position: relative;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+    transition: all 0.3s ease;
+    
+    &:hover {
+      box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.15);
+      transform: translateY(-2px);
+    }
+    
+    &:last-child {
+      margin-bottom: 0;
+    }
   }
+  
+  .title-container {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+  
+  .title {
+    font-weight: bold;
+    flex: 1;
+    color: #303133;
+    font-size: 16px;
+  }
+  
+  .delete-btn {
+    margin-left: 10px;
+    color: #909399;
+    &:hover {
+      color: #f56c6c;
+    }
+  }
+  
   .content {
     color: #1b1b1b;
     font-size: 14px;
   }
+  
+  .simple-message {
+    line-height: 1.7;
+    color: #606266;
+  }
+  
+  .no-message {
+    text-align: center;
+    padding: 50px 0;
+    color: #909399;
+    background-color: white;
+    border-radius: 12px;
+    border: 1px solid #e4e7ed;
+  }
 }
 </style>

--
Gitblit v1.9.3