优化仲裁

This commit is contained in:
yml2213
2026-07-29 18:59:07 +08:00
parent c9d0803b53
commit 8c2431c4f2
15 changed files with 387 additions and 142 deletions
@@ -15,7 +15,7 @@ import {
} from '@/shared/utils/statusLabels'
import { formatDateTime } from '@/shared/utils/time'
import { formatListingNo } from '@/shared/utils/listingDisplay'
import { yuanToCent } from '@/shared/utils/money'
import { centToYuan, yuanToCent } from '@/shared/utils/money'
import AdminTablePagination from '../components/AdminTablePagination.vue'
const loading = ref(false)
@@ -27,6 +27,7 @@ const result = ref('release_deposit')
const remark = ref('')
const amount = ref<number | undefined>()
const actualCoinConsumedM = ref<number | undefined>()
const actualConsumableAmountYuan = ref<number | undefined>()
const currentPage = ref(1)
const currentPageSize = ref(20)
const total = ref(0)
@@ -43,6 +44,12 @@ const hasValidActualCoinConsumedM = computed(
Number.isFinite(actualCoinConsumedM.value) &&
actualCoinConsumedM.value >= 0
)
const hasValidActualConsumableAmount = computed(
() =>
typeof actualConsumableAmountYuan.value === 'number' &&
Number.isFinite(actualConsumableAmountYuan.value) &&
actualConsumableAmountYuan.value >= 0
)
const pendingCount = computed(
() => disputes.value.filter(item => ['open', 'processing'].includes(item.status)).length
)
@@ -62,6 +69,7 @@ const canSubmitArbitration = computed(() => {
!hasValidActualCoinConsumedM.value
)
return false
if (isCompletedResult.value && !hasValidActualConsumableAmount.value) return false
return true
})
function canArbitrate(row: Dispute) {
@@ -163,6 +171,9 @@ function openArbitration(row: Dispute) {
remark.value = row.arbitration_remark || ''
amount.value = undefined
actualCoinConsumedM.value = row.checkout_coin_consumed_m ?? undefined
actualConsumableAmountYuan.value = centToYuan(
row.checkout_consumable_amount_cent ?? row.extra_item_original_amount_cent ?? 0
)
}
function resetFilters() {
@@ -301,6 +312,10 @@ async function handleArbitrate() {
ElMessage.warning('请填写最终实际哈夫币消耗 M')
return
}
if (isCompletedResult.value && !hasValidActualConsumableAmount.value) {
ElMessage.warning('请填写最终实际额外物品消耗金额')
return
}
submitting.value = true
try {
await arbitrateDispute(activeDispute.value.id, {
@@ -308,11 +323,15 @@ async function handleArbitrate() {
remark: remark.value.trim(),
amount_cent: amount.value ? yuanToCent(amount.value) : undefined,
actual_coin_consumed_m: isCompletedResult.value ? actualCoinConsumedM.value : undefined,
actual_consumable_amount_cent: isCompletedResult.value
? yuanToCent(actualConsumableAmountYuan.value)
: undefined,
})
ElMessage.success('仲裁结果已保存,双方已收到通知')
activeDispute.value = null
remark.value = ''
actualCoinConsumedM.value = undefined
actualConsumableAmountYuan.value = undefined
await loadDisputes()
} catch (error) {
ElMessage.error(readError(error, '仲裁失败'))
@@ -527,6 +546,18 @@ async function handleArbitrate() {
placeholder="实际消耗 M"
/>
</div>
<div v-if="isCompletedResult" class="arbitration-field">
<span>最终实际额外消耗品</span>
<el-input-number
v-model="actualConsumableAmountYuan"
class="full-control"
:min="0"
:max="1000000000"
:precision="2"
:step="1"
placeholder="实际额外消耗品金额"
/>
</div>
<el-input
v-model="remark"
class="panel-action"
@@ -10,6 +10,7 @@ export interface Dispute {
order_status: string
handoff_status: string
settlement_status: string
extra_item_original_amount_cent?: number
listing_no: string
title: string
owner_id: number
@@ -29,6 +30,7 @@ export interface Dispute {
previous_settlement_status?: string
checkout_id?: number
checkout_coin_consumed_m?: number
checkout_consumable_amount_cent?: number
previous_checkout_status?: string
arbitration_result: string
arbitration_remark: string
@@ -99,6 +101,7 @@ export async function arbitrateDispute(
remark: string
amount_cent?: number
actual_coin_consumed_m?: number
actual_consumable_amount_cent?: number
}
) {
const { data } = await apiClient.post<ApiResponse<Dispute>>(
@@ -37,6 +37,7 @@ export interface Order {
actual_coin_consumed_m?: number
actual_pure_coin_amount_cent?: number
actual_pure_coin_discount_cent?: number
actual_extra_item_amount_cent?: number
renter_growth_level?: string
renter_growth_level_name?: string
renter_discount_bps?: number