|
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
|
|
adjustPublishedInboundFee,
|
|
|
|
|
downloadWeightImage,
|
|
|
|
|
calculateInboundFee,
|
|
|
|
|
createManualInboundQuote,
|
|
|
|
|
confirmInboundFee,
|
|
|
|
|
createFeeAdjustmentIdempotencyKey,
|
|
|
|
|
createFeeActionIdempotencyKey,
|
|
|
|
@@ -258,24 +259,27 @@ const feeConfirmWeight = ref<number | null>(null)
|
|
|
|
|
const feeConfirmVolume = ref<number | null>(null)
|
|
|
|
|
const feeConfirmReferenceLoading = ref(false)
|
|
|
|
|
const feeConfirmReference = ref<InboundFeeSnapshot | null>(null)
|
|
|
|
|
const feeConfirmPriceMissing = ref(false)
|
|
|
|
|
const feeConfirmUnitPrice = ref<number | null>(null)
|
|
|
|
|
const feeConfirmPriceReason = ref('')
|
|
|
|
|
type FeeConfirmAttempt = {
|
|
|
|
|
fingerprint: string
|
|
|
|
|
calculateKey: string
|
|
|
|
|
manualKey: string
|
|
|
|
|
adjustKey: string
|
|
|
|
|
confirmKey: string
|
|
|
|
|
sendKey: string
|
|
|
|
|
}
|
|
|
|
|
let feeConfirmAttempt: FeeConfirmAttempt | null = null
|
|
|
|
|
const feeConfirmPriceChanged = computed(() => {
|
|
|
|
|
if (feeConfirmPriceMissing.value) return true
|
|
|
|
|
const reference = Number(feeConfirmReference.value?.unitPrice)
|
|
|
|
|
const current = Number(feeConfirmUnitPrice.value)
|
|
|
|
|
return reference >= 0 && current >= 0 && Math.abs(reference - current) > 0.000001
|
|
|
|
|
})
|
|
|
|
|
const feeConfirmPriceUnit = computed(() => {
|
|
|
|
|
const snapshot = feeConfirmReference.value
|
|
|
|
|
return snapshot ? `${snapshot.currency} / ${snapshot.chargeUnit}` : '—'
|
|
|
|
|
return snapshot ? `${snapshot.currency} / ${snapshot.chargeUnit}` : 'CNY / 计费单位'
|
|
|
|
|
})
|
|
|
|
|
const feeConfirmEstimatedTotal = computed(() => {
|
|
|
|
|
const snapshot = feeConfirmReference.value
|
|
|
|
@@ -1669,6 +1673,7 @@ async function openFeeConfirmDialog() {
|
|
|
|
|
: measuredGrossWeight > 0 ? measuredGrossWeight : measuredNetWeight > 0 ? measuredNetWeight : null
|
|
|
|
|
feeConfirmVolume.value = Number(actualTotals.volume) > 0 ? Number(actualTotals.volume) : null
|
|
|
|
|
feeConfirmReference.value = null
|
|
|
|
|
feeConfirmPriceMissing.value = false
|
|
|
|
|
feeConfirmUnitPrice.value = null
|
|
|
|
|
feeConfirmPriceReason.value = ''
|
|
|
|
|
feeConfirmAttempt = null
|
|
|
|
@@ -1693,8 +1698,14 @@ async function openFeeConfirmDialog() {
|
|
|
|
|
feeConfirmReference.value = snapshot
|
|
|
|
|
feeConfirmUnitPrice.value = Number(snapshot.unitPrice)
|
|
|
|
|
} catch (error) {
|
|
|
|
|
ElMessage.error(getApiErrorDetails(error, '价格表参考单价加载失败,暂不能推送费用').message)
|
|
|
|
|
feeConfirmOpen.value = false
|
|
|
|
|
const details = getApiErrorDetails(error, '价格表参考单价加载失败')
|
|
|
|
|
if (details.code === 'A0404') {
|
|
|
|
|
feeConfirmPriceMissing.value = true
|
|
|
|
|
ElMessage.warning('当前FBA价格未命中,请填写本次对客单价和人工定价原因')
|
|
|
|
|
} else {
|
|
|
|
|
ElMessage.error(details.message)
|
|
|
|
|
feeConfirmOpen.value = false
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
feeConfirmReferenceLoading.value = false
|
|
|
|
|
}
|
|
|
|
@@ -1715,6 +1726,7 @@ function currentFeeConfirmAttempt(
|
|
|
|
|
feeConfirmAttempt = {
|
|
|
|
|
fingerprint,
|
|
|
|
|
calculateKey: createFeeActionIdempotencyKey('calculate'),
|
|
|
|
|
manualKey: createFeeActionIdempotencyKey('manual'),
|
|
|
|
|
adjustKey: createFeeAdjustmentIdempotencyKey(),
|
|
|
|
|
confirmKey: createFeeActionIdempotencyKey('confirm'),
|
|
|
|
|
sendKey: createFeeActionIdempotencyKey('send'),
|
|
|
|
@@ -1747,14 +1759,25 @@ async function executeConfirmAndSendFee() {
|
|
|
|
|
try {
|
|
|
|
|
const tenantId = String(summary.tenantId)
|
|
|
|
|
const inboundId = String(summary.inboundId)
|
|
|
|
|
let snapshot = await calculateInboundFee(tenantId, inboundId, {
|
|
|
|
|
selectedWeightKg,
|
|
|
|
|
selectedVolumeCbm,
|
|
|
|
|
weightSource: 'ACTUAL',
|
|
|
|
|
volumeSource: 'ACTUAL',
|
|
|
|
|
}, attempt.calculateKey)
|
|
|
|
|
let snapshot: InboundFeeSnapshot
|
|
|
|
|
try {
|
|
|
|
|
snapshot = await calculateInboundFee(tenantId, inboundId, {
|
|
|
|
|
selectedWeightKg, selectedVolumeCbm, weightSource: 'ACTUAL', volumeSource: 'ACTUAL',
|
|
|
|
|
}, attempt.calculateKey)
|
|
|
|
|
} catch (error) {
|
|
|
|
|
if (getApiErrorDetails(error, '费用试算失败').code !== 'A0404') throw error
|
|
|
|
|
feeConfirmPriceMissing.value = true
|
|
|
|
|
if (feeConfirmPriceReason.value.trim().length < 2) {
|
|
|
|
|
ElMessage.warning('价格未命中,请填写至少 2 个字符的人工定价原因')
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
snapshot = await createManualInboundQuote(tenantId, inboundId, {
|
|
|
|
|
selectedWeightKg, selectedVolumeCbm, unitPrice: selectedUnitPrice,
|
|
|
|
|
reason: feeConfirmPriceReason.value.trim(),
|
|
|
|
|
}, attempt.manualKey)
|
|
|
|
|
}
|
|
|
|
|
const calculatedUnitPrice = Number(snapshot.unitPrice)
|
|
|
|
|
if (Math.abs(selectedUnitPrice - calculatedUnitPrice) > 0.000001) {
|
|
|
|
|
if (snapshot.rateCode !== 'MANUAL_QUOTE' && Math.abs(selectedUnitPrice - calculatedUnitPrice) > 0.000001) {
|
|
|
|
|
snapshot = await adjustPublishedInboundFee(tenantId, inboundId, {
|
|
|
|
|
expectedFeeVersion: snapshot.feeVersion,
|
|
|
|
|
chargeableQuantity: Number(snapshot.chargeableQuantity),
|
|
|
|
@@ -2311,13 +2334,12 @@ onBeforeUnmount(() => {
|
|
|
|
|
<el-form-item label="渠道"><el-input :model-value="detail?.summary.channelName || detail?.summary.channelCode || '—'" disabled /></el-form-item>
|
|
|
|
|
<el-form-item label="计费毛重"><div class="fee-confirm-number-wrap"><el-input-number v-model="feeConfirmWeight" :min="0" :precision="3" :controls="false" class="fee-confirm-number" placeholder="请输入计费毛重" /><span class="fee-confirm-unit">kg</span></div></el-form-item>
|
|
|
|
|
<el-form-item label="计费体积"><div class="fee-confirm-number-wrap"><el-input-number v-model="feeConfirmVolume" :min="0" :precision="6" :controls="false" class="fee-confirm-number" placeholder="请输入计费体积" /><span class="fee-confirm-unit">m³</span></div></el-form-item>
|
|
|
|
|
<el-form-item label="价格表参考单价"><div class="fee-confirm-number-wrap"><el-input-number :model-value="feeConfirmReference?.unitPrice == null ? undefined : Number(feeConfirmReference.unitPrice)" :precision="4" :controls="false" disabled class="fee-confirm-number" placeholder="正在读取参考单价" /><span class="fee-confirm-unit">{{ feeConfirmPriceUnit }}</span></div></el-form-item>
|
|
|
|
|
<el-form-item label="价格表参考单价"><div class="fee-confirm-number-wrap"><el-input-number :model-value="feeConfirmPriceMissing || feeConfirmReference?.unitPrice == null ? undefined : Number(feeConfirmReference.unitPrice)" :precision="4" :controls="false" disabled class="fee-confirm-number" :placeholder="feeConfirmPriceMissing ? '未命中' : '正在读取参考单价'" /><span class="fee-confirm-unit">{{ feeConfirmPriceUnit }}</span></div></el-form-item>
|
|
|
|
|
<el-form-item label="本次对客单价"><div class="fee-confirm-number-wrap"><el-input-number v-model="feeConfirmUnitPrice" :min="0" :precision="4" :controls="false" :disabled="feeConfirmReferenceLoading" class="fee-confirm-number" placeholder="请输入对客单价" /><span class="fee-confirm-unit">{{ feeConfirmPriceUnit }}</span></div></el-form-item>
|
|
|
|
|
<el-form-item v-if="feeConfirmPriceChanged" label="单价调整原因" class="fee-confirm-price-reason"><el-input v-model="feeConfirmPriceReason" type="textarea" :rows="2" maxlength="500" show-word-limit placeholder="请说明本次人工改单价的原因" /></el-form-item>
|
|
|
|
|
<el-form-item v-if="feeConfirmPriceChanged" :label="feeConfirmPriceMissing ? '人工定价原因' : '单价调整原因'" class="fee-confirm-price-reason"><el-input v-model="feeConfirmPriceReason" type="textarea" :rows="2" maxlength="500" show-word-limit placeholder="请说明本次人工定价的原因" /></el-form-item>
|
|
|
|
|
</el-form>
|
|
|
|
|
<dl v-if="feeConfirmReference" class="fee-confirm-price-summary">
|
|
|
|
|
<div><dt>参考计费量</dt><dd>{{ formatNumber(Number(feeConfirmReference.chargeableQuantity), feeConfirmReference.roundingScale) }} {{ feeConfirmReference.chargeUnit }}</dd></div>
|
|
|
|
|
<div><dt>固定附加费</dt><dd>{{ feeConfirmMoney(Number(feeConfirmReference.additionalAmount || 0), feeConfirmReference.currency) }}</dd></div>
|
|
|
|
|
<div><dt>按当前单价预计合计</dt><dd>{{ feeConfirmEstimatedTotal == null ? '—' : feeConfirmMoney(feeConfirmEstimatedTotal, feeConfirmReference.currency) }}</dd></div>
|
|
|
|
|
</dl>
|
|
|
|
|
<h4 class="fee-confirm-reference-title">参考数据</h4>
|
|
|
|
|