支持结账多轮协商与按实际消耗双比例结算

允许双方最多 6 轮修改结账方案;哈夫币按实际消耗与 buyer/seller 比例计价,打超从押金扣,押金不足禁止自动完结并引导人工争议。同步收紧结账明细展示密度。
This commit is contained in:
yml2213
2026-07-18 20:35:16 +08:00
parent 98772867a7
commit 1a4776bba0
19 changed files with 713 additions and 140 deletions
@@ -72,6 +72,11 @@ const {
ownerIncomeLabel,
canOpenDispute,
canCancelDispute,
canCounterCheckout,
canAcceptCheckoutProposal,
checkoutShortfallCent,
checkoutOvershootCent,
checkoutRoundLabel,
isCheckoutDisputeStage,
handleCancel,
handlePay,
@@ -129,6 +134,13 @@ const hasSidebarActions = computed(() => {
(isRenter.value && order.value.status === 'pending_checkout_accept')
)
})
const showCheckoutCounterForm = computed(
() =>
!!order.value &&
canCounterCheckout.value &&
((isOwner.value && order.value.status === 'pending_checkout_confirm') ||
(isRenter.value && order.value.status === 'pending_checkout_accept'))
)
const disputeSupportTitle = computed(() => {
if (canCancelDispute.value) {
return order.value?.status === 'checkout_disputing' ? '结账争议处理中' : '申诉处理中'
@@ -480,15 +492,23 @@ watch([() => route.query.focus, order, loading], () => {
:is-renter="isRenter"
/>
<div
v-if="order && isOwner && order.status === 'pending_checkout_confirm'"
class="form-section counter-checkout-section"
>
<div v-if="showCheckoutCounterForm" class="form-section counter-checkout-section">
<div class="section-header">
<h2>修改结账</h2>
<h2>修改结账方案</h2>
<span v-if="checkoutRoundLabel">{{ checkoutRoundLabel }}</span>
</div>
<div class="form-card">
<h3 class="sub-title">修改结账金额</h3>
<p class="form-hint">
双方最多协商 6 轮。可填写<strong>实际哈夫币消耗</strong>(允许超过发布量)。
押金不足时无法自动完结,需改方案或发起争议。
</p>
<p v-if="checkoutShortfallCent > 0" class="form-hint" style="color: #dc2626">
当前方案押金不足差额 ¥{{ money(amountYuan(checkoutShortfallCent)) }},无法同意完结。
</p>
<p v-else-if="checkoutOvershootCent > 0" class="form-hint">
当前打超 ¥{{ money(amountYuan(checkoutOvershootCent)) }},将从押金扣除。
</p>
<h3 class="sub-title">调整消耗与扣款</h3>
<el-form class="form-grid" label-position="top">
<el-form-item label="额外消耗品已用金额">
<el-input-number
@@ -499,7 +519,7 @@ watch([() => route.query.focus, order, loading], () => {
controls-position="right"
/>
</el-form-item>
<el-form-item label="消耗哈夫币(M">
<el-form-item label="实际消耗哈夫币(M">
<el-input-number
v-model="counterForm.coin_consumed_m"
class="full-control"
@@ -508,12 +528,11 @@ watch([() => route.query.focus, order, loading], () => {
controls-position="right"
/>
</el-form-item>
<el-form-item label="押金赔付扣除(元)">
<el-form-item label="押金赔付扣除(损坏/违规,元)">
<el-input-number
v-model="counterForm.depositDeductAmountYuan"
class="full-control"
:min="0"
:max="amountYuan(order.deposit_amount_cent)"
:precision="0"
controls-position="right"
/>
@@ -523,7 +542,7 @@ watch([() => route.query.focus, order, loading], () => {
v-model="counterForm.reason"
type="textarea"
:rows="3"
placeholder="填写修改原因"
placeholder="填写修改原因(必填)"
/>
<el-input
v-model="counterForm.evidenceText"
@@ -536,8 +555,9 @@ watch([() => route.query.focus, order, loading], () => {
size="large"
:loading="countering"
@click="handleCounterCheckout"
>提交修正给租客确认</el-button
>
{{ isOwner ? '提交修正给租客' : '提交还价给号主' }}
</el-button>
</div>
</div>
@@ -546,10 +566,12 @@ watch([() => route.query.focus, order, loading], () => {
class="form-section reject-checkout-section"
>
<div class="section-header">
<h2>拒绝修正</h2>
<h2>不同意并发起争议</h2>
</div>
<div class="form-card">
<p class="form-hint">不同意修正时填写原因,订单会进入争议处理。</p>
<p class="form-hint">
也可先在上方「修改结账方案」还价。若谈不拢或押金不足,填写原因进入人工争议。
</p>
<el-input
v-model="rejectReason"
type="textarea"
@@ -562,7 +584,7 @@ watch([() => route.query.focus, order, loading], () => {
size="large"
:loading="rejectingCheckout"
@click="handleRejectCheckout"
>拒绝修正并发起争议</el-button
>发起结账争议</el-button
>
</div>
</div>
@@ -576,41 +598,69 @@ watch([() => route.query.focus, order, loading], () => {
<!-- 确认结账 -->
<div v-if="isOwner && order.status === 'pending_checkout_confirm'" class="sidebar-card">
<h3 class="sidebar-title">确认结账</h3>
<p v-if="checkoutRoundLabel" class="sidebar-hint">{{ checkoutRoundLabel }}</p>
<p v-if="checkoutShortfallCent > 0" class="sidebar-hint" style="color: #dc2626">
押金不足,无法同意完结
</p>
<el-button
type="primary"
size="large"
:loading="completing"
:disabled="!canAcceptCheckoutProposal"
@click="handleConfirmCheckout"
>
确认结账并完成订单
</el-button>
<div class="section-divider-mini">
<div v-if="canCounterCheckout" class="section-divider-mini">
<span>或者</span>
</div>
<el-button type="warning" plain size="large" @click="scrollToCounterCheckout">
需要修改结账金额
<el-button
v-if="canCounterCheckout"
type="warning"
plain
size="large"
@click="scrollToCounterCheckout"
>
修改结账方案
</el-button>
<p class="sidebar-hint">如认为金额有误,点击上方按钮修改</p>
<p class="sidebar-hint">双方可多轮协商(最多 6 轮);押金不足请改方案或争议</p>
</div>
<!-- 确认修正结账 -->
<div v-if="isRenter && order.status === 'pending_checkout_accept'" class="sidebar-card">
<h3 class="sidebar-title">确认修正结账</h3>
<h3 class="sidebar-title">确认结账方案</h3>
<p v-if="checkoutRoundLabel" class="sidebar-hint">{{ checkoutRoundLabel }}</p>
<p v-if="checkoutShortfallCent > 0" class="sidebar-hint" style="color: #dc2626">
押金不足,无法同意完结
</p>
<el-button
type="primary"
size="large"
:loading="acceptingCheckout"
:disabled="!canAcceptCheckoutProposal"
@click="handleAcceptCheckout"
>
同意修正并完成订单
同意并完成订单
</el-button>
<div v-if="canCounterCheckout" class="section-divider-mini">
<span>或者</span>
</div>
<el-button
v-if="canCounterCheckout"
type="warning"
plain
size="large"
@click="scrollToCounterCheckout"
>
还价修改方案
</el-button>
<div class="section-divider-mini">
<span>或者</span>
</div>
<el-button type="danger" plain size="large" @click="scrollToRejectCheckout">
不同意,发起争议
发起争议(人工)
</el-button>
<p class="sidebar-hint">不同意修正时需填写原因,将进入争议处理</p>
<p class="sidebar-hint">可还价或争议;押金不足无法自动完结</p>
</div>
</div>
</div>