修复库位平面图三四五巷道部分货位没有按列显示的问题
修复库位平面图三四五巷道部分货位没有按列显示的问题
| | |
| | | methods: { |
| | | //ä¸é¢è¿äºæ¹æ³å¯ä»¥ä¿çä¹å¯ä»¥å é¤ |
| | | onInit() { |
| | | // åå§åç©ºææ£æ¥å®æ¶å¨ |
| | | // è®¾ç½®å®æ¶å¨ï¼æ¯60ç§æ£æ¥ä¸æ¬¡ |
| | | this.checkEmptyPalletTimer = setInterval(() => { |
| | | this.checkEmptyPalletWarning(); |
| | | }, 10000); // æ¯10ç§æ£æ¥ä¸æ¬¡ |
| | | |
| | | // åæä»£ç ... |
| | | // let InOrder = this.buttons.find(x => x.value == 'StockOutbound'); |
| | | // if (InOrder) { |
| | |
| | | //ç䏿就æè¾åºçï¼console.log(this.editFormOptions) |
| | | }, |
| | | |
| | | // æ£æ¥ç©ºææ°é |
| | | checkEmptyPalletWarning() { |
| | | // è·åå
¨å±å¯¹è±¡åstoreï¼æ£æ¥æ¯å¦åå¨ç¸åçè¦åæ¶æ¯ |
| | | 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 || []; |
| | | |
| | | // 计ç®ç©ºææ»æ°éï¼åªè®¡ç®proStockAttribute为5çè®°å½ |
| | | let totalEmptyPalletCount = 0; |
| | | |
| | | // éåææåºåè®°å½ï¼ç´¯å ç©ºææ°é |
| | | stockData.forEach(stock => { |
| | | const proStockAttribute = stock.proStockAttribute || stock.ProStockAttribute || 0; |
| | | if (proStockAttribute === 5) { |
| | | // è§£æ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 |
| | | } |
| | | }; |
| | | |
| | | // è·åå
¨å±å¯¹è±¡åstore |
| | | const globalObj = this.$global || window.$global || {}; |
| | | const store = this.$store || window.$store; |
| | | |
| | | // æ·»å æ¶æ¯å°store |
| | | 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) { |
| | |
| | | } |
| | | } |
| | | |
| | | // åå§åä»»å¡ç¶ææ£æ¥å®æ¶å¨ |
| | | 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(); |
| | | |
| | | // è·åå
¨å±å¯¹è±¡åstore |
| | | 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) { |
| | | // è·åå
¨å±å¯¹è±¡åstore |
| | | 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) { |
| | | // è·åå
¨å±å¯¹è±¡åstore |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | // ä»storeä¸å é¤è¯¥æ¶æ¯ |
| | | 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() |
| | | }; |
| | | |
| | | // è·åå
¨å±å¯¹è±¡åstoreï¼æ£æ¥æ¯å¦åå¨ç¸åçè¦åæ¶æ¯ |
| | | 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 { |
| | | // æ·»å æ¶æ¯å°store |
| | | 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 { |
| | | // // ä½¿ç¨æµè§å¨åçalertä½ä¸ºå¤é |
| | | // alert(`${warningMessage.title}: ${warningMessage.message}`); |
| | | // } |
| | | } catch (error) { |
| | | // åºéæ¶ä½¿ç¨æµè§å¨åçalertä½ä¸ºæç»å¤é |
| | | try { |
| | | alert(`ä»»å¡å¼å¸¸è¦å: ä»»å¡å· ${task.taskNum} å·²å¨å åæºæ§è¡ä¸ç¶æè¶
è¿${Math.round(duration)}åéï¼è¯·åæ¶å¤çï¼`); |
| | | } catch (e) { |
| | | // å¿½ç¥ææé误 |
| | | } |
| | | } |
| | | // ä¸åéè¦æ³¨å任塿°æ®æºï¼å
¨å±ä»»å¡è¶
æ¶æå¡å·²æ¹ä¸ºç´æ¥ä»APIè·åæ°æ® |
| | | }, |
| | | onInited() { |
| | | //æ¡æ¶åå§åé
ç½®å |
| | |
| | | }, |
| | | 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) { |
| | |
| | | //(3)this.editFormFields.åæ®µ='xxx'; |
| | | //妿éè¦ç»ä¸ææ¡è®¾ç½®é»è®¤å¼ï¼è¯·éåthis.editFormOptionsæ¾å°å段é
置对åºdata屿§çkeyå¼ |
| | | //ç䏿就æè¾åºçï¼console.log(this.editFormOptions) |
| | | }, |
| | | |
| | | // ç»ä»¶éæ¯æ¶æ¸
çèµæº |
| | | onDestroyed() { |
| | | // ä¸åéè¦æ¸
ç任塿°æ®æºï¼å
¨å±ä»»å¡è¶
æ¶æå¡å·²æ¹ä¸ºç´æ¥ä»APIè·åæ°æ® |
| | | } |
| | | } |
| | | }; |
| | |
| | | // 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' |
| | | |
| | | |
| | | |
| | |
| | | .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; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // 空æé¢è¦æå¡ |
| | | 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; |
| | | |
| | | // éåææè¿åè®°å½ï¼ç´æ¥ç´¯å åºåæ°éï¼APIå·²è¿æ»¤ç©ºæï¼ |
| | | 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) { |
| | | // å°è¯è§£æä¸ºæ°å |
| | | 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æ¹æ³æè½½å°window对象 |
| | | window.testEmptyPalletWarning = () => { |
| | | checkEmptyPalletWarning(globalState, store); |
| | | }; |
| | | }; |
| | | |
| | | export default { |
| | | init: initEmptyPalletWarning, |
| | | check: checkEmptyPalletWarning |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // å
¨å±ä»»å¡è¶
æ¶æå¡ |
| | | 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æ¹æ³æè½½å°window对象 |
| | | window.testTaskTimeout = () => { |
| | | this.checkTaskStatus(); |
| | | }; |
| | | } |
| | | |
| | | // ä»APIå·æ°ä»»å¡æ°æ® |
| | | 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('ä»APIè·å任塿°æ®å¤±è´¥:', error); |
| | | this.apiTaskData = []; |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥ä»»å¡ç¶æ |
| | | checkTaskStatus() { |
| | | // ç´æ¥ä½¿ç¨ä»APIè·åçæ°æ® |
| | | 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; |
| | |
| | | permission: [], |
| | | isLoading: false,//2020.06.03å¢å è·¯ç±åæ¢æ¶å è½½æç¤º |
| | | userInfo: null, |
| | | websocke: null,//websocket |
| | | messageList: [],//æ¶æ¯å表 |
| | | websocke: null//websocket |
| | | // wcsState: true//wcsæå¡ç¶æ |
| | | }, |
| | | mutations: { |
| | |
| | | }, |
| | | 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') |
| | |
| | | }, |
| | | getData: (state) => () => { |
| | | return state.data; |
| | | }, |
| | | getMessageList: (state) => () => { |
| | | return state.messageList; |
| | | } |
| | | }, actions: { |
| | | setPermission(context, data) { |
| | |
| | | }, |
| | | onLoading(context, flag) { |
| | | context.commit("updateLoadingState", flag); |
| | | }, |
| | | addMessage(context, message) { |
| | | context.commit('addMessage', message); |
| | | } |
| | | } |
| | | }) |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | <!-- åæåºæ¾ç¤ºå
容 --> |
| | | <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> |
| | |
| | | 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); |
| | | } |
| | | |
| | | // æåææè´§ä½ç¼å· |
| | |
| | | |
| | | .location-view { |
| | | flex: 1; |
| | | width: 470%; |
| | | max-width: 470%; |
| | | width: 360%; |
| | | max-width: 360%; |
| | | overflow: auto; |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | |
| | | 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; |
| | |
| | | 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; |
| | | } |
| | | |
| | | /* å··éåºåæ ·å¼ */ |
| | |
| | | |
| | | const handleMessage = (e) => { |
| | | let data = JSON.parse(e.data); |
| | | // 使ç¨storeçaddMessage 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), |
| | |
| | | _config.$global.messageList = _config.$global.messageList.filter(msg => msg.id !== item.id); |
| | | } |
| | | |
| | | // ä»storeä¸å é¤è¯¥æ¶æ¯ |
| | | if (store) { |
| | | // 使ç¨mutationå é¤åä¸ªæ¶æ¯ |
| | | store.commit('removeMessage', item.id); |
| | | } |
| | | |
| | | // å°å é¤çæ¶æ¯IDæ·»å å°messageDeletedæ°ç»ï¼ç¨äºéç¥ç»ä»¶éç½®å®æ¶å¨ |
| | | if (_config.$global.messageDeleted && Array.isArray(_config.$global.messageDeleted)) { |
| | | _config.$global.messageDeleted.push(item.id); |
| | |
| | | // è·åææå½åæ¶æ¯çIDï¼ç¨äºéç½®å®æ¶å¨ |
| | | const messageIds = _config.$global.messageList.map(msg => msg.id); |
| | | |
| | | // å
æ¸
空storeä¸çæ¶æ¯å表 |
| | | store.commit('clearMessages'); |
| | | // ç¶åæ¸
空å
¨å±æ¶æ¯å表ï¼ä½¿ç¨éæ°èµå¼çæ¹å¼ç¡®ä¿ååºå¼æ´æ° |
| | | // æ¸
空å
¨å±æ¶æ¯å表ï¼ä½¿ç¨éæ°èµå¼çæ¹å¼ç¡®ä¿ååºå¼æ´æ° |
| | | _config.$global.messageList = []; |
| | | |
| | | // å°ææå é¤çæ¶æ¯IDæ·»å å°messageDeletedæ°ç»ï¼ç¨äºéç¥ç»ä»¶éç½®å®æ¶å¨ |
| | |
| | | [ |
| | | { title: "ä»åº", field: "warehouseId", type: "selectList", dataKey: "warehouses", data: [], }, |
| | | { title: "客æ·ç®ç§°", field: "shortName", type: "like" }, |
| | | { title: "å建æ¶é´", field: "createDate", type: "datetime", }, |
| | | ], |
| | | ]); |
| | | const columns = ref([ |
| | |
| | | [ |
| | | { title: "æå±ä»åº", field: "warehouseId",type: "select",dataKey: "warehouses",data: []}, |
| | | { title: "åºå屿§", field: "proStockAttribute" ,type: "selectList",dataKey: "proStockAttributeEnum",data: [],}, |
| | | { title: "å建æ¶é´", field: "createDate",type: "datetime",}, |
| | | ], |
| | | ]); |
| | | const columns = ref([ |