Release/test 合并上生产 #2

Merged
admin merged 736 commits from release/test into main 2026-09-17 11:50:56 +08:00
2 changed files with 3 additions and 57 deletions
Showing only changes of commit f7b8159d30 - Show all commits
@@ -12,7 +12,7 @@ import ListPageLayout from '@/shared/components/ListPageLayout.vue'
import LoadErrorState from '@/shared/components/LoadErrorState.vue'
import OperationErrorToast from '@/shared/components/OperationErrorToast.vue'
import QueryToolbar, { type QueryField, type QueryModel } from '@/shared/components/QueryToolbar.vue'
import { convertLastMileOrderToInboundPlan, listLastMileOrders, setLastMileOrderDetained, setLastMileOrderPalletMergeRequired, transferLastMileOrders } from '../api/lastMileOrders'
import { convertLastMileOrderToInboundPlan, listLastMileOrders, setLastMileOrderDetained, transferLastMileOrders } from '../api/lastMileOrders'
import { useAccessPreviewStore } from '@/core/access/accessPreview'
import { overseasWarehousePermissions as permission } from '../permissions'
import { toLastMileOrderListItem } from '../lastMilePresentation'
@@ -27,7 +27,6 @@ const page = ref(1)
const pageSize = ref(10)
const total = ref(0)
const selectedRows = ref<LastMileOrderListItem[]>([])
const cancellableMergeCount = computed(() => selectedRows.value.filter((row) => row.palletMergeFlag === 'REQUIRED').length)
const actionLoading = ref(false)
const actionError = ref<ApiErrorDetails | null>(null)
const transferOpen = ref(false)
@@ -65,8 +64,6 @@ const columns: DataTableColumn[] = [
{ key: 'actions', label: '操作', width: 270, fixed: 'left', slotName: 'actions' },
{ key: 'selection', type: 'selection', width: 48, fixed: 'left' },
{ key: 'orderNo', prop: 'orderNo', label: '尾程单号', minWidth: 170 },
{ key: 'consolidated', prop: 'consolidated', label: '合托标记', width: 100, hideable: false },
{ key: 'palletMergeRelation', prop: 'palletMergeRelation', label: '合托关联订单', minWidth: 180, hideable: false },
{ key: 'warning', prop: 'warning', label: '预警', width: 90 },
{ key: 'orderType', prop: 'orderType', label: '订单类型', minWidth: 110 },
{ key: 'rejectedAt', prop: 'rejectedAt', label: '拒收时间', minWidth: 150 },
@@ -163,57 +160,6 @@ async function submitDetained() {
} catch (error) { actionError.value = getApiErrorDetails(error, target.detained ? '解除暂扣失败,请重试' : '暂扣失败,请重试') }
finally { actionLoading.value = false }
}
async function togglePalletMerge(row: LastMileOrderListItem) {
const required = row.palletMergeFlag !== 'REQUIRED'
try {
await ElMessageBox.confirm(
required ? `标记后,PDA扫描入仓码 ${row.inboundCode} 的箱唛时会显示合托提示。` : '确认取消该订单的PDA合托提示?',
required ? '合托标记' : '取消合托标记',
{ type: 'warning', confirmButtonText: required ? '确认标记' : '确认取消', cancelButtonText: '返回' },
)
} catch { return }
actionLoading.value = true; actionError.value = null
try {
await setLastMileOrderPalletMergeRequired(row.id, { palletMergeRequired: required })
ElMessage.success(required ? '已标记合托,PDA扫描箱唛时将显示提示' : '已取消合托标记')
await load()
} catch (error) { actionError.value = getApiErrorDetails(error, required ? '合托标记失败,请重试' : '取消合托标记失败,请重试') }
finally { actionLoading.value = false }
}
async function batchPalletMerge() {
const targets = selectedRows.value.filter((row) => row.palletMergeFlag !== 'MERGED')
if (!targets.length) { ElMessage.warning('请选择至少 1 条未完成合托的尾程订单'); return }
try {
await ElMessageBox.confirm(
`确定为选中的 ${targets.length} 条尾程订单标记合托吗?PDA扫描对应箱唛时将显示合托提示。`,
'批量合托标记',
{ type: 'warning', confirmButtonText: '确认标记', cancelButtonText: '返回' },
)
} catch { return }
actionLoading.value = true; actionError.value = null
try {
await Promise.all(targets.map((row) => setLastMileOrderPalletMergeRequired(row.id, { palletMergeRequired: true })))
selectedRows.value = []
ElMessage.success(`已标记 ${targets.length} 条订单合托`)
await load()
} catch (error) { actionError.value = getApiErrorDetails(error, '批量合托标记失败,请重试') }
finally { actionLoading.value = false }
}
async function cancelBatchPalletMerge() {
const targets = selectedRows.value.filter((row) => row.palletMergeFlag === 'REQUIRED')
if (!targets.length) { ElMessage.warning('请选择至少 1 条待合托订单'); return }
try {
await ElMessageBox.confirm(`确定取消选中的 ${targets.length} 条订单合托标记吗?`, '取消合托标记', { type: 'warning', confirmButtonText: '确认取消', cancelButtonText: '返回' })
} catch { return }
actionLoading.value = true; actionError.value = null
try {
await Promise.all(targets.map((row) => setLastMileOrderPalletMergeRequired(row.id, { palletMergeRequired: false })))
selectedRows.value = []
ElMessage.success(`已取消 ${targets.length} 条订单合托标记`)
await load()
} catch (error) { actionError.value = getApiErrorDetails(error, '取消合托标记失败,请重试') }
finally { actionLoading.value = false }
}
async function submitTransfer() {
if (!transferForm.warehouseId.trim() || !transferForm.warehouseCode.trim() || !transferForm.warehouseName.trim()) {
ElMessage.warning('请填写目的仓 ID、代码和名称')
@@ -261,7 +207,7 @@ onMounted(() => { void load() })
</LoadErrorState>
</template>
<section v-if="!loadError" class="surface-panel table-panel"><DataTable v-model:page="page" v-model:page-size="pageSize" :data="rows" :columns="columns" :loading="loading" :total="total" preference-key="overseas-last-mile-orders" row-key="id" empty-text="暂无尾程订单" :row-class-name="({ row }: { row: LastMileOrderListItem }) => row.detained ? 'is-detained-row' : ''" @selection-change="onSelectionChange" @update:page="load()" @update:page-size="page = 1; load()">
<template #toolbar-actions><el-button v-if="access.can(permission.lastMileOrderTransfer)" plain :disabled="!selectedRows.length || actionLoading" @click="openTransfer">转仓</el-button><el-button v-if="access.can(permission.lastMileOrderTransfer)" type="primary" plain :disabled="!selectedRows.length || actionLoading" @click="batchPalletMerge">合托标记</el-button><el-button v-if="access.can(permission.lastMileOrderTransfer)" type="warning" plain :disabled="!cancellableMergeCount || actionLoading" @click="cancelBatchPalletMerge">取消合托</el-button><el-button v-if="access.can(permission.inboundOrderCreate)" type="primary" plain :disabled="selectedRows.length !== 1 || actionLoading" @click="convertInboundPlan">生成入库计划</el-button></template>
<template #toolbar-actions><el-button v-if="access.can(permission.lastMileOrderTransfer)" plain :disabled="!selectedRows.length || actionLoading" @click="openTransfer">转仓</el-button><el-button v-if="access.can(permission.inboundOrderCreate)" type="primary" plain :disabled="selectedRows.length !== 1 || actionLoading" @click="convertInboundPlan">生成入库计划</el-button></template>
<template #actions="{ row }"><el-button size="small" plain type="primary" @click="openDetail(row)"><Eye :size="15" />查看</el-button><el-button v-if="access.can(permission.lastMileOrderTransfer)" size="small" plain :type="(row as LastMileOrderListItem).detained ? 'success' : 'danger'" :disabled="actionLoading" @click="openDetained(row as LastMileOrderListItem)">{{ (row as LastMileOrderListItem).detained ? '解除暂扣' : '暂扣' }}</el-button></template>
<template #pagination-left>共 {{ total }} 条尾程订单 · 已选 {{ selectedRows.length }} 条</template>
</DataTable></section>
@@ -330,7 +330,7 @@ describe('overseas warehouse first-batch prototype contract', () => {
'actions', 'selection', 'orderNo', 'warning', 'orderType', 'rejectedAt', 'inboundCode', 'owner', 'warehouse',
'transferWarehouse', 'fbaWarehouse', 'containerNo', 'abnormal', 'held', 'pallets',
'cartons', 'volume', 'quantity', 'volumeWeight', 'portEta', 'portAta', 'warehouseEta', 'inboundOrderNo',
'outboundOrderNo', 'dispatchOrderNo', 'relabelOrderNo', 'relabelStatus', 'consolidated', 'status',
'outboundOrderNo', 'dispatchOrderNo', 'relabelOrderNo', 'relabelStatus', 'status',
'createdAt', 'internalRemark', 'customerRemark', 'warehouseRemark',
])
expect(columnKeys('InboundOrdersView.vue')).toEqual([