|
@@ -1,5 +1,5 @@
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { computed, onMounted, reactive, ref } from 'vue'
|
|
|
|
|
|
|
+import { computed, nextTick, onMounted, reactive, ref } from 'vue'
|
|
|
import { useRoute } from 'vue-router'
|
|
import { useRoute } from 'vue-router'
|
|
|
import { Plus, Tickets } from '@element-plus/icons-vue'
|
|
import { Plus, Tickets } from '@element-plus/icons-vue'
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
@@ -126,7 +126,8 @@ const reverseRules = computed<FormRules>(() => ({
|
|
|
quantity: [{ required: true, type: 'integer', min: 1, max: reverseMax.value, message: `冲销数量须为 1 至 ${reverseMax.value} 的整数`, trigger: 'change' }],
|
|
quantity: [{ required: true, type: 'integer', min: 1, max: reverseMax.value, message: `冲销数量须为 1 至 ${reverseMax.value} 的整数`, trigger: 'change' }],
|
|
|
evidence: [{ required: true, type: 'array', min: 1, message: '请上传照片 / 凭证', trigger: 'change' }],
|
|
evidence: [{ required: true, type: 'array', min: 1, message: '请上传照片 / 凭证', trigger: 'change' }],
|
|
|
}))
|
|
}))
|
|
|
-function validateReverseEvidence() {
|
|
|
|
|
|
|
+async function validateReverseEvidence() {
|
|
|
|
|
+ await nextTick()
|
|
|
void reverseFormRef.value?.validateField('evidence').catch(() => false)
|
|
void reverseFormRef.value?.validateField('evidence').catch(() => false)
|
|
|
}
|
|
}
|
|
|
const orderName = (value: string) => ({ internal: '内部订单', external: '外部订单' }[value] || '待填写')
|
|
const orderName = (value: string) => ({ internal: '内部订单', external: '外部订单' }[value] || '待填写')
|
|
@@ -135,7 +136,7 @@ const entrySku = (entry: Entry) => entry.snapshot
|
|
|
const attachments = (entry: Entry) => [...entry.orderEvidence, ...entry.evidence, ...entry.screenshots]
|
|
const attachments = (entry: Entry) => [...entry.orderEvidence, ...entry.evidence, ...entry.screenshots]
|
|
|
const canReverse = (entry: OutboundEntry) => entry.status === 'completed' && entry.alreadyReversedQty < Number(entry.quantity)
|
|
const canReverse = (entry: OutboundEntry) => entry.status === 'completed' && entry.alreadyReversedQty < Number(entry.quantity)
|
|
|
const reversalStatus = (entry: OutboundEntry) => entry.alreadyReversedQty === 0 ? '未冲销' : entry.alreadyReversedQty >= Number(entry.quantity) ? '已全部冲销' : '部分冲销'
|
|
const reversalStatus = (entry: OutboundEntry) => entry.alreadyReversedQty === 0 ? '未冲销' : entry.alreadyReversedQty >= Number(entry.quantity) ? '已全部冲销' : '部分冲销'
|
|
|
-const logisticsText = (entry: Entry) => entry.orderType === 'internal' ? '—' : entry.logistics === 'express' ? [entry.company, entry.tracking].filter(Boolean).join(' · ') || '待填写' : entry.screenshots.length ? `${logisticsName(entry.logistics)} · 物流截图` : '待填写'
|
|
|
|
|
|
|
+const logisticsText = (entry: Entry) => entry.orderType === 'internal' ? '—' : entry.logistics === 'express' ? [entry.company, entry.tracking].filter(Boolean).join(' · ') || '待填写' : logisticsName(entry.logistics)
|
|
|
onMounted(async () => { try { await loadData(); if (route.query.new) open() } catch (error) { report(error) } })
|
|
onMounted(async () => { try { await loadData(); if (route.query.new) open() } catch (error) { report(error) } })
|
|
|
function filterRows() { applied.value = { ...filters, dates: [...(filters.dates || [])] }; page.value = 1; loadData().catch(report) }
|
|
function filterRows() { applied.value = { ...filters, dates: [...(filters.dates || [])] }; page.value = 1; loadData().catch(report) }
|
|
|
async function fetchDetail(entry: OutboundEntry) {
|
|
async function fetchDetail(entry: OutboundEntry) {
|
|
@@ -292,7 +293,7 @@ async function submitReverse() {
|
|
|
<div><label>{{ detail.direction === 'outbound' ? '出库数量' : '入库数量' }}</label><div class="outbound-readonly">{{ detail.quantity }} {{ entrySku(detail)?.spec }}</div></div>
|
|
<div><label>{{ detail.direction === 'outbound' ? '出库数量' : '入库数量' }}</label><div class="outbound-readonly">{{ detail.quantity }} {{ entrySku(detail)?.spec }}</div></div>
|
|
|
<div v-if="detail.source === 'normal'"><label>订单类型</label><div class="outbound-readonly">{{ orderName(detail.orderType) }}</div></div>
|
|
<div v-if="detail.source === 'normal'"><label>订单类型</label><div class="outbound-readonly">{{ orderName(detail.orderType) }}</div></div>
|
|
|
</div>
|
|
</div>
|
|
|
- <template v-if="detail.orderType === 'internal' && detail.source === 'normal'"><div class="outbound-evidence-label">内部订单追溯信息</div><div class="outbound-evidence"><el-icon><Tickets /></el-icon><span>内部订单:{{ detail.so }};内部订单不展示物流、照片/凭证</span></div></template>
|
|
|
|
|
|
|
+ <template v-if="detail.orderType === 'internal' && detail.source === 'normal'"><div class="outbound-evidence-label">内部订单追溯信息</div><div class="outbound-evidence"><el-icon><Tickets /></el-icon><span>内部订单:{{ detail.so }}</span></div></template>
|
|
|
<template v-else>
|
|
<template v-else>
|
|
|
<div class="outbound-evidence-label">{{ detail.source === 'normal' ? '订单凭证 / 物流截图' : '冲销凭证' }}</div>
|
|
<div class="outbound-evidence-label">{{ detail.source === 'normal' ? '订单凭证 / 物流截图' : '冲销凭证' }}</div>
|
|
|
<div class="outbound-evidence">
|
|
<div class="outbound-evidence">
|