feat(distribution): 补齐分销长尾后台页面

This commit is contained in:
yml2213
2026-10-30 15:43:29 +08:00
parent 13a3127abc
commit 090ab02a67
25 changed files with 7728 additions and 2 deletions
+467
View File
@@ -1,6 +1,7 @@
import { adminClient } from '@/shared/api/adminClient'
import type { ApiResponse } from '@/shared/api/types'
import type {
AdminAccountDisplay,
AdminAnnouncement,
AdminAnnouncementPage,
AdminAnnouncementPayload,
@@ -12,8 +13,30 @@ import type {
AdminDispute,
AdminDisputePage,
AdminDisputeQuery,
AdminDistributionInvitationConfig,
AdminDistributionOrder,
AdminDistributionOrderPage,
AdminDistributionOrderQuery,
AdminDistributionQrCode,
AdminDistributionQrCodePage,
AdminDistributionQrCodeQuery,
AdminDistributionQrCodeStats,
AdminDistributionRule,
AdminDistributionRuleQuery,
AdminDistributionSettlementBatch,
AdminDistributionSettlementItem,
AdminDistributionSite,
AdminDistributionSiteUpdatePayload,
AdminDistributionSMSConfig,
AdminDistributionUserPage,
AdminDistributionUserQuery,
AdminDistributionWallet,
AdminDistributionWithdrawal,
AdminDistributionWithdrawalPage,
AdminSiteAnnouncement,
AdminSiteAnnouncementPage,
AdminSiteAnnouncementPayload,
AdminSiteAnnouncementQuery,
AdminListing,
AdminListingPage,
AdminListingQuery,
@@ -21,6 +44,10 @@ import type {
AdminOrderDetail,
AdminOrderPage,
AdminOrderQuery,
AdminPaymentChannel,
AdminPaymentConfigOption,
AdminReceivedListingPage,
AdminReceivedListingQuery,
AdminSystemConfig,
AdminSystemConfigUpdatePayload,
AdminUser,
@@ -30,6 +57,10 @@ import type {
AdminWithdrawal,
AdminWithdrawalPage,
AdminWithdrawalQuery,
ApplyAdminDistributionWithdrawalPayload,
CreateAdminDistributionQrCodeItem,
CreateAdminDistributionRulePayload,
CreateAdminDistributionSettlementBatchPayload,
DashboardData,
FinanceDashboard,
FinanceDetailPage,
@@ -39,6 +70,10 @@ import type {
OperatingExpensePage,
OperatingExpensePayload,
OperatingExpenseQuery,
TestAdminDistributionSMSConfigPayload,
UpdateAdminDistributionInvitationConfigPayload,
UpdateAdminDistributionQrCodePayload,
UpdateAdminDistributionSMSConfigPayload,
} from '@/features/admin/types'
export async function fetchAdminCaptcha() {
@@ -469,6 +504,438 @@ export async function updateAdminDistributionSite(
return data.data
}
export async function fetchAdminDistributionWallet(id: number | string) {
const { data } = await adminClient.get<ApiResponse<AdminDistributionWallet>>(
`/admin/distribution/sites/${id}/wallet`
)
return data.data
}
export async function applyAdminDistributionWithdrawal(
id: number | string,
payload: ApplyAdminDistributionWithdrawalPayload
) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionWithdrawal>>(
`/admin/distribution/sites/${id}/withdrawals`,
payload
)
return data.data
}
export async function fetchAdminDistributionWithdrawals(
id: number | string,
query: { page?: number; page_size?: number }
) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminDistributionWithdrawalPage>>>(
`/admin/distribution/sites/${id}/withdrawals`,
{ params: compactParams(query) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.page_size ?? 20,
}
}
export async function fetchAdminDistributionSMSConfig(id: number | string) {
const { data } = await adminClient.get<ApiResponse<AdminDistributionSMSConfig>>(
`/admin/distribution/sites/${id}/sms-config`
)
return data.data
}
export async function updateAdminDistributionSMSConfig(
id: number | string,
payload: UpdateAdminDistributionSMSConfigPayload
) {
const { data } = await adminClient.put<ApiResponse<AdminDistributionSMSConfig>>(
`/admin/distribution/sites/${id}/sms-config`,
payload
)
return data.data
}
export async function testAdminDistributionSMSConfig(
id: number | string,
payload: TestAdminDistributionSMSConfigPayload
) {
const { data } = await adminClient.post<ApiResponse<{ message?: string }>>(
`/admin/distribution/sites/${id}/sms-config/test`,
payload
)
return data.data
}
export async function fetchAdminDistributionInvitationConfig(id: number | string) {
const { data } = await adminClient.get<ApiResponse<AdminDistributionInvitationConfig>>(
`/admin/distribution/sites/${id}/invitation-config`
)
return data.data
}
export async function updateAdminDistributionInvitationConfig(
id: number | string,
payload: UpdateAdminDistributionInvitationConfigPayload
) {
const { data } = await adminClient.put<ApiResponse<AdminDistributionInvitationConfig>>(
`/admin/distribution/sites/${id}/invitation-config`,
payload
)
return data.data
}
export async function fetchAdminDistributionQrCodes(
id: number | string,
query: AdminDistributionQrCodeQuery
) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminDistributionQrCodePage>>>(
`/admin/distribution/sites/${id}/qrcodes`,
{ params: compactParams(query) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.limit ?? 20,
}
}
export async function fetchAdminDistributionQrCodeStats(id: number | string) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminDistributionQrCodeStats>>>(
`/admin/distribution/sites/${id}/qrcodes/stats`
)
return {
unused_count: data.data.unused_count ?? 0,
used_count: data.data.used_count ?? 0,
disabled_count: data.data.disabled_count ?? 0,
total_count: data.data.total_count ?? 0,
}
}
export async function batchCreateAdminDistributionQrCodes(
id: number | string,
items: CreateAdminDistributionQrCodeItem[]
) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionQrCode[]>>(
`/admin/distribution/sites/${id}/qrcodes/batch`,
{ items }
)
return data.data
}
export async function batchDeleteAdminDistributionQrCodes(
id: number | string,
ids: number[]
) {
const { data } = await adminClient.post<ApiResponse<{ deleted?: number }>>(
`/admin/distribution/sites/${id}/qrcodes/batch-delete`,
{ ids }
)
return data.data.deleted ?? 0
}
export async function updateAdminDistributionQrCode(
id: number | string,
qrcodeId: number,
payload: UpdateAdminDistributionQrCodePayload
) {
await adminClient.patch(`/admin/distribution/sites/${id}/qrcodes/${qrcodeId}`, payload)
}
export async function deleteAdminDistributionQrCode(id: number | string, qrcodeId: number) {
await adminClient.delete(`/admin/distribution/sites/${id}/qrcodes/${qrcodeId}`)
}
export async function fetchAdminDistributionRules(query: AdminDistributionRuleQuery) {
const { data } = await adminClient.get<ApiResponse<{ items?: AdminDistributionRule[] }>>(
'/admin/distribution/rules',
{ params: compactParams(query) }
)
return data.data.items ?? []
}
export async function createAdminDistributionRule(payload: CreateAdminDistributionRulePayload) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionRule>>(
'/admin/distribution/rules',
payload
)
return data.data
}
export async function updateAdminDistributionRuleStatus(
id: number,
status: 'draft' | 'active' | 'disabled'
) {
const { data } = await adminClient.put<ApiResponse<AdminDistributionRule>>(
`/admin/distribution/rules/${id}/status`,
{ status }
)
return data.data
}
export async function fetchAdminDistributionOrders(query: AdminDistributionOrderQuery) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminDistributionOrderPage>>>(
'/admin/distribution/orders',
{ params: compactParams(query) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.page_size ?? 20,
}
}
export async function fetchAdminDistributionOrder(id: number) {
const { data } = await adminClient.get<ApiResponse<AdminDistributionOrder>>(
`/admin/distribution/orders/${id}`
)
return data.data
}
export async function fetchAdminDistributionSettlementBatches(siteId: number) {
const { data } = await adminClient.get<
ApiResponse<{ items?: AdminDistributionSettlementBatch[] }>
>('/admin/distribution/settlement-batches', { params: { site_id: siteId } })
return data.data.items ?? []
}
export async function createAdminDistributionSettlementBatch(
payload: CreateAdminDistributionSettlementBatchPayload
) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionSettlementBatch>>(
'/admin/distribution/settlement-batches',
payload
)
return data.data
}
export async function fetchAdminDistributionSettlementItems(batchId: number) {
const { data } = await adminClient.get<
ApiResponse<{ items?: AdminDistributionSettlementItem[] }>
>(`/admin/distribution/settlement-batches/${batchId}/items`)
return data.data.items ?? []
}
export async function settleAdminDistributionSettlementBatch(batchId: number) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionSettlementBatch>>(
`/admin/distribution/settlement-batches/${batchId}/settle`
)
return data.data
}
export async function cancelAdminDistributionSettlementBatch(batchId: number) {
const { data } = await adminClient.post<ApiResponse<AdminDistributionSettlementBatch>>(
`/admin/distribution/settlement-batches/${batchId}/cancel`
)
return data.data
}
export async function fetchAdminDistributionUsers(
siteId: number,
query: AdminDistributionUserQuery
) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminDistributionUserPage>>>(
'/admin/distribution/users',
{ params: compactParams({ ...query, site_id: siteId }) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.page_size ?? 20,
total_users: data.data.total_users ?? 0,
order_users: data.data.order_users ?? 0,
}
}
export async function fetchAdminSiteAnnouncements(
siteId: number,
query: AdminSiteAnnouncementQuery
) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminSiteAnnouncementPage>>>(
'/admin/distribution/announcements',
{ params: compactParams({ ...query, site_id: siteId }) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.page_size ?? 20,
}
}
export async function createAdminSiteAnnouncement(
siteId: number,
payload: AdminSiteAnnouncementPayload
) {
const { data } = await adminClient.post<ApiResponse<AdminSiteAnnouncement>>(
'/admin/distribution/announcements',
payload,
{ params: { site_id: siteId } }
)
return data.data
}
export async function updateAdminSiteAnnouncement(
siteId: number,
id: number,
payload: AdminSiteAnnouncementPayload
) {
const { data } = await adminClient.put<ApiResponse<AdminSiteAnnouncement>>(
`/admin/distribution/announcements/${id}`,
payload,
{ params: { site_id: siteId } }
)
return data.data
}
export async function publishAdminSiteAnnouncement(siteId: number, id: number) {
const { data } = await adminClient.post<ApiResponse<AdminSiteAnnouncement>>(
`/admin/distribution/announcements/${id}/publish`,
{},
{ params: { site_id: siteId } }
)
return data.data
}
export async function archiveAdminSiteAnnouncement(siteId: number, id: number) {
const { data } = await adminClient.post<ApiResponse<AdminSiteAnnouncement>>(
`/admin/distribution/announcements/${id}/archive`,
{},
{ params: { site_id: siteId } }
)
return data.data
}
export async function unarchiveAdminSiteAnnouncement(siteId: number, id: number) {
const { data } = await adminClient.post<ApiResponse<AdminSiteAnnouncement>>(
`/admin/distribution/announcements/${id}/unarchive`,
{},
{ params: { site_id: siteId } }
)
return data.data
}
export async function deleteAdminSiteAnnouncement(siteId: number, id: number) {
await adminClient.delete(`/admin/distribution/announcements/${id}`, {
params: { site_id: siteId },
})
}
export async function fetchAdminReceivedListings(
siteId: number,
query: AdminReceivedListingQuery
) {
const { data } = await adminClient.get<ApiResponse<Partial<AdminReceivedListingPage>>>(
'/admin/distribution/received-listings',
{ params: compactParams({ ...query, site_id: siteId }) }
)
return {
items: data.data.items ?? [],
total: data.data.total ?? 0,
page: data.data.page ?? query.page ?? 1,
page_size: data.data.page_size ?? query.page_size ?? 20,
}
}
export async function updateAdminReceivedListingStatus(
listingId: number,
status: 'published' | 'offline'
) {
await adminClient.put(`/admin/distribution/received-listings/${listingId}/status`, { status })
}
export async function fetchAdminAccountDisplays(siteId: number, status?: string) {
const { data } = await adminClient.get<ApiResponse<{ items?: AdminAccountDisplay[] }>>(
'/admin/distribution/accounts',
{ params: compactParams({ site_id: siteId, status }) }
)
return data.data.items ?? []
}
export async function updateAdminAccountDisplay(
id: number,
displayStatus: 'enabled' | 'disabled'
) {
const { data } = await adminClient.put<ApiResponse<AdminAccountDisplay>>(
`/admin/distribution/accounts/${id}/display`,
{ display_status: displayStatus }
)
return data.data
}
export async function updateAdminAccountMarkup(id: number, shelfRatioDelta: number) {
const { data } = await adminClient.put<ApiResponse<AdminAccountDisplay>>(
`/admin/distribution/accounts/${id}/markup`,
{ shelf_ratio_delta: shelfRatioDelta }
)
return data.data
}
export async function batchUpdateAdminAccountDisplays(
siteId: number,
displayIds: number[],
targetStatus: 'enabled' | 'disabled'
) {
await adminClient.post(
'/admin/distribution/accounts/batch-display',
{
display_ids: displayIds,
target_status: targetStatus,
},
{ params: { site_id: siteId } }
)
}
export async function batchUpdateAdminAccountMarkup(
siteId: number,
displayIds: number[],
shelfRatioDelta: number
) {
await adminClient.post(
'/admin/distribution/accounts/batch-markup',
{
display_ids: displayIds,
shelf_ratio_delta: shelfRatioDelta,
},
{ params: { site_id: siteId } }
)
}
export async function fetchAdminPaymentChannels(siteId: number) {
const { data } = await adminClient.get<ApiResponse<{ items?: AdminPaymentChannel[] }>>(
'/admin/distribution/payment-channels',
{ params: { site_id: siteId } }
)
return data.data.items ?? []
}
export async function bindAdminPaymentChannel(
siteId: number,
configId: number,
priority: number
) {
const { data } = await adminClient.post<ApiResponse<AdminPaymentChannel>>(
'/admin/distribution/payment-channels',
{ config_id: configId, priority },
{ params: { site_id: siteId } }
)
return data.data
}
export async function unbindAdminPaymentChannel(id: number) {
await adminClient.delete(`/admin/distribution/payment-channels/${id}`)
}
export async function fetchAdminPaymentConfigOptions() {
const { data } = await adminClient.get<
ApiResponse<{ items?: AdminPaymentConfigOption[] }>
>('/admin/payment-configs', { params: { page: 1, page_size: 100 } })
return data.data.items ?? []
}
export async function fetchFinanceDisbursements(query: FinanceDisbursementQuery) {
const { data } = await adminClient.get<ApiResponse<Partial<FinanceDisbursementPage>>>(
'/admin/finance/disbursements',