统一后台状态列顺序、详情布局与测量计费展示
This commit is contained in:
@@ -124,10 +124,10 @@ async function save() {
|
||||
<section v-for="group in visibleGroups" :key="group.category" class="document-group density-dialog-section" data-tone="source" :data-category="group.category">
|
||||
<header><h3 class="density-dialog-section__title">{{ group.label }}</h3><el-tag :type="group.files.length ? 'success' : 'info'">{{ group.files.length ? '已上传' : '待上传' }}</el-tag><span>{{ group.files.length }}/20</span><el-upload v-if="canEdit" :key="uploadKey" :auto-upload="false" :show-file-list="false" :disabled="busy || conflict || group.files.length >= 20" :on-change="(file: UploadFile) => upload(group.category, file)"><el-button class="density-action" data-tone="primary" :disabled="busy || conflict || group.files.length >= 20">上传</el-button></el-upload></header>
|
||||
<p v-if="!group.files.length" class="density-dialog-note">尚未上传文件</p>
|
||||
<table v-else class="density-table document-files"><thead><tr><th class="document-file-actions">操作</th><th>文件名称</th><th class="document-file-time">上传时间</th><th class="document-file-state">保存状态</th></tr></thead><tbody>
|
||||
<table v-else class="density-table document-files"><thead><tr><th class="document-file-actions">操作</th><th>文件名称</th><th class="document-file-state">保存状态</th><th class="document-file-time">上传时间</th></tr></thead><tbody>
|
||||
<tr v-for="file in group.files" :key="file.fileId" class="document-file">
|
||||
<td><div class="density-actions"><el-button link :aria-label="'下载 ' + file.fileName" :disabled="downloading || !isSaved(group.category, file.fileId)" @click="download(group.category, file)">下载</el-button><template v-if="canEdit"><el-upload :key="uploadKey" :auto-upload="false" :show-file-list="false" :disabled="busy || conflict" :on-change="(uploadFile: UploadFile) => upload(group.category, uploadFile, file.fileId)"><el-button class="density-action" data-tone="primary" :disabled="busy || conflict">替换</el-button></el-upload><el-button class="density-action" data-tone="danger" :disabled="busy || conflict" @click="remove(group.category, file.fileId)">删除</el-button></template></div></td>
|
||||
<td><LineClampText :content="file.fileName" /></td><td>{{ file.uploadedAt?.replace('T', ' ') || '—' }}</td><td>{{ isSaved(group.category, file.fileId) ? '已保存' : '待保存' }}</td>
|
||||
<td><LineClampText :content="file.fileName" /></td><td>{{ isSaved(group.category, file.fileId) ? '已保存' : '待保存' }}</td><td>{{ file.uploadedAt?.replace('T', ' ') || '—' }}</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
</section>
|
||||
|
||||
@@ -48,6 +48,6 @@ onBeforeUnmount(() => { generation++ })
|
||||
<p v-if="!deliveries.length" class="density-dialog-note">尚未生成派送单费用。</p>
|
||||
<p v-else-if="!allowed" class="density-dialog-note">暂无派送单费用查看权限。</p>
|
||||
<LoadErrorState v-else-if="error" title="费用读取失败" :message="error.message" compact @retry="load"><template #details><ApiErrorMeta :details="error" /></template></LoadErrorState>
|
||||
<table v-else class="density-table"><thead><tr><th>客户</th><th>派送单号</th><th>费用项目</th><th>币种</th><th>金额</th><th>费用状态</th></tr></thead><tbody><tr v-for="fee in fees" :key="`${fee.deliveryNo}-${fee.id}`"><td>{{ fee.customerName || '—' }}</td><td>{{ fee.deliveryNo }}</td><td>{{ labels[fee.feeType] || fee.feeType || '—' }}</td><td>{{ fee.currency || '—' }}</td><td>{{ fee.amount ?? '—' }}</td><td>{{ status(fee) }}</td></tr><tr v-if="!loading && !fees.length"><td colspan="6">暂无正式费用记录</td></tr></tbody></table>
|
||||
<table v-else class="density-table"><thead><tr><th>客户</th><th>派送单号</th><th>费用状态</th><th>费用项目</th><th>币种</th><th>金额</th></tr></thead><tbody><tr v-for="fee in fees" :key="`${fee.deliveryNo}-${fee.id}`"><td>{{ fee.customerName || '—' }}</td><td>{{ fee.deliveryNo }}</td><td>{{ status(fee) }}</td><td>{{ labels[fee.feeType] || fee.feeType || '—' }}</td><td>{{ fee.currency || '—' }}</td><td>{{ fee.amount ?? '—' }}</td></tr><tr v-if="!loading && !fees.length"><td colspan="6">暂无正式费用记录</td></tr></tbody></table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -296,10 +296,10 @@ onBeforeUnmount(clearTruckPreviewUrls)
|
||||
.pickup-detail-facts dd { display: flex; flex-wrap: wrap; gap: 4px 10px; }
|
||||
.truck-evidence-panel { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; padding: 12px 14px; border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md); background: var(--cc-surface); }
|
||||
.truck-evidence-panel > h2 { flex: 0 0 100%; margin: 0; }
|
||||
.truck-evidence-panel label { display: inline-flex; align-items: center; gap: 10px; color: var(--cc-text); font-size: 13px; }
|
||||
.truck-evidence-panel label { display: inline-flex; align-items: center; gap: 10px; color: var(--cc-text); font-size: var(--admin-font-body); }
|
||||
.truck-evidence-upload { padding: 8px 14px; border: 1px solid var(--el-color-primary); border-radius: var(--cc-radius-sm); color: var(--el-color-primary) !important; cursor: pointer; }
|
||||
.truck-evidence-upload input[type='file'] { display: none; }
|
||||
.truck-evidence-list { display: flex; flex-wrap: wrap; gap: 12px; color: var(--cc-muted); font-size: 12px; }
|
||||
.truck-evidence-list { display: flex; flex-wrap: wrap; gap: 12px; color: var(--cc-muted); font-size: var(--admin-font-caption); }
|
||||
.truck-evidence-item { width: 132px; margin: 0; }
|
||||
.truck-evidence-item { position: relative; }
|
||||
.truck-evidence-item .el-image { display: block; width: 132px; height: 92px; overflow: hidden; border: 1px solid var(--cc-border); border-radius: var(--cc-radius-sm); background: var(--cc-surface-muted); cursor: pointer; }
|
||||
|
||||
@@ -123,10 +123,10 @@ const gateText = computed(() => {
|
||||
const allocationRows = computed(() => (detail.value?.allocations || []).map(row => ({ ...row, skuCode: row.skuCode && row.skuCode !== 'MIXED' ? row.skuCode : '—', movementStatus: ({ RESERVED: '已分配', SHIPPED: '已发运', RECEIVED: '目标已实收' } as Record<string, string>)[row.status] || '—' })))
|
||||
const columns: DataTableColumn[] = [
|
||||
{ key: 'inboundCode', prop: 'inboundCode', label: '来源入仓码', minWidth: 160 },
|
||||
{ key: 'movementStatus', prop: 'movementStatus', label: '履约状态', width: 120, afterColumn: 'inboundCode' },
|
||||
{ key: 'palletNo', prop: 'palletNo', label: '来源托盘码', minWidth: 180 },
|
||||
{ key: 'skuCode', prop: 'skuCode', label: '实际 SKU', minWidth: 150 },
|
||||
{ key: 'packageCount', prop: 'packageCount', label: '分配箱数', width: 100 },
|
||||
{ key: 'movementStatus', prop: 'movementStatus', label: '履约状态', width: 120 },
|
||||
]
|
||||
async function load() {
|
||||
const current = ++request
|
||||
|
||||
@@ -196,7 +196,7 @@ onBeforeUnmount(() => { generation++ })
|
||||
.receipt-box-heading{display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:12px}
|
||||
.receipt-discrepancy-reason{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}
|
||||
.transfer-receipt-panel{display:grid;gap:var(--admin-space-2)}
|
||||
.receipt-aligned-table{width:100%;max-width:1490px;min-width:0}
|
||||
.receipt-aligned-table{width:100%;min-width:0}
|
||||
.receipt-difference{color:var(--el-color-danger);font-weight:600}
|
||||
h3 small{margin-left:8px;color:var(--workbench-muted);font-size:var(--admin-font-caption);font-weight:400}
|
||||
h3{margin:0;font-size:var(--admin-font-section)}
|
||||
|
||||
Reference in New Issue
Block a user