|
|
@@ -1,5 +1,5 @@
|
|
|
|
<script setup lang="ts">
|
|
|
|
<script setup lang="ts">
|
|
|
|
import { computed, nextTick, onMounted, reactive, ref, watch } from 'vue'
|
|
|
|
import { computed, nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'
|
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
|
import { ArrowLeft, Download, Eye, Plus, Printer, Search, Trash2, Upload } from '@lucide/vue'
|
|
|
|
import { ArrowLeft, Download, Eye, Plus, Printer, Search, Trash2, Upload } from '@lucide/vue'
|
|
|
|
import SingleLineText from '@/components/common/SingleLineText.vue'
|
|
|
|
import SingleLineText from '@/components/common/SingleLineText.vue'
|
|
|
@@ -40,7 +40,7 @@ const configs: Record<ServiceType, ServiceConfig> = {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const config = computed(() => configs[props.service])
|
|
|
|
const config = computed(() => configs[props.service])
|
|
|
|
const statusOptions = computed(() => props.service === 'labeling'
|
|
|
|
const statusOptions = computed(() => props.service === 'labeling'
|
|
|
|
? [{ label: '待处理', value: 'PENDING_PROCESSING' }, { label: '处理中', value: 'PROCESSING' }, { label: '待客户确认', value: 'CUSTOMER_CONFIRM_PENDING' }, { label: '待出库', value: 'READY_FOR_OUTBOUND' }, { label: '已完成', value: 'COMPLETED' }, { label: '已拒绝', value: 'REJECTED' }, { label: '已取消', value: 'CANCELLED' }]
|
|
|
|
? [{ label: '待处理', value: 'PENDING_PROCESSING' }, { label: '处理中', value: 'PROCESSING' }, { label: '换标完成', value: 'COMPLETED' }]
|
|
|
|
: props.service === 'disposal'
|
|
|
|
: props.service === 'disposal'
|
|
|
|
? [{ label: '待审核', value: 'PENDING_REVIEW' }, { label: '待 PDA 废弃', value: 'APPROVED' }, { label: '待仓库确认完成', value: 'PDA_COMPLETED' }, { label: '已完成', value: 'COMPLETED' }, { label: '已拒绝', value: 'REJECTED' }, { label: '已取消', value: 'CANCELLED' }]
|
|
|
|
? [{ label: '待审核', value: 'PENDING_REVIEW' }, { label: '待 PDA 废弃', value: 'APPROVED' }, { label: '待仓库确认完成', value: 'PDA_COMPLETED' }, { label: '已完成', value: 'COMPLETED' }, { label: '已拒绝', value: 'REJECTED' }, { label: '已取消', value: 'CANCELLED' }]
|
|
|
|
: [{ label: '待审核', value: 'PENDING_REVIEW' }, { label: '已通过', value: 'APPROVED' }, { label: '待分配', value: 'PENDING_ASSIGNMENT' }, { label: '已分配', value: 'ALLOCATED' }, { label: '已出库', value: 'OUTBOUNDED' }, { label: '部分收货', value: 'PARTIALLY_RECEIVED' }, { label: '已收货', value: 'RECEIVED' }, { label: '已拒绝', value: 'REJECTED' }])
|
|
|
|
: [{ label: '待审核', value: 'PENDING_REVIEW' }, { label: '已通过', value: 'APPROVED' }, { label: '待分配', value: 'PENDING_ASSIGNMENT' }, { label: '已分配', value: 'ALLOCATED' }, { label: '已出库', value: 'OUTBOUNDED' }, { label: '部分收货', value: 'PARTIALLY_RECEIVED' }, { label: '已收货', value: 'RECEIVED' }, { label: '已拒绝', value: 'REJECTED' }])
|
|
|
@@ -69,9 +69,17 @@ const labelingModeHint = computed(() => labelingMode.value === 'carton'
|
|
|
|
? '只替换箱内商品 SKU 标签,保留原箱唛;同一箱唛可以添加多条 SKU 明细。'
|
|
|
|
? '只替换箱内商品 SKU 标签,保留原箱唛;同一箱唛可以添加多条 SKU 明细。'
|
|
|
|
: '同一箱同时替换商品 SKU 标签和外箱箱唛;同一箱唛的多条 SKU 使用同一个新 FBA 箱唛和目的仓。')
|
|
|
|
: '同一箱同时替换商品 SKU 标签和外箱箱唛;同一箱唛的多条 SKU 使用同一个新 FBA 箱唛和目的仓。')
|
|
|
|
const submittedRows = ref<Record<string, string>[]>([])
|
|
|
|
const submittedRows = ref<Record<string, string>[]>([])
|
|
|
|
|
|
|
|
const page = ref(1)
|
|
|
|
|
|
|
|
const pageSize = ref(15)
|
|
|
|
|
|
|
|
const total = ref(0)
|
|
|
|
interface ServiceDetail extends Record<string, unknown> { transferNo?: string; status?: string; estimatedShipAt?: string; actualShipAt?: string; cartons?: TransferCarton[] }
|
|
|
|
interface ServiceDetail extends Record<string, unknown> { transferNo?: string; status?: string; estimatedShipAt?: string; actualShipAt?: string; cartons?: TransferCarton[] }
|
|
|
|
const selectedDetail = ref<ServiceDetail | null>(null)
|
|
|
|
const selectedDetail = ref<ServiceDetail | null>(null)
|
|
|
|
const selectedRelabelDetail = ref<RelabelDetail | null>(null)
|
|
|
|
const selectedRelabelDetail = ref<RelabelDetail | null>(null)
|
|
|
|
|
|
|
|
const completionPhotoUrls = reactive<Record<string, string>>({})
|
|
|
|
|
|
|
|
const completionPhotoLoading = reactive<Record<string, boolean>>({})
|
|
|
|
|
|
|
|
const completionPhotoErrors = reactive<Record<string, boolean>>({})
|
|
|
|
|
|
|
|
const completionPhotoPreviewUrls = computed(() => (selectedRelabelDetail.value?.completionEvidence?.photoFileIds || [])
|
|
|
|
|
|
|
|
.map((fileId) => completionPhotoUrls[fileId]).filter(Boolean))
|
|
|
|
const fbaWarehouses = ref<MerchantWarehouse[]>([])
|
|
|
|
const fbaWarehouses = ref<MerchantWarehouse[]>([])
|
|
|
|
const operationWarehouses = ref<MerchantWarehouse[]>([])
|
|
|
|
const operationWarehouses = ref<MerchantWarehouse[]>([])
|
|
|
|
const fbaWarehousesLoading = ref(false)
|
|
|
|
const fbaWarehousesLoading = ref(false)
|
|
|
@@ -114,7 +122,8 @@ const skuTotalCreateInput = ref<HTMLInputElement | null>(null)
|
|
|
|
let cargoSequence = 0
|
|
|
|
let cargoSequence = 0
|
|
|
|
let skuRelabelSequence = 0
|
|
|
|
let skuRelabelSequence = 0
|
|
|
|
|
|
|
|
|
|
|
|
watch(() => props.service, () => { mode.value = 'list'; resetFilters(); resetForm(); void loadPage() })
|
|
|
|
watch(() => props.service, () => { mode.value = 'list'; page.value = 1; resetFilters(); resetForm(); void loadPage() })
|
|
|
|
|
|
|
|
watch(mode, (value) => { if (value !== 'detail') clearCompletionPhotos() })
|
|
|
|
watch(() => form.relabel, (value) => {
|
|
|
|
watch(() => form.relabel, (value) => {
|
|
|
|
if (props.service === 'transfer' && value) {
|
|
|
|
if (props.service === 'transfer' && value) {
|
|
|
|
labelingMode.value = 'carton_and_sku'
|
|
|
|
labelingMode.value = 'carton_and_sku'
|
|
|
@@ -137,6 +146,7 @@ async function loadPage() {
|
|
|
|
await load()
|
|
|
|
await load()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
onMounted(() => { void loadPage(); void nextTick(refreshWarehouseMarkLabels) })
|
|
|
|
onMounted(() => { void loadPage(); void nextTick(refreshWarehouseMarkLabels) })
|
|
|
|
|
|
|
|
onBeforeUnmount(clearCompletionPhotos)
|
|
|
|
function resetFilters() { Object.assign(filters, { number: '', inboundNo: '', warehouse: '', destination: '', status: '', start: '', end: '' }) }
|
|
|
|
function resetFilters() { Object.assign(filters, { number: '', inboundNo: '', warehouse: '', destination: '', status: '', start: '', end: '' }) }
|
|
|
|
function resetForm() {
|
|
|
|
function resetForm() {
|
|
|
|
Object.assign(form, { customerNo: '', inboundNo: '', sourceWarehouse: '', warehouse: '', destination: '', address: '', contact: '', phone: '', deliveryMethod: '', relabelDeliveryMethod: '', trackingNo: '', reason: '', requirement: '', relabel: false, remark: '', labelDeadline: '', estimatedArrivalAt: '', estimatedShipAt: '', fbaShipmentNo: '', volumeCbm: 0.01 })
|
|
|
|
Object.assign(form, { customerNo: '', inboundNo: '', sourceWarehouse: '', warehouse: '', destination: '', address: '', contact: '', phone: '', deliveryMethod: '', relabelDeliveryMethod: '', trackingNo: '', reason: '', requirement: '', relabel: false, remark: '', labelDeadline: '', estimatedArrivalAt: '', estimatedShipAt: '', fbaShipmentNo: '', volumeCbm: 0.01 })
|
|
|
@@ -465,10 +475,14 @@ function warehouseDisplay(value?: string) {
|
|
|
|
}).join('、')
|
|
|
|
}).join('、')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function statusLabel(value: string) {
|
|
|
|
function statusLabel(value: string) {
|
|
|
|
|
|
|
|
if (props.service === 'labeling') {
|
|
|
|
|
|
|
|
if (value === 'PROCESSING') return '处理中'
|
|
|
|
|
|
|
|
return ['READY_FOR_OUTBOUND', 'COMPLETED'].includes(value) ? '换标完成' : '待处理'
|
|
|
|
|
|
|
|
}
|
|
|
|
const labels: Record<string, string> = {
|
|
|
|
const labels: Record<string, string> = {
|
|
|
|
|
|
|
|
|
|
|
|
PENDING_PROCESSING: '待处理', PROCESSING: '处理中', CUSTOMER_CONFIRM_PENDING: '待客户确认',
|
|
|
|
PENDING_PROCESSING: '待处理', PROCESSING: '处理中', CUSTOMER_CONFIRM_PENDING: '待客户确认',
|
|
|
|
READY_FOR_OUTBOUND: '待出库', COMPLETED: '已完成', CANCELLED: '已取消',
|
|
|
|
READY_FOR_OUTBOUND: '换标完成', COMPLETED: '已完成', CANCELLED: '已取消',
|
|
|
|
PENDING_REVIEW: '待审核', APPROVED: '待 PDA 废弃', PDA_COMPLETED: '待仓库确认完成', REJECTED: '已拒绝', PENDING_ASSIGNMENT: '待分配',
|
|
|
|
PENDING_REVIEW: '待审核', APPROVED: '待 PDA 废弃', PDA_COMPLETED: '待仓库确认完成', REJECTED: '已拒绝', PENDING_ASSIGNMENT: '待分配',
|
|
|
|
ALLOCATED: '已分配', OUTBOUNDED: '已出库', PARTIALLY_RECEIVED: '部分收货', RECEIVED: '已收货',
|
|
|
|
ALLOCATED: '已分配', OUTBOUNDED: '已出库', PARTIALLY_RECEIVED: '部分收货', RECEIVED: '已收货',
|
|
|
|
|
|
|
|
|
|
|
@@ -491,24 +505,32 @@ async function load() {
|
|
|
|
loading.value = true
|
|
|
|
loading.value = true
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
if (props.service === 'labeling') {
|
|
|
|
if (props.service === 'labeling') {
|
|
|
|
const result = await listRelabels({ page: 1, size: 20, relabelNo: filters.number || undefined, overseasWarehouseId: filters.warehouse || undefined, status: filters.status || undefined, createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
const result = await listRelabels({ page: page.value, size: pageSize.value, relabelNo: filters.number || undefined, overseasWarehouseId: filters.warehouse || undefined, status: filters.status || undefined, createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
|
|
|
|
total.value = Number.isFinite(Number(result.total)) ? Number(result.total) : result.records.length
|
|
|
|
submittedRows.value = result.records.map((item) => {
|
|
|
|
submittedRows.value = result.records.map((item) => {
|
|
|
|
const destinationWarehouses = warehouseDisplay(item.overseasWarehouseId)
|
|
|
|
const destinationWarehouses = warehouseDisplay(item.overseasWarehouseId)
|
|
|
|
return row([item.relabelNo, item.customerOrderNo, destinationWarehouses, '—', item.itemCount, item.totalPackageCount, statusLabel(item.status), formatDateTime(item.createdAt)])
|
|
|
|
return { ...row([item.relabelNo, item.customerOrderNo, destinationWarehouses, '—', item.itemCount, item.totalPackageCount, statusLabel(item.status), formatDateTime(item.createdAt)]), __status: item.status }
|
|
|
|
})
|
|
|
|
})
|
|
|
|
} else if (props.service === 'disposal') {
|
|
|
|
} else if (props.service === 'disposal') {
|
|
|
|
const result = await listDiscards({ page: 1, size: 20, discardNo: filters.number || undefined, inboundCode: filters.inboundNo || undefined, overseasWarehouseId: filters.warehouse || undefined, status: filters.status || undefined, createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
const result = await listDiscards({ page: page.value, size: pageSize.value, discardNo: filters.number || undefined, inboundCode: filters.inboundNo || undefined, overseasWarehouseId: filters.warehouse || undefined, status: filters.status || undefined, createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
|
|
|
|
total.value = Number.isFinite(Number(result.total)) ? Number(result.total) : result.records.length
|
|
|
|
submittedRows.value = result.records.map((item) => row([item.discardNo, item.inboundCodes, item.overseasWarehouseName || '—', '—', item.totalPackages, `${item.currency} ${item.totalFee}`, statusLabel(item.status), formatDateTime(item.createdAt)]))
|
|
|
|
submittedRows.value = result.records.map((item) => row([item.discardNo, item.inboundCodes, item.overseasWarehouseName || '—', '—', item.totalPackages, `${item.currency} ${item.totalFee}`, statusLabel(item.status), formatDateTime(item.createdAt)]))
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
const result = await listTransfers({ page: 1, size: 20, transferNo: filters.number || undefined, inboundCode: filters.inboundNo || undefined, operatingWarehouseId: filters.warehouse || undefined, fbaWarehouseCode: filters.destination || undefined, status: filters.status || undefined, ...(props.service === 'relabel' ? { needRelabel: true } : {}), createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
const result = await listTransfers({ page: page.value, size: pageSize.value, transferNo: filters.number || undefined, inboundCode: filters.inboundNo || undefined, operatingWarehouseId: filters.warehouse || undefined, fbaWarehouseCode: filters.destination || undefined, status: filters.status || undefined, ...(props.service === 'relabel' ? { needRelabel: true } : {}), createdFrom: dateTime(filters.start), createdTo: dateTime(filters.end, true) })
|
|
|
|
submittedRows.value = result.records.map((item) => props.service === 'transfer'
|
|
|
|
total.value = Number.isFinite(Number(result.total)) ? Number(result.total) : result.records.length
|
|
|
|
? row([item.transferNo, item.packageCount, warehouseDisplay(item.operatingWarehouseId), item.fbaWarehouseCode, deliveryMethodLabel(item.deliveryMethod), item.needRelabel ? '是 · 待绑定换标单' : '否', statusLabel(item.status), formatDateTime(item.createdAt)])
|
|
|
|
submittedRows.value = result.records.map((item) => {
|
|
|
|
: row([item.transferNo, '—', item.fbaWarehouseCode, '—', item.packageCount, '是', item.relabelNo ? '已生成' : '待生成', statusLabel(item.status), formatDateTime(item.createdAt)]))
|
|
|
|
const operationWarehouse = warehouseDisplay(item.operatingWarehouseId)
|
|
|
|
|
|
|
|
return props.service === 'transfer'
|
|
|
|
|
|
|
|
? row([item.transferNo, item.packageCount, operationWarehouse, item.fbaWarehouseCode, deliveryMethodLabel(item.deliveryMethod), item.needRelabel ? '是 · 待绑定换标单' : '否', statusLabel(item.status), formatDateTime(item.createdAt)])
|
|
|
|
|
|
|
|
: row([item.transferNo, '—', item.fbaWarehouseCode, '—', item.packageCount, '是', item.relabelNo ? '已生成' : '待生成', statusLabel(item.status), formatDateTime(item.createdAt)])
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '列表加载失败') }
|
|
|
|
} catch (error) { submittedRows.value = []; total.value = 0; ElMessage.error(error instanceof Error ? error.message : '列表加载失败') }
|
|
|
|
finally { loading.value = false }
|
|
|
|
finally { loading.value = false }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function query() { void load() }
|
|
|
|
function query() { page.value = 1; void load() }
|
|
|
|
|
|
|
|
function changePage(value: number) { page.value = value; void load() }
|
|
|
|
|
|
|
|
function changePageSize(value: number) { pageSize.value = value; page.value = 1; void load() }
|
|
|
|
async function submit() {
|
|
|
|
async function submit() {
|
|
|
|
const primaryWarehouse = props.service === 'relabel' ? form.sourceWarehouse : form.warehouse
|
|
|
|
const primaryWarehouse = props.service === 'relabel' ? form.sourceWarehouse : form.warehouse
|
|
|
|
const relabelRows = labelingMode.value === 'carton' ? cartonDetailRows.value : skuRelabelRows.value
|
|
|
|
const relabelRows = labelingMode.value === 'carton' ? cartonDetailRows.value : skuRelabelRows.value
|
|
|
@@ -602,6 +624,7 @@ async function openDetail(value: Record<string, string>) {
|
|
|
|
selectedDetail.value = { ...value, ...(detail as ServiceDetail), ...(discardSummary || {}) }
|
|
|
|
selectedDetail.value = { ...value, ...(detail as ServiceDetail), ...(discardSummary || {}) }
|
|
|
|
selectedRelabelDetail.value = props.service === 'labeling' ? detail as RelabelDetail : null
|
|
|
|
selectedRelabelDetail.value = props.service === 'labeling' ? detail as RelabelDetail : null
|
|
|
|
mode.value = 'detail'
|
|
|
|
mode.value = 'detail'
|
|
|
|
|
|
|
|
if (props.service === 'labeling') void loadCompletionPhotos()
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '详情加载失败') }
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '详情加载失败') }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async function confirmTransferMeasurements() {
|
|
|
|
async function confirmTransferMeasurements() {
|
|
|
@@ -623,24 +646,37 @@ async function printTransferCartons() {
|
|
|
|
printWindow.opener = null; printWindow.document.open(); printWindow.document.write(label.printableHtml); printWindow.document.close(); printWindow.focus(); printWindow.print()
|
|
|
|
printWindow.opener = null; printWindow.document.open(); printWindow.document.write(label.printableHtml); printWindow.document.close(); printWindow.focus(); printWindow.print()
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '箱唛加载失败') }
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '箱唛加载失败') }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async function confirmRelabel() {
|
|
|
|
function clearCompletionPhotos() {
|
|
|
|
const relabelNo = selectedRelabelDetail.value?.application.relabelNo
|
|
|
|
for (const url of Object.values(completionPhotoUrls)) URL.revokeObjectURL(url)
|
|
|
|
if (!relabelNo) return
|
|
|
|
for (const key of Object.keys(completionPhotoUrls)) delete completionPhotoUrls[key]
|
|
|
|
try {
|
|
|
|
for (const key of Object.keys(completionPhotoLoading)) delete completionPhotoLoading[key]
|
|
|
|
await ElMessageBox.confirm('确认仓库上传的换标结果无误并继续出库流程吗?', '换标完成确认', { confirmButtonText: '确认并继续', cancelButtonText: '取消' })
|
|
|
|
for (const key of Object.keys(completionPhotoErrors)) delete completionPhotoErrors[key]
|
|
|
|
selectedRelabelDetail.value = await confirmRelabelCompletion(relabelNo)
|
|
|
|
|
|
|
|
ElMessage.success('已确认换标完成,订单已进入后续出库流程')
|
|
|
|
|
|
|
|
} catch (error) { if (error !== 'cancel') ElMessage.error(error instanceof Error ? error.message : '确认失败') }
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async function previewCompletionPhoto(fileId: string) {
|
|
|
|
async function loadCompletionPhoto(fileId: string) {
|
|
|
|
const relabelNo = selectedRelabelDetail.value?.application.relabelNo
|
|
|
|
const relabelNo = selectedRelabelDetail.value?.application.relabelNo
|
|
|
|
if (!relabelNo) return
|
|
|
|
if (!relabelNo || completionPhotoLoading[fileId]) return
|
|
|
|
|
|
|
|
completionPhotoLoading[fileId] = true
|
|
|
|
|
|
|
|
completionPhotoErrors[fileId] = false
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const blob = await downloadRelabelCompletionPhoto(relabelNo, fileId)
|
|
|
|
const blob = await downloadRelabelCompletionPhoto(relabelNo, fileId)
|
|
|
|
|
|
|
|
if (selectedRelabelDetail.value?.application.relabelNo !== relabelNo) return
|
|
|
|
|
|
|
|
if (completionPhotoUrls[fileId]) URL.revokeObjectURL(completionPhotoUrls[fileId])
|
|
|
|
const url = URL.createObjectURL(blob)
|
|
|
|
const url = URL.createObjectURL(blob)
|
|
|
|
window.open(url, '_blank', 'noopener,noreferrer')
|
|
|
|
completionPhotoUrls[fileId] = url
|
|
|
|
window.setTimeout(() => URL.revokeObjectURL(url), 60_000)
|
|
|
|
} catch { if (selectedRelabelDetail.value?.application.relabelNo === relabelNo) completionPhotoErrors[fileId] = true }
|
|
|
|
} catch (error) { ElMessage.error(error instanceof Error ? error.message : '完工照片加载失败') }
|
|
|
|
finally { completionPhotoLoading[fileId] = false }
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async function loadCompletionPhotos() {
|
|
|
|
|
|
|
|
clearCompletionPhotos()
|
|
|
|
|
|
|
|
await Promise.all((selectedRelabelDetail.value?.completionEvidence?.photoFileIds || []).map(loadCompletionPhoto))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async function confirmRelabelFromList(relabelNo: string) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
await ElMessageBox.confirm('确认仓库上传的换标结果无误并继续出库流程吗?', '换标完成确认', { confirmButtonText: '确认并继续', cancelButtonText: '取消' })
|
|
|
|
|
|
|
|
await confirmRelabelCompletion(relabelNo)
|
|
|
|
|
|
|
|
ElMessage.success('已确认换标完成,订单已进入后续出库流程')
|
|
|
|
|
|
|
|
await load()
|
|
|
|
|
|
|
|
} catch (error) { if (error !== 'cancel') ElMessage.error(error instanceof Error ? error.message : '确认失败') }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async function cancelSelectedDiscard() {
|
|
|
|
async function cancelSelectedDiscard() {
|
|
|
|
const no = String(selectedDetail.value?.discardNo || selectedDetail.value?.['0'] || '')
|
|
|
|
const no = String(selectedDetail.value?.discardNo || selectedDetail.value?.['0'] || '')
|
|
|
@@ -764,8 +800,12 @@ function selectRelabelInventory(inboundOrderId: string) {
|
|
|
|
<div class="warehouse-filter-actions"><el-button type="primary" @click="query"><Search :size="16" />查询</el-button><el-button @click="resetFilters(); query()">重置</el-button></div>
|
|
|
|
<div class="warehouse-filter-actions"><el-button type="primary" @click="query"><Search :size="16" />查询</el-button><el-button @click="resetFilters(); query()">重置</el-button></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div v-loading="loading" class="warehouse-card warehouse-table-card">
|
|
|
|
<div v-loading="loading" class="warehouse-card warehouse-table-card">
|
|
|
|
<div class="warehouse-table-scroll"><table><thead><tr><th v-for="column in config.columns" :key="column">{{ column }}</th></tr></thead><tbody><tr v-for="(row, rowIndex) in submittedRows" :key="rowIndex"><td><button class="warehouse-link" type="button" @click="openDetail(row)"><Eye :size="15" />查看</button></td><td v-for="(_, index) in config.columns.slice(1)" :key="index"><SingleLineText :value="row[String(index)]" /></td></tr><tr v-if="submittedRows.length === 0"><td :colspan="config.columns.length"><div class="warehouse-empty">{{ config.emptyText }}</div></td></tr></tbody></table></div>
|
|
|
|
<div class="warehouse-table-scroll"><table><thead><tr><th v-for="column in config.columns" :key="column">{{ column }}</th></tr></thead><tbody><tr v-for="(row, rowIndex) in submittedRows" :key="rowIndex"><td><div class="warehouse-list-actions"><button class="warehouse-link" type="button" @click="openDetail(row)"><Eye :size="15" />查看</button><el-button v-if="props.service === 'labeling' && row.__status === 'CUSTOMER_CONFIRM_PENDING'" size="small" type="primary" @click="confirmRelabelFromList(row['0'])">换标完成确认</el-button></div></td><td v-for="(_, index) in config.columns.slice(1)" :key="index"><SingleLineText :value="row[String(index)]" /></td></tr><tr v-if="submittedRows.length === 0"><td :colspan="config.columns.length"><div class="warehouse-empty">{{ config.emptyText }}</div></td></tr></tbody></table></div>
|
|
|
|
<div class="warehouse-pagination"><span>共 <strong>{{ submittedRows.length }}</strong> 条</span><el-button size="small" disabled>上一页</el-button><button type="button" class="warehouse-page-number">1</button><el-button size="small" disabled>下一页</el-button></div>
|
|
|
|
<div class="warehouse-pagination">
|
|
|
|
|
|
|
|
<span class="warehouse-pagination-total">共 {{ total }} 条</span>
|
|
|
|
|
|
|
|
<el-select v-model="pageSize" class="warehouse-page-size-select" aria-label="每页条数" @change="changePageSize"><el-option v-for="size in [15, 30, 50, 100]" :key="size" :label="`${size}条/页`" :value="size" /></el-select>
|
|
|
|
|
|
|
|
<el-pagination v-model:current-page="page" :page-size="pageSize" :total="total" :hide-on-single-page="false" layout="prev, pager, next" @current-change="changePage" />
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
@@ -889,13 +929,13 @@ function selectRelabelInventory(inboundOrderId: string) {
|
|
|
|
</tbody></table></div>
|
|
|
|
</tbody></table></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div v-if="props.service === 'labeling'" class="warehouse-card warehouse-form-section">
|
|
|
|
<div v-if="props.service === 'labeling'" class="warehouse-card warehouse-form-section">
|
|
|
|
<div class="warehouse-section-heading"><h3>换标完成与出库</h3><el-button v-if="selectedRelabelDetail?.application.status === 'CUSTOMER_CONFIRM_PENDING'" type="primary" @click="confirmRelabel">换标完成确认</el-button></div>
|
|
|
|
<div class="warehouse-section-heading"><h3>换标完成与出库</h3></div>
|
|
|
|
<div class="warehouse-detail-grid warehouse-fulfillment-grid">
|
|
|
|
<div class="warehouse-detail-grid warehouse-fulfillment-grid">
|
|
|
|
<div><span>派送方式</span><strong>{{ deliveryMethodLabel(selectedRelabelDetail?.application.deliveryMethod || '') || '无需出库' }}</strong></div>
|
|
|
|
<div><span>派送方式</span><strong>{{ deliveryMethodLabel(selectedRelabelDetail?.application.deliveryMethod || '') || '无需出库' }}</strong></div>
|
|
|
|
<div><span>履约状态</span><strong>{{ selectedRelabelDetail?.application.fulfillmentStatus || '—' }}</strong></div>
|
|
|
|
<div><span>履约状态</span><strong>{{ selectedRelabelDetail?.application.fulfillmentStatus || '—' }}</strong></div>
|
|
|
|
<div><span>客户确认时间</span><strong>{{ formatDateTime(selectedRelabelDetail?.application.customerConfirmedAt) }}</strong></div>
|
|
|
|
<div><span>客户确认时间</span><strong>{{ formatDateTime(selectedRelabelDetail?.application.customerConfirmedAt) }}</strong></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="warehouse-evidence"><span>仓库完工照片</span><div v-if="selectedRelabelDetail?.completionEvidence?.photoFileIds?.length" class="warehouse-photo-actions"><el-button v-for="(fileId, index) in selectedRelabelDetail.completionEvidence.photoFileIds" :key="fileId" size="small" plain @click="previewCompletionPhoto(fileId)"><Eye :size="14" />照片 {{ index + 1 }}</el-button></div><strong v-else>仓库尚未上传完工照片</strong></div>
|
|
|
|
<div class="warehouse-evidence"><span>仓库完工照片</span><div v-if="selectedRelabelDetail?.completionEvidence?.photoFileIds?.length" class="warehouse-photo-grid"><div v-for="(fileId, index) in selectedRelabelDetail.completionEvidence.photoFileIds" :key="fileId" class="warehouse-photo-item"><el-image v-if="completionPhotoUrls[fileId]" :src="completionPhotoUrls[fileId]" :preview-src-list="completionPhotoPreviewUrls" :initial-index="completionPhotoPreviewUrls.indexOf(completionPhotoUrls[fileId])" fit="cover" preview-teleported /><div v-else-if="completionPhotoLoading[fileId]" class="warehouse-photo-placeholder">照片 {{ index + 1 }} 加载中…</div><button v-else class="warehouse-photo-placeholder warehouse-photo-retry" type="button" @click="loadCompletionPhoto(fileId)">{{ completionPhotoErrors[fileId] ? `照片 ${index + 1} 加载失败,点击重试` : `加载照片 ${index + 1}` }}</button></div></div><strong v-else>仓库尚未上传完工照片</strong></div>
|
|
|
|
<p v-if="selectedRelabelDetail?.completionEvidence?.completionRemark" class="warehouse-completion-remark">完工备注:{{ selectedRelabelDetail.completionEvidence.completionRemark }}</p>
|
|
|
|
<p v-if="selectedRelabelDetail?.completionEvidence?.completionRemark" class="warehouse-completion-remark">完工备注:{{ selectedRelabelDetail.completionEvidence.completionRemark }}</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div v-if="props.service === 'labeling'" class="warehouse-card warehouse-form-section">
|
|
|
|
<div v-if="props.service === 'labeling'" class="warehouse-card warehouse-form-section">
|
|
|
@@ -926,10 +966,20 @@ function selectRelabelInventory(inboundOrderId: string) {
|
|
|
|
.warehouse-unmaintained{margin-left:8px;color:#e6a23c;font-size:12px;font-style:normal}
|
|
|
|
.warehouse-unmaintained{margin-left:8px;color:#e6a23c;font-size:12px;font-style:normal}
|
|
|
|
.warehouse-labeling-tabs{margin-top:-8px}.warehouse-labeling-heading{align-items:flex-start}.warehouse-labeling-heading h3{margin-bottom:16px}.warehouse-template-actions{display:flex;gap:8px;padding-bottom:12px}.warehouse-tab-actions{align-items:center;margin:2px 0 14px}.warehouse-tab-actions p{margin:0;color:#7d8797;font-size:12px}.warehouse-tab-actions>div{display:flex;gap:8px}.warehouse-sku-notice{margin:0 0 14px;padding:10px 12px;border:1px solid #f2d39b;border-radius:4px;background:#fff8e8;color:#8a6116;font-size:12px}.warehouse-sku-label-table{min-width:980px}.warehouse-sku-label-table :deep(.el-input-number){width:160px}:deep(.warehouse-labeling-tabs>.el-tabs__header){margin-bottom:18px}:deep(.warehouse-labeling-tabs .el-tabs__item){height:42px;padding:0 26px;font-weight:600}.warehouse-labeling-mode{display:flex;align-items:center;gap:14px;margin:0 0 16px;padding:14px 16px;border:1px solid #dce5f5;border-radius:5px;background:#f7f9ff}.warehouse-labeling-mode>span{color:#34445c;font-size:13px;font-weight:650;white-space:nowrap}.warehouse-labeling-mode p{margin:0;color:#71809a;font-size:12px}.warehouse-labeling-mode :deep(.el-radio-group){display:flex;flex-shrink:0}.warehouse-labeling-mode :deep(.el-radio-button__inner){padding:8px 14px}
|
|
|
|
.warehouse-labeling-tabs{margin-top:-8px}.warehouse-labeling-heading{align-items:flex-start}.warehouse-labeling-heading h3{margin-bottom:16px}.warehouse-template-actions{display:flex;gap:8px;padding-bottom:12px}.warehouse-tab-actions{align-items:center;margin:2px 0 14px}.warehouse-tab-actions p{margin:0;color:#7d8797;font-size:12px}.warehouse-tab-actions>div{display:flex;gap:8px}.warehouse-sku-notice{margin:0 0 14px;padding:10px 12px;border:1px solid #f2d39b;border-radius:4px;background:#fff8e8;color:#8a6116;font-size:12px}.warehouse-sku-label-table{min-width:980px}.warehouse-sku-label-table :deep(.el-input-number){width:160px}:deep(.warehouse-labeling-tabs>.el-tabs__header){margin-bottom:18px}:deep(.warehouse-labeling-tabs .el-tabs__item){height:42px;padding:0 26px;font-weight:600}.warehouse-labeling-mode{display:flex;align-items:center;gap:14px;margin:0 0 16px;padding:14px 16px;border:1px solid #dce5f5;border-radius:5px;background:#f7f9ff}.warehouse-labeling-mode>span{color:#34445c;font-size:13px;font-weight:650;white-space:nowrap}.warehouse-labeling-mode p{margin:0;color:#71809a;font-size:12px}.warehouse-labeling-mode :deep(.el-radio-group){display:flex;flex-shrink:0}.warehouse-labeling-mode :deep(.el-radio-button__inner){padding:8px 14px}
|
|
|
|
.warehouse-relabel-detail-table{min-width:1420px}.warehouse-relabel-detail-table td strong{color:#253f67}
|
|
|
|
.warehouse-relabel-detail-table{min-width:1420px}.warehouse-relabel-detail-table td strong{color:#253f67}
|
|
|
|
.warehouse-native-file{min-height:32px;padding:5px 8px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;color:#606266}.warehouse-fulfillment-grid{margin-bottom:18px}.warehouse-evidence{display:flex;align-items:center;gap:16px;padding:14px;border:1px solid #e7ebf1;border-radius:4px;background:#f8fafc}.warehouse-evidence>span{color:#71809a;font-size:12px}.warehouse-evidence>strong{color:#8a95a5;font-size:12px;font-weight:400}.warehouse-photo-actions{display:flex;flex-wrap:wrap;gap:8px}.warehouse-completion-remark{margin:10px 0 0;color:#596579;font-size:12px}
|
|
|
|
.warehouse-native-file{min-height:32px;padding:5px 8px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;color:#606266}.warehouse-fulfillment-grid{margin-bottom:18px}.warehouse-evidence{display:flex;align-items:flex-start;gap:16px;padding:14px;border:1px solid #e7ebf1;border-radius:4px;background:#f8fafc}.warehouse-evidence>span{padding-top:6px;color:#71809a;font-size:12px;white-space:nowrap}.warehouse-evidence>strong{padding-top:6px;color:#8a95a5;font-size:12px;font-weight:400}.warehouse-photo-grid{display:grid;grid-template-columns:repeat(4,140px);gap:12px}.warehouse-photo-item{width:140px;height:105px;overflow:hidden;border:1px solid #dce3ed;border-radius:5px;background:#fff}.warehouse-photo-item :deep(.el-image){display:block;width:100%;height:100%;cursor:zoom-in}.warehouse-photo-placeholder{display:flex;width:100%;height:100%;align-items:center;justify-content:center;padding:10px;border:0;background:#f4f7fb;color:#8792a2;font-size:12px;text-align:center}.warehouse-photo-retry{cursor:pointer}.warehouse-completion-remark{margin:10px 0 0;color:#596579;font-size:12px}
|
|
|
|
.warehouse-template-actions{flex-wrap:wrap;justify-content:flex-end}.warehouse-import-preview{margin:0 0 16px;padding:14px;border:1px solid #cfe0f5;border-radius:5px;background:#f8fbff}.warehouse-import-preview .warehouse-section-heading{margin-bottom:10px}.warehouse-import-preview .warehouse-section-heading>div{display:flex;align-items:center;gap:10px}.warehouse-import-preview p{margin:0;color:#7d8797;font-size:12px}.warehouse-binding-preview-table{min-width:980px;background:#fff}
|
|
|
|
.warehouse-template-actions{flex-wrap:wrap;justify-content:flex-end}.warehouse-import-preview{margin:0 0 16px;padding:14px;border:1px solid #cfe0f5;border-radius:5px;background:#f8fbff}.warehouse-import-preview .warehouse-section-heading{margin-bottom:10px}.warehouse-import-preview .warehouse-section-heading>div{display:flex;align-items:center;gap:10px}.warehouse-import-preview p{margin:0;color:#7d8797;font-size:12px}.warehouse-binding-preview-table{min-width:980px;background:#fff}
|
|
|
|
.warehouse-transfer-relabel .warehouse-labeling-heading>div:first-child{min-width:0}.warehouse-transfer-relabel .warehouse-labeling-heading h3{margin-bottom:6px}.warehouse-transfer-relabel .warehouse-labeling-heading p{margin:0 0 16px;color:#7d8797;font-size:12px}.warehouse-transfer-relabel-fields{margin-bottom:18px}.warehouse-transfer-mark-table{min-width:1420px}.warehouse-transfer-mark-table td{vertical-align:top}.warehouse-transfer-mark-table :deep(.el-textarea){min-width:220px}.warehouse-transfer-mark-table :deep(.el-input-number){width:150px}.warehouse-count-error{color:#d64545}
|
|
|
|
.warehouse-transfer-relabel .warehouse-labeling-heading>div:first-child{min-width:0}.warehouse-transfer-relabel .warehouse-labeling-heading h3{margin-bottom:6px}.warehouse-transfer-relabel .warehouse-labeling-heading p{margin:0 0 16px;color:#7d8797;font-size:12px}.warehouse-transfer-relabel-fields{margin-bottom:18px}.warehouse-transfer-mark-table{min-width:1420px}.warehouse-transfer-mark-table td{vertical-align:top}.warehouse-transfer-mark-table :deep(.el-textarea){min-width:220px}.warehouse-transfer-mark-table :deep(.el-input-number){width:150px}.warehouse-count-error{color:#d64545}
|
|
|
|
.warehouse-transfer-form{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}.warehouse-transfer-form--relabel{grid-template-columns:minmax(0,1fr) minmax(0,1.35fr);align-items:start}.warehouse-transfer-form--relabel .warehouse-transfer-main-card{grid-column:1;grid-row:1}.warehouse-transfer-form--relabel .warehouse-transfer-cargo-card{grid-column:1;grid-row:2}.warehouse-transfer-form--relabel .warehouse-transfer-relabel{grid-column:2;grid-row:1 / span 2;margin-bottom:0}.warehouse-transfer-form--relabel .warehouse-transfer-submit-bar{grid-column:1 / -1}.warehouse-transfer-form :deep(.el-input__wrapper),.warehouse-transfer-form :deep(.el-textarea__inner),.warehouse-transfer-form :deep(.el-select__wrapper),.warehouse-transfer-form :deep(.el-date-editor.el-input__wrapper){min-height:32px}.warehouse-transfer-form .warehouse-form-section{padding:16px}.warehouse-transfer-form .warehouse-form-section h3{margin-bottom:12px;padding-bottom:9px;font-size:14px}.warehouse-transfer-form .warehouse-form-grid{gap:12px 16px}.warehouse-transfer-form .warehouse-choice-field{min-height:34px;padding:8px 10px;grid-template-columns:118px auto 1fr;gap:10px}.warehouse-transfer-form .warehouse-choice-field>span{font-size:12px}.warehouse-transfer-form .warehouse-choice-field small{font-size:11px}.warehouse-transfer-form .warehouse-receiving-card{gap:12px;padding:10px 12px}.warehouse-transfer-form .warehouse-section-heading{margin-bottom:8px}.warehouse-transfer-form .warehouse-edit-table{font-size:11px}.warehouse-transfer-form .warehouse-edit-table th{height:36px;padding:0 9px}.warehouse-transfer-form .warehouse-edit-table td{height:42px;padding:6px 7px}.warehouse-transfer-form .warehouse-transfer-mark-table :deep(.el-textarea){min-width:150px}.warehouse-transfer-form .warehouse-transfer-mark-table :deep(.el-input-number){width:112px}.warehouse-transfer-form .warehouse-hint{margin-top:5px;font-size:11px}.warehouse-transfer-form .warehouse-labeling-mode{gap:9px;margin-bottom:10px;padding:9px 10px}.warehouse-transfer-form .warehouse-labeling-mode>span{font-size:12px}.warehouse-transfer-form .warehouse-labeling-mode p{font-size:11px}.warehouse-transfer-form .warehouse-labeling-mode :deep(.el-radio-button__inner){padding:6px 9px}.warehouse-transfer-form .warehouse-template-actions{gap:5px;padding-bottom:8px}.warehouse-transfer-form .warehouse-template-actions :deep(.el-button){padding:6px 8px;font-size:11px}.warehouse-transfer-form .warehouse-submit-bar{padding:4px 0 18px}.warehouse-transfer-form .warehouse-submit-bar :deep(.el-button){min-height:32px;padding:7px 14px}.warehouse-transfer-form .warehouse-transfer-relabel{overflow:hidden}.warehouse-transfer-form .warehouse-transfer-relabel-fields{margin-bottom:10px}
|
|
|
|
.warehouse-transfer-form{display:grid;grid-template-columns:minmax(0,1fr);gap:12px}.warehouse-transfer-form--relabel{grid-template-columns:minmax(0,1fr) minmax(0,1.35fr);align-items:start}.warehouse-transfer-form--relabel .warehouse-transfer-main-card{grid-column:1;grid-row:1}.warehouse-transfer-form--relabel .warehouse-transfer-cargo-card{grid-column:1;grid-row:2}.warehouse-transfer-form--relabel .warehouse-transfer-relabel{grid-column:2;grid-row:1 / span 2;margin-bottom:0}.warehouse-transfer-form--relabel .warehouse-transfer-submit-bar{grid-column:1 / -1}.warehouse-transfer-form :deep(.el-input__wrapper),.warehouse-transfer-form :deep(.el-textarea__inner),.warehouse-transfer-form :deep(.el-select__wrapper),.warehouse-transfer-form :deep(.el-date-editor.el-input__wrapper){min-height:32px}.warehouse-transfer-form .warehouse-form-section{padding:16px}.warehouse-transfer-form .warehouse-form-section h3{margin-bottom:12px;padding-bottom:9px;font-size:14px}.warehouse-transfer-form .warehouse-form-grid{gap:12px 16px}.warehouse-transfer-form .warehouse-choice-field{min-height:34px;padding:8px 10px;grid-template-columns:118px auto 1fr;gap:10px}.warehouse-transfer-form .warehouse-choice-field>span{font-size:12px}.warehouse-transfer-form .warehouse-choice-field small{font-size:11px}.warehouse-transfer-form .warehouse-receiving-card{gap:12px;padding:10px 12px}.warehouse-transfer-form .warehouse-section-heading{margin-bottom:8px}.warehouse-transfer-form .warehouse-edit-table{font-size:11px}.warehouse-transfer-form .warehouse-edit-table th{height:36px;padding:0 9px}.warehouse-transfer-form .warehouse-edit-table td{height:42px;padding:6px 7px}.warehouse-transfer-form .warehouse-transfer-mark-table :deep(.el-textarea){min-width:150px}.warehouse-transfer-form .warehouse-transfer-mark-table :deep(.el-input-number){width:112px}.warehouse-transfer-form .warehouse-hint{margin-top:5px;font-size:11px}.warehouse-transfer-form .warehouse-labeling-mode{gap:9px;margin-bottom:10px;padding:9px 10px}.warehouse-transfer-form .warehouse-labeling-mode>span{font-size:12px}.warehouse-transfer-form .warehouse-labeling-mode p{font-size:11px}.warehouse-transfer-form .warehouse-labeling-mode :deep(.el-radio-button__inner){padding:6px 9px}.warehouse-transfer-form .warehouse-template-actions{gap:5px;padding-bottom:8px}.warehouse-transfer-form .warehouse-template-actions :deep(.el-button){padding:6px 8px;font-size:11px}.warehouse-transfer-form .warehouse-submit-bar{padding:4px 0 18px}.warehouse-transfer-form .warehouse-submit-bar :deep(.el-button){min-height:32px;padding:7px 14px}.warehouse-transfer-form .warehouse-transfer-relabel{overflow:hidden}.warehouse-transfer-form .warehouse-transfer-relabel-fields{margin-bottom:10px}
|
|
|
|
@media(max-width:1250px){.warehouse-transfer-form--relabel{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.warehouse-transfer-form .warehouse-template-actions{justify-content:flex-start}.warehouse-transfer-form .warehouse-labeling-heading{align-items:flex-start;flex-direction:column}}
|
|
|
|
@media(max-width:1250px){.warehouse-transfer-form--relabel{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.warehouse-transfer-form .warehouse-template-actions{justify-content:flex-start}.warehouse-transfer-form .warehouse-labeling-heading{align-items:flex-start;flex-direction:column}}
|
|
|
|
.warehouse-transfer-form .pickup-address-field{grid-column:span 1}
|
|
|
|
.warehouse-transfer-form .pickup-address-field{grid-column:span 1}
|
|
|
|
|
|
|
|
/* Keep the count and controls visible together on narrow list pages. */
|
|
|
|
|
|
|
|
.warehouse-pagination { justify-content: flex-end; }
|
|
|
|
|
|
|
|
.warehouse-pagination-total { color: #526176; font-size: 14px; }
|
|
|
|
|
|
|
|
.warehouse-pagination :deep(.el-pagination) { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; margin: 0; }
|
|
|
|
|
|
|
|
.warehouse-page-size-select { width: 112px; margin-left: 8px; }
|
|
|
|
|
|
|
|
.warehouse-page-size-select :deep(.el-input__inner), .warehouse-page-size-select :deep(.el-select__selected-item) { color: #526176 !important; opacity: 1 !important; -webkit-text-fill-color: #526176; }
|
|
|
|
|
|
|
|
.warehouse-list-actions { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
|
|
|
|
|
|
|
|
@media (max-width: 720px) {
|
|
|
|
|
|
|
|
.warehouse-pagination :deep(.el-pagination) { width: 100%; justify-content: flex-end; }
|
|
|
|
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</style>
|
|
|
|