合并仲裁实际消耗结算选项

This commit is contained in:
yml2213
2026-07-31 22:12:25 +08:00
parent 9511b580e4
commit 921654e5b0
3 changed files with 86 additions and 30 deletions
@@ -23,7 +23,8 @@ const submitting = ref(false)
const disputes = ref<Dispute[]>([])
const activeDispute = ref<Dispute | null>(null)
const evidenceDispute = ref<Dispute | null>(null)
const result = ref('release_deposit')
const actualSettlementResult = 'actual_settlement'
const result = ref(actualSettlementResult)
const remark = ref('')
const amount = ref<number | undefined>()
const actualCoinConsumedM = ref<number | undefined>()
@@ -34,9 +35,15 @@ const total = ref(0)
const keywordFilter = ref('')
const statusFilter = ref('')
const typeFilter = ref('')
const isPartialRefund = computed(() => result.value === 'partial_refund')
const isCompletedResult = computed(() =>
['deduct_deposit', 'release_deposit', 'compensate_owner'].includes(result.value)
[actualSettlementResult, 'deduct_deposit', 'release_deposit', 'compensate_owner'].includes(
result.value
)
)
const hasValidOwnerCompensation = computed(
() =>
amount.value === undefined ||
(typeof amount.value === 'number' && Number.isFinite(amount.value) && amount.value >= 0)
)
const hasValidActualCoinConsumedM = computed(
() =>
@@ -62,7 +69,7 @@ const cancelledCount = computed(
const canSubmitArbitration = computed(() => {
if (submitting.value || !activeDispute.value) return false
if (!result.value || !remark.value.trim()) return false
if (isPartialRefund.value && (!amount.value || amount.value <= 0)) return false
if (isCompletedResult.value && !hasValidOwnerCompensation.value) return false
if (
isCompletedResult.value &&
!activeDispute.value.checkout_id &&
@@ -93,6 +100,7 @@ function disputeTypeLabel(type: string) {
function arbitrationResultLabel(value: string) {
const map: Record<string, string> = {
actual_settlement: '按实际消耗结算',
full_refund: '全额退款',
partial_refund: '部分退款',
deduct_deposit: '扣押金',
@@ -104,6 +112,13 @@ function arbitrationResultLabel(value: string) {
return map[value] || value || '-'
}
function editableArbitrationResult(value: string) {
if (['partial_refund', 'deduct_deposit', 'release_deposit', 'compensate_owner'].includes(value)) {
return actualSettlementResult
}
return value || actualSettlementResult
}
function disputeStatusTone(status: string) {
const map: Record<string, 'success' | 'warning' | 'info' | 'danger'> = {
open: 'warning',
@@ -167,7 +182,7 @@ async function queryDisputes() {
function openArbitration(row: Dispute) {
if (!canArbitrate(row)) return
activeDispute.value = row
result.value = row.arbitration_result || 'release_deposit'
result.value = editableArbitrationResult(row.arbitration_result)
remark.value = row.arbitration_remark || ''
amount.value = undefined
actualCoinConsumedM.value = row.checkout_coin_consumed_m ?? undefined
@@ -300,8 +315,8 @@ async function handleArbitrate() {
ElMessage.warning('请填写客服裁决说明')
return
}
if (isPartialRefund.value && (!amount.value || amount.value <= 0)) {
ElMessage.warning('请填写部分退款金额')
if (isCompletedResult.value && !hasValidOwnerCompensation.value) {
ElMessage.warning('请填写有效的押金赔付金额')
return
}
if (
@@ -321,7 +336,8 @@ async function handleArbitrate() {
await arbitrateDispute(activeDispute.value.id, {
result: result.value,
remark: remark.value.trim(),
amount_cent: amount.value ? yuanToCent(amount.value) : undefined,
amount_cent:
isCompletedResult.value && amount.value !== undefined ? yuanToCent(amount.value) : undefined,
actual_coin_consumed_m: isCompletedResult.value ? actualCoinConsumedM.value : undefined,
actual_consumable_amount_cent: isCompletedResult.value
? yuanToCent(actualConsumableAmountYuan.value)
@@ -512,27 +528,23 @@ async function handleArbitrate() {
<p>{{ activeDispute.description }}</p>
<el-select v-model="result" class="full-control" placeholder="选择裁决结果">
<el-option label="全额退款" value="full_refund" />
<el-option label="部分退款" value="partial_refund" />
<el-option label="扣押金" value="deduct_deposit" />
<el-option label="释放押金" value="release_deposit" />
<el-option label="赔付号主" value="compensate_owner" />
<el-option label="按实际消耗结算" :value="actualSettlementResult" />
<el-option label="关闭订单" value="order_close" />
<el-option label="标记异常" value="mark_abnormal" />
</el-select>
<el-input-number
v-if="['partial_refund', 'deduct_deposit', 'compensate_owner'].includes(result)"
v-model="amount"
class="full-control panel-action"
:min="0"
:precision="0"
:step="10"
placeholder="裁决金额"
/>
<p v-if="result === 'partial_refund'">
部分退款金额表示退给租客的金额剩余冻结金额结算给号主
</p>
<p v-if="['deduct_deposit', 'compensate_owner'].includes(result)">
金额表示从押金中赔付给号主的部分不填则默认处理全额押金
<div v-if="isCompletedResult" class="arbitration-field">
<span>押金赔付给号主</span>
<el-input-number
v-model="amount"
class="full-control"
:min="0"
:precision="2"
:step="10"
placeholder="押金赔付给号主金额"
/>
</div>
<p v-if="isCompletedResult">
金额表示从押金中赔付给号主的部分不填或填 0 表示不扣押金赔付
</p>
<div v-if="isCompletedResult" class="arbitration-field">
<span>最终实际哈夫币消耗M</span>