Files
medical-mall/services/admin/shopManageService.uts
2026-03-20 17:51:59 +08:00

115 lines
3.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import supa from '@/components/supadb/aksupainstance.uts'
/**
* Admin 店铺列表项(对应 ml_shops 列表页所需字段)
*/
export type AdminShopItem = {
id: string
cid: number
merchant_id: string
shop_name: string
shop_logo: string | null
contact_name: string | null
contact_phone: string | null
status: number
product_count: number
order_count: number
rating_avg: number
rating_count: number
verified_at: string | null
created_at: string
}
/**
* Admin 店铺查询参数
*/
export type AdminShopQuery = {
searchName?: string | null
status?: number | null
startTime?: string | null
endTime?: string | null
page?: number
pageSize?: number
}
// 精确选取列表页需要字段,禁止 SELECT *
const LIST_COLUMNS = 'id,cid,merchant_id,shop_name,shop_logo,contact_name,contact_phone,status,product_count,order_count,rating_avg,rating_count,verified_at,created_at'
/**
* 分页查询 ml_shops服务端分页按需按页请求
*/
export async function fetchAdminShops(query?: AdminShopQuery): Promise<{ total: number; items: Array<AdminShopItem> }> {
const page = query?.page ?? 1
const pageSize = query?.pageSize ?? 20
const builder = supa
.from('ml_shops')
.select(LIST_COLUMNS)
.order('created_at', { ascending: false })
.limit(pageSize)
.page(page)
// 条件过滤(仅非空时才附加,避免无效 filter
if (query?.status != null) {
builder.eq('status', query.status)
}
if (query?.searchName != null && query.searchName !== '') {
builder.ilike('shop_name', `%${query.searchName}%`)
}
if (query?.startTime != null && query.startTime !== '') {
builder.gte('created_at', query.startTime)
}
if (query?.endTime != null && query.endTime !== '') {
builder.lte('created_at', query.endTime)
}
const result = await builder.execute()
if (result.error != null) {
console.error('[shopManageService] fetchAdminShops 失败:', result.error)
return { total: 0, items: [] as Array<AdminShopItem> }
}
const rawRows = (result.data ?? []) as any[]
const items: Array<AdminShopItem> = []
for (let i = 0; i < rawRows.length; i++) {
const row = rawRows[i] as UTSJSONObject
items.push({
id: row.getString('id') ?? '',
cid: row.getNumber('cid') ?? 0,
merchant_id: row.getString('merchant_id') ?? '',
shop_name: row.getString('shop_name') ?? '',
shop_logo: row.getString('shop_logo') ?? null,
contact_name: row.getString('contact_name') ?? null,
contact_phone: row.getString('contact_phone') ?? null,
status: row.getNumber('status') ?? 1,
product_count: row.getNumber('product_count') ?? 0,
order_count: row.getNumber('order_count') ?? 0,
rating_avg: row.getNumber('rating_avg') ?? 0,
rating_count: row.getNumber('rating_count') ?? 0,
verified_at: row.getString('verified_at') ?? null,
created_at: row.getString('created_at') ?? ''
} as AdminShopItem)
}
return { total: result.total ?? 0, items }
}
/**
* 更新指定店铺的状态1=正常 2=暂停 3=关闭)
*/
export async function updateAdminShopStatus(shopId: string, status: number): Promise<boolean> {
const result = await supa
.from('ml_shops')
.update({ status: status, updated_at: new Date().toISOString() } as UTSJSONObject)
.eq('id', shopId)
.execute()
if (result.error != null) {
console.error('[shopManageService] updateAdminShopStatus 失败:', result.error)
return false
}
return true
}