heshaofeng
2026-03-09 557f7f6079c30cd6fe8d6005cea3d89468bbcd31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<template>
    <!-- 全局遮罩层:在请求处理时显示 -->
    <div class="mask-layer" v-if="loading"></div>
    
    <vol-box v-model="show" title="直接出库" :width="800" :height="1200">
        <template #content>
            <el-form ref="form" :model="form" label-width="90px">
                <el-form-item label="出库区域:">
                    <el-select v-model="station" placeholder="请选择出库区域">
                        <el-option v-for="item in stations" :key="item.key" :label="item.label" :value="item.value">
                        </el-option>
                    </el-select>
                </el-form-item>
            </el-form>
            <el-form ref="form" :model="form" label-width="90px" v-if="isBatch === 1">
                <el-form-item label="出库数量:">
                    <el-input-number v-model="outboundQuantity" :controls="true" placeholder="请选择出库数量"
                        style="width: 100%;"></el-input-number>
                </el-form-item>
            </el-form>
        </template>
        <template #footer>
            <div>
                <el-button type="danger" size="small" plain @click="submit" :loading="loading">
                    <i class="el-icon-check">确认</i>
                </el-button>
                <el-button size="small" type="primary" plain @click="() => { this.show = false }">
                    <i class="el-icon-close">关闭</i>
                </el-button>
            </div>
        </template>
    </vol-box>
</template>
  
<script>
import VolBox from '@/components/basic/VolBox.vue'
import { stationManager, STATION_STORAGE_KEY } from "@/../src/uitils/stationManager";
export default {
    components: {
        'vol-box': VolBox
    },
    data() {
        return {
            outboundQuantity: 1,
            show: false,
            stations: [
                { label: "站台2", value: "2-1" },
                { label: "站台3", value: "3-1" },
            ],
            station: stationManager.getStation(),
            orderNo: "",
            keys: [],
            isBatch: "",
            loading: false, // 控制遮罩和按钮加载状态
            form: {} // 补充原代码中未定义的form
        }
    },
    methods: {
        open(params) {
            this.show = true,
                this.orderNo = params.orderNo,
                this.keys = params.detailIds,
                this.isBatch = params.isBatch
            if (params.isBatch == 1) {
                this.outboundQuantity = params.outboundQuantity
            }
        },
        submit() {
            // 验证必填项
            if (!this.station) {
                this.$message.warning("请选择出库区域");
                return;
            }
            if (this.isBatch === 1 && !this.outboundQuantity) {
                this.$message.warning("请填写出库数量");
                return;
            }
            
            this.loading = true; // 打开遮罩和加载状态
            this.$emit('parentCall', ($vue) => {
                const requestParams = {
                    detailIds: this.keys,
                    OutboundTargetLocation: this.station,
                    outboundQuantity: this.keys.length > 1 ? 1 : this.outboundQuantity,
                    operator: "",
                    orderNo: this.orderNo,
                    stockDetailIds:[]
                };
                console.log(requestParams);
                this.http.post("api/Outbound/ProcessPickingOutbound", requestParams, '数据处理中...')
                    .then((x) => {
                        this.loading = false; // 关闭遮罩和加载状态
                        if (!x.status) {
                            this.$message.error(x.message)
                        } else {
                            this.show = false
                            this.$message.success(x.message) // 修正$Message为$message
                            
                            // 修复核心:安全调用refresh方法
                            if ($vue && typeof $vue.refresh === 'function') {
                                $vue.refresh();
                            } else {
                                // 备选方案:如果父组件没有refresh方法,触发自定义事件通知刷新
                                this.$emit('needRefresh');
                                console.warn('父组件未定义refresh方法,已触发needRefresh事件');
                            }
                        }
                    })
                    .catch((error) => {
                        this.loading = false; // 异常时也要关闭遮罩
                        this.$message.error("请求失败:" + (error.message || "未知错误"));
                        console.error("请求异常:", error);
                    })
            })
        },
    }
}
</script>
 
<style scoped>
/* 遮罩层样式 */
.mask-layer {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色遮罩 */
    z-index: 9999; /* 确保遮罩在最上层(高于弹窗) */
    display: flex;
    justify-content: center;
    align-items: center;
    pointer-events: auto; /* 阻止点击遮罩下方的内容 */
}
 
/* 加载动画 */
.mask-layer::after {
    content: "";
    width: 40px;
    height: 40px;
    border: 4px solid #ffffff;
    border-top: 4px solid #409eff;
    border-radius: 50%;
    animation: spin 1s linear infinite;
}
 
@keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
}
</style>