feat: P1阶段完成 - 订单模块迁移与重构
## P1.3: 订单模块(orders)✅ ### 完整迁移 - 迁移 API: orders.ts - 迁移 Views: 5个页面(桌面3 + 移动2) - 迁移 Composables: useOrderSnapshot.ts - 更新所有导入路径到 shared/ ### 核心重构:拆分 useOrderDetail.ts 原始文件405行,混合了订单、支付、结算、争议等多个领域 **拆分为3个独立 composables:** 1. **usePaymentPolling.ts** - 支付轮询 - 职责:轮询查询支付状态直到完成 - 功能:开始/停止轮询、检查支付状态、自动重载 - 代码:~65行 2. **useSettlement.ts** - 结算流程 - 职责:处理订单结算完整流程 - 功能:提交/接受/反驳/确认结算、表单管理 - 代码:~170行 3. **useOrderDetail.ts** - 核心订单(重构后) - 职责:订单核心流程,组合使用上述composables - 功能:加载、取消、支付、交接、收货、争议 - 代码:~215行 **重构优势:** - 职责清晰,单一职责原则 - 可复用,支付和结算逻辑可独立使用 - 易测试,每个composable独立可测 - 易维护,从405行拆分为3个文件 ### 技术改进 - 建立清晰的模块边界和导出规范 - 避免循环依赖 - 提高代码可测试性和可维护性 ## 里程碑 🎉 **P1 阶段完成!** - ✅ P0: 基础设施(shared/)- 22个文件 - ✅ P1.1: 钱包模块 - 5个文件 - ✅ P1.2: 聊天模块 - 8个文件 - ✅ P1.3: 订单模块 - 11个文件 **总计:** 3个核心业务模块,46个文件完成迁移 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
b5903a169f
commit
125d83f2f2
@@ -0,0 +1,167 @@
|
||||
import { ref, computed } from 'vue'
|
||||
import { submitCheckout, acceptCheckout, counterCheckout, confirmCheckout } from '../api/orders'
|
||||
import type { Order } from '../api/orders'
|
||||
|
||||
export interface CheckoutForm {
|
||||
content: string
|
||||
consumable_amount: number
|
||||
coin_consumed_m: number
|
||||
other_amount: number
|
||||
evidenceText: string
|
||||
}
|
||||
|
||||
export interface CounterForm {
|
||||
consumable_amount: number
|
||||
coin_consumed_m: number
|
||||
other_amount: number
|
||||
deposit_deduct_amount: number
|
||||
reason: string
|
||||
evidenceText: string
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单结算 Composable
|
||||
* 负责处理订单结算流程:提交结算、接受结算、反驳结算、确认结算
|
||||
*/
|
||||
export function useSettlement(order: globalThis.Ref<Order | null>) {
|
||||
const returning = ref(false)
|
||||
const acceptingCheckout = ref(false)
|
||||
const countering = ref(false)
|
||||
const rejectingCheckout = ref(false)
|
||||
const completing = ref(false)
|
||||
|
||||
const checkoutForm = ref<CheckoutForm>({
|
||||
content: '',
|
||||
consumable_amount: 0,
|
||||
coin_consumed_m: 0,
|
||||
other_amount: 0,
|
||||
evidenceText: '',
|
||||
})
|
||||
|
||||
const counterForm = ref<CounterForm>({
|
||||
consumable_amount: 0,
|
||||
coin_consumed_m: 0,
|
||||
other_amount: 0,
|
||||
deposit_deduct_amount: 0,
|
||||
reason: '',
|
||||
evidenceText: '',
|
||||
})
|
||||
|
||||
const resourceUsage = ref<Record<string, number>>({})
|
||||
|
||||
/**
|
||||
* 提交结算单
|
||||
*/
|
||||
async function handleSubmitCheckout(onSuccess?: () => void) {
|
||||
if (!order.value) return false
|
||||
returning.value = true
|
||||
try {
|
||||
await submitCheckout(order.value.id, {
|
||||
content: checkoutForm.value.content.trim(),
|
||||
consumable_amount: checkoutForm.value.consumable_amount,
|
||||
coin_consumed_m: checkoutForm.value.coin_consumed_m,
|
||||
other_amount: checkoutForm.value.other_amount,
|
||||
evidence: checkoutForm.value.evidenceText.trim(),
|
||||
})
|
||||
onSuccess?.()
|
||||
return true
|
||||
} finally {
|
||||
returning.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 接受对方的结算
|
||||
*/
|
||||
async function handleAcceptCheckout(onSuccess?: () => void) {
|
||||
if (!order.value) return false
|
||||
acceptingCheckout.value = true
|
||||
try {
|
||||
await acceptCheckout(order.value.id)
|
||||
onSuccess?.()
|
||||
return true
|
||||
} finally {
|
||||
acceptingCheckout.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 反驳对方的结算
|
||||
*/
|
||||
async function handleCounterCheckout(onSuccess?: () => void) {
|
||||
if (!order.value) return false
|
||||
countering.value = true
|
||||
try {
|
||||
await counterCheckout(order.value.id, {
|
||||
consumable_amount: counterForm.value.consumable_amount,
|
||||
coin_consumed_m: counterForm.value.coin_consumed_m,
|
||||
other_amount: counterForm.value.other_amount,
|
||||
deposit_deduct_amount: counterForm.value.deposit_deduct_amount,
|
||||
reason: counterForm.value.reason.trim(),
|
||||
evidence: counterForm.value.evidenceText.trim(),
|
||||
})
|
||||
onSuccess?.()
|
||||
return true
|
||||
} finally {
|
||||
countering.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 拒绝对方的结算(简化版反驳)
|
||||
*/
|
||||
async function handleRejectCheckout(reason: string, onSuccess?: () => void) {
|
||||
if (!order.value) return false
|
||||
rejectingCheckout.value = true
|
||||
try {
|
||||
await counterCheckout(order.value.id, {
|
||||
consumable_amount: 0,
|
||||
coin_consumed_m: 0,
|
||||
other_amount: 0,
|
||||
deposit_deduct_amount: 0,
|
||||
reason: reason.trim(),
|
||||
evidence: '',
|
||||
})
|
||||
onSuccess?.()
|
||||
return true
|
||||
} finally {
|
||||
rejectingCheckout.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 确认最终结算
|
||||
*/
|
||||
async function handleConfirmCheckout(onSuccess?: () => void) {
|
||||
if (!order.value) return false
|
||||
completing.value = true
|
||||
try {
|
||||
await confirmCheckout(order.value.id)
|
||||
onSuccess?.()
|
||||
return true
|
||||
} finally {
|
||||
completing.value = false
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
// Loading states
|
||||
returning,
|
||||
acceptingCheckout,
|
||||
countering,
|
||||
rejectingCheckout,
|
||||
completing,
|
||||
|
||||
// Forms
|
||||
checkoutForm,
|
||||
counterForm,
|
||||
resourceUsage,
|
||||
|
||||
// Methods
|
||||
handleSubmitCheckout,
|
||||
handleAcceptCheckout,
|
||||
handleCounterCheckout,
|
||||
handleRejectCheckout,
|
||||
handleConfirmCheckout,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user