提交试算落库

This commit is contained in:
wuweihua
2026-09-08 16:17:13 +08:00
parent 49b1d2c321
commit 789d145a7c
20 changed files with 1037 additions and 72 deletions
+63 -1
View File
@@ -102,12 +102,43 @@
<el-descriptions-item label="取值方式">{{ roundModeLabel(result.roundMode) }}</el-descriptions-item>
<el-descriptions-item label="运费金额">{{ formatMoney(result.freightAmount) }}</el-descriptions-item>
<el-descriptions-item label="挂号费">{{ formatMoney(result.registrationFee) }}</el-descriptions-item>
<el-descriptions-item label="附加费">{{ formatMoney(result.surchargeAmount) }}</el-descriptions-item>
<el-descriptions-item label="应付总额">
<span class="payable">{{ formatMoney(result.payableTotal) }}</span>
</el-descriptions-item>
<el-descriptions-item label="试算来源">
<el-tag v-if="result.fromCache" size="small" type="success">命中历史试算</el-tag>
<el-tag v-else size="small" type="primary">实时计算并落库</el-tag>
</el-descriptions-item>
<el-descriptions-item label="命中说明" :span="2">{{ result.matchMessage || '-' }}</el-descriptions-item>
</el-descriptions>
<div class="formula-tip">计算公式:运费金额 = 运费单价 × 计费重量;应付总额 = 运费金额 + 挂号费</div>
<el-table
v-if="result.feeDetails && result.feeDetails.length"
:data="result.feeDetails"
border
size="small"
class="fee-table"
>
<el-table-column label="费用名称" min-width="140" show-overflow-tooltip>
<template #default="{ row }">{{ displayFeeName(row) }}</template>
</el-table-column>
<el-table-column label="费用类型" width="110" align="center">
<template #default="{ row }">{{ feeTypeLabel(row.feeType) || row.feeType }}</template>
</el-table-column>
<el-table-column label="金额" min-width="120" align="right">
<template #default="{ row }">
<span :class="{ payable: row.feeType === 'SURCHARGE' && Number(row.amount) > 0 }">{{ formatMoney(row.amount) }}</span>
</template>
</el-table-column>
<el-table-column label="币种" width="80" align="center" prop="currency" />
<el-table-column label="取值方式" width="110" align="center">
<template #default="{ row }">{{ roundModeLabel(row.roundMode) }}</template>
</el-table-column>
<el-table-column label="说明" min-width="180" show-overflow-tooltip>
<template #default="{ row }">{{ row.remark || '-' }}</template>
</el-table-column>
</el-table>
<div class="formula-tip">计算公式:运费金额 = 运费单价 × 计费重量;应付总额 = 运费金额 + 挂号费 + 附加费。相同试算参数直接返回已落库费用明细。</div>
</div>
</el-card>
</el-col>
@@ -120,6 +151,7 @@ import { quoteBilling } from '@/api/price/billing'
import { listProduct, listProductCountries } from '@/api/price/product'
const { proxy } = getCurrentInstance()
const { bms_fee_type } = useDict('bms_fee_type')
const formRef = ref()
const loading = ref(false)
const productOptions = ref([])
@@ -257,6 +289,33 @@ function roundModeLabel(mode) {
return map[mode] || mode || '四舍五入'
}
function feeTypeLabel(type) {
const found = (bms_fee_type.value || []).find(d => d.value === type)
return found ? found.label : ''
}
function displayFeeName(row) {
const typeLabel = feeTypeLabel(row.feeType)
const name = String(row.feeName || row.fee_name || '').trim()
const isSurcharge = row.feeType === 'SURCHARGE' || row.feeType === '附加费'
if (isSurcharge) {
if (name && name !== typeLabel && name !== 'SURCHARGE' && name !== '附加费') {
return name
}
const fromRemark = specificNameFromRemark(row.remark)
if (fromRemark) {
return fromRemark
}
}
return name || typeLabel || row.feeType || '-'
}
function specificNameFromRemark(remark) {
if (!remark) return ''
const first = String(remark).split(';')[0].trim()
return first.replace(/\s+-?\d+(\.\d+)?$/, '').trim()
}
function sourceTagType(source) {
if (source === 'PACKAGE_FIXED' || source === 'FIXED') return 'success'
if (source === 'PACKAGE_DISCOUNT' || source === 'DISCOUNT') return 'warning'
@@ -284,4 +343,7 @@ loadProducts()
color: #909399;
font-size: 12px;
}
.billing-quote .fee-table {
margin-top: 12px;
}
</style>