From 696edbff3c8812e4b820f624d66a02ae6ddb1a06 Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期四, 16 四月 2026 13:40:18 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
---
项目代码/WIDESEA_WMSClient/src/views/outbound/outPicking.vue | 401 +++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 275 insertions(+), 126 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
index 75de823..2ce2088 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WIDESEA_WMSClient/src/views/outbound/outPicking.vue"
@@ -9,10 +9,10 @@
<i class="el-icon-document"></i>
<span class="order-label">璁㈠崟鍙凤細</span>
<span class="order-value">{{ orderNo }}</span>
+ <span class="order-label" style="margin-left: 20px;">浜х嚎鍚嶇О锛�</span>
+ <span class="order-value">{{ orderInfo?.departmentName || '' }}</span>
</div>
<div class="order-status">
- <!-- 娴嬭瘯鎸夐挳 -->
-
<el-tag v-if="orderInfo" :type="getStatusType(orderInfo.orderStatus)" size="medium"
style="margin-left: 10px;">
{{ orderInfo.statusName || '杩涜涓�' }}
@@ -40,8 +40,8 @@
<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" clearable @keyup.enter="handlePalletScan">
+ <el-input ref="palletInput" v-model="scanForm.palletCode" placeholder="璇锋壂鎻忔墭鐩樼爜" size="large"
+ clearable @keyup.enter="handlePalletScan">
<template #prefix>
<i class="el-icon-box"></i>
</template>
@@ -157,14 +157,6 @@
</el-table-column>
<el-table-column prop="unit" label="鍗曚綅" width="60" />
<el-table-column prop="locationCode" label="搴撲綅" />
- <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
- <template #default="scope">
- <el-button type="text" size="small" @click="quickPick(scope.row)"
- :disabled="!scanForm.palletCode">
- 鎷i��
- </el-button>
- </template>
- </el-table-column> -->
</el-table>
<div class="table-footer">
@@ -222,13 +214,19 @@
<el-table-column prop="createDate" label="鎷i�夋椂闂�" width="160" />
<el-table-column prop="originalBarcode" label="鍘熺墿鏂欑爜" width="160" />
<el-table-column prop="newBarcode" label="鏂扮墿鏂欑爜" width="160" />
- <!-- <el-table-column label="鎿嶄綔" width="80" align="center">
- <template #default="scope">
- <el-button type="text" size="small" @click="undoPick(scope.row)">
- 鎾ら攢
- </el-button>
- </template>
- </el-table-column> -->
+ <el-table-column label="鎿嶄綔" width="100" align="center">
+ <template #default="scope">
+ <el-button
+ type="danger"
+ size="small"
+ icon="el-icon-refresh-left"
+ @click="handleReversePicking(scope.row)"
+ :disabled="reverseLoading"
+ >
+ 鎾ら攢
+ </el-button>
+ </template>
+ </el-table-column>
</el-table>
<div class="table-footer">
@@ -244,53 +242,6 @@
</el-card>
</el-col>
</el-row>
-
- <!-- 鎵樼洏鐗╂枡搴撳瓨淇℃伅 -->
- <!-- <div class="pallet-inventory" v-if="scanForm.palletCode && unpickedData.length > 0">
- <el-divider content-position="left">
- <span style="color: #67C23A; font-size: 14px;">
- <i class="el-icon-goods"></i> 鎵樼洏鐗╂枡搴撳瓨淇℃伅
- </span>
- </el-divider>
- <div class="inventory-container">
- <el-table :data="unpickedData" size="small" :show-header="true" :border="true" stripe
- highlight-current-row max-height="200" class="inventory-table">
- <el-table-column type="index" label="搴忓彿" width="50" align="center" />
- <el-table-column prop="materielCode" label="鐗╂枡缂栫爜" width="100" show-overflow-tooltip />
- <el-table-column prop="materielName" label="鐗╂枡鍚嶇О" width="120" show-overflow-tooltip />
- <el-table-column prop="batchNo" label="鎵规鍙�" width="90" />
- <el-table-column label="褰撳墠搴撳瓨" width="80" align="right">
- <template #default="scope">
- <el-text type="primary" tag="b">{{ scope.row.currentStock || 0 }}</el-text>
- </template>
- </el-table-column>
- <el-table-column label="鍒嗘嫞鏁伴噺" width="80" align="right">
- <template #default="scope">
- <el-text type="warning">{{ scope.row.assignQuantity }}</el-text>
- </template>
- </el-table-column>
- <el-table-column label="宸插垎鎷�" width="70" align="right">
- <template #default="scope">
- <el-text type="success">{{ scope.row.sortedQuantity || 0 }}</el-text>
- </template>
- </el-table-column>
- <el-table-column label="鍓╀綑搴撳瓨" width="80" align="right">
- <template #default="scope">
- <el-text type="info">{{ calculateRemainingStock(scope.row) }}</el-text>
- </template>
- </el-table-column>
- <el-table-column prop="unit" label="鍗曚綅" width="100" align="center" />
- <el-table-column prop="locationCode" label="搴撲綅" width="150" />
- <el-table-column label="鐘舵��" width="80" align="center">
- <template #default="scope">
- <el-tag :type="getStockStatusType(scope.row)" size="mini">
- {{ getStockStatusText(scope.row) }}
- </el-tag>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </div> -->
</div>
<print-view ref="printView" @parentcall="parentcall"></print-view>
@@ -311,8 +262,8 @@
</el-dialog>
<!-- 鏁村嚭纭瀵硅瘽妗� -->
- <el-dialog v-model="wholeOutDialogVisible" title="鏁村嚭鎿嶄綔纭" width="500px"
- :before-close="handleWholeOutDialogClose" custom-class="whole-out-dialog" style="margin-right: 0px;">
+ <el-dialog v-model="wholeOutDialogVisible" title="鏁村嚭鎿嶄綔纭" width="500px" :before-close="handleWholeOutDialogClose"
+ custom-class="whole-out-dialog" style="margin-right: 0px;">
<div class="whole-out-content" v-if="wholeOutInfo">
<!-- 璀﹀憡鎻愮ず -->
<el-alert title="璇ユ墭鐩樺寘鍚渶瑕佹暣鍑虹殑鐗╂枡" type="warning" :closable="false" show-icon class="whole-out-alert">
@@ -361,7 +312,7 @@
<div class="info-item">
<label>鏁村嚭鏁伴噺锛�</label>
<span class="info-value highlight">{{ wholeOutInfo.assignQuantity }} {{ wholeOutInfo.unit
- }}</span>
+ }}</span>
</div>
<div class="info-item">
<label>褰撳墠搴撳瓨锛�</label>
@@ -391,10 +342,13 @@
</template>
<script>
-
import printView from "@/extension/outbound/extend/printView.vue"
import { stationManager, STATION_STORAGE_KEY } from "@/../src/uitils/stationManager";
import { ElLoading } from 'element-plus'
+
+// 瀵煎叆闊抽鏂囦欢锛堥�傞厤src/assets鐩綍锛寃ebpack鑷姩澶勭悊锛�
+const successAudioSrc = require('@/assets/audio/success.mp3');
+const errorAudioSrc = require('@/assets/audio/error.mp3');
export default {
components: { printView },
@@ -432,7 +386,11 @@
wholeOutDialogVisible: false,
wholeOutInfo: null,
globalLoading: false,
- loadingInstance: null
+ loadingInstance: null,
+ // 闊抽瀹炰緥锛堢紦瀛橈紝閬垮厤閲嶅鍒涘缓锛�
+ successAudio: null,
+ errorAudio: null,
+ reverseLoading: false
}
},
computed: {
@@ -442,17 +400,105 @@
},
mounted() {
this.initPage()
+ // 鍒濆鍖栭煶棰戝疄渚嬶紙鎳掑姞杞斤紝浠呭垱寤轰竴娆★級
+ this.initAudioInstance()
+ },
+ beforeDestroy() {
+ // 閿�姣侀煶棰戝疄渚嬶紝閲婃斁璧勬簮
+ this.successAudio = null
+ this.errorAudio = null
},
methods: {
+ // 鍒濆鍖栭煶棰戝疄渚嬶紙鏍稿績锛氶�傞厤src/assets璺緞锛岀紦瀛樺疄渚嬶級
+ initAudioInstance() {
+ // 鎴愬姛闊抽瀹炰緥
+ if (!this.successAudio) {
+ this.successAudio = new Audio(successAudioSrc)
+ this.successAudio.onerror = (err) => {
+ console.error('銆愭垚鍔熼煶棰戙�戝姞杞藉け璐�', err)
+ }
+ }
+ if (!this.errorAudio) {
+ this.errorAudio = new Audio(errorAudioSrc)
+ this.errorAudio.onerror = (err) => {
+ console.error('銆愰敊璇煶棰戙�戝姞杞藉け璐�', err)
+ }
+ }
+ },
+
+ 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);
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus();
+ this.$refs.palletInput.select(); // 閫変腑鍏ㄩ儴鍐呭
+ }
+ });
+ return null;
+ }
+ } catch (error) {
+ this.playErrorAudio();
+ const errorMsg = `鑾峰彇璁㈠崟鍙峰紓甯革細${error.message || '缃戠粶閿欒'}`;
+ this.$message.error(errorMsg);
+ console.error("銆愭墭鐩樺彿鏌ヨ鍗曞彿鎺ュ彛寮傚父銆�", error);
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus();
+ this.$refs.palletInput.select(); // 閫変腑鍏ㄩ儴鍐呭
+ }
+ });
+ return null;
+ } finally {
+ this.hideFullScreenLoading();
+ }
+ },
+
+
+ // 鎾斁鎴愬姛闊抽
+ playSuccessAudio() {
+ try {
+ // 閲嶇疆鎾斁杩涘害锛堥伩鍏嶉噸澶嶆挱鏀炬椂闊抽鏈粨鏉燂級
+ this.successAudio.currentTime = 0
+ // 鎾斁锛堝吋瀹规祻瑙堝櫒鑷姩鎾斁绛栫暐闄愬埗锛�
+ this.successAudio.play().catch((err) => {
+ console.warn('鎴愬姛闊抽鎾斁澶辫触锛堟祻瑙堝櫒鑷姩鎾斁绛栫暐闄愬埗锛�', err)
+ })
+ } catch (err) {
+ console.error('鎾斁鎴愬姛闊抽寮傚父', err)
+ }
+ },
+ playErrorAudio() {
+ try {
+ this.errorAudio.currentTime = 0
+ this.errorAudio.play().catch((err) => {
+ console.warn('閿欒闊抽鎾斁澶辫触锛堟祻瑙堝櫒鑷姩鎾斁绛栫暐闄愬埗锛�', err)
+ })
+ } catch (err) {
+ console.error('鎾斁閿欒闊抽寮傚父', err)
+ }
+ },
initPage() {
// 浠庤矾鐢卞弬鏁拌幏鍙栬鍗曞彿
this.orderNo = this.$route.query.orderNo || ''
- if (!this.orderNo) {
- this.$message.error('璁㈠崟鍙蜂笉鑳戒负绌�')
- this.$router.back()
- return
- }
-
+
// 鍔犺浇璁㈠崟淇℃伅
this.loadOrderInfo()
@@ -499,42 +545,81 @@
}
},
loadUnpickedData() {
- return new Promise((resolve, reject) => {
- this.http.post(`/api/Outbound/QueryPickingTasks?orderNo=${this.orderNo}&palletCode=${this.scanForm.palletCode}`, {}).then(response => {
- if (response.status) {
- if (response.data.outStockLockInfos.length > 0) {
- this.unpickedData = response.data.outStockLockInfos;
- this.matMixed = response.data.isMatMixed;
- this.calculateUnpickedStats()
- // 妫�鏌ユ槸鍚﹂渶瑕佹暣鍑虹‘璁�
- this.$nextTick(() => {
- if (this.hasWholeOut()) {
- this.showWholeOutConfirm()
- }
- })
- // 鑷姩鑱氱劍鍒扮墿鏂欐潯鐮佽緭鍏ユ
- this.$nextTick(() => {
- if (this.$refs.materialInput) {
- this.$refs.materialInput.focus()
- }
- })
- } else {
- if (flag) {
- this.$message.warning('璇ユ墭鐩樻棤鏈嫞閫変换鍔�')
- }
- this.unpickedData = []
+ 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.$nextTick(() => {
+ if (this.hasWholeOut()) {
+ this.showWholeOutConfirm()
}
- resolve()
- } else {
- this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
- this.unpickedData = []
- reject(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
- }
- }).catch(error => {
- reject(error)
- })
- })
- },
+ })
+
+ // 鑱氱劍鐗╂枡鏉$爜杈撳叆妗�
+ this.$nextTick(() => {
+ if (this.$refs.materialInput) {
+ this.$refs.materialInput.focus()
+ }
+ })
+ }
+ // 鎯呭喌2锛氭棤鏈嫞閫夋暟鎹�
+ else {
+ this.unpickedData = [];
+ this.calculateUnpickedStats(); // 閲嶇疆缁熻鏁版嵁
+
+ // 鍙嬪ソ鎻愮ず + 浜や簰浼樺寲
+ this.$message.success({
+ message: `鎵樼洏銆�${this.scanForm.palletCode}銆戝凡鎷i�夊畬鎴愶紝鏆傛棤鎷i�夎褰昤,
+ duration: 3000, // 鎻愮ず鏄剧ず3绉�
+ showClose: true // 鍏佽鎵嬪姩鍏抽棴
+ });
+
+ // 娓呯┖鐗╂枡鏉$爜骞惰仛鐒﹀洖鎵樼洏鐮佽緭鍏ユ
+ this.scanForm.materialBarcode = '';
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus();
+ }
+ });
+ }
+ resolve();
+ }
+ // 鎯呭喌3锛氭帴鍙h繑鍥炲け璐�
+ 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) => {
@@ -545,8 +630,10 @@
this.calculatePickedStats()
} else {
this.pickedData = []
+
}
resolve()
+
} else {
this.$message.error(response.message || '鑾峰彇鎵樼洏鏁版嵁澶辫触')
this.pickedData = []
@@ -590,10 +677,75 @@
},
handlePalletScan(flag = true) {
- if (this.scanForm.palletCode) {
- // this.$message.success(`鎵樼洏鐮�: ${this.scanForm.palletCode}`)
- this.loadPalletData(flag)
- } else {
+ const palletCode = this.scanForm.palletCode.trim();
+ if (!palletCode) {
+ return;
+ }
+
+ this.$nextTick(() => {
+ if (this.$refs.palletInput) {
+ this.$refs.palletInput.focus();
+ this.$refs.palletInput.select(); // 閫変腑鍏ㄩ儴鍐呭
+ }
+ });
+ // 鍏堟牴鎹墭鐩樺彿鑾峰彇璁㈠崟鍙�
+ this.getOrderNoByPallet(palletCode).then((orderNo) => {
+ if (orderNo) {
+ // 璧嬪�艰鍗曞彿锛屼緵鍚庣画閫昏緫浣跨敤
+ this.orderNo = orderNo;
+ // 鍒锋柊璁㈠崟淇℃伅
+ this.loadOrderInfo();
+ }
+ this.loadPalletData(flag);
+ });
+ },
+
+ async handleReversePicking(row) {
+ // 1. 浜屾纭
+ try {
+ await this.$confirm(
+ '纭畾瑕佹挙閿�杩欐潯鎷i�夎褰曞悧锛熸挙閿�鍚庡簱瀛樺皢鎭㈠锛屽嚭搴撳崟鐘舵�佷篃浼氬悓姝ユ洿鏂�',
+ '鎾ら攢纭',
+ {
+ type: 'warning',
+ confirmButtonText: '纭鎾ら攢',
+ cancelButtonText: '鍙栨秷',
+ closeOnClickModal: false
+ }
+ );
+
+ // 2. 鎵ц鎾ら攢
+ this.reverseLoading = true;
+ this.showFullScreenLoading();
+
+ // 3. 璋冪敤鎾ら攢鎺ュ彛锛堥�傞厤浣犲悗绔殑鎾ら攢鎺ュ彛鍦板潃锛�
+ const response = await this.http.post('/api/Outbound/ReversePickingWithBarcode', {
+ Barcode: row.originalBarcode || row.newBarcode, // 浼樺厛鍙栧師鏉$爜锛屾棤鍒欏彇鏂版潯鐮�
+ OrderNo: this.orderNo,
+ PalletCode: row.palletCode || this.scanForm.palletCode,
+ Operator: this.getUserName(),
+ OrderType: this.orderInfo?.orderType || 0 // 璁㈠崟绫诲瀷锛屾棤鍒欎紶0
+ });
+
+ // 4. 澶勭悊缁撴灉
+ if (response.status) {
+ this.$message.success('鎾ら攢鎷i�夋垚鍔�');
+ this.playSuccessAudio(); // 鎾斁鎴愬姛闊抽
+ // 鍒锋柊鏁版嵁鍒楄〃
+ await this.loadPalletData(false);
+ } else {
+ this.$message.error(response.message || '鎾ら攢鎷i�夊け璐�');
+ this.playErrorAudio();
+ }
+ } catch (error) {
+ // 鍙栨秷纭涓嶆姤閿�
+ if (error !== 'cancel') {
+ this.$message.error('鎾ら攢鎷i�夊け璐ワ細' + (error.message || '缃戠粶寮傚父'));
+ this.playErrorAudio();
+ }
+ } finally {
+ this.reverseLoading = false;
+ this.hideFullScreenLoading();
}
},
@@ -634,15 +786,19 @@
this.$refs.printView.open(response.data.scannedDetail.materialCodes);
}
this.$message.success('鎷i�夌‘璁ゆ垚鍔�')
+ // 鎺ュ彛鎴愬姛锛氭挱鏀炬垚鍔熼煶棰�
+ this.playSuccessAudio()
this.resetMaterialBarcode()
- // this.loadUnpickedData()
- // this.loadPickedData()
await this.loadPalletData(false)
} else {
this.$message.error(response.message || '鎷i�夌‘璁ゅけ璐�')
+ this.scanForm.materialBarcode = '';
+ this.playErrorAudio()
}
} catch (error) {
this.$message.error('鎷i�夌‘璁ゅけ璐�')
+ this.scanForm.materialBarcode = '';
+ this.playErrorAudio()
} finally {
this.confirmLoading = false
this.hideFullScreenLoading()
@@ -694,8 +850,6 @@
this.$message.success('鎿嶄綔鎴愬姛')
this.confirmDialogVisible = false
this.resetForm()
- // this.loadUnpickedData()
- // this.loadPickedData()
} else {
this.$message.error(response.message || '鎿嶄綔澶辫触')
}
@@ -801,11 +955,6 @@
}
},
- // handleUnpickedRowClick(row) {
- // // 鐐瑰嚮鏈嫞閫夎鏃惰嚜鍔ㄥ~鍏呯墿鏂欐潯鐮�
- // this.scanForm.materialBarcode = row.materielCode
- // },
-
refreshUnpickedTable() {
if (this.scanForm.palletCode) {
this.loadPalletData()
@@ -882,7 +1031,7 @@
// 妫�鏌ユ槸鍚﹀寘鍚暣鍑�
hasWholeOut() {
- return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed;
+ return this.unpickedData.some(item => item.assignQuantity === item.originalQuantity) && !this.matMixed && !this.orderOver
},
// 璁$畻鍓╀綑搴撳瓨
--
Gitblit v1.9.3