647556386
3 天以前 696edbff3c8812e4b820f624d66a02ae6ddb1a06
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/views/outbound/outPicking.vue
@@ -214,6 +214,19 @@
                            <el-table-column prop="createDate" label="拣选时间" width="160" />
                            <el-table-column prop="originalBarcode" label="原物料码" width="160" />
                            <el-table-column prop="newBarcode" label="新物料码" width="160" />
                            <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">
@@ -376,7 +389,8 @@
            loadingInstance: null,
            // éŸ³é¢‘实例(缓存,避免重复创建)
            successAudio: null,
            errorAudio: null
            errorAudio: null,
            reverseLoading: false
        }
    },
    computed: {
@@ -412,7 +426,6 @@
            }
        },
        // ============== æ–°å¢žï¼šæ ¹æ®æ‰˜ç›˜å·èŽ·å–è®¢å•å·ï¼ˆæ ¸å¿ƒåŠŸèƒ½ï¼‰ ==============
        async getOrderNoByPallet(palletCode) {
            if (!palletCode) {
                this.$message.warning('托盘号不能为空');
@@ -433,6 +446,12 @@
                    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) {
@@ -440,12 +459,18 @@
                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() {
@@ -473,14 +498,7 @@
        initPage() {
            // ä»Žè·¯ç”±å‚数获取订单号
            this.orderNo = this.$route.query.orderNo || ''
            // ============== å¾®è°ƒï¼šæ³¨é‡Šå¼ºåˆ¶è¿”回逻辑,兼容托盘号查订单号 ==============
            // if (!this.orderNo) {
            //     this.$message.error('订单号不能为空')
            //     this.$router.back()
            //     return
            // }
            // ============== å¾®è°ƒç»“束 ==============
            // åŠ è½½è®¢å•ä¿¡æ¯
            this.loadOrderInfo()
@@ -663,6 +681,13 @@
            if (!palletCode) {
                return;
            }
            this.$nextTick(() => {
        if (this.$refs.palletInput) {
            this.$refs.palletInput.focus();
            this.$refs.palletInput.select(); // é€‰ä¸­å…¨éƒ¨å†…容
        }
    });
            // å…ˆæ ¹æ®æ‰˜ç›˜å·èŽ·å–è®¢å•å·
            this.getOrderNoByPallet(palletCode).then((orderNo) => {
                if (orderNo) {
@@ -673,6 +698,55 @@
                }
                this.loadPalletData(flag);
            });
        },
        async handleReversePicking(row) {
            // 1. äºŒæ¬¡ç¡®è®¤
            try {
                await this.$confirm(
                    '确定要撤销这条拣选记录吗?撤销后库存将恢复,出库单状态也会同步更新',
                    '撤销确认',
                    {
                        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('撤销拣选成功');
                    this.playSuccessAudio(); // æ’­æ”¾æˆåŠŸéŸ³é¢‘
                    // åˆ·æ–°æ•°æ®åˆ—表
                    await this.loadPalletData(false);
                } else {
                    this.$message.error(response.message || '撤销拣选失败');
                    this.playErrorAudio();
                }
            } catch (error) {
                // å–消确认不报错
                if (error !== 'cancel') {
                    this.$message.error('撤销拣选失败:' + (error.message || '网络异常'));
                    this.playErrorAudio();
                }
            } finally {
                this.reverseLoading = false;
                this.hideFullScreenLoading();
            }
        },
        handleMaterialScan() {
@@ -718,10 +792,12 @@
                    await this.loadPalletData(false)
                } else {
                    this.$message.error(response.message || '拣选确认失败')
                    this.scanForm.materialBarcode = '';
                    this.playErrorAudio()
                }
            } catch (error) {
                this.$message.error('拣选确认失败')
                this.scanForm.materialBarcode = '';
                this.playErrorAudio()
            } finally {
                this.confirmLoading = false