<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>
|