refactor: redesign stocktake UI flow to support multi-day sessions and scanner resumption

This commit is contained in:
DXC
2026-03-13 12:02:37 +08:00
parent a8f89517e7
commit 6dc1d69d7d

View File

@ -335,9 +335,9 @@
<template #footer>
<div class="dialog-footer">
<!-- 新增: 补扫入口 -->
<el-button type="primary" plain @click="continueScanning">
📷 发现漏扫继续扫码
<!-- 后悔药返回继续扫码 -->
<el-button type="primary" plain @click="returnToScan">
🔄 返回继续扫码
</el-button>
<el-button @click="showVarianceDialog = false">关闭</el-button>
<el-button type="success" @click="exportToExcel" :icon="Download">导出差异报告</el-button>
@ -527,7 +527,7 @@ const startNewSession = async () => {
} finally { btnLoading.value = false }
}
// ★ 重写: 继续上次盘点 - 直接打开差异列表查看
// ★ 重写: 继续上次盘点 - 恢复扫码作业
const resumeSession = async () => {
btnLoading.value = true
try {
@ -547,12 +547,23 @@ const resumeSession = async () => {
const sessionIds = [...new Set(drafts.map((d: any) => d.session_id))]
currentSessionId.value = sessionIds[0]
// ★ 修改:直接打开差异列表,而不是继续扫码
ElMessage.info('正在加载差异审核...')
showVarianceDialog.value = true
await checkServerDraft()
// 恢复已扫描的数据
const map = new Map<string, number>()
drafts.forEach((d: any) => {
if (d.session_id === currentSessionId.value) {
map.set(d.uuid, d.quantity !== undefined ? parseFloat(d.quantity) : 1)
}
})
scannedMap.value = map
// 加载完整库存数据
await loadData()
// ★ 恢复扫码作业
isSessionActive.value = true
ElMessage.success('已恢复扫码,继续盘点')
} catch (e) {
ElMessage.error('加载失败')
ElMessage.error('恢复失败')
} finally { btnLoading.value = false }
}
@ -562,8 +573,8 @@ const pauseSession = () => {
ElMessage.success('进度已保存')
}
// ★ 新增: 补扫功能 - 从差异面板继续扫码
const continueScanning = () => {
// ★ 后悔药:从差异面板返回继续扫码
const returnToScan = () => {
showVarianceDialog.value = false
isSessionActive.value = true
ElMessage.info('继续扫码,发现漏扫的物料')
@ -849,66 +860,38 @@ const openFinishDialog = () => {
finishStocktake()
}
// ★ 重写: 结束盘点 - 纯前端状态流转,不再调用后端
const finishStocktake = async () => {
// ====== 强制重置状态,防止锁死 ======
console.log('--- [结束盘点] 1. 函数触发,当前状态: ---', {
printing: printing.value,
btnLoading: btnLoading.value,
sessionId: currentSessionId.value,
isSessionActive: isSessionActive.value
})
printing.value = false
btnLoading.value = false
try {
// ★ 二次确认:防止误触
await ElMessageBox.confirm('确认结束当前扫码作业,开始进行差异审核吗?', '结束盘点确认', {
confirmButtonText: '确定结束',
cancelButtonText: '继续扫码',
type: 'warning'
})
console.log('--- [结束盘点] 2. 用户确认结束盘点 ---')
printing.value = true
console.log('--- [结束盘点] 3. 开始调用 API, session_id:', currentSessionId.value)
// 调用结束盘点 API
const res: any = await api.finishStocktake()
console.log('--- [结束盘点] 5. API 返回:', res)
// 结束会话
scannedMap.value.clear()
isSessionActive.value = false
showFinishDialog.value = false
console.log('--- [结束盘点] 4. 会话已清理 ---')
// 刷新服务器草稿计数
await checkServerDraft()
console.log('--- [结束盘点] 5. 草稿计数已刷新 ---')
ElMessage.success('盘点已结束,请查看差异报告进行审核')
console.log('--- [结束盘点] 6. 成功提示已显示 ---')
// ====== 强行打开差异审核对话框 ======
console.log('--- [结束盘点] 7. 准备打开差异面板 ---')
showVarianceDialog.value = true
console.log('--- [结束盘点] 8. showVarianceDialog 已设为 true ---')
await ElMessageBox.confirm(
'确认仓库已全部盘点完毕,结束当前扫码并开始核对差异吗?',
'结束盘点确认',
{
confirmButtonText: '确定结束',
cancelButtonText: '继续扫码',
type: 'warning'
}
)
// 用户确认后,执行 UI 状态流转
btnLoading.value = true
await checkServerDraft() // 确保最新数据
isSessionActive.value = false // 收起扫码面板
showFinishDialog.value = false
ElMessage.success('盘点扫描结束,请核对差异')
await openVarianceDialog() // 自动弹出差异审核列表
} catch (e: any) {
console.error('--- [结束盘点] 捕获异常:', e)
// 判断用户取消
if (e === 'cancel' || String(e).includes('cancel')) {
console.log('--- [结束盘点] 用户取消操作 ---')
if (e === 'cancel' || e === 'close' || String(e).includes('cancel')) {
// 用户取消,停留在扫码界面继续盘点
return
}
// 其他错误需要提示用户
const errMsg = e?.message || e?.data?.message || String(e) || '结束盘点失败'
console.error('--- [结束盘点] 错误详情:', errMsg)
ElMessage.error(errMsg)
ElMessage.error(e?.message || '操作失败')
} finally {
printing.value = false
btnLoading.value = false
console.log('--- [结束盘点] 9. finally 块执行完成loading 已重置 ---')
}
}