You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
468 lines
12 KiB
468 lines
12 KiB
<template>
|
|
<div>
|
|
<div class="pda-container">
|
|
<!-- 头部栏 - rqrq -->
|
|
<div class="header-bar">
|
|
<div class="header-left" @click="handleBack">
|
|
<i class="el-icon-arrow-left"></i>
|
|
<span>取消WCS组盘任务</span>
|
|
</div>
|
|
<div class="header-right" @click="$router.push({ path: '/' })">
|
|
首页
|
|
</div>
|
|
</div>
|
|
|
|
<div class="table-body" style="max-height: 600px; overflow-y: auto;">
|
|
<div class="main-content form-section">
|
|
<!-- 栈板扫描 - rqrq -->
|
|
<div class="input-group">
|
|
<label class="input-label">栈板编码</label>
|
|
<el-input
|
|
v-model="palletCode"
|
|
placeholder="请扫描栈板编码"
|
|
class="form-input"
|
|
clearable
|
|
@keyup.enter.native="handlePalletScan"
|
|
inputmode="none"
|
|
autocomplete="off"
|
|
autocorrect="off"
|
|
spellcheck="false"
|
|
ref="palletInput"
|
|
/>
|
|
</div>
|
|
|
|
<!-- 栈板信息显示(扫描栈板后显示)- rqrq -->
|
|
<div v-if="palletScanned" class="pallet-info-section">
|
|
|
|
<div class="info-row">
|
|
<label class="info-label">是否被调用:</label>
|
|
<span class="info-value" :style="{color: palletInfo.callingFlag === 'Y' ? '#F56C6C' : '#67C23A'}">
|
|
{{ palletInfo.callingFlag === 'Y' ? '是' : '否' }}
|
|
</span>
|
|
</div>
|
|
|
|
<!-- 是否发送组盘任务 - rqrq -->
|
|
<div class="info-row">
|
|
<label class="info-label">是否已组盘:</label>
|
|
<span class="info-value" :style="{color: hasSentWcsTask ? '#F56C6C' : '#67C23A'}">
|
|
{{ hasSentWcsTask ? '是' : '否' }}
|
|
</span>
|
|
</div>
|
|
|
|
<!-- 浏览明细按钮 - rqrq -->
|
|
<div class="button-row">
|
|
<button class="action-btn primary" @click="showDetailModal" style="width: 100%;">
|
|
浏览明细 ({{ detailList.length }}条)
|
|
</button>
|
|
</div>
|
|
|
|
<!-- 取消组盘按钮(只有发送了组盘任务才显示)- rqrq -->
|
|
<div v-if="showCancelButton" class="button-row">
|
|
<button
|
|
class="action-btn primary"
|
|
@click="handleCancelWcsPallet"
|
|
:disabled="cancelLoading"
|
|
style="width: 100%;">
|
|
{{ cancelLoading ? '取消中...' : '取消组盘' }}
|
|
</button>
|
|
</div>
|
|
|
|
<!-- 移出全部物料按钮(只有未发送组盘任务且未被调用且有明细才显示)- rqrq -->
|
|
<div v-if="showRemoveAllButton" class="button-row">
|
|
<button
|
|
class="action-btn warning"
|
|
@click="handleRemoveAllMaterials"
|
|
:disabled="removeAllLoading"
|
|
style="width: 100%;">
|
|
{{ removeAllLoading ? '移出中...' : '移出全部物料' }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 浏览明细弹窗 - rqrq -->
|
|
<el-dialog
|
|
:title="'栈板明细 (共'+detailList.length+'条)'"
|
|
:visible.sync="detailModalVisible"
|
|
width="90%"
|
|
:close-on-click-modal="false"
|
|
:show-close="false"
|
|
:modal="true"
|
|
:modal-append-to-body="true"
|
|
:append-to-body="true"
|
|
>
|
|
<div class="table-body" style="max-height: 400px; overflow-y: auto;">
|
|
<div class="detail-table">
|
|
<div class="table-header">
|
|
<div class="col-position">位置</div>
|
|
<div class="col-layer">层数</div>
|
|
<div class="col-serial">标签号</div>
|
|
</div>
|
|
<div
|
|
v-for="(detail, index) in detailList"
|
|
:key="index"
|
|
class="table-row"
|
|
>
|
|
<div class="col-position">{{ detail.position }}</div>
|
|
<div class="col-layer">{{ detail.layer }}</div>
|
|
<div class="col-serial">{{ detail.serialNo }}</div>
|
|
</div>
|
|
<!-- 暂无数据提示 -->
|
|
<div v-if="detailList.length === 0" class="table-row empty-row">
|
|
<div class="empty-hint">暂无栈板明细数据</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div slot="footer" class="dialog-footer">
|
|
<button class="action-btn secondary" @click="detailModalVisible=false">关闭</button>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
getPalletDetails
|
|
} from '../../../api/automatedWarehouse/palletPacking'
|
|
import {
|
|
checkPalletWcsStatus,
|
|
cancelWcsPallet,
|
|
removeAllPalletDetails
|
|
} from '../../../api/automatedWarehouse/cancelWcsPallet'
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
site: localStorage.getItem('site'),
|
|
|
|
// 栈板信息 - rqrq
|
|
palletCode: '',
|
|
palletScanned: false,
|
|
palletInfo: {
|
|
callingFlag: '',
|
|
canOperate: '',
|
|
isEmpty: ''
|
|
},
|
|
|
|
// 按钮显示控制 - rqrq
|
|
hasSentWcsTask: false,
|
|
showCancelButton: false,
|
|
showRemoveAllButton: false,
|
|
|
|
// 栈板明细 - rqrq
|
|
detailList: [],
|
|
detailModalVisible: false,
|
|
|
|
// 加载状态 - rqrq
|
|
cancelLoading: false,
|
|
removeAllLoading: false
|
|
};
|
|
},
|
|
methods: {
|
|
// 返回上一页 - rqrq
|
|
handleBack() {
|
|
this.$router.back();
|
|
},
|
|
|
|
// 扫描栈板 - rqrq
|
|
handlePalletScan() {
|
|
if (!this.palletCode.trim()) {
|
|
this.$message.error('请输入栈板编码');
|
|
return;
|
|
}
|
|
|
|
checkPalletWcsStatus({
|
|
site: this.site,
|
|
palletId: this.palletCode
|
|
}).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
// 后端返回正确的6位栈板码,赋值给输入框 - rqrq
|
|
this.palletCode = data.row.palletId;
|
|
|
|
// 保存栈板信息 - rqrq
|
|
this.palletInfo = data.row;
|
|
this.palletScanned = true;
|
|
|
|
// 解析按钮显示逻辑 - rqrq
|
|
// canOperate字段存储showCancelButton(是否显示取消组盘按钮)- rqrq
|
|
this.showCancelButton = data.row.canOperate === 'Y';
|
|
|
|
// isEmpty字段存储showRemoveAllButton(是否显示移出全部物料按钮)- rqrq
|
|
this.showRemoveAllButton = data.row.isEmpty === 'Y';
|
|
|
|
// 计算hasSentWcsTask(是否发送组盘任务)用于显示 - rqrq
|
|
this.hasSentWcsTask = this.showCancelButton;
|
|
|
|
// 加载栈板明细 - rqrq
|
|
this.loadPalletDetails();
|
|
|
|
} else {
|
|
this.$alert(data.msg || '栈板不存在', '错误', {
|
|
confirmButtonText: '确定',
|
|
callback: () => {
|
|
this.palletCode = '';
|
|
this.$nextTick(() => {
|
|
if (this.$refs.palletInput) {
|
|
this.$refs.palletInput.focus();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}).catch(error => {
|
|
console.error('查询栈板失败:', error);
|
|
this.$alert(error.message || '查询栈板失败', '错误', {
|
|
confirmButtonText: '确定',
|
|
callback: () => {
|
|
this.palletCode = '';
|
|
this.$nextTick(() => {
|
|
if (this.$refs.palletInput) {
|
|
this.$refs.palletInput.focus();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
// 加载栈板明细 - rqrq
|
|
loadPalletDetails() {
|
|
getPalletDetails({
|
|
site: this.site,
|
|
palletId: this.palletCode,
|
|
position: '',
|
|
layer: ''
|
|
}).then(({ data }) => {
|
|
if (data.code === 0) {
|
|
this.detailList = data.details || [];
|
|
} else {
|
|
this.detailList = [];
|
|
}
|
|
}).catch(error => {
|
|
console.error('获取栈板明细失败:', error);
|
|
this.detailList = [];
|
|
});
|
|
},
|
|
|
|
// 显示明细弹窗 - rqrq
|
|
showDetailModal() {
|
|
this.detailModalVisible = true;
|
|
},
|
|
|
|
// 取消组盘 - rqrq
|
|
handleCancelWcsPallet() {
|
|
this.$confirm('确定要取消组盘吗?取消后需要重新组盘才能推送到WCS。', '确认操作', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.cancelLoading = true;
|
|
|
|
cancelWcsPallet({
|
|
site: this.site,
|
|
palletId: this.palletCode
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('取消组盘成功');
|
|
// 重新扫描刷新信息 - rqrq
|
|
this.handlePalletScan();
|
|
} else {
|
|
this.$alert(data.msg || '取消组盘失败', '错误');
|
|
}
|
|
}).catch(error => {
|
|
console.error('取消组盘失败:', error);
|
|
this.$message.error(error.message || '取消组盘失败');
|
|
}).finally(() => {
|
|
this.cancelLoading = false;
|
|
});
|
|
}).catch(() => {
|
|
// 用户取消操作
|
|
});
|
|
},
|
|
|
|
// 移出全部物料 - rqrq
|
|
handleRemoveAllMaterials() {
|
|
this.$confirm('确定要移出栈板上的全部物料吗?此操作不可恢复!', '确认操作', {
|
|
confirmButtonText: '确定',
|
|
cancelButtonText: '取消',
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.removeAllLoading = true;
|
|
|
|
removeAllPalletDetails({
|
|
site: this.site,
|
|
palletId: this.palletCode
|
|
}).then(({ data }) => {
|
|
if (data && data.code === 0) {
|
|
this.$message.success('移出全部物料成功');
|
|
// 重新扫描刷新信息 - rqrq
|
|
this.handlePalletScan();
|
|
} else {
|
|
this.$alert(data.msg || '移出全部物料失败', '错误');
|
|
}
|
|
}).catch(error => {
|
|
console.error('移出全部物料失败:', error);
|
|
this.$message.error(error.message || '移出全部物料失败');
|
|
}).finally(() => {
|
|
this.removeAllLoading = false;
|
|
});
|
|
}).catch(() => {
|
|
// 用户取消操作
|
|
});
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$nextTick(() => {
|
|
if (this.$refs.palletInput) {
|
|
this.$refs.palletInput.focus();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* 栈板信息区域 - rqrq */
|
|
.pallet-info-section {
|
|
margin-top: 16px;
|
|
padding: 12px;
|
|
background: #f5f7fa;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.info-row {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 8px 0;
|
|
border-bottom: 1px solid #e4e7ed;
|
|
}
|
|
|
|
.info-row:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.info-label {
|
|
font-weight: bold;
|
|
color: #606266;
|
|
width: 140px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.info-value {
|
|
color: #303133;
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.button-row {
|
|
margin-top: 12px;
|
|
}
|
|
|
|
/* 警告按钮 - rqrq */
|
|
.action-btn.warning {
|
|
background-color: #E6A23C;
|
|
color: white;
|
|
border: none;
|
|
padding: 10px 20px;
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.action-btn.warning:hover {
|
|
background-color: #d99525;
|
|
}
|
|
|
|
.action-btn.warning:disabled {
|
|
background-color: #f5dab1;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
/* 表格样式 - rqrq */
|
|
.detail-table {
|
|
background: white;
|
|
border-radius: 6px;
|
|
overflow: hidden;
|
|
border: 1px solid #e0e0e0;
|
|
}
|
|
|
|
.table-header,
|
|
.table-row {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 8px;
|
|
border-bottom: 1px solid #e0e0e0;
|
|
}
|
|
|
|
.table-header {
|
|
background: #f5f5f5;
|
|
font-weight: bold;
|
|
font-size: 14px;
|
|
}
|
|
|
|
.table-row {
|
|
font-size: 13px;
|
|
}
|
|
|
|
.table-row:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.col-position {
|
|
flex: 1;
|
|
text-align: center;
|
|
}
|
|
|
|
.col-layer {
|
|
flex: 1;
|
|
text-align: center;
|
|
}
|
|
|
|
.col-serial {
|
|
flex: 4;
|
|
text-align: center;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* 空数据提示 - rqrq */
|
|
.empty-hint {
|
|
text-align: center;
|
|
color: #999;
|
|
padding: 20px;
|
|
background: white;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
/* 空数据行样式 - rqrq */
|
|
.empty-row {
|
|
justify-content: center;
|
|
align-items: center;
|
|
padding: 20px;
|
|
border-bottom: none;
|
|
}
|
|
|
|
.empty-row .empty-hint {
|
|
text-align: center;
|
|
color: #999;
|
|
width: 100%;
|
|
}
|
|
|
|
.dialog-footer {
|
|
display: flex;
|
|
gap: 8px;
|
|
text-align: center;
|
|
}
|
|
|
|
/* 修复模态框层级问题 - rqrq */
|
|
::v-deep .el-dialog__wrapper {
|
|
z-index: 2000 !important;
|
|
}
|
|
|
|
::v-deep .el-overlay {
|
|
z-index: 2000 !important;
|
|
}
|
|
</style>
|
|
|
|
|