311 lines
7.8 KiB
TypeScript
311 lines
7.8 KiB
TypeScript
import { apiClient } from '@/shared/api/client'
|
|
import type { ApiResponse } from '@/shared/types/types'
|
|
import type { PaymentOrder, PaymentPayWay } from '@/features/orders/api/orders'
|
|
|
|
export interface MohongCategory {
|
|
id: number
|
|
name: string
|
|
code: string
|
|
sort_order: number
|
|
status: string
|
|
product_count: number
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface MohongProduct {
|
|
id: number
|
|
category_id?: number | null
|
|
category_name?: string
|
|
title: string
|
|
cover_url: string
|
|
image_urls: string[]
|
|
description: string
|
|
price_cent: number
|
|
price: string
|
|
original_price_cent: number
|
|
original_price?: string
|
|
unit: string
|
|
stock: number
|
|
sort_order: number
|
|
status: string
|
|
qrcode_image_url?: string
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface MohongOrderItem {
|
|
product_id: number
|
|
title: string
|
|
cover_url: string
|
|
unit: string
|
|
quantity: number
|
|
unit_price_cent: number
|
|
unit_price: string
|
|
amount_cent: number
|
|
amount: string
|
|
}
|
|
|
|
export interface MohongOrder {
|
|
id: number
|
|
order_no: string
|
|
user_id: number
|
|
product_id: number
|
|
quantity: number
|
|
unit_price_cent: number
|
|
unit_price: string
|
|
amount_cent: number
|
|
amount: string
|
|
status: string
|
|
product_title: string
|
|
product_cover_url: string
|
|
product_unit: string
|
|
items?: MohongOrderItem[]
|
|
qrcode_url_snapshot: string
|
|
copy_text: string
|
|
buyer_nickname?: string
|
|
buyer_phone?: string
|
|
admin_remark?: string
|
|
cancel_reason?: string
|
|
paid_at?: string | null
|
|
completed_at?: string | null
|
|
cancelled_at?: string | null
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface MohongCheckoutItem {
|
|
product_id: number
|
|
quantity: number
|
|
}
|
|
|
|
export interface MohongConfig {
|
|
default_qrcode_url: string
|
|
order_copy_template: string
|
|
}
|
|
|
|
export interface Paginated<T> {
|
|
items: T[]
|
|
total: number
|
|
page: number
|
|
page_size: number
|
|
}
|
|
|
|
export async function fetchMohongCategories() {
|
|
const { data } = await apiClient.get<ApiResponse<MohongCategory[]>>('/crash/categories')
|
|
return data.data || []
|
|
}
|
|
|
|
export async function fetchMohongProducts(params?: {
|
|
keyword?: string
|
|
category_id?: number
|
|
page?: number
|
|
page_size?: number
|
|
}) {
|
|
const { data } = await apiClient.get<ApiResponse<Paginated<MohongProduct>>>('/crash/products', {
|
|
params,
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchMohongProduct(id: number | string) {
|
|
const { data } = await apiClient.get<ApiResponse<MohongProduct>>(`/crash/products/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
/** 单商品或购物车多商品结账 */
|
|
export async function createMohongOrder(
|
|
productIdOrItems: number | MohongCheckoutItem[],
|
|
quantity = 1
|
|
) {
|
|
const payload = Array.isArray(productIdOrItems)
|
|
? { items: productIdOrItems }
|
|
: { product_id: productIdOrItems, quantity }
|
|
const { data } = await apiClient.post<ApiResponse<MohongOrder>>('/crash/orders', payload)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchMyMohongOrders(params?: {
|
|
status?: string
|
|
page?: number
|
|
page_size?: number
|
|
}) {
|
|
const { data } = await apiClient.get<ApiResponse<Paginated<MohongOrder>>>('/crash/orders', {
|
|
params,
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchMyMohongOrder(id: number | string) {
|
|
const { data } = await apiClient.get<ApiResponse<MohongOrder>>(`/crash/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function cancelMyMohongOrder(id: number | string, reason?: string) {
|
|
const { data } = await apiClient.post<ApiResponse<MohongOrder>>(`/crash/orders/${id}/cancel`, {
|
|
reason: reason || '',
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function startMohongPayment(
|
|
orderId: number,
|
|
payWay: PaymentPayWay | string,
|
|
jsPayFlag?: string
|
|
) {
|
|
const { data } = await apiClient.post<ApiResponse<PaymentOrder>>(
|
|
`/crash/orders/${orderId}/start-payment`,
|
|
{
|
|
pay_way: payWay || 'ZFBZF',
|
|
jspay_flag: jsPayFlag || '',
|
|
}
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function queryMohongPayment(orderId: number) {
|
|
const { data } = await apiClient.get<ApiResponse<PaymentOrder>>(
|
|
`/crash/orders/${orderId}/query-payment`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
// Admin APIs
|
|
export async function fetchAdminMohongCategories() {
|
|
const { data } = await apiClient.get<ApiResponse<MohongCategory[]>>('/admin/crash/categories')
|
|
return data.data || []
|
|
}
|
|
|
|
export async function createAdminMohongCategory(payload: {
|
|
name: string
|
|
code?: string
|
|
sort_order?: number
|
|
status?: string
|
|
}) {
|
|
const { data } = await apiClient.post<ApiResponse<MohongCategory>>(
|
|
'/admin/crash/categories',
|
|
payload
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function updateAdminMohongCategory(
|
|
id: number,
|
|
payload: Partial<{ name: string; code: string; sort_order: number; status: string }>
|
|
) {
|
|
const { data } = await apiClient.put<ApiResponse<MohongCategory>>(
|
|
`/admin/crash/categories/${id}`,
|
|
payload
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function deleteAdminMohongCategory(id: number) {
|
|
const { data } = await apiClient.delete<ApiResponse<{ message: string }>>(
|
|
`/admin/crash/categories/${id}`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminMohongProducts(params?: {
|
|
keyword?: string
|
|
status?: string
|
|
category_id?: number
|
|
page?: number
|
|
page_size?: number
|
|
}) {
|
|
const { data } = await apiClient.get<ApiResponse<Paginated<MohongProduct>>>(
|
|
'/admin/crash/products',
|
|
{ params }
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminMohongProduct(id: number | string) {
|
|
const { data } = await apiClient.get<ApiResponse<MohongProduct>>(`/admin/crash/products/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function createAdminMohongProduct(payload: Partial<MohongProduct> & { title: string; price_cent: number }) {
|
|
const { data } = await apiClient.post<ApiResponse<MohongProduct>>('/admin/crash/products', payload)
|
|
return data.data
|
|
}
|
|
|
|
export async function updateAdminMohongProduct(id: number, payload: Record<string, unknown>) {
|
|
const { data } = await apiClient.put<ApiResponse<MohongProduct>>(
|
|
`/admin/crash/products/${id}`,
|
|
payload
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function deleteAdminMohongProduct(id: number) {
|
|
const { data } = await apiClient.delete<ApiResponse<{ message: string }>>(
|
|
`/admin/crash/products/${id}`
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminMohongOrders(params?: {
|
|
status?: string
|
|
keyword?: string
|
|
page?: number
|
|
page_size?: number
|
|
}) {
|
|
const { data } = await apiClient.get<ApiResponse<Paginated<MohongOrder>>>('/admin/crash/orders', {
|
|
params,
|
|
})
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminMohongOrder(id: number | string) {
|
|
const { data } = await apiClient.get<ApiResponse<MohongOrder>>(`/admin/crash/orders/${id}`)
|
|
return data.data
|
|
}
|
|
|
|
export async function completeAdminMohongOrder(id: number, remark?: string) {
|
|
const { data } = await apiClient.post<ApiResponse<MohongOrder>>(
|
|
`/admin/crash/orders/${id}/complete`,
|
|
{ remark: remark || '' }
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function cancelAdminMohongOrder(id: number, reason?: string) {
|
|
const { data } = await apiClient.post<ApiResponse<MohongOrder>>(
|
|
`/admin/crash/orders/${id}/cancel`,
|
|
{ reason: reason || '' }
|
|
)
|
|
return data.data
|
|
}
|
|
|
|
export async function fetchAdminMohongConfig() {
|
|
const { data } = await apiClient.get<ApiResponse<MohongConfig>>('/admin/crash/config')
|
|
return data.data
|
|
}
|
|
|
|
export async function updateAdminMohongConfig(payload: Partial<MohongConfig>) {
|
|
const { data } = await apiClient.put<ApiResponse<MohongConfig>>('/admin/crash/config', payload)
|
|
return data.data
|
|
}
|
|
|
|
export function mohongOrderStatusLabel(status: string) {
|
|
const map: Record<string, string> = {
|
|
pending_payment: '待支付',
|
|
paid: '已支付',
|
|
completed: '已完成',
|
|
cancelled: '已取消',
|
|
refunded: '已退款',
|
|
}
|
|
return map[status] || status
|
|
}
|
|
|
|
export function mohongProductStatusLabel(status: string) {
|
|
const map: Record<string, string> = {
|
|
draft: '草稿',
|
|
on_sale: '上架中',
|
|
off_sale: '已下架',
|
|
}
|
|
return map[status] || status
|
|
}
|