From 89bf5f30ba489eebabafe47774a0261ba37f21ab Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 9 Aug 2026 21:35:40 +0800 Subject: [PATCH] fix(order): complete checkout details and deposit warning --- .../admin/views/AdminOrderDetailView.vue | 13 ++++++++ .../components/OrderResourceUsageEditor.vue | 30 ++++++++++++++++++- .../orders/composables/useOrderActions.ts | 8 ++++- .../orders/composables/useOrderSnapshot.ts | 15 +++++++--- 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/frontend/src/features/admin/views/AdminOrderDetailView.vue b/frontend/src/features/admin/views/AdminOrderDetailView.vue index 0ff6a95..9991d3f 100644 --- a/frontend/src/features/admin/views/AdminOrderDetailView.vue +++ b/frontend/src/features/admin/views/AdminOrderDetailView.vue @@ -231,6 +231,10 @@ const paidOrderPayment = computed(() => ) const currentSnapshot = computed(() => readSnapshot(order.value)) const snapshotHafCoinM = computed(() => getSnapshotHafCoinM(order.value)) +const checkoutRemainingHafCoinM = computed(() => { + if (!order.value?.checkout) return 0 + return Number(snapshotHafCoinM.value || 0) - Number(order.value.checkout.coin_consumed_m || 0) +}) const snapshotResources = computed(() => readSnapshotResources(order.value).slice(0, 6)) const assetSummary = computed(() => { const snapshot = order.value?.account_snapshot @@ -1218,6 +1222,15 @@ function paymentPaidAt(record: AdminPayment) {
哈夫币消耗
{{ quantity(order.checkout.coin_consumed_m) }}M
+
+
哈夫币预计剩余
+
+ {{ quantity(checkoutRemainingHafCoinM) }}M +
+
+ 打超 {{ quantity(-checkoutRemainingHafCoinM) }}M(按比例从押金扣) +
+
积分计算基数
{{ moneyCent(order.growth_points_basis_cent) }}
diff --git a/frontend/src/features/orders/components/OrderResourceUsageEditor.vue b/frontend/src/features/orders/components/OrderResourceUsageEditor.vue index 6490510..2997465 100644 --- a/frontend/src/features/orders/components/OrderResourceUsageEditor.vue +++ b/frontend/src/features/orders/components/OrderResourceUsageEditor.vue @@ -108,7 +108,9 @@ function updateNumberField(field: 'coin_consumed_m' | 'otherAmountYuan', event: - +
仅填写封禁、违规、资产损坏等需要从押金赔付的费用。
+
+ 注意:提交后将直接从预收押金中扣除 ¥{{ + money(props.checkoutForm.otherAmountYuan) + }},并计入号主赔付。 +
@@ -250,6 +260,14 @@ function updateNumberField(field: 'coin_consumed_m' | 'otherAmountYuan', event:
+
+ 注意:提交后将直接从预收押金中扣除 ¥{{ + money(props.checkoutForm.otherAmountYuan) + }},并计入号主赔付。 +
额外消耗品已用 @@ -659,6 +677,16 @@ function updateNumberField(field: 'coin_consumed_m' | 'otherAmountYuan', event: line-height: 1.5; } +.deposit-deduct-warning { + padding: 8px 10px; + border: 1px solid #fed7aa; + border-radius: 6px; + background: #fff7ed; + color: #c2410c; + font-size: 12px; + line-height: 1.5; +} + .checkout-fee-preview { margin: 0 16px 12px; } diff --git a/frontend/src/features/orders/composables/useOrderActions.ts b/frontend/src/features/orders/composables/useOrderActions.ts index a91bcd3..b380bbd 100644 --- a/frontend/src/features/orders/composables/useOrderActions.ts +++ b/frontend/src/features/orders/composables/useOrderActions.ts @@ -367,11 +367,17 @@ export function useOrderActions(options: UseOrderActionsOptions) { async function handleSubmitCheckout() { if (!order.value) return + const depositDeductAmountYuan = Number(checkoutForm.value.otherAmountYuan || 0) if (needsConfirm('submitCheckout')) { + const depositWarning = + depositDeductAmountYuan > 0 + ? `\n\n注意:押金赔付扣除 ¥${depositDeductAmountYuan.toFixed(2)} 将直接从预收押金中扣除,并计入号主赔付。` + : '' const ok = await options.confirm({ title: '确认提交结账', message: - '结账数据会影响租金、押金赔付和双方结算金额。请确认哈夫币消耗、额外消耗品、押金赔付和证据链接已认真核对,提交后将发送给号主确认。', + '结账数据会影响租金、押金赔付和双方结算金额。请确认哈夫币消耗、额外消耗品、押金赔付和证据链接已认真核对,提交后将发送给号主确认。' + + depositWarning, }) if (!ok) return } diff --git a/frontend/src/features/orders/composables/useOrderSnapshot.ts b/frontend/src/features/orders/composables/useOrderSnapshot.ts index baf46fa..33fc874 100644 --- a/frontend/src/features/orders/composables/useOrderSnapshot.ts +++ b/frontend/src/features/orders/composables/useOrderSnapshot.ts @@ -6,6 +6,7 @@ import type { Checkout, Order } from '../api/orders' export interface CheckoutFormSnapshot { content: string coin_consumed_m: number + otherAmountYuan?: number } export interface CounterFormSnapshot { @@ -37,9 +38,7 @@ export function useOrderCheckoutSnapshot(options: { const snapshotHafCoinM = computed(() => getSnapshotHafCoinM(options.order.value)) // 允许为负:表示打超(实际消耗 > 发布量) const remainingHafCoinM = computed(() => - roundQuantity( - snapshotHafCoinM.value - Number(options.checkoutForm.value.coin_consumed_m || 0) - ) + roundQuantity(snapshotHafCoinM.value - Number(options.checkoutForm.value.coin_consumed_m || 0)) ) function hydrateResourceUsage() { @@ -61,6 +60,7 @@ export function useOrderCheckoutSnapshot(options: { return buildCheckoutContentWithSummary({ content: options.checkoutForm.value.content, coinConsumedM: options.checkoutForm.value.coin_consumed_m, + depositDeductAmountYuan: options.checkoutForm.value.otherAmountYuan, checkoutResources: checkoutResources.value, resourceUsage: options.resourceUsage.value, remainingHafCoinM: remainingHafCoinM.value, @@ -146,6 +146,7 @@ export function calculateResourceChargeAmount( export function buildCheckoutContentWithSummary(options: { content: string coinConsumedM: number + depositDeductAmountYuan?: number checkoutResources: CheckoutResource[] resourceUsage: Record remainingHafCoinM: number @@ -170,13 +171,19 @@ export function buildCheckoutContentWithSummary(options: { if (Number(options.coinConsumedM || 0) > 0) { const remain = Number(options.remainingHafCoinM || 0) if (remain >= 0) { - lines.push(`哈夫币实际消耗:${quantity(options.coinConsumedM)}M,预计剩余${quantity(remain)}M`) + lines.push( + `哈夫币实际消耗:${quantity(options.coinConsumedM)}M,预计剩余${quantity(remain)}M` + ) } else { lines.push( `哈夫币实际消耗:${quantity(options.coinConsumedM)}M,打超${quantity(-remain)}M(超额按比例从押金结算)` ) } } + const depositDeductAmountYuan = Number(options.depositDeductAmountYuan || 0) + if (depositDeductAmountYuan > 0) { + lines.push(`押金赔付扣除:¥${depositDeductAmountYuan.toFixed(2)}(将直接从预收押金中扣除)`) + } if (lines.length === 0) { lines.push('租客发起结账。') }