|
|
|
@ -87,9 +87,9 @@ |
|
|
|
<div class="detail-label">申请物料行号</div> |
|
|
|
<div class="detail-value">{{ material.bomItemNo }}</div> |
|
|
|
</div> |
|
|
|
<div class="detail-item"> |
|
|
|
<div class="detail-label">单位</div> |
|
|
|
<div class="detail-value">{{ material.uom || "个" }}</div> |
|
|
|
<div :class="['detail-item', { 'issued-qty-highlight': (material.qtyIssuedHis || 0) > 0 }]"> |
|
|
|
<div class="detail-label">已发数量</div> |
|
|
|
<div class="detail-value">{{ material.qtyIssuedHis || 0 }}</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -239,10 +239,106 @@ export default { |
|
|
|
}); |
|
|
|
}, |
|
|
|
|
|
|
|
// 保存页面状态到sessionStorage(仅用于从详情页返回时恢复) |
|
|
|
savePageStateForDetail() { |
|
|
|
const state = { |
|
|
|
searchCode: this.searchCode, |
|
|
|
currentNotifyNo: this.currentNotifyNo, |
|
|
|
outboundList: this.outboundList, |
|
|
|
// 保存选中工单的唯一标识:notifyNo + itemNo + soorderNo |
|
|
|
selectedWorkOrderKey: this.selectedWorkOrder ? { |
|
|
|
notifyNo: this.selectedWorkOrder.notifyNo, |
|
|
|
itemNo: this.selectedWorkOrder.itemNo, |
|
|
|
soorderNo: this.selectedWorkOrder.soorderNo || this.selectedWorkOrder.orderNo |
|
|
|
} : null, |
|
|
|
materialList: this.materialList, |
|
|
|
showOnlySelected: this.showOnlySelected, |
|
|
|
}; |
|
|
|
sessionStorage.setItem('productionPicking_state_fromDetail', JSON.stringify(state)); |
|
|
|
}, |
|
|
|
|
|
|
|
// 从sessionStorage恢复页面状态(仅当从详情页返回时) |
|
|
|
restorePageStateFromDetail() { |
|
|
|
try { |
|
|
|
const shouldRestore = sessionStorage.getItem('productionPicking_shouldRestore'); |
|
|
|
const savedState = sessionStorage.getItem('productionPicking_state_fromDetail'); |
|
|
|
|
|
|
|
if (shouldRestore === 'true' && savedState) { |
|
|
|
const state = JSON.parse(savedState); |
|
|
|
this.searchCode = state.searchCode || ''; |
|
|
|
this.currentNotifyNo = state.currentNotifyNo || ''; |
|
|
|
this.outboundList = state.outboundList || []; |
|
|
|
this.materialList = state.materialList || []; |
|
|
|
this.showOnlySelected = state.showOnlySelected || false; |
|
|
|
|
|
|
|
// 恢复选中状态:从outboundList中找到对应的工单对象 |
|
|
|
// 使用 notifyNo + itemNo + soorderNo 来精确匹配 |
|
|
|
if (state.selectedWorkOrderKey && this.outboundList.length > 0) { |
|
|
|
const key = state.selectedWorkOrderKey; |
|
|
|
// 兼容旧数据格式(只有工单号的字符串) |
|
|
|
if (typeof key === 'string') { |
|
|
|
const matchedWorkOrder = this.outboundList.find(wo => |
|
|
|
(wo.orderNo || wo.soorderNo) === key |
|
|
|
); |
|
|
|
this.selectedWorkOrder = matchedWorkOrder || null; |
|
|
|
} else { |
|
|
|
// 新格式:使用对象包含 notifyNo、itemNo、soorderNo |
|
|
|
const matchedWorkOrder = this.outboundList.find(wo => |
|
|
|
wo.notifyNo === key.notifyNo && |
|
|
|
wo.itemNo === key.itemNo && |
|
|
|
(wo.soorderNo || wo.orderNo) === key.soorderNo |
|
|
|
); |
|
|
|
if (matchedWorkOrder) { |
|
|
|
this.selectedWorkOrder = matchedWorkOrder; |
|
|
|
} else { |
|
|
|
this.selectedWorkOrder = null; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
this.selectedWorkOrder = null; |
|
|
|
} |
|
|
|
|
|
|
|
// 更新已发数量:如果有本次扫描的数量,更新对应物料的已发数量 |
|
|
|
const issueInfoStr = sessionStorage.getItem('productionPicking_issueInfo'); |
|
|
|
if (issueInfoStr) { |
|
|
|
try { |
|
|
|
const issueInfo = JSON.parse(issueInfoStr); |
|
|
|
// 在materialList中找到对应的物料并更新已发数量 |
|
|
|
const material = this.materialList.find(m => |
|
|
|
m.partNo === issueInfo.componentPartNo && |
|
|
|
m.bomItemNo === issueInfo.lineItemNo |
|
|
|
); |
|
|
|
if (material) { |
|
|
|
// 更新已发数量 = 原已发数量 + 本次扫描数量 |
|
|
|
material.qtyIssuedHis = (material.qtyIssuedHis || 0) + (issueInfo.issueQty || 0); |
|
|
|
} |
|
|
|
// 清除本次扫描信息 |
|
|
|
sessionStorage.removeItem('productionPicking_issueInfo'); |
|
|
|
} catch (error) { |
|
|
|
console.error('解析本次扫描信息失败:', error); |
|
|
|
sessionStorage.removeItem('productionPicking_issueInfo'); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 清除标记 |
|
|
|
sessionStorage.removeItem('productionPicking_shouldRestore'); |
|
|
|
sessionStorage.removeItem('productionPicking_state_fromDetail'); |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
console.error('恢复页面状态失败:', error); |
|
|
|
// 清除可能损坏的数据 |
|
|
|
sessionStorage.removeItem('productionPicking_shouldRestore'); |
|
|
|
sessionStorage.removeItem('productionPicking_state_fromDetail'); |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
// 跳转到领料页面 |
|
|
|
goToPickingPage(item) { |
|
|
|
console.log("选中物料:", item, this.selectedWorkOrder); |
|
|
|
|
|
|
|
// 跳转前保存当前页面状态(用于从详情页返回时恢复) |
|
|
|
this.savePageStateForDetail(); |
|
|
|
|
|
|
|
this.$router.push({ |
|
|
|
name: 'productionPickingDetail', |
|
|
|
query: { |
|
|
|
@ -251,6 +347,7 @@ export default { |
|
|
|
orderNo: this.selectedWorkOrder.soorderNo, |
|
|
|
componentPartNo: item.partNo, |
|
|
|
qtyToIssue: item.requestQty, |
|
|
|
itemNo: this.selectedWorkOrder.itemNo, |
|
|
|
lineItemNo: item.bomItemNo, |
|
|
|
releaseNo: this.selectedWorkOrder.releaseNo, |
|
|
|
sequenceNo: this.selectedWorkOrder.sequenceNo, |
|
|
|
@ -261,6 +358,10 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
mounted() { |
|
|
|
// 检查是否从详情页返回,如果是则恢复状态 |
|
|
|
const hasRestored = sessionStorage.getItem('productionPicking_shouldRestore') === 'true'; |
|
|
|
this.restorePageStateFromDetail(); |
|
|
|
|
|
|
|
// 聚焦搜索框 |
|
|
|
this.$nextTick(() => { |
|
|
|
if (this.$refs.searchInput) { |
|
|
|
@ -268,8 +369,10 @@ export default { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
// 加载数据 |
|
|
|
this.loadOutboundList(); |
|
|
|
// 如果没有恢复状态,才加载数据(恢复状态时已经包含了数据) |
|
|
|
if (!hasRestored) { |
|
|
|
this.loadOutboundList(); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
</script> |
|
|
|
@ -446,6 +549,13 @@ export default { |
|
|
|
color: #333; |
|
|
|
} |
|
|
|
|
|
|
|
/* 已发数量高亮样式 */ |
|
|
|
.detail-item.issued-qty-highlight .detail-label, |
|
|
|
.detail-item.issued-qty-highlight .detail-value { |
|
|
|
font-weight: bold; |
|
|
|
color: #ff0000; |
|
|
|
} |
|
|
|
|
|
|
|
/* 空状态 */ |
|
|
|
.empty-state { |
|
|
|
display: flex; |
|
|
|
|