admin模块接入数据库
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import supa from '@/components/supadb/aksupainstance.uts'
|
||||
import { rpcOrNull, rpcOrValue } from '@/services/analytics/rpc.uts'
|
||||
|
||||
export type AdminProduct = {
|
||||
@@ -9,7 +10,27 @@ export type AdminProduct = {
|
||||
sales: number
|
||||
status: number
|
||||
created_at: string
|
||||
category_id: string
|
||||
category_name: string
|
||||
subtitle: string | null
|
||||
description: string | null
|
||||
product_code: string | null
|
||||
unit: string | null
|
||||
image_urls: string[] | null
|
||||
video_urls: string[] | null
|
||||
tags: string[] | null
|
||||
attributes: any | null
|
||||
}
|
||||
|
||||
export type AdminProductSku = {
|
||||
id?: string
|
||||
product_id?: string
|
||||
sku_code: string
|
||||
specifications: any
|
||||
price: number
|
||||
stock: number
|
||||
status: number
|
||||
image_url: string | null
|
||||
}
|
||||
|
||||
export type ProductPageResult = {
|
||||
@@ -50,6 +71,87 @@ export async function fetchAdminProductPage(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商品详情(包含 SKU 列表)
|
||||
*/
|
||||
export async function fetchAdminProductDetail(productId: string): Promise<{ product: AdminProduct | null, skus: AdminProductSku[] }> {
|
||||
const { data: productData, error: productError } = await supa
|
||||
.from('ml_products')
|
||||
.select('*, ml_categories(name)')
|
||||
.eq('id', productId)
|
||||
.single()
|
||||
.execute()
|
||||
|
||||
if (productError != null) {
|
||||
console.error('获取商品详情失败:', productError)
|
||||
return { product: null, skus: [] }
|
||||
}
|
||||
|
||||
const { data: skuData, error: skuError } = await supa
|
||||
.from('ml_product_skus')
|
||||
.select('*')
|
||||
.eq('product_id', productId)
|
||||
.execute()
|
||||
|
||||
const product = productData as any
|
||||
if (product != null && product.ml_categories != null) {
|
||||
product.category_name = (product.ml_categories as any).name
|
||||
}
|
||||
|
||||
return {
|
||||
product: product as AdminProduct,
|
||||
skus: (skuData ?? []) as AdminProductSku[]
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存商品(新增或更新,含 SKU 关联保存)
|
||||
*/
|
||||
export async function saveAdminProduct(product: Partial<AdminProduct>, skus: AdminProductSku[]): Promise<boolean> {
|
||||
const session = supa.getSession()
|
||||
const uid = session?.user?.getString('id')
|
||||
if (uid == null) return false
|
||||
|
||||
// 1. 保存商品主表
|
||||
const { data: savedProduct, error: productError } = await supa
|
||||
.from('ml_products')
|
||||
.upsert({
|
||||
...product,
|
||||
merchant_id: uid,
|
||||
updated_at: new Date().toISOString()
|
||||
})
|
||||
.select()
|
||||
.single()
|
||||
.execute()
|
||||
|
||||
if (productError != null || savedProduct == null) {
|
||||
console.error('保存商品主表失败:', productError)
|
||||
return false
|
||||
}
|
||||
|
||||
const savedProductId = (savedProduct as any).id as string
|
||||
|
||||
// 2. 保存 SKU(简单策略:先删除旧的再插入新的,或使用 upsert)
|
||||
// 注意:如果涉及订单关联,不能简单的物理删除旧 SKU
|
||||
const skuPayload = skus.map(s => ({
|
||||
...s,
|
||||
product_id: savedProductId,
|
||||
updated_at: new Date().toISOString()
|
||||
}))
|
||||
|
||||
const { error: skuError } = await supa
|
||||
.from('ml_product_skus')
|
||||
.upsert(skuPayload as any)
|
||||
.execute()
|
||||
|
||||
if (skuError != null) {
|
||||
console.error('保存 SKU 失败:', skuError)
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商品状态汇总统计
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user