支持结账多轮协商与按实际消耗双比例结算
允许双方最多 6 轮修改结账方案;哈夫币按实际消耗与 buyer/seller 比例计价,打超从押金扣,押金不足禁止自动完结并引导人工争议。同步收紧结账明细展示密度。
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { computed, ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { showDialog, showToast } from 'vant'
|
||||
|
||||
@@ -73,6 +73,10 @@ const {
|
||||
ownerIncomeLabel,
|
||||
canOpenDispute,
|
||||
canCancelDispute,
|
||||
canCounterCheckout,
|
||||
canAcceptCheckoutProposal,
|
||||
checkoutShortfallCent,
|
||||
checkoutRoundLabel,
|
||||
isCheckoutDisputeStage,
|
||||
handleCancel,
|
||||
handlePay,
|
||||
@@ -116,6 +120,13 @@ const {
|
||||
const showDisputePopup = ref(false)
|
||||
const showCounterPopup = ref(false)
|
||||
const showRejectPopup = ref(false)
|
||||
const showCheckoutCounterAction = computed(
|
||||
() =>
|
||||
!!order.value &&
|
||||
canCounterCheckout.value &&
|
||||
((isOwner.value && order.value.status === 'pending_checkout_confirm') ||
|
||||
(isRenter.value && order.value.status === 'pending_checkout_accept'))
|
||||
)
|
||||
|
||||
// 状态颜色映射(vant 标签主题)。
|
||||
function getStatusTagType(status: string) {
|
||||
@@ -347,7 +358,11 @@ async function copyListingCode() {
|
||||
>
|
||||
<h3 class="section-title">结账处理</h3>
|
||||
<p class="action-hint">
|
||||
租客已发起结账并归还账号。确认无误后点击“确认结账”;若扣款不足,可以提出“修改结账”反向提案。
|
||||
{{ checkoutRoundLabel || '请核对消耗与扣款' }}。确认无误后同意完结;也可修改方案交对方确认(最多
|
||||
6 轮)。押金不足无法自动完结,请改方案或争议。
|
||||
</p>
|
||||
<p v-if="checkoutShortfallCent > 0" class="action-hint" style="color: #ef4444">
|
||||
押金不足差额 ¥{{ money(amountYuan(checkoutShortfallCent)) }},无法同意完结。
|
||||
</p>
|
||||
<div class="action-buttons">
|
||||
<van-button
|
||||
@@ -355,25 +370,37 @@ async function copyListingCode() {
|
||||
block
|
||||
round
|
||||
:loading="completing"
|
||||
:disabled="!canAcceptCheckoutProposal"
|
||||
loading-text="处理中..."
|
||||
@click="handleConfirmCheckout"
|
||||
>
|
||||
同意并确认结账
|
||||
</van-button>
|
||||
<van-button type="warning" block plain round @click="showCounterPopup = true">
|
||||
修改扣款金额
|
||||
<van-button
|
||||
v-if="showCheckoutCounterAction"
|
||||
type="warning"
|
||||
block
|
||||
plain
|
||||
round
|
||||
@click="showCounterPopup = true"
|
||||
>
|
||||
修改结账方案
|
||||
</van-button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Renter Action: Accept Counter Checkout Proposal / Refuse and Dispute -->
|
||||
<!-- Renter Action: Accept / Counter / Dispute -->
|
||||
<section
|
||||
v-if="isRenter && order.status === 'pending_checkout_accept'"
|
||||
class="card-section action-card"
|
||||
>
|
||||
<h3 class="section-title">号主结账修正审批</h3>
|
||||
<h3 class="section-title">结账方案确认</h3>
|
||||
<p class="action-hint">
|
||||
号主修改了您的结账申请并对押金进行了扣除。请审查,同意将完成结算,不同意将进入仲裁申诉。
|
||||
{{ checkoutRoundLabel || '对方已提出结账方案' }}。可同意完结、还价修改(最多 6
|
||||
轮),或发起争议由人工处理。
|
||||
</p>
|
||||
<p v-if="checkoutShortfallCent > 0" class="action-hint" style="color: #ef4444">
|
||||
押金不足差额 ¥{{ money(amountYuan(checkoutShortfallCent)) }},无法同意完结。
|
||||
</p>
|
||||
<div class="action-buttons">
|
||||
<van-button
|
||||
@@ -381,13 +408,24 @@ async function copyListingCode() {
|
||||
block
|
||||
round
|
||||
:loading="acceptingCheckout"
|
||||
:disabled="!canAcceptCheckoutProposal"
|
||||
loading-text="同意中..."
|
||||
@click="handleAcceptCheckout"
|
||||
>
|
||||
同意修正并结账
|
||||
同意并结账
|
||||
</van-button>
|
||||
<van-button
|
||||
v-if="showCheckoutCounterAction"
|
||||
type="warning"
|
||||
block
|
||||
plain
|
||||
round
|
||||
@click="showCounterPopup = true"
|
||||
>
|
||||
还价修改方案
|
||||
</van-button>
|
||||
<van-button type="danger" block plain round @click="showRejectPopup = true">
|
||||
拒绝修正并提起申诉
|
||||
发起结账争议
|
||||
</van-button>
|
||||
</div>
|
||||
</section>
|
||||
@@ -436,15 +474,15 @@ async function copyListingCode() {
|
||||
@refresh="refreshPaymentStatus(false)"
|
||||
/>
|
||||
|
||||
<!-- POPUP: Owner Counter Checkout Adjustments -->
|
||||
<!-- POPUP: Counter Checkout Adjustments(号主/租客) -->
|
||||
<van-popup v-model:show="showCounterPopup" position="bottom" round class="mobile-popup-form">
|
||||
<header class="popup-header">
|
||||
<h3>修改结账扣款金额</h3>
|
||||
<h3>修改结账方案</h3>
|
||||
<button class="popup-close" @click="showCounterPopup = false">✕</button>
|
||||
</header>
|
||||
<div class="popup-body">
|
||||
<p class="form-hint-info">
|
||||
在此调整实际使用的租金项目和押金赔付金额,提案将交由租客二次确认。
|
||||
{{ checkoutRoundLabel }}。可填实际哈夫币消耗(允许超过发布量),打超按比例从押金扣。提案将交给对方确认。
|
||||
</p>
|
||||
<van-cell-group :border="false">
|
||||
<van-field label="额外消耗品已用">
|
||||
@@ -456,7 +494,7 @@ async function copyListingCode() {
|
||||
/>
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field label="消耗哈夫币 M">
|
||||
<van-field label="实际消耗哈夫币 M">
|
||||
<template #input>
|
||||
<input
|
||||
v-model.number="counterForm.coin_consumed_m"
|
||||
@@ -465,7 +503,7 @@ async function copyListingCode() {
|
||||
/>
|
||||
</template>
|
||||
</van-field>
|
||||
<van-field label="押金赔付扣除" required>
|
||||
<van-field label="押金赔付(损坏等)">
|
||||
<template #input>
|
||||
<input
|
||||
v-model.number="counterForm.depositDeductAmountYuan"
|
||||
@@ -481,7 +519,7 @@ async function copyListingCode() {
|
||||
autosize
|
||||
label="修改原因"
|
||||
type="textarea"
|
||||
placeholder="请说明调整扣款的原因,说服租客确认"
|
||||
placeholder="请说明调整原因(必填)"
|
||||
class="popup-field"
|
||||
/>
|
||||
<van-field
|
||||
@@ -506,7 +544,7 @@ async function copyListingCode() {
|
||||
@click="handleCounterCheckout"
|
||||
class="popup-submit"
|
||||
>
|
||||
提交提案给租客确认
|
||||
提交给对方确认
|
||||
</van-button>
|
||||
</div>
|
||||
</van-popup>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user