192 lines
5.3 KiB
TypeScript
192 lines
5.3 KiB
TypeScript
import { apiClient } from './client'
|
|
|
|
export interface Order {
|
|
id: number
|
|
order_no: string
|
|
listing_id: number
|
|
account_id: number
|
|
owner_id: number
|
|
renter_id: number
|
|
owner_phone?: string
|
|
renter_phone?: string
|
|
title: string
|
|
server_region: string
|
|
login_platform: string
|
|
rented_at?: string
|
|
estimated_duration_hours: number
|
|
rent_start_at?: string
|
|
rent_end_at?: string
|
|
rent_amount: number
|
|
deposit_amount: number
|
|
platform_fee: number
|
|
account_snapshot?: Record<string, unknown>
|
|
status: string
|
|
handoff_status: string
|
|
settlement_status: string
|
|
checkout?: Checkout
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface Checkout {
|
|
id: number
|
|
order_id: number
|
|
initiated_by: number
|
|
status: string
|
|
rent_amount: number
|
|
deposit_amount: number
|
|
consumable_amount: number
|
|
coin_consumed_m: number
|
|
other_amount: number
|
|
deposit_deduct_amount: number
|
|
renter_refund_amount: number
|
|
owner_income_amount: number
|
|
content: string
|
|
evidence_urls: string[]
|
|
owner_adjustment_reason: string
|
|
owner_adjusted_at?: string
|
|
renter_confirmed_at?: string
|
|
renter_rejected_at?: string
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface HandoffRecord {
|
|
id: number
|
|
order_id: number
|
|
from_user_id: number
|
|
to_user_id: number
|
|
type: string
|
|
content: string
|
|
confirmed_by_renter_at?: string
|
|
confirmed_by_owner_at?: string
|
|
created_at: string
|
|
}
|
|
|
|
export interface SubmitCheckoutPayload {
|
|
content: string
|
|
consumable_amount: number
|
|
coin_consumed_m: number
|
|
other_amount: number
|
|
evidence_urls: string[]
|
|
}
|
|
|
|
export interface CounterCheckoutPayload {
|
|
consumable_amount: number
|
|
coin_consumed_m: number
|
|
other_amount: number
|
|
deposit_deduct_amount: number
|
|
reason: string
|
|
evidence_urls: string[]
|
|
}
|
|
|
|
interface ApiResponse<T> {
|
|
code: string
|
|
message: string
|
|
data: T
|
|
}
|
|
|
|
export interface PaginatedResult<T> {
|
|
items: T[]
|
|
total: number
|
|
page: number
|
|
page_size: number
|
|
}
|
|
|
|
export async function createOrder(listingId: number) {
|
|
const { data } = await apiClient.post<ApiResponse<Order>>('/orders', {
|
|
listing_id: listingId,
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function payOrder(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ paid: boolean }>>(`/orders/${id}/pay`)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchOrders() {
|
|
const { data } = await apiClient.get<ApiResponse<{ items: Order[] }>>('/orders')
|
|
return data.data.items
|
|
}
|
|
|
|
export async function fetchAdminOrders() {
|
|
const { data } = await apiClient.get<ApiResponse<{ items: Order[] }>>('/admin/orders')
|
|
return data.data.items
|
|
}
|
|
|
|
export async function fetchOrder(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<Order>>(`/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminOrder(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<Order>>(`/admin/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function cancelOrder(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ cancelled: boolean }>>(`/orders/${id}/cancel`)
|
|
return data.data
|
|
}
|
|
|
|
export async function submitHandoff(id: number, content: string) {
|
|
const { data } = await apiClient.post<ApiResponse<HandoffRecord>>(`/orders/${id}/handoff`, { content })
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchHandoffRecords(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<{ items: HandoffRecord[] }>>(`/orders/${id}/handoff-records`)
|
|
return data.data.items
|
|
}
|
|
|
|
export async function fetchAdminHandoffRecords(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<{ items: HandoffRecord[] }>>(`/admin/orders/${id}/handoff-records`)
|
|
return data.data.items
|
|
}
|
|
|
|
export async function adminCloseOrder(id: number, reason: string) {
|
|
const { data } = await apiClient.post<ApiResponse<{ closed: boolean }>>(`/admin/orders/${id}/close`, { reason })
|
|
return data.data
|
|
}
|
|
|
|
export async function adminMarkOrderAbnormal(id: number, reason: string) {
|
|
const { data } = await apiClient.post<ApiResponse<{ abnormal: boolean }>>(`/admin/orders/${id}/mark-abnormal`, { reason })
|
|
return data.data
|
|
}
|
|
|
|
export async function confirmReceive(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ received: boolean }>>(`/orders/${id}/confirm-receive`)
|
|
return data.data
|
|
}
|
|
|
|
export async function submitReturn(id: number, content: string) {
|
|
const { data } = await apiClient.post<ApiResponse<HandoffRecord>>(`/orders/${id}/return`, { content })
|
|
return data.data
|
|
}
|
|
|
|
export async function confirmReturn(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ completed: boolean }>>(`/orders/${id}/confirm-return`)
|
|
return data.data
|
|
}
|
|
|
|
export async function submitCheckout(id: number, payload: SubmitCheckoutPayload) {
|
|
const { data } = await apiClient.post<ApiResponse<HandoffRecord>>(`/orders/${id}/checkout`, payload)
|
|
return data.data
|
|
}
|
|
|
|
export async function confirmCheckout(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ completed: boolean }>>(`/orders/${id}/checkout/confirm`)
|
|
return data.data
|
|
}
|
|
|
|
export async function counterCheckout(id: number, payload: CounterCheckoutPayload) {
|
|
const { data } = await apiClient.post<ApiResponse<Checkout>>(`/orders/${id}/checkout/counter`, payload)
|
|
return data.data
|
|
}
|
|
|
|
export async function acceptCheckout(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ completed: boolean }>>(`/orders/${id}/checkout/accept`)
|
|
return data.data
|
|
}
|