4 Commits
3 changed files with 5 additions and 19 deletions
+2
View File
@@ -14,6 +14,8 @@
| 本土卡车列表、建单与详情 | `views/DomesticTruckingView.vue`、`components/TransportDemandForm.vue`;`cross-border/domestic-trucking`、`.../create`、`.../:orderNo/detail` | `api/businessOrders.ts`、`transportDemandForm.ts`;`lastleg-service/trucking/` |
| 美本土散板列表、建单与详情 | `views/PalletShippingView.vue`;`cross-border/pallet-shipping`、`.../create`、`.../:orderNo/detail` | `api/businessOrders.ts`;`lastleg-service/looseboard/` |
| 通用业务单展示与车次安排 | `components/BusinessOrdersView.vue`、`fleetArrangement.ts` | `api/businessOrders.ts`;`lastleg-service/fleet/trip/` |
| 采购结果确认/驳回与实收照片 | `components/ProcurementDecisionDialog.vue` | `api/procurement.ts` 的 `confirmProcurement/rejectProcurement/getProcurementWorkflow`;仅客户确认节点,不是平台审核 |
| 采购/卡车受理中、冻结失败与重试 | `components/OrderFundingStatus.vue` | `api/orderBudgets.ts` 的 `readOrderFunding/retryOrderFunding`;服务端归 `lastleg-service/procurement/funding/` |
| 柜型与规格换算 | `containerSpecifications.ts` | 本地换算,服务端复核 |
## 关键边界
@@ -320,19 +320,6 @@ function formatDateTime(value: string | null | undefined) {
return Number.isNaN(date.getTime()) ? value : date.toLocaleString('zh-CN', { hour12: false })
}
function receiptHistoryLabel(document: MerchantCustomsDocument) {
return (document.receiptHistory || []).map((item) => `V${item.version}`).join('、') || '—'
}
function confirmationActionLabel(action: MerchantCustomsDocument['confirmationHistory'][number]['action']) {
return action === 'CONFIRM' ? '确认' : '打回'
}
function formatSize(bytes: number) {
if (bytes < 1024) return `${bytes} B`
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
return `${(bytes / 1024 / 1024).toFixed(1)} MB`
}
function clearanceResultLabel(value: MerchantClearanceResult) {
return ({ INSPECTION: '查验', SUPPLEMENT_REQUIRED: '补充资料', RELEASED: '放行', DETAINED: '扣留', OTHER: '其他' } as Record<string, string>)[value.resultType] || value.resultType
}
@@ -418,7 +405,7 @@ function clearanceResultStatusLabel(value: MerchantClearanceResult) {
<section class="customs-section">
<div class="customs-section-title">
<h3>资料版本历史</h3>
<h3>资料文件</h3>
<div v-if="pendingReceipts.length && detail.status === 'DECLARING'" class="customs-receipt-actions">
<el-button type="success" :disabled="mutating" @click="confirmReceipt">确认全部回执</el-button>
<el-button type="danger" plain :disabled="mutating" @click="rejectReceipt">打回全部回执</el-button>
@@ -431,10 +418,6 @@ function clearanceResultStatusLabel(value: MerchantClearanceResult) {
<FileText :size="20" />
<div>
<strong>{{ item.source.fileName }}</strong>
<span>版本 V{{ item.source.version }} · {{ formatSize(item.source.sizeBytes) }} · {{ formatDateTime(item.source.uploadedAt) }}</span>
<small v-if="item.receiptHistory?.length">报关行回执历史:{{ receiptHistoryLabel(item) }}</small>
<small v-for="history in item.confirmationHistory" :key="history.id">{{ confirmationActionLabel(history.action) }} · {{ formatDateTime(history.createdAt) }} · {{ history.operatorName || '—' }}<span v-if="history.reason"> · {{ history.reason }}</span></small>
<small>关联入仓码:{{ item.inboundCodes.join('、') || '—' }}</small>
</div>
</div>
<div class="customs-document-actions">
@@ -751,7 +751,8 @@ test('supports the frozen customs document workflow and customer-safe downloads'
assert.match(customsDialogSource, /v-if="detail.status === 'COMPLETED'"[^>]*><strong>报关已完成/)
assert.match(customsDialogSource, /真实报关完税文件已齐全/)
assert.match(customsDialogSource, /item\.finalDocument/)
assert.match(customsDialogSource, /资料版本历史/)
assert.match(customsDialogSource, /资料文件/)
assert.doesNotMatch(customsDialogSource, /资料版本历史|报关行回执历史|item\.confirmationHistory|版本 V/)
assert.match(customsDialogSource, /尚未上传退税报关资料/)
assert.match(customsDialogSource, /退税报关资料加载失败/)
assert.doesNotMatch(customsDialogSource, /accept=/)