From 1c631b345aae30bb6aa7e9dc8d856a0f40d5f1e3 Mon Sep 17 00:00:00 2001
From: liulijun <liulijun@hnkhzn.com>
Date: 星期五, 20 三月 2026 10:49:08 +0800
Subject: [PATCH] 修复货位平面图锁定状态的显示

---
 项目代码/WMS/WMSClient/src/extension/taskinfo/task.js |  380 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 305 insertions(+), 75 deletions(-)

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 a9c651a..8a6c791 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"
@@ -1,23 +1,23 @@
 
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
+import gridHeader from './extend/relocationTask.vue'
 let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-        let TaskHandCancelBtn = this.buttons.find(x => x.value == 'TaskHandCancel');
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: gridHeader,
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      let TaskHandCancelBtn = this.buttons.find(x => x.value == 'TaskHandCancel');
       if (TaskHandCancelBtn) {
         TaskHandCancelBtn.onClick = function () {
           let rows = this.$refs.table.getSelected();
@@ -25,7 +25,7 @@
           if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
           var param = rows[0].taskNum;
           this.http
-            .post("api/Task/TaskCancel?taskNum="+param, "鏁版嵁澶勭悊涓�...")
+            .post("api/Task/TaskCancel?taskNum=" + param, "鏁版嵁澶勭悊涓�...")
             .then((x) => {
               if (x.status) {
                 this.$Message.success('浠诲姟鍙栨秷鎴愬姛.');
@@ -39,65 +39,295 @@
       let TaskHandCompletedBtn = this.buttons.find(x => x.value == 'TaskHandCompleted');
       if (TaskHandCompletedBtn) {
         TaskHandCompletedBtn.onClick = function () {
-          this.$confirm("鏄惁纭瀹屾垚浠诲姟","鎵嬪姩浠诲姟瀹屾垚璀﹀憡",{
-              confirmButtonText: "纭畾",
-              cancelButtonText: "鍙栨秷",
-              type: "warning",
-              center: true,
-              }).then(() => {
-                let rows = this.$refs.table.getSelected();
-                if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
-                if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
-                var param = rows[0].taskNum;
-                this.http
-                .post("api/Task/TaskCompleted?taskNum="+param, "")
-                .then((x) => {
-                    if (x.status) {
-                    this.$Message.success('浠诲姟鎵嬪姩瀹屾垚');
-                    this.refresh();
-                  } else {
-                    return this.$error(x.message);
-                  }
-                });
+          this.$confirm("鏄惁纭瀹屾垚浠诲姟", "鎵嬪姩浠诲姟瀹屾垚璀﹀憡", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning",
+            center: true,
+          }).then(() => {
+            let rows = this.$refs.table.getSelected();
+            if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+            if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
+            var param = rows[0].taskNum;
+            this.http
+              .post("api/Task/TaskCompleted?taskNum=" + param, "")
+              .then((x) => {
+                if (x.status) {
+                  this.$Message.success('浠诲姟鎵嬪姩瀹屾垚');
+                  this.refresh();
+                } else {
+                  return this.$error(x.message);
+                }
               });
+          });
         }
       }
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+      let ResendTaskBtn = this.buttons.find(x => x.value == 'ResendTask');
+      if (ResendTaskBtn) {
+        ResendTaskBtn.onClick = function () {
+          this.$confirm("鏄惁纭閲嶆柊涓嬪彂浠诲姟", "閲嶆柊涓嬪彂浠诲姟璀﹀憡", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning",
+            center: true,
+          }).then(() => {
+            let rows = this.$refs.table.getSelected();
+            if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+            if (rows.length > 1) return this.$error("璇烽�夋嫨涓�鏉℃暟鎹�!");
+            var param = rows[0].taskNum;
+            this.http
+              .post("api/Task/ResendTask?taskNum=" + param, "")
+              .then((x) => {
+                if (x.status) {
+                  this.$Message.success('浠诲姟閲嶆柊涓嬪彂');
+                  this.refresh();
+                } else {
+                  return this.$error(x.message);
+                }
+              });
+          });
+        }
       }
+      let relocationBtn = this.buttons.find(x => x.value == 'Relocation');
+      if (relocationBtn) {
+        relocationBtn.onClick = function () {
+          this.$refs.gridHeader.open();
+        }
+      }
+
+      // 鍒濆鍖栦换鍔$姸鎬佹鏌ュ畾鏃跺櫒
+      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) {
+          // 蹇界暐鎵�鏈夐敊璇�
+        }
+      }
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true;
+    },
+    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) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true;
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
     }
-  };
-  export default extension;
-  
\ No newline at end of file
+  }
+};
+export default extension;

--
Gitblit v1.9.3