优化订单交接和结账界面

This commit is contained in:
yml
2026-06-19 07:01:40 +08:00
parent ae28858318
commit 438a4259f9
5 changed files with 752 additions and 295 deletions
@@ -48,9 +48,9 @@ export interface UseOrderActionsOptions {
notifyError: (message: string) => void
/** 警告提示,用于表单校验未通过等非致命场景。 */
notifyWarning: (message: string) => void
/** 二次确认。返回 true 表示用户确认继续,false 表示取消。PC 注入直接 resolve(true)Mobile 注入 showDialog。 */
/** 二次确认。返回 true 表示用户确认继续,false 表示取消。 */
confirm: (opts: { title: string; message: string }) => Promise<boolean>
/** 需要走二次确认的 handler 名集合。Mobile 传 ['cancel','confirmCheckout','acceptCheckout','cancelDispute']PC 传 []。 */
/** 需要走二次确认的 handler 名集合。 */
actionsNeedingConfirm: readonly string[]
/** 支付前选择支付方式。返回 null 表示用户取消支付。 */
selectPayWay: () => Promise<PaymentPayWay | null>
@@ -78,6 +78,7 @@ export const CONFIRMABLE_ACTIONS = [
'confirmCheckout',
'acceptCheckout',
'cancelDispute',
'submitCheckout',
] as const
export interface CheckoutFormState {
@@ -152,6 +153,7 @@ export function useOrderActions(options: UseOrderActionsOptions) {
const disputeType = ref('cannot_login')
const disputeDescription = ref('')
const disputeEvidenceText = ref('')
let checkoutDefaultsHydratedOrderID: number | null = null
// 结账快照能力(资源金额、内容摘要、资源使用量规范化)
const {
@@ -217,12 +219,28 @@ export function useOrderActions(options: UseOrderActionsOptions) {
counterForm.value = hydrateCounterFormFromCheckout(order.value.checkout)
}
function hydrateCheckoutDefaults() {
if (!order.value || !isRenter.value || !['renting', 'overdue'].includes(order.value.status)) {
return
}
if (checkoutDefaultsHydratedOrderID === order.value.id) return
const defaultCoinConsumedM = snapshotHafCoinM.value
if (defaultCoinConsumedM > 0 && Number(checkoutForm.value.coin_consumed_m || 0) <= 0) {
checkoutForm.value = {
...checkoutForm.value,
coin_consumed_m: defaultCoinConsumedM,
}
}
checkoutDefaultsHydratedOrderID = order.value.id
}
async function loadOrder() {
loading.value = true
try {
order.value = await fetchOrder(String(route.params.id))
handoffRecords.value = await fetchHandoffRecords(String(route.params.id))
hydrateResourceUsage()
hydrateCheckoutDefaults()
hydrateCounterForm()
if (
!autoPayHandled &&
@@ -317,6 +335,14 @@ export function useOrderActions(options: UseOrderActionsOptions) {
async function handleSubmitCheckout() {
if (!order.value) return
if (needsConfirm('submitCheckout')) {
const ok = await options.confirm({
title: '确认提交结账',
message:
'结账数据会影响租金、押金赔付和双方结算金额。请确认哈夫币消耗、额外消耗品、押金赔付和证据链接已认真核对,提交后将发送给号主确认。',
})
if (!ok) return
}
returning.value = true
try {
const consumableAmount = resourceChargeAmount.value