Files
hfb_sys/frontend/src/features/mohong/api/mohong.ts
T
yml2213 a4189db4ca 业务更名为撞车并切换crash路由
用户可见文案与页面/API路径改为撞车与crash,保留mohong表与权限码兼容;移动端入口去掉租/撞图标。
2026-07-16 21:19:35 +08:00

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
}