feat: upgrade adjustment workflow to require explicit inbound SKU or outbound tracking number and fix UTC timezone issue

This commit is contained in:
DXC
2026-03-19 15:26:40 +08:00
parent ae63748060
commit 6cc3d1b6e0
4 changed files with 167 additions and 3 deletions

View File

@ -95,6 +95,7 @@
<el-option label="销售出库" value="SALES" />
<el-option label="内部领用" value="USE" />
<el-option label="调拨出库" value="TRANSFER" />
<el-option label="盘亏出库" value="LOSS" />
</el-select>
</el-form-item>
</el-col>

View File

@ -43,6 +43,18 @@
</template>
</el-table-column>
<el-table-column prop="reason" label="调整原因" min-width="150" show-overflow-tooltip />
<el-table-column prop="linked_sku" label="关联SKU" width="120" show-overflow-tooltip>
<template #default="{ row }">
<span v-if="row.adjust_type === 'profit'">{{ row.linked_sku || '-' }}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="linked_outbound_no" label="关联出库单" width="140" show-overflow-tooltip>
<template #default="{ row }">
<span v-if="row.adjust_type === 'loss'">{{ row.linked_outbound_no || '-' }}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" />
<el-table-column prop="status" label="状态" width="90" align="center">
<template #default="{ row }">
@ -52,6 +64,14 @@
</template>
</el-table-column>
<el-table-column prop="create_time" label="创建时间" width="160" />
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button v-if="row.status === 'pending' && userStore.hasPermission('stock_adjustment:operation')" type="primary" link @click="openProcessDialog(row)">
处理
</el-button>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
@ -173,6 +193,30 @@
</el-button>
</template>
</el-dialog>
<!-- 处理调整单弹窗 -->
<el-dialog v-model="showProcessDialog" title="处理调整单" width="500px" :close-on-click-modal="false">
<el-form label-width="120px">
<el-form-item label="调整单号">
<el-input v-model="processForm.order_no" disabled />
</el-form-item>
<el-form-item label="调整类型">
<el-tag :type="processForm.adjust_type === 'profit' ? 'success' : 'danger'">
{{ processForm.adjust_type === 'profit' ? '盘盈' : '盘亏' }}
</el-tag>
</el-form-item>
<el-form-item :label="processForm.adjust_type === 'profit' ? '关联入库SKU' : '关联出库单号'">
<el-input
v-model="processForm.linked_value"
:placeholder="processForm.adjust_type === 'profit' ? '请输入已入库的SKU' : '请输入对应的出库单号'"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showProcessDialog = false">取消</el-button>
<el-button type="primary" @click="handleProcessSubmit" :loading="processLoading">确认处理</el-button>
</template>
</el-dialog>
</div>
</template>
@ -233,6 +277,68 @@ const selectedReviewRows = ref<any[]>([])
const reviewTableRef = ref()
const importLoading = ref(false)
// 处理调整单
const showProcessDialog = ref(false)
const processLoading = ref(false)
const processForm = ref({
id: null as number | null,
order_no: '',
adjust_type: '',
linked_value: ''
})
// 打开处理弹窗
function openProcessDialog(row: any) {
processForm.value = {
id: row.id,
order_no: row.order_no,
adjust_type: row.adjust_type,
linked_value: ''
}
showProcessDialog.value = true
}
// 提交处理
async function handleProcessSubmit() {
if (!processForm.value.id) return
if (processForm.value.adjust_type === 'profit' && !processForm.value.linked_value) {
ElMessage.warning('请输入已入库的SKU')
return
}
if (processForm.value.adjust_type === 'loss' && !processForm.value.linked_value) {
ElMessage.warning('请输入对应的出库单号')
return
}
processLoading.value = true
try {
const data: any = {}
if (processForm.value.adjust_type === 'profit') {
data.linked_sku = processForm.value.linked_value
} else {
data.linked_outbound_no = processForm.value.linked_value
}
const res = await request({
url: `/v1/stock/adjustment/${processForm.value.id}/process`,
method: 'post',
data
})
if (res.code === 200) {
ElMessage.success('处理成功')
showProcessDialog.value = false
fetchData()
} else {
ElMessage.error(res.msg || '处理失败')
}
} catch (e) {
ElMessage.error('处理失败')
} finally {
processLoading.value = false
}
}
// 获取盘点差异列表
async function fetchReviewList() {
reviewLoading.value = true