307 lines
8.8 KiB
TypeScript
307 lines
8.8 KiB
TypeScript
import { apiClient } from '@/shared/api/client'
|
|
import type { ApiResponse, PaginatedResult } from '@/shared/types/types'
|
|
import type { HandoffStatus, OrderStatus, SettlementStatus } from '@/shared/types/status'
|
|
|
|
export interface Order {
|
|
id: number
|
|
order_no: string
|
|
listing_id: number
|
|
listing_no: string
|
|
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
|
|
price_role?: 'renter' | 'owner' | 'admin' | string
|
|
display_amount_cent: number
|
|
/** @deprecated use display_amount_cent */
|
|
display_amount?: number
|
|
rent_amount_cent?: number
|
|
/** @deprecated use rent_amount_cent */
|
|
rent_amount?: number
|
|
owner_rent_amount_cent?: number
|
|
/** @deprecated use owner_rent_amount_cent */
|
|
owner_rent_amount?: number
|
|
deposit_amount_cent: number
|
|
/** @deprecated use deposit_amount_cent */
|
|
deposit_amount?: number
|
|
deposit_original_amount_cent: number
|
|
/** @deprecated use deposit_original_amount_cent */
|
|
deposit_original_amount?: number
|
|
deposit_waived_amount_cent: number
|
|
/** @deprecated use deposit_waived_amount_cent */
|
|
deposit_waived_amount?: number
|
|
platform_fee_cent?: number
|
|
/** @deprecated use platform_fee_cent */
|
|
platform_fee?: number
|
|
account_snapshot?: Record<string, unknown>
|
|
listing_snapshot?: string
|
|
checkout_info?: string
|
|
counter_info?: string
|
|
status: OrderStatus
|
|
handoff_status: HandoffStatus
|
|
settlement_status: SettlementStatus
|
|
checkout?: Checkout
|
|
payment_deadline_at?: string
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface Checkout {
|
|
id: number
|
|
order_id: number
|
|
initiated_by: number
|
|
status: SettlementStatus
|
|
price_role?: 'renter' | 'owner' | 'admin' | string
|
|
display_amount_cent: number
|
|
/** @deprecated use display_amount_cent */
|
|
display_amount?: number
|
|
rent_amount_cent?: number
|
|
/** @deprecated use rent_amount_cent */
|
|
rent_amount?: number
|
|
owner_rent_amount_cent?: number
|
|
/** @deprecated use owner_rent_amount_cent */
|
|
owner_rent_amount?: number
|
|
platform_fee_cent?: number
|
|
deposit_amount_cent: number
|
|
/** @deprecated use deposit_amount_cent */
|
|
deposit_amount?: number
|
|
consumable_amount_cent: number
|
|
/** @deprecated use consumable_amount_cent */
|
|
consumable_amount?: number
|
|
coin_consumed_m: number
|
|
other_amount_cent: number
|
|
/** @deprecated use other_amount_cent */
|
|
other_amount?: number
|
|
deposit_deduct_amount_cent: number
|
|
/** @deprecated use deposit_deduct_amount_cent */
|
|
deposit_deduct_amount?: number
|
|
renter_refund_amount_cent?: number
|
|
/** @deprecated use renter_refund_amount_cent */
|
|
renter_refund_amount?: number
|
|
owner_income_amount_cent?: number
|
|
/** @deprecated use owner_income_amount_cent */
|
|
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 PaymentOrder {
|
|
id: number
|
|
payment_no: string
|
|
order_id: number
|
|
order_no: string
|
|
provider: string
|
|
third_order_id: string
|
|
provider_order_id: string
|
|
pay_way: string
|
|
jspay_flag: string
|
|
amount_cent: number
|
|
status: string
|
|
td_code?: string
|
|
jspay_url?: string
|
|
jspay_info?: string
|
|
paid: boolean
|
|
paid_at?: string
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface CheckoutPayload {
|
|
consumable_amount: number
|
|
coin_consumed_m: number
|
|
other_amount: number
|
|
deposit_deduct_amount?: number
|
|
content: string
|
|
evidence_urls: string[]
|
|
reason?: string
|
|
}
|
|
|
|
export interface RefundStatus {
|
|
order_id: number
|
|
order_no: string
|
|
refund_status: string
|
|
refund_amount_cent: number
|
|
refunded_at?: string
|
|
total_amount_cent: number
|
|
}
|
|
|
|
export interface AdminActionResponse {
|
|
updated?: boolean
|
|
closed?: boolean
|
|
refunded?: boolean
|
|
}
|
|
|
|
export async function fetchOrders() {
|
|
const { data } = await apiClient.get<ApiResponse<Order[]>>('/orders')
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchOrder(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<Order>>(`/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function createOrder(listingId: number) {
|
|
const { data } = await apiClient.post<ApiResponse<Order>>('/orders', { listing_id: listingId })
|
|
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 fetchHandoffRecords(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<HandoffRecord[]>>(`/orders/${id}/handoff-records`)
|
|
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 confirmReceive(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ confirmed: boolean }>>(
|
|
`/orders/${id}/confirm-receive`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function startOrderPayment(
|
|
orderId: number,
|
|
options: { pay_way?: string; jspay_flag?: string } = {}
|
|
) {
|
|
const { data } = await apiClient.post<ApiResponse<PaymentOrder>>(
|
|
`/orders/${orderId}/start-payment`,
|
|
{
|
|
pay_way: options.pay_way || '',
|
|
jspay_flag: options.jspay_flag || '',
|
|
}
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function queryOrderPayment(orderId: number) {
|
|
const { data } = await apiClient.get<ApiResponse<PaymentOrder>>(`/orders/${orderId}/query-payment`)
|
|
return data.data
|
|
}
|
|
|
|
export async function submitCheckout(orderId: number, payload: CheckoutPayload) {
|
|
const { data } = await apiClient.post<ApiResponse<Checkout>>(`/orders/${orderId}/checkout`, payload)
|
|
return data.data
|
|
}
|
|
|
|
export async function confirmCheckout(orderId: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ confirmed: boolean }>>(
|
|
`/orders/${orderId}/checkout/confirm`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function acceptCheckout(orderId: number) {
|
|
const { data } = await apiClient.post<ApiResponse<{ accepted: boolean }>>(
|
|
`/orders/${orderId}/checkout/accept`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function rejectCheckout(orderId: number, reason?: string) {
|
|
const { data } = await apiClient.post<ApiResponse<{ rejected: boolean }>>(
|
|
`/orders/${orderId}/checkout/reject`,
|
|
{ reason: reason || '' }
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function counterCheckout(orderId: number, payload: CheckoutPayload) {
|
|
const { data } = await apiClient.post<ApiResponse<Checkout>>(
|
|
`/orders/${orderId}/checkout/counter`,
|
|
payload
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminOrders(page = 1, pageSize = 20) {
|
|
const { data } = await apiClient.get<ApiResponse<PaginatedResult<Order>>>('/admin/orders', {
|
|
params: { page, page_size: pageSize },
|
|
})
|
|
const result = data.data
|
|
return {
|
|
items: Array.isArray(result?.items) ? result.items : [],
|
|
total: Number(result?.total ?? 0),
|
|
page: Number(result?.page ?? page),
|
|
page_size: Number(result?.page_size ?? pageSize),
|
|
}
|
|
}
|
|
|
|
export async function fetchAdminOrder(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<Order>>(`/admin/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminHandoffRecords(id: string | number) {
|
|
const { data } = await apiClient.get<ApiResponse<HandoffRecord[]>>(
|
|
`/admin/orders/${id}/handoff-records`
|
|
)
|
|
return data.data ?? []
|
|
}
|
|
|
|
export async function adminCloseOrder(id: number, reason: string) {
|
|
const { data } = await apiClient.post<ApiResponse<AdminActionResponse>>(`/admin/orders/${id}/close`, {
|
|
reason,
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function adminMarkOrderAbnormal(id: number, reason: string) {
|
|
const { data } = await apiClient.post<ApiResponse<AdminActionResponse>>(
|
|
`/admin/orders/${id}/mark-abnormal`,
|
|
{ reason }
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function adminRefundOrder(id: number) {
|
|
const { data } = await apiClient.post<ApiResponse<RefundStatus>>(`/admin/orders/${id}/refund`)
|
|
return data.data
|
|
}
|
|
|
|
export async function adminRefundStatus(id: number) {
|
|
const { data } = await apiClient.get<ApiResponse<RefundStatus>>(
|
|
`/admin/orders/${id}/refund-status`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
// Backward-compatible names kept for existing pages/composables.
|
|
export const startPayment = (orderId: number, payWay: string, jsPayFlag?: string) =>
|
|
startOrderPayment(orderId, { pay_way: payWay, jspay_flag: jsPayFlag })
|
|
export const queryPayment = queryOrderPayment
|
|
export const createCheckout = submitCheckout
|
|
export const confirmHandoff = confirmReceive
|