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:
yml2213
2026-06-04 08:45:31 +08:00
co-authored by Claude Opus 4.7
parent b5903a169f
commit 125d83f2f2
13 changed files with 5075 additions and 146 deletions
@@ -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,
}
}