feat: refactor stocktake import flow to use a preview-and-select dialog
This commit is contained in:
@ -130,6 +130,49 @@
|
||||
style="margin-top: 15px; justify-content: center"
|
||||
/>
|
||||
</el-dialog>
|
||||
|
||||
<!-- 盘点差异审核弹窗 -->
|
||||
<el-dialog v-model="showReviewDialog" title="盘点差异审核" width="1200px" :close-on-click-modal="false">
|
||||
<div v-loading="reviewLoading">
|
||||
<el-table :data="reviewList" border stripe ref="reviewTableRef" @selection-change="handleReviewSelectionChange">
|
||||
<el-table-column type="selection" width="50" />
|
||||
<el-table-column prop="sku" label="SKU" width="140" />
|
||||
<el-table-column prop="material_name" label="物料名称" min-width="150" show-overflow-tooltip />
|
||||
<el-table-column prop="spec_model" label="规格" width="120" show-overflow-tooltip />
|
||||
<el-table-column prop="warehouse_location" label="库位" width="100" />
|
||||
<el-table-column prop="stock_qty" label="账面数" width="80" align="center" />
|
||||
<el-table-column prop="quantity" label="实盘数" width="80" align="center" />
|
||||
<el-table-column prop="diff_qty" label="差异数" width="80" align="center">
|
||||
<template #default="{ row }">
|
||||
<span :style="{ color: row.diff_qty > 0 ? '#67C23A' : '#F56C6C', fontWeight: 'bold' }">
|
||||
{{ row.diff_qty > 0 ? '+' : '' }}{{ row.diff_qty }}
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="adjust_type" label="类型" width="80" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.adjust_type === 'profit' ? 'success' : 'danger'" size="small">
|
||||
{{ row.adjust_type === 'profit' ? '盘盈' : '盘亏' }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="reason" label="调整原因" min-width="180">
|
||||
<template #default="{ row }">
|
||||
<el-input v-model="row.reason" placeholder="请输入调整原因" size="small" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div v-if="reviewList.length === 0" style="text-align: center; padding: 40px; color: #909399">
|
||||
暂无盘点差异记录
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<el-button @click="showReviewDialog = false">取消</el-button>
|
||||
<el-button type="primary" :disabled="selectedReviewRows.length === 0" @click="handleImportSelected" :loading="importLoading">
|
||||
勾选导入 ({{ selectedReviewRows.length }})
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -182,6 +225,80 @@ const stockLimit = ref(20)
|
||||
const stockKeyword = ref('')
|
||||
const selectedStock = ref<any>(null)
|
||||
|
||||
// 盘点差异审核
|
||||
const showReviewDialog = ref(false)
|
||||
const reviewLoading = ref(false)
|
||||
const reviewList = ref<any[]>([])
|
||||
const selectedReviewRows = ref<any[]>([])
|
||||
const reviewTableRef = ref()
|
||||
const importLoading = ref(false)
|
||||
|
||||
// 获取盘点差异列表
|
||||
async function fetchReviewList() {
|
||||
reviewLoading.value = true
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/v1/stock/adjustment/stocktake-discrepancies',
|
||||
method: 'get'
|
||||
})
|
||||
if (res.code === 200) {
|
||||
// 为每条记录设置默认原因
|
||||
reviewList.value = (res.data.items || []).map((item: any) => ({
|
||||
...item,
|
||||
reason: item.remark || '盘点差异导入'
|
||||
}))
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error('获取盘点差异失败')
|
||||
} finally {
|
||||
reviewLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 打开审核弹窗
|
||||
async function openReviewDialog() {
|
||||
showReviewDialog.value = true
|
||||
selectedReviewRows.value = []
|
||||
await fetchReviewList()
|
||||
}
|
||||
|
||||
// 勾选变化
|
||||
function handleReviewSelectionChange(rows: any[]) {
|
||||
selectedReviewRows.value = rows
|
||||
}
|
||||
|
||||
// 导入选中的记录
|
||||
async function handleImportSelected() {
|
||||
if (selectedReviewRows.value.length === 0) {
|
||||
ElMessage.warning('请选择要导入的记录')
|
||||
return
|
||||
}
|
||||
|
||||
importLoading.value = true
|
||||
try {
|
||||
const records = selectedReviewRows.value.map(row => ({
|
||||
draft_id: row.draft_id,
|
||||
reason: row.reason || '盘点差异导入'
|
||||
}))
|
||||
const res = await request({
|
||||
url: '/v1/stock/adjustment/import-from-stocktake',
|
||||
method: 'post',
|
||||
data: { records }
|
||||
})
|
||||
if (res.code === 200) {
|
||||
ElMessage.success(res.msg || '导入成功')
|
||||
showReviewDialog.value = false
|
||||
fetchData()
|
||||
} else {
|
||||
ElMessage.error(res.msg || '导入失败')
|
||||
}
|
||||
} catch (e) {
|
||||
ElMessage.error('导入失败')
|
||||
} finally {
|
||||
importLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 获取列表
|
||||
async function fetchData() {
|
||||
loading.value = true
|
||||
@ -297,29 +414,9 @@ async function submitForm() {
|
||||
}
|
||||
}
|
||||
|
||||
// 一键引入盘点差异
|
||||
// 一键引入盘点差异 - 打开审核弹窗
|
||||
async function handleImportStocktake() {
|
||||
try {
|
||||
await ElMessageBox.confirm('确定要将当前所有的盘点差异导入为盘盈盘亏单吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
const res = await request({
|
||||
url: '/v1/stock/adjustment/import-from-stocktake',
|
||||
method: 'post'
|
||||
})
|
||||
if (res.code === 200) {
|
||||
ElMessage.success(`成功导入 ${res.data.count} 条盘点差异记录`)
|
||||
fetchData()
|
||||
} else {
|
||||
ElMessage.error(res.msg || '导入失败')
|
||||
}
|
||||
} catch (e) {
|
||||
if (e !== 'cancel') {
|
||||
ElMessage.error('导入失败')
|
||||
}
|
||||
}
|
||||
await openReviewDialog()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
Reference in New Issue
Block a user