| | |
| | | <!-- æ«ç æä½åºå --> |
| | | <el-card class="scan-section-card" shadow="never"> |
| | | <div class="scan-section"> |
| | | <el-alert title="è¯·ä½¿ç¨æ«ç æªæ«æ/æå¨è¾å
¥æçç ï¼åè½¦è§¦åæ¥è¯¢" type="info" :closable="false" show-icon class="scan-alert"> |
| | | <el-alert title="è¯·ä½¿ç¨æ«ç æªæ«æï¼æ¯æå车èªå¨ç¡®è®¤" type="info" :closable="false" show-icon class="scan-alert"> |
| | | <template #default> |
| | | <div> |
| | | <div>1. è¾å
¥/æ«ææçç â 2. å车触åç³»ç»è·å订åå·å¹¶å è½½æ°æ®</div> |
| | | <div>1. 请å
æ«ææçç â 2. åæ«æç©ææ ç¾ç </div> |
| | | <div style="margin-top: 8px; font-size: 13px; color: #666;"> |
| | | <i class="el-icon-info" style="color: #409EFF;"></i> |
| | | æ¯ææ«æçç æ´ç®±åºåºï¼æ«ææçç åå¯ç´æ¥è¿è¡æ´ç®±ç©ææ£éï¼æ éåæ«æç©ææ ç¾ç ã |
| | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æçç " prop="palletCode"> |
| | | <!-- ãæ ¸å¿è°æ´ãä»
ä¿çå车触åï¼æ ä»»ä½é¢å¤äºä»¶ï¼æ¢å¤åææ ·å¼ --> |
| | | <el-input ref="palletInput" v-model="scanForm.palletCode" placeholder="è¯·æ«æ/è¾å
¥æçç " size="large" |
| | | <el-input ref="palletInput" v-model="scanForm.palletCode" placeholder="è¯·æ«ææçç " size="large" |
| | | clearable @keyup.enter="handlePalletScan"> |
| | | <template #prefix> |
| | | <i class="el-icon-box"></i> |
| | |
| | | </div> |
| | | <div class="info-item"> |
| | | <label>æ´åºæ°éï¼</label> |
| | | <span class="info-value highlight">{{ wholeOutInfo.assignQuantity }} {{ wholeOutInfo.unit }}</span> |
| | | <span class="info-value highlight">{{ wholeOutInfo.assignQuantity }} {{ wholeOutInfo.unit |
| | | }}</span> |
| | | </div> |
| | | <div class="info-item"> |
| | | <label>å½ååºåï¼</label> |
| | | <span class="info-value">{{ wholeOutInfo.currentStock || wholeOutInfo.originalQuantity }} {{ wholeOutInfo.unit }}</span> |
| | | <span class="info-value">{{ wholeOutInfo.currentStock || wholeOutInfo.originalQuantity }} {{ |
| | | wholeOutInfo.unit }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | }, |
| | | scanRules: { |
| | | palletCode: [ |
| | | { required: true, message: 'è¯·æ«æ/è¾å
¥æçç ', trigger: 'blur' } |
| | | { required: true, message: 'è¯·æ«ææçç ', trigger: 'blur' } |
| | | ], |
| | | materialBarcode: [ |
| | | { required: true, message: 'è¯·æ«æç©ææ¡ç ', trigger: 'blur' } |
| | |
| | | loadingInstance: null, |
| | | // é³é¢å®ä¾ï¼ç¼åï¼é¿å
éå¤åå»ºï¼ |
| | | successAudio: null, |
| | | errorAudio: null, |
| | | selectedPalletCode: '' |
| | | errorAudio: null |
| | | } |
| | | }, |
| | | computed: { |
| | |
| | | // 鿝é³é¢å®ä¾ï¼éæ¾èµæº |
| | | this.successAudio = null |
| | | this.errorAudio = null |
| | | // ãå·²æ¸
çãç§»é¤å³æ¶è§¦åç¸å
³ç鲿宿¶å¨æ¸
é¤ä»£ç |
| | | }, |
| | | methods: { |
| | | // åå§åé³é¢å®ä¾ï¼æ ¸å¿ï¼éé
src/assetsè·¯å¾ï¼ç¼åå®ä¾ï¼ |
| | |
| | | } |
| | | } |
| | | }, |
| | | |
| | | // ============== æ°å¢ï¼æ ¹æ®æçå·è·å订åå·ï¼æ ¸å¿åè½ï¼ ============== |
| | | async getOrderNoByPallet(palletCode) { |
| | | if (!palletCode) { |
| | | this.$message.warning('æçå·ä¸è½ä¸ºç©º'); |
| | | return null; |
| | | } |
| | | |
| | | try { |
| | | this.showFullScreenLoading(); |
| | | // è°ç¨è·å订åå·çæ¥å£ |
| | | const response = await this.http.get(`/api/OutboundOrder/GetOrderNoByPalletCode?palletCode=${palletCode}`); |
| | | |
| | | if (response.status && response.data) { |
| | | const validOrderNo = response.data; |
| | | this.playSuccessAudio(); |
| | | this.$message.success(`æåè·å订åå·ï¼${validOrderNo}`); |
| | | return validOrderNo; |
| | | } else { |
| | | this.playErrorAudio(); |
| | | const errorMsg = response.message || '该æçå·æªå
³èä»»ä½è®¢å'; |
| | | this.$message.error(errorMsg); |
| | | return null; |
| | | } |
| | | } catch (error) { |
| | | this.playErrorAudio(); |
| | | const errorMsg = `è·å订åå·å¼å¸¸ï¼${error.message || 'ç½ç»é误'}`; |
| | | this.$message.error(errorMsg); |
| | | console.error("ãæçå·æ¥è®¢åå·æ¥å£å¼å¸¸ã", error); |
| | | return null; |
| | | } finally { |
| | | this.hideFullScreenLoading(); |
| | | } |
| | | }, |
| | | // ============== æ°å¢ç»æ ============== |
| | | |
| | | // ææ¾æåé³é¢ |
| | | playSuccessAudio() { |
| | | try { |
| | |
| | | }, |
| | | initPage() { |
| | | // ä»è·¯ç±åæ°è·å订åå· |
| | | this.orderNo = this.$route.query.orderNo || ''; |
| | | |
| | | // æ¯æéè¿æçå·è·å订åå·ï¼ä¸å¼ºå¶è¿åä¸ä¸é¡µ |
| | | if (this.orderNo) { |
| | | this.loadOrderInfo(); |
| | | } else { |
| | | this.$message.info('è¯·æ«æ/è¾å
¥æçç è·åå
³è订å'); |
| | | } |
| | | this.orderNo = this.$route.query.orderNo || '' |
| | | // ============== å¾®è°ï¼æ³¨é强å¶è¿åé»è¾ï¼å
¼å®¹æçå·æ¥è®¢åå· ============== |
| | | // if (!this.orderNo) { |
| | | // this.$message.error('订åå·ä¸è½ä¸ºç©º') |
| | | // this.$router.back() |
| | | // return |
| | | // } |
| | | // ============== å¾®è°ç»æ ============== |
| | | |
| | | // å 载订åä¿¡æ¯ |
| | | this.loadOrderInfo() |
| | | |
| | | // èªå¨èç¦å°æçç è¾å
¥æ¡ |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | this.$refs.palletInput.focus() |
| | | } |
| | | }); |
| | | }) |
| | | }, |
| | | async loadOrderInfo() { |
| | | if (!this.orderNo) return; |
| | | |
| | | try { |
| | | this.showFullScreenLoading(); |
| | | const response = await this.http.get(`/api/Outbound/GetOrderInfo?orderNo=${this.orderNo}`); |
| | | this.showFullScreenLoading() |
| | | const response = await this.http.get(`/api/Outbound/GetOrderInfo?orderNo=${this.orderNo}`) |
| | | if (response.status) { |
| | | this.orderInfo = response.data; |
| | | this.orderInfo = response.data |
| | | } else { |
| | | this.$message.error(response.message || 'è·å订åä¿¡æ¯å¤±è´¥'); |
| | | } |
| | | } catch (error) { |
| | | this.$message.error(`è·å订åä¿¡æ¯å¼å¸¸ï¼${error.message || 'ç½ç»é误'}`); |
| | | console.error('ãå 载订åä¿¡æ¯å¤±è´¥ã', error); |
| | | } |
| | | catch (error) { |
| | | |
| | | } finally { |
| | | this.hideFullScreenLoading(); |
| | | this.hideFullScreenLoading() |
| | | } |
| | | }, |
| | | |
| | | async loadPalletData() { |
| | | if (!this.scanForm.palletCode || !this.orderNo) { |
| | | this.unpickedData = []; |
| | | return; |
| | | if (!this.scanForm.palletCode) { |
| | | this.unpickedData = [] |
| | | return |
| | | } |
| | | |
| | | try { |
| | | this.showFullScreenLoading(); |
| | | this.showFullScreenLoading() |
| | | await Promise.all([ |
| | | this.loadUnpickedData(), |
| | | this.loadPickedData() |
| | | ]); |
| | | |
| | | } catch (error) { |
| | | this.unpickedData = []; |
| | | console.error('ãå è½½æçæ°æ®å¤±è´¥ã', error); |
| | | this.unpickedData = [] |
| | | } finally { |
| | | this.hideFullScreenLoading(); |
| | | this.hideFullScreenLoading() |
| | | } |
| | | }, |
| | | // æ ¸å¿é»è¾ï¼èªå¨æåCK订åå·å¹¶èµå¼ï¼éèæå®æç¤º |
| | | loadUnpickedData() { |
| | | return new Promise((resolve, reject) => { |
| | | // å
æ¸
空ä¹åçæç¤ºï¼é¿å
éå¤æç¤º |
| | | this.$message.closeAll(); |
| | | |
| | | this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => { |
| | | if (response.status) { |
| | | if (response.data.outStockLockInfos && response.data.outStockLockInfos.length > 0) { |
| | | this.unpickedData = response.data.outStockLockInfos; |
| | | this.matMixed = response.data.isMatMixed; |
| | | this.orderOver = response.data.orderOver; |
| | | this.calculateUnpickedStats(); |
| | | |
| | | this.$nextTick(() => { |
| | | if (this.hasWholeOut()) { |
| | | this.showWholeOutConfirm(); |
| | | } |
| | | }); |
| | | |
| | | this.$nextTick(() => { |
| | | if (this.$refs.materialInput) { |
| | | this.$refs.materialInput.focus(); |
| | | } |
| | | }); |
| | | } else { |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); |
| | | |
| | | this.$message.success({ |
| | | message: `æçã${this.scanForm.palletCode}ãå·²æ£éå®æï¼ææ æ£éè®°å½`, |
| | | duration: 3000, |
| | | showClose: true |
| | | }); |
| | | |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | this.$refs.palletInput.$el.querySelector('input').select(); |
| | | } |
| | | // è¡¨æ ¼é«äº®éä¸å½åæç |
| | | if (this.$refs.unpickedTable) { |
| | | const targetRow = this.unpickedData.find(item => item.palletCode === this.scanForm.palletCode); |
| | | if (targetRow) this.$refs.unpickedTable.setCurrentRow(targetRow); |
| | | } |
| | | }); |
| | | |
| | | this.scanForm.materialBarcode = ''; |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | } |
| | | }); |
| | | } |
| | | resolve(); |
| | | } else { |
| | | const errorMsg = response.message || `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¤±è´¥`; |
| | | const targetOrderNo = this.extractCKOrderNo(errorMsg); |
| | | |
| | | if (targetOrderNo) { |
| | | // èªå¨èµå¼ï¼ä¸æ¾ç¤ºé误æç¤ºï¼éç¯æµç¨ |
| | | this.orderNo = targetOrderNo; |
| | | this.$forceUpdate(); |
| | | this.loadOrderInfo().then(() => { |
| | | this.loadPalletData(); |
| | | }); |
| | | resolve("èªå¨èµå¼æ°è®¢åå·ï¼éæ°è¯·æ±æ°æ®"); |
| | | } else { |
| | | this.$message.error({ |
| | | message: errorMsg, |
| | | duration: 5000, |
| | | showClose: true |
| | | }); |
| | | |
| | | this.scanForm.palletCode = ''; |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | } |
| | | }); |
| | | reject(errorMsg); |
| | | } |
| | | |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); |
| | | } |
| | | }).catch(error => { |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); |
| | | return new Promise((resolve, reject) => { |
| | | // å
æ¸
空ä¹åçæç¤ºï¼é¿å
éå¤æç¤º |
| | | this.$message.closeAll(); |
| | | |
| | | this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => { |
| | | if (response.status) { |
| | | // æ
åµ1ï¼ææªæ£éæ°æ® |
| | | if (response.data.outStockLockInfos && response.data.outStockLockInfos.length > 0) { |
| | | this.unpickedData = response.data.outStockLockInfos; |
| | | this.matMixed = response.data.isMatMixed; |
| | | this.orderOver = response.data.orderOver; |
| | | this.calculateUnpickedStats() |
| | | |
| | | this.$message.error({ |
| | | message: `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¼å¸¸ï¼${error.message || 'ç½ç»é误ï¼è¯·éè¯'}`, |
| | | duration: 5000, |
| | | showClose: true |
| | | // æ£æ¥æ´åºç¡®è®¤ |
| | | this.$nextTick(() => { |
| | | if (this.hasWholeOut()) { |
| | | this.showWholeOutConfirm() |
| | | } |
| | | }) |
| | | |
| | | // èç¦ç©ææ¡ç è¾å
¥æ¡ |
| | | this.$nextTick(() => { |
| | | if (this.$refs.materialInput) { |
| | | this.$refs.materialInput.focus() |
| | | } |
| | | }) |
| | | } |
| | | // æ
åµ2ï¼æ æªæ£éæ°æ® |
| | | else { |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); // éç½®ç»è®¡æ°æ® |
| | | |
| | | // å好æç¤º + 交äºä¼å |
| | | this.$message.success({ |
| | | message: `æçã${this.scanForm.palletCode}ãå·²æ£éå®æï¼ææ æ£éè®°å½`, |
| | | duration: 3000, // æç¤ºæ¾ç¤º3ç§ |
| | | showClose: true // å
许æå¨å
³é |
| | | }); |
| | | console.error("ãQueryPickingTasks ç½ç»å¼å¸¸ã", error); |
| | | reject(error); |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | // æ¸
ç©ºç©ææ¡ç å¹¶èç¦åæçç è¾å
¥æ¡ |
| | | this.scanForm.materialBarcode = ''; |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | } |
| | | }); |
| | | } |
| | | resolve(); |
| | | } |
| | | // æ
åµ3ï¼æ¥å£è¿å失败 |
| | | else { |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); |
| | | |
| | | this.$message.error({ |
| | | message: response.message || `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¤±è´¥`, |
| | | duration: 5000, |
| | | showClose: true |
| | | }); |
| | | reject(response.message || 'è·åæçæ°æ®å¤±è´¥'); |
| | | } |
| | | }).catch(error => { |
| | | // æ
åµ4ï¼ç½ç»/请æ±å¼å¸¸ |
| | | this.unpickedData = []; |
| | | this.calculateUnpickedStats(); |
| | | |
| | | this.$message.error({ |
| | | message: `è·åæçã${this.scanForm.palletCode}ãæ£éæ°æ®å¼å¸¸ï¼${error.message || 'ç½ç»é误ï¼è¯·éè¯'}`, |
| | | duration: 5000, |
| | | showClose: true |
| | | }); |
| | | reject(error); |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | loadPickedData() { |
| | | return new Promise((resolve, reject) => { |
| | | this.http.post(`/api/Outbound/QueryPickedList?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => { |
| | | if (response.status) { |
| | | if (response.data.length > 0) { |
| | | this.pickedData = response.data; |
| | | this.calculatePickedStats(); |
| | | this.pickedData = response.data |
| | | this.calculatePickedStats() |
| | | } else { |
| | | this.pickedData = []; |
| | | this.pickedData = [] |
| | | |
| | | } |
| | | resolve(); |
| | | } else { |
| | | const errorMsg = response.message || 'è·åæçå·²æ£éæ°æ®å¤±è´¥'; |
| | | const targetOrderNo = this.extractCKOrderNo(errorMsg); |
| | | resolve() |
| | | |
| | | if (targetOrderNo) { |
| | | this.orderNo = targetOrderNo; |
| | | this.$forceUpdate(); |
| | | resolve("èªå¨èµå¼æ°è®¢åå·"); |
| | | } else { |
| | | reject(errorMsg); |
| | | } |
| | | this.pickedData = []; |
| | | } else { |
| | | this.$message.error(response.message || 'è·åæçæ°æ®å¤±è´¥') |
| | | this.pickedData = [] |
| | | reject(response.message || 'è·åæçæ°æ®å¤±è´¥') |
| | | } |
| | | }).catch(error => { |
| | | console.error("ãQueryPickedList ç½ç»å¼å¸¸ã", error); |
| | | reject(error); |
| | | reject(error) |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | // è®¡ç®æªæ£é |
| | | calculateUnpickedStats() { |
| | | this.unpickedCount = this.unpickedData.length; |
| | | // æªæ£éæ¡ç®æ°é |
| | | this.unpickedCount = this.unpickedData.length |
| | | |
| | | // è®¡ç®æªæ£éçæ»æ°éï¼åæ£æ°é - 已忣æ°éï¼ |
| | | this.unpickedQuantity = this.unpickedData.reduce((sum, item) => { |
| | | const assignQty = item.assignQuantity || 0; |
| | | const sortedQty = item.sortedQuantity || 0; |
| | | const remainingQty = Math.max(0, assignQty - sortedQty); |
| | | return sum + remainingQty; |
| | | }, 0); |
| | | this.unpickedTotal = this.unpickedCount; |
| | | const assignQty = item.assignQuantity || 0 |
| | | const sortedQty = item.sortedQuantity || 0 |
| | | const remainingQty = Math.max(0, assignQty - sortedQty) |
| | | return sum + remainingQty |
| | | }, 0) |
| | | |
| | | // æ»æ¡ç®æ°ï¼ä¸æ¡ç®æ°éç¸åï¼è¿éä¿çåéä¸è´æ§ï¼ |
| | | this.unpickedTotal = this.unpickedCount |
| | | }, |
| | | |
| | | // 计ç®å·²æ£é |
| | | calculatePickedStats() { |
| | | this.pickedCount = this.pickedData.length; |
| | | // å·²æ£éæ¡ç®æ°é |
| | | this.pickedCount = this.pickedData.length |
| | | |
| | | // 计ç®å·²æ£éçæ»æ°é |
| | | this.pickedQuantity = 0 - this.pickedData.reduce((sum, item) => { |
| | | return (sum + item.changeQuantity); |
| | | }, 0); |
| | | this.pickedTotal = this.pickedCount; |
| | | }, |
| | | // å·¥å
·æ¹æ³ - æåCKå¼å¤´è®¢åå· |
| | | extractCKOrderNo(message) { |
| | | if (!message) return null; |
| | | const ckOrderReg = /CK\d+/g; |
| | | const matchResult = message.match(ckOrderReg); |
| | | return matchResult && matchResult.length > 0 ? matchResult[0] : null; |
| | | }, |
| | | // æ ¸å¿ï¼è°ç¨è·å订åå·æ¥å£ï¼å®æ´è·¯å¾ï¼å车触åï¼ |
| | | async getOrderNoByPallet(palletCode) { |
| | | if (!palletCode) { |
| | | this.$message.warning('æçå·ä¸è½ä¸ºç©º'); |
| | | return null; |
| | | } |
| | | return (sum + item.changeQuantity) |
| | | }, 0) |
| | | |
| | | try { |
| | | this.showFullScreenLoading(); |
| | | const response = await this.http.get(`/api/OutboundOrder/GetOrderNoByPalletCode?palletCode=${palletCode}`); |
| | | |
| | | if (response.status && response.data) { |
| | | const validOrderNo = response.data; |
| | | this.playSuccessAudio(); |
| | | this.$message.success(`æåè·å订åå·ï¼${validOrderNo}`); |
| | | return validOrderNo; |
| | | } else { |
| | | this.playErrorAudio(); |
| | | const errorMsg = response.message || '该æçå·æªå
³èä»»ä½è®¢å'; |
| | | this.$message.error(errorMsg); |
| | | return null; |
| | | } |
| | | } catch (error) { |
| | | this.playErrorAudio(); |
| | | const errorMsg = `æ¥å£è°ç¨å¼å¸¸ï¼${error.message || 'ç½ç»é误/æ¥å£ä¸åå¨'}`; |
| | | this.$message.error(errorMsg); |
| | | console.error("ãæ¥å£è°ç¨å¤±è´¥ã", error); |
| | | return null; |
| | | } finally { |
| | | this.hideFullScreenLoading(); |
| | | } |
| | | // æ»æ¡ç®æ°ï¼ä¸æ¡ç®æ°éç¸åï¼ |
| | | this.pickedTotal = this.pickedCount |
| | | }, |
| | | // å车触åçæ ¸å¿æ¹æ³ï¼æ 峿¶è§¦åï¼é¿å
é¢ç¹è°ç¨æ¥å£ |
| | | async handlePalletScan(flag = true) { |
| | | |
| | | // ============== å¾®è°ï¼æ°å¢è·å订åå·é»è¾ï¼å
¶ä½ä¸å ============== |
| | | handlePalletScan(flag = true) { |
| | | const palletCode = this.scanForm.palletCode.trim(); |
| | | if (!palletCode) { |
| | | this.$message.warning('请è¾å
¥ææçæçå·'); |
| | | return; |
| | | } |
| | | |
| | | // è°ç¨è®¢åå·æ¥å£ï¼ä»
å车触å䏿¬¡ |
| | | const orderNoFromApi = await this.getOrderNoByPallet(palletCode); |
| | | |
| | | if (orderNoFromApi) { |
| | | this.orderNo = orderNoFromApi; |
| | | this.$forceUpdate(); |
| | | } |
| | | |
| | | if (this.orderNo) { |
| | | await this.loadOrderInfo(); |
| | | // å
æ ¹æ®æçå·è·å订åå· |
| | | this.getOrderNoByPallet(palletCode).then((orderNo) => { |
| | | if (orderNo) { |
| | | // èµå¼è®¢åå·ï¼ä¾åç»é»è¾ä½¿ç¨ |
| | | this.orderNo = orderNo; |
| | | // å·æ°è®¢åä¿¡æ¯ |
| | | this.loadOrderInfo(); |
| | | } |
| | | this.loadPalletData(flag); |
| | | } else { |
| | | this.loadPalletData(flag); |
| | | } |
| | | }); |
| | | }, |
| | | // ============== å¾®è°ç»æ ============== |
| | | |
| | | handleMaterialScan() { |
| | | if (!this.scanForm.palletCode) { |
| | | this.$message.warning('请å
æ«æ/è¾å
¥æçç '); |
| | | this.$refs.palletInput.focus(); |
| | | return; |
| | | this.$message.warning('请å
æ«ææçç ') |
| | | this.$refs.palletInput.focus() |
| | | return |
| | | } |
| | | |
| | | if (!this.scanForm.materialBarcode) { |
| | | this.$message.warning('è¯·æ«æç©ææ¡ç '); |
| | | return; |
| | | this.$message.warning('è¯·æ«æç©ææ¡ç ') |
| | | return |
| | | } |
| | | |
| | | this.handleConfirmPick(); |
| | | // èªå¨æ§è¡ç¡®è®¤æ£é |
| | | this.handleConfirmPick() |
| | | }, |
| | | |
| | | async handleConfirmPick() { |
| | | if (!this.scanForm.palletCode || !this.scanForm.materialBarcode) { |
| | | this.$message.warning('请å
æ«ææçç åç©ææ¡ç '); |
| | | return; |
| | | this.$message.warning('请å
æ«ææçç åç©ææ¡ç ') |
| | | return |
| | | } |
| | | |
| | | this.confirmLoading = true; |
| | | this.showFullScreenLoading(); |
| | | this.confirmLoading = true |
| | | this.showFullScreenLoading() |
| | | |
| | | try { |
| | | const response = await this.http.post('/api/Outbound/CompleteOutboundWithBarcode', { |
| | |
| | | palletCode: this.scanForm.palletCode, |
| | | barcode: this.scanForm.materialBarcode, |
| | | operator: this.getUserName() |
| | | }); |
| | | }) |
| | | if (response.status) { |
| | | if (response.data.scannedDetail.isUnpacked && response.data.scannedDetail.materialCodes.length > 0) { |
| | | this.$refs.printView.open(response.data.scannedDetail.materialCodes); |
| | | } |
| | | this.$message.success('æ£é确认æå'); |
| | | this.playSuccessAudio(); |
| | | this.resetMaterialBarcode(); |
| | | await this.loadPalletData(false); |
| | | this.$message.success('æ£é确认æå') |
| | | // æ¥å£æåï¼ææ¾æåé³é¢ |
| | | this.playSuccessAudio() |
| | | this.resetMaterialBarcode() |
| | | await this.loadPalletData(false) |
| | | } else { |
| | | this.$message.error(response.message || 'æ£é确认失败'); |
| | | this.playErrorAudio(); |
| | | this.$message.error(response.message || 'æ£é确认失败') |
| | | this.playErrorAudio() |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('æ£é确认失败'); |
| | | this.playErrorAudio(); |
| | | this.$message.error('æ£é确认失败') |
| | | this.playErrorAudio() |
| | | } finally { |
| | | this.confirmLoading = false; |
| | | this.hideFullScreenLoading(); |
| | | this.confirmLoading = false |
| | | this.hideFullScreenLoading() |
| | | } |
| | | }, |
| | | |
| | | handleEmptyBox() { |
| | | if (!this.scanForm.palletCode) { |
| | | this.$message.warning('请å
æ«æ/è¾å
¥æçç '); |
| | | return; |
| | | this.$message.warning('请å
æ«ææçç ') |
| | | return |
| | | } |
| | | |
| | | this.confirmMessage = `ç¡®å®è¦å空æç ${this.scanForm.palletCode} åï¼`; |
| | | this.currentAction = 'emptyBox'; |
| | | this.confirmDialogVisible = true; |
| | | this.confirmMessage = `ç¡®å®è¦å空æç ${this.scanForm.palletCode} åï¼` |
| | | this.currentAction = 'emptyBox' |
| | | this.confirmDialogVisible = true |
| | | }, |
| | | |
| | | handleReturnToWarehouse() { |
| | | if (!this.scanForm.palletCode) { |
| | | this.$message.warning('请å
æ«æ/è¾å
¥æçç '); |
| | | return; |
| | | this.$message.warning('请å
æ«ææçç ') |
| | | return |
| | | } |
| | | |
| | | this.confirmMessage = `ç¡®å®è¦å°æç ${this.scanForm.palletCode} ååºåï¼`; |
| | | this.currentAction = 'returnToWarehouse'; |
| | | this.confirmDialogVisible = true; |
| | | this.confirmMessage = `ç¡®å®è¦å°æç ${this.scanForm.palletCode} ååºåï¼` |
| | | this.currentAction = 'returnToWarehouse' |
| | | this.confirmDialogVisible = true |
| | | }, |
| | | |
| | | async executeConfirm() { |
| | | this.executeLoading = true; |
| | | this.showFullScreenLoading(); |
| | | this.executeLoading = true |
| | | this.showFullScreenLoading() |
| | | |
| | | try { |
| | | let apiUrl = ''; |
| | | let apiUrl = '' |
| | | let params = { |
| | | orderNo: this.orderNo, |
| | | palletCode: this.scanForm.palletCode, |
| | | station: stationManager.getStation() |
| | | }; |
| | | } |
| | | if (this.currentAction === 'emptyBox') { |
| | | apiUrl = '/api/Outbound/EmptyBox'; |
| | | apiUrl = '/api/Outbound/EmptyBox' |
| | | } else if (this.currentAction === 'returnToWarehouse') { |
| | | apiUrl = '/api/Outbound/ReturnToWarehouse'; |
| | | apiUrl = '/api/Outbound/ReturnToWarehouse' |
| | | } |
| | | |
| | | const response = await this.http.post(apiUrl, params); |
| | | const response = await this.http.post(apiUrl, params) |
| | | |
| | | if (response.status) { |
| | | this.$message.success('æä½æå'); |
| | | this.confirmDialogVisible = false; |
| | | this.resetForm(); |
| | | this.$message.success('æä½æå') |
| | | this.confirmDialogVisible = false |
| | | this.resetForm() |
| | | } else { |
| | | this.$message.error(response.message || 'æä½å¤±è´¥'); |
| | | this.$message.error(response.message || 'æä½å¤±è´¥') |
| | | } |
| | | } catch (error) { |
| | | this.$message.error('æä½å¤±è´¥'); |
| | | this.$message.error('æä½å¤±è´¥') |
| | | } finally { |
| | | this.executeLoading = false; |
| | | this.hideFullScreenLoading(); |
| | | this.executeLoading = false |
| | | this.hideFullScreenLoading() |
| | | } |
| | | }, |
| | | |
| | | handleDialogClose() { |
| | | if (!this.executeLoading) { |
| | | this.confirmDialogVisible = false; |
| | | this.confirmDialogVisible = false |
| | | } |
| | | }, |
| | | |
| | | // æ´åºç¡®è®¤ç¸å
³æ¹æ³ |
| | | showWholeOutConfirm() { |
| | | // è·åéè¦æ´åºçç©æä¿¡æ¯ |
| | | const wholeOutItem = this.unpickedData.find(item => item.assignQuantity === item.originalQuantity); |
| | | if (wholeOutItem) { |
| | | this.wholeOutInfo = { |
| | |
| | | this.wholeOutDialogVisible = true; |
| | | } |
| | | }, |
| | | |
| | | handleWholeOutDialogClose() { |
| | | if (!this.executeLoading) { |
| | | this.wholeOutDialogVisible = false; |
| | | this.wholeOutInfo = null; |
| | | } |
| | | }, |
| | | |
| | | async executeWholeOut() { |
| | | if (!this.wholeOutInfo) { |
| | | this.$message.error('æ´åºä¿¡æ¯æ æ'); |
| | |
| | | this.showFullScreenLoading(); |
| | | |
| | | try { |
| | | // è°ç¨æ´åºæ¥å£ï¼è¿é使ç¨ç©æç¼ç ä½ä¸ºæ¡ç |
| | | const response = await this.http.post('/api/Outbound/CompleteOutboundWithPallet', { |
| | | orderNo: this.orderNo, |
| | | palletCode: this.scanForm.palletCode, |
| | |
| | | this.hideFullScreenLoading(); |
| | | } |
| | | }, |
| | | |
| | | quickPick(row) { |
| | | this.scanForm.materialBarcode = row.materielCode; |
| | | this.handleConfirmPick(); |
| | | this.scanForm.materialBarcode = row.materielCode |
| | | this.handleConfirmPick() |
| | | }, |
| | | |
| | | undoPick(row) { |
| | | try { |
| | | this.$confirm('ç¡®å®è¦æ¤éè¿æ¡æ£éè®°å½åï¼', 'æç¤º', { |
| | | type: 'warning' |
| | | }).then(() => { |
| | | this.http.post('/api/Outbound/UndoPicking', { |
| | | id: row.id |
| | | }).then(response => { |
| | | if (response.status) { |
| | | this.$message.success('æ¤éæå'); |
| | | this.loadUnpickedData(); |
| | | this.loadPickedData(); |
| | | } else { |
| | | this.$message.error(response.message || 'æ¤é失败'); |
| | | } |
| | | }); |
| | | }).catch(() => {}); |
| | | }) |
| | | |
| | | const response = this.http.post('/api/Outbound/UndoPicking', { |
| | | id: row.id |
| | | }).then(response => { |
| | | if (response.status) { |
| | | this.$message.success('æ¤éæå') |
| | | this.loadUnpickedData() |
| | | this.loadPickedData() |
| | | } else { |
| | | this.$message.error(response.message || 'æ¤é失败') |
| | | } |
| | | }) |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | this.$message.error('æ¤é失败'); |
| | | this.$message.error('æ¤é失败') |
| | | } |
| | | } |
| | | }, |
| | | |
| | | refreshUnpickedTable() { |
| | | if (this.scanForm.palletCode) { |
| | | this.loadPalletData(); |
| | | this.loadPalletData() |
| | | } |
| | | }, |
| | | |
| | | refreshPickedTable() { |
| | | this.loadPickedData().catch(error => { |
| | | console.error('å·æ°å·²æ£éå表失败:', error); |
| | | }); |
| | | console.error('å·æ°å·²æ£éå表失败:', error) |
| | | }) |
| | | }, |
| | | |
| | | resetMaterialBarcode() { |
| | | this.scanForm.materialBarcode = ''; |
| | | this.scanForm.materialBarcode = '' |
| | | this.$nextTick(() => { |
| | | if (this.$refs.materialInput) { |
| | | this.$refs.materialInput.focus(); |
| | | this.$refs.materialInput.focus() |
| | | } |
| | | }); |
| | | }) |
| | | }, |
| | | |
| | | resetForm() { |
| | | this.scanForm.palletCode = ''; |
| | | this.scanForm.materialBarcode = ''; |
| | | this.unpickedData = []; |
| | | this.scanForm.palletCode = '' |
| | | this.scanForm.materialBarcode = '' |
| | | this.unpickedData = [] |
| | | this.$nextTick(() => { |
| | | if (this.$refs.palletInput) { |
| | | this.$refs.palletInput.focus(); |
| | | this.$refs.palletInput.focus() |
| | | } |
| | | }); |
| | | }) |
| | | }, |
| | | |
| | | getUserName() { |
| | | // å°è¯ä» Vuex store è·åç¨æ·å |
| | | if (this.$store && this.$store.state && this.$store.state.userInfo) { |
| | | return this.$store.state.userInfo.userName || this.$store.state.userInfo.username || 'æªç»å½ç¨æ·'; |
| | | return this.$store.state.userInfo.userName || this.$store.state.userInfo.username || 'æªç»å½ç¨æ·' |
| | | } |
| | | |
| | | // å°è¯ä» localStorage è·å |
| | | try { |
| | | const userInfo = localStorage.getItem('user'); |
| | | const userInfo = localStorage.getItem('user') |
| | | if (userInfo) { |
| | | const user = JSON.parse(userInfo); |
| | | return user.userName || user.username || 'æªç»å½ç¨æ·'; |
| | | const user = JSON.parse(userInfo) |
| | | return user.userName || user.username || 'æªç»å½ç¨æ·' |
| | | } |
| | | } catch (error) {} |
| | | } catch (error) { |
| | | } |
| | | |
| | | return 'æªç»å½ç¨æ·'; |
| | | return 'æªç»å½ç¨æ·' |
| | | }, |
| | | |
| | | // 计ç®åæ£æ»æ° |
| | | calculateTotalAssignQuantity() { |
| | | return this.unpickedData.reduce((sum, item) => { |
| | | return sum + (item.assignQuantity || 0); |
| | | }, 0); |
| | | return sum + (item.assignQuantity || 0) |
| | | }, 0) |
| | | }, |
| | | |
| | | // 计ç®å·²åæ£æ»æ° |
| | | calculateTotalSortedQuantity() { |
| | | return this.unpickedData.reduce((sum, item) => { |
| | | return sum + (item.sortedQuantity || 0); |
| | | }, 0); |
| | | return sum + (item.sortedQuantity || 0) |
| | | }, 0) |
| | | }, |
| | | |
| | | // è®¡ç®æªåæ£æ»æ° |
| | | calculateTotalUnsortedQuantity() { |
| | | return this.unpickedData.reduce((sum, item) => { |
| | | const assignQty = item.assignQuantity || 0; |
| | | const sortedQty = item.sortedQuantity || 0; |
| | | return sum + Math.max(0, assignQty - sortedQty); |
| | | }, 0); |
| | | const assignQty = item.assignQuantity || 0 |
| | | const sortedQty = item.sortedQuantity || 0 |
| | | return sum + Math.max(0, assignQty - sortedQty) |
| | | }, 0) |
| | | }, |
| | | |
| | | // æ£æ¥æ¯å¦å
嫿´åº |
| | | hasWholeOut() { |
| | | return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed && !this.orderOver; |
| | | return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed && !this.orderOver |
| | | }, |
| | | |
| | | // 计ç®å©ä½åºå |
| | | calculateRemainingStock(row) { |
| | | const currentStock = row.currentStock || 0 |
| | | const assignQty = row.assignQuantity || 0 |
| | | return Math.max(0, currentStock - assignQty) |
| | | }, |
| | | |
| | | // è·ååºåç¶æç±»å |
| | | getStockStatusType(row) { |
| | | const currentStock = row.currentStock || 0 |
| | | const assignQty = row.assignQuantity || 0 |
| | | const sortedQty = row.sortedQuantity || 0 |
| | | |
| | | if (sortedQty >= assignQty) { |
| | | return 'success' // 已宿 |
| | | } else if (currentStock < assignQty) { |
| | | return 'danger' // åºåä¸è¶³ |
| | | } else { |
| | | return 'warning' // è¿è¡ä¸ |
| | | } |
| | | }, |
| | | |
| | | // è·ååºåç¶æææ¬ |
| | | getStockStatusText(row) { |
| | | const currentStock = row.currentStock || 0 |
| | | const assignQty = row.assignQuantity || 0 |
| | | const sortedQty = row.sortedQuantity || 0 |
| | | |
| | | if (sortedQty >= assignQty) { |
| | | return '已宿' |
| | | } else if (currentStock < assignQty) { |
| | | return 'åºåä¸è¶³' |
| | | } else { |
| | | return '忣ä¸' |
| | | } |
| | | }, |
| | | |
| | | getStatusType(status) { |
| | | const statusMap = { |
| | | 0: 'info', |
| | | 1: 'warning', |
| | | 20: 'primary', |
| | | 30: 'success', |
| | | 40: 'danger' |
| | | }; |
| | | return statusMap[status] || 'info'; |
| | | 0: 'info', // å¾
å¤ç |
| | | 1: 'warning', // è¿è¡ä¸ |
| | | 20: 'primary', // æ£éä¸ |
| | | 30: 'success', // 已宿 |
| | | 40: 'danger' // å¼å¸¸ |
| | | } |
| | | return statusMap[status] || 'info' |
| | | }, |
| | | |
| | | // æ¾ç¤ºå
¨å±é®ç½©å± |
| | | showFullScreenLoading() { |
| | | if (this.loadingInstance) { |
| | | this.loadingInstance.close(); |
| | | this.loadingInstance.close() |
| | | } |
| | | this.loadingInstance = ElLoading.service({ |
| | | lock: true, |
| | | text: 'å¤çä¸...', |
| | | background: 'rgba(0, 0, 0, 0.7)', |
| | | customClass: 'custom-full-loading' |
| | | }); |
| | | }) |
| | | }, |
| | | |
| | | // éèå
¨å±é®ç½©å± |
| | | hideFullScreenLoading() { |
| | | if (this.loadingInstance) { |
| | | this.loadingInstance.close(); |
| | | this.loadingInstance = null; |
| | | this.loadingInstance.close() |
| | | this.loadingInstance = null |
| | | } else { |
| | | } |
| | | }, |
| | | |
| | | // æµè¯é®ç½©å±æ¾ç¤º |
| | | testLoading() { |
| | | // æµè¯ä¸¤ç§æ¹å¼ |
| | | this.globalLoading = true |
| | | // 忶乿µè¯å
¨å±loading |
| | | this.showFullScreenLoading() |
| | | setTimeout(() => { |
| | | this.globalLoading = false |
| | | this.hideFullScreenLoading() |
| | | }, 3000) |
| | | } |
| | | } |
| | | } |
| | |
| | | overflow: hidden; |
| | | } |
| | | |
| | | /* 订åä¿¡æ¯å¡ç */ |
| | | .order-info-card { |
| | | margin-bottom: 20px; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .order-title { |
| | |
| | | letter-spacing: 1px; |
| | | } |
| | | |
| | | /* æ«ç åºå */ |
| | | .scan-section-card { |
| | | margin-bottom: 20px; |
| | | } |
| | |
| | | margin: 0; |
| | | } |
| | | |
| | | /* è¡¨æ ¼åºå */ |
| | | .tables-section { |
| | | margin-top: 20px; |
| | | } |
| | |
| | | border-top: 1px solid #ebeef5; |
| | | } |
| | | |
| | | /* è¡¨æ ¼è¡æ ·å¼ */ |
| | | .el-table tbody tr:hover>td { |
| | | background-color: #f0f9ff !important; |
| | | } |
| | |
| | | background-color: #e1f3ff !important; |
| | | } |
| | | |
| | | /* å¯¹è¯æ¡æ ·å¼ */ |
| | | .confirm-content { |
| | | padding: 20px 0; |
| | | text-align: center; |
| | |
| | | text-align: center; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 1200px) { |
| | | .action-buttons .el-button { |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | |
| | | /* Element UI ç»ä»¶æ ·å¼è¦ç */ |
| | | ::v-deep .el-card__header { |
| | | padding: 18px 20px; |
| | | border-bottom: 1px solid #ebeef5; |
| | |
| | | border: none; |
| | | } |
| | | |
| | | /* 徿 æ ·å¼ */ |
| | | .el-icon-document, |
| | | .el-icon-box, |
| | | .el-icon-s-grid, |
| | |
| | | font-size: 18px; |
| | | } |
| | | |
| | | /* æè¿°åè¡¨æ ·å¼ */ |
| | | ::v-deep .el-descriptions__label { |
| | | font-weight: bold; |
| | | color: #909399; |
| | |
| | | color: #606266; |
| | | } |
| | | |
| | | /* è¡¨æ ¼å¢å¼ºæ ·å¼ */ |
| | | ::v-deep .el-table th { |
| | | background-color: #fafafa; |
| | | font-weight: 600; |
| | |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* æ ç¾æ ·å¼å¢å¼º */ |
| | | ::v-deep .el-tag--small { |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* æç¤ºä¿¡æ¯æ ·å¼å¢å¼º */ |
| | | .scan-alert ::v-deep .el-alert__content { |
| | | width: 100%; |
| | | } |
| | |
| | | margin-top: 8px; |
| | | } |
| | | |
| | | /* 忣ç»è®¡ä¿¡æ¯æ ·å¼ */ |
| | | .picking-stats { |
| | | margin-top: 20px; |
| | | padding: 0 10px; |
| | |
| | | font-size: 14px; |
| | | } |
| | | |
| | | /* åå²çº¿æ ·å¼ */ |
| | | ::v-deep .el-divider__text { |
| | | background-color: #f5f5f5; |
| | | padding: 0 20px; |
| | | } |
| | | |
| | | /* æçåºåä¿¡æ¯æ ·å¼ */ |
| | | .pallet-inventory { |
| | | margin-top: 20px; |
| | | padding: 0 10px; |
| | | } |
| | | |
| | | .inventory-container { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .inventory-table { |
| | | width: 100%; |
| | | } |
| | | |
| | | .inventory-table ::v-deep .el-table__header { |
| | | background-color: #f0f9ff; |
| | | } |
| | | |
| | | .inventory-table ::v-deep .el-table__header th { |
| | | background-color: #e1f3ff; |
| | | color: #1f2937; |
| | | font-weight: 600; |
| | | font-size: 12px; |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | .inventory-table ::v-deep .el-table__body td { |
| | | padding: 6px 0; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .inventory-table ::v-deep .el-table__row { |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .inventory-table ::v-deep .el-table__row:hover { |
| | | background-color: #f0f9ff; |
| | | } |
| | | |
| | | /* åºåè¡¨æ ¼ä¸çæ ç¾æ ·å¼ */ |
| | | .inventory-table ::v-deep .el-tag--mini { |
| | | font-size: 11px; |
| | | padding: 1px 6px; |
| | | height: 18px; |
| | | line-height: 16px; |
| | | } |
| | | |
| | | /* æ´åºç¡®è®¤å¼¹çªæ ·å¼ */ |
| | | ::v-deep .whole-out-dialog { |
| | | border-radius: 8px; |
| | | } |
| | | |
| | | ::v-deep .whole-out-dialog .el-dialog__header { |
| | | background: linear-gradient(135deg, #E6A23C 0%, #d9971a 100%); |
| | | color: white; |
| | | padding: 15px 20px; |
| | | border-radius: 8px 8px 0 0; |
| | | } |
| | | |
| | | ::v-deep .whole-out-dialog .el-dialog__title { |
| | | color: white; |
| | | font-weight: bold; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | ::v-deep .whole-out-dialog .el-dialog__headerbtn .el-dialog__close { |
| | | color: white; |
| | | font-size: 18px; |
| | | } |
| | | |
| | | .whole-out-content { |
| | | padding: 0 10px; |
| | | } |
| | | |
| | | .whole-out-alert { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .whole-out-alert ::v-deep .el-alert__description { |
| | | margin-top: 5px; |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | .info-section { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .section-title { |
| | | color: #303133; |
| | | font-size: 15px; |
| | | font-weight: bold; |
| | | margin-bottom: 10px; |
| | | padding-bottom: 5px; |
| | | border-bottom: 2px solid #E6A23C; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .section-title i { |
| | | margin-right: 8px; |
| | | color: #E6A23C; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: 1fr 1fr; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 8px 0; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .info-item label { |
| | | font-weight: 500; |
| | | color: #606266; |
| | | min-width: 80px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .info-item .info-value { |
| | | color: #303133; |
| | | font-size: 14px; |
| | | flex: 1; |
| | | } |
| | | |
| | | .info-item .info-value.highlight { |
| | | color: #E6A23C; |
| | | font-weight: bold; |
| | | font-size: 15px; |
| | | } |
| | | |
| | | .operation-tip { |
| | | background-color: #fff7e6; |
| | | border: 1px solid #ffd591; |
| | | border-radius: 6px; |
| | | padding: 12px 15px; |
| | | margin-top: 20px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .operation-tip i { |
| | | color: #E6A23C; |
| | | margin-right: 8px; |
| | | font-size: 16px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | .operation-tip span { |
| | | color: #606266; |
| | | font-size: 14px; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | /* ååºå¼è°æ´ */ |
| | | @media (max-width: 768px) { |
| | | .info-grid { |
| | | grid-template-columns: 1fr; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .info-item { |
| | | padding: 6px 0; |
| | | } |
| | | |
| | | .info-item label { |
| | | min-width: 70px; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .info-item .info-value { |
| | | font-size: 13px; |
| | | } |
| | | } |
| | | |
| | | /* Element Plus Loading é®ç½©å±æ ·å¼ä¿®å¤ */ |
| | | ::v-deep .custom-loading { |
| | | background-color: rgba(0, 0, 0, 0.7) !important; |
| | | z-index: 9999 !important; |
| | |
| | | font-size: 16px !important; |
| | | } |
| | | |
| | | /* å
¨å± Loading æ ·å¼ */ |
| | | ::v-deep .el-loading-mask { |
| | | background-color: rgba(0, 0, 0, 0.7) !important; |
| | | z-index: 9999 !important; |
| | |
| | | font-weight: bold !important; |
| | | } |
| | | |
| | | /* å
¨å±Loadingèªå®ä¹æ ·å¼ */ |
| | | ::v-deep .custom-full-loading { |
| | | z-index: 999999 !important; |
| | | } |
| | |
| | | font-size: 18px !important; |
| | | } |
| | | |
| | | /* ç¡®ä¿å¯¹è¯æ¡ä¸ä¼é®çloading */ |
| | | ::v-deep .el-dialog { |
| | | z-index: 2000 !important; |
| | | } |
| | |
| | | ::v-deep .el-dialog__wrapper { |
| | | z-index: 2000 !important; |
| | | } |
| | | |
| | | /* ç¡®ä¿å®¹å¨ç¸å¯¹å®ä½ */ |
| | | .picking-container { |
| | | position: relative !important; |
| | | min-height: 100vh; |
| | | } |
| | | </style> |