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